# Миграция на 2026-07-28

Что изменилось в протоколе и что менять в клиентах и серверах

> Страница сайта MCP Docs — неофициального перевода документации Model Context Protocol (https://mcpdocs.ru/migration/). Тип: Перевод. Основа: Спецификация, «Key Changes» ревизии 2026-07-28 (https://modelcontextprotocol.io/specification/2026-07-28/changelog). Ревизия спецификации 2026-07-28, сверено 05.10.2026.

Ревизия 2026-07-28 — самое значительное изменение протокола MCP на сегодня. Она делает протокол **без состояния**: исчезают сессии и рукопожатие, а версия и возможности клиента путешествуют в каждом запросе. Страница систематизирует и переводит документ «Key Changes» официальной спецификации, опубликованный относительно предыдущей ревизии 2025-11-25.

> **Заметка переводчика.** Ревизия содержит несовместимые изменения. Ничего не меняйте «вслепую»: сначала решите, для какой эпохи ([«Версии и совместимость»](https://mcpdocs.ru/protocol/versions/)) вы пишете клиент или сервер и нужна ли двухэпохная поддержка.

## Главные изменения

| № | Что изменилось | Подробнее |
| --- | --- | --- |
| 1 | Убраны сессии на уровне протокола и заголовок `Mcp-Session-Id` из Streamable HTTP. Перечни `tools/list`, `resources/list`, `prompts/list` больше не зависят от соединения. Серверы, которым нужно состояние между вызовами, используют явные дескрипторы, выданные сервером, как обычные аргументы инструментов. | [ниже](#sessii-i-rukopozhatie) |
| 2 | Протокол без состояния: убрано рукопожатие `initialize` / `notifications/initialized`. Каждый запрос несёт версию протокола и возможности клиента в `_meta`. | [ниже](#sessii-i-rukopozhatie) |
| 3 | Добавлен `server/discover`: серверы ДОЛЖНЫ его реализовать. | [«Обнаружение»](https://mcpdocs.ru/concepts/discovery/) |
| 4 | HTTP GET и `resources/subscribe` / `resources/unsubscribe` заменены на `subscriptions/listen`. | [«Шаблоны обмена»](https://mcpdocs.ru/protocol/patterns/#podpiska-na-izmeneniya-subscriptions-listen) |
| 5 | Удалены `ping`, `logging/setLevel` и `notifications/roots/list_changed`. Уровень журнала теперь задаётся в запросе. | [ниже](#udalennye-metody) |
| 6 | Экспериментальные задачи вынесены из ядра в официальное расширение `io.modelcontextprotocol/tasks`. | [ниже](#zadachi-stali-rasshireniem) |
| 7 | Введён шаблон многошаговых запросов (Multi Round-Trip Requests, MRTR) вместо запросов сервера `roots/list`, `sampling/createMessage` и `elicitation/create`. | [«Шаблоны обмена»](https://mcpdocs.ru/protocol/patterns/#mnogoshagovye-zaprosy-mrtr) |
| 8 | У всех результатов появилось обязательное поле `resultType`. | [«Протокол»](https://mcpdocs.ru/protocol/#otvety) |
| 9 | Убрано возобновление потоков SSE и повторная доставка (заголовок `Last-Event-ID`, идентификаторы событий). | [ниже](#potoki-sse) |

## Сессии и рукопожатие

**Было (2025-11-25 и ранее).** Клиент открывал соединение, отправлял `initialize`, согласовывал версию и возможности, затем присылал `notifications/initialized`. Сервер мог выдать идентификатор сессии в заголовке `Mcp-Session-Id`, и последующие запросы опирались на это состояние.

**Стало (2026-07-28).** Рукопожатия нет. Каждый запрос самодостаточен:

- версия протокола и возможности клиента передаются в `_meta` (`io.modelcontextprotocol/protocolVersion`, `io.modelcontextprotocol/clientCapabilities`);
- клиентам СЛЕДУЕТ указывать себя в каждом запросе (`io.modelcontextprotocol/clientInfo`), а серверам СЛЕДУЕТ указывать себя в `_meta` каждого результата (`io.modelcontextprotocol/serverInfo`);
- несовпадение версий возвращает `UnsupportedProtocolVersionError`.

Пример запроса `tools/list` в новой ревизии:

```json
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/list",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": { "name": "example-client", "version": "1.0.0" },
      "io.modelcontextprotocol/clientCapabilities": { "elicitation": {} }
    }
  }
}
```

По HTTP заголовок `MCP-Protocol-Version` обязателен и ДОЛЖЕН совпадать со значением в `_meta`. Кроме него, появились обязательные заголовки `Mcp-Method` и `Mcp-Name` ([«Транспорты»](https://mcpdocs.ru/protocol/transports/#standartnye-zagolovki-zaprosa)).

> **Заметка переводчика.** «Протокол без состояния» не значит «приложение без состояния». Если инструментам нужно состояние (корзина, транзакция), сервер возвращает явный дескриптор, а модель передаёт его в следующих вызовах ([«Инструменты»](https://mcpdocs.ru/concepts/tools/#instrumenty-s-sostoyaniem)).

## Удалённые методы

Удалены `ping`, `logging/setLevel` и `notifications/roots/list_changed`. Уровень журнала теперь задаётся для каждого запроса ключом `io.modelcontextprotocol/logLevel` в `_meta`. Серверы НЕ ДОЛЖНЫ отправлять `notifications/message` для запросов, где это поле не указано.

## Задачи стали расширением

Экспериментальные задачи вынесены из ядра в официальное расширение `io.modelcontextprotocol/tasks`. Переработанное расширение:

- вместо блокирующего `tasks/result` использует опрос через `tasks/get`;
- добавляет `tasks/update` для передачи входных данных от клиента серверу;
- удаляет `tasks/list`;
- позволяет серверам возвращать дескрипторы задач без запроса.

## Потоки SSE

Убраны возобновление потоков и повторная доставка. Оборванный поток ответа теряет находящийся в обработке запрос: клиенты ДОЛЖНЫ отправить его заново как новый запрос с новым идентификатором. Подробнее: [«Транспорты»](https://mcpdocs.ru/protocol/transports/#poluchenie-soobscheniy-potok-sse).

## Что ещё изменилось

1. В `ClientCapabilities` и `ServerCapabilities` добавлено поле `extensions` для необязательных расширений.
2. Задокументированы соглашения о передаче контекста трассировки OpenTelemetry в `_meta` (`traceparent`, `tracestate`, `baggage`).
3. Серверам СЛЕДУЕТ возвращать инструменты из `tools/list` в детерминированном порядке: это упрощает кэширование и повышает попадание в кэш подсказок модели.
4. Обязательные стандартные заголовки `Mcp-Method` и `Mcp-Name` в POST-запросах Streamable HTTP и поддержка собственных заголовков из параметров инструментов через `x-mcp-header`.
5. Обязательные поля `ttlMs` и `cacheScope` в результатах `tools/list`, `prompts/list`, `resources/list`, `resources/read` и `resources/templates/list` (интерфейс `CacheableResult`). `ttlMs` — подсказка свежести в миллисекундах, `cacheScope` (`"public"` или `"private"`) определяет, могут ли общие посредники кэшировать ответ. Поля дополняют уведомления `listChanged`.
6. Код ошибки «ресурс не найден» изменён с `-32002` на `-32602`.
7. Серверам авторизации СЛЕДУЕТ включать параметр `iss` в ответы авторизации (RFC 9207), а клиенты ДОЛЖНЫ сверять присутствующий `iss` с записанным эмитентом до обмена кода авторизации.
8. Клиенты ДОЛЖНЫ указывать подходящий `application_type` при динамической регистрации клиента, чтобы избежать конфликтов redirect URI в OpenID Connect.
9. Учётные данные клиента привязаны к серверу авторизации, который их выдал: клиенты ДОЛЖНЫ хранить сохранённые данные с ключом по идентификатору эмитента, НЕ ДОЛЖНЫ использовать их с другим сервером авторизации и ДОЛЖНЫ заново регистрироваться при смене сервера авторизации.
10. `inputSchema` и `outputSchema` допускают любые ключевые слова JSON Schema 2020-12, а `structuredContent` любое значение JSON. Добавлены требования к разрешению `$ref` и пределы ресурсов для конструкций композиции.
11. Удалены уведомление `notifications/elicitation/complete` и поле `elicitationId` у запросов элицитации в режиме URL (появились в 2025-11-25).
12. Введена политика распределения кодов ошибок: `-32000…-32019` остаются реализационными, `-32020…-32099` зарезервированы за спецификацией.

## Новые коды ошибок

| Ошибка | Было в черновике | Стало |
| --- | --- | --- |
| `HeaderMismatch` | `-32001` | `-32020` |
| `MissingRequiredClientCapability` | `-32003` | `-32021` |
| `UnsupportedProtocolVersion` | `-32004` | `-32022` |

Ошибка `HeaderMismatchError` добавлена в схему. Подробнее: [«Ошибки»](https://mcpdocs.ru/protocol/errors/).

## Устаревшие возможности

Эти возможности остаются частью спецификации, но их планируют удалить по [политике жизненного цикла функций](https://modelcontextprotocol.io/community/feature-lifecycle). Новым реализациям их принимать НЕ СЛЕДУЕТ. Минимальное окно устаревания — двенадцать месяцев, а все устаревшие функции собраны в [реестре](https://modelcontextprotocol.io/specification/2026-07-28/deprecated).

| Что устарело | Чем заменить |
| --- | --- |
| **Корневые каталоги** (Roots) | Передавать каталоги и файлы параметрами инструментов, URI ресурсов или настройками сервера. |
| **Сэмплинг** (Sampling, запрос ответа у модели клиента) | Интегрироваться напрямую с API поставщиков языковых моделей. |
| **Журналирование** (Logging, передача журналов клиенту) | Писать в `stderr` (stdio) или использовать OpenTelemetry. |
| **Транспорт HTTP+SSE** (устарел с 2025-03-26) | Streamable HTTP. |
| Значения `"thisServer"` и `"allServers"` поля `includeContext` (мягко устарели с 2025-11-25) | Не указывать поле или использовать `"none"`. Значения удалят не позднее самого sampling. |
| **Динамическая регистрация клиента OAuth** (RFC 7591) | [Документы метаданных ID клиента](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration#client-id-metadata-documents). Динамическая регистрация остаётся для совместимости с серверами авторизации, которые их не поддерживают. |

## Что менять по ролям

Сводка составлена по перечню изменений.

**Клиент**

- Добавьте в каждый запрос `protocolVersion` и `clientCapabilities` в `_meta`, а по HTTP заголовки `MCP-Protocol-Version`, `Mcp-Method` и `Mcp-Name`. Кодируйте значения по правилам Base64.
- Если поддерживаете `x-mcp-header`, дублируйте помеченные параметры в `Mcp-Param-*`; инструменты с некорректной пометкой исключайте из перечня.
- Обработайте `UnsupportedProtocolVersionError` и повторяйте запрос с общей версией.
- Для двухэпохной поддержки определите эпоху сервера (пробой `server/discover` на stdio, современным запросом по HTTP) и кэшируйте результат.
- Считайте отсутствие `resultType` значением `"complete"`; обрабатывайте `"input_required"` повтором запроса.
- Подписывайтесь на изменения через `subscriptions/listen`, а не через GET и `resources/subscribe`. Свежесть дополнительно поддерживайте опросом с учётом `ttlMs`.
- Заново отправляйте запрос, если поток SSE оборвался.

**Сервер**

- Реализуйте `server/discover` и перестаньте опираться на состояние соединения и `Mcp-Session-Id`.
- Принимайте версию и возможности из `_meta` каждого запроса, возвращайте `serverInfo` в `_meta` результатов и `resultType` во всех результатах.
- Добавьте `ttlMs` и `cacheScope` в результаты перечней и `resources/read`, держите детерминированный порядок инструментов.
- Проверяйте совпадение заголовков с телом (`HeaderMismatch`, `-32020`), отвечайте `400` на запросы без обязательных полей `_meta`.
- Не посылайте запросы клиенту по потоку: используйте `input_required`. Не отправляйте `notifications/message` без `logLevel` в запросе.
- На запросы старых клиентов: GET и DELETE на конечную точку `405`, `Mcp-Session-Id` и `Last-Event-ID` игнорируйте.
- Для состояния между вызовами используйте явные дескрипторы с авторизацией при каждом вызове.
- Проверьте результат бесплатной [проверкой MCP-сервера](https://mcpprotocol.ru/mcp-check/): если сервер отвечает только по прежней ревизии, она скажет об этом отдельным пунктом.

> **Заметка переводчика.** Перечень по ролям составлен нами из официального списка изменений, он не копирует отдельного раздела спецификации. Для каждого пункта в оригинале есть соответствующий абзац, а проверка совместимости прежних и современных реализаций описана в [«Версиях и совместимости»](https://mcpdocs.ru/protocol/versions/).

## Расхождения в источниках

- В публикациях о ревизии встречается утверждение, что `server/discover` необязателен. В спецификации серверы ДОЛЖНЫ его реализовать, а необязателен лишь его вызов клиентом.
