C# SDK
Официальный C# SDK для MCP - выпуск 2.2.0, пакеты NuGet, редакции протокола, три режима сеансов HTTP-сервера и то, какие из них обслуживают обе эпохи.
сверено с выпуском 2.2.0 4 октября 2026
Что это
Заголовок раздела «Что это»Это SDK из репозитория modelcontextprotocol/csharp-sdk. В списке официальных SDK он отнесён к первому уровню (Tier 1). По README выпуска, SDK позволяет приложениям .NET быть и клиентом, и сервером MCP.
Пакеты выпуска 2.2.0:
| Пакет | Для чего |
|---|---|
ModelContextProtocol.Core | клиент и низкоуровневый сервер с наименьшим числом зависимостей |
ModelContextProtocol | основной пакет: размещение, внедрение зависимостей, поиск инструментов по атрибутам; сервер на stdio |
ModelContextProtocol.AspNetCore | HTTP-сервер в ASP.NET Core |
ModelContextProtocol.Extensions.Tasks | расширение Tasks |
ModelContextProtocol.Extensions.Apps | расширение MCP Apps |
Установка и среда
Заголовок раздела «Установка и среда»README выпуска команды установки не содержит и отсылает к руководству для начинающих. Команда оттуда:
dotnet add package ModelContextProtocolДля HTTP-сервера руководство добавляет dotnet add package ModelContextProtocol.AspNetCore.
Целевые платформы записаны в файле проекта: ModelContextProtocol и ModelContextProtocol.Core собраны для net10.0, net9.0, net8.0 и netstandard2.0, а ModelContextProtocol.AspNetCore - только для net10.0, net9.0 и net8.0.
Какие редакции понимает выпуск
Заголовок раздела «Какие редакции понимает выпуск»Списки версий лежат в McpProtocolVersions.cs:
- с рукопожатием
initialize: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25; - с данными в каждом запросе: 2026-07-28.
Для вас это значит: выпуск умеет говорить и с новыми, и со старыми собеседниками. Но для HTTP-сервера ответ зависит от выбранного режима сеансов, см. ниже. Чем эпохи различаются, описано на странице о версиях протокола.
Что отправляет клиент по умолчанию
Заголовок раздела «Что отправляет клиент по умолчанию»Поведением управляет свойство McpClientOptions.ProtocolVersion. По документу о режимах:
- Не задано (по умолчанию). Клиент сначала пробует 2026-07-28 и при отказе переходит на
initialize.- HTTP: первый запрос уходит с заголовком
MCP-Protocol-Version: 2026-07-28. Если сервер отвечает HTTP 400 и это не структурированная ошибка-32022,-32021или-32020, клиент переходит наinitializeна том же адресе. - stdio: клиент отправляет пробный
server/discoverи ждёт 5 секунд. ОтветDiscoverResultподтверждает 2026-07-28. Ошибка-32022со списком версий ведёт к повтору на самой новой общей версии с рукопожатием. Всё остальное, включая истечение времени, ведёт кinitializeв том же процессе сервера. Процесс сервера заново не запускается.
- HTTP: первый запрос уходит с заголовком
- Закреплено
"2026-07-28". Клиент не откатывается: если сервер не поддерживает эту редакцию, подключение завершается исключениемMcpException.
var clientOptions = new McpClientOptions{ ProtocolVersion = "2026-07-28",};Пример взят из документации выпуска 2.2.0 и здесь не запускался.
Выбранная эпоха запоминается для экземпляра транспорта, поэтому пробный запрос оплачивается только при первом подключении.
Что принимает сервер: три режима
Заголовок раздела «Что принимает сервер: три режима»У HTTP-сервера есть настройка HttpServerTransportOptions.SessionMode. От неё зависит, какие эпохи сервер обслуживает.
| Режим | Клиент 2026-07-28 | Клиент с initialize |
|---|---|---|
Stateless (по умолчанию) | обслуживается | обслуживается, но без сеанса |
Stateful | отклоняется с ошибкой -32022 | обслуживается с сеансом |
StatefulForInitializeClients | обслуживается без сеанса | обслуживается с сеансом |
Обе эпохи обслуживают Stateless и StatefulForInitializeClients. Режим Stateful новую редакцию не принимает.
Что это значит на практике, по тому же документу:
- В
StatelessзаголовокMcp-Session-Idне используется, а адресаGETиDELETEне подключаются. Старый клиент работает, но без того, что требует сеанса: уведомлений без запроса, подписок на ресурсы, раздельного состояния по клиентам. StatefulForInitializeClients- режим перехода. Старые клиенты получают полный сеанс, новые обслуживаются по одному запросу на том же адресе.- Документ советует задавать
SessionModeявно, чтобы поведение сервера не поменялось вместе со значением по умолчанию.
Этот раздел документа описывает HTTP. Как выбирается эпоха у сервера на stdio, документ о режимах отдельно не описывает.
using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using ModelContextProtocol.Server;using System.ComponentModel;
var builder = Host.CreateApplicationBuilder(args);builder.Logging.AddConsole(consoleLogOptions =>{ // Configure all logs to go to stderr consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;});builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly();await builder.Build().RunAsync();
[McpServerToolType]public static class EchoTool{ [McpServerTool, Description("Echoes the message back to the client.")] public static string Echo(string message) => $"hello {message}";}Пример взят из документации выпуска 2.2.0 и здесь не запускался.
Для этого примера руководство ставит ещё пакет Microsoft.Extensions.Hosting. HTTP-сервер по руководству собирается так же, но через WithHttpTransport(...) и app.MapMcp().
using ModelContextProtocol.Client;using ModelContextProtocol.Protocol;
var clientTransport = new StdioClientTransport(new StdioClientTransportOptions{ Name = "Everything", Command = "npx", Arguments = ["-y", "@modelcontextprotocol/server-everything"],});
var client = await McpClient.CreateAsync(clientTransport);
// Print the list of tools available from the server.foreach (var tool in await client.ListToolsAsync()){ Console.WriteLine($"{tool.Name} ({tool.Description})");}Пример взят из документации выпуска 2.2.0 и здесь не запускался.
Расширения
Заголовок раздела «Расширения»Tasks. Реализовано в отдельном пакете ModelContextProtocol.Extensions.Tasks 2.2.0. По документу о задачах, пакет требует редакцию 2026-07-28 или новее и следует SEP-2663. Он заменяет опытную реализацию задач, которая появилась в 1.3.0.
MCP Apps. Есть в отдельном пакете ModelContextProtocol.Extensions.Apps 2.2.0, но в статусе опытной поддержки. По документу об Apps, все типы помечены [Experimental("MCPEXP003")], и для их использования это предупреждение нужно отключить явно.
Что такое расширения и как о них договариваются стороны - на странице о расширениях.
Устаревшее, что выпуск ещё содержит
Заголовок раздела «Устаревшее, что выпуск ещё содержит»Устаревшие части помечены диагностиками компилятора. Их список - в перечне диагностик.
| Что | Состояние в 2.2.0 | Диагностика |
|---|---|---|
| Roots, Sampling, Logging | доступны, помечены устаревшими | MCP9005 |
HTTP+SSE: адреса /sse и /message | выключены по умолчанию, включаются свойством EnableLegacySse | MCP9004 |
настройки сеансов: IdleTimeout, MaxIdleSessionCount, EventStreamStore, SessionMigrationHandler, PerSessionExecutionContext | действуют только для клиентов с initialize | MCP9006 |
Типы для динамической регистрации клиента в выпуске есть. Несут ли они пометку об устаревании, неизвестно. Общий список устаревшего в протоколе - на странице об устаревших возможностях.
Выпуск и ветка main
Заголовок раздела «Выпуск и ветка main»На 4 октября 2026 ветка main опережает метку v2.2.0 на восемь изменений. Константы версий протокола совпадают с выпуском. Среди невыпущенных изменений есть исправления пути отката клиента на старый порядок и проверки данных старых запросов. В выпуске 2.2.0 этих исправлений нет. Пробных выпусков новее 2.2.0 на NuGet нет.
Что неизвестно
Заголовок раздела «Что неизвестно»- Срок поддержки ветки 1.x (последний выпуск 1.4.1) не назван. Правила версий говорят только, что критичные ошибки исправляются и в одной предыдущей основной версии.
- Несут ли типы динамической регистрации клиента пометку об устаревании: поиск по исходникам выпуска такой пометки не нашёл.
- Как сервер на stdio выбирает эпоху: в документации выпуска отдельного описания не найдено.
- Содержимое опубликованных пакетов NuGet отдельно не распаковывалось: сверялись исходники по метке выпуска и данные реестра.