Skip to content

2. 核心思想

一句话理解:MCP 的核心是“能力声明 + 动态发现 + 请求/通知双通道”,Server 声明 Tools/Resources/Prompts,Client 按需调用,Host 做最终决策。

1. Host / Client / Server 三角角色

MCP 把参与者分成三个角色,职责边界非常清晰:

角色职责典型实现
Host发起连接、管理多个 Client、做最终安全决策、暴露 UI/入口Claude Desktop、Cursor、Cline、自定义 Agent 应用
Client维持与单个 Server 的连接,转发请求/通知,管理会话生命周期SDK 中的 ClientClientSession
Server暴露 Tools、Resources、Prompts、Sampling、Roots 等能力filesystem、fetch、sqlite、自定义业务 Server
  • Host 掌握最终决策权:是否允许调用某个 Tool、是否读取某个 Resource、是否转发 Sampling 请求给 LLM,都由 Host 决定。
  • Client 是连接代理:一个 Client 对应一个 Server,负责协议细节(initialize、心跳、关闭)。
  • Server 只关心能力实现:不感知其他 Server,也不关心 Host 是谁。

2. Primitives:MCP 的五大原语

MCP 协议围绕五种核心能力原语展开:

原语说明典型调用
ToolsServer 提供的可调用的函数/能力tools/listtools/call
ResourcesServer 暴露的可读数据,用 URI 标识resources/listresources/read
PromptsServer 提供的可复用提示模板prompts/listprompts/get
SamplingServer 请求 Host 代为调用 LLM 生成文本sampling/createMessage
RootsClient 告诉 Server 哪些目录/空间是“根”notifications/roots/list_changed
  • Tools 是“动作”:有副作用,需要 Host 审批。
  • Resources 是“数据”:只读(默认),用于给模型提供上下文。
  • Prompts 是“模板”:帮助用户/Agent 快速构造高质量提示。
  • Sampling 是“反向调用”:Server 不直接调 LLM,而是请 Host 帮忙调。
  • Roots 是“作用域”:告诉 Server 当前会话允许访问哪些根目录或空间。

3. Capability Negotiation:能力协商

MCP 会话开始前,Client 与 Server 必须交换 capability:

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "sampling": {},
      "roots": { "listChanged": true }
    },
    "clientInfo": { "name": "my-client", "version": "1.0.0" }
  }
}

Server 回复:

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "tools": { "listChanged": true },
      "resources": { "subscribe": true, "listChanged": true },
      "prompts": { "listChanged": true }
    },
    "serverInfo": { "name": "my-server", "version": "1.0.0" }
  }
}

协商要点:

  • protocolVersion:双方必须使用兼容的版本,否则应拒绝连接。
  • capabilities:只启用双方都声明支持的能力,避免协议不匹配。
  • listChanged / subscribe:Server 是否支持动态增删 Tool/Resource 或订阅变更。
  • info:记录 name/version,便于调试与审计。

4. Transport 无关性

MCP 协议层不依赖特定传输方式。官方 Spec 定义了三种 Transport:

Transport适用场景特点
stdio本地进程Server 作为子进程启动,stdin/stdout 传输 JSON-RPC;最简单、最常见
SSE远程 Server基于 HTTP Server-Sent Events,适合浏览器/远程服务
Streamable HTTP远程 Server在 SSE 基础上进一步标准化流式传输

Transport 无关性的价值:

  • 同一套 Server 逻辑可以编译成本地 stdio Server,也可以部署成远程 HTTP Server。
  • Client 代码只需替换 Transport Adapter,无需改动协议处理逻辑。
  • Host 可以根据安全策略选择本地隔离还是远程共享。

5. URI 与 MIME type 约定

MCP Resource 使用 URI 作为全局标识符:

text
file:///Users/case/project/README.md
sqlite:///app.db/tables/users
https://api.example.com/v1/reports/123

约定:

  • URI scheme 表达来源file://sqlite://https:// 等。
  • 路径表达资源位置:Server 负责把 URI 映射到实际数据。
  • MIME type 表达内容类型text/plainapplication/jsonimage/png 等,帮助 Host 决定如何渲染。
json
{
  "uri": "file:///project/README.md",
  "mimeType": "text/markdown",
  "text": "# Project README\n..."
}

URI 稳定性很重要:同一个 URI 在不同时间应返回语义一致的资源,便于缓存与审计。

6. 请求/通知双通道

MCP 基于 JSON-RPC 2.0,支持两种消息:

  • Request/Response:Client 发请求,Server 必须回复,例如 tools/call
  • Notification:单向通知,不需要回复,例如 notifications/resources/updated

通知机制让 Server 可以主动推送变更:

  • notifications/tools/list_changed:Tool 列表发生变化。
  • notifications/resources/updated:某个 Resource 内容更新。
  • notifications/roots/list_changed:Roots 发生变化。
  • notifications/initialized:Client 完成初始化。
  • notifications/cancelled:取消某个进行中的请求。

这种设计让 MCP 既能做同步调用,也能做事件驱动的更新。

7. Host 的最终决策权

MCP 把安全责任放在 Host 上:

  • Server 只能声明能力,不能主动调用。
  • Client 必须转发请求给 Host,由 Host 决定是否执行。
  • 对于 Sampling,Host 可以拦截、修改、拒绝或记录。
  • 对于 Roots,Host 可以限定 Server 能访问的数据范围。

这意味着 MCP 不是一个“Server 可以随意操作 Host”的协议,而是一个“Host 授权下 Server 才能被使用”的协议。

本章小结

MCP 的核心思想可以概括为:Server 声明能力、Client 管理连接、Host 掌控决策。通过 Tools、Resources、Prompts、Sampling、Roots 五大原语,MCP 把外部能力抽象成模型可理解、可发现、可协商的接口;通过 Transport 无关性和 URI/MIME 约定,它又能适应本地与远程多种部署形态。

参考来源

Released under CC-BY-SA-4.0 License.