微软宣布 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 头,[McpHeader] 特性可以把工具参数提升为 Mcp-Param-* 头。负载均衡器和网关因此能按头路由,不必读请求体。请求体仍是权威来源:头与体不一致时,服务器返回 HeaderMismatch 错误。

MRTR 补上交互缺口

无状态化去掉了服务器在调用中途向客户端要输入的通道,MRTR 用来替代它。工具抛出 InputRequiredException,附带一个或多个输入请求,用 InputRequest.ForElicitation、ForSampling 或 ForRootsList 构造,再加一个不透明的 requestState。客户端收集答案后带上 inputResponses 重新发起调用。注册了处理器时,McpClient 会自动完成这套流程。

在有状态会话下对接 2025-11-25 或更早的客户端,SDK 会桥接到旧的服务器发起请求方式;在无状态的降级连接上,该请求会以 McpException 形式暴露。Roots、sampling 和日志 API 按 SEP-2577 在 MCP9005 下标记弃用。

稳定的 1.x API 继续可用,例外是 Tasks:它移到了需要主动开启的 ModelContextProtocol.Extensions.Tasks 包,与 1.3、1.4 中的实验版本不兼容。实验性的 ModelContextProtocol.Extensions.Apps 包覆盖 MCP Apps。发布说明还列了更严格的 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 服务器的输入。

有读者在公告下提问:协议是否对 requestState 做了防篡改或跨会话复用的保护?评论区没有出现回复。

团队表示下一步重点是端到端认证与授权。SDK 已在 NuGet 上提供,项目站点有文档,GitHub 上有 2.0、2.1、2.2、2.3 的发布说明。