[{"data":1,"prerenderedAt":70},["ShallowReactive",2],{"wiki-mcp-mcp-server-regression-testing-ru":3},{"meta":4,"html":8,"headings":9,"words":69},{"title":5,"description":6,"published":7,"updated":7,"sourceUpdated":7},"Регрессионное тестирование MCP-сервера","Регрессионное тестирование MCP-сервера: снимки tools/list, ломающие изменения, поддержка версий протокола, поведение модели после правки описаний, CI.","2026-11-03","\u003Cp>\u003Cstrong>Регрессионное тестирование MCP-сервера\u003C/strong> - проверка того, что новая версия сервера не сломала то, что работало в предыдущей: контракт, на который опираются клиенты (списки инструментов, ресурсов и промптов с их схемами и смыслом ошибок), поддерживаемые версии протокола и поведение моделей, которые выбирают инструменты по описаниям. Общее понятие \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"regression-testing\">регрессионного тестирования\u003C/span> описано в статье \u003Ca href=\"/ru/wiki/test-management/test-run\" class=\"wiki-link wiki-link--article\">Тестовый прогон\u003C/a>; основы тестирования \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"mcp-server\">MCP-серверов\u003C/span> - в статье \u003Ca href=\"/ru/wiki/mcp/testing-mcp-servers\" class=\"wiki-link wiki-link--article\">Тестирование MCP-серверов: основы\u003C/a>.\u003C/p>\n\u003Cp>Текущая версия спецификации MCP - \u003Cstrong>2026-07-28\u003C/strong>. Спецификация определяет, как обозначаются и согласуются версии протокола, а с этой версии - и формальную политику вывода функций протокола из употребления. Версионирование инструментов конкретного сервера и правила их совместимости она не определяет: это остаётся задачей автора сервера. С SEP-3398, принятого 14 октября 2026, новые версии спецификации планируются раз в шесть месяцев.\u003C/p>\n\u003Ch2 id=\"кратко\" class=\"wiki-heading\">Кратко\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"кратко\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Параметр\u003C/th>\n\u003Cth>Значение\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Объект\u003C/td>\n\u003Ctd>Контракт сервера, поведение по протоколу, поведение моделей\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Контракт\u003C/td>\n\u003Ctd>\u003Ccode>tools/list\u003C/code>, \u003Ccode>resources/list\u003C/code>, \u003Ccode>resources/templates/list\u003C/code>, \u003Ccode>prompts/list\u003C/code>, \u003Ccode>server/discover\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Эталон\u003C/td>\n\u003Ctd>Снимок контракта и результаты предыдущего релиза\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Версии протокола\u003C/td>\n\u003Ctd>Идентификаторы \u003Ccode>YYYY-MM-DD\u003C/code>, текущая 2026-07-28\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Срок устаревания\u003C/td>\n\u003Ctd>Не меньше двенадцати месяцев, при ускоренном удалении не меньше девяноста дней\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Инструменты\u003C/td>\n\u003Ctd>MCP Inspector CLI, набор тестов соответствия, набор задач оценки\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Правила совместимости инструментов\u003C/td>\n\u003Ctd>Спецификацией не определены\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"какую-задачу-решает\" class=\"wiki-heading\">Какую задачу решает\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"какую-задачу-решает\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Между релизами у MCP-сервера добавляются и переименовываются инструменты, правятся описания, обновляются SDK и поддерживаемые версии протокола. Каждый вид потребителей сервера зависит от своей его части.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Клиенты\u003C/strong> кешируют списки. Результаты \u003Ccode>tools/list\u003C/code>, \u003Ccode>prompts/list\u003C/code>, \u003Ccode>resources/list\u003C/code> и \u003Ccode>resources/templates/list\u003C/code> несут \u003Ccode>ttlMs\u003C/code>, и клиент может пользоваться кешированным списком, пока срок не истёк.\u003C/li>\n\u003Cli>\u003Cstrong>Настройки хоста\u003C/strong> ссылаются на инструменты по имени. В Claude Code, например, правило разрешений называет инструмент в виде \u003Ccode>mcp__&lt;server&gt;__&lt;tool&gt;\u003C/code>.\u003C/li>\n\u003Cli>\u003Cstrong>Скрипты и агенты\u003C/strong> вызывают инструменты с заранее заданными аргументами и разбирают \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"structured-content\">структурированные результаты\u003C/span>.\u003C/li>\n\u003Cli>\u003Cstrong>Модели\u003C/strong> выбирают инструменты по имени, описанию и схеме.\u003C/li>\n\u003C/ul>\n\u003Cp>У инструмента в протоколе нет поля версии: описание инструмента состоит из \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>icons\u003C/code>, \u003Ccode>inputSchema\u003C/code>, \u003Ccode>outputSchema\u003C/code>, \u003Ccode>annotations\u003C/code> и \u003Ccode>_meta\u003C/code>. Ломающее изменение становится видно, только если сравнить две версии контракта.\u003C/p>\n\u003Ch2 id=\"контракт-mcp-сервера\" class=\"wiki-heading\">Контракт MCP-сервера\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"контракт-mcp-сервера\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Контракт - та часть сервера, которую клиент видит, не читая его кода. В таблице - какие списки в него входят и какие поля сравниваются.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Список\u003C/th>\n\u003Cth>Метод\u003C/th>\n\u003Cth>Сравниваемые поля\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Инструменты\u003C/td>\n\u003Ctd>\u003Ccode>tools/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>inputSchema\u003C/code>, \u003Ccode>outputSchema\u003C/code>, \u003Ccode>annotations\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ресурсы\u003C/td>\n\u003Ctd>\u003Ccode>resources/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>uri\u003C/code>, \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>mimeType\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Шаблоны ресурсов\u003C/td>\n\u003Ctd>\u003Ccode>resources/templates/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>uriTemplate\u003C/code>, \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>mimeType\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Промпты\u003C/td>\n\u003Ctd>\u003Ccode>prompts/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>arguments\u003C/code> с полями \u003Ccode>name\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>required\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Сервер\u003C/td>\n\u003Ctd>\u003Ccode>server/discover\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>supportedVersions\u003C/code>, \u003Ccode>capabilities\u003C/code> вместе с \u003Ccode>extensions\u003C/code>, \u003Ccode>instructions\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>К контракту относится и смысл ошибок, хотя ни один список его не описывает: какие сбои возвращаются ошибкой JSON-RPC, а какие - результатом инструмента с \u003Ccode>isError: true\u003C/code>, и с какими кодами. Его проверяют тестами ошибочных случаев, а не снимком. Устройство самих списков описано в статьях \u003Ca href=\"/ru/wiki/mcp/mcp-tools\" class=\"wiki-link wiki-link--article\">Инструменты (tools) в MCP\u003C/a> и \u003Ca href=\"/ru/wiki/mcp/mcp-prompts\" class=\"wiki-link wiki-link--article\">Промпты (prompts) в MCP\u003C/a>.\u003C/p>\n\u003Ch2 id=\"снимки-контракта\" class=\"wiki-heading\">Снимки контракта\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"снимки-контракта\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"как-снимается-снимок\" class=\"wiki-heading\">Как снимается снимок\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"как-снимается-снимок\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>\u003Cstrong>Снимок контракта\u003C/strong> - сохранённый и нормализованный результат методов-списков одной версии сервера. Снимок последнего релиза хранится в репозитории и служит эталоном; с ним сравнивается снимок версии-кандидата.\u003C/p>\n\u003Cp>CLI MCP Inspector выполняет один запрос за вызов и с \u003Ccode>--format json\u003C/code> выводит результат в JSON. Флаг \u003Ccode>--protocol-era\u003C/code> выбирает эпоху протокола: \u003Ccode>legacy\u003C/code> (по умолчанию, рукопожатие \u003Ccode>initialize\u003C/code>), \u003Ccode>auto\u003C/code> (сначала проба \u003Ccode>server/discover\u003C/code>, затем откат к \u003Ccode>initialize\u003C/code>) или \u003Ccode>modern\u003C/code> (ровно 2026-07-28, без отката). Снимок современного сервера снимают с \u003Ccode>--protocol-era modern\u003C/code>; без флага CLI подключается в эпохе legacy.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>set -euo pipefail\nmkdir -p snapshot\n\ninspect() {\n  npx @modelcontextprotocol/inspector --cli node build/index.js \\\n    --protocol-era modern --method &quot;$1&quot; --format json\n}\n\ninspect tools/list | jq -S '.result.tools | sort_by(.name)' &gt; snapshot/tools.json\ninspect resources/list | jq -S '.result.resources | sort_by(.uri)' &gt; snapshot/resources.json\ninspect resources/templates/list \\\n  | jq -S '.result.resourceTemplates | sort_by(.uriTemplate)' &gt; snapshot/resource-templates.json\ninspect prompts/list | jq -S '.result.prompts | sort_by(.name)' &gt; snapshot/prompts.json\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Нормализация оставляет только списки и сортирует их по устойчивому ключу, поэтому одна только смена порядка не выглядит как изменение контракта. Поля вроде \u003Ccode>nextCursor\u003C/code>, \u003Ccode>ttlMs\u003C/code> и \u003Ccode>cacheScope\u003C/code> описывают доставку, а не контракт, и в снимок не входят.\u003C/p>\n\u003Cp>На содержимое снимка влияют два правила спецификации. Во-первых, список инструментов может зависеть от авторизации запроса, например от прав (scopes) токена. Для сервера с таким поведением снимок делается на каждый профиль авторизации. Во-вторых, списки бывают постраничными, и согласованность между страницами не гарантируется. Клиент, которому нужен согласованный полный список, запрашивает его заново с начала, и снимок следует тому же правилу.\u003C/p>\n\u003Ch3 id=\"сравнение-снимков\" class=\"wiki-heading\">Сравнение снимков\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"сравнение-снимков\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>Текстовое сравнение нормализованных файлов (\u003Ccode>diff baseline/tools.json snapshot/tools.json\u003C/code>) показывает каждое изменение, но не отличает ломающее от безвредного. Для этого скрипт классифицирует изменения по правилам из разделов ниже. Формат его отчёта спецификация не определяет; в примере - один из возможных форматов.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>{\n  &quot;baseline&quot;: &quot;1.4.0&quot;,\n  &quot;candidate&quot;: &quot;1.5.0&quot;,\n  &quot;changes&quot;: [\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;search_issues&quot;,\n      &quot;kind&quot;: &quot;removed&quot;,\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: true\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;create_issue&quot;,\n      &quot;path&quot;: &quot;inputSchema.required&quot;,\n      &quot;kind&quot;: &quot;required_parameter_added&quot;,\n      &quot;before&quot;: [&quot;project&quot;, &quot;title&quot;],\n      &quot;after&quot;: [&quot;project&quot;, &quot;title&quot;, &quot;priority&quot;],\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: true\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;get_issue&quot;,\n      &quot;path&quot;: &quot;outputSchema.properties.assignee.type&quot;,\n      &quot;kind&quot;: &quot;type_changed&quot;,\n      &quot;before&quot;: &quot;string&quot;,\n      &quot;after&quot;: &quot;object&quot;,\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: false\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;update_issue&quot;,\n      &quot;path&quot;: &quot;description&quot;,\n      &quot;kind&quot;: &quot;description_changed&quot;,\n      &quot;breaksClients&quot;: false,\n      &quot;affectsModels&quot;: true\n    }\n  ]\n}\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>В такой схеме задача CI падает на изменениях с \u003Ccode>breaksClients: true\u003C/code>, а изменения с \u003Ccode>affectsModels: true\u003C/code> запускают оценку, описанную ниже.\u003C/p>\n\u003Ch2 id=\"изменения-которые-ломают-клиентов\" class=\"wiki-heading\">Изменения, которые ломают клиентов\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"изменения-которые-ломают-клиентов\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>После ломающего изменения вызов, который работал с предыдущей версией, с новой завершается ошибкой, или клиент неверно понимает результат.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Удалённый или переименованный инструмент.\u003C/strong> \u003Ccode>tools/call\u003C/code> со старым именем получает \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"protocol-error\">ошибку протокола\u003C/span>; пример в спецификации отвечает на неизвестный инструмент кодом JSON-RPC \u003Ccode>-32602\u003C/code>. Клиент с кешированным списком предлагает старое имя, пока не истечёт \u003Ccode>ttlMs\u003C/code>, а настройки хоста, которые называют инструмент по имени, перестают с ним совпадать.\u003C/li>\n\u003Cli>\u003Cstrong>Новый обязательный параметр.\u003C/strong> Вызовам, которые работали раньше, параметра не хватает, и они не проходят проверку. С SEP-1303 такие ошибки возвращаются как \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"tool-execution-error\">ошибки выполнения инструмента\u003C/span> с \u003Ccode>isError: true\u003C/code>.\u003C/li>\n\u003Cli>\u003Cstrong>Сужение типа.\u003C/strong> Строка становится \u003Ccode>enum\u003C/code>, уменьшается \u003Ccode>maximum\u003C/code>, появляется \u003Ccode>pattern\u003C/code>, добавляется \u003Ccode>additionalProperties: false\u003C/code>. Значения, которые были допустимы, отклоняются. Естественные тестовые данные здесь - \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"boundary-value\">граничные значения\u003C/span> старой и новой схемы; техника описана в статье \u003Ca href=\"/ru/wiki/test-design/equivalence-partitioning-and-boundary-values\" class=\"wiki-link wiki-link--article\">Классы эквивалентности и граничные значения\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Изменённая \u003Ccode>outputSchema\u003C/code>.\u003C/strong> Свойство удалено или переименовано, у него сменился тип, оно ушло из \u003Ccode>required\u003C/code>. Спецификация обязывает сервер возвращать \u003Ccode>structuredContent\u003C/code>, соответствующий \u003Ccode>outputSchema\u003C/code>, и рекомендует клиентам его проверять. Клиент, который опирается на старую структуру, ломается.\u003C/li>\n\u003Cli>\u003Cstrong>Изменённый смысл ошибок.\u003C/strong> Сбой переходит из \u003Ccode>isError: true\u003C/code> в ошибку JSON-RPC или обратно, либо меняется код ошибки. Такое изменение сделала и сама спецификация в 2026-07-28: код для ненайденного ресурса сменился с \u003Ccode>-32002\u003C/code> на \u003Ccode>-32602\u003C/code> (SEP-2164). По данным SEP-2164, официальные SDK до этого использовали для этого случая не меньше четырёх разных кодов, поэтому обновление SDK может изменить коды сервера без правок его собственного кода.\u003C/li>\n\u003Cli>\u003Cstrong>Изменённые URI ресурсов или шаблоны.\u003C/strong> Клиент, который сохранил URI или построил его по шаблону, больше не находит ресурс.\u003C/li>\n\u003Cli>\u003Cstrong>Удалённая возможность или расширение.\u003C/strong> Клиент, который опирается на \u003Ccode>listChanged\u003C/code> или на расширение, переходит к запасному поведению или получает ошибку.\u003C/li>\n\u003C/ul>\n\u003Cp>Клиент на \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"streamable-http\">Streamable HTTP\u003C/span> обязан исключить из списка инструмент, у которого значение \u003Ccode>x-mcp-header\u003C/code> нарушает ограничения спецификации. Поэтому неверная аннотация, добавленная к одному параметру, убирает инструмент у клиента без какой-либо ошибки на стороне сервера.\u003C/p>\n\u003Ch2 id=\"изменения-которые-влияют-на-модели\" class=\"wiki-heading\">Изменения, которые влияют на модели\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"изменения-которые-влияют-на-модели\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Некоторые изменения оставляют все вызовы допустимыми и всё равно меняют то, что делает модель, а с этим и результат задач.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Правка описания.\u003C/strong> Описание инструмента и его параметров - основной сигнал для модели. По данным Anthropic, даже небольшие уточнения описаний инструментов могут заметно менять результаты; это верно и в обратную сторону.\u003C/li>\n\u003Cli>\u003Cstrong>Правка \u003Ccode>title\u003C/code>.\u003C/strong> Спецификация предназначает \u003Ccode>title\u003C/code> для показа пользователям. Передаёт ли хост его ещё и модели, спецификация не определяет.\u003C/li>\n\u003Cli>\u003Cstrong>Новый инструмент.\u003C/strong> Инструмент с назначением, близким к существующему, усложняет выбор.\u003C/li>\n\u003Cli>\u003Cstrong>Изменённое \u003Ccode>instructions\u003C/code>.\u003C/strong> Поле \u003Ccode>instructions\u003C/code> из \u003Ccode>server/discover\u003C/code> клиент может добавить в системный промпт.\u003C/li>\n\u003Cli>\u003Cstrong>Изменённые аннотации.\u003C/strong> Подсказки вроде \u003Ccode>readOnlyHint\u003C/code> и \u003Ccode>destructiveHint\u003C/code> протокол не меняют. Спецификация требует от клиентов считать их недоверенными, если сервер не доверенный, и не определяет, как хост их использует.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"сводка-изменений\" class=\"wiki-heading\">Сводка изменений\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"сводка-изменений\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Таблица сводит вместе виды изменений, их влияние на клиентов и модели и проверку, которая обнаруживает каждое из них.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-4\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Вид изменения\u003C/th>\n\u003Cth>Ломает клиентов протокола\u003C/th>\n\u003Cth>Влияет на модели\u003C/th>\n\u003Cth>Как обнаружить\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Инструмент удалён или переименован\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение снимков, \u003Ccode>tools/call\u003C/code> в дымовой проверке\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Новый обязательный параметр\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение \u003Ccode>required\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Сужен тип параметра\u003C/td>\n\u003Ctd>Да, для значений вне нового диапазона\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение схемы, тесты граничных значений\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Изменена \u003Ccode>outputSchema\u003C/code>\u003C/td>\n\u003Ctd>Да, для клиентов, которые проверяют или разбирают результат\u003C/td>\n\u003Ctd>Возможно\u003C/td>\n\u003Ctd>Сравнение, проверка \u003Ccode>structuredContent\u003C/code> в тестах\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Изменён смысл ошибок\u003C/td>\n\u003Ctd>Да, для клиентов, которые ветвятся по ошибкам\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Тесты ошибочных случаев, набор тестов соответствия\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Убрана версия протокола\u003C/td>\n\u003Ctd>Да, для клиентов на этой версии\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>Прогоны соответствия по ревизиям, Inspector по эпохам\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Неверный \u003Ccode>x-mcp-header\u003C/code>\u003C/td>\n\u003Ctd>HTTP-клиенты исключают инструмент\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение, проверка ограничений\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Правка описания или \u003Ccode>title\u003C/code>\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение, набор задач оценки\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Новый инструмент\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>Сравнение, набор задач оценки с задачами, где инструмент не нужен\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Новый необязательный параметр\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>Возможно\u003C/td>\n\u003Ctd>Сравнение, набор задач оценки\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Изменены аннотации\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>Не напрямую\u003C/td>\n\u003Ctd>Сравнение, проверка поведения хоста\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"поддержка-версий-протокола\" class=\"wiki-heading\">Поддержка версий протокола\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"поддержка-версий-протокола\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"идентификаторы-версий-и-согласование\" class=\"wiki-heading\">Идентификаторы версий и согласование\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"идентификаторы-версий-и-согласование\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>Версия протокола - строка вида \u003Ccode>YYYY-MM-DD\u003C/code>: дата последнего обратно несовместимого изменения. Совместимые изменения версию не меняют. Ревизия спецификации бывает Draft, Current или Final; текущая ревизия - 2026-07-28.\u003C/p>\n\u003Cp>Каждый запрос объявляет свою версию в \u003Ccode>_meta\u003C/code>, в поле \u003Ccode>io.modelcontextprotocol/protocolVersion\u003C/code>; на Streamable HTTP то же значение передаётся ещё и в заголовке \u003Ccode>MCP-Protocol-Version\u003C/code>. Сервер принимает или отклоняет каждый запрос независимо. На версию, которую он не поддерживает, сервер возвращает \u003Ccode>UnsupportedProtocolVersionError\u003C/code> с поддерживаемыми версиями и запрошенной; на HTTP код ответа - \u003Ccode>400 Bad Request\u003C/code>.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 1,\n  &quot;error&quot;: {\n    &quot;code&quot;: -32022,\n    &quot;message&quot;: &quot;Unsupported protocol version&quot;,\n    &quot;data&quot;: {\n      &quot;supported&quot;: [&quot;2026-07-28&quot;, &quot;2025-11-25&quot;],\n      &quot;requested&quot;: &quot;1900-01-01&quot;\n    }\n  }\n}\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Список поддерживаемых версий - часть контракта. Его возвращает \u003Ccode>server/discover\u003C/code> в поле \u003Ccode>supportedVersions\u003C/code>, и регрессионный тест проверяет его двумя способами: поле содержит ожидаемые версии, а запрос с неподдерживаемой версией, например \u003Ccode>1900-01-01\u003C/code> выше, получает код \u003Ccode>-32022\u003C/code> с тем же списком в \u003Ccode>data.supported\u003C/code>.\u003C/p>\n\u003Ch3 id=\"прежние-и-современные-версии\" class=\"wiki-heading\">Прежние и современные версии\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"прежние-и-современные-версии\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>Спецификация называет версии до 2025-11-25 включительно, которые открывают сессию рукопожатием \u003Ccode>initialize\u003C/code>, \u003Cstrong>прежними\u003C/strong> (legacy), а версии начиная с 2026-07-28, которые передают версию и возможности в каждом запросе, \u003Cstrong>современными\u003C/strong> (modern). \u003Cstrong>Реализация dual-era\u003C/strong> поддерживает и те, и другие. Матрица совместимости показывает, что значит отказ от версии:\u003C/p>\n\u003Cul>\n\u003Cli>прежний клиент и сервер dual-era работают;\u003C/li>\n\u003Cli>прежний клиент и сервер, который поддерживает только современные версии, не работают, и перейти на более новую версию прежний клиент не может;\u003C/li>\n\u003Cli>современный клиент и прежний сервер не работают.\u003C/li>\n\u003C/ul>\n\u003Cp>Поэтому отказ сервера dual-era от прежних версий - ломающее изменение для каждого прежнего клиента. Изменения 2026-07-28 и переход с 2025-11-25 описаны в статье \u003Ca href=\"/ru/wiki/mcp/stateless-mcp\" class=\"wiki-link wiki-link--article\">MCP без состояния\u003C/a>.\u003C/p>\n\u003Cp>Сервер dual-era тестируют на обоих вариантах протокола. У \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-suite\">набора тестов\u003C/span> соответствия есть набор требований для каждой ревизии (\u003Ccode>--requirements 2025-11-25\u003C/code>, \u003Ccode>--requirements 2026-07-28\u003C/code>), и каждый набор выполняется в версии протокола своей ревизии. По документации набора, сценарий, который относится к обеим ревизиям, нужно запускать дважды: успех в одной версии ничего не говорит о другой. MCP Inspector проверяет тот же сервер в обеих эпохах с \u003Ccode>--protocol-era legacy\u003C/code> и \u003Ccode>--protocol-era modern\u003C/code>.\u003C/p>\n\u003Ch3 id=\"политика-вывода-из-употребления\" class=\"wiki-heading\">Политика вывода из употребления\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"политика-вывода-из-употребления\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>С 2026-07-28 у функций спецификации три состояния: Active, Deprecated и Removed (SEP-2596). \u003Cstrong>Срок устаревания\u003C/strong> (deprecation window), то есть время, которое устаревшая функция остаётся в спецификации, - не меньше двенадцати месяцев, считая от выпуска ревизии, которая впервые пометила её как устаревшую. Удалить функцию можно в первой ревизии, выпущенной в момент окончания этого срока или позже. Для функции с активным риском безопасности срок можно сократить, но не меньше чем до девяноста дней.\u003C/p>\n\u003Cp>Спецификация ведёт реестр устаревших функций. В 2026-07-28 в нём:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Функция\u003C/th>\n\u003Cth>Устарела в\u003C/th>\n\u003Cth>Самое раннее удаление\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Roots, Sampling, Logging\u003C/td>\n\u003Ctd>2026-07-28\u003C/td>\n\u003Ctd>Первая ревизия, выпущенная 28 июля 2027 или позже\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Dynamic Client Registration\u003C/td>\n\u003Ctd>2026-07-28\u003C/td>\n\u003Ctd>Первая ревизия, выпущенная 28 июля 2027 или позже\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Значения \u003Ccode>includeContext\u003C/code> \u003Ccode>thisServer\u003C/code> и \u003Ccode>allServers\u003C/code>\u003C/td>\n\u003Ctd>2025-11-25\u003C/td>\n\u003Ctd>Не позже Sampling\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Транспорт HTTP+SSE\u003C/td>\n\u003Ctd>2025-03-26\u003C/td>\n\u003Ctd>Через три месяца после перехода SEP-2596 в статус Final\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Поэтому у сервера, который использует устаревшую функцию, есть известная дата, после которой новая ревизия может её не поддерживать. SDK уровня Tier 1 обязаны в следующем выпуске пометить устаревшие API штатным механизмом языка и должны выдавать предупреждение во время выполнения, когда устаревшая функция используется, поэтому новые предупреждения об устаревании в журналах сборки и выводе тестов - сигнал для проверки.\u003C/p>\n\u003Ch3 id=\"частота-выпусков\" class=\"wiki-heading\">Частота выпусков\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"частота-выпусков\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>SEP-3398 планирует выпуски спецификации обычно на последний вторник марта и сентября и переносит выпуск, намеченный на декабрь 2026 года, на конец марта 2027 года. SDK уровня Tier 1 публикуют бета-версии примерно за полтора месяца до выпуска, чтобы экосистема могла их проверить. Прогон регрессионного набора на бета-версии SDK показывает влияние следующей ревизии до её выпуска.\u003C/p>\n\u003Ch2 id=\"регресс-поведения-модели\" class=\"wiki-heading\">Регресс поведения модели\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"регресс-поведения-модели\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Изменение, которое влияет на модели, проверяют повторным запуском набора задач оценки: те же задачи, те же модели и хосты, то же число попыток. Метод описан в статье \u003Ca href=\"/ru/wiki/mcp/evaluating-mcp-servers\" class=\"wiki-link wiki-link--article\">Оценка MCP-сервера на моделях\u003C/a>; для регрессионного тестирования важны четыре момента.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Регрессионный набор.\u003C/strong> Anthropic отделяет оценку возможностей с низкой долей успеха от регрессионной оценки, доля успеха которой держится около 100 процентов. После правки описания первым запускается регрессионный набор.\u003C/li>\n\u003Cli>\u003Cstrong>Парное сравнение.\u003C/strong> Старая и новая версии проходят одни и те же задачи, и результаты сравниваются по каждой задаче.\u003C/li>\n\u003Cli>\u003Cstrong>Не только успех.\u003C/strong> Вместе с долей успеха сравнивают число вызовов инструментов, токены и ошибки инструментов. Описание, которое сохранило долю успеха, но удвоило число вызовов, - тоже регресс.\u003C/li>\n\u003Cli>\u003Cstrong>Задачи без инструмента.\u003C/strong> Задачи, в которых правильное поведение - не вызывать инструмент, обнаруживают новый или изменённый инструмент, который вызывается там, где он не нужен.\u003C/li>\n\u003C/ul>\n\u003Cp>Поводом для такого запуска служит сравнение снимков: изменённые \u003Ccode>description\u003C/code> или \u003Ccode>title\u003C/code>, новый инструмент, изменённое \u003Ccode>instructions\u003C/code>.\u003C/p>\n\u003Ch2 id=\"регрессионное-тестирование-в-ci\" class=\"wiki-heading\">Регрессионное тестирование в CI\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"регрессионное-тестирование-в-ci\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>На схеме - типичный конвейер: от дешёвых детерминированных проверок к дорогим статистическим.\u003C/p>\n\u003Cdiv class=\"wiki-code wiki-code--plain\">\u003Cpre>\u003Ccode>build\n |\n +-- unit tests of tool handlers\n +-- start the server\n +-- Inspector smoke test: tools/list --strict, tools/call\n +-- contract snapshot + diff with the baseline\n |     breaking change -&gt; fail\n |     description change -&gt; mark for evaluation\n +-- conformance suite per revision, with expected failures\n |\n +-- evaluation set (marked changes, schedule)\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Набор тестов соответствия работает с сервером по HTTP. YAML-файл с известными сбоями передаётся флагом \u003Ccode>--expected-failures\u003C/code>:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"yaml\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">yaml\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>server:\n  - tools-call-with-progress\n  - server-stateless:sep-2575-server-implements-discover\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Запись называет либо весь сценарий, либо одну проверку в виде \u003Ccode>&lt;scenario&gt;:&lt;check-id&gt;\u003C/code>. Вторая форма прощает одну проверку и оставляет в силе остальные проверки сценария. Код выхода подчиняется четырём правилам:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Результат сценария\u003C/th>\n\u003Cth>В файле\u003C/th>\n\u003Cth>Код выхода\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Не прошёл\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>0, ожидаемый сбой\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Не прошёл\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>1, регрессия\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Прошёл\u003C/td>\n\u003Ctd>Да\u003C/td>\n\u003Ctd>1, запись устарела и должна быть удалена\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Прошёл\u003C/td>\n\u003Ctd>Нет\u003C/td>\n\u003Ctd>0\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>По третьему правилу после исправления CI падает, пока запись не удалят. Для сервера dual-era набор запускается по разу на каждый набор требований:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>npx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp \\\n  --requirements 2026-07-28 --expected-failures ./conformance-baseline.yml\n\nnpx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp \\\n  --requirements 2025-11-25 --expected-failures ./conformance-baseline.yml\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>По документации набора, набор требований заморожен на момент выпуска своей ревизии и хранится в репозитории набора тестов, а файл ожидаемых сбоев хранится в репозитории реализации. Сбой, записанный в файл, остаётся сбоем относительно набора требований. Как устроены прогоны тестов в конвейерах CI в целом, описано в статье \u003Ca href=\"/ru/wiki/test-automation/automated-tests-in-ci\" class=\"wiki-link wiki-link--article\">Автотесты в CI\u003C/a>.\u003C/p>\n\u003Ch2 id=\"проверка-контракта-соответствие-и-оценка\" class=\"wiki-heading\">Проверка контракта, соответствие и оценка\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"проверка-контракта-соответствие-и-оценка\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Таблица сравнивает три проверки конвейера, которые отвечают на разные вопросы.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-4\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>Проверка контракта\u003C/th>\n\u003Cth>Тестирование соответствия\u003C/th>\n\u003Cth>Повторный запуск оценки\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Вопрос\u003C/td>\n\u003Ctd>Изменился ли собственный контракт сервера?\u003C/td>\n\u003Ctd>Соблюдает ли сервер протокол по-прежнему?\u003C/td>\n\u003Ctd>Выполняют ли модели задачи по-прежнему?\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Эталон\u003C/td>\n\u003Ctd>Снимок предыдущего релиза\u003C/td>\n\u003Ctd>Требования ревизии\u003C/td>\n\u003Ctd>Результаты предыдущего релиза\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Что находит\u003C/td>\n\u003Ctd>Удалённые инструменты, новые обязательные параметры, изменённые схемы\u003C/td>\n\u003Ctd>Дефекты протокола, в том числе после обновления SDK\u003C/td>\n\u003Ctd>Влияние описаний и новых инструментов\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Детерминированность\u003C/td>\n\u003Ctd>Детерминирована\u003C/td>\n\u003Ctd>Детерминировано\u003C/td>\n\u003Ctd>Статистическая\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Когда\u003C/td>\n\u003Ctd>При каждом изменении\u003C/td>\n\u003Ctd>При каждом изменении\u003C/td>\n\u003Ctd>При изменении описаний, по расписанию\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Проверка контракта сравнивает сервер с ним самим, тестирование соответствия - со спецификацией. Сервер может пройти тесты соответствия и всё равно сломать клиентов переименованием инструмента или сохранить контракт и не пройти тесты соответствия после обновления SDK. Как модели реагируют на изменённое описание, показывает только оценка.\u003C/p>\n\u003Ch2 id=\"термины\" class=\"wiki-heading\">Термины\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"термины\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Термин\u003C/th>\n\u003Cth>Значение\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Контракт MCP-сервера\u003C/td>\n\u003Ctd>Списки инструментов, ресурсов, шаблонов ресурсов и промптов, поддерживаемые версии, возможности и смысл ошибок, которые видит клиент\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Снимок контракта\u003C/td>\n\u003Ctd>Сохранённый и нормализованный результат методов-списков одной версии сервера\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ломающее изменение\u003C/td>\n\u003Ctd>Изменение, после которого вызов, работавший с предыдущей версией, завершается ошибкой или его результат понимается неверно\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Прежние и современные версии (legacy, modern)\u003C/td>\n\u003Ctd>Версии протокола до 2025-11-25 с рукопожатием \u003Ccode>initialize\u003C/code> и начиная с 2026-07-28 с версией и возможностями в каждом запросе\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Реализация dual-era\u003C/td>\n\u003Ctd>Клиент или сервер, который поддерживает и прежние, и современные версии протокола\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Срок устаревания (deprecation window)\u003C/td>\n\u003Ctd>Время, которое устаревшая функция остаётся в спецификации до возможного удаления, не меньше двенадцати месяцев\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ожидаемые сбои (expected failures)\u003C/td>\n\u003Ctd>Файл с известными сбоями тестов соответствия, передаётся флагом \u003Ccode>--expected-failures\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Набор требований (requirement set)\u003C/td>\n\u003Ctd>Замороженный список сценариев соответствия, которых требует ревизия спецификации\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"источники\" class=\"wiki-heading\">Источники\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"источники\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Versioning and Compatibility, спецификация 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/learn/versioning\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Versioning, документация MCP\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/deprecated\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Deprecated Features, спецификация 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/community/feature-lifecycle\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Feature Lifecycle and Deprecation Policy\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/changelog\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Key Changes, спецификация 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/server/tools\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Tools, спецификация 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/caching\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Caching, спецификация 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/modelcontextprotocol/specification/blob/main/schema/2026-07-28/schema.ts\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Схема спецификации 2026-07-28, schema.ts, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/1303-input-validation-errors-as-tool-execution-errors\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-1303: Input Validation Errors as Tool Execution Errors\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/2164-resource-not-found-error\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-2164: Standardize Resource Not Found Error Code\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/2596-spec-feature-lifecycle-and-deprecation\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-2596: Specification Feature Lifecycle and Deprecation Policy\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/3398-release-cycle-updates\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-3398: Release Cycle Updates\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector/cli\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector, клиент CLI\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector/protocol-eras\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector, эпохи протокола\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/modelcontextprotocol/conformance\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Набор тестов соответствия MCP, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://code.claude.com/docs/en/permissions\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Configure permissions, документация Claude Code\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.anthropic.com/engineering/writing-tools-for-agents\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Writing effective tools for agents, Anthropic, 11 сентября 2025\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Demystifying evals for AI agents, Anthropic, 9 января 2026\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003C/ul>\n",[10,14,17,20,23,27,30,33,36,39,42,45,48,51,54,57,60,63,66],{"id":11,"level":12,"text":13},"кратко",2,"Кратко",{"id":15,"level":12,"text":16},"какую-задачу-решает","Какую задачу решает",{"id":18,"level":12,"text":19},"контракт-mcp-сервера","Контракт MCP-сервера",{"id":21,"level":12,"text":22},"снимки-контракта","Снимки контракта",{"id":24,"level":25,"text":26},"как-снимается-снимок",3,"Как снимается снимок",{"id":28,"level":25,"text":29},"сравнение-снимков","Сравнение снимков",{"id":31,"level":12,"text":32},"изменения-которые-ломают-клиентов","Изменения, которые ломают клиентов",{"id":34,"level":12,"text":35},"изменения-которые-влияют-на-модели","Изменения, которые влияют на модели",{"id":37,"level":12,"text":38},"сводка-изменений","Сводка изменений",{"id":40,"level":12,"text":41},"поддержка-версий-протокола","Поддержка версий протокола",{"id":43,"level":25,"text":44},"идентификаторы-версий-и-согласование","Идентификаторы версий и согласование",{"id":46,"level":25,"text":47},"прежние-и-современные-версии","Прежние и современные версии",{"id":49,"level":25,"text":50},"политика-вывода-из-употребления","Политика вывода из употребления",{"id":52,"level":25,"text":53},"частота-выпусков","Частота выпусков",{"id":55,"level":12,"text":56},"регресс-поведения-модели","Регресс поведения модели",{"id":58,"level":12,"text":59},"регрессионное-тестирование-в-ci","Регрессионное тестирование в CI",{"id":61,"level":12,"text":62},"проверка-контракта-соответствие-и-оценка","Проверка контракта, соответствие и оценка",{"id":64,"level":12,"text":65},"термины","Термины",{"id":67,"level":12,"text":68},"источники","Источники",2466,1793718889938]