InfoQ подробно разобрал MCP C# SDK 2.0 — официальную реализацию Model Context Protocol для .NET. Сам релиз 2.0 вышел раньше (с августа по октябрь уже были 2.1–2.3), но изменения затрагивают любого, кто пишет MCP-серверы на .NET.
Главное
- Реализована ревизия спецификации MCP от 2026-07-28.
- HTTP без состояния по умолчанию (
HttpServerTransportOptions.Stateless = true): рукопожатиеinitializeи заголовокMcp-Session-Idбольше не используются. Клиенты сначала вызываютserver/discover, а со старыми серверами откатываются к прежней схеме. - Вызовы инструментов несут заголовки
Mcp-MethodиMcp-Name; атрибут[McpHeader]превращает параметры в заголовкиMcp-Param-*— удобно для маршрутизации на прокси. - Multi Round-Trip Requests: вместо запросов сервера к клиенту посреди вызова инструмент бросает
InputRequiredException, а клиент повторяет вызов сinputResponses.
Ломающие изменения
- Серверам, которым нужны сессии, — явно выставить
Stateless = false. - Tasks вынесены в пакет
ModelContextProtocol.Extensions.Tasks. - Строже OAuth: проверка issuer по RFC 9207 и обязательный PKCE S256.
- API roots, sampling и logging помечены устаревшими.
Перед обновлением прогоните интеграционные тесты: долгие обработчики без промежуточных сообщений теперь могут упираться в таймауты.
InfoQ took a detailed look at MCP C# SDK 2.0, the official Model Context Protocol implementation for .NET. The 2.0 release itself came earlier (2.1–2.3 shipped between August and October), but the changes affect anyone writing MCP servers on .NET.
Highlights
- Implements the MCP spec revision dated 2026-07-28.
- Stateless HTTP by default (
HttpServerTransportOptions.Stateless = true): theinitializehandshake andMcp-Session-Idheader are gone. Clients callserver/discoverfirst and fall back to the old flow for older servers. - Tool calls carry
Mcp-MethodandMcp-Nameheaders; the[McpHeader]attribute turns parameters intoMcp-Param-*headers — handy for proxy routing. - Multi Round-Trip Requests: instead of server-to-client requests mid-call, a tool throws
InputRequiredExceptionand the client retries the call withinputResponses.
Breaking changes
- Servers that need sessions must set
Stateless = falseexplicitly. - Tasks moved to the
ModelContextProtocol.Extensions.Taskspackage. - Stricter OAuth: RFC 9207 issuer validation and mandatory PKCE S256.
- The roots, sampling and logging APIs are deprecated.
Run integration tests before upgrading: long-running handlers that send nothing may now hit timeouts.