# MCP C# SDK: установка, версии и редакции протокола

> Официальный C# SDK для MCP - выпуск 2.2.0, пакеты NuGet, редакции протокола, три режима сеансов HTTP-сервера и то, какие из них обслуживают обе эпохи.

Страница: https://mcpdoc.ru/sdk/csharp/
Указатель сайта: https://mcpdoc.ru/llms.txt

C# SDK - официальный набор пакетов NuGet для серверов и клиентов MCP на .NET. Выпуск 2.2.0 понимает обе эпохи протокола. Клиент по умолчанию сначала пробует редакцию 2026-07-28 и сам переходит на рукопожатие `initialize`, если сервер её не поддерживает. HTTP-сервер по умолчанию работает без сеансов и отвечает клиентам обеих эпох, а в режиме `Stateful` запросы 2026-07-28 отклоняет.

сверено с выпуском 2.2.0 4 октября 2026

Совместимость Dual-era работает с обеими эпохами и выбирает по собеседнику

- **Проверенная версия:** 2.2.0, выпуск от 2026-08-13

- **Новейшая поддерживаемая редакция:** 2026-07-28

- **С сервером только Modern:** работает

- **С сервером только Legacy:** работает

- **Переход на старую редакцию:** автоматически

- **Использует устаревшее:** Roots, Sampling, Logging, динамическая регистрация клиента (DCR), транспорт HTTP+SSE

- **Сохраняет удалённое в редакции 2026-07-28:** сессии, рукопожатие initialize

- **Расширение Tasks:** есть

- **Расширение MCP Apps:** частично

- **Проверено:** 2026-10-04

- **Источник:** [github.com](https://github.com/modelcontextprotocol/csharp-sdk/releases/tag/v2.2.0)

## Что это

Это SDK из репозитория [modelcontextprotocol/csharp-sdk](https://github.com/modelcontextprotocol/csharp-sdk/tree/v2.2.0). В [списке официальных SDK](https://modelcontextprotocol.io/docs/sdk) он отнесён к первому уровню (Tier 1). По [README выпуска](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/README.md), 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 выпуска команды установки не содержит и отсылает к [руководству для начинающих](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/concepts/getting-started.md). Команда оттуда:

```bash title="Установка"
dotnet add package ModelContextProtocol
```

Для HTTP-сервера руководство добавляет `dotnet add package ModelContextProtocol.AspNetCore`.

Целевые платформы записаны в [файле проекта](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/src/ModelContextProtocol.Core/ModelContextProtocol.Core.csproj): `ModelContextProtocol` и `ModelContextProtocol.Core` собраны для `net10.0`, `net9.0`, `net8.0` и `netstandard2.0`, а `ModelContextProtocol.AspNetCore` - только для `net10.0`, `net9.0` и `net8.0`.

## Какие редакции понимает выпуск

Списки версий лежат в [`McpProtocolVersions.cs`](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/src/Common/McpProtocolVersions.cs):

- с рукопожатием `initialize`: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25;
- с данными в каждом запросе: 2026-07-28.

Для вас это значит: выпуск умеет говорить и с новыми, и со старыми собеседниками. Но для HTTP-сервера ответ зависит от выбранного режима сеансов, см. ниже. Чем эпохи различаются, описано на странице [о версиях протокола](https://mcpdoc.ru/protocol/versions/).

## Что отправляет клиент по умолчанию

Поведением управляет свойство `McpClientOptions.ProtocolVersion`. По [документу о режимах](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/concepts/stateless/stateless.md):

- **Не задано (по умолчанию).** Клиент сначала пробует 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`.

```csharp title="Клиент без отката на старый порядок"
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` новую редакцию не принимает.

В режиме `Stateful` запрос редакции 2026-07-28 получает ошибку `-32022 UnsupportedProtocolVersion`. Клиент, который умеет обе эпохи, после этого переходит на `initialize` и получает сеанс. Клиент с закреплённой версией 2026-07-28 к такому серверу не подключится.

Что это значит на практике, по тому же документу:

- В `Stateless` заголовок `Mcp-Session-Id` не используется, а адреса `GET` и `DELETE` не подключаются. Старый клиент работает, но без того, что требует сеанса: уведомлений без запроса, подписок на ресурсы, раздельного состояния по клиентам.
- `StatefulForInitializeClients` - режим перехода. Старые клиенты получают полный сеанс, новые обслуживаются по одному запросу на том же адресе.
- Документ советует задавать `SessionMode` явно, чтобы поведение сервера не поменялось вместе со значением по умолчанию.

Этот раздел документа описывает HTTP. Как выбирается эпоха у сервера на stdio, документ о режимах отдельно не описывает.

```csharp title="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()`.

```csharp title="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. По [документу о задачах](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/concepts/tasks/tasks.md), пакет требует редакцию 2026-07-28 или новее и следует SEP-2663. Он заменяет опытную реализацию задач, которая появилась в 1.3.0.

**MCP Apps.** Есть в отдельном пакете `ModelContextProtocol.Extensions.Apps` 2.2.0, но в статусе опытной поддержки. По [документу об Apps](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/concepts/apps/apps.md), все типы помечены `[Experimental("MCPEXP003")]`, и для их использования это предупреждение нужно отключить явно.

Что такое расширения и как о них договариваются стороны - на странице [о расширениях](https://mcpdoc.ru/protocol/extensions/).

## Устаревшее, что выпуск ещё содержит

Устаревшие части помечены диагностиками компилятора. Их список - в [перечне диагностик](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/list-of-diagnostics.md).

| Что | Состояние в 2.2.0 | Диагностика |
|---|---|---|
| Roots, Sampling, Logging | доступны, помечены устаревшими | `MCP9005` |
| HTTP+SSE: адреса `/sse` и `/message` | выключены по умолчанию, включаются свойством `EnableLegacySse` | `MCP9004` |
| настройки сеансов: `IdleTimeout`, `MaxIdleSessionCount`, `EventStreamStore`, `SessionMigrationHandler`, `PerSessionExecutionContext` | действуют только для клиентов с `initialize` | `MCP9006` |

По документу о режимах, обновление пакета сервера без обновления клиентов разорвёт соединения по HTTP+SSE: адреса `/sse` и `/message` теперь выключены по умолчанию. Клиенту нужно сменить адрес на тот, который сервер передаёт в `MapMcp()`.

Типы для динамической регистрации клиента в выпуске есть. Несут ли они пометку об устаревании, неизвестно. Общий список устаревшего в протоколе - на странице [об устаревших возможностях](https://mcpdoc.ru/protocol/deprecations/).

## Выпуск и ветка main

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

## Что неизвестно

- Срок поддержки ветки 1.x (последний выпуск 1.4.1) не назван. [Правила версий](https://github.com/modelcontextprotocol/csharp-sdk/blob/v2.2.0/docs/versioning.md) говорят только, что критичные ошибки исправляются и в одной предыдущей основной версии.
- Несут ли типы динамической регистрации клиента пометку об устаревании: поиск по исходникам выпуска такой пометки не нашёл.
- Как сервер на stdio выбирает эпоху: в документации выпуска отдельного описания не найдено.
- Содержимое опубликованных пакетов NuGet отдельно не распаковывалось: сверялись исходники по метке выпуска и данные реестра.

## Что читать дальше

- [Все официальные SDK](https://mcpdoc.ru/sdk/)
- [Работа без сеансов](https://mcpdoc.ru/protocol/stateless/)
- [Сервер двух эпох](https://mcpdoc.ru/deployment/dual-era/)
- [Развёртывание на Windows](https://mcpdoc.ru/deployment/windows/)
