MCP 2026-07-28 вышла финалом: сессий больше нет, initialize нет, -32002 стал -32602
В мае мы писали про release candidate и обещали вернуться, когда спека выйдет финалом. Она вышла 28 июля. Сессий больше нет, рукопожатия initialize нет, код ошибки поменялся, а три фичи уехали в депрекейт с часами обратного отсчёта на год.
TL;DR: Спецификация MCP 2026-07-28 опубликована финалом 28 июля и заменила 2025-11-25. Ломающих изменений два: пропали протокольные сессии с заголовком
Mcp-Session-Idи пропал handshakeinitialize. Roots, Sampling и Logging депрекейтнуты с минимальным окном в 12 месяцев,-32002заменился на стандартный-32602. Между RC и финалом добавилось обязательное полеresultTypeв каждом результате. Все четыре Tier 1 SDK заговорили на новой версии в день публикации, старые серверы продолжают работать.
Что изменилось в MCP 2026-07-28
Главное изменение — протокол стал stateless на уровне спецификации. Раньше клиент открывал соединение рукопожатием initialize, получал Mcp-Session-Id и таскал его в каждом следующем запросе. Это заставляло делать sticky routing: запросы обязаны были попадать на тот же инстанс, за которым стояло общее хранилище сессий, а на гейтвее приходилось разбирать пакеты, чтобы понять, куда роутить.
Теперь ничего этого нет. Удалённый MCP-сервер живёт за обычным round-robin балансировщиком, трафик маршрутизируется по заголовку Mcp-Method, а клиент кеширует ответы tools/list ровно столько, сколько разрешает ttlMs сервера. Официальный анонс вышел вместе с SDK, так что писать клиенты и серверы под новую версию можно с первого дня.
Release candidate зафиксировали 21 мая, дальше было десять недель валидации силами мейнтейнеров SDK и авторов клиентов. Версии MCP датируются днём, когда в них последний раз вносили обратно несовместимые изменения, поэтому 2026-07-28 — это номер версии, а не «дата, с которой всё сломается».
Что именно ломается
Ломающих изменений ровно два, и оба про состояние.
Сессии и Mcp-Session-Id (SEP-2567). Выкидывайте общие session store. Если серверу нужно состояние между вызовами, он теперь выпускает явный handle и передаёт его как обычный аргумент инструмента. Это чуть многословнее в схеме и заметно проще в эксплуатации: состояние стало данными, а не свойством транспорта.
Рукопожатие initialize (SEP-2575). Версия протокола и capabilities теперь читаются из _meta в каждом запросе. Дополнительно появился RPC server/discover, которым клиент заранее узнаёт, какие версии и возможности сервер поддерживает. Новые клиенты, встретив сервер на старой версии, откатываются на прежний handshake — так что рвётся не всё сразу.
Ещё одна мелочь, на которой споткнутся те, кто хардкодил коды: ошибка «resource not found» переехала с кастомного -32002 на стандартный JSON-RPC -32602 (Invalid Params). Если у вас в клиенте if (code === -32002), это надо править руками, потому что молча оно просто перестанет ловиться.
Плюс полностью поддержана JSON Schema 2020-12.
Что добавилось между RC и финалом
Одно изменение, о котором не знали те, кто мигрировал по майскому RC: каждый результат теперь обязан нести поле resultType. Значения — "complete" для обычного результата и "input_required" для промежуточных результатов Multi Round-Trip. Результаты от серверов на более ранних версиях протокола считаются complete по умолчанию (SEP-2322).
Если вы писали клиент по release candidate и не следили за изменениями последних недель, это первое место, куда стоит посмотреть.
Что депрекейтнуто и сколько у вас времени
Roots, Sampling и Logging помечены как deprecated. Появилась формальная Feature Lifecycle Policy: Active → Deprecated → Removed, минимум по 12 месяцев на каждой стадии. То есть самая ранняя дата, когда что-то из депрекейтнутого может физически исчезнуть, — 28 июля 2027 года.
Экспериментальный Tasks переехал в extension и поменял модель работы: вместо блокирующего tasks/result теперь polling. Если вы им пользовались, менять придётся не вызов, а логику ожидания.
Появился Extensions Framework: новые возможности сначала выходят опциональными расширениями и только потом (если вообще) вкладываются в ядро. MCP Apps, которые с января жили как первое официальное расширение, теперь формально описаны этой рамкой. И третье: Standards Track SEP не может дойти до статуса Final, пока в conformance suite не появится соответствующий сценарий.
Стоит ли мигрировать прямо сейчас
Публикация 28 июля ничего не выключила. Серверы и клиенты на 2025-11-25 работают, депрекейтнутое живёт минимум год, никакого рубильника нет. Но новые клиенты и реестры с этого момента сверяются с новой версией, так что откладывать на год тоже плохая идея.
Все четыре Tier 1 SDK — TypeScript, Python, Go и C# — говорят на 2026-07-28 в день публикации, с заметками по миграции для ломающих частей. Anthropic в тот же день объявила, что поддержка раскатывается по продуктам Claude: MCP Apps и Tasks приезжают как versioned extensions, авторизация выравнивается под корпоративные системы идентификации вроде Entra и Okta. В каталоге коннекторов Anthropic сейчас больше 950 записей, так что путь обновления для авторов серверов вполне конкретный, а не теоретический.
Подводные камни
Локальные stdio-серверы это почти не трогает, а вот удалённые трогает сильно. Если у вас MCP-сервер как локальный подпроцесс, вы, скорее всего, заметите только смену кода ошибки. Вся боль stateless-перехода достаётся тем, кто держит remote-сервер с состоянием.
«Состояние в аргументах» — новый способ выстрелить себе в ногу. Раньше session id жил в заголовке и в логи транспорта попадал предсказуемо. Теперь handle — обычный аргумент инструмента, и он поедет в трейсы, в логи модели и в историю диалога. Если handle несёт что-то чувствительное, это надо явно продумать.
Кеширование tools/list меняет поведение при деплое. Клиент имеет право держать список инструментов до истечения ttlMs. Выкатили новый инструмент — часть клиентов его не увидит, пока кеш не протухнет. Ставьте ttlMs осознанно, а не «побольше, чтоб быстрее».
Хардкод -32002 не даст ошибки компиляции. Он просто перестанет срабатывать, и обработка «ресурс не найден» тихо провалится в общую ветку. Это худший тип ломающего изменения: не падает, а меняет поведение.
Depreciation-окно в 12 месяцев — это минимум, а не обещание. Roots, Sampling и Logging останутся в спеке минимум до июля 2027, но новые фичи в них уже не поедут. Строить новое поверх депрекейтнутого — гарантированная миграция через год.
Альтернативы
Остаться на 2025-11-25 — работает, ничего не выключено, но новые клиенты и реестры сверяются с новой версией, и любая фича из extensions framework вам недоступна.
A2A от Google — протокол для общения агентов между собой, а не агента с инструментами. Решает соседнюю задачу и с MCP не конкурирует, скорее дополняет.
Собственный HTTP API с function calling — меньше абстракций и полный контроль, но вы теряете каталоги коннекторов, готовые SDK и совместимость с чужими клиентами. При двух-трёх инструментах это разумно, при двадцати — нет.
Вердикт
Открывайте ветку и обновляйте SDK на этой неделе, даже если катить не собираетесь: миграция в основном механическая, а найти свои хардкоды -32002 и Mcp-Session-Id лучше в спокойном режиме, чем когда клиент обновится сам. Если у вас удалённый сервер со сложным состоянием, закладывайте на переделку больше времени, чем кажется: убрать session store — это не правка конфига, а пересмотр того, где вообще у вас живёт состояние. А вот новые фичи поверх Roots, Sampling и Logging начинать не надо: год кажется большим сроком ровно до того момента, когда он кончается.
Как мигрировать
- Обновите SDK до версии, которая объявляет
2026-07-28, в отдельной ветке. Пакеты для TypeScript, Python, Go и C# лежат в организации modelcontextprotocol. - Прогрепайте код на
Mcp-Session-Id,initialize,-32002,roots/,sampling/иlogging/. Это ваш полный список работ. - Уберите session store: каждое состояние, которое жило в сессии, превратите в явный handle и добавьте его в схему соответствующего инструмента.
- Замените чтение версии протокола на разбор
_metaв каждом запросе и реализуйтеserver/discover. - Добавьте
resultTypeво все результаты и прогоните сервер против conformance suite — она же используется для оценки официальных SDK по новой системе тиров.