Проблемы интеграции MCP-сервера: протокол, transport, права и schema
Диагностика ошибок и надёжности MCP-сервера по слоям: версия протокола, transport, запуск, права, inputSchema и безопасный Inspector tool call.
Если MCP-сервер не подключается или tool call завершается ошибкой, не меняйте одновременно конфигурацию клиента, код сервера и права. Сначала определите слой сбоя. Рабочий порядок такой: версия протокола → transport → запуск и окружение → permissions/auth → inputSchema → один read-only вызов.
По состоянию на 23 августа 2026 года актуальная проверенная спецификация MCP имеет версию 2026-07-28. В ней нет старого обязательного handshake через initialize: client может использовать server/discover, а версия протокола, сведения о client и его capabilities передаются с запросами в _meta. Для legacy-реализаций 2025-11-25 и старше действует другая последовательность — initialize, ответ сервера, затем notifications/initialized. Эти две эпохи нельзя соединять в один обмен.
Сразу отделите MCP от модельного API. MCP отвечает за связь client с tools и контекстом; вызов модели может идти по другому маршруту и с другими credentials. Изолируйте модельный слой по инструкции BetterToken: собственный API Key и выбранный OpenAI-compatible или Anthropic-compatible интерфейс дают отдельный проверяемый маршрут, поэтому ошибку модели не придётся искать в MCP. Этот Key не является credential MCP-сервера, а BetterToken не следует считать MCP-host или MCP-transport.
Быстрая классификация сбоя
До запуска Inspector запишите один симптом и последнюю подтверждённую точку:
- процесс вообще не стартует;
- процесс работает, но client не получает JSON-RPC;
- transport отвечает, но версия или capabilities не согласуются;
- сервер возвращает
401или403; tools/listработает, но нужного tool нет;- tool виден, однако
tools/callотклоняет arguments; - вызов проходит, но результат нельзя проверить.
Не записывайте в заметку API Key, bearer token, cookie, полный prompt или содержимое приватных файлов. Для корреляции достаточно времени, имени сервера, метода, JSON-RPC id, кода ошибки и очищенного сообщения.
1. Зафиксируйте эпоху протокола
Узнайте, какую версию поддерживают client, server и используемый SDK. Строка Connected подтверждает transport и часть discovery, но сама по себе не доказывает согласование 2026-07-28.
Для современной реализации проверьте три признака:
- SDK или release notes прямо заявляют поддержку
2026-07-28. - В трассировке есть
server/discoverлибо другой предусмотренный SDK путь discovery. - На запросах присутствует корректная
_metaс версией, сведениями о client и capabilities.
Не копируйте вручную форму _meta из чужого SDK: точный wire-формат должен формировать совместимый client или официальный SDK. Если server ждёт initialize, а client отправляет self-contained запросы 2026-07-28, это несовместимость эпох, а не ошибка tool schema.
Legacy initialize: только для 2025-11-25 и старше
Ниже показан минимальный legacy-запрос. Его нельзя добавлять в современный flow 2026-07-28 «для надёжности».
После успешного ответа legacy-client отправляет notifications/initialized. Если этот обмен обрывается, сначала сравните версии и список capabilities. До tools/list ещё рано.
2. Проверьте transport отдельно от семантики MCP
MCP определяет методы и данные, а transport — запуск, framing, доставку и отмену запросов. Переход со stdio на HTTP не исправит неверный inputSchema.
stdio
При stdio client запускает server как дочерний процесс. Сообщения идут через stdin и stdout как разделённые переводом строки UTF-8 JSON-RPC документы.
Проверяйте:
commandсуществует и запускается тем же пользователем.- Аргументы переданы отдельными элементами, без зависимости от shell aliases.
- Рабочий каталог содержит нужные файлы либо пути абсолютные.
- Нужные переменные действительно доступны дочернему процессу.
- В
stdoutнет banner, отладочных строк и stack trace — логи направляются вstderr.
Один случайный console.log() в stdout способен сломать framing раньше, чем client увидит JSON-RPC response.
Streamable HTTP
При Streamable HTTP client отправляет сообщения методом POST на один MCP endpoint. Ответ может быть обычным JSON или request-scoped SSE. Проверьте точный URL, HTTP method, Content-Type, TLS, redirect, proxy и способ авторизации.
Сделайте transport-тест на loopback или в изолированном тестовом окружении. Публичный production endpoint без разрешения не сканируйте. Если POST возвращает HTML страницы входа, 301/302 на другой host или ответ reverse proxy, вы ещё не дошли до MCP.
3. Воспроизведите запуск в том же окружении
Для stdio сначала выполните server command напрямую из того же каталога и под тем же пользователем, что и MCP-client. Не подменяйте это запуском из IDE: там могут отличаться PATH, cwd, runtime и permissions.
Проверьте:
pwd не раскрывает secret, но не публикуйте путь, если в нём есть имя пользователя или название закрытого проекта. Команда сервера должна либо ждать JSON-RPC на stdin, либо завершиться с понятной ошибкой в stderr. Мгновенный exit без сообщения обычно указывает на неверный entrypoint, отсутствующую зависимость или обработанную без лога ошибку запуска.
Для Inspector CLI официальная документация на 23 августа 2026 года требует Node.js 22.19.0 или новее. Если версия ниже, остановитесь и переключите runtime до дальнейшей диагностики.
4. Разделите permissions и authentication
Код ответа помогает выбрать следующую проверку:
401 Unauthorized— credential отсутствует, истёк или не принят;403 Forbidden— identity распознана, но у неё нет нужного permission или scope;404— часто неверный endpoint или маршрут, а не нехватка прав;- timeout — server, proxy или tool не завершили операцию вовремя; это не доказательство ошибки auth.
Не отключайте permissions ради smoke test. Создайте отдельную тестовую identity с минимальным scope и выберите read-only tool без внешнего эффекта. Client должен оставлять человеку возможность отклонить вызов; annotations инструмента считаются недоверенными данными и не заменяют policy.
В логах сохраняйте решение auth (allowed/denied), имя scope и correlation ID. Сам credential, Authorization header и cookie должны быть удалены или замаскированы.
5. Проверьте capability и inputSchema
Server обязан объявить capability tools до обслуживания tools/list. У каждого tool должно быть уникальное имя и валидный объект JSON Schema в inputSchema. Arguments для tools/call должны соответствовать этой schema.
Минимальное объявление read-only инструмента:
Частые ошибки здесь простые: нет корневого type: object, обязательное поле отсутствует в properties, client отправляет число вместо строки, имя argument отличается регистром или server рекламирует два tools с одинаковым именем.
После согласования версии и transport метод можно проверить таким JSON-RPC payload:
А затем вызвать ровно один tool:
Эти два фрагмента показывают payload методов, а не полный bootstrap соединения. В flow 2026-07-28 совместимый client добавляет требуемую request metadata в _meta; в legacy-flow сначала выполняется initialize. Не отправляйте приведённые JSON вручную в production endpoint без разрешения.
6. Запустите безопасный тест через MCP Inspector CLI
Сначала установите Inspector как зафиксированную project dependency из доверенного lockfile. Команда --no-install ниже не скачивает случайную текущую версию во время диагностики.
Проверка списка tools у локального stdio-сервера:
Один вызов echo:
Для тестового Streamable HTTP endpoint на loopback:
Не вставляйте token в историю shell, URL или статью. Если endpoint требует auth, настройте credential штатным способом Inspector в локальном окружении либо остановите тест и запросите тестовую identity у владельца сервера. Команды выше намеренно не содержат реального Key.
Симптом → проверка → исправление
Критерий успешной проверки
Интеграция проходит минимальную приёмку, когда одновременно выполнены пять условий:
- В логах или telemetry видна ожидаемая согласованная версия протокола.
- Transport не повреждает framing: stdio не содержит лишнего
stdout, а HTTP отвечает с MCP endpoint. tools/listвозвращает один ожидаемый tool с валиднымinputSchema.tools/callдействительно вызывается сtext=MCP_OK_2026и возвращаетMCP_OK_2026без изменений.- Тест не отключал permissions, не раскрывал credentials и не вызвал внешнего побочного эффекта.
Просто увидеть строку MCP_OK_2026 в ответе модели недостаточно. Нужен зафиксированный tool call с соответствующим JSON-RPC id или записью Inspector и очищенным server log.
Stop conditions
Остановите диагностику и не переходите к следующему слою, если:
- неизвестно, какую эпоху протокола поддерживает хотя бы одна сторона;
- Inspector предлагает установить незакреплённую версию пакета без проверки;
- тест требует production credential, отключения auth или расширения scope;
- единственный доступный tool пишет в базу, отправляет сообщение, меняет файл или запускает команду;
- HTTP endpoint принадлежит третьей стороне и разрешение на тест не подтверждено;
- в логах появились Key, token, cookie, персональные данные или содержимое приватного ресурса;
tools/listнестабилен или возвращает разные schema между повторными запусками;- server падает до появления валидного JSON-RPC response.
В этих случаях сохраните очищенный симптом, версию client/server/SDK, transport, correlation ID и минимальный фрагмент ошибки. Этого достаточно, чтобы передать проблему владельцу нужного слоя без раздачи лишних прав и секретов.
Источники
Сведения о версии спецификации, transport и минимальной версии Node.js проверены 23 августа 2026 года. Перед повторением диагностики после обновления client, server, SDK или Inspector сверьте текущую официальную документацию.