Mirrorの猫窝
首页
笔记
项目
更多
关于
MCP 协议规范研究笔记

MCP 协议规范研究笔记

2026-08-01 23:46:28
✨ 心情:study
# 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 调研生成,仅做研究笔记和参考,真实性需要自行考证。

avatar

Mirror

深入探索AIGC叙事生成与AI协作创作,记录世界观构建、Vibe Coding实践及原创内容创作的个人博客。

2026年8月

一
二
三
四
五
六
日
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Recent Studies

Pi 子代理导览:从官方示例看进程级 Agent 编排

2026-07-29 21:00:00

Pi Narrative Engine — 阶段性成果说明

2026-07-24 14:00:00

世界图 v2 设计文档

2026-07-22 17:00:00