Начало / Миграция на 2026-07-28
Миграция на 2026-07-28
Что изменилось в протоколе и что менять в клиентах и серверах
Ревизия 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 в новой ревизии:
{
"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#
Убраны возобновление потоков и повторная доставка. Оборванный поток ответа теряет находящийся в обработке запрос: клиенты ДОЛЖНЫ отправить его заново как новый запрос с новым идентификатором. Подробнее: «Транспорты».
Что ещё изменилось#
- В
ClientCapabilitiesиServerCapabilitiesдобавлено полеextensionsдля необязательных расширений. - Задокументированы соглашения о передаче контекста трассировки OpenTelemetry в
_meta(traceparent,tracestate,baggage). - Серверам СЛЕДУЕТ возвращать инструменты из
tools/listв детерминированном порядке: это упрощает кэширование и повышает попадание в кэш подсказок модели. - Обязательные стандартные заголовки
Mcp-MethodиMcp-Nameв POST-запросах Streamable HTTP и поддержка собственных заголовков из параметров инструментов черезx-mcp-header. - Обязательные поля
ttlMsиcacheScopeв результатахtools/list,prompts/list,resources/list,resources/readиresources/templates/list(интерфейсCacheableResult).ttlMs— подсказка свежести в миллисекундах,cacheScope("public"или"private") определяет, могут ли общие посредники кэшировать ответ. Поля дополняют уведомленияlistChanged. - Код ошибки «ресурс не найден» изменён с
-32002на-32602. - Серверам авторизации СЛЕДУЕТ включать параметр
issв ответы авторизации (RFC 9207), а клиенты ДОЛЖНЫ сверять присутствующийissс записанным эмитентом до обмена кода авторизации. - Клиенты ДОЛЖНЫ указывать подходящий
application_typeпри динамической регистрации клиента, чтобы избежать конфликтов redirect URI в OpenID Connect. - Учётные данные клиента привязаны к серверу авторизации, который их выдал: клиенты ДОЛЖНЫ хранить сохранённые данные с ключом по идентификатору эмитента, НЕ ДОЛЖНЫ использовать их с другим сервером авторизации и ДОЛЖНЫ заново регистрироваться при смене сервера авторизации.
inputSchemaиoutputSchemaдопускают любые ключевые слова JSON Schema 2020-12, аstructuredContentлюбое значение JSON. Добавлены требования к разрешению$refи пределы ресурсов для конструкций композиции.- Удалены уведомление
notifications/elicitation/completeи полеelicitationIdу запросов элицитации в режиме URL (появились в 2025-11-25). - Введена политика распределения кодов ошибок:
-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необязателен. В спецификации серверы ДОЛЖНЫ его реализовать, а необязателен лишь его вызов клиентом.