Тестирование MCP-серверов: основы

Тестирование MCP-сервера - проверка того, что сервер соблюдает спецификацию Model Context Protocol, его инструменты, ресурсы и промпты работают правильно, подключаться к нему безопасно, а языковые модели используют его так, как задумано. В статье разобраны основы: чем такое тестирование отличается от привычного, из каких уровней состоит, что требует спецификация и какие есть официальные инструменты.

Требования в статье соответствуют версии спецификации 2026-07-28. Базовые понятия протокола (хост, клиент, сервер, примитивы, транспорты) описаны в статье Что такое MCP.

Кратко

Параметр Значение
Объект тестирования MCP-сервер: его поведение по протоколу, инструменты, ресурсы и промпты
Уровни Логика инструментов, соответствие протоколу, интеграция, безопасность, оценка на моделях
Официальные инструменты MCP Inspector (веб, CLI, TUI), набор тестов соответствия (conformance)
Источник требований Спецификация MCP, Security Best Practices
Версия спецификации 2026-07-28

Чем отличается от тестирования API

MCP-сервер часто служит обёрткой над обычным API, и привычные методы тестирования API к нему применимы. Специфичны для MCP три вещи.

Потребитель - модель. API вызывает человек или программа по документации. Инструмент MCP выбирает модель - по имени, описанию и схеме входных параметров. Инструмент может возвращать правильные результаты и всё равно не работать на практике: модель не вызывает его, когда нужно, вызывает другой инструмент или неверно заполняет аргументы. Описания - часть интерфейса, и их тестируют наравне с кодом.

Есть уровень протокола. Кроме бизнес-логики, сервер обязан соблюдать правила MCP: выбор версии, обязательные поля каждого запроса, объявление возможностей, типы ошибок, поведение транспорта. Клиент другого производителя опирается на эти правила, а не на код сервера.

Поведение с моделью недетерминировано. Один и тот же запрос пользователя в разных запусках и на разных моделях может привести к разным последовательностям вызовов инструментов. Один прогон сценария показывает, что он может работать, но не что он работает надёжно. Этот уровень проверяют статистически: на наборах задач и повторных прогонах.

Уровни тестирования

Уровень Что проверяется Как
Логика инструментов Код за каждым инструментом возвращает правильные результаты и правильные ошибки Обычные модульные тесты обработчиков, без протокола
Соответствие протоколу Сообщения, обнаружение возможностей, версии, схемы и ошибки соответствуют спецификации MCP Inspector, набор тестов соответствия
Интеграция Сервер запускается и работает по своему транспорту в реальном хосте, с конфигурацией и авторизацией MCP Inspector, целевой хост, журналы
Безопасность Токены, доступ к данным и состоянию, проверка входных данных, поведение локального сервера Проверки из Security Best Practices, стандартное тестирование безопасности
Оценка на моделях Модели выбирают нужные инструменты, заполняют аргументы и выполняют задачи Наборы задач, которые модель выполняет с подключённым сервером

Нижние уровни быстрее и дешевле, поэтому их запускают при каждом изменении. Оценка на моделях идёт дольше и тратит ресурсы моделей, поэтому её запускают при изменении инструментов и их описаний и по расписанию.

Соответствие протоколу

Проверки ниже следуют прямо из требований спецификации.

Обнаружение возможностей и версии

  • Каждый сервер обязан реализовать server/discover. В ответе - поддерживаемые версии протокола (supportedVersions) и возможности сервера (capabilities).
  • Запрос с версией, которую сервер не поддерживает, отклоняется ошибкой UnsupportedProtocolVersionError (код -32022); поддерживаемые версии перечислены в поле data ошибки.
  • Каждый запрос несёт в _meta поля io.modelcontextprotocol/protocolVersion и io.modelcontextprotocol/clientCapabilities. Запрос без любого из них отклоняется с кодом -32602 (Invalid params).
  • Если серверу нужна возможность клиента, которую запрос не объявил, например elicitation, сервер возвращает MissingRequiredClientCapabilityError (код -32021) с названиями недостающих возможностей.
  • Сервер объявляет только те возможности, которые реализует: сервер, объявивший tools, обязан отвечать на tools/list.

Инструменты

  • Список, который возвращает tools/list, не должен зависеть от соединения или от других запросов. Он может зависеть от авторизации запроса, например от прав (scopes) токена.
  • Инструменты следует возвращать в детерминированном порядке: клиенты кешируют список, а порядок влияет на кеш промптов модели.
  • inputSchema обязана быть корректным объектом JSON Schema, а не null. Диалект по умолчанию - JSON Schema 2020-12. Для инструмента без параметров спецификация рекомендует { "type": "object", "additionalProperties": false }.
  • Если инструмент объявляет outputSchema, его структурированные результаты (structuredContent) обязаны соответствовать этой схеме.
  • Имя инструмента - от 1 до 128 символов, только латинские буквы, цифры, _, - и .; в пределах сервера имена уникальны.

Ошибки

Спецификация разделяет два вида ошибок, и тест проверяет, что каждый случай попадает в нужный:

Ситуация Как возвращается
Неизвестный инструмент, некорректный запрос, сбой сервера Ошибка JSON-RPC (ошибка протокола)
Неверные аргументы, в том числе значения, которые проходят схему, но не проходят проверку в коде Результат инструмента с isError: true и текстовым пояснением
Сбой внешнего API, ошибка бизнес-логики Результат инструмента с isError: true

Разница важна для модели. Ошибку выполнения инструмента хост передаёт модели, и модель может исправить вызов. Ошибку протокола обычно обрабатывает приложение, и до модели она не доходит. До SEP-1303 реализации возвращали неверные аргументы по-разному; текущая спецификация возвращает все ошибки проверки входных данных как ошибки выполнения инструмента.

Многоэтапные запросы (MRTR)

Для сервера, который запрашивает у клиента дополнительные данные (resultType: "input_required"):

  • inputRequests содержит только те типы запросов, которые клиент объявил в своих возможностях;
  • каждый InputRequiredResult содержит inputRequests, requestState или оба поля;
  • изменённый или чужой requestState отклоняется, если от него зависят авторизация, доступ к ресурсам или бизнес-логика;
  • повторный запрос с ответами правильно обрабатывает любой экземпляр сервера.

Транспорты

  • stdio: в стандартный поток вывода попадают только сообщения MCP. Любой другой вывод, например журнал или отладочная печать, ломает протокол. Журнал пишется в стандартный поток ошибок.
  • Streamable HTTP: сервер работает за балансировщиком нагрузки без привязки клиента к экземпляру, потому что с версии 2026-07-28 сессии протокола нет. Состояние, которое нужно между вызовами, передаётся в явных идентификаторах, и их отдельно проверяют на безопасность.

Официальные инструменты

MCP Inspector

MCP Inspector - эталонный инструмент разработчика для тестирования и отладки MCP-серверов. Распространяется npm-пакетом @modelcontextprotocol/inspector, требует Node.js 22.19.0 или новее и содержит три клиента:

Клиент Команда Назначение
Веб npx @modelcontextprotocol/inspector Графический интерфейс: примитивы, вызовы инструментов, обмен сообщениями JSON-RPC
CLI npx @modelcontextprotocol/inspector --cli Один запрос за запуск с машиночитаемым выводом, для скриптов и CI
TUI npx @modelcontextprotocol/inspector --tui Интерактивный интерфейс в терминале

Сервер передаётся командой, которая его запускает (stdio), или адресом (Streamable HTTP):

Bash
# Локальный сервер по stdio
npx @modelcontextprotocol/inspector node build/index.js

# Удалённый сервер по Streamable HTTP
npx @modelcontextprotocol/inspector --server-url https://api.example.com/mcp --transport http

CLI выполняет один запрос (--method) и завершается с кодом, по которому видно тип сбоя, поэтому скрипт или задача CI может на него опираться:

Код Значение
0 Успех
3 Сервер требует аутентификации (HTTP 401 или 403)
4 Сервер недоступен
5 Инструмент вернул isError: true или не найден
6 --strict нашёл проблему уровня ошибки в схемах инструментов

Минимальная дымовая проверка в CI: сервер запускается, отдаёт нужный инструмент, его схемы проходят строгую проверку, а вызов выполняется успешно.

Bash
set -euo pipefail

# The server starts and exposes the get_weather tool
npx @modelcontextprotocol/inspector --cli node build/index.js \
  --method tools/list --format json \
  | jq -e '.result.tools | map(.name) | index("get_weather")' > /dev/null

# Tool schemas have no error-level problems (exit code 6 otherwise)
npx @modelcontextprotocol/inspector --cli node build/index.js \
  --method tools/list --strict > /dev/null

# The call succeeds (exit code 5 if the result has isError: true)
npx @modelcontextprotocol/inspector --cli node build/index.js \
  --method tools/call --tool-name get_weather --tool-arg city=Boston > /dev/null

Для серверов с авторизацией у CLI есть флаг --stored-auth-only: он использует сохранённый токен и сразу завершается с auth_required, а не открывает браузер, которым задача CI воспользоваться не может.

Набор тестов соответствия

Набор тестов соответствия (conformance, репозиторий modelcontextprotocol/conformance) проверяет реализации клиентов и серверов на соответствие спецификации. Для сервера он выступает клиентом: отправляет тестовые запросы, записывает ответы и проверяет их, в том числе сверяет каждое сообщение JSON-RPC с JSON-схемой спецификации.

Bash
# List the server scenarios
npx @modelcontextprotocol/conformance list --server

# Run all server scenarios against a server over HTTP
npx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp

Результаты каждого сценария сохраняются в results/server-<scenario>-<timestamp>/checks.json со статусом каждой проверки. Известные сбои можно записать в YAML-файл и передать флагом --expected-failures, тогда CI падает только на новых.

Набор служит ориентиром для официальных SDK: SDK уровня Tier 1 обязан проходить все тесты соответствия, SDK уровня Tier 2 - не меньше 80 процентов. С SEP-2484 изменение протокола с наблюдаемым поведением получает финальный статус только вместе со сценарием соответствия, который покрывает его требования. Сравнение контрактов между версиями сервера описано в статье Регрессионное тестирование MCP-сервера.

Безопасность

Спецификация и документ Security Best Practices описывают атаки, которые касаются MCP-серверов. Для каждой есть проверяемое требование:

Что проверить Требование
Токены Сервер принимает только токены, выданные для него, и отклоняет токены с другой аудиторией. На недействительный или просроченный токен - HTTP 401
Передача токена дальше Сервер не пересылает токен клиента в другие API; для них он получает собственные токены
Идентификаторы состояния Идентификатор (например, корзины или процесса) не считается аутентификацией. Идентификаторы случайные, не последовательные, привязаны к пользователю и проверяются при каждом вызове
Права (scopes) scopes_supported содержит минимальный набор; дополнительные права запрашиваются, когда впервые нужна привилегированная операция
Локальный сервер Использует stdio или ограничивает доступ к своему HTTP-эндпоинту токеном или IPC. Локальный HTTP-сервер без защиты доступен другим процессам и через DNS rebinding
Входные и выходные данные инструментов Сервер проверяет все входные данные, контролирует доступ, ограничивает частоту вызовов и очищает результаты
Описания инструментов Описания содержат только описание инструмента. Текст для модели, спрятанный в описании или в данных, которые возвращает инструмент, - разновидность prompt injection

Атаки, на которых основаны эти требования, описаны в статье Безопасность MCP, схема авторизации - в статье Авторизация в MCP, а prompt injection и способы его тестирования - в статье Prompt injection.

Оценка на моделях

Соответствие протоколу показывает, что клиент может работать с сервером. Может ли модель с ним выполнять задачи, показывает только запуск модели. Этот подход Anthropic описывает в руководстве по созданию инструментов для агентов.

  1. Задачи. Набор реалистичных задач на реальных данных, у каждой проверяемый результат: точный ответ или проверка другой моделью. Хорошие задачи требуют нескольких вызовов инструментов.
  2. Прогоны. Каждая задача выполняется в цикле: модель получает задачу и инструменты, вызывает их и получает результаты, пока не даст ответ.
  3. Метрики. Точность ответов, время задач и вызовов инструментов, число вызовов инструментов, расход токенов и ошибки инструментов.
  4. Анализ. Причины видны в стенограммах. Много повторных вызовов указывает на отсутствие постраничной выдачи или фильтров. Частые неверные аргументы указывают на неясные описания или названия параметров.
  5. Итерации. После изменения инструментов или описаний тот же набор запускается снова. Часть задач держат отдельно, чтобы убедиться, что улучшение не ограничено задачами, на которых его настраивали.

Поведение модели меняется от прогона к прогону, поэтому каждую задачу запускают несколько раз и сравнивают доли успешных прогонов. Модели и хосты по-разному выбирают инструменты, поэтому оценку проводят на тех моделях, с которыми работают пользователи сервера. Метод подробно описан в статье Оценка MCP-сервера на моделях, общие методы оценки приложений на языковых моделях - в статье Тестирование приложений на LLM.

Отладка

  • Первый шаг - подключиться к серверу через MCP Inspector и вызвать инструменты напрямую, без модели и хоста.
  • Сервер на stdio пишет журнал только в стандартный поток ошибок; хост этот поток перехватывает. Для HTTP-серверов журналы собирают на стороне сервера, например через OpenTelemetry.
  • Хост может запускать stdio-сервер с неопределённым рабочим каталогом и ограниченным набором переменных окружения. Пути в конфигурации указывают абсолютные, а нужные серверу переменные задают явно в конфигурации хоста.
  • Если подключение не работает, проверяют версию протокола и поля _meta: server/discover показывает, какие версии поддерживает сервер.

Термины

Термин Значение
Соответствие протоколу (conformance) Соответствие реализации требованиям спецификации
Набор тестов соответствия Официальный набор сценариев, который проверяет клиенты и серверы на соответствие спецификации
MCP Inspector Официальный инструмент разработчика: подключается к серверу, вызывает его примитивы и показывает сообщения
Ошибка протокола Ошибка JSON-RPC: неизвестный инструмент, некорректный запрос, сбой сервера. Обычно не доходит до модели
Ошибка выполнения инструмента Результат инструмента с isError: true: неверные аргументы, сбой API, ошибка бизнес-логики. Передаётся модели
Оценка (eval) Прогон набора задач через модель с подключённым сервером, с измеримыми результатами
Идентификатор состояния Идентификатор, который возвращает инструмент и который модель передаёт в следующих вызовах вместо сессии протокола
Передача токена дальше (token passthrough) Пересылка токена клиента в другие сервисы; запрещена спецификацией

Источники

Серия

Model Context Protocol (MCP)
  1. Что такое MCP (Model Context Protocol)
  2. Инструменты (tools) в MCP
  3. Ресурсы и шаблоны ресурсов в MCP
  4. Промпты (prompts) в MCP
  5. Транспорты MCP: stdio и Streamable HTTP
  6. MCP без состояния: изменения 2026-07-28
  7. Авторизация в MCP
  8. Безопасность MCP
  9. Расширения MCP
  10. MCP-сервер поверх существующего API
  11. Тестирование MCP-серверов: основыТекущая
  12. Оценка MCP-сервера на моделях
  13. Регрессионное тестирование MCP-сервера
  14. Публикация MCP-сервера в MCP Registry

Статьи Wiki пишет и поддерживает команда ComplexQA.