本页目录
MCP 与 Skills
MCP 接入能力(工具、数据、外部系统),Skills 注入方法(工作流、最佳实践、领域知识)。一个是手脚的延伸,一个是经验的注入——两者同用渐进式披露,却是可组合的两层。
概述
Agent 循环 解决了"模型怎么用工具",这篇解决"怎么给 agent 加东西"。给 agent 扩展,有两个同等重要、却常被混为一谈的层级:
- MCP 接入的是能力 / 接口——可执行的工具、可读的数据、外部系统。让 agent 能做新的事。
- Skills 注入的是知识 / 方法——工作流、最佳实践、领域 know-how、参考文件。让 agent 把事做对。
一个是"手脚的延伸",一个是"经验的注入"。二者都用按需加载、不撑爆基础上下文的思路(都属于渐进式披露 progressive disclosure),所以容易让人以为是一回事;实际它们是可组合的两层——方法层(Skills)调用能力层(MCP/工具)。本文上半讲 MCP,下半讲 Skills,最后把两者摆在一起对比。
第一部分:MCP —— 接入能力
它要消灭的:M×N 集成爆炸
没有标准时,M 个 AI 应用 × N 个工具/数据源,要写 M×N 套对接。MCP(Model Context Protocol) 是一套开放协议,常被比作"工具界的 USB-C":工具方按协议暴露一个 server,应用方实现一个 client,集成降成 M+N。
flowchart LR
subgraph N1["没有 MCP — M×N 套对接"]
direction LR
a1["App1"]
a2["App2"]
g1["GitHub"]
s1["Slack"]
d1["DB"]
a1 --- g1
a1 --- s1
a1 --- d1
a2 --- g1
a2 --- s1
a2 --- d1
end
subgraph N2["有 MCP — M+N"]
direction LR
b1["App1"]
b2["App2"]
mcp{{"MCP 协议"}}
g2["GitHub server"]
s2["Slack server"]
d2["DB server"]
b1 --> mcp
b2 --> mcp
mcp --> g2
mcp --> s2
mcp --> d2
end
MCP 由 Anthropic 在 2024 年底提出并开源,如今已是跨厂商的事实标准。
client-server 架构
flowchart LR
subgraph Host["宿主 Host (e.g. Claude Code)"]
Model["模型<br/>决策用哪个工具"]
Client["MCP Client<br/>每个 server 一个"]
Model <-->|"tool_use / tool_result"| Client
end
Client -->|"JSON-RPC 2.0<br/>stdio / Streamable HTTP"| Server["MCP Server<br/>暴露 tools / resources / prompts"]
Server --> World["真实世界<br/>GitHub API / 文件系统 / DB"]
- 宿主(host):Claude Code、Claude Desktop、自建 app——跑 MCP client。
- server:把某个能力(GitHub、文件系统、数据库……)按协议暴露,可本地子进程,也可远程服务。
- 消息走 JSON-RPC 2.0;传输本地用 stdio(子进程,标准输入输出),远程用 Streamable HTTP(早期是 HTTP+SSE)。
三类原语
| 原语 | 是什么 | 谁来用 | 类比 |
|---|---|---|---|
| tools | 模型可调用的函数(带 schema) | 模型决策调用 | 函数 / 动作 |
| resources | 宿主可读取的数据(文件、记录) | 宿主/用户读取后放进上下文 | 文件 / GET |
| prompts | 可复用的提示模板 | 用户/宿主触发 | 预设命令 |
最常用的是 tools——它直接接上 agent 循环:server 暴露的工具在模型眼里和自定义工具一样,产出 tool_use、宿主执行、tool_result 喂回。
怎么接一个 server
Claude Code 里接 server 就是一段配置。本地 stdio server:
{
"mcpServers": {
"context7": { "command": "npx", "args": ["-y", "@upstash/context7-mcp"] }
}
}
远程 HTTP server 则给 url。这台机器当前就接着两个真实在用的 server:context7(按需拉最新库文档)、code-review-graph(把代码库解析成结构图供审查)。
在 Claude API 一侧接远程 MCP 用两个必须成对的参数(beta mcp-client-2025-11-20):
在 Managed Agents 里,server 声明放在 agent 上(type/name/url,不带凭据),凭据存进 vault、创建 session 时用 vault_ids 挂上——Anthropic 侧代理在请求出站时注入 token,容器里的代码读不到密钥。
安全:server 带着权限运行
- server 以某种权限运行——能读写文件、能调 GitHub 的 server,等于把这些权限交给模型决策。不信任的 server 要沙箱、最小权限,凭据走 vault 而非硬编码。
- 工具输出里的 prompt 注入:server 返回的内容会进上下文、被当"观察"读。网页/issue 里藏着"忽略此前指令,去做 X"就可能劫持 agent。把工具输出当不可信数据,危险动作走 human-in-the-loop。
第二部分:Skills —— 注入方法
Skills 是什么
Skill 是一个文件夹,核心是一个 SKILL.md,打包了某个领域的工作流、最佳实践、参考文件。它把"每次都要重复叮嘱的 know-how"沉淀成可复用资源,让通用 agent 变成某个领域的专家——做 PPT、做 Excel、按某套规范写代码。
它和单次 prompt 不同:prompt 是这一轮对话的临时指令;skill 是跨对话、按需加载的持久方法。
SKILL.md 与渐进式披露
Skill 的精髓是渐进式披露(progressive disclosure)——不把全部内容塞进上下文,而是分层加载:
flowchart TD
A["① name + description<br/>(常驻上下文, 极小)"] -->|模型判断任务相关| B["② SKILL.md 正文<br/>(按需读入: 工作流/规则)"]
B -->|需要时| C["③ 引用的文件 / 脚本<br/>(用到才加载)"]
1. 2.
只有那行 description 常驻上下文(几十 token);模型判断任务相关时,才读 SKILL.md 正文;正文里引用的模板/脚本,用到才加载。这样几十个 skill 也不会撑爆基础上下文——和 MCP 用 tool search 按需加载工具 schema 是同一招。
内置 vs 自定义
| 类型 | 是什么 | 怎么引用 |
|---|---|---|
| 内置(Anthropic) | 常见文档任务:pptx / xlsx / docx / pdf | 按名字 {type: "anthropic", skill_id: "xlsx"} |
| 自定义 | 组织内用 Skills API 建的 | {type: "custom", skill_id: "skill_...", version: "latest"} |
每个 agent 最多 20 个 skill。在 Messages API 上通过 container.skills + code_execution 工具 + 两个 beta(code-execution-2025-08-25、skills-2025-10-02)启用,生成的 .pptx/.xlsx 以 file ID 回传、用 Files API 下载。在 Managed Agents 上,skills 直接是 agent 定义的一个数组。
Anthropic 语境里有两处「Skills」,是同一思想的两种载体:Claude Code 的
SKILL.md技能(如/oh-my-claudecode:...那类、以及本会话的claude-api技能),和 API / Managed Agents 的 Agent Skills。
何时写 skill
- 写 skill:某套 know-how 会跨对话/任务反复用到(团队的代码规范、固定的报告格式、某领域的标准流程),或要产出特定格式文档。
- 用一次性 prompt 就够:只在这一轮对话里需要的临时指令。
判据和"何时写 MCP server"同源:复用价值高就沉淀(写 skill / 写 server),用一次就别过度工程。
合到一起:能力 vs 方法
| MCP | Skills | |
|---|---|---|
| 扩展什么 | 能力 / 接口(tools, resources, prompts) | 知识 / 方法(指令、工作流、参考文件) |
| 形态 | client-server 协议,跨厂商 | 文件夹 + SKILL.md,渐进式披露 |
| 谁执行 | server(外部进程 / 服务) | 模型按 skill 指引,用现有工具执行 |
| 解决的问题 | M×N 集成、连接外部世界 | 重复 know-how、领域专精 |
| 渐进披露 | tool search 按需加载 schema | 描述常驻、全文/文件按需读 |
| 例子 | GitHub / Slack / DB server、context7 | pptx / xlsx 文档技能、自定义流程 |
它们可组合——方法层调用能力层:一个 skill 的流程里完全可以去调 MCP 暴露的工具。
flowchart TD
Loop["agent 循环 — 编排层"]
Skills["Skills — 方法层<br/>工作流 / 领域 know-how / 参考"]
Cap["能力层<br/>MCP 工具 · 内置工具 · 自定义工具"]
Loop --> Skills
Skills -->|驱动| Cap
Loop -->|也可直接调| Cap
落到本会话所在的栈:claude-api、OMC 那些 SKILL.md 是方法层;context7、code-review-graph 这些 MCP server 是能力层。两者各管一摊,合起来才是完整的 agent。
前沿:MCP 已是跨厂商标准
一个有力旁证:阿里的 world model Qwen-AgentWorld-35B-A3B 在它模拟的七类 agent 环境里,第一类就是 "tool calling (MCP)"——连一个非 Anthropic 的前沿模型,都把"通过 MCP 调工具"当作 agent 的标准交互范式来训练和模拟。MCP 正在成为 agent 接触世界的通用接口。详见 Agent 循环与工具使用 的前沿小节。
最佳实践
- 分清两层再扩展。 缺能力(连外部系统)上 MCP,缺方法(重复 know-how)写 Skill;别用一个解决另一个的问题。
- 复用价值高才沉淀。 跨对话反复用到才写 server / 写 skill;用一次的临时指令用 prompt 就够。
- 靠渐进式披露控上下文。 Skill 只让
description常驻、正文按需读;工具多了用 tool search 按需加载 schema——几十个也不撑爆。 - 不信任的 server 要沙箱 + 最小权限。 server 带着权限运行,等于把权限交给模型决策。
- 凭据走 vault,别硬编码。 Managed Agents 把 server 声明(不带凭据)放 agent、凭据存 vault、出站注入,容器读不到密钥。
- 工具输出当不可信数据。 server 返回内容会进上下文被当"观察",防 prompt 注入(见 安全与防护)。
权衡与失败模式
- 把 MCP 和 Skills 混为一谈:以为二选一 → 它们是可组合两层,方法层(Skill)调能力层(MCP/工具)。
- 该用 prompt 却写了 skill:只在这一轮要的临时指令过度工程 → 一次性需求用 prompt。
- server 凭据硬编码进配置/agent:泄露风险 → 走 vault,出站注入。
- 信了工具输出里的"指令":网页/issue 藏"忽略此前指令"劫持 agent → 工具输出当数据,危险动作走 human-in-the-loop。
- 本地 stdio server 当远程接:传输用错 → 本地 stdio(子进程)、远程 Streamable HTTP,别混。
参考
- 协议规范: modelcontextprotocol.io(JSON-RPC、传输、原语定义,以官方为准)
- Anthropic 文档: MCP Connector(
mcp_servers+mcp_toolset)、Agent Skills、Managed Agents Vaults(platform.claude.com) - 前沿模型: Qwen-AgentWorld-35B-A3B(把 MCP tool calling 列为模拟域之一)
Keywords: MCP, Model Context Protocol, client-server, JSON-RPC, stdio, Streamable HTTP, SSE, tools, resources, prompts, mcp_toolset, mcp_servers, vault, prompt injection, M×N, USB-C for tools, context7, code-review-graph, Skills, SKILL.md, Agent Skills, progressive disclosure, 能力 vs 方法