> · · 7 мин

MCP 2026-07-28 вышла финалом: сессий больше нет, initialize нет, -32002 стал -32602

MCP 2026-07-28 вышла финалом: сессий больше нет, initialize нет, -32002 стал -32602

В мае мы писали про release candidate и обещали вернуться, когда спека выйдет финалом. Она вышла 28 июля. Сессий больше нет, рукопожатия initialize нет, код ошибки поменялся, а три фичи уехали в депрекейт с часами обратного отсчёта на год.

TL;DR: Спецификация MCP 2026-07-28 опубликована финалом 28 июля и заменила 2025-11-25. Ломающих изменений два: пропали протокольные сессии с заголовком Mcp-Session-Id и пропал handshake initialize. 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 начинать не надо: год кажется большим сроком ровно до того момента, когда он кончается.

Как мигрировать

  1. Обновите SDK до версии, которая объявляет 2026-07-28, в отдельной ветке. Пакеты для TypeScript, Python, Go и C# лежат в организации modelcontextprotocol.
  2. Прогрепайте код на Mcp-Session-Id, initialize, -32002, roots/, sampling/ и logging/. Это ваш полный список работ.
  3. Уберите session store: каждое состояние, которое жило в сессии, превратите в явный handle и добавьте его в схему соответствующего инструмента.
  4. Замените чтение версии протокола на разбор _meta в каждом запросе и реализуйте server/discover.
  5. Добавьте resultType во все результаты и прогоните сервер против conformance suite — она же используется для оценки официальных SDK по новой системе тиров.
$ ls ./related/

Похожие статьи

reward-hacking-in-the-wild.md
3607 случаев, когда агент сделал не то: главная угроза оказалась не бэкдорами, а услужливостью
> · 7 мин

3607 случаев, когда агент сделал не то: главная угроза оказалась не бэкдорами, а услужливостью

Открытый корпус Reward Hacking in the Wild собрал 3607 пользовательских жалоб на поведение AI-агентов и разметил их по 14 категориям. Скрытые бэкдоры — 0,4%, порча тестов — 1,2%, а избыточная инициатива — 43,4%. Что из этого следует для тех, кто даёт агентам права на запись.

ai agents llm research
kimi-k3-redis-zero-days.md
Иди проверь версию Redis: майский патч не спасает, PoC уже в открытом гите. А дыры нашёл рой агентов на Kimi K3
> · 8 мин

Иди проверь версию Redis: майский патч не спасает, PoC уже в открытом гите. А дыры нашёл рой агентов на Kimi K3

23 июля Redis выпустил семь релизов безопасности после публикации рабочих RCE-цепочек против стоковых 6.2.22, 7.4.9, 8.6.4 и 8.8.0. Майские «безопасные» версии пробиты, CVE на новые баги нет, поэтому сканеры молчат. Что проверить прямо сейчас и почему релиз-ноты 8.6.4 вводят в заблуждение.

ai llm security redis
claude-opus-5-real-price.md
Claude Opus 5: «вдвое дешевле» — это не про твой счёт. Цена та же, что у Opus 4.8, а изменилась цензура
> · 8 мин

Claude Opus 5: «вдвое дешевле» — это не про твой счёт. Цена та же, что у Opus 4.8, а изменилась цензура

Anthropic выпустила Claude Opus 5 24 июля: 43,3% на Frontier-Bench против 33,7% у Fable 5. Но цена осталась ровно как у Opus 4.8 — $5/$25. Разбираем, где реальная экономия, почему кибер-классификаторы теперь срабатывают на 85% реже и что не так со сноской под главным бенчмарком.

ai agents llm claude
subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe