Microsoft 宣布发布适用于 C# 的官方 MCP 软件开发包 2.0 版,并同步实施 2026-07-28 规范。该版本改变了 MCP 服务器通过 HTTP 的运行方式,默认将其设为无状态,新增统一的 HTTP 标头,并支持多轮请求,使工具能够在不依赖持久会话的情况下请求用户或语言模型提供输入。
该版本面向在 .NET 上构建 MCP 服务器和客户端的开发者,同时保持 1.x 版稳定 API 的正常运行,并支持 net8.0、net9.0 和 net10.0 框架,此外还支持用于 .NET Framework 的 netstandard2.0。
默认无状态的服务器
在之前的版本中,使用 Streamable HTTP 需要完成初始化握手并创建会话,然后在每个后续请求中发送 Mcp-Session-Id 标头。这会将请求绑定到生成该标识符的服务器实例,因此在运行多个实例时需要固定路由或会话迁移。
2026-07-28 规范取消了 initialize 和 initialized 握手以及 Mcp-Session-Id 标头,并将协议版本和能力包含在每个请求中。因此,任何服务器实例都可以处理任何请求,无需固定会话或协议层面的共享会话存储。这使得在无服务器、多实例或边缘环境中部署 MCP 服务器,更接近于在负载均衡器后运行普通 ASP.NET Core 应用程序。
在 2.0 版中,HttpServerTransportOptions.Stateless 选项默认设置为 true;如果需要服务器向客户端发送未经请求的消息,或需要与会话关联的传输状态,也可以启用有状态模式。会话仍然可用,但不再是基本设置。
用于路由和监控的 HTTP 标头
无状态模式将 MCP 请求转换为自包含的 HTTP POST 请求,使常规基础设施能够像处理任何其他 HTTP 流量一样处理它。该规范支持 Mcp-Method 和 Mcp-Name 等标头,同时允许将某些工具参数提升为 Mcp-Param-* 形式的标头。
负载均衡器、代理、网关或 Web 应用程序防火墙可以使用这些标头进行路由和监控,而无需解析 JSON-RPC 请求正文。请求正文仍是可信来源;如果标头值与正文中的值不同,服务器将以 HeaderMismatch 错误拒绝请求。该设计还支持使用 Base64 指示符对标头中不支持的值(例如非 ASCII 值)进行编码。
面向交互式工具的多轮请求
多轮往返请求(Multi Round-Trip Requests,MRTR)功能新增了一种处理无法在单次调用中完成工作的工具的方法。服务器不会在请求执行期间通过实时会话连接客户端,而是返回一种 InputRequiredResult 类型的结果,其中包含输入请求以及名为 requestState 的不透明状态。
客户端执行所需操作,例如请求用户确认、调用语言模型或显示工作区根目录,然后重新发送同一个工具调用,并附带 inputResponses 和 requestState。该过程可以进行多轮,而持续性信息在负载中传递,因此操作不需要会话。
注册相应处理程序后,高级 McpClient 会自动处理 MRTR。在存在有状态会话时,该版本还能够使用与旧版客户端的兼容桥接。无会话运行的旧版客户端无法执行多轮交互,因此工具必须提供替代路径,例如直接在调用参数中传递所需值。
兼容性和可用软件包
稳定且未弃用的 1.x API 在 2.0 中仍可编译和运行,而弃用变更会以警告形式出现,而不是直接删除。2.0 客户端连接旧版服务器时可以使用旧的初始化握手,2.0 服务器也接受旧版客户端发起的该握手。
协议兼容性唯一的例外是 Tasks 扩展;其在 2.0 中重新设计的方案取代了 2025-11-25 规范中存在的实验性 Tasks,在接口或协议层面均不兼容。Tasks 现已包含在独立的软件包 ModelContextProtocol.Extensions.Tasks 中,而实验性的 MCP Apps 则包含在 ModelContextProtocol.Extensions.Apps 中。
核心软件包包括用于客户端和低级组件的 ModelContextProtocol.Core、用于大多数服务器的 ModelContextProtocol,以及用于 Streamable HTTP 服务器的 ModelContextProtocol.AspNetCore。文章指出,2.x 系列接下来的重点将是全面的身份验证与授权,并以更紧密地兼容 OAuth 和 OpenID Connect 为基础。