MCP 教程(上):原理、架构与协议基础

0. 版本说明(阅读前的预期管理)

本文以 MCP 2025-06-18 规范为主线。需要注意的是,客户端能力中的 rootssamplingelicitation 在规范页面中仍标注为 draft,细节可能继续演进。

通俗解释:
把它当作“标准化的交通规则”,主干规则很稳定,但部分新车道还在试运行,之后可能会更新标志线。

1. MCP 的定位与目标

MCP(Model Context Protocol)是一个“上下文与能力交换协议”,目标是把应用可提供的数据和可执行能力以统一、可发现的方式暴露给 AI 应用,从而实现跨工具、跨服务的可组合集成。它专注于协议层,不规定应用如何组织 LLM 或如何使用上下文。

MCP 的核心组成包括:基础协议(JSON-RPC 消息)、生命周期管理(初始化与能力协商)、传输与授权,以及服务器特性(Resources/Prompts/Tools)与客户端特性(Sampling/Roots/Elicitation)等。

通俗解释:
MCP 就像“AI 的 USB 接口标准”。它不关心你接的是哪种硬盘(模型),而是规定设备怎么插、怎么通电、怎么对话。

2. 角色与分层架构

参与者

  • Host:AI 应用本体(例如 IDE、桌面客户端)。
  • Client:由 Host 创建并维护,与具体 MCP Server 建立连接。
  • Server:提供上下文或执行能力的服务端程序。

一个 Host 会为每个 Server 创建一个 Client 连接;本地 stdio 服务通常对应单一客户端,远程 Streamable HTTP 服务可支持多客户端并发。

两层结构

  • 数据层:定义 JSON-RPC 交互语义、生命周期、以及工具/资源/提示词等原语。
  • 传输层:定义通信方式与安全/认证细节(stdio 或 Streamable HTTP)。

通俗解释:
Host 像“总控台”,Client 像“电话线”,Server 像“专业外包团队”。数据层是“对话规范”,传输层是“电话还是视频”。

3. 数据层核心基元(Primitives)

服务器侧三类基元

  • Tools:模型可主动调用的“可执行能力”,通过 tools/list 发现、tools/call 调用;工具用 JSON Schema 描述输入,结果可返回结构化内容。
  • Resources:以 URI 标识的只读上下文数据,客户端可 resources/list 发现、resources/read 读取,并可订阅更新。
  • Prompts:用户可显式触发的提示模板,通过 prompts/list 发现、prompts/get 获取内容并传参定制。

客户端侧能力

  • Roots:客户端向服务器提供“文件系统边界”,服务器可 roots/list 获取,并接收 roots/list_changed 通知。
  • Sampling:服务器可向客户端请求 LLM 采样,客户端掌控模型选择与权限,建议保持人工审批。
  • Elicitation:服务器向用户请求补充信息,支持表单与 URL 两种模式,敏感信息应使用 URL 模式。

通俗解释:

  • Tools 像“按钮”,按下会发生动作。
  • Resources 像“资料库”,只读不改。
  • Prompts 像“流程模板”,用户一键启动。
  • Roots 像“允许进入的文件夹清单”。
  • Sampling 像“服务器借你的模型做一次推理”。
  • Elicitation 像“服务器向用户补问关键字段”。

4. 消息结构与生命周期

消息结构
MCP 的消息遵循 JSON-RPC 2.0。请求包含 id,响应返回相同 id 且要么有 result、要么有 error,通知没有 id

生命周期阶段
初始化阶段必须先由客户端发送 initialize,协商协议版本与能力;服务器回应其能力与信息;随后客户端发送 notifications/initialized 表示就绪。运行阶段双方仅使用已协商能力;关闭阶段由传输层结束连接。超时应触发取消通知或中止等待。

通俗解释:
这像“先握手再开工”。先确认版本与权限,再进入正常沟通,最后礼貌结束通话。

5. 传输与授权(原理层概览)

传输方式

  • stdio:客户端以子进程方式启动服务器,消息走 stdin/stdout,按换行分隔,stdout 只能输出 MCP 消息。
  • Streamable HTTP:服务器独立运行,通过 HTTP POST 发送消息,必要时用 SSE 流返回或推送通知;同时要求更严格的连接管理。

安全与授权
Streamable HTTP 需要做 Origin 校验、尽量绑定 localhost、并实现认证,防止 DNS rebinding 等风险。
授权是可选的:HTTP 传输建议遵循 OAuth 2.1 子集,而 stdio 传输应通过环境变量获取凭证。

通俗解释:
stdio 像“本机内线电话”,HTTP 像“公网电话”。公网电话要验证身份、防骚扰。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐