Claude Code Hooks + MCP로 인시던트 대응 자동화 실전 구축기
Jira 티켓 생성·Datadog 조회·감사 로그까지 — CVE 대응 및 보안 설정 포함
PagerDuty 알림이 울린다. 그 순간부터 20분간 코드를 한 줄도 볼 수 없다. Datadog 대시보드를 열고, 로그를 뒤지고, Jira에 티켓을 수동으로 만들고, Slack으로 온콜 담당자에게 상황을 전달하는 컨텍스트 스위칭의 반복. 장애는 계속되고, 손은 탭 전환에 바쁘다.
이 글은 그 반복 작업을 AI 에이전트 레이어에서 자동화하는 실전 구성을 다룬다. Claude Code Hooks와 MCP(Model Context Protocol) 서버를 결합해 Jira 티켓 자동 생성, Datadog 인시던트 조회, 전사 감사 로그 파이프라인까지 코드로 구성하는 방법을 단계별로 안내한다. 핵심은 Jira·Datadog 대시보드 전환 없이 IDE 내에서 전체 인시던트 대응 흐름을 처리하는 것이다. 감사 로그, 프로덕션 가드는 그 위에 쌓이는 레이어다.
이 글을 따라 실습하려면 Claude Code CLI 설치, Node.js(npx 실행 가능), Atlassian과 Datadog 계정이 준비되어 있으면 좋다. MCP 개념을 처음 접한다면 MCP 서버 연결 공식 문서를 먼저 훑어보는 것을 권장한다.
핵심 개념
두 기술이 합쳐지면 무슨 일이 벌어지는가
먼저 전체 그림부터 보자. Hooks가 Claude Code 내부의 거버넌스를 담당하고, MCP 서버가 외부 시스템과의 통신을 담당하는 역할 분리가 이 구성의 핵심이다.
[인시던트 발생]
↓
코드 변경 감지 (PostToolUse Hook)
↓
Datadog MCP: 이상 감지 조회 (list_incidents, search_logs)
↓
Jira MCP: 티켓 자동 생성 (create_issue)
↓
Slack MCP: 온콜 채널 RCA 요약 전송
↓
감사 로그 기록 (PostToolUse Hook → JSONL)설정 파일은 목적에 따라 위치가 구분된다.
~/.claude/settings.json # 전역(사용자) 설정
<project>/.claude/settings.json # 프로젝트 설정 (Git 커밋 권장)
<project>/.claude/settings.local.json # 로컬 오버라이드 (Git 제외)Claude Code Hooks: AI 판단 밖의 결정론적 레이어
Claude Code Hooks는 Claude Code의 라이프사이클 특정 시점에 자동으로 실행되는 사용자 정의 셸 명령이다. 핵심은 **"AI가 판단하지 않는다"**는 점이다.
결정론적(Deterministic)이란? 동일한 입력에 대해 항상 동일한 출력을 보장한다는 뜻이다. AI 모델의 확률적 판단과 달리, 훅은 조건이 충족되면 반드시 정해진 동작을 실행한다. "반드시 지켜져야 하는 정책"에 적합한 이유다.
공식 문서에 등재된 훅 이벤트는 다음과 같다.
| 이벤트 | 트리거 시점 | 주요 활용 |
|---|---|---|
PreToolUse |
도구 호출 직전 | 위험 작업 사전 차단, 승인 |
PostToolUse |
도구 성공 후 | 품질 검사, 알림, 감사 로그 |
Notification |
입력 대기 시 | Slack·Discord 알림 전송 |
Stop |
세션 정상 종료 시 | 정리 작업, 최종 리포팅 |
SubagentStop |
서브에이전트 종료 시 | 서브태스크 완료 처리 |
PreCompact |
컨텍스트 압축 전 | 중요 정보 보존 |
StopFailure·PermissionRequest등 추가 이벤트는 2026년 3월 업데이트에 포함된 실험적 기능이다. 사용 전 공식 문서에서 현재 상태를 확인하는 것을 권장한다.
MCP: 파편화된 AI 통합의 표준화
MCP는 Anthropic이 주도하고 오픈소스로 공개한 표준 프로토콜로, 현재는 독립 재단(Model Context Protocol Foundation)이 거버넌스를 맡고 있다. AI 에이전트가 외부 시스템과 JSON-RPC 2.0 기반의 단일 인터페이스로 통신할 수 있게 해준다. Atlassian·Datadog·Salesforce 등 대형 SaaS 벤더가 공식 서버를 출시하며 엔터프라이즈 표준으로 자리잡고 있다.
MCP 도구는 mcp__<서버명>__<도구명> 패턴으로 노출되어, 훅의 matcher 필드에서 동일하게 매칭할 수 있다.
연결 방식은 두 가지다.
| 방식 | 설정 형태 | 사용 케이스 |
|---|---|---|
| stdio | command + args + env 지정 |
로컬 설치형 서버 (예: Atlassian MCP) |
| remote | type: "remote" + url + headers 지정 |
클라우드 제공 서버 (예: Datadog MCP) |
예시 1(Jira)은 stdio 방식, 예시 2(Datadog)는 remote 방식이다. 두 방식의 차이를 이해하면 다른 MCP 서버로의 응용이 훨씬 쉬워진다.
실전 적용
이후 다섯 가지 예시는 인시던트 대응 흐름을 따라 순서대로 구성되어 있다. 탐지(예시 2) → 티켓 생성(예시 1) → 사전 방지(예시 3) → 품질 게이트(예시 4) → 기록(예시 5) 순으로 읽으면 전체 파이프라인의 맥락이 이어진다.
예시 1: Jira 티켓 자동 생성 + 감사 로그
Atlassian 공식 Remote MCP 서버를 연결하고, 티켓 생성 후 감사 로그를 자동으로 기록하는 설정이다.
{
"mcpServers": {
"jira": {
"command": "npx",
"args": ["-y", "@atlassian/mcp-server"],
"env": {
"ATLASSIAN_API_TOKEN": "${ATLASSIAN_API_TOKEN}",
"ATLASSIAN_BASE_URL": "https://your-org.atlassian.net"
}
}
},
"hooks": {
"PostToolUse": [
{
"matcher": "mcp__jira__create_issue",
"hooks": [
{
"type": "command",
"command": "echo '[AUDIT] Jira ticket created: '$(echo \"$CLAUDE_TOOL_RESPONSE\" | jq -r .key) >> /var/log/claude-audit.log"
}
]
}
]
}
}| 설정 항목 | 역할 |
|---|---|
mcpServers.jira |
stdio 방식으로 Atlassian MCP 서버 연결 정의 |
ATLASSIAN_API_TOKEN |
환경변수로 자격증명 주입 — 코드에 직접 입력 금지 |
matcher: "mcp__jira__create_issue" |
Jira 티켓 생성 완료 시점에만 훅 실행 |
CLAUDE_TOOL_RESPONSE |
도구 응답 JSON을 담은 환경변수, jq로 파싱 가능 |
예시 2: Datadog 인시던트 조회 및 RCA 자동화
인시던트가 감지되면 Datadog Remote MCP 서버를 통해 로그·메트릭·트레이스를 Claude Code에서 직접 조회할 수 있다. SRE·DevOps 환경에서 특히 유용한 시나리오다.
{
"mcpServers": {
"datadog": {
"type": "remote",
"url": "https://mcp.datadoghq.com",
"headers": {
"DD-API-KEY": "${DD_API_KEY}",
"DD-APPLICATION-KEY": "${DD_APP_KEY}"
}
}
}
}연결 후 사용할 수 있는 주요 도구는 다음과 같다.
| 도구명 | 기능 |
|---|---|
list_incidents |
진행 중 인시던트 목록 조회 |
query_metrics |
타임시리즈 메트릭 쿼리 |
search_logs |
고급 필터링 로그 검색 |
create_monitor |
임계값 기반 모니터 생성 |
create_downtime |
유지보수 창 알림 억제 |
실제 대응 흐름: PagerDuty 알림 트리거 → Claude Code가 list_incidents·search_logs로 로그·트레이스 조사 → 코드베이스 최근 변경사항 분석 → Slack MCP로 온콜 채널에 RCA 요약 전송 → 예시 1의 Jira MCP로 티켓 자동 생성.
예시 3: PreToolUse Hook으로 프로덕션 환경 보호
프로덕션 환경에 직접 접근하는 명령을 실행 전에 차단하는 가드 스크립트다.
#!/bin/bash
# hooks/guard-production.sh
TOOL_INPUT=$(cat)
TARGET=$(echo "$TOOL_INPUT" | jq -r '.command // .path // ""')
if echo "$TARGET" | grep -qE "(production|prod-db|main-cluster)"; then
# 차단 결정은 stdout의 JSON으로 전달된다. exit 0은 훅 스크립트 자체의 정상 종료를 의미한다.
echo '{"decision": "block", "reason": "프로덕션 환경 직접 접근은 승인 워크플로우를 거쳐야 합니다."}'
exit 0
fi{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash hooks/guard-production.sh"
}
]
}
]
}
}중요:
PostToolUse훅은 도구 실행 이후 트리거된다. 위험 작업의 사전 차단에는PreToolUse를 사용하는 것이 중요하다.PostToolUse로 차단을 시도하면 이미 실행된 명령에 훅이 반응하는 상황이 발생한다.위 스크립트에서 차단 결정은 stdout의 JSON(
{"decision": "block", ...})으로 전달된다.exit 0은 훅 스크립트 자체의 정상 종료를 의미하며, exit code가 차단 여부를 결정하는 것이 아니다.
예시 4: PostToolUse Hook으로 품질 게이트 + Jira 버그 티켓 자동 연동
인시던트 대응 중 코드를 수정했다면, 편집 완료 후 린트를 자동 실행하고 실패 시 Jira에 버그 티켓을 자동 생성하는 파이프라인이다.
#!/bin/bash
# hooks/quality-gate.sh
RESULT=$(npm run lint --silent 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
# 아래는 개념 예시다. 실제 Claude Code CLI 플래그는 공식 문서에서 확인하는 것을 권장한다.
claude -p "Create a Jira bug ticket with summary 'Lint failure detected' \
and description: $(echo "$RESULT" | head -c 500)" \
--mcp-server jira
fi{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "bash hooks/quality-gate.sh"
}
]
}
]
}
}예시 5: 전사 감사 로그 파이프라인
대응 과정 전체를 JSONL 형식으로 기록하는 엔터프라이즈 감사 로그 설정이다. 규정 준수(Compliance) 요구사항이 있는 조직에서 활용할 수 있다.
{
"hooks": {
"PostToolUse": [
{
"matcher": ".*",
"hooks": [
{
"type": "command",
"command": "jq -n --argjson input \"$(printenv CLAUDE_TOOL_INPUT)\" --argjson response \"$(printenv CLAUDE_TOOL_RESPONSE)\" '{timestamp: now | todate, tool: env.CLAUDE_TOOL_NAME, user: env.USER, input: $input, response: $response}' >> /var/log/claude-enterprise-audit.jsonl"
}
]
}
]
}
}
.*매처: 정규표현식으로 모든 도구에 매칭된다. 감사 로그처럼 전체 도구 호출을 추적해야 할 때 유용하지만, 불필요한 훅 실행으로 성능에 영향을 줄 수 있으므로 선택적으로 적용하는 것을 권장한다.
--argjson input $VAR형태의 직접 보간은 값에 공백·특수문자가 포함되면 jq 파싱 오류가 발생할 수 있다."$(printenv VAR)"형태로 감싸는 것이 안전하다.
장단점 분석
장점
| 항목 | 내용 |
|---|---|
| 결정론적 제어 | AI 판단 없이 규칙이 강제 실행되어 거버넌스 일관성 확보 |
| 단일 프로토콜 | MCP로 Jira·Datadog·Slack·GitHub 등을 동일 인터페이스로 연결 |
| Git 커밋 가능 | .claude/settings.json이 프로젝트 루트에 위치해 팀 전체가 동일 훅 공유 |
| 로컬·리모트 통일 | PreToolUse/PostToolUse가 로컬 도구와 MCP 도구를 동일하게 처리 |
| 컨텍스트 스위칭 제거 | Jira·Datadog 대시보드 전환 없이 IDE 내에서 전체 워크플로우 처리 |
| 확장성 | 대형 SaaS 벤더와 커뮤니티 서버 수백 개가 MCP를 지원하며 급속히 확산 중 |
단점 및 주의사항
| 항목 | 내용 | 대응 방안 |
|---|---|---|
| CVE-2025-59536 (CVSS 8.7) | 악성 .claude/settings.json이 포함된 저장소 클론 시 신뢰 다이얼로그 표시 전 임의 코드 실행 가능 |
Git 저장소 클론 후 settings.json 내용 직접 검토 |
| CVE-2026-21852 (CVSS 5.3) | ANTHROPIC_BASE_URL 오버라이드를 통한 API 키 탈취 |
환경변수 화이트리스트 관리 및 주입 경로 통제 |
| Files API 악용 (미패치) | API 키 주입으로 피해자 파일을 공격자 계정에 업로드 가능 | 샌드박스 설정과 deny list 구성 |
| OAuth 재인증 부담 | SSE 기반 MCP 서버는 1~4시간마다 재인증 필요 | API 토큰 방식으로 전환 권장 (Atlassian 공식 지원) |
| 다중 MCP 서버 충돌 | 다수 서버 동시 연결 시 컨텍스트 오염 및 도구명 충돌 위험 | 서버 수를 최소화하고 네임스페이스 규칙 명확화 |
| 훅 스크립트 인젝션 | 훅이 셸 명령을 실행하므로 외부 입력 처리 시 인젝션 위험 | 입력값 sanitization, 권한 최소화 원칙 적용 |
시크릿 관리:
ATLASSIAN_API_TOKEN,DD_API_KEY등 자격증명은settings.json에 직접 입력하지 않는 것이 좋다.${ENV_VAR}형식으로 환경변수를 참조하고, CI/CD 시크릿 관리자(Vault, AWS Secrets Manager 등)를 통해 주입하는 방식을 권장한다..claude/settings.local.json은 Git에 포함시키지 않는 것이 기본 원칙이다.
실무에서 가장 흔한 실수
PostToolUse로 프로덕션을 막으려 시도하는 경우: 이벤트가 도구 실행 이후에 발생하므로 차단 효과가 없다. 사전 차단이 필요한 모든 정책은PreToolUse에 적용하는 것을 권장한다.- 서드파티 저장소의
settings.json을 검토 없이 사용하는 경우: CVE-2025-59536에서 확인됐듯이, 악성 설정 파일이 코드 실행으로 이어질 수 있다. 외부 저장소 클론 후.claude/settings.json내용을 직접 확인하는 것을 권장한다. - 훅 스크립트에 외부 입력을 검증 없이 전달하는 경우:
$CLAUDE_TOOL_INPUT같은 환경변수를 셸 명령에 직접 보간하면 명령 인젝션이 발생할 수 있다."$(printenv VAR)"형태로 안전하게 감싸거나 jq로 파싱해서 사용하는 것을 권장한다.
마치며
이 설정을 갖추면 인시던트 대응 시 컨텍스트 스위칭에 소비되던 20~30분을 IDE를 벗어나지 않고 처리할 수 있다. 강력한 자동화에는 그에 상응하는 보안 설계가 함께 따라와야 하므로, CVE 항목과 시크릿 관리 가이드를 참고해 설정을 완성하는 것을 권장한다.
지금 바로 시작해볼 수 있는 3단계:
- [약 5분] Datadog MCP 연결 확인: 프로젝트 루트에
.claude/settings.json을 만들고 예시 2의 Datadog Remote MCP 설정을 추가한다.DD_API_KEY와DD_APP_KEY환경변수를 설정하면 Claude Code에서list_incidents도구를 바로 호출해볼 수 있다. - [약 15분] 첫 번째 프로덕션 가드 배포:
hooks/guard-production.sh스크립트를 작성하고PreToolUse이벤트에 연결한다. 실수로 프로덕션 환경에 접근하는 명령이 실행되기 전에 안전하게 차단되는 것을 확인할 수 있다. - [팀 전체 롤아웃] 감사 로그 파이프라인 완성:
matcher: ".*"패턴과 JSONL 로깅 훅을 결합하고 설정 파일을 Git에 커밋하면, 팀 전체의 AI 에이전트 활동에 대한 가시성을 확보할 수 있다.
다음 글: MCP 게이트웨이(ScopeBlind, Webrix)를 활용해 멀티 에이전트 환경에서 RBAC·감사 트레일·토큰 볼트를 중앙 관리하는 엔터프라이즈 MCP 거버넌스 아키텍처 설계 가이드
참고 자료
- Hooks 참조 공식 문서 | Claude Code Docs
- hooks를 사용하여 워크플로우 자동화 (한국어) | Claude Code Docs
- MCP 서버 연결 | Claude Code Docs
- Atlassian Remote MCP Server 공식 발표 | Atlassian Blog
- Atlassian MCP Server GitHub | atlassian/atlassian-mcp-server
- Datadog MCP Server 공식 문서 | Datadog
- Datadog MCP Server 블로그 — AI 에이전트용 옵저버빌리티 | Datadog
- Datadog MCP 엔지니어링팀 활용 사례 4가지 | Datadog
- Jira MCP 통합 가이드 | Workato
- Jira MCP + Claude Code 연결 가이드 | Composio
- CVE-2025-59536: RCE via Claude Code Project Files | Check Point Research
- Claude Code MCP 거버넌스와 엔터프라이즈 보안 | Obot.ai
- MCP가 엔터프라이즈 인프라로: MCP Dev Summit 2026 리뷰 | AAIF
- ScopeBlind Gateway — MCP 정책 게이트웨이 | GitHub
- MCP 서버 공식 레지스트리 | GitHub
- 2026 MCP 로드맵 | Model Context Protocol 공식 블로그