技能、CLAUDE.md、子代理、钩子或 MCP:何时使用哪种
Claude Code 拥有 五层自定义能力。CLAUDE.md、Skills、subagents、hooks 和 MCP 服务器。选错一个,你就会得到一个永远不会触发的 Skill,一个执行 subagent 工作但实际上是 hook 的东西,或者一个臃肿到在你打字前就吃掉你一半上下文的 CLAUDE.md。
以下是它们各自的归属。
CLAUDE.md
加载到每次对话中。将其用于你绝不希望被跳过的规则,例如“TypeScript 严格模式”或“绝不更改数据库 schema”。
如果一个规则只在某些时候才重要,那它就不属于这里。你将为每次提示支付 token 来加载它。
Anthropic 的经验法则是保持 CLAUDE.md 在 200 行以下。对于每一行,都要问问自己,移除它是否真的会导致 Claude 出错。如果不会,就删除它。臃肿的 CLAUDE.md 并不会让 Claude 遵守更多规则,反而会让 Claude 忽略其中一半规则,因为重要的规则会淹没在噪音中。
如果它确实增长到超过 200 行,官方建议是将参考内容移至 Skills,或拆分到只在 Claude 处理匹配路径时加载的 .claude/rules/ 文件中。
Skills
Markdown 文件,当请求匹配其 frontmatter 中的描述时,Claude 会自动加载。这是 PR 评审清单、发布流程、库特定约定以及任何特定任务的合适归宿。
描述必须涵盖两件事,该 skill 的作用以及何时使用它。如果跳过“何时使用”,Claude 就永远不会加载该 skill,无论其主体内容有多好。将关键用例放在首位,因为在 skill 列表中,描述最多只能容纳 1,536 个字符。
主体内容也有自己的限制。 Anthropic 建议将 SKILL.md 保持在 500 行以下,并将长篇参考资料移至 skill 链接到的单独文件中。一旦 skill 加载,其内容将在会话的其余时间保持在上下文中,因此每一行都会产生重复的 token 成本。
Subagents
在它们自己的上下文窗口中运行。你交给它一个任务,它会独立工作,拥有自己的 token 预算,然后你得到结果。
最适合并行研究、隔离繁琐的工作或需要你不想在主会话中使用的工具的任务。 同时协调多个 subagent 需要一些技巧,因为它们不共享状态。
Subagents 也可以使用 Skills,但你必须使用 skills frontmatter 字段显式地将它们连接起来。与主会话不同,skill 描述不会自动加载到 subagent 中,因此按描述匹配触发不会自动发生。
Hooks
CLAUDE.md 中的指令是建议性的,Claude 会决定是否遵循它们。 Hooks 是确定性的。事件触发,hook 运行,不涉及判断。它们是五种能力中唯一完全绕过模型的。
大多数人会挂钩的事件是 PreToolUse(在工具调用运行前验证或阻止它)、PostToolUse(工具调用后做出反应,例如 linting Claude 刚刚编辑的文件)、UserPromptSubmit(拦截发送给 Claude 的内容)和 SessionStart(每个会话加载一次上下文)。
这就是为什么 hooks 是设置 guardrails 的正确位置。CLAUDE.md 或 Skill 中的“绝不编辑 .env”是一个请求。一个阻止编辑的 PreToolUse hook 是强制执行。
如果你的规则是“每次 Claude 执行 Y 时运行 X”,那就是一个 hook。 Linters、formatters、validators、audit logging。
MCP servers
其他四种能力塑造了 Claude 的思考方式。MCP 使 Claude 能够执行新任务,例如与 API、数据库或内部系统交互。 有时 CLI 就足够了,但有时你确实需要一个 MCP 服务器。
它们如何组合
- CLAUDE.md 用于硬性规则
- Skills 用于流程和领域知识
- Subagents 用于委派工作
- Hooks 用于自动副作用
- MCP servers 用于外部世界
陷阱是将所有东西都塞进 Skills。一个始终适用的约束仍然属于 CLAUDE.md。保存文件时的副作用仍然属于 hook。
关于长篇内容,Anthropic 在 Skilljar 上提供的免费 Introduction to Agent Skills 课程详细介绍了整个规则体系,而 三分钟的视频则能在你冲咖啡的时间内讲完。