一、改版规模一份可核对的事实表下面这张表把本次规范更替的关键事实集中列出每条都能追溯到公开 URL方便你在评审或对外说明时引用。事实项取值来源规范版本2026-07-28官方规范页 modelcontextprotocol.io/specification/2026-07-28上一修订版本2025-11-25changelog 首句changes since the previous revision, 2025-11-25协议核心Stateless、self-contained requests、per-request capability negotiation规范页 Overview / Base Protocol消息格式JSON-RPC 2.0规范页 Base ProtocolMajor changes9 项changelog Major changes 段Minor changes12 项changelog Minor changes 段Deprecated4 项changelog Deprecated 段治理更新特性生命周期与弃用策略Active/Deprecated/Removed最少 12 个月弃用窗口changelog Governance and process updates权威 schemaTypeScript 优先同时提供 JSON Schemagithub.com/modelcontextprotocol/specification README协议要素Host / Client / ServerServer 提供 Resources/Prompts/ToolsClient 可提供 Elicitation规范页 Architecture规范 GitHub 仓库modelcontextprotocol/specification以 MIT 协议开源schema 以 TypeScript 优先定义并同步生成 JSON Schema便于非 TS 生态消费。本文不引用 star 数等动态指标因为它们随时间变化且本次未在仓库页直接核对到确切数值。图 1从有状态握手到无状态自描述请求的协议形态转变示意图非运行时截图二、破坏性变更一去掉 initialize 握手请求自描述变更核心来自 changelog Major changes 第 2 条SEP-2575MCP 转为无状态移除initialize/notifications/initialized握手。每个请求现在必须把协议版本和客户端能力放进_meta并由客户端在每次请求里声明自己。在2025-11-25及更早的实现里连接生命周期大致是客户端先发initialize请求附带protocolVersion与capabilities服务端在响应里回填自身能力客户端再发notifications/initialized表示就绪之后双方共享一个会话上下文。2026-07-28把这套握手整体取消改为每个请求自带身份。按 Architecture 页的描述客户端在每次请求的_meta.io.modelcontextprotocol/clientCapabilities中声明能力服务端在响应的_meta.io.modelcontextprotocol/serverInfo中声明自己。结合 changelog一次请求的_meta结构示意如下{ jsonrpc: 2.0, id: 1, method: tools/call, params: { name: search, arguments: { query: mcp 2026-07-28 } }, _meta: { io.modelcontextprotocol/protocolVersion: 2026-07-28, io.modelcontextprotocol/clientInfo: { name: demo-client, version: 1.0.0 }, io.modelcontextprotocol/clientCapabilities: { tools: {}, elicitation: {} } } }上面这段 JSON 是依据 changelog 字段描述与 Architecture 页clients include their capabilities in_metaon every request整理的示意结构便于理解字段归属具体字段是否必填、是否还需扩展以官方 schema.ts 为准。版本不匹配时返回UnsupportedProtocolVersionErrorMajor changes 第 2 条。迁移含义很直接任何依赖先 initialize 再发请求的客户端、任何在 initialize 响应里缓存能力并长期复用的实现都要改成每请求携带能力。服务端则不能再假设对面那个客户端已经 initialize 过了。三、破坏性变更二Mcp-Session-Id 退场与 SSE 续传取消这两条是 Streamable HTTP 传输层的硬变更出自 changelog Major changes 第 1 条与第 9 条均为 SEP-2575 体系协议级会话与Mcp-Session-Id头被移除。tools/list、resources/list、prompts/list不再随连接变化服务端若需要跨调用状态必须用显式、服务端签发、作为普通工具参数传递的 handle 来承载Major changes 第 1 条SEP-2567。SSE 流续传与消息重投被移除。即Last-Event-ID头与 SSE event ID 不再支持。响应流一旦中断正在进行的请求即丢失客户端必须用新 request id 重发原请求Major changes 第 9 条。同时ping、logging/setLevel、notifications/roots/list_changed被移除Major changes 第 5 条日志级别改为按请求通过_meta.io.modelcontextprotocol/logLevel设置且服务端不得为未带该字段的请求发送notifications/message。resources/subscribe/resources/unsubscribe与 HTTP GET 端点被subscriptions/listen取代Major changes 第 4 条客户端按toolsListChanged、promptsListChanged、resourcesListChanged、resourceSubscriptions等类型订阅服务端用io.modelcontextprotocol/subscriptionId标记通知。迁移含义依赖Mcp-Session-Id做粘性路由的网关、依赖 SSELast-Event-ID做断线续传的客户端都要重写。需要跨调用状态时不要再借助会话而是显式签发 handle 并通过工具参数回传。四、server/discover新的能力发现 RPC变更出自 Major changes 第 3 条SEP-2575服务端必须实现server/discover用于声明其支持的协议版本、能力与身份。客户端可在发起任何其他请求前调用它做前置版本选择也可在 STDIO 上把它当作向后兼容探测。这填补了取消握手后留下的怎么先探一下对方的空缺握手没了但server/discover给了一个轻量的、可单次调用的发现入口。注意它是 MUST 实现不是可选——新写的 server 必须提供这个 RPC。五、MRTR 模式替代 server-initiated requests这是对存量代码冲击最大的一条。changelog Major changes 第 7 条SEP-2322引入 Multi Round-Trip RequestsMRTR模式替代旧的服务端主动请求做法。规范明确服务端必须用 MRTR 来发送roots/list、sampling/createMessage、elicitation/create这类请求旧的服务端主动请求模式不再支持属破坏性变更。流程上客户端先发请求服务端若需要更多信息就回一个InputRequiredResultresultType: input_required客户端收集到输入后用新的 request id 重发原请求服务端据此完成。规范在 MRTR 页给了一个完整的InputRequiredResult示例下面是其中关键结构摘自官方规范页已省略部分注释{ jsonrpc: 2.0, id: 1, result: { resultType: input_required, inputRequests: { github_login: { method: elicitation/create, params: { mode: form, message: Please provide your GitHub username, requestedSchema: { type: object, properties: { name: { type: string } }, required: [name] } } } }, requestState: AEAD-protected blob } }inputRequests的 key 由服务端分配value 必须是ElicitRequest、CreateMessageRequest或ListRootsRequest之一。客户端重试时把inputResponses与原样回传的requestState一起带上。规范对requestState有明确的安全要求MRTR 页Server Requirements客户端必须原样回传requestState不得解析、修改或对其内容做任何假设不带时不得自行添加。服务端必须把requestState视为攻击者可控输入。若它影响授权、资源访问或业务逻辑必须用 HMAC 或 AEAD 保护完整性并拒绝校验失败的状态。为防重放服务端应在受完整性保护的requestState中携带已认证主体、短有效期 TTL、原始请求标识方法名与关键参数摘要。另外Major changes 第 8 条SEP-2322规定所有结果现在都必须带resultType字段普通结果为completeMRTR 中间结果为input_required客户端必须把不带该字段的旧版本结果视为complete。MRTR 仅允许出现在prompts/get、resources/read、tools/call三类请求上。迁移含义以前用sampling/createMessage、elicitation/create、roots/list做服务端主动请求的实现都要改写成返回InputRequiredResult→ 客户端重试的回合制任何在服务端内存里持有这个会话正在等输入的状态机都要迁到requestState自包含的形态。六、Tasks 移出核心成为官方扩展变更出自 Major changes 第 6 条SEP-2663实验性 tasks 从核心协议移出成为官方扩展io.modelcontextprotocol/tasks。重新设计后的扩展做了几件事用tasks/get轮询取代原先阻塞的tasks/result新增tasks/update用于客户端到服务端的输入移除tasks/list允许服务端在无需每请求 opt-in 的情况下主动返回 task handle。规范页在 Extensions 段把 Tasks 描述为异步执行长耗时操作支持轮询、中途输入与持久化 handle。迁移含义把 Tasks 当核心能力直接调用的旧实现要改成声明扩展支持、走tasks/get/tasks/update的新路径。这也是2026-07-28核心瘦身、能力外移到 extensions思路的一个缩影——ClientCapabilities与ServerCapabilities新增了extensions字段Minor changes 第 1 条来承载这种可选扩展协商。七、三大弃用Roots / Sampling / Logging 的迁移路径changelog Deprecated 第 1 条SEP-2577把 Roots、Sampling、Logging 三个特性标记为弃用。它们在弃用窗口内仍可用但新实现不应再新增支持。官方给出了明确的迁移建议弃用特性官方建议的替代做法Roots改用工具参数、resource URI 或服务端配置来传递目录或文件Sampling直接对接 LLM provider API而不是经由 MCP SamplingLogging在 stdio 下输出到stderr或改用 OpenTelemetry此外还有两条相关的弃用HTTPSSE 传输被重分类为 DeprecatedDeprecated 第 2 条SEP-2596应迁移到 Streamable HTTPincludeContext的thisServer/allServers取值被重分类为 DeprecatedDeprecated 第 3 条建议省略该字段或使用none。OAuth 2.0 Dynamic Client RegistrationRFC7591作为客户端注册机制被弃用改用 Client ID Metadata DocumentsDeprecated 第 4 条PR #2858。结合治理策略最少 12 个月弃用窗口这意味着你有大约一年的缓冲期但新写的代码现在就应按替代方案走。八、值得顺手记下的 Minor 变更下面几条 Minor 虽不破坏二进制兼容但影响新代码写法建议在迁移时一并处理标准请求头SEP-2243Streamable HTTP POST 必须带Mcp-Method、Mcp-Name标准头并支持通过x-mcp-header从工具参数注入自定义头。可缓存结果SEP-2549tools/list、prompts/list、resources/list、resources/read、resources/templates/list的结果必须带ttlMs与cacheScopepublic/private作为新鲜度提示供客户端缓存、减少轮询。工具列表确定性顺序服务端应使tools/list返回顺序确定以利于客户端缓存并提升 LLM prompt cache 命中率。OpenTelemetry trace 上下文SEP-414_meta约定traceparent、tracestate、baggage键用于链路追踪上下文传播。错误码分区-32000至-32019留给实现自定义既有 SDK 用法 grandfathered-32020至-32099保留给规范。本次引入的HeaderMismatch、MissingRequiredClientCapability、UnsupportedProtocolVersion被重编号为-32020/-32021/-32022资源未找到错误由-32002改为-32602Invalid Params以对齐 JSON-RPC。九、迁移检查清单把上面的变更落到代码上可以按下面这张清单逐项核对。迁移项旧做法新做法依据连接握手先 initialize 再发请求每请求在_meta带协议版本、clientInfo、capabilitiesSEP-2575会话路由依赖Mcp-Session-Id跨调用状态用显式服务端 handle 经工具参数传递SEP-2567断线续传SSELast-Event-ID续传流断开后用新 request id 重发原请求SEP-2575心跳/日志ping、logging/setLevel按请求_meta.io.modelcontextprotocol/logLevelSEP-2575资源订阅resources/subscribesubscriptions/listen单流按类型订阅SEP-2575服务端主动请求直接发roots/list等返回InputRequiredResult客户端重试SEP-2322结果标记无resultType所有结果带resultTypecomplete/input_requiredSEP-2322能力发现initialize 响应里读server/discoverMUST 实现SEP-2575长任务Tasks 在核心协议走io.modelcontextprotocol/tasks扩展tasks/get/tasks/updateSEP-2663Roots用 Roots 传目录/文件改用工具参数、resource URI、服务端配置SEP-2577Sampling经 MCP Sampling 调 LLM直接对接 LLM provider APISEP-2577Logging用 Logging 特性stdio 下写stderr或用 OpenTelemetrySEP-2577HTTP 传输HTTPSSEStreamable HTTPSEP-2596十、限制与说明为避免把规范说的和实测出来的混在一起这里把本文的边界说清楚本文所有特性描述均来自 MCP 官方规范页与2026-07-28changelog以及规范 GitHub 仓库 README未对任何具体 SDK 做运行时验证。具体行为、字段是否必填、边界情形以官方schema.ts与各 SDK 实现为准。文中给出的请求_metaJSON 为依据 changelog 字段描述整理的示意结构目的是说明字段归属不保证与某 SDK 序列化结果逐字节一致MRTR 的InputRequiredResult示例摘自官方规范页。本文不引用 star 数、用户数、benchmark、commit 数等动态或未核对指标规范 GitHub 仓库页未直接显示确切的 star 数值故不写。文中配图为说明性示意图标注为 diagram不作为运行时证据。选题时间说明2026-07-28规范距本文撰写日约 8 天略超出最近 7 天窗口属最近 30 天内的真实热点故按降级规则在 INDEX 中说明后采用。项目链接官方规范2026-07-28Specification - Model Context Protocol完整变更日志Key Changes - Model Context ProtocolMRTR 模式说明Multi Round-Trip Requests - Model Context Protocol架构说明Architecture - Model Context Protocol规范仓库含 schema.tsGitHub - modelcontextprotocol/modelcontextprotocol: Specification and documentation for the Model Context Protocol · GitHub版本对比Comparing 2025-11-25...2026-07-28 · modelcontextprotocol/modelcontextprotocol · GitHub