Перейти к содержимому
Выберите тему

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 в том же процессе сервера. Процесс сервера заново не запускается.
  • Закреплено "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, документ о режимах отдельно не описывает.

Program.cs: сервер на 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().

Program.cs: клиент
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

Типы для динамической регистрации клиента в выпуске есть. Несут ли они пометку об устаревании, неизвестно. Общий список устаревшего в протоколе - на странице об устаревших возможностях.

На 4 октября 2026 ветка main опережает метку v2.2.0 на восемь изменений. Константы версий протокола совпадают с выпуском. Среди невыпущенных изменений есть исправления пути отката клиента на старый порядок и проверки данных старых запросов. В выпуске 2.2.0 этих исправлений нет. Пробных выпусков новее 2.2.0 на NuGet нет.

  • Срок поддержки ветки 1.x (последний выпуск 1.4.1) не назван. Правила версий говорят только, что критичные ошибки исправляются и в одной предыдущей основной версии.
  • Несут ли типы динамической регистрации клиента пометку об устаревании: поиск по исходникам выпуска такой пометки не нашёл.
  • Как сервер на stdio выбирает эпоху: в документации выпуска отдельного описания не найдено.
  • Содержимое опубликованных пакетов NuGet отдельно не распаковывалось: сверялись исходники по метке выпуска и данные реестра.