MCP 是什么:协议原理与工具调用模型
MCP(Model Context Protocol)是 Anthropic 于 2024 年底开源的标准化工具调用协议。它解决了一个长期存在的痛点:AI 模型如何以统一的方式调用外部工具,而不是每个平台各自实现一套私有接口。
为什么需要 MCP
在 MCP 出现之前,AI 工具调用的生态极度碎片化:
- ChatGPT Plugins 有自己的接入规范
- OpenAI Function Calling 是另一套 JSON Schema 格式
- 各家 Agent 框架(LangChain、AutoGPT 等)各自定义工具接口
- 同一个工具(比如文件读取)需要为每个平台单独适配
MCP 的核心目标是一次实现,处处可用:工具开发者只需写一个符合 MCP 规范的 Server,所有兼容 MCP 的客户端(Claude Desktop、Cursor、Cline 等)都能直接调用。
graph LR
A[Claude Desktop] --> P[MCP 协议层]
B[Cursor] --> P
C[Cline / Continue] --> P
P --> S1[文件系统 MCP Server]
P --> S2[浏览器控制 MCP Server]
P --> S3[数据库 MCP Server]
P --> S4[自定义 MCP Server]
style P fill:#4A90D9,color:#fff
style S1 fill:#27AE60,color:#fff
style S2 fill:#27AE60,color:#fff
style S3 fill:#27AE60,color:#fff
style S4 fill:#E67E22,color:#fff
MCP 的三层架构
MCP 把工具调用拆分为三个角色:
| 角色 | 英文 | 职责 |
|---|---|---|
| Host(宿主) | MCP Host | 运行 LLM 的应用,如 Claude Desktop、Cursor |
| Client(客户端) | MCP Client | 协议连接层,嵌入在 Host 内部,负责与 Server 通信 |
| Server(服务器) | MCP Server | 暴露具体工具的进程,可以是本地进程或远程服务 |
sequenceDiagram
participant U as 用户
participant H as Host (Claude Desktop)
participant C as MCP Client
participant S as MCP Server (文件系统)
U->>H: "帮我总结 ~/reports 目录下所有 PDF"
H->>C: 判断需要工具调用,发送工具请求
C->>S: list_directory(path="~/reports")
S-->>C: ["report_q1.pdf", "report_q2.pdf"]
C->>S: read_file(path="~/reports/report_q1.pdf")
S-->>C: 文件内容(文本)
C-->>H: 工具调用结果
H-->>U: 基于文件内容的总结
MCP 的通信协议
MCP 使用 JSON-RPC 2.0 作为消息格式,通过以下两种传输方式通信:
方式一:stdio(标准输入输出)
适合本地 MCP Server:Host 启动一个子进程,通过 stdin/stdout 交换 JSON 消息。
// 客户端 → 服务端:列出可用工具
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
// 服务端 → 客户端:返回工具列表
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "read_file",
"description": "读取指定路径的文件内容",
"inputSchema": {
"type": "object",
"properties": {
"path": { "type": "string", "description": "文件的绝对路径" }
},
"required": ["path"]
}
}
]
}
}
方式二:SSE(Server-Sent Events)
适合远程 MCP Server:通过 HTTP + SSE 实现双向通信,支持多客户端连接同一 Server。
MCP 的四类能力
MCP Server 可以向 Client 暴露四类能力,理解这四类是选型的基础:
| 能力类型 | 说明 | 典型场景 |
|---|---|---|
| Tools(工具) | 可执行的函数,有副作用 | 读文件、写数据库、发 API 请求 |
| Resources(资源) | 只读数据源,类似文件系统 | 暴露配置文件、知识库文档 |
| Prompts(提示模板) | 预定义的提示词模板 | 标准化的任务指令格式 |
| Sampling(采样) | Server 可以请求 LLM 生成内容 | 复杂的嵌套 Agent 场景 |
日常使用最重要的是 Tools——本书 90% 的内容围绕如何配置和构建 Tools 展开。
一个完整的工具调用流程
graph TD
A[用户发送消息] --> B[Host 将消息发给 LLM]
B --> C{LLM 决策:
是否需要工具?} C -- 否 --> D[直接生成回复] C -- 是 --> E[生成工具调用请求
tool_name + arguments] E --> F[MCP Client 路由到对应 Server] F --> G[Server 执行工具逻辑] G --> H[返回 tool_result] H --> B D --> I[展示给用户] style C fill:#F39C12,color:#fff style E fill:#4A90D9,color:#fff style G fill:#27AE60,color:#fff
是否需要工具?} C -- 否 --> D[直接生成回复] C -- 是 --> E[生成工具调用请求
tool_name + arguments] E --> F[MCP Client 路由到对应 Server] F --> G[Server 执行工具逻辑] G --> H[返回 tool_result] H --> B D --> I[展示给用户] style C fill:#F39C12,color:#fff style E fill:#4A90D9,color:#fff style G fill:#27AE60,color:#fff
关键点:工具调用结果会重新送入 LLM,LLM 再根据结果决定是否继续调用工具或生成最终回复。这就是为什么复杂任务会出现多轮工具调用。
常见误区
- 误区一:MCP Server 就是 HTTP API。MCP Server 是一个本地进程(stdio 模式),不是 Web 服务,不需要暴露公网端口。
- 误区二:每次对话都重新启动 MCP Server。Server 在 Host 启动时一次性启动,整个会话期间保持运行。
- 误区三:LLM 直接访问工具。实际上是 Host/Client 层代理了工具调用,LLM 只看到工具的输入输出,不直接执行代码。
本节执行清单
- [ ] 理解 MCP 的 Host / Client / Server 三层架构
- [ ] 明确 Tools / Resources / Prompts / Sampling 四类能力的区别
- [ ] 知道 stdio 和 SSE 两种传输方式各自的适用场景