随着 Anthropic 推出 claude code CLI,Skill 成了开发者定制 AI 工作流的核心。但它绝非简单的 Prompt 堆砌,而是一套精密的、工程化的智能体编排机制。
本文将深入底层,拆解 Skill 运行的基础,并厘清它与 CLAUDE.md 及 MCP 的本质区别。
什么是 Claude Skill?
简单来说,Claude Skill 是用户为 claude code CLI 定义的自定义能力。它允许你将复杂的、重复的工作流封装成一个简单的指令,让 Claude 能够像调用原生工具一样调用这些逻辑。
场景举例:
- Lint & Fix: 一键运行 ESLint 并自动修复所有报错。
- Review: 按照特定的团队代码规范(Context)审查当前的变更。
- Deploy: 封装复杂的 K8s 部署脚本,让 AI 帮你执行发布。
物理架构:Skill 到底存在哪?
与全局规范文件 CLAUDE.md 不同,Skill 是以独立文件夹的形式存在的。这种结构允许 Skill 携带私有的脚本和资源,实现功能的“封装”。
目录结构示例:
my-project/
├── .claude/
│ └── skills/
│ └── custom-test/ <-- Skill 名称
│ ├── SKILL.md <-- 核心:定义 Skill 的逻辑、元数据与 Prompt
│ └── test-helper.py <-- 伴随脚本:该 Skill 专用工具
SKILL.md 的核心构成
它包含 YAML Frontmatter,用于向 Claude 宣告自己的能力:
---
name: custom-test
description: 针对本项目复杂业务逻辑的专项测试工具
---
# Instructions
1. 先运行 `python test-helper.py` 预处理数据
2. 调用 `npm test` 并分析输出
3. ...
核心解密:Skill 运行的基础设施
这是大家最关心的部分。当你在 claude code 中创建一个 Skill 后,Claude 并不是通过魔法来执行它的。
Claude Skill 的本质,是 LLM 对一组“元工具(Primitive Tools)”的编排。
为了让一个 Skill 跑起来,claude code 的宿主环境(CLI)必须向模型提供以下基础 Tool 能力,否则任何复杂的 Skill 都无法落地:
1. Bash / TerminalExecute (执行引擎)
这是 Skill 运行的心脏。
- 作用:允许 Claude 在你的本地机器上执行 Shell 命令。
- 为什么必须:绝大多数 Skill 最终都会转化为命令行操作。比如你定义一个 “Test” Skill,Claude 实际上是在调用
Bash工具执行npm test或pytest。 - 依赖:需要用户授予 CLI 执行命令的权限(通常是 Docker 容器内或本地沙盒环境)。
2. FileEdit / FileSystem (读写能力)
这是 Skill 的手。
- 作用:允许 Claude 读取文件内容、修改代码、创建配置文件。
- 为什么必须:如果你的 Skill 涉及“重构代码”或“生成文档”,Claude 必须通过此工具将思维链中的代码写入硬盘。
3. Glob / Search (感知能力)
这是 Skill 的眼。
- 作用:允许 Claude 查找文件路径、搜索代码片段。
- 为什么必须:当 Skill 需要“修复所有引用了旧 API 的文件”时,它必须先用
Glob工具定位到这些文件。
📊 Skill 执行流程图解
graph LR
User[用户指令: Run 'Fix-Bug' Skill] --> Claude[Claude 模型]
Claude -->|解析 Skill 定义| Plan[生成执行计划]
Plan -->|调用 Tool| Bash[Primitive: Bash Tool]
Plan -->|调用 Tool| File[Primitive: FileEdit Tool]
Bash -->|返回 Stdout/Stderr| Claude
File -->|返回 读写结果| Claude
Claude -->|最终反馈| User
结论:Skill 不是独立存在的,它是建立在 Bash + FileEdit + Context 之上的宏(Macro)。
上下文友好:渐进式披露机制 (Progressive Disclosure)
这是 Skill 相比于 CLAUDE.md 最核心的工程优势。它解决了 LLM 上下文(Context Window)拥挤和 Token 浪费的问题。
对比加载机制:
CLAUDE.md(Always-On):- 无论对话内容为何,它的内容都会被注入到每一轮对话的 System Prompt 中。
- 痛点:如果项目规范太多,会挤占宝贵的上下文空间,导致模型注意力分散。
- Claude Skill (Progressive / On-Demand):
- 初始阶段:Claude 只读取所有 Skill 的
name和description(极其轻量)。 - 触发阶段:当用户说“帮我测一下业务逻辑”,Claude 发现
custom-test的描述匹配,才会动态地将该 Skill 文件夹下的SKILL.md全文加载。 - 优势:按需加载,用完即走。 这让项目可以拥有成百上千个 Skill 而不会拖慢模型响应速度。
- 初始阶段:Claude 只读取所有 Skill 的
Skill vs. MCP:是替代关系吗?
结论:它们不是替代关系,而是“补给”与“指挥”的关系。
- MCP (Model Context Protocol) 是外部能力的补给线。
- 它让 Claude 能连接到它本来触达不到的地方(如 Google Drive、Sentry 日志、远程数据库)。
- 它是通用的、标准化的 API 桥梁。
- Skill 是本地任务的指挥官。
- 它定义了“针对当前项目,应该如何组合工具来干活”。
- 它可以调用
Bash,也可以调用通过 MCP 接入的远程工具。
三者协同的“权力地图”
| 特性 | CLAUDE.md | Claude Skill | MCP (Server) |
|---|---|---|---|
| 角色 | 项目宪法(全局规范) | 项目 SOP(具体任务流程) | 外部工具箱(扩展能力) |
| 加载时机 | 始终加载 | 匹配意图后按需加载 | 客户端启动即连接 |
| 知识范畴 | 本地、静态 | 本地、动态、可带脚本 | 远程、通用 |
| 典型案例 | ”代码必须用 Tab 缩进" | "一键发布代码并通知 Slack" | "查询生产环境数据库” |
总结:如何优雅地分享 Skill?
如果你要向团队分享一个 Skill,请记住:
- 它具有“渐进式”优势:放心地把复杂的、长篇大论的操作步骤写在
SKILL.md里,它不会浪费 Token,直到有人真的需要它。 - 它是“对上下文友好”的:它比全局配置更精准,因为它只在被调用时生效。
- 它是“可移植”的:只需把
.claude/skills/下的文件夹提交到 Git,团队里的每个人(以及他们的 Claude)就立刻拥有了这项技能。
一句话总结:
MCP 扩展了 Claude 的“感知”,CLAUDE.md 约束了 Claude 的“行为”,而 Skill 沉淀了项目的“最佳实践逻辑”。