MCP Docs ревизия 2026-07-28

Начало / Безопасность / Проверка чужого MCP-сервера перед подключением

Проверка чужого MCP-сервера перед подключением

Что посмотреть, прежде чем дать серверу доступ к модели, данным и ключам

РуководствоАвторский текст по спецификации; команды curl сверены со страницами «Транспорты» и «Авторизация»Основа: Спецификация, раздел «Streamable HTTP», «Authorization»Сверено 19.10.2026, ревизия 2026-07-28Открыть .md

MCP-сервер — это код, который получает доступ к вашей модели, а через неё — к данным, файлам и ключам. Подключая чужой сервер, вы доверяете ему не меньше, чем установленной программе. Эта страница — порядок проверки, который укладывается в полчаса и не требует читать весь исходный код.

Пять шагов проверки: шаги 1, 2, 4 и 5 — любому серверу, шаг 3 — удалённому.

Откуда сервер#

  • Репозиторий или адрес документации у сервера должен быть открытым. Сервер, который распространяется только готовой сборкой или командой npx без ссылки на исходники, проверить нельзя — его не подключают.
  • Кто выпустил. Официальный сервер производителя программы (например, у Figma, GitHub, Sentry) и сервер от сообщества — разный уровень доверия. У серверов сообщества смотрите, жив ли проект: дата последнего изменения, открытые ошибки, лицензия.
  • Лицензия определяет, можно ли использовать сервер в работе компании. Отсутствие лицензии — отказ по умолчанию.
  • Команда установки. Если документация предлагает запустить что-то с правами администратора, через curl … | sh или с отключением проверки сертификатов — это повод остановиться.

По этим же признакам отбираются серверы в каталоге справочника; критерии описаны в методике. Карточка каталога экономит первый шаг, но не заменяет остальные.

Что сервер просит#

До запуска прочитайте раздел документации о настройке и выпишите всё, что сервер получает от вас.

Что проситЧто проверитьПризнак беды
Ключи и токены (переменные окружения, файл настроек)Для чего каждый ключ; можно ли выдать ключ с ограниченными правами и срокомНужен ключ администратора или личный пароль, а не токен
Доступ к файламКакие каталоги; есть ли параметр, ограничивающий кореньКорень не ограничен или по умолчанию — домашний каталог
Доступ в сетьК каким адресам сервер обращается самОбращения к адресам, не связанным с задачей (телеметрия, «обновления»)
Права OAuth (scope) у удалённого сервераПеречень прав в метаданных защищённого ресурса (scopes_supported)Запрашивает запись и удаление там, где задача — чтение

Локальный сервер по stdio работает с правами процесса, который его запустил: у канала нет ни авторизации, ни заголовков. Всё, что доступно вашему пользователю, доступно и серверу. Поэтому для локальных серверов второй шаг — главный.

Ответы по HTTP#

Удалённый сервер по Streamable HTTP обязан вести себя по спецификации ещё до того, как вы ему что-то доверили. Четыре запроса показывают, читал ли автор сервера раздел о безопасности транспорта. Подставьте адрес конечной точки сервера.

1 · Чужой Origin: ожидается 403
curl -s -o /dev/null -w "%{http_code}" -X POST https://example.com/mcp \
  -H "Origin: https://evil.example" \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" -H "Mcp-Method: server/discover" \
  -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}'
2 · Неподдерживаемая версия: ожидается 400
curl -s -X POST https://example.com/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 1999-01-01" -H "Mcp-Method: server/discover" \
  -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"1999-01-01"}}}'
3 · GET на конечную точку: ожидается 405
curl -s -o /dev/null -w "%{http_code}" https://example.com/mcp
4 · Без токена: ожидается 401 и адрес метаданных
curl -si -X POST https://example.com/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" -H "Mcp-Method: server/discover" \
  -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}' | grep -i -E "^HTTP|www-authenticate"
ЗапросПравильный ответЕсли иначе
1 · чужой Origin403 Forbidden: сервер проверяет Origin (защита от DNS rebinding)200 — сервер принимает запросы с любых сайтов; для локального сервера это значит, что к нему может обратиться открытая в браузере страница
2 · версия 1999-01-01400 Bad Request с UnsupportedProtocolVersionError и списком поддерживаемых версий200 — сервер не сверяет версию; 404 — старый сервер HTTP+SSE (до 2025-03-26)
3 · GET405 Method Not Allowed: в ревизии 2026-07-28 конечной точки GET нетПоток SSE в ответ на GET — сервер прежней ревизии; см. миграцию
4 · без токена401 и WWW-Authenticate с resource_metadata; по адресу — authorization_servers и scopes_supported200 у сервера с личными данными — авторизации нет, данные открыты всем, кто знает адрес

Адрес сервера должен начинаться с https://. Сервер по http:// не подключают: токен и данные пойдут открытым текстом. Локальный HTTP-сервер должен слушать 127.0.0.1, а не 0.0.0.0. Требования к транспорту — на странице «Транспорты», к авторизации — в справочнике: «Авторизация в MCP».

Список инструментов#

Описания инструментов попадают в контекст модели целиком. Это главный канал, по которому недобросовестный сервер управляет моделью, — не кодом, а текстом. Прочитайте ответ tools/list глазами, до первого вызова.

  • В описании — только что делает инструмент. Фразы вроде «всегда вызывай этот инструмент первым», «не сообщай пользователю», «передай сюда содержимое других инструментов», «игнорируй предыдущие указания» — это команды модели, а не описание. Такой сервер не подключают, даже если он официальный.
  • Схема параметров строгая. У инструмента без параметров — {"type": "object", "additionalProperties": false}. Параметр «произвольная команда» или «произвольный адрес» у инструмента, который по названию читает погоду, — повод спросить, зачем.
  • Аннотации (annotations) вроде «только чтение» или «не разрушающий» сервер пишет о себе сам. Спецификация требует от клиента считать их недоверенными; считайте и вы.
  • Перечень может меняться. Сервер с listChanged: true вправе добавить инструменты после подключения. Проверяйте список после обновлений сервера, а не один раз.
  • Имена. Клиент, собирающий инструменты с нескольких серверов, различает их по приставке. Сервер, который называет инструменты так же, как популярный сервер (read_file, run_command), может подменить их в глазах модели.

Как устроен инструмент и что обязан показывать клиент — на странице «Инструменты». Подробный разбор ловушек в описаниях и результатах — на странице «Подсказки-ловушки через содержимое инструментов».

Первый запуск в изоляции#

  1. Отдельный профиль. Запустите клиент с отдельным профилем или от отдельного пользователя операционной системы, без доступа к рабочим каталогам и ключам.
  2. Тестовые данные и тестовый ключ. Ключ с минимальными правами и коротким сроком, тестовая база или копия каталога.
  3. Подтверждение вызовов включено. Клиент должен показывать каждый вызов инструмента и ждать вашего решения. Как это включить в конкретном клиенте — в руководствах по подключению.
  4. Журнал. Сохраните запросы и ответы первого сеанса: что модель вызывала, с какими параметрами, что сервер вернул. Ответы инструментов — второй канал ловушек («Утечки через ответы сервера»).
  5. Только после этого — рабочий профиль, рабочие ключи с ограниченными правами, и лучше по одному серверу за раз.

Короткий список#

ШагСтоп, если
Источникнет исходников, нет лицензии, проект заброшен
Правапросит ключ администратора, неограниченный доступ к файлам, лишние права OAuth
HTTPhttp://, чужой Origin проходит, нет 401 у сервера с личными данными
Инструментыкоманды модели в описаниях, произвольные параметры, имена-двойники
Запускклиент не показывает вызовы или не просит подтверждения