Редакции и версии протокола
Какие редакции MCP существуют, что значат Modern, Legacy и Dual-era, как клиент и сервер договариваются о версии в редакции 2026-07-28
сверено со спецификацией 4 октября 2026
Редакции
Заголовок раздела «Редакции»В репозитории спецификации опубликованы пять редакций и черновик следующей.
| Редакция | Эпоха | Заметное |
|---|---|---|
2024-11-05 |
Legacy | самая ранняя из опубликованных; транспорт HTTP+SSE |
2025-03-26 |
Legacy | появился Streamable HTTP, HTTP+SSE объявлен устаревшим |
2025-06-18 |
Legacy | появился заголовок MCP-Protocol-Version |
2025-11-25 |
Legacy | последняя редакция с рукопожатием initialize |
2026-07-28 |
Modern | протокол без состояния; текущая редакция |
Что именно изменилось в текущей редакции, перечислено в её списке изменений и на странице «Переход на 2026-07-28».
Три термина
Заголовок раздела «Три термина»Термины даёт сама спецификация, на странице Versioning and Compatibility.
| Термин | Значение |
|---|---|
| Modern | версии, где версия, сведения о сторонах и возможности передаются в каждом запросе: 2026-07-28 и новее |
| Legacy | версии, где сначала устанавливается сессия рукопожатием initialize: 2025-11-25 и старше |
| Dual-era | реализация, которая поддерживает обе эпохи |
Эпоха - свойство конкретной реализации, а не протокола в целом. Какой клиент или SDK к какой эпохе относится, нужно смотреть в его документации.
Как стороны договариваются о версии
Заголовок раздела «Как стороны договариваются о версии»Рукопожатия нет. Клиент указывает версию в каждом запросе: в поле _meta под ключом io.modelcontextprotocol/protocolVersion, а на HTTP ещё и в заголовке MCP-Protocol-Version.
Если сервер не поддерживает запрошенную версию, он обязан вернуть ошибку UnsupportedProtocolVersionError с кодом -32022 и списком версий, которые поддерживает.
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32022, "message": "Unsupported protocol version", "data": { "supported": ["2026-07-28", "2025-11-25"], "requested": "1900-01-01" } }}Клиенту следует выбрать версию из списка supported и повторить запрос. Если общей версии нет, остаётся показать ошибку пользователю.
Узнать версии заранее можно запросом server/discover. Сервер обязан его реализовать, клиент вызывать не обязан.
Совместимость эпох
Заголовок раздела «Совместимость эпох»Спецификация приводит таблицу исходов для всех сочетаний.
| Клиент | Сервер | Что будет |
|---|---|---|
| Modern | Modern | работает |
| Modern | Legacy | не работает; на stdio клиенту стоит сначала отправить server/discover, чтобы отказ был предсказуемым |
| Dual-era | Modern | работает, клиент остаётся в Modern |
| Dual-era | Legacy | работает: клиент распознаёт Legacy-сервер и переходит на initialize |
| Legacy | Modern | не работает; у Legacy-клиента нет способа перейти на новую версию |
| Legacy | Dual-era | работает по правилам согласованной Legacy-редакции |
| Legacy | Legacy | работает по правилам своей редакции |
Как клиент Dual-era определяет эпоху сервера:
- на stdio - отправляет
server/discover; любой ответ, кроме результата и распознанной ошибки Modern, означает Legacy-сервер; - на HTTP - отправляет запрос в новом формате; при ответе
400смотрит тело: распознанная ошибка Modern означает Modern-сервер, всё остальное - Legacy.
Результат проверки клиенту следует запомнить: эпоха - свойство сервера, а не отдельного запроса.
Серверу, который поддерживает только Modern, спецификация советует в ответ на initialize назвать поддерживаемые версии. Для пользователя Legacy-клиента это может быть единственная подсказка.
Подробности транспортной части - на странице «Транспорты».