主题
08.5 四种扩展机制怎么选
CLAUDE.md、Rules、Skill、Subagent、MCP —— 五种机制,一张决策矩阵讲清。
读完你能做什么:面对任何"我想让 Claude 具备某种能力/遵守某种规范"的需求,立刻选对机制。
一、五种机制一览
| 机制 | 提供什么 | 加载时机 |
|---|---|---|
CLAUDE.md | 常驻的事实与规则 | 每次会话全量 |
.claude/rules/ | 可按路径生效的规则 | 每次会话 / 匹配文件时 |
Skill | 按需的流程与参考资料 | 调用时 |
Subagent | 隔离上下文的执行者 | 委派时 |
MCP | 新的工具能力 | 常驻(工具定义) |
二、核心判断:知识 / 流程 / 能力 / 隔离
先问自己:我要加的是什么?
text
我要加的是……
│
├─ 一条"始终要遵守的规则/事实"
│ ├─ 对整个项目都成立 → CLAUDE.md
│ └─ 只对某些文件成立 → .claude/rules/(带 paths)
│
├─ 一套"多步的流程/工作法"
│ → Skill
│
├─ 一个"新的工具能力"(连数据库、调 API)
│ → MCP
│
└─ 一个"需要隔离上下文的执行者"
→ Subagent三、逐对辨析
3.1 CLAUDE.md vs Skill
| CLAUDE.md | Skill | |
|---|---|---|
| 加载 | 每次全量 | 调用时 |
| 长内容成本 | 每次都付 | 平时零 |
| 适合 | 短小、每次都用 | 长、偶尔用 |
| 例子 | "金额用 BigDecimal" | "上线前 8 步检查流程" |
判据:短且高频 → CLAUDE.md;长或低频 → Skill。
一条长流程写进 CLAUDE.md 会拖累每次会话;做成 Skill 只在需要时加载。
3.2 Rules vs CLAUDE.md
| CLAUDE.md | .claude/rules/ | |
|---|---|---|
| 生效范围 | 整个会话 | 可按 paths 匹配文件 |
| 适合 | 全局规则 | 分模块/分文件类型的规则 |
判据:规则只对某些文件成立(如"API 文件必须有输入校验") → 用带 paths 的 rule,它只在处理匹配文件时加载,平时不占上下文。
3.3 Skill vs Subagent
| Skill | Subagent | |
|---|---|---|
| 上下文 | 注入当前上下文 | 独立上下文 |
| 返回 | 全程在主会话 | 只回传结论 |
| 适合 | 需要主会话看到全过程 | 会产生大量噪音,要隔离 |
判据:流程会读大量文件/产生大量中间输出 → Subagent(隔离噪音);流程需要主会话保留细节 → Skill。
(注:Skill 也可以用 context: fork + agent 在隔离上下文跑,此时它兼具两者特性。)
3.4 Skill vs MCP
| Skill | MCP | |
|---|---|---|
| 提供 | 新流程/知识(怎么用已有能力) | 新能力(新工具函数) |
| 要写代码吗 | 不用(Markdown) | 要(server 实现) |
| 例子 | "上线检查清单"的执行流程 | "查询公司数据库"的工具 |
判据:你缺的是"怎么做"(有工具但要规范流程)→ Skill;你缺的是"能做"(根本没有对应工具)→ MCP。
3.5 MCP vs Subagent
这两个常被混淆,但完全不同:
text
MCP = 给 Claude 新的"手"(工具)
Subagent = 给 Claude 一个"分身"(执行者)一个 subagent 可以使用 MCP 工具;MCP 不是执行者,是能力。
四、决策矩阵(打印版)
| 你的需求 | 选择 |
|---|---|
| "每次都用 2 空格缩进" | CLAUDE.md |
| "src/api 下的文件必须做输入校验" | rules(paths: src/api/**) |
| "金额一律 BigDecimal" | CLAUDE.md(+ hook 强制) |
| "上线前跑这 8 步检查" | Skill |
| "按我们的规范设计 API"(规范很长) | Skill(+ reference 文件) |
| "让它能查我们的生产数据库" | MCP |
| "让它能在 Jira 建 issue" | MCP |
| "在 500 个文件里找出所有 X" | Subagent(隔离噪音) |
| "独立验证这个结论" | Subagent(隔离上下文) |
| "提交前必须跑测试"(要 100% 保证) | Hook(不是上面任何一个) |
| "禁止读 .env" | 权限 deny 规则 |
注意最后两行 —— 需要确定性保证的,用 hook / 权限,不用上面五种(它们都是概率性影响)。这条界线见 04.2 元技巧 2。
五、组合使用
真实场景常常需要多个机制配合。
5.1 一个"安全的数据库操作"能力
text
MCP server(只读账号) → 提供查询能力
+ 权限 deny 写操作 → 确定性护栏
+ Skill「数据分析流程」 → 规范怎么用(先看 schema 再查,结果如何呈现)
+ CLAUDE.md「生产数据只读」 → 常驻提醒四个机制各司其职:MCP 给能力,权限给边界,Skill 给流程,CLAUDE.md 给提醒。
5.2 一个"团队代码规范"体系
text
CLAUDE.md → 全局规则(构建命令、绝对约束)
+ rules/frontend.md → 前端文件的规范(paths: src/web/**)
+ rules/backend.md → 后端文件的规范(paths: src/api/**)
+ Skill「code-review」 → 评审流程
+ Hook(PostToolUse) → 自动格式化(确定性)
+ Hook(PreToolUse) → 提交前跑测试(确定性)六、一个反面案例
需求:"我想让 Claude 每次改完代码自动跑测试并格式化。"
新手选择:写进 CLAUDE.md「改完代码后请跑测试和格式化」。
问题:CLAUDE.md 是概率性的。它可能忘、可能跳过。而且这是"每次都要发生的确定动作",不该靠自觉。
正确选择:Hook(PostToolUse 匹配 Edit|Write)。确定性地在每次编辑后执行。
教训:先问"这需要 100% 保证吗?" 是 → hook/权限;否 → 才在五种机制里选。
七、选择流程图(完整版)
text
开始
│
├─ 需要 100% 确定性保证吗?
│ ├─ 是 → Hook(动作)或 权限规则(边界)→ 结束
│ └─ 否 → 继续
│
├─ 我缺的是"新工具能力"吗?(连外部系统)
│ ├─ 是 → MCP → 结束
│ └─ 否 → 继续
│
├─ 我要加的是"规则/事实"还是"流程"?
│ ├─ 规则/事实
│ │ ├─ 全局 → CLAUDE.md
│ │ └─ 按文件 → rules(paths)
│ └─ 流程
│ ├─ 会产生大量噪音,要隔离 → Subagent
│ └─ 需要主会话看到全过程 → Skill
│
└─ 结束