重大变更
-
移除流式 HTTP 传输中的协议级会话以及
Mcp-Session-Id标头。列表端点(tools/list、resources/list、prompts/list)不再按连接变化。需要跨调用状态的服务器应使用显式的、由服务器签发的句柄,并将其作为普通工具参数传递 (SEP-2567)。 -
使 MCP 无状态:移除
initialize/notifications/initialized握手。现在每个请求都在_meta中携带其协议版本、客户端标识和客户端能力(io.modelcontextprotocol/protocolVersion、io.modelcontextprotocol/clientInfo、io.modelcontextprotocol/clientCapabilities)。版本不匹配时返回UnsupportedProtocolVersionError(SEP-2575)。 -
添加
server/discover:服务器必须实现此 RPC,以公布其支持的协议版本、能力和标识。客户端可以在任何其他请求之前调用它,以便提前选择版本;或者在 STDIO 上将其用作向后兼容探测 (SEP-2575)。 -
将 HTTP GET 端点以及
resources/subscribe/resources/unsubscribe替换为subscriptions/listen:为已选择接收的服务器到客户端变更通知提供单个长生命周期的 POST-响应流。客户端可针对特定类型选择订阅(toolsListChanged、promptsListChanged、resourcesListChanged、resourceSubscriptions);服务器会确认并使用io.modelcontextprotocol/subscriptionId为通知打标签。诸如notifications/progress和notifications/message这类与请求作用域相关的通知,继续沿它们所关联请求的响应流传递,而不是subscriptions/listen流 (SEP-2575)。 -
移除
ping、logging/setLevel和notifications/roots/list_changed。日志级别现在通过_meta中的io.modelcontextprotocol/logLevel按请求设置;对于未包含此字段的请求,服务器不得发送notifications/message(SEP-2575)。 -
将实验性任务移出核心协议,纳入官方扩展(
io.modelcontextprotocol/tasks)。重新设计后的扩展以通过tasks/get轮询和新的tasks/update接收客户端到服务器的输入,取代了阻塞式tasks/result方法,移除了tasks/list,并允许服务器无需按请求显式选择即可返回任务句柄 (SEP-2663)。 -
引入多轮往返请求(Multi Round-Trip Requests, MRTR)模式,用于替代此前发送服务器发起请求的方法,例如
roots/list、sampling/createMessage或elicitation/create。服务器返回一个InputRequiredResult(resultType: "input_required"),其inputRequests字段携带处理该请求所需的附加信息请求。客户端在重试原始请求时通过inputResponses响应,并提供所请求的信息。(SEP-2322)。 -
现在所有结果都带有必需的
resultType字段:普通结果为"complete",而 multi round-trip request 的中间结果为"input_required"。客户端必须将来自早期协议服务器且省略该字段的结果视为"complete"(SEP-2322)。 -
从 Streamable HTTP 传输中移除 SSE 流恢复能力和消息重投递(
Last-Event-ID标头和 SSE 事件 ID)。响应流中断将丢失进行中的请求;客户端必须以新的请求 ID 重新发起一个新请求 (SEP-2575)。
次要变更
- 为
ClientCapabilities和ServerCapabilities添加extensions字段,以支持核心协议之外的可选扩展。 - 记录
_meta键(traceparent、tracestate、baggage)的 OpenTelemetry 跟踪上下文传播约定 (SEP-414)。 - 服务器应当以确定性顺序从
tools/list返回工具,以支持客户端缓存并提高 LLM 提示缓存命中率。 - 要求 Streamable HTTP POST 请求使用标准 MCP 请求标头(
Mcp-Method、Mcp-Name),并支持通过工具参数中的x-mcp-header传递自定义标头 (SEP-2243)。 - 通过新的
CacheableResult接口,要求tools/list、prompts/list、resources/list、resources/read和resources/templates/list返回的结果包含ttlMs和cacheScope字段。ttlMs是一个新鲜度提示(毫秒),允许客户端缓存响应并减少轮询;cacheScope("public"或"private")控制共享中介是否可以缓存响应。这两个字段与现有的listChanged通知相辅相成 (SEP-2549)。 - 将资源未找到错误码从
-32002改为-32602(无效参数),以与 JSON-RPC 规范保持一致。 - 授权服务器应当按 RFC 9207 在授权响应中包含
iss参数,而 MCP 客户端必须在兑换授权码前,将收到的iss与记录的颁发者进行校验 (SEP-2468)。 - 要求 MCP 客户端在动态客户端注册期间指定适当的
application_type,以避免 OpenID Connect 重定向 URI 冲突 (SEP-837)。 - 明确客户端凭据与签发它们的授权服务器绑定:客户端必须按颁发者标识符对持久化凭据建立键,不得与其他授权服务器复用这些凭据,并且在授权服务器变更时必须重新注册 (SEP-2352)。
- 放宽
inputSchema和outputSchema,允许任何 JSON Schema 2020-12 关键字,并允许structuredContent接受任意 JSON 值。添加$ref解析要求和组合关键字资源边界 (SEP-2106)。 - 移除
notifications/elicitation/complete通知以及 URL 模式 elicitation 请求的elicitationId字段,这两者都引入于2025-11-25。在 Multi Round-Trip Requests 模式下,客户端通过重试原始请求来了解带外交互的结果,因此服务器发起的完成信号——以及用于关联它的标识符——不再适合该协议。需要跨重试关联一次 elicitation 的服务器,应将自己的标识符编码到requestState中。 - 定义一项错误码分配策略,将 JSON-RPC 服务器错误范围进行划分:
-32000到-32019保持实现定义(现有 SDK 用法予以保留),-32020到-32099保留给 MCP 规范。相应地重编号本草案中引入的错误码——HeaderMismatch-32001→-32020、MissingRequiredClientCapability-32003→-32021、UnsupportedProtocolVersion-32004→-32022——并将此前仅存在于传输说明中的HeaderMismatchError添加到 schema 中。
已弃用
此处列出的功能仍然是规范的一部分,但已计划根据功能生命周期和弃用策略移除。新的实现不应采用它们。已弃用功能注册表会跟踪当前处于“已弃用”状态的每一项功能。-
弃用 Roots、Sampling 和 Logging 功能
(SEP-2577)。
这些功能在弃用窗口期内仍可完全使用,但新的
实现不应再添加对它们的支持。建议的迁移方式:通过工具参数、资源 URI 或服务器
配置传递目录或文件,而不是使用 Roots;直接与 LLM 提供商 API 集成,而不是使用 Sampling;向
stderr(stdio)记录日志或使用 OpenTelemetry,而不是使用 Logging。 -
将 HTTP+SSE 传输(自协议版本
2025-03-26起已软弃用)根据功能生命周期策略重新归类为“已弃用” (SEP-2596)。 迁移到Streamable HTTP。 -
将
includeContext值"thisServer"和"allServers"(自协议版本2025-11-25起已软弃用)重新归类为“已弃用” (SEP-2596)。 省略该字段或使用"none";这些值最迟将在 Sampling 功能本身移除时一并删除。 - 将 OAuth 2.0 动态客户端注册协议 (RFC7591) 作为客户端注册 机制弃用,改用 Client ID Metadata Documents (PR #2858)。 这仍然可用于与不支持 Client ID Metadata Documents 的授权服务器保持向后兼容。
其他 schema 变更
schema.json现在正确反映了 Typescript 定义中的 minimum/maximum/default 是number,而不只是integers。这由使用--defaultNumberType integer运行生成器导致 (PR#2710)。
治理和流程更新
- 采用一套规范的 功能生命周期和弃用策略, 定义 Active、Deprecated 和 Removed 三种功能状态、最短 十二个月的弃用窗口,以及一个 已弃用功能注册表 (SEP-2596)。
流程变更
- 正式化基于 PR 的 SEP 工作流,包括
seps/目录中的 markdown 文件、源自 PR 的编号、赞助者职责以及通过 PR 标签进行状态管理 (SEP-1850)。