MCP C# SDK 2.0发布:HTTP改为无状态,新增多轮请求
微软正式发布官方 MCP C# SDK 2.0 版本,实现了 MCP 规范的 2026-07-28 修订版。该版本默认将 Streamable HTTP 服务器设为无状态,标准化 HTTP 请求头,方便基础设施路由 MCP 流量,并为交互式工具引入了多轮往返请求(MRTR)。8 月至 10 月间又相继发布了 2.1 至
微软上线了官方
MCP C# SDK 2.0 版本,对应 MCP 规范的 2026-07-28 修订版。新版本把 Streamable HTTP 服务器默认设成无状态,并把 HTTP 请求头做了标准化,让基础设施更容易对 MCP 流量做路由;交互式工具则获得了多轮往返请求(MRTR)能力。此后,2.1 至 2.3 三个次要版本在 8 月至 10 月间陆续推出。
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 层出错,就退回initialize2.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。