llmapis

🚀 深度解构 Claude Code Skill:架构原理、渐进式上下文与 MCP 之争

· 10 分钟

随着 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 testpytest
  • 依赖:需要用户授予 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 的 namedescription(极其轻量)。
    • 触发阶段:当用户说“帮我测一下业务逻辑”,Claude 发现 custom-test 的描述匹配,才会动态地将该 Skill 文件夹下的 SKILL.md 全文加载。
    • 优势按需加载,用完即走。 这让项目可以拥有成百上千个 Skill 而不会拖慢模型响应速度。

Skill vs. MCP:是替代关系吗?

结论:它们不是替代关系,而是“补给”与“指挥”的关系。

  • MCP (Model Context Protocol)外部能力的补给线
    • 它让 Claude 能连接到它本来触达不到的地方(如 Google Drive、Sentry 日志、远程数据库)。
    • 它是通用的、标准化的 API 桥梁。
  • Skill本地任务的指挥官
    • 它定义了“针对当前项目,应该如何组合工具来干活”。
    • 它可以调用 Bash,也可以调用通过 MCP 接入的远程工具。

三者协同的“权力地图”

特性CLAUDE.mdClaude SkillMCP (Server)
角色项目宪法(全局规范)项目 SOP(具体任务流程)外部工具箱(扩展能力)
加载时机始终加载匹配意图后按需加载客户端启动即连接
知识范畴本地、静态本地、动态、可带脚本远程、通用
典型案例”代码必须用 Tab 缩进""一键发布代码并通知 Slack""查询生产环境数据库”

总结:如何优雅地分享 Skill?

如果你要向团队分享一个 Skill,请记住:

  1. 它具有“渐进式”优势:放心地把复杂的、长篇大论的操作步骤写在 SKILL.md 里,它不会浪费 Token,直到有人真的需要它。
  2. 它是“对上下文友好”的:它比全局配置更精准,因为它只在被调用时生效。
  3. 它是“可移植”的:只需把 .claude/skills/ 下的文件夹提交到 Git,团队里的每个人(以及他们的 Claude)就立刻拥有了这项技能。

一句话总结:

MCP 扩展了 Claude 的“感知”,CLAUDE.md 约束了 Claude 的“行为”,而 Skill 沉淀了项目的“最佳实践逻辑”。

Share: