
MCP 协议规范研究笔记
MCP 协议规范研究笔记
MCP 是什么
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年 11 月开源的一套开放协议,用于 AI 应用(宿主)与外部数据源、工具之间的标准化通信。目标是让任何 AI 客户端对接任何 MCP 服务器,类似"AI 界的 USB-C"。
它解决的是工具接入的碎片化问题:在没有统一协议之前,每个 AI 应用对接外部工具都要各自实现一套接入逻辑,MCP 把"发现工具、调用工具、读取资源"这套交互标准化。
MCP 支持什么
协议定义了三个核心原语:
- tools:模型可以调用的函数,有输入输出 schema 描述,服务器声明、客户端调用
- resources:可供模型读取的数据,类似文件读取,有 URI 定位
- prompts:可复用的提示模板,由服务器预定义
此外支持的能力包括:
- 采样(sampling):服务器反向请求客户端调用模型(用于代理场景,如服务器需要模型决策时)
- 轮询根(roots):客户端告知服务器可访问的目录/资源根
- 日志(logging):服务器向客户端发送日志消息
- 结构化输出:工具调用返回结构化 JSON(2025-06-18 版起)
- elicitation:工具执行过程中需要向用户追问澄清(2025-06-18 版起)
- 任务(Tasks):长耗时请求的异步执行,先提交后轮询结果(2025-11-25 版为实验性,2026-07-28 版转正为扩展)
技术形态
消息格式:基于 JSON-RPC 2.0,复用其请求/响应/通知和错误码结构,MCP 在其上定义具体方法名和语义。
传输层:
- stdio:本地进程间通信,通过标准输入输出传 JSON 消息
- Streamable HTTP:远程通信,2025-03-26 版引入,替代早期 HTTP+SSE 方案,支持服务端流式响应
生命周期:连接后先 initialize,双方声明协议版本和各自支持的能力(capabilities 协商),不支持的功能不启用;随后进入正常消息交换,最后 shutdown。版本协商取双方支持的交集,保证新旧实现共存。
授权:远程场景使用 OAuth 2.x(2025-03-26 版引入 OAuth 2.1),资源访问用 RFC 8707 Resource Indicators 指明目标;2025-11-25 版加入 OpenID Connect Discovery 发现授权服务器、增量 scope 授权、OAuth Client ID Metadata Documents(用客户端自有的 URL 作为 client_id,替代逐服务器注册)。
SDK 与实现:官方提供多语言 SDK,分 Tier 1 / Tier 2 等级,Tier 1 语言需在新规范发布后十周内更新支持。规范、SDK、参考实现三者绑定交付。
协议的写法
消息层:一个典型调用长这样
MCP 会话从 initialize 开始,双方声明协议版本和能力,取交集工作:
// 客户端 → 服务器
{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": {"name": "example-client", "version": "1.0.0"}}}
// 服务器 → 客户端
{"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "2025-11-25", "capabilities": {"tools": {}}, "serverInfo": {"name": "example-server", "version": "1.0.0"}}}
之后客户端发 notifications/initialized 通知,进入正常消息交换。
发现工具:
{"jsonrpc": "2.0", "id": 2, "method": "tools/list"}
{"jsonrpc": "2.0", "id": 2, "result": {"tools": [{"name": "get_weather", "description": "获取指定城市的天气", "inputSchema": {"type": "object", "properties": {"city": {"type": "string", "description": "城市名"}}, "required": ["city"]}}]}}
调用工具:
{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "get_weather", "arguments": {"city": "上海"}}}
{"jsonrpc": "2.0", "id": 3, "result": {"content": [{"type": "text", "text": "上海: 多云, 25°C"}]}}
SDK 层:写一个最小服务器
官方 Python SDK 的 FastMCP 封装直接写函数即可:函数名成为工具名、docstring 成为工具描述、类型注解自动生成 inputSchema。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather-server")
@mcp.tool()
def get_weather(city: str) -> str:
"""获取指定城市的天气"""
return f"{city}: 多云, 25°C"
if __name__ == "__main__":
mcp.run(transport="stdio")
安装 pip install mcp 后即可运行,默认 stdio 方式与客户端通信;transport="streamable-http" 切换为 HTTP 模式。
TypeScript 官方 SDK 对应写法:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({ name: "weather-server", version: "1.0.0" });
server.tool("get_weather", { city: z.string().describe("城市名") }, async ({ city }) => ({
content: [{ type: "text", text: `${city}: 多云, 25°C` }]
}));
await server.connect(new StdioServerTransport());
宿主客户端(如 Claude Desktop)通过 JSON 声明服务器启动命令:
{"mcpServers": {"weather": {"command": "python", "args": ["weather_server.py"]}}}
版本演进
规范以日期为版本号,每个日期版本标记最后一次不向后兼容的变更:
- 2024-11-05:首个稳定版,确立客户端-服务器模型和 tools/resources/prompts 三个原语
- 2025-03-26:引入 Streamable HTTP 传输、OAuth 2.1 授权
- 2025-06-18:结构化输出、elicitation、强化授权,移除 JSON-RPC batching
- 2025-11-25:OpenID Connect Discovery、图标元数据、增量 scope 授权、采样中调工具、Client ID Metadata Documents、实验性 Tasks、JSON Schema 2020-12 成为默认方言
- 2026-07-28:协议核心改为无状态(stateless),Tasks 转正为扩展,MCP Apps 扩展(沙箱 iframe 渲染服务器端 HTML UI),确立正式弃用政策(功能弃用窗口最少十二个月;Roots、Sampling、Logging 被标记 deprecated,未移除)
规范治理机制
- SEP(MCP Enhancement Proposal)提案制:重大变更以提案形式提交,写明动机、设计、兼容性影响,评审通过后进入规范
- Working Group:规范、SDK、扩展、安全分工作组维护
- 扩展机制:核心保持最小,新能力以命名扩展的形式独立发布(如 Tasks、MCP Apps)
- 变更管理:新增功能可先标"实验性"进入规范,成熟后转正;废弃功能给足弃用窗口
本文由 AIGC 调研生成,仅做研究笔记和参考,真实性需要自行考证。