---
title: MCP 与 Skills
url: https://doc.liz6.com/ai/02-Agent/02-mcp-and-skills
locale: zh
area: ai
tags:
- ai
- Agent
date: 2026-06-30
modified: 2026-07-16
description: MCP 接入能力(工具、数据、外部系统),Skills 注入方法(工作流、最佳实践、领域知识)。一个是手脚的延伸,一个是经验的注入——两者同用渐进式披露,却是可组合的两层。
---

# MCP 与 Skills

> MCP 接入能力(工具、数据、外部系统),Skills 注入方法(工作流、最佳实践、领域知识)。一个是手脚的延伸,一个是经验的注入——两者同用渐进式披露,却是可组合的两层。

## 概述

[Agent 循环](/ai/02-Agent/01-the-agent-loop-and-tool-use.md) 解决了"模型怎么用工具",这篇解决"怎么给 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**。

```mermaid
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 架构

```mermaid
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:

```jsonc
{
  "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`):

```python
client.beta.messages.create(
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{"type": "url", "name": "my-tools", "url": "https://.../mcp"}],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "my-tools"}],
    ...,
)
```

在 **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)**——不把全部内容塞进上下文,而是分层加载:

```mermaid
flowchart TD
    A["① name + description<br/>(常驻上下文, 极小)"] -->|模型判断任务相关| B["② SKILL.md 正文<br/>(按需读入: 工作流/规则)"]
    B -->|需要时| C["③ 引用的文件 / 脚本<br/>(用到才加载)"]
```

```markdown
---
name: pptx
description: 当需要创建或编辑 PowerPoint 演示文稿时使用。
---

# 制作演示文稿的流程
1. 先规划大纲...
2. 用 python-pptx 生成...
（更多步骤、模板、脚本引用）
```

只有那行 `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 暴露的工具。

```mermaid
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](https://huggingface.co/Qwen/Qwen-AgentWorld-35B-A3B) 在它模拟的七类 agent 环境里,**第一类就是 "tool calling (MCP)"**——连一个非 Anthropic 的前沿模型,都把"通过 MCP 调工具"当作 agent 的标准交互范式来训练和模拟。MCP 正在成为 agent 接触世界的通用接口。详见 [Agent 循环与工具使用](/ai/02-Agent/01-the-agent-loop-and-tool-use.md) 的前沿小节。

## 最佳实践

- **分清两层再扩展。** 缺能力(连外部系统)上 MCP,缺方法(重复 know-how)写 Skill;别用一个解决另一个的问题。
- **复用价值高才沉淀。** 跨对话反复用到才写 server / 写 skill;用一次的临时指令用 prompt 就够。
- **靠渐进式披露控上下文。** Skill 只让 `description` 常驻、正文按需读;工具多了用 tool search 按需加载 schema——几十个也不撑爆。
- **不信任的 server 要沙箱 + 最小权限。** server 带着权限运行,等于把权限交给模型决策。
- **凭据走 vault,别硬编码。** Managed Agents 把 server 声明(不带凭据)放 agent、凭据存 vault、出站注入,容器读不到密钥。
- **工具输出当不可信数据。** server 返回内容会进上下文被当"观察",防 prompt 注入(见 [安全与防护](/ai/03-applications-and-production/04-security-and-protection.md))。

## 权衡与失败模式

- **把 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](https://huggingface.co/Qwen/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 方法*
