CLAUDE.md、skill、hook、子代理、MCP、插件:Claude Code 的六种扩展各管什么,先用哪个
Claude Code 的扩展方式有六七种,名字相近,容易用错地方。按官方的选型说明整理:每一种解决什么问题、什么信号出现时该加哪一种、相近的几种怎么区分、各占多少上下文。占用的数字用的是本站这个系列实测到的。
本文根据公开分享整理,本站尚未实测。操作前请对照文末的原始来源。
这篇教程解决一个问题:想让 Claude Code 记住一件事、学会一件事或者接上一个系统,到底该写在哪。
Claude Code 的扩展方式不少:CLAUDE.md、规则文件、skill、hook、子代理、MCP、插件。它们名字相近,功能看着也有重叠,新手最常见的做法是把所有东西都塞进 CLAUDE.md。结果是文件越来越长,真正要紧的规矩反而被忽略。
这一篇不讲每一种怎么写(那些各有专门的文章,文中都给了链接),只讲怎么选。
这篇按官方文档整理,没有单独做实测。文中“占多少上下文”一节的数字,来自本系列前几篇在同一个示例仓库上的实测(Claude Code 2.1.296)。
一句话版本
| 你想要的 | 用什么 | 详细的教程 |
|---|---|---|
| 它每次都该知道的事 | CLAUDE.md |
CLAUDE.md 怎么写 |
| 只对一部分文件适用的规矩 | .claude/rules/ 下的规则文件 |
同上 |
| 一套可以反复用的步骤或知识 | skill | skills 怎么写 |
| 每一次都必须发生的动作 | hook | Hooks 实战 |
| 接上一个外部的系统 | MCP | MCP 实战 |
| 把一件活隔离出去做 | 子代理 | 子代理实战 |
| 把上面这些打包给别的项目或别人用 | 插件 | — |
官方文档用一句话概括了分工:CLAUDE.md 管一直都在的上下文,skill 管按需取用的知识和流程,MCP 管对外的连接,子代理管隔离,hook 管自动化。
不用一开始就配齐:等信号出现再加
这是官方文档里最实用的一张表。每一种扩展都有一个明显的信号,多数团队是按下面的顺序一样样加上的:
| 你发现自己…… | 就加 |
|---|---|
| 看到它把同一个约定或命令搞错了第二次 | 写进 CLAUDE.md |
| 总在对话开头打同一段话来启动一件事 | 存成一个 skill |
| 第三次把同一份操作步骤粘贴进对话 | 写成一个 skill |
| 总在从一个它看不到的页面里复制数据给它 | 把那个系统接成 MCP 服务器 |
| 看到一件附带的任务把对话塞满了你不会再看的输出 | 交给子代理 |
| 想让某件事每次都发生,不用你开口 | 写成 hook |
| 第二个仓库也需要同样的一套 | 打包成插件 |
文档还补了一句:同样的信号也告诉你什么时候该改已有的东西。同一个错误再犯、同一条审查意见再出现,应该去改 CLAUDE.md,而不是在对话里再纠正一次。
新手从哪开始,文档的建议很明确:先写 CLAUDE.md,别的等信号出现了再说。
最容易混的几对
CLAUDE.md 还是 skill
两者都是写给它看的说明,区别在什么时候加载。
CLAUDE.md |
skill | |
|---|---|---|
| 什么时候加载 | 每个会话,自动 | 用到时 |
| 能不能当命令触发 | 不能 | 能,用 /名字 |
| 适合放 | “总是这样做”的规则 | 参考资料、可以触发的流程 |
判断办法:它是不是每次都该知道。编码约定、构建命令、项目结构、“绝不要做某事”,放 CLAUDE.md。有时才用得上的参考资料(接口文档、风格指南),或者一套要你触发的流程(部署、发版),放 skill。
文档给的经验值:CLAUDE.md 控制在 200 行以内。超了,就把参考性的内容挪到 skill,或者拆到规则文件里。
CLAUDE.md、规则文件还是 skill
三种都放说明,加载的时机不同:
CLAUDE.md |
.claude/rules/ |
skill | |
|---|---|---|---|
| 加载 | 每个会话 | 每个会话,或者碰到匹配的文件时 | 被调用或者相关时 |
| 范围 | 整个项目 | 可以限定到某些路径 | 某一类任务 |
| 适合放 | 核心约定和构建命令 | 某种语言、某个目录特有的规矩 | 参考资料、可重复的流程 |
带路径限定的规则文件,只在 Claude 处理匹配的文件时才加载。我们在CLAUDE.md 那篇里实测过:给测试文件写了一条规则,它一读测试文件,屏幕上就出现 Loaded .claude/rules/tests.md。
CLAUDE.md 还是 hook
这一对的区别不在内容,在有没有保证。
CLAUDE.md 是给模型的上下文,它会尽量照做,但不保证。hook 是 Claude Code 在固定时机直接执行的命令,不经过模型。
判断办法:它偶尔不做,你能不能接受。能,写 CLAUDE.md;一次都不能漏,写 hook。
我们的实测里有一个例子正好说明这一点。在Hooks 那篇里,一个 hook 在每次改完文件后自动整理格式。我们让 Claude 故意写一个格式不对的文件,它写完之后报告说:这一步是外层执行的,“我拦不住”。
skill 还是子代理
| skill | 子代理 | |
|---|---|---|
| 是什么 | 可以反复用的说明、知识或流程 | 一个有自己上下文的独立工作者 |
| 好处 | 同一份内容到处能用 | 隔离:活在别处干,只把总结拿回来 |
| 对主对话的上下文 | 加进主对话 | 用另一个上下文 |
| 适合 | 参考资料、可触发的流程 | 要读很多文件的任务、并行的工作、专门的角色 |
两者可以组合:子代理可以预先加载指定的 skill;skill 也可以设成在隔离的上下文里运行。
MCP 还是 skill
| MCP | skill | |
|---|---|---|
| 提供的是 | 工具和数据的访问 | 知识、流程、参考资料 |
| 例子 | 查数据库、发 Slack 消息、控制浏览器 | 代码审查清单、部署流程、接口风格指南 |
它们解决的是两件事,而且常常一起用:MCP 让它能访问一个系统,skill 教它怎么用好这个系统。文档举的例子是:MCP 接上你的数据库,再用一个 skill 写明表结构和常用的查询方式。
子代理还是动态工作流
两者都把活放到主对话之外去做。区别是谁来决定下一步:用子代理时,Claude 一轮一轮地决定派谁、做什么;动态工作流是 Claude 先写一段脚本,由脚本来调度很多个子代理。
要一个快速、专注的帮手,用子代理。任务大到几个子代理应付不了,或者你希望结果先互相核对过再交给你,用动态工作流,见动态工作流怎么用。
同一样东西配在几个地方,听谁的
这些扩展大多可以配在不止一层:个人、项目、插件、组织。同名的时候怎么算,各有各的规矩。按官方文档:
| 扩展 | 多处都有时 |
|---|---|
CLAUDE.md |
叠加。各层的内容同时进上下文;有冲突时由 Claude 自己权衡 |
| skill | 同名的只留一个:组织优先于个人,个人优先于项目 |
| 子代理 | 同名的只留一个:组织、启动参数、项目、个人、插件,依次优先 |
| MCP 服务器 | 同名的只留一个:local 优先于 project,project 优先于 user |
| hook | 合并。所有登记的 hook 都会在匹配的事件上触发,不管来自哪里 |
CLAUDE.md 是叠加的,所以个人的偏好和项目的规矩可以同时生效,但也意味着写矛盾了没有哪一方会“赢”。
各占多少上下文
每加一样扩展,都要占一点上下文。占多了有两个后果:一是窗口被挤满;二是噪音变多,文档说这会让 skill 不能正确触发,或者让 Claude 记不住你的约定。
官方文档列了每一种的加载方式:
| 扩展 | 什么时候加载 | 加载什么 | 代价 |
|---|---|---|---|
CLAUDE.md |
会话开始 | 全部内容 | 每次请求都带着 |
| skill | 会话开始,加上用到时 | 开始时只有说明,用到时才是全文 | 低 |
| MCP 服务器 | 会话开始 | 工具的名字;完整的定义按需加载 | 用到之前低 |
| 子代理 | 被派出时 | 一个全新的上下文 | 和主会话隔离 |
| hook | 触发时 | 什么都不加载,它在外面跑 | 零,除非 hook 返回了附加的上下文 |
这个系列的实测里,在会话里运行 /context 看到的实际数字是这样的:
| 项目 | 占用 | 说明 |
|---|---|---|
| 系统提示词 | 2.6k token | Claude Code 自带 |
| 内置工具的定义 | 约 21k token | Claude Code 自带 |
一份 57 行的 CLAUDE.md |
2.4k token | CLAUDE.md 那篇 |
| 内置的 13 个 skill 的说明 | 约 2k token | 同上 |
| 一个带 3 个工具的 MCP 服务器 | 2.1k token,另加服务器说明 319 token | MCP 那篇 |
| 一个自定义子代理的说明 | 73 token | 子代理那篇 |
几点可以从中读出来:
- 什么都不配,开一个会话也要先占掉两万多 token。 大头是 Claude Code 自己的工具定义。
- 一份不长的
CLAUDE.md和一个小的 MCP 服务器,各占两千多。 单看不多,但它们每一轮请求都要带上。 - 子代理的说明最便宜,因为它的正文只在被派出时才加载,而且加载在另一个上下文里。
这些数字只是一个仓库、一个版本上的读数,用来建立量级的概念,不要当成规格。
想省上下文,文档给的几个办法:
CLAUDE.md保持在 200 行以内,参考性的内容挪到 skill。- 不想让某个 skill 的说明占着上下文,在它的头部加
disable-model-invocation: true,这样只有你手动调用时它才加载。 - 不用的 MCP 服务器删掉。
组合起来用
真实的配置是几种一起用的。文档举的几个组合:
| 组合 | 怎么配合 | 例子 |
|---|---|---|
| skill 加 MCP | MCP 提供连接,skill 教它怎么用好 | MCP 接数据库,skill 写明表结构和查询的套路 |
| skill 加子代理 | 一个 skill 派出几个子代理并行干活 | 一个审计用的 skill,同时派出查安全、查性能、查风格的三个子代理 |
CLAUDE.md 加 skill |
前者放一直生效的规则,后者放按需加载的资料 | CLAUDE.md 里写“遵守我们的接口约定”,完整的约定放在 skill 里 |
| hook 加 MCP | hook 通过 MCP 触发外部的动作 | 改了关键文件之后,hook 发一条 Slack 通知 |
插件:最后才需要的一层
插件不是另一种扩展,是打包的方式。一个插件把 skill、hook、子代理和 MCP 服务器捆成一个可以安装的单元。插件里的 skill 带命名空间(比如 /my-plugin:review),所以多个插件可以共存。
什么时候需要:同一套配置要用在好几个仓库里,或者要分发给别人。只在一个项目里用,直接放在项目的 .claude/ 目录下提交就够了。
Claude Code 的另一种扩展 mod,是改界面和行为的,见Claude Code Mods 是什么。
一个可以照着走的顺序
把上面的内容压成一条路线:
- 第一天:运行
/init生成CLAUDE.md,删掉读代码就能知道的内容,加上你自己的规矩。 - 第一周:看到它重复犯错,就往
CLAUDE.md里加一条。文件变长了,把只和某类文件有关的规矩拆到.claude/rules/。 - 有了反复做的事:写成 skill。
- 有了“一次都不能漏”的事:写成 hook。格式化、不许改的文件,是最常见的两个。
- 总在给它粘贴别处的数据:接 MCP。
- 主对话总被调查类的任务塞满,或者想让另一个角色来检查:写子代理。
- 第二个仓库也要这一套:打包成插件。
每一步都等信号出现再走。配得多不等于配得好,每一样都占上下文,也都要维护。
这篇没有覆盖到的
- 没有单独实测。 选型的说法来自官方文档;上下文占用的数字来自本系列别的文章的实测。
- 官方文档里列的另外几种没有展开:输出风格、代码智能插件、跨会话消息、Artifact。
- 插件怎么做这个系列还没有写。
- 多层配置的优先顺序没有逐条验证。