Hooks·Skills·MCP·외부 스크립트 4가지
앞 장에서 '수동 Claude Code의 한계'를 살펴봤다. 그렇다면, 자동화하려면 어떻게 해야 할까?
결론부터 말하면, Claude Code 자동화에는 4가지 구조가 필요하며, 각각 잘하는 영역이 다르다. 하나만으로는 전체를 커버할 수 없다.
Hooks는 Claude Code의 내부 이벤트에 따라 자동으로 스크립트를 실행하는 구조다. "무언가가 일어났을 때, 자동으로 이것을 실행하라"는 트리거 방식의 자동화다.
// .claude/settings.local.json 의 hooks 섹션
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
// Bash 툴 실행 전에 안전성 체크를 수행한다
"hook": "bash .claude/hooks/pre-bash-check.sh"
}
],
"PostToolUse": [
{
"matcher": "Write",
// 파일 쓰기 후 자동으로 lint를 실행한다
"hook": "bash .claude/hooks/post-write-lint.sh"
}
]
}
}
가드레일: 위험한 명령어 실행 전 안전성 체크
자동 검증: 파일 변경 후 lint, 테스트, 타입 체크 자동 실행
알림: 에러 발생 시 Slack/Telegram이나 이메일로 자동 통지
로그 기록: 전체 작업의 자동 기록
Hooks는 '수동적'인 자동화다. 무언가가 일어나길 기다렸다가 반응한다. 스스로 먼저 움직이지는 않는다.
Skills는 Claude Code에 "이런 작업은 이 순서로 진행하라"고 가르치는 구조다. 마크다운 파일로 워크플로우를 정의하고, 슬래시 명령어로 호출한다.
<!-- .claude/skills/write-velog.md -->
---
name: write-velog
description: Velog 아티클 작성 워크플로우
---
# Velog 아티클 작성 스킬
## 순서
1. 주제와 대상 독자를 확인한다
2. `.company/steering/brand.md` 의 톤앤매너 규칙을 읽는다
3. 아티클 구성 (H2 × 3~5개)을 먼저 작성한다
4. 각 섹션을 집필한다
5. 코드 블록에는 반드시 '왜'에 대한 설명 주석을 넣는다
6. 프론트매터를 설정한다 (tags, published 등)
7. 글자 수를 확인한다 (3,000~8,000자)
정형 워크플로우 표준화: 아티클 작성, 제안서 작성, 코드 리뷰 등 절차를 통일
품질 기준 내재화: "매번 이 체크리스트를 통과시킨다"를 스킬 정의에 포함
팀 공유: .claude/skills/ 디렉토리를 git으로 관리해 전체 팀원이 동일한 워크플로우를 사용
저자의 환경에서는 다음 5가지 스킬이 일상적으로 가동 중이다.
.claude/skills/
├── write-velog.md # Velog 아티클 작성
├── write-naverblog.md # Naver Blog 아티클 작성
├── write-brunch.md # Brunch 아티클 작성
├── publish-velog-book.md # Velog 시리즈 출판
└── publish-ridibooks.md # 리디북스 출판
Skills는 '능동적이지만, 호출이 필요한' 자동화다. 정의해두면 언제든 동일한 품질로 실행할 수 있다.
MCP(Model Context Protocol)는 Claude Code가 외부 툴 및 서비스와 연동하기 위한 표준 프로토콜이다. Slack, GitHub, 데이터베이스, API 등 모든 외부 서비스를 Claude Code에서 조작할 수 있게 해준다.
// .claude/settings.local.json 의 mcpServers 섹션
{
"mcpServers": {
"slack": {
// Slack MCP 서버: 채널 게시 및 읽기 가능
"command": "npx",
"args": ["-y", "@anthropic/mcp-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-..."
}
},
"github": {
// GitHub MCP 서버: Issue·PR 조작 가능
"command": "npx",
"args": ["-y", "@anthropic/mcp-github"],
"env": {
"GITHUB_TOKEN": "your-github-token"
}
}
}
}
외부 서비스와의 양방향 연동: Slack에 메시지를 보내거나, GitHub에 Issue를 생성
데이터 조회: 외부 API에서 데이터를 가져와 분석
툴 체인: 여러 서비스를 조합한 복잡한 워크플로우
MCP는 "Claude Code의 손발을 늘리는" 구조다. 기본 상태의 Claude Code는 로컬 파일 읽기·쓰기와 셸 명령어만 실행할 수 있지만, MCP를 통해 Slack, GitHub, 데이터베이스, Web API 등 모든 외부 서비스를 조작할 수 있게 된다.
지금까지의 3가지(Hooks, Skills, MCP)는 모두 Claude Code가 실행 중인 동안 동작하는 구조였다. 하지만 24시간 365일 자동화를 실현하려면, Claude Code가 실행되지 않아도 동작하는 구조가 필요하다.
그것이 외부 스크립트다. bash, cron(Linux), launchd(macOS), Playwright 등을 사용해 OS 레벨에서 스케줄 실행한다.
#!/bin/bash
# auto-morning.sh — 매일 오전 9:00에 자동 실행되는 아침 다이제스트
# cron에서 기동되어, 대시보드 API를 호출한 뒤 결과를 Slack으로 전송
source "$(dirname "$0")/common.sh"
main() {
log_info "=== 아침 다이제스트 생성 시작 ==="
# 월간 비용 상한을 체크한다 ($200 초과 시 실행하지 않는다)
check_cost_limit || exit 0
# 대시보드가 기동 중인지 확인한다 (최대 90초 대기)
ensure_dashboard || exit 1
# API를 호출해 다이제스트 생성
local result
result=$(api_post "morning-digest" '{}')
if [ $? -ne 0 ] || [ -z "$result" ]; then
log_error "API 호출 실패"
exit 1
fi
# .company/ 의 변경이 있으면 git 자동 커밋
git_auto_commit "auto: 아침 다이제스트 실행에 따른 자동 업데이트"
log_info "=== 아침 다이제스트 생성 완료 ==="
}
main "$@"
Linux 서버(AWS, GCP 등 클라우드 환경 포함)에서는 cron을 사용해 정시 실행을 구성한다. crontab -e 명령어로 설정을 추가한다.
# crontab 설정 예시
# 형식: 분 시 일 월 요일 명령어
# 매일 오전 9:00에 아침 다이제스트 실행
0 9 * * * /home/ubuntu/scripts/auto-morning.sh >> /var/log/morning-digest.log 2>&1
# 매일 오후 12:00에 SNS 자동 게시
0 12 * * * /home/ubuntu/scripts/auto-sns.sh >> /var/log/sns-post.log 2>&1
# 매일 오후 6:00에 일일 리포트 생성
0 18 * * * /home/ubuntu/scripts/daily-report.sh >> /var/log/daily-report.log 2>&1
macOS에서는 cron 대신 launchd를 사용하는 것이 표준이다. plist 파일을 ~/Library/LaunchAgents/ 에 배치한다.
<?xml version="1.0" encoding="UTF-8"?>
<!-- com.joinclass.ai-ceo-dashboard.plist -->
<!-- 대시보드를 OS 시작 시 자동 기동해 상시 가동시킨다 -->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.joinclass.ai-ceo-dashboard</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>npx</string>
<string>next</string>
<string>dev</string>
<string>--port</string>
<string>4000</string>
</array>
<key>RunAtLoad</key> <!-- OS 시작 시 자동 실행 -->
<true/>
<key>KeepAlive</key> <!-- 충돌이 발생해도 자동 재시작 -->
<true/>
</dict>
</plist>
정시 실행: 매일 오전 9시 다이제스트, 매시간 SNS 게시, 매일 아티클 공개
상시 가동: 대시보드나 API 서버의 지속 실행
브라우저 조작: Playwright를 활용한 웹사이트 자동 조작 (SNS 게시 UI 조작 등)
Claude Code 비의존: Claude Code 세션이 종료되어도 계속 동작
"이 자동화에는 어떤 구조를 써야 할까?"를 판단하는 플로우차트를 제시한다.
저자의 환경에서 4가지 핵심이 어떻게 구분되어 사용되는지 구체적으로 보여준다.
실제 업무에서는 4가지 기둥을 조합해서 사용하는 경우가 많다. 대표적인 패턴을 소개한다.
[Skill] 아티클 작성 → [Hook] 품질 체크 → [외부] 정시 공개 → [MCP] Slack 알림
1. Skill로 아티클을 작성한다 (품질 기준에 따라) 2. Hook으로 lint와 글자 수 체크를 자동 실행한다
3. 외부 스크립트가 매일 오전 8:00에 Velog API를 호출해 공개한다
4. MCP로 Slack에 공개 완료를 알린다
[외부] cron 09:00 기동 → [API] 대시보드 → [MCP] Slack 전송
↓
[내부] 전 부서 STATE 읽기
1. cron이 매일 오전 9:00에 bash 스크립트를 기동한다
2. 스크립트가 대시보드 API를 호출한다
3. API가 전 부서의 STATE.md를 집계해 다이제스트를 생성한다
4. 결과를 Slack Webhook으로 전송한다
[CLAUDE.md] 권한 정의 → [Hook] 실행 전 체크 → [Hook] 실행 후 테스트 → [외부] git 자동 커밋
1. CLAUDE.md에서 "프로덕션 배포는 draft 모드"로 권한을 정의한다
2. Hook으로 명령어 실행 전 안전성 체크를 수행한다
3. Hook으로 변경 후 자동 테스트를 실행한다
4. 테스트 통과 후, 외부 스크립트로 git 자동 커밋한다
이번에서는 4가지 기둥의 전체 구조를 제시했다. 다음 장부터는 각 기둥을 하나씩 상세히 해설하고, 실제로 동작하는 코드를 작성해 나간다.
먼저 3장에서, 모든 자동화의 기반이 되는 CLAUDE.md 설계부터 시작한다. CLAUDE.md의 품질이 자동화 전체의 품질을 결정한다. 여기를 대충 작성하면, 이후 모든 것이 무너진다.
다음장부터는 맴버쉽만 볼 수 있어요.
©2024-2026 MDRules dev., Hand-crafted & made with Jaewoo Kim.
이메일문의: jaewoo@mdrules.dev
AI강의/개발/기술자문, Claude Code 전문강의, AI 업무 자동화 컨설팅 문의: https://talk.naver.com/ct/w5umt5
AI 업무 자동화/에이전트/워크플로우설계 컨설팅/AI교육: https://mdrules.dev