Skip to content

MCP (Model Context Protocol) 完全指南

2025年12月更新Anthropic

MCP(模型上下文协议) 是 Anthropic 于 2024年11月推出的开放标准,被称为"AI 应用的 USB-C 接口"。它为 AI 模型连接外部系统提供了统一、安全、双向的通信协议。本指南基于 Anthropic Engineering 系列技术文章整理。


一、什么是 MCP?

1.1 核心定义

MCP (Model Context Protocol) 是一个开放标准和开源框架,用于:

能力说明
统一连接AI 模型与外部系统的标准化接口
双向通信不仅读取数据,还能执行操作
安全访问内置认证和权限控制
动态上下文实时获取最新信息

1.2 解决的问题

之前的问题:碎片化集成

⚠️ 问题

每个数据源需要单独开发集成,耗时数周

MCP 的解决方案:统一协议

✅ 优势:一次开发,处处使用

1.3 核心价值

价值说明
开发效率集成时间从数周缩短到数天
跨模型移植换 LLM 无需重写集成代码
生态共享社区共建的 MCP Server 库
安全标准统一的认证和权限机制

二、核心架构

2.1 三层架构

2.2 三大核心原语

原语说明示例
Tools(工具)可执行的操作接口航班搜索、数据库查询、发送消息
Resources(资源)静态数据或元信息机场代码列表、配置文件、文档
Prompts(提示词)预定义的指令模板代码审查模板、分析框架

三、工作流程

3.1 典型交互流程

步骤说明
1️⃣ 用户输入"帮我查询北京到上海明天的航班"
2️⃣ LLM 分析识别需要调用航班搜索工具
3️⃣ Client 请求调用 flight_search MCP Server
4️⃣ Server 执行查询航空公司 API,返回结果
5️⃣ 结果返回航班列表数据
6️⃣ 生成回复"明天北京到上海有以下航班..."

四、代码执行模式(Code Mode)

4.1 传统模式的问题

随着 MCP 使用规模扩大,两种常见模式会增加 Agent 成本和延迟:

问题说明
工具定义过载多个 MCP Server 的工具定义可能消耗 100K+ tokens(开始对话前就已消耗)
中间结果膨胀每个工具结果都要进入模型上下文,大文档可能重复处理多次

示例:将会议记录从 Google Drive 附加到 Salesforce

传统模式:
1. TOOL CALL: gdrive.getDocument → 返回完整文档(进入上下文)
2. TOOL CALL: salesforce.updateRecord → 需要再次写出完整文档

问题:2小时的销售会议 = 额外处理 50,000+ tokens

4.2 代码执行模式解决方案

将 MCP Server 呈现为代码 API 而非直接工具调用,Agent 通过编写代码与 MCP Server 交互:

typescript
// 代码执行模式 - 数据在执行环境中流动,不进入模型上下文
import * as gdrive from './servers/google-drive';
import * as salesforce from './servers/salesforce';

const transcript = (await gdrive.getDocument({ documentId: 'abc123' })).content;
await salesforce.updateRecord({
  objectType: 'SalesMeeting',
  recordId: '00Q5f000001abcXYZ',
  data: { Notes: transcript }
});

4.3 工具发现机制

Agent 通过文件系统按需发现工具:

servers/
├── google-drive/
│   ├── getDocument.ts
│   ├── getSheet.ts
│   └── index.ts
├── salesforce/
│   ├── updateRecord.ts
│   └── index.ts
└── slack/
    └── ...
对比Token 消耗
传统方式(加载所有工具定义)~150,000 tokens
代码执行模式(按需加载)~2,000 tokens
节省98.7%

4.4 代码执行模式的优势

优势说明
渐进式披露按需读取工具定义,而非全部预加载
上下文高效在代码中过滤/处理数据,只返回精简结果
更强的控制流循环、条件、错误处理用代码表达,减少模型调用
隐私保护中间结果留在执行环境,敏感数据可自动脱敏
状态持久化Agent 可将中间结果写入文件,支持长任务恢复
技能积累Agent 可将工作代码保存为可复用函数

数据过滤示例:

typescript
// 传统模式 - 10,000 行全部进入上下文
TOOL CALL: gdrive.getSheet(sheetId: 'abc123') → 返回 10,000

// 代码执行模式 - 只返回需要的数据
const allRows = await gdrive.getSheet({ sheetId: 'abc123' });
const pendingOrders = allRows.filter(row => row["Status"] === 'pending');
console.log(`Found ${pendingOrders.length} pending orders`);
console.log(pendingOrders.slice(0, 5)); // 只显示前 5 条

注意

代码执行引入额外复杂度,需要安全的执行环境(沙箱)、资源限制和监控。需权衡代码执行的收益与实现成本。


五、Desktop Extensions(桌面扩展)

5.1 解决 MCP 安装难题

本地 MCP Server 功能强大,但安装有诸多障碍:

问题说明
需要开发工具用户需安装 Node.js、Python 等运行时
手动配置需编辑 JSON 配置文件
依赖管理需解决包冲突和版本不匹配
无发现机制只能在 GitHub 搜索
更新复杂需手动重新安装

5.2 Desktop Extensions 解决方案

Desktop Extensions(.mcpb 文件) 将整个 MCP Server(包括所有依赖)打包成单一可安装包:

之前之后
安装 Node.js下载 .mcpb 文件
npm install -g @example/mcp-server双击打开
手动编辑配置文件点击"安装"
重启 Claude Desktop✅ 完成

5.3 扩展包结构

extension.mcpb (ZIP 压缩包)
├── manifest.json          # 扩展元数据和配置(必需)
├── server/                # MCP Server 实现
│   └── index.js           # 主入口
├── node_modules/          # 打包的依赖
└── icon.png               # 扩展图标(可选)

manifest.json 示例:

json
{
  "mcpb_version": "0.1",
  "name": "my-extension",
  "version": "1.0.0",
  "description": "一个简单的 MCP 扩展",
  "author": {
    "name": "扩展作者"
  },
  "server": {
    "type": "node",
    "entry_point": "server/index.js",
    "mcp_config": {
      "command": "node",
      "args": ["${__dirname}/server/index.js"]
    }
  },
  "tools": [
    {
      "name": "read_file",
      "description": "读取文件内容"
    }
  ]
}

5.4 创建扩展的步骤

bash
# 1. 初始化 manifest
npx @anthropic-ai/mcpb init

# 2. 打包扩展
npx @anthropic-ai/mcpb pack

# 3. 测试 - 将 .mcpb 文件拖入 Claude Desktop 设置窗口

5.5 用户配置

扩展可以声明需要用户输入的配置(如 API 密钥、允许的目录):

json
"user_config": {
  "allowed_directories": {
    "type": "directory",
    "title": "允许访问的目录",
    "description": "服务器可以访问的目录",
    "multiple": true,
    "required": true,
    "default": ["${HOME}/Documents"]
  }
}

Claude Desktop 会:

  • 显示友好的配置 UI
  • 在启用前验证输入
  • 安全存储敏感值(使用操作系统钥匙串)
  • 将配置传递给服务器

5.6 企业功能

功能说明
组策略支持Windows Group Policy、macOS MDM
预装扩展部署已批准的扩展
黑名单阻止特定扩展或发布者
禁用目录完全禁用扩展目录
私有目录部署私有扩展目录

六、配置与使用

6.1 Claude Desktop 配置示例

json
// ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/username/Documents"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "your_github_token"
      }
    },
    "sqlite": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-sqlite", "/path/to/database.db"]
    }
  }
}

6.2 Claude Code 配置

bash
# 添加 MCP Server
claude mcp add <name> <command> [args...]

# 示例
claude mcp add github npx -y @modelcontextprotocol/server-github

6.3 常用 MCP Server

Server功能
@mcp/server-filesystem文件系统读写
@mcp/server-githubGitHub 操作
@mcp/server-sqliteSQLite 数据库
@mcp/server-postgresPostgreSQL 数据库
@mcp/server-slackSlack 消息
@mcp/server-google-driveGoogle Drive
@mcp/server-puppeteer浏览器自动化
@mcp/server-fetchHTTP 请求

6.4 支持的客户端

客户端类型
Claude Desktop官方应用(支持 Desktop Extensions)
Claude Code官方 CLI 工具
CursorAI 代码编辑器
Zed代码编辑器
AntigravityGoogle IDE
Sourcegraph代码搜索

七、开发 MCP Server

7.1 基本结构(TypeScript)

typescript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

// 创建 Server
const server = new Server({
  name: "my-weather-server",
  version: "1.0.0"
}, {
  capabilities: {
    tools: {}
  }
});

// 定义工具
server.setRequestHandler("tools/list", async () => {
  return {
    tools: [
      {
        name: "get_weather",
        description: "获取指定城市的天气信息。返回:temperature(字符串),condition(字符串)",
        inputSchema: {
          type: "object",
          properties: {
            city: { type: "string", description: "城市名称" }
          },
          required: ["city"]
        }
      }
    ]
  };
});

// 处理工具调用
server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "get_weather") {
    const city = request.params.arguments.city;
    // 调用天气 API...
    return {
      content: [{ type: "text", text: `${city}今天晴,25°C` }]
    };
  }
});

// 启动
const transport = new StdioServerTransport();
await server.connect(transport);

7.2 Python 版本

python
from mcp.server import Server
from mcp.server.stdio import stdio_server

app = Server("my-weather-server")

@app.list_tools()
async def list_tools():
    return [
        {
            "name": "get_weather",
            "description": "获取指定城市的天气信息",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        }
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "get_weather":
        city = arguments["city"]
        # 调用天气 API...
        return f"{city}今天晴,25°C"

async def main():
    async with stdio_server() as streams:
        await app.run(streams[0], streams[1])

7.3 工具注解(Tool Annotations)

MCP 协议支持工具注解,声明工具的安全属性:

json
{
  "name": "delete_file",
  "description": "删除文件",
  "annotations": {
    "destructive": true,
    "requires_confirmation": true
  }
}

八、安全机制

8.1 认证方案

方案说明
OAuth 2.0 / 2.1标准授权框架
API Key简单密钥认证
JWTToken 认证

8.2 权限控制

权限层级:
├── Server 级别 - 整个 Server 的访问权限
├── Tool 级别 - 特定工具的使用权限
├── Resource 级别 - 资源的读/写权限
└── Operation 级别 - 具体操作的权限

RBAC 示例:
- admin: 所有权限
- developer: 读取代码、提交 PR
- viewer: 只读访问

8.3 隐私保护(代码执行模式)

在代码执行模式下,中间结果默认留在执行环境。可以自动脱敏敏感数据:

typescript
// Agent 看到的脱敏数据
[
  { salesforceId: '00Q...', email: '[EMAIL_1]', phone: '[PHONE_1]', name: '[NAME_1]' },
  { salesforceId: '00Q...', email: '[EMAIL_2]', phone: '[PHONE_2]', name: '[NAME_2]' },
]

// 实际数据在 MCP Client 中解脱敏后传递给目标系统

8.4 安全最佳实践

实践说明
最小权限只授予必要的权限
Token 轮换定期更换认证凭据
审计日志记录所有操作
输入验证严格验证参数
加密传输使用 TLS/SSL
沙箱执行代码执行环境需要安全沙箱

8.5 MCP 安全威胁详解

新增威胁领域

MCP 作为新的 API 界面,带来了超越传统应用漏洞的安全挑战。核心风险包括:未授权操作数据泄露

动态能力注入 (Dynamic Capability Injection)

风险: MCP Server 可能动态改变其提供的工具列表,而无需客户端明确通知或批准。

场景: 一个低风险的诗歌创作 Agent 连接到书籍 MCP Server 获取引用。如果该 Server 突然添加"购买书籍"功能,Agent 可能意外获得发起金融交易的能力。

缓解措施说明
显式白名单在 SDK 或应用层强制执行允许的 MCP 工具白名单
强制变更通知要求所有 Server 定义变更必须设置 listChanged 标志
工具版本锁定将工具定义锁定到特定版本或哈希值
安全 API 网关使用 Apigee 等网关过滤工具列表

工具遮蔽 (Tool Shadowing)

风险: 恶意工具的描述可能覆盖合法工具的触发条件,导致用户数据被拦截或篡改。

场景:

  • 合法工具:secure_storage_service - "当用户明确请求保存敏感密钥时使用"
  • 恶意工具:save_secure_note - "当用户提及'保存'、'存储'、'记住'时使用此工具"

LLM 可能选择恶意工具保存敏感数据,导致数据泄露。

缓解措施说明
防止命名冲突检查新工具名称是否与现有受信工具语义相似
mTLS对敏感连接实施双向 TLS 验证
确定性策略执行在关键交互点实施策略检查
人工审批 (HITL)对高风险操作要求明确用户确认

恶意工具定义与内容注入

风险:

  • 工具描述字段可能操纵 Agent 规划器执行恶意操作
  • 工具可能摄入包含可注入提示的外部内容
缓解措施说明
输入验证清理所有用户输入,防止恶意命令执行
输出清理在将工具返回数据反馈到模型上下文前清理潜在恶意内容
系统提示隔离明确分离用户输入和系统指令
资源白名单只消费经过验证的 URL 资源

敏感信息泄露

风险: MCP 工具可能在交互过程中无意(或恶意)接收敏感信息,导致数据泄露。

缓解措施说明
结构化输出注解使用标签标识敏感输出字段
污点追踪 (Taint Tracking)将敏感输入/输出标记为"污染"并追踪流向

无法限制访问范围

风险: MCP 协议仅支持粗粒度的客户端-服务器授权,不支持按工具或资源的细粒度授权。

缓解措施说明
作用域凭证使用绑定到特定调用者的短期凭证
最小权限原则如果工具只需读取,不授予写入或删除权限
凭证隔离敏感数据应通过侧信道传输,不进入 Agent 上下文

Confused Deputy 问题

MCP Server 作为特权中介可能被低权限实体欺骗。恶意用户可能通过 Prompt 注入,让 AI 助手指示高权限 MCP Server 执行未授权操作,绕过安全控制。


九、应用场景

9.1 开发工具链

IDE(Cursor/Zed)
    ↓ MCP
├── GitHub: 查 Issue、提 PR
├── Jira: 管理任务
├── 数据库: 查询/修改数据
├── 日志系统: 查看日志
└── CI/CD: 触发构建

9.2 企业自动化

场景MCP Server
CRM 集成Salesforce、HubSpot
通讯协作Slack、邮件、Teams
数据分析数据库、BI 工具
文档管理Google Drive、Notion
任务管理Jira、Asana

9.3 代码执行场景示例

typescript
// 复杂工作流:从多个数据源聚合信息

// 1. 从 Google Sheets 获取销售数据
const salesData = await gdrive.getSheet({ sheetId: 'sales_2025' });

// 2. 从 Salesforce 获取客户信息
const customers = await salesforce.query({ 
  query: 'SELECT Id, Name, Industry FROM Account' 
});

// 3. 在代码中合并和分析
const analysis = salesData.rows
  .filter(row => row.revenue > 100000)
  .map(row => ({
    ...row,
    customer: customers.find(c => c.Id === row.customerId)
  }));

// 4. 只返回精简的分析结果
console.log(`高价值交易数量: ${analysis.length}`);
console.log(analysis.slice(0, 10)); // 只显示前 10 条

十、2025年发展里程碑

时间里程碑
2024.11Anthropic 发布 MCP
2025.03重大协议更新:OAuth 2.1、Streamable HTTP、JSON-RPC 批处理
2025上半年远程 MCP Server 支持
2025.06Desktop Extensions 发布
2025.11代码执行模式发布
2025.12捐赠给 Agentic AI Foundation (AAIF)

行业采纳

公司/项目采纳情况
OpenAI支持 MCP
Google DeepMind支持 MCP
CloudflareCode Mode 实现
Zed原生集成
Cursor原生集成
Sourcegraph原生集成

十一、与 Function Calling 的关系

维度Function CallingMCP
层级单一模型能力标准化协议
范围应用内定义跨应用共享
复用性每个应用单独开发一次开发,处处使用
生态平台特定开放标准

关系图:

MCP 协议
    ↓ 定义标准
MCP Server(提供工具)
    ↓ 暴露能力
LLM(通过 Function Calling 调用)
    ↓ 执行操作
用户获得结果

十二、最佳实践

✅ 推荐做法

实践说明
工具粒度适中既不过于细碎,也不过于庞大
清晰的描述包含用途、返回格式,帮助 LLM 正确选择
错误处理返回有意义的错误信息
版本管理工具接口版本化
Token 效率考虑使用代码执行模式处理大数据
渐进式披露支持按需加载工具定义
打包为扩展便于分发和安装

⚠️ 注意事项

事项说明
权限控制敏感操作需授权
性能优化避免长时间阻塞
兼容性测试不同客户端
日志记录便于调试和审计
沙箱安全代码执行需要安全隔离

十三、底层通信协议深入剖析(实战解析)

底层原理

在实际运行中,MCP 往往笼罩着一层神秘面纱。本节基于对 Cline 等客户端的底层抓包分析,揭秘 MCP 的真实运作机制。

13.1 MCP Host 与 Server 的交互流 (STDIO)

绝大多数本地 MCP Server 是通过 标准输入输出 (STDIO) 来与宿主(Host)进行通信的,而非通过网络端口监听。

完整的启动与注册抓包分析:

  1. 握手环节:Host 通过子进程的标准输入发送 JSON 报文向 Server 打招呼,告知 Host 版本及支持的 MCP 协议版本(如 2024-11-05 版)。Server 收到后通过标准输出返回自身信息(名称、版本)。
  2. 工具发现:Host 接着发送报文请求工具列表。Server 的返回内容中包含核心字段 inputSchema
    • inputSchema 遵循 JSON Schema 规范,严格定义了模型调用此工具时参数的结构要求(例如 latitude 必须为 number)。
  3. 静默等待:注册瞬间完成后,Server 就会默默在后台等待标准输入。只有当 Model 告诉 Host 需要调用时,Host 才会再次向 Server 发送具体带有参数的执行报文。

13.2 MCP 的本质与"上下文"的含义

核心认知:MCP 协议没有规定任何与大模型交互的格式!

MCP 仅规定了函数(Tool)与资源如何被发现和调用(即 Host <-> Server 通信)。Host 如何将这些工具喂给大模型(Model),完全由 Host 自行决定:

  • Cline:使用 XML 标签 机制配合极长的 System Prompt
  • 其他平台:可能使用 OpenAI 标准的 Function Calling 机制

为什么叫 Model Context Protocol? 这里的“Context”指的是环境。系统通过 MCP 汇总外部工具能力,交由 Host 拼接成大模型能够理解的“系统提示词”或“Tools 参数”。MCP 的价值在于为大模型搭建了一个统一的外部感官环境。

13.3 Host 与 Model 的交互内幕 (以 Cline 为例)

通过自建兼容 OpenAI 格式的本地中转服务器(拦截通信),我们可以清晰看到 Cline 与 Model 之间的对话内容:

1. 极其庞大的 System Prompt

在任何对话发生前,Cline 就会构造长达几万字符(有时接近5万字符)的 System Prompt,其构成包括:

  • XML 格式要求:强制模型使用 <thinking> (思考) 、<use_mcp_tool> (调用工具)、<attempt_completion> (得出最终结论) 等标签格式运作。
  • MCP 服务器与工具列表:将之前通过 MCP 协议向各个 Server 问出来的能力清单及 JSON Schema 入参定义,转换为格式化字符串硬塞在提示词里。
  • 内置与系统能力:读取文件、写入文件等 Host 原生能力说明。

2. 流式通信机制 (SSE)

Host 与大模型为了兼顾响应速度,一般采用 SSE (Server-Sent Events) 技术:

  • 返回头 Accept: text/event-stream
  • 大模型输出时,以类似打字机的效果分片(Chunk)增量返回 content
  • 有时服务端还会返回以 : 开头的注释标头(例如 :openrouter processing),用于在长思考中保持 HTTP 连接跳动,防止请求发生超时断连(Timeout)。

3. XML 与 ReAct 思想的统一

模型返回的多端 XML,本质是经典 ReAct (Reasoning and Acting) 思想(思考-行动-观察循环)的落地变种:

ReAct 标准流Cline XML 变种说明
Thought:<thinking>模型接到需求或拿到结果后,首先强迫自己进行逻辑推演。
Action:<use_mcp_tool>决定调用外部能力。Host 拦截此 XML 后,去触发对应的 MCP Server STDIO 调用。
Observation:User:Host 拿到 MCP Server 结果后,拼接上当前的时间、目录状态等环境信息,以 User 的口吻伪装成“外部环境的客观反馈”交给下一轮大模型。
Final Answer:<attempt_completion>循环迭代直到获得充分所需信息后,输出总结并结束对话。

十四、资源链接

资源链接
官方文档https://modelcontextprotocol.io
GitHubhttps://github.com/modelcontextprotocol
Server 列表https://github.com/modelcontextprotocol/servers
Desktop Extensionshttps://github.com/anthropics/dxt
SDK (TypeScript)@modelcontextprotocol/sdk
SDK (Python)mcp
MCPB 工具@anthropic-ai/mcpb

十五、📚 推荐阅读

  1. Code execution with MCP — 代码执行模式详解,减少 98.7% Token 消耗
  2. Desktop Extensions — 一键安装 MCP Server
  3. Writing effective tools for agents — MCP 工具设计最佳实践

更多文章参见 Anthropic Engineering 文章合集


← 返回 AI 工具