微软发布 MCP C# SDK 2.0 默认启用 HTTP 无状态模式

作者:作者:Edin Kapić原标题:MCP C# SDK 2.0 默认启用 HTTP 无状态模式,新增多轮请求能力
72AI 研判分

微软发布官方 MCP C# SDK 2.0,实现 MCP 规范 2026-07-28 修订版,这是协议发布以来最大的一次改动:移除 initialize 握手与 Mcp-Session-Id,Streamable HTTP 服务器默认无状态,任意实例均可处理请求,无需粘性路由或共享会话存储。同时新增 Mcp-Method、Mcp-Name 等标准化请求头供网关直接路由,并以多轮往返请求(MRTR)替代服务端在调用中索取输入的通道。

报道正文

微软正式发布官方 MCP C# SDK 2.0 版本,实现了 MCP 规范的 2026-07-28 修订版。该版本默认将 Streamable HTTP 服务器设为无状态,标准化 HTTP 请求头,方便基础设施路由 MCP 流量,并为交互式工具引入了多轮往返请求(MRTR)。8 月至 10 月间又相继发布了 2.1 至 2.3 三个次要版本。

MCP 是一个开放协议,用于标准化应用程序如何向大语言模型提供上下文和工具。C# SDK 由微软联合维护,基于 ASP.NET Core 构建。SDK 团队称这一新规范修订是自协议发布以来最大的一次,因为它重新设计了 MCP 在 HTTP 上的运行方式。

initialize 握手和 Mcp-Session-Id 请求头已被移除。协议版本和功能声明现在随每个请求一起发送,因此任何服务器实例都可以处理请求,无需粘性路由或共享会话存储。HttpServerTransportOptions.Stateless 现在默认为 true;需要会话能力的服务器可将其设置为 false。客户端会先探测 server/discover,如果是旧服务器就回退到传统握手。仅有状态模式相关配置、传统 SSE 端点现在会抛出 MCP9006、MCP9004 警告。

tools/call 请求新增 Mcp-Method、Mcp-Name 请求头, 特性可以把工具参数提升为 Mcp-Param-* 请求头。负载均衡器、网关可以直接基于请求头路由,无需解析请求体。但请求体依然是权威来源:如果请求头和请求体信息不一致,服务端会返回 HeaderMismatch 错误。

无状态化改造移除了服务器在调用过程中向客户端请求输入的通道。MRTR 取而代之:工具抛出 InputRequiredException,包含了一个或多个输入请求,这些请求可通过 InputRequest.ForElicitation、ForSampling 或 ForRootsList 构建,外加一个不透明的 requestState。客户端收集响应并通过 inputResponses 重新发起调用。如果注册了处理程序,McpClient 会自动执行相关操作。对于 2025-11-25 或更早版本客户端的有状态会话,SDK 会桥接到旧的服务器发起请求;对于无状态的低版本连接,该请求会抛出 McpException。遵循 SEP-2577,Roots、采用和日志 API 被标记为废弃,警告码为 MCP9005。

根据公告,稳定的 1.x API 仍可继续使用。唯一的例外是 Tasks,它已移至 ModelContextProtocol.Extensions.Tasks 包中,且与 1.3 和 1.4 版本中的实验版本不兼容。实验性的 ModelContextProtocol.Extensions.Apps 包可用于 MCP App 场景。发布说明还列出了更严格的 OAuth 行为:RFC 9207 签发者校验、强制要求对外声明 PKCE S256 支持,以及动态客户端注册自动推断应用类型。包支持的目标框架包括 .NET 8、9 和 10,以及 .NET Standard 2.0。

2.1 版本添加了可选的 subscriptions/listen 处理器,用于自定义服务器端通知流,当 server/discover 在 HTTP 层失败时回退到 initialize。2.2 版本引入了 HttpServerSessionMode,使用 2025-11-25 和 2026-07-28 修订版的客户端能够共享一个端点,并修复了 McpHeaderEncoder.DecodeValue 中的异常。

2.3 版本将 McpClient.ServerInfo 设为可空,这是一项源码级的重大变更,因为服务器可能不在 server/discover 中返回可选的身份元数据;文档提醒不要出于安全决策目的使用服务器自报的身份信息。Streamable HTTP 现在会等待第一个协议消息到达后再发送响应头,因此长时间静默运行的处理器可能需要输出进度信息或设置更长的 HTTP 超时。其他变更包括:在列出工具、提示词和资源时保留注册顺序,暴露 McpClientOptions.TimeProvider,方便编写确定性超时测试,将 OAuth 排除在 DiscoverProbeTimeout 之外,以及在等待优雅退出前关闭 stdio 服务器的输入。

有读者在博文评论区询问协议如何防止 被篡改或跨会话重用,目前评论区暂无官方回复。

团队表示下一阶段重点是端到端身份认证与授权。SDK 可在 NuGet 上获取,文档见项目站点,2.0、2.1、2.2 和 2.3 的发布说明可在 GitHub 上查看。

查看英文原文:https://www.infoq.com/news/2026/10/MCP-CSharp-SDK-Stateless/