Claude Code 给你一堆”教它做事”的方式:skill、CLAUDE.md、斜杠命令、subagent、hook、MCP。它们解决的是不同的问题,选错那个,就是平白给自己加复杂度。
前面三篇(什么是 skill / 怎么加载匹配 / 进阶技巧)一直在讲 skill。这一篇把它放回全家福里,告诉你什么时候该用别的。
先上主表。区分它们只看三件事:谁触发它、在哪运行、什么时候在场。
| 选项 | 怎么触发 | 在哪运行 | 最适合 |
|---|---|---|---|
| CLAUDE.md | 自动,永远 | 当前对话 | 永远成立的项目规范 |
| skill | AI 语义匹配,自动 | 当前对话 | 偶尔才需要的任务专长 |
| 斜杠命令 | 你手动敲 /xxx | 当前对话 | 你想主动触发的固定动作 |
| subagent | 你委派 | 独立隔离的上下文 | 隔离的委派任务、需要不同工具权限 |
| hook | 事件触发(存文件/工具调用) | 事件发生时 | 每次保存跑 linter、调用前校验 |
| MCP server | 提供外部工具 | 外部集成 | 接外部系统、数据源 |
下面几组两两对比,讲清边界。
CLAUDE.md vs skill:永远在场 vs 按需加载
这是最容易混的一对,核心区别就一句:CLAUDE.md 每次对话都加载,skill 匹配上才加载。
- 用 CLAUDE.md 放:
- 永远适用的项目规范(比如”本项目用 TypeScript 严格模式”)
- 硬约束(比如”绝不改数据库 schema”)
- 框架偏好和代码风格
- 用 skill 放:
- 任务专长(只在做某类活时才需要)
- 只是偶尔相关的知识
- 写进每次对话会嫌啰嗦的详细流程
判断口诀:永远要 → CLAUDE.md;偶尔要 → skill。 你写新代码时,根本不需要 PR review 清单挂在 context 里——那是 skill 的活。
skill vs subagent:加知识 vs 派活
- skill 是把知识加进你当前这个对话。skill 一激活,它的指令就并入现有上下文,和你继续聊同一摊事。
- subagent 是在另一个隔离的上下文里干活。你给它一个任务,它独立做完,把结果交回来——它和你的主对话是隔开的,还可以有和主对话不同的工具权限。
什么时候用 subagent:你想把一块活委派出去、需要不同的工具访问、或者想让这块委派工作和主上下文互不污染。
什么时候用 skill:你想增强当前任务的能力,而且这份专长贯穿整个对话。
一个会让人栽跟头的细节:subagent 默认看不到你的 skill。 委派给 subagent 时,它从一个干净的新上下文起步——内置 agent(Explorer / Plan / Verify)根本用不了 skill;自定义 agent 能用,但你得在它的 frontmatter 里显式写一个
skills:字段列出要加载哪些(而且是 agent 启动时就加载,不像主对话那样按需匹配)。所以”我主对话里好好的 skill,到 subagent 里怎么不灵了”——答案通常就是:你没把它列进去。
skill vs hook:你问它才动 vs 事件一到就动
- hook 是事件驱动的。它在某个事件发生时自动跑——比如每次 Claude 保存文件就跑一遍 linter,或在某些工具调用前先校验输入。它不管你”问了什么”。
- skill 是请求驱动的(上面讲过的语义匹配),它根据你在问什么来激活。
用 hook 处理:每次存文件都该跑的操作、特定工具调用前的校验、Claude 动作的自动化副作用。
用 skill 处理:影响 Claude 怎么思考、怎么处理请求的知识和准则。
skill vs 斜杠命令:自动 vs 手动
两者都在当前对话里生效,区别在谁按下触发键:
- 斜杠命令:你得记得它、主动敲
/xxx才触发。 - skill:你不用敲,AI 认出场景自动用上。
所以如果一件事你希望”我明确要的时候才做”,做成斜杠命令;如果你希望”只要话题对了它就该自动套用”,做成 skill。
MCP:根本不是一类
MCP server 提供的是外部工具和集成——把 Claude 接到外部系统、数据源、第三方服务上。它和上面几个不是一个维度的东西:前面那些是”怎么教 Claude 做事”,MCP 是”给 Claude 接上外部的手脚”。
组合起来用,别硬塞进一个
它们不是单选题。一套典型配置长这样:
| 层 | 放什么 |
|---|---|
| CLAUDE.md | 永远在场的项目规范 |
| skill | 按需加载的任务专长 |
| hook | 事件触发的自动化操作 |
| subagent | 隔离上下文里的委派任务 |
| MCP | 外部工具和集成 |
每个功能管自己那摊专长。 别因为先学会了 skill,就把什么都往 skill 里塞——该用 hook 的(每次保存自动跑)硬写成 skill,它根本不会在”保存”这个事件上触发;该进 CLAUDE.md 的(永远成立的规则)塞进 skill,它就可能在你需要时没匹配上。
给 vibe-coder 的话
回去翻翻你自己的 CLAUDE.md:里面有没有哪条其实”只在某些时候才用得上”? 如果有,它就是个被错放的 skill——挪出去,你每次对话的 context 都会清爽一点。
选对工具的心法很简单,对着主表问自己三个问题:
- 这件事永远要做,还是偶尔才要?(永远 → CLAUDE.md;偶尔 → skill)
- 它该我主动触发,还是AI 自动判断?(主动 → 斜杠命令;自动 → skill/hook)
- 它是当前对话里的知识,还是派出去的独立任务?(知识 → skill;派活 → subagent)
把这三问走一遍,你基本不会再选错。
真用起来 skill 时难免会碰到”它怎么不工作”。最后一篇是张急救卡: 跑挂,分别怎么修。