Skills vs Subagents vs Hooks vs MCP: Claude Code 선택 가이드(2026)
Claude Code의 skills·subagents·hooks·MCP 차이는 결국 각각이 '무엇을 더해 주는가'와 '무엇이 그것을 작동시키는가'로 정리돼요. Skill은 모델이 필요할 때 불러오는 재사용 가능한 지식이에요. Subagent는 자체 컨텍스트 창에서 돌아가는, 위임된 작업자예요. Hook은 라이프사이클 이벤트에서 실행되는 결정론적 셸 명령이에요. MCP는 외부 도구와 데이터로 이어 주는 다리예요. 요령은 이래요. 지식을 더하려면 → Skill, 도구나 데이터 소스를 더하려면 → MCP, 무거운 작업을 분리하려면 → Subagent, 무언가를 결정론적으로 강제하려면 → Hook이에요.
Claude Code를 일주일 넘게 써 봤다면 아마 이 벽에 부딪혔을 거예요. 기능을 확장하려고 문서를 열면, 하나같이 'Claude에 기능을 더한다'처럼 들리는 네 가지 서로 다른 메커니즘―Skills, Subagents, Hooks, 그리고 Model Context Protocol(MCP)―이 나와요. 이들은 헷갈릴 만큼 딱 그 정도로만 겹쳐 있고, 어느 것을 골라야 하는지는 아무도 알려 주지 않아요. 저는 이 네 가지를 실제 프로젝트에서 모두 만들어 배포해 봤어요. 그래서 이런 선택 가이드가 있었으면 했던 내용을 정리했어요. 완전히 처음이라면 먼저 Claude Code가 무엇인지부터 읽고 다시 돌아오세요.
Skills·Subagents·Hooks·MCP 한눈에 비교하기
선택을 돕는 표예요. 이 네 가지 프리미티브는 모두 .claude 디렉터리(또는 settings.json)에 자리 잡고, 각각 서로 다른 확장 질문에 답해요. 자신에게 중요한 열만 훑어보세요―무엇을 더하는가, 무엇이 작동시키는가, 자체 컨텍스트 창을 갖는지, 결정론적인지, 그리고 어디서 설정하는가예요.
| 프리미티브 | 더해 주는 것 | 작동 계기 | 자체 컨텍스트 창? | 결정론적? | 설정 위치 |
|---|---|---|---|---|---|
| Skill | 재사용 가능한 지식·지시 | 모델이 필요할 때 불러옴(또는 /name 입력) | 아니요―메인 컨텍스트에서 실행 | 아니요―모델이 결정 | .claude/skills/<name>/SKILL.md |
| Subagent | 격리된 작업자 | Claude가 일치하는 작업을 위임 | 예―별도의 창 | 아니요―모델이 결정 | .claude/agents/<name>.md |
| Hook | 가드레일·자동화 | 라이프사이클 이벤트가 발생 | 아니요―셸 프로세스로 실행 | 예―항상 실행 | settings.json |
| MCP | 외부 도구와 데이터 | 서버가 노출한 도구를 모델이 호출 | 아니요―메인 컨텍스트에서 실행 | 아니요―모델이 결정 | .mcp.json |
이 표에서 가장 뚜렷한 차이는 이거예요―결정론적인 건 Hook뿐이고, 자체 컨텍스트 창을 갖는 건 Subagent뿐이에요. 이 두 가지 사실만 붙들고 있으면 혼란의 절반은 사라져요.
Claude Code에서 Skill이란?
Skill은 SKILL.md 파일이 든 폴더로, Claude가 관련이 있을 때만 불러오는 지시·체크리스트·도메인 지식을 담아요. 이 방식을 점진적 공개(progressive disclosure)라고 불러요. Claude는 시작할 때 각 스킬의 짧은 설명을 읽지만, 그 스킬이 지금 눈앞의 작업에 해당한다고 판단하기 전에는 본문 전체를 컨텍스트로 끌어오지 않아요. 즉 스킬은 실제로 실행되기 전까지 토큰을 거의 쓰지 않아요. Skill은 모델이 자동으로 호출할 수도, /skill-name으로 직접 실행할 수도 있어요.
.claude/skills/
└── pr-review/
└── SKILL.md # instructions Claude loads when reviewing a PR
2026년 기준 정보 업데이트: 커스텀 슬래시 명령은 이제 스킬로 통합됐어요. 예전의 .claude/commands/deploy.md는 기능적으로 .claude/skills/deploy/SKILL.md와 같은 개념이에요. 오래된 블로그 글 상당수는 여전히 'commands'를 다섯 번째 별도 프리미티브로 다루지만, 공식 Claude Code 문서(2026년 8월 확인)는 이를 스킬에 포함시켜요. 그래서 따져야 할 프리미티브는 다섯이 아니라 넷이에요.
지식이나 반복 절차를 표준화하고 싶을 때 Skill을 골라요―코딩 규칙, 리뷰 체크리스트, 커밋 메시지의 사내 스타일 같은 것들이죠. 자세한 안내는 Claude Code 스킬 자세히 알아보기를 참고하세요. 솔직한 한계도 있어요. 스킬은 지시일 뿐, 코드도 도구도 아니에요. 혼자서는 Claude Code 바깥에 손을 뻗지 못해요―그건 MCP의 몫이에요.
Subagent란?
Subagent는 자체 컨텍스트 창, 자체 시스템 프롬프트, 자체 도구 허용 목록, 자체 권한을 가진 전문 어시스턴트예요. Claude가 subagent 설명과 일치하는 작업을 만나면 그것을 위임해요. subagent는 격리된 창 안에서 독립적으로 일하고, 메인 대화에는 요약만 돌려줘요. 격리돼 있기 때문에 로그, 파일 덤프, 막다른 길 같은 시끄러운 중간 작업이 메인 컨텍스트를 더럽히지 않아요. Subagent는 더 저렴한 모델(예: Haiku)로 돌려서 위임 작업 비용을 낮출 수도 있어요.
.claude/agents/
└── code-reviewer.md # name, description, tools, model, system prompt
subagent를 쓸 가장 좋은 신호는 그 곁가지 작업을 그냥 두면 메인 컨텍스트가 넘쳐 버릴 때예요. 수십 개 파일에 걸친 깊은 리서치, 긴 로그 분석, 자기 완결적인 리팩터링처럼 결론만 중요하고 과정의 지저분함은 상관없는 작업이죠. 여러 개를 이어 붙여 쓰는 법은 AgentKit로 만드는 실전 AI 개발 워크플로에서 배울 수 있어요.
솔직한 안티패턴도 있어요―subagent를 남용하면 토큰을 태워요. 위임할 때마다 새 컨텍스트가 뜨고 상태를 다시 세우기 때문에, 두 줄짜리 작업을 subagent로 감싸는 건 순수한 오버헤드예요. 격리할 만한 값어치가 있을 때 쓰세요.
구분해 두면 좋은 미묘한 점이 하나 있어요. 어떤 조언용 도구는 격리된 subagent가 아니라 단일 도구 호출로 인라인 실행돼요―advisor 도구가 subagent와 어떻게 다른지(advisor vs kongming)를 참고하세요.
Hook이란?
Hook은 라이프사이클 이벤트에서 실행되는 결정론적 셸 명령으로, settings.json에서 설정해요. 다른 세 프리미티브와 달리 hook은 프롬프트가 아니라 코드예요―모델이 어떻게 판단하든 상관없이 실행돼요. 자주 쓰는 이벤트로는 PreToolUse(Claude가 도구를 실행하기 전), PostToolUse(실행 후), Stop(턴이 끝날 때)이 있어요. 그래서 hook은 가드레일에 딱 맞아요. 편집할 때마다 자동 포맷과 린트를 걸고, 위험한 명령을 막고, 커밋 전에 시크릿을 스캔하고, 긴 작업이 끝나면 데스크톱 알림을 띄우는 식이죠.
// settings.json
{
"hooks": {
"PostToolUse": [
{ "matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "npm run format" }] }
]
}
}
이 페이지의 다른 모든 것과의 핵심적인 차이는, hook이 모델의 허락을 구하지 않는다는 점이에요. 이벤트가 일치하면―매번 빠짐없이―실행돼요. 이 결정론성 덕분에, 절대 건너뛰면 안 되는 일에 hook을 쓰는 거예요. 라이프사이클 이벤트가 처음이라면 Claude Code 기초의 심화 설명을 읽어 보세요. 솔직한 안티패턴은, 너무 공격적으로 막는 hook은 정당한 작업까지 방해하니 매처를 촘촘히 좁혀 두라는 거예요.
MCP(Model Context Protocol)란?
MCP(Model Context Protocol)는 MCP 서버를 통해 Claude Code를 외부 도구와 데이터 소스에 연결하는 열린 표준이에요. 서버는 일련의 도구를 노출하고―GitHub PR 읽기, Postgres 데이터베이스 조회, 브라우저 조작, 내부 API 호출―Claude는 이를 내장 도구와 똑같은 방식으로 호출해요. MCP는 도구 연동을 표준화해서, 서비스마다 맞춤형 다리를 만들지 않아도 되게 해 줘요. 서버는 .mcp.json에 선언해요.
// .mcp.json
{
"mcpServers": {
"github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] }
}
}
MCP를 쓸 가장 좋은 신호는 Claude가 스스로 제어하지 못하는 시스템에 손을 뻗어야 할 때예요―내 데이터베이스, 이슈 트래커, 실시간 API 같은 것들이죠. Claude가 처리하도록 데이터를 채팅에 복사해 붙여 넣고 있다면, 그 일은 MCP 서버의 몫이에요. 솔직한 안티패턴은, 그냥 Skill이면 될 일에 MCP를 꺼내 드는 거예요. Claude가 규칙을 알기만 하면 된다면 그건 스킬이고, MCP는 외부 시스템에서 무언가를 실행해야 할 때 쓰는 거예요.
진짜 차이(나란히 정리)
정의는 쉬워요. 혼란은 겹치는 부분에 숨어 있죠. 여기서는 네 가지를 실제로 갈라놓는 축으로 정리했어요.
| 축 | Skill | Subagent | Hook | MCP |
|---|---|---|---|---|
| 더해 주는 것 | 지식 | 격리된 작업자 | 가드레일 | 도구·데이터 |
| 계기 | 모델이 결정 | 모델이 결정 | 이벤트로 결정 | 모델이 결정 |
| 컨텍스트 격리 | 메인 컨텍스트 | 별도의 창 | 셸 프로세스 | 메인 컨텍스트 |
| 호출 방식 | 자동 또는 /name | 위임 | 라이프사이클 이벤트 | 도구 호출 |
Skill과 MCP가 가장 흔한 혼동이에요. 스킬은 지시를 더해요―Claude가 무엇을 알고 어떻게 행동하는지를 바꾸죠. MCP는 능력을 더해요―원래는 닿지 못하는 시스템에 Claude가 닿게 해 줘요. '우리 PR 체크리스트를 따르라'는 스킬, 'GitHub에서 실제 PR을 읽어 오라'는 MCP예요. 이 둘은 자주 함께 움직여요.
Skill과 Subagent는 두 번째 함정이에요. 둘 다 'Claude에 전문성을 준다'처럼 느껴지지만, 스킬은 메인 모델이 스스로 적용하는 컨텍스트 안의 지식인 반면, subagent는 컨텍스트 밖에서 격리된 채 일을 처리하는 작업자예요. 메인 스레드가 특정하게 행동하길 원하면 스킬을, 창을 어지럽히지 않게 작업을 덜어내고 싶으면 subagent를 쓰세요.
설정 위치 요약을 한곳에 모아 볼게요. 스킬은 .claude/skills/, subagent는 .claude/agents/, hook은 settings.json, MCP 서버는 .mcp.json에 있어요. 네 가지 프리미티브, 네 개의 집이에요.
언제 무엇을 써야 할까?(목적으로 정하기)
이론은 건너뛰고, 하려는 일에서 출발해요. 실제로 자주 하는 한 줄 요청을 알맞은 프리미티브에 대응시켜 봤어요.
- 반복 절차를 표준화하고 싶어요(리뷰 체크리스트, 커밋 스타일) → Skill
- 리서치나 로그가 많은 작업을 메인 컨텍스트에서 빼내고 싶어요 → Subagent
- 포맷, 테스트, 시크릿 스캔을 매번 강제하고 싶어요 → Hook
- Claude가 내 데이터베이스를 조회하거나 PR을 열거나 API를 호출하게 하고 싶어요 → MCP
- Claude가 항상 따르는 사내 규칙을 두고 싶어요 → Skill
- 중간 잡음을 지켜보지 않고 큰 리팩터링을 끝내고 싶어요 → Subagent
- 위험한 명령을 실행 전에 막고 싶어요 → Hook
패턴이 보이죠. 지식과 행동은 Skill 쪽으로, 격리는 Subagent 쪽으로 기울고, 타협 없는 강제는 언제나 Hook, 그리고 앱의 경계를 넘는 건 무엇이든 MCP예요.
네 가지를 함께 쓸 수 있나요?(네―그리고 그래야 해요)
이 프리미티브들은 경쟁하지 않고 조합돼요. 성숙한 Claude Code 세팅은 네 가지를 한꺼번에 쓰며, 각자 가장 잘하는 한 가지를 맡아요. 코드 리뷰 흐름을 처음부터 끝까지 구체적인 예로 볼게요.
- Skill이 리뷰 절차를 정의해요―무엇을, 어떤 순서로 확인할지, 그리고 팀의 기준이죠.
- Claude는 실제 리뷰를 Subagent에 위임해요. 그래서 파일별 분석은 자체 컨텍스트에서 돌고, 돌아오는 건 결론뿐이에요.
- 그 subagent는 GitHub MCP 서버로 실제 풀 리퀘스트―디프, 코멘트, CI 상태―를 읽어요.
- Hook은 모델이 어떤 결론을 냈든, 테스트가 실패하면 커밋을 결정론적으로 막아요.
이게 바로 핵심이에요. 스킬 하나, subagent 하나, MCP 서버 하나, hook 하나가 저마다 다른 것으로는 못 메우는 빈틈을 메워요. 이 모든 걸 손으로 짜 맞추는 건 진짜 일이에요―스킬 파일을 쓰고, subagent 프롬프트를 쓰고, MCP 서버를 연결하고, hook을 테스트해야 하죠. 모든 조각을 맨바닥부터 만들고 싶지 않다면, 이 프리미티브들을 미리 만들어 담은 큐레이션 키트도 있어요. 제가 사람들에게 권하는 건 AgentKit for Claude Code(링크로 20% 할인)예요. 다음에서 더 자세히 다룰게요.
세팅을 건너뛰기―AgentKit로 네 가지를 미리 만들어 받기
이름이 겹치니 먼저 구분해 둘게요. 여기서 말하는 건 agentkit.best의 AgentKit for Claude Code(CLI는 ak)이지, OpenAI의 AgentKit(Agent Builder / ChatKit)이 아니에요. 완전히 다른 제품이에요.
각각을 직접 쓰지 않고 프리미티브를 얻고 싶나요? AgentKit는 108개 이상의 스킬, 45개의 에이전트(subagent), 그리고 MCP 연동―여기에 이미 만들어진 워크플로까지―을 묶어 놓아서, 이 페이지의 네 가지 프리미티브 중 셋이 미리 만들어져 있어요. (미리 말해 두면, hook은 키트가 내세우는 구성 요소가 아니라서 그것만은 직접 연결해야 해요.) Engineer Kit은 $99, Bundle은 $149예요. 페이지에는 환불 보장과 평생 업데이트가 적혀 있고, 키트에 반복 결제 표시는 없어요. 이건 지름길이지 필수는 아니에요―네 가지 모두 직접 손으로 만들 수도 있어요.
결정하기 전에 AgentKit 리뷰에서 제 솔직한 평가를 모두 읽어 보거나, AgentKit와 대안 비교에서 다른 선택지와 견줘 보세요.
자주 묻는 질문
Skill과 subagent―반복 작업에는 어느 쪽인가요?
Skill을 쓰세요. 반복 절차(리뷰 체크리스트, 커밋 메시지 스타일)는 메인 모델이 컨텍스트 안에서 적용하는 지식이에요. subagent는 그 작업이 충분히 무거워서, 메인 대화를 어지럽히지 않게 자체 컨텍스트 창에 격리하고 싶을 때만 꺼내 드세요.
MCP는 스킬을 대체하나요?
아니요. 둘은 다른 문제를 풀어요. Skill은 지시와 지식을 더하고, MCP는 데이터베이스나 GitHub 같은 외부 도구와 데이터에 닿는 능력을 더해요. Claude가 무언가를 알기만 하면 된다면 스킬을, 바깥 시스템에서 무언가를 실행해야 한다면 MCP를 쓰세요. 둘은 자주 함께 일해요.
hook은 AI인가요, 그냥 스크립트인가요?
그냥 스크립트예요. hook은 PreToolUse나 Stop 같은 라이프사이클 이벤트에서 실행되는 결정론적 셸 명령이에요. 모델의 판단과 상관없이 실행되기 때문에, 자동 포맷, 테스트 강제, 시크릿 스캔 같은 가드레일에 딱 맞는 선택이에요.
subagent는 토큰을 더 쓰나요?
그럴 수 있어요. 각 subagent는 자체 컨텍스트를 띄우고 상태를 다시 세우기 때문에, 사소한 작업을 subagent로 감싸는 건 순수한 오버헤드예요. 대신 무거운 작업을 메인 컨텍스트 밖에 두면 전체적으로는 토큰을 아낄 수 있어요. 비용을 잡으려면 subagent를 더 저렴한 모델로 돌릴 수도 있어요.
슬래시 명령이 스킬이 됐나요?
네. 2026년 기준으로 커스텀 슬래시 명령은 스킬로 통합됐어요―예전의 .claude/commands/x.md는 SKILL.md와 같은 개념이에요. commands는 다섯 번째 별도 프리미티브가 아니라, 스킬을 이름으로 호출하는 방법이라고 생각하세요.
네 가지가 다 필요한가요?
처음부터는 아니에요. 대부분 하나나 둘로 시작해 필요가 생기면 나머지를 더해요. 다만 완성된 세팅은 네 가지를 다 쓰고, 이미 만들어진 걸 원한다면 AgentKit 같은 큐레이션 키트가 스킬, subagent, MCP 연동을 미리 만들어 제공하니 hook만 직접 연결하면 돼요.
마무리와 다음 단계
이 요령은 외워 둘 만해요. 지식을 더하려면 → Skill, 도구나 데이터 소스를 더하려면 → MCP, 무거운 작업을 분리하려면 → Subagent, 무언가를 결정론적으로 강제하려면 → Hook이에요. 두 기준―결정론적인 건 Hook뿐, 자체 컨텍스트 창을 갖는 건 Subagent뿐―만 기억하면 매번 알맞은 프리미티브를 고를 수 있어요. 여기서 더 나아가려면 Claude Code 스킬을 더 깊이 파거나, 미리 만들어진 토대에서 시작하고 싶다면 먼저 키트를 받고(링크로 20% 할인) 솔직한 AgentKit 리뷰를 읽어 보세요.