MCP Docs ревизия 2026-07-28

Начало / Миграция на 2026-07-28

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

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

ПереводОснова: Спецификация, «Key Changes» ревизии 2026-07-28Сверено 05.10.2026, ревизия 2026-07-28Открыть .md

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

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

№ Что изменилось Подробнее
1 Убраны сессии на уровне протокола и заголовок Mcp-Session-Id из Streamable HTTP. Перечни tools/list, resources/list, prompts/list больше не зависят от соединения. Серверы, которым нужно состояние между вызовами, используют явные дескрипторы, выданные сервером, как обычные аргументы инструментов. ниже
2 Протокол без состояния: убрано рукопожатие initialize / notifications/initialized. Каждый запрос несёт версию протокола и возможности клиента в _meta. ниже
3 Добавлен server/discover: серверы ДОЛЖНЫ его реализовать. «Обнаружение»
4 HTTP GET и resources/subscribe / resources/unsubscribe заменены на subscriptions/listen. «Шаблоны обмена»
5 Удалены ping, logging/setLevel и notifications/roots/list_changed. Уровень журнала теперь задаётся в запросе. ниже
6 Экспериментальные задачи вынесены из ядра в официальное расширение io.modelcontextprotocol/tasks. ниже
7 Введён шаблон многошаговых запросов (Multi Round-Trip Requests, MRTR) вместо запросов сервера roots/list, sampling/createMessage и elicitation/create. «Шаблоны обмена»
8 У всех результатов появилось обязательное поле resultType. «Протокол»
9 Убрано возобновление потоков SSE и повторная доставка (заголовок Last-Event-ID, идентификаторы событий). ниже

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

Было (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 («Транспорты»).

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

Удалены 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#

Убраны возобновление потоков и повторная доставка. Оборванный поток ответа теряет находящийся в обработке запрос: клиенты ДОЛЖНЫ отправить его заново как новый запрос с новым идентификатором. Подробнее: «Транспорты».

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

  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 добавлена в схему. Подробнее: «Ошибки».

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

Эти возможности остаются частью спецификации, но их планируют удалить по политике жизненного цикла функций. Новым реализациям их принимать НЕ СЛЕДУЕТ. Минимальное окно устаревания — двенадцать месяцев, а все устаревшие функции собраны в реестре.

Что устарело Чем заменить
Корневые каталоги (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 клиента. Динамическая регистрация остаётся для совместимости с серверами авторизации, которые их не поддерживают.

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

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

Клиент

  • Добавьте в каждый запрос 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-сервера: если сервер отвечает только по прежней ревизии, она скажет об этом отдельным пунктом.

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

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