跳到主要内容

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 建立在“不信任”原则之上:

  1. 沙箱化:建议 Server 运行在受限环境下。
  2. 人类在回路 (Human-in-the-loop)
    • 宿主在执行破坏性 (Destructive) 操作前必须请求用户确认。
    • 宿主应展示工具调用的详细参数。
  3. 身份核验
    • 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 助手可以像操作浏览器扩展一样,无缝地、安全地调动分布在不同环境下的各种复杂工具。