MCP 协议详解(Model Context Protocol)
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年底推出的开放标准协议,旨在为大语言模型(LLM)与外部数据源、工具之间建立统一的通信接口。MCP 被比喻为"AI 世界的 USB-C 接口"——一个协议连接所有工具和数据源。本章深入讲解 …
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年底推出的开放标准协议,旨在为大语言模型(LLM)与外部数据源、工具之间建立统一的通信接口。MCP 被比喻为"AI 世界的 USB-C 接口"——一个协议连接所有工具和数据源。本章深入讲解 …
建议先完成第 05 章
MCP 诞生的背景、MCP 架构、协议规范
连接协议 · MCP 与 Agent 生态
文章导航
点击图中节点可定位到对应正文。
引言
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年底推出的开放标准协议,旨在为大语言模型(LLM)与外部数据源、工具之间建立统一的通信接口。MCP 被比喻为"AI 世界的 USB-C 接口"——一个协议连接所有工具和数据源。本章深入讲解 MCP 的架构、协议规范和工作原理。
1. MCP 诞生的背景
1.1 MCP 之前的痛点
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
传统方式(M×N 问题):
AI 应用 A → 自定义集成 → 工具 1
AI 应用 A → 自定义集成 → 工具 2
AI 应用 A → 自定义集成 → 工具 3
AI 应用 B → 自定义集成 → 工具 1
AI 应用 B → 自定义集成 → 工具 2
... M 个应用 × N 个工具 = M×N 个集成根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
MCP 方式(M+N 问题):
AI 应用 A ─┐ ┌─ 工具 1
AI 应用 B ──┤── MCP 协议 ──────┤── 工具 2
AI 应用 C ─┘ └─ 工具 3
每个应用实现一次 MCP 客户端
每个工具实现一次 MCP 服务端
总共 M+N 个集成1.2 与 Function Calling 的关系
| 对比维度 | Function Calling | MCP |
|---|---|---|
| 定位 | 模型层面的工具调用能力 | 应用层面的通信协议标准 |
| 范围 | 单次 LLM 调用中的工具使用 | 完整的客户端-服务端架构 |
| 标准化 | 每个模型厂商各自定义 | 统一的开放标准 |
| 资源访问 | 不支持(只能调用函数) | 支持资源和提示词模板 |
| 传输方式 | HTTP 请求内嵌 | JSON-RPC 2.0 / stdio |
| 生态 | 模型绑定 | 跨模型、跨应用 |
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
关系:
用户请求 → AI 应用 → LLM 决策(Function Calling 选择工具)→ MCP 协议执行工具调用
MCP 是 Function Calling 的下游执行层2. MCP 架构
2.1 三层架构
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌───────────────────────────────────────────────────────┐
│ MCP Host(宿主) │
│ 如 Claude Desktop、IDE、AI 应用 │
│ 负责用户交互和 LLM 调用 │
└────────────────────┬──────────────────────────────────┘
│ 管理多个 MCP Client 实例
↓
┌───────────────────────────────────────────────────────┐
│ MCP Client(客户端) │
│ 每个 Client 与一个 Server 保持 1:1 会话 │
│ 负责协议协商、消息收发、安全策略 │
└────────────────────┬──────────────────────────────────┘
│ JSON-RPC 2.0
↓
┌───────────────────────────────────────────────────────┐
│ MCP Server(服务端) │
│ 暴露 Tools / Resources / Prompts 给 Client │
│ 负责实际的工具执行和数据访问 │
└───────────────────────────────────────────────────────┘2.2 核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| Host | 用户直接使用的应用 | Claude Desktop、Cursor |
| Client | Host 内的协议客户端 | 每个 Server 对应一个 Client |
| Server | 提供工具/资源的服务 | GitHub MCP Server、DB Server |
| Tools | 可被 LLM 调用的函数 | 搜索、发邮件、查数据库 |
| Resources | 可被读取的数据源 | 文件、数据库记录、API 响应 |
| Prompts | 预定义的提示词模板 | "代码审查模板"、"周报模板" |
3. 协议规范
3.1 传输层
MCP 支持两种传输方式:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌────────┐ stdin → ┌────────┐
│ Host │ │ Server │
│ (父进程)│ ← stdout │ (子进程)│
└────────┘ └────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌────────┐ POST /mcp ┌────────┐
│ Client │ ──────────→ │ Server │
│ │ ← SSE ───── │ (远程) │
└────────┘ └────────┘3.2 消息格式(JSON-RPC 2.0)
// 请求
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_github",
"arguments": {
"query": "MCP protocol",
"language": "python"
}
}
}
// 成功响应
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "找到 3 个相关仓库:..."
}
]
}
}
// 错误响应
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid arguments: 'query' is required"
}
}
// 通知(无 id,不需要响应)
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}3.3 生命周期
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Client Server
│ │
│──── initialize ────────────→│ 协商协议版本和能力
│←─── initialize response ───│
│──── initialized ───────────→│ 确认初始化完成
│ │
│════ 正常通信阶段 ════════════│ 工具调用、资源读取等
│──── tools/list ────────────→│
│←─── tools list response ───│
│──── tools/call ────────────→│
│←─── tools call response ───│
│ │
│──── ping ──────────────────→│ 保活检测
│←─── pong ──────────────────│
│ │
│──── shutdown ──────────────→│ 关闭连接
│ │4. MCP 的三大能力
4.1 Tools(工具)
Server 暴露可被 LLM 调用的函数:
// tools/list 返回
{
"tools": [
{
"name": "query_database",
"description": "执行 SQL 查询并返回结果",
"inputSchema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL 查询语句"
},
"database": {
"type": "string",
"enum": ["production", "analytics"]
}
},
"required": ["sql"]
}
}
]
}
// tools/call 请求
{
"method": "tools/call",
"params": {
"name": "query_database",
"arguments": {
"sql": "SELECT * FROM users LIMIT 10",
"database": "analytics"
}
}
}
// tools/call 响应
{
"result": {
"content": [
{"type": "text", "text": "查询结果: ..."},
{"type": "image", "data": "base64...", "mimeType": "image/png"}
],
"isError": false
}
}4.2 Resources(资源)
Server 暴露可被读取的数据源,类似 REST 的 GET:
// resources/list 返回
{
"resources": [
{
"uri": "file:///project/src/main.py",
"name": "main.py",
"mimeType": "text/x-python",
"description": "项目入口文件"
},
{
"uri": "db://analytics/sales_summary",
"name": "销售汇总数据",
"mimeType": "application/json"
}
]
}
// resources/read 请求
{
"method": "resources/read",
"params": {
"uri": "file:///project/src/main.py"
}
}
// 资源模板(动态资源)
{
"resourceTemplates": [
{
"uriTemplate": "db://analytics/{table_name}",
"name": "数据库表数据",
"description": "读取指定数据库表的内容"
}
]
}4.3 Prompts(提示词模板)
Server 提供预定义的提示词模板:
// prompts/list 返回
{
"prompts": [
{
"name": "code_review",
"description": "代码审查提示词模板",
"arguments": [
{
"name": "language",
"description": "编程语言",
"required": true
},
{
"name": "code",
"description": "要审查的代码",
"required": true
}
]
}
]
}
// prompts/get 请求
{
"method": "prompts/get",
"params": {
"name": "code_review",
"arguments": {
"language": "Python",
"code": "def hello(): pass"
}
}
}
// prompts/get 响应
{
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "请审查以下 Python 代码的质量和安全性:\n```python\ndef hello(): pass\n```"
}
}
]
}5. 安全模型
5.1 安全原则
1. 最小权限原则
Server 只暴露必要的工具和资源
客户端只能访问被授权的能力
2. 用户确认机制
高风险工具调用需要用户显式确认
如:删除文件、发送邮件、修改数据库
3. 沙箱隔离
文件系统访问限制在指定目录
代码执行在隔离容器中
网络访问受白名单控制
4. 能力协商
初始化时 Client 和 Server 协商各自支持的能力
不支持的能力不会被调用5.2 权限控制示例
{
"serverInfo": {
"name": "filesystem-server",
"version": "1.0.0"
},
"capabilities": {
"tools": {
"listChanged": true
},
"resources": {
"subscribe": true,
"listChanged": true
}
}
}6. MCP 生态系统
6.1 官方 MCP Server
| Server | 能力 | 状态 |
|---|---|---|
| Filesystem | 文件读写、目录操作 | 官方支持 |
| GitHub | 仓库管理、Issue、PR | 官方支持 |
| PostgreSQL | 数据库查询、Schema | 官方支持 |
| Google Drive | 文件搜索、读取 | 官方支持 |
| Slack | 消息发送、频道管理 | 官方支持 |
| Brave Search | 网页搜索 | 官方支持 |
| Memory | 知识图谱存储和检索 | 官方支持 |
| Fetch | HTTP 请求、网页抓取 | 官方支持 |
6.2 社区 MCP Server
| Server | 能力 |
|---|---|
| Docker | 容器管理和操作 |
| Kubernetes | K8s 集群管理 |
| Redis | 缓存操作 |
| MongoDB | NoSQL 数据库操作 |
| Notion | 笔记和知识库管理 |
| Linear | 项目管理 |
| Figma | 设计稿读取 |
7. 本章小结
| 维度 | 要点 |
|---|---|
| 定位 | AI 应用与工具之间的统一通信协议 |
| 架构 | Host → Client → Server 三层架构 |
| 传输 | stdio(本地)+ HTTP+SSE(远程) |
| 三大能力 | Tools(工具调用)、Resources(数据访问)、Prompts(提示模板) |
| 协议 | JSON-RPC 2.0 |
| 核心价值 | 解决 M×N 集成问题,一次实现处处可用 |
相关章节
- 工具调用(Function Calling) — 工具调用基础,MCP 是其下游执行层
- 工具使用(Tool Use) — Agent 如何调用与编排工具
- MCP Server 开发实战 — 动手实现一个 MCP Server
- Agent 生态系统全景 — MCP 所处的更大生态版图
延伸阅读
- Anthropic (2024). "Introducing the Model Context Protocol". anthropic.com/news
- MCP Specification: modelcontextprotocol.io/specification
- MCP SDK: github.com/modelcontextprotocol