MCP 架构深度解析
本章提供 MCP 架构的权威指南,涵盖协议层、参与者交互及高级原语,详细程度对标官方规范。
1. 核心模型
MCP 采用客户端-服务器 (Client-Server) 架构,其设计哲学是将“智能”留在 Host 端,而将“能力”分布在各个 Server 中。
参与者定义
- Host (宿主):AI 应用(如 Claude Desktop, IDE)。它负责协调多个 MCP 连接。
- Client (客户端):Host 内部负责维护与特定服务器通信的桥梁。
- Server (服务器):提供具体功能(Tools, Resources, Prompts)的程序。
2. 协议分层
MCP 分为两个核心层:
数据层 (Data Layer)
基于 JSON-RPC 2.0。定义了消息类型:
- Requests (请求):预期有响应的交互(带
id)。 - Responses (响应):对请求的回复。
- Notifications (通知):单向消息(不带
id),如资源更新提醒。
传输层 (Transport Layer)
管理实际的物理通信:
- Stdio 传输:
- 机制:通过标准输入/输出流通信。
- 分帧 (Framing):必须以换行符 (\n) 分隔,JSON 消息内部严禁包含换行。
- 日志:服务器必须使用 stderr 输出日志,stdout 严禁输出非 JSON 数据。
- HTTP with SSE 传输:
- 机制:HTTP POST 发送消息,SSE 接收服务器响应。
- 安全性:服务器必须验证
Origin标头以防止 DNS 重绑定攻击(非法 Origin 返回 403)。 - 会话管理:通过
MCP-Session-Id标头保持会话连续性。
3. 生命周期管理 (Lifecycle)
连接的建立必须遵循严格的握手协议,以确保能力兼容。
4. 高级能力 (Advanced Capabilities)
除了基础的工具和资源,MCP 还定义了以下高级特性:
采样 (Sampling)
允许服务器向宿主请求 AI 补全。这意味着 Server 可以“借用”宿主的 LLM 来处理逻辑。
- 方法:
sampling/createMessage
互动启发 (Elicitation)
允许服务器通过宿主向用户请求额外输入。
- 方法:
elicitation/requestInput
根目录列表 (Roots)
允许客户端告知服务器哪些目录是“工作区根目录”,这在 IDE 集成中至关重要。
- 方法:
roots/list
任务与进度 (Tasks & Progress)
- Progress: 服务器可以针对耗时请求发送
notifications/progress报告进度。 - Tasks (实验性): 支持异步任务的持久化跟踪。
5. 安全机制 (Security)
MCP 建立在“不信任”原则之上:
- 沙箱化:建议 Server 运行在受限环境下。
- 人类在回路 (Human-in-the-loop):
- 宿主在执行破坏性 (Destructive) 操作前必须请求用户确认。
- 宿主应展示工具调用的详细参数。
- 身份核验:
- Stdio 下依赖本地权限。
- HTTP 下推荐使用 OAuth 2.0 流量,并强制验证
state参数防止拦截攻击。
6. 标准资源定义示例
{
"method": "resources/read",
"params": { "uri": "file:///logs/main.log" },
"id": "123"
}
响应:
{
"jsonrpc": "2.0",
"id": "123",
"result": {
"contents": [{
"uri": "file:///logs/main.log",
"mimeType": "text/plain",
"text": "Server started at..."
}]
}
}
小结
MCP 架构的核心在于标准化能力暴露与精密的生命周期握手。这种设计使得 AI 助手可以像操作浏览器扩展一样,无缝地、安全地调动分布在不同环境下的各种复杂工具。