MCP 协议架构
问题
MCP 的三层架构(Host/Client/Server)是如何协作的?协议的生命周期是怎样的?
答案
一、三层架构详解
| 层级 | 职责 | 关键特性 |
|---|---|---|
| Host | 管理所有 Client,控制权限和安全 | Claude Desktop、VS Code、自建应用 |
| Client | 与 Server 1:1 通信 | 协议协商、能力发现、消息路由 |
| Server | 暴露 Tools/Resources/Prompts | 轻量进程,专注能力提供 |
二、协议生命周期
三、能力协商(Capabilities)
初始化时双方声明支持的能力:
// Client 能力
{
capabilities: {
roots: { listChanged: true }, // 支持根目录列表变更通知
sampling: {} // 支持 LLM 采样请求
}
}
// Server 能力
{
capabilities: {
tools: { listChanged: true }, // 提供工具,支持工具列表变更
resources: { subscribe: true }, // 提供资源,支持订阅
prompts: { listChanged: true }, // 提供 Prompt 模板
logging: {} // 支持日志
}
}
四、消息协议:JSON-RPC 2.0
MCP 基于 JSON-RPC 2.0,有三种消息类型:
// 1. Request(需要响应)
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "query_db",
"arguments": { "sql": "SELECT * FROM users LIMIT 10" }
}
}
// 2. Response(对 Request 的回复)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{ "type": "text", "text": "查询到 10 条记录..." }]
}
}
// 3. Notification(无需响应)
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}
五、安全模型
安全原则
- 用户确认:敏感工具调用需用户明确同意(Human-in-the-loop)
- 最小权限:Server 只暴露必要的工具和资源
- 隔离性:不同 Server 间的数据互不可见
常见面试问题
Q1: Host、Client、Server 三者的关系?
答案:
- Host 是 AI 应用(如 Claude Desktop),负责管理多个 Client
- Client 与 Server 1:1 对应,维护一个 MCP 会话
- Server 是工具提供者,一个 Server 提供一组相关能力
- Host 内可有多个 Client,分别连接不同 Server
Q2: 为什么用 JSON-RPC 2.0 而不直接用 REST?
答案:
- MCP 需要双向通信(Client ↔ Server),不是简单的请求-响应
- JSON-RPC 支持通知(无需响应)和批量调用
- JSON-RPC 更轻量,适合 stdio/SSE 等非 HTTP 传输
- REST 是资源导向的,MCP 是过程调用导向的