关键变更

关键变更

社区译文;来源: MCP 80041ab0

本文列出模型上下文协议(MCP)规范自上一修订版 2025-11-25 以来的变更。

主要变更

  1. 从可流式 HTTP 传输中移除协议级会话和 Mcp-Session-Id Header。列表端点(tools/list、resources/list、prompts/list)不再因连接而异。需要跨调用状态的服务器应使用由服务器显式生成、并作为普通工具参数传递的句柄(SEP-2567)。

  2. 将 MCP 改为无状态协议:移除 initialize/notifications/initialized 握手。现在每个请求都通过 _meta 携带协议版本和客户端能力(io.modelcontextprotocol/protocolVersion、io.modelcontextprotocol/clientCapabilities)。客户端 SHOULD 在每个请求中标识自身(io.modelcontextprotocol/clientInfo),服务器 SHOULD 在每个结果的 _meta 中标识自身(io.modelcontextprotocol/serverInfo)。版本不匹配时返回 UnsupportedProtocolVersionError(SEP-2575)。

  3. 新增 server/discover:服务器 MUST 实现此 RPC,以公布其支持的协议版本、能力和身份。客户端 MAY 在任何其他请求之前调用该方法,以预先选择版本;也可在 STDIO 上将其用作向后兼容探测(SEP-2575)。

  4. 使用 subscriptions/listen 替代 HTTP GET 端点和 resources/subscribe/resources/unsubscribe:它是一条长连接 POST 响应流,用于发送客户端已选择接收的服务器到客户端变更通知。客户端可选择特定类型(toolsListChanged、promptsListChanged、resourcesListChanged、resourceSubscriptions);服务器确认订阅,并使用 io.modelcontextprotocol/subscriptionId 标记通知。notifications/progress 和 notifications/message 等请求范围通知仍通过相关请求的响应流传输,而不通过 subscriptions/listen 流传输(SEP-2575)。

  5. 移除 ping、logging/setLevel 和 notifications/roots/list_changed。日志级别现在通过 _meta 中的 io.modelcontextprotocol/logLevel 按请求设置;对于未包含此字段的请求,服务器 MUST NOT 发出 notifications/message(SEP-2575)。

  6. 将实验性任务从核心协议移至官方扩展(io.modelcontextprotocol/tasks)。重新设计的扩展以 tasks/get 轮询和用于客户端到服务器输入的新方法 tasks/update 取代阻塞式 tasks/result 方法,移除 tasks/list,并允许服务器在无需按请求选择启用的情况下主动返回任务句柄(SEP-2663)。

  7. 引入多轮请求(MRTR)模式,取代此前发送服务器发起请求的方式,例如 roots/list、sampling/createMessage 或 elicitation/create。服务器返回 InputRequiredResult(resultType: "input_required"),其 inputRequests 字段携带处理请求所需的附加信息请求。客户端重试原始请求,并通过 inputResponses 提供所请求的信息(SEP-2322)。

  8. 现在所有结果都带有必需的 resultType 字段:普通结果为 "complete",多轮请求的中间结果为 "input_required"。对于较早协议版本服务器返回的、缺少此字段的结果,客户端 MUST 将其视为 "complete"(SEP-2322)。

  9. 从可流式 HTTP 传输中移除 SSE 流恢复和消息重投递(Last-Event-ID Header 和 SSE 事件 ID)。响应流中断会使进行中的请求丢失;客户端 MUST 使用新的请求 ID 将其作为新请求重新发出(SEP-2575)。

次要变更

  1. 为 ClientCapabilities 和 ServerCapabilities 新增 extensions 字段,以支持核心协议之外的可选扩展。
  2. 记录 _meta 键(traceparent、tracestate、baggage)传播 OpenTelemetry 跟踪上下文的约定(SEP-414)。
  3. 服务器 SHOULD 以确定性顺序返回 tools/list 的工具,以便客户端缓存并提高 LLM 提示缓存命中率。
  4. 要求可流式 HTTP POST 请求带有标准 MCP 请求 Header(Mcp-Method、Mcp-Name),并支持通过 x-mcp-header 从工具参数传递自定义 Header(SEP-2243)。
  5. 通过新的 CacheableResult 接口,要求 tools/list、prompts/list、resources/list、resources/read 和 resources/templates/list 返回的结果包含 ttlMs 与 cacheScope 字段。ttlMs 是以毫秒为单位的新鲜度提示,允许客户端缓存响应并减少轮询;cacheScope("public" 或 "private")控制共享中间层是否可以缓存响应。两个字段均用于补充现有的 listChanged 通知(SEP-2549)。
  6. 将资源未找到错误码从 -32002 改为 -32602(Invalid Params),以与 JSON-RPC 规范保持一致。
  7. 授权服务器 SHOULD 按照 RFC 9207 在授权响应中包含 iss 参数;MCP 客户端在兑换授权码前,MUST 验证存在的 iss 与已记录的签发者一致 (SEP-2468)。
  8. 要求 MCP 客户端在动态客户端注册期间指定适当的 application_type,以避免 OpenID Connect 重定向 URI 冲突 (SEP-837)。
  9. 明确客户端凭据绑定到签发凭据的授权服务器:客户端 MUST 以签发者标识符为键持久化凭据,MUST NOT 将其复用于其他授权服务器,并在授权服务器变更时 MUST 重新注册(SEP-2352)。
  10. 放宽 inputSchema 和 outputSchema,允许使用任意 JSON Schema 2020-12 关键字;放宽 structuredContent,允许使用任意 JSON 值。新增 $ref 解析要求和组合关键字资源限制 (SEP-2106)。
  11. 移除 2025-11-25 中引入的 notifications/elicitation/complete 通知和 URL 模式信息征询请求的 elicitationId 字段。在多轮请求模式下,客户端通过重试原始请求获知带外交互结果,因此服务器发起的完成信号及用于关联该信号的标识符不再适合此协议。需要在多次重试之间关联一次信息征询的服务器,应在 requestState 中编码自己的标识符。
  12. 定义错误码分配政策,划分 JSON-RPC 服务器错误范围:-32000 到 -32019 仍由实现定义(既有 SDK 用法不受影响),-32020 到 -32099 为 MCP 规范保留。相应地,重新编号此草案引入的错误码:HeaderMismatch -32001 → -32020、MissingRequiredClientCapability -32003 → -32021、UnsupportedProtocolVersion -32004 → -32022;并将此前仅存在于传输说明中的 HeaderMismatchError 加入 schema。

弃用

此处列出的功能仍是规范的一部分,但已按照功能生命周期与弃用政策安排移除。新实现不应采用这些功能。弃用功能注册表跟踪当前处于弃用状态的所有功能。

  1. 弃用根目录、采样和日志功能 (SEP-2577)。 这些功能在弃用窗口期内仍完全可用,但新实现不应再增加对它们的支持。建议的迁移方式:以工具参数、资源 URI 或服务器配置传递目录或文件,而不使用根目录;直接集成 LLM 提供商 API,而不使用采样;将日志写入 stderr(stdio),或使用 OpenTelemetry,而不使用日志功能。

  2. 将 HTTP+SSE 传输(自协议版本 2025-03-26 起已弃用)按照功能生命周期政策重新归类为弃用 (SEP-2596)。 请迁移到可流式 HTTP。

  3. 将 includeContext 的 "thisServer" 和 "allServers" 值(自协议版本 2025-11-25 起软弃用)重新归类为弃用 (SEP-2596)。 请省略该字段或使用 "none";这些值最迟将随采样功能一同移除。

  4. 弃用 OAuth 2.0 Dynamic Client Registration Protocol (RFC7591)作为客户端注册机制,改用 Client ID Metadata Documents (PR #2858)。 为了向后兼容不支持 Client ID Metadata Documents 的授权服务器,该机制仍然可用。

其他 schema 变更

  1. schema.json 现在正确反映 TypeScript 定义中的 minimum/maximum/default 为 number,而不只是 integers。此前使用 --defaultNumberType integer 运行生成器导致了此问题(PR#2710)。

治理与流程更新

  1. 采用规范功能生命周期与弃用政策,定义 Active、Deprecated 和 Removed 功能状态、至少十二个月的弃用窗口,以及弃用功能注册表 (SEP-2596)。

流程变更

  1. 正式确立基于 PR 的 SEP 工作流:在 seps/ 目录中使用 Markdown 文件,从 PR 派生编号,明确发起人职责,并通过 PR 标签管理状态(SEP-1850)。

完整变更日志

有关自上一协议修订版以来全部变更的完整列表, 请参阅 GitHub。