Начало / Безопасность / Проверка чужого MCP-сервера перед подключением
Проверка чужого MCP-сервера перед подключением
Что посмотреть, прежде чем дать серверу доступ к модели, данным и ключам
MCP-сервер — это код, который получает доступ к вашей модели, а через неё — к данным, файлам и ключам. Подключая чужой сервер, вы доверяете ему не меньше, чем установленной программе. Эта страница — порядок проверки, который укладывается в полчаса и не требует читать весь исходный код.
Пять шагов проверки: шаги 1, 2, 4 и 5 — любому серверу, шаг 3 — удалённому.
Откуда сервер#
- Репозиторий или адрес документации у сервера должен быть открытым. Сервер, который распространяется только готовой сборкой или командой
npxбез ссылки на исходники, проверить нельзя — его не подключают. - Кто выпустил. Официальный сервер производителя программы (например, у Figma, GitHub, Sentry) и сервер от сообщества — разный уровень доверия. У серверов сообщества смотрите, жив ли проект: дата последнего изменения, открытые ошибки, лицензия.
- Лицензия определяет, можно ли использовать сервер в работе компании. Отсутствие лицензии — отказ по умолчанию.
- Команда установки. Если документация предлагает запустить что-то с правами администратора, через
curl … | shили с отключением проверки сертификатов — это повод остановиться.
По этим же признакам отбираются серверы в каталоге справочника; критерии описаны в методике. Карточка каталога экономит первый шаг, но не заменяет остальные.
Что сервер просит#
До запуска прочитайте раздел документации о настройке и выпишите всё, что сервер получает от вас.
| Что просит | Что проверить | Признак беды |
|---|---|---|
| Ключи и токены (переменные окружения, файл настроек) | Для чего каждый ключ; можно ли выдать ключ с ограниченными правами и сроком | Нужен ключ администратора или личный пароль, а не токен |
| Доступ к файлам | Какие каталоги; есть ли параметр, ограничивающий корень | Корень не ограничен или по умолчанию — домашний каталог |
| Доступ в сеть | К каким адресам сервер обращается сам | Обращения к адресам, не связанным с задачей (телеметрия, «обновления») |
Права OAuth (scope) у удалённого сервера | Перечень прав в метаданных защищённого ресурса (scopes_supported) | Запрашивает запись и удаление там, где задача — чтение |
Локальный сервер по stdio работает с правами процесса, который его запустил: у канала нет ни авторизации, ни заголовков. Всё, что доступно вашему пользователю, доступно и серверу. Поэтому для локальных серверов второй шаг — главный.
Ответы по HTTP#
Удалённый сервер по Streamable HTTP обязан вести себя по спецификации ещё до того, как вы ему что-то доверили. Четыре запроса показывают, читал ли автор сервера раздел о безопасности транспорта. Подставьте адрес конечной точки сервера.
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"}}}'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"}}}'curl -s -o /dev/null -w "%{http_code}" https://example.com/mcpcurl -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 · чужой Origin | 403 Forbidden: сервер проверяет Origin (защита от DNS rebinding) | 200 — сервер принимает запросы с любых сайтов; для локального сервера это значит, что к нему может обратиться открытая в браузере страница |
2 · версия 1999-01-01 | 400 Bad Request с UnsupportedProtocolVersionError и списком поддерживаемых версий | 200 — сервер не сверяет версию; 404 — старый сервер HTTP+SSE (до 2025-03-26) |
3 · GET | 405 Method Not Allowed: в ревизии 2026-07-28 конечной точки GET нет | Поток SSE в ответ на GET — сервер прежней ревизии; см. миграцию |
| 4 · без токена | 401 и WWW-Authenticate с resource_metadata; по адресу — authorization_servers и scopes_supported | 200 у сервера с личными данными — авторизации нет, данные открыты всем, кто знает адрес |
Адрес сервера должен начинаться с 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), может подменить их в глазах модели.
Как устроен инструмент и что обязан показывать клиент — на странице «Инструменты». Подробный разбор ловушек в описаниях и результатах — на странице «Подсказки-ловушки через содержимое инструментов».
Первый запуск в изоляции#
- Отдельный профиль. Запустите клиент с отдельным профилем или от отдельного пользователя операционной системы, без доступа к рабочим каталогам и ключам.
- Тестовые данные и тестовый ключ. Ключ с минимальными правами и коротким сроком, тестовая база или копия каталога.
- Подтверждение вызовов включено. Клиент должен показывать каждый вызов инструмента и ждать вашего решения. Как это включить в конкретном клиенте — в руководствах по подключению.
- Журнал. Сохраните запросы и ответы первого сеанса: что модель вызывала, с какими параметрами, что сервер вернул. Ответы инструментов — второй канал ловушек («Утечки через ответы сервера»).
- Только после этого — рабочий профиль, рабочие ключи с ограниченными правами, и лучше по одному серверу за раз.
Короткий список#
| Шаг | Стоп, если |
|---|---|
| Источник | нет исходников, нет лицензии, проект заброшен |
| Права | просит ключ администратора, неограниченный доступ к файлам, лишние права OAuth |
| HTTP | http://, чужой Origin проходит, нет 401 у сервера с личными данными |
| Инструменты | команды модели в описаниях, произвольные параметры, имена-двойники |
| Запуск | клиент не показывает вызовы или не просит подтверждения |