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

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

> Страница сайта MCP Docs (https://mcpdocs.ru/security/proverka-servera/). Сверено 19.10.2026, ревизия 2026-07-28.

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

**На заметку**Протокол не проверяет сервер за вас: `serverInfo` и описания инструментов сообщает сам сервер, и от них НЕ СЛЕДУЕТ зависеть решениям о безопасности. Проверка — задача того, кто подключает.

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

- **Репозиторий или адрес документации** у сервера должен быть открытым. Сервер, который распространяется только готовой сборкой или командой `npx` без ссылки на исходники, проверить нельзя — его не подключают.

- **Кто выпустил.** Официальный сервер производителя программы (например, у Figma, GitHub, Sentry) и сервер от сообщества — разный уровень доверия. У серверов сообщества смотрите, жив ли проект: дата последнего изменения, открытые ошибки, лицензия.

- **Лицензия** определяет, можно ли использовать сервер в работе компании. Отсутствие лицензии — отказ по умолчанию.

- **Команда установки.** Если документация предлагает запустить что-то с правами администратора, через `curl … | sh` или с отключением проверки сертификатов — это повод остановиться.

По этим же признакам отбираются серверы в [каталоге справочника](https://mcpprotocol.ru/katalog/); критерии описаны в [методике](https://mcpprotocol.ru/katalog/metodika/). Карточка каталога экономит первый шаг, но не заменяет остальные.

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

До запуска прочитайте раздел документации о настройке и выпишите всё, что сервер получает от вас.
| Что просит | Что проверить | Признак беды |
| Ключи и токены (переменные окружения, файл настроек) | Для чего каждый ключ; можно ли выдать ключ с ограниченными правами и сроком | Нужен ключ администратора или личный пароль, а не токен |
| Доступ к файлам | Какие каталоги; есть ли параметр, ограничивающий корень | Корень не ограничен или по умолчанию — домашний каталог |
| Доступ в сеть | К каким адресам сервер обращается сам | Обращения к адресам, не связанным с задачей (телеметрия, «обновления») |
| Права 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 · чужой `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»](https://mcpprotocol.ru/authorization/).

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

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

- **В описании — только что делает инструмент.** Фразы вроде «всегда вызывай этот инструмент первым», «не сообщай пользователю», «передай сюда содержимое других инструментов», «игнорируй предыдущие указания» — это команды модели, а не описание. Такой сервер не подключают, даже если он официальный.

- **Схема параметров строгая.** У инструмента без параметров — `{"type": "object", "additionalProperties": false}`. Параметр «произвольная команда» или «произвольный адрес» у инструмента, который по названию читает погоду, — повод спросить, зачем.

- **Аннотации (`annotations`)** вроде «только чтение» или «не разрушающий» сервер пишет о себе сам. Спецификация требует от клиента считать их недоверенными; считайте и вы.

- **Перечень может меняться.** Сервер с `listChanged: true` вправе добавить инструменты после подключения. Проверяйте список после обновлений сервера, а не один раз.

- **Имена.** Клиент, собирающий инструменты с нескольких серверов, различает их по приставке. Сервер, который называет инструменты так же, как популярный сервер (`read_file`, `run_command`), может подменить их в глазах модели.

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

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

- **Отдельный профиль.** Запустите клиент с отдельным профилем или от отдельного пользователя операционной системы, без доступа к рабочим каталогам и ключам.

- **Тестовые данные и тестовый ключ.** Ключ с минимальными правами и коротким сроком, тестовая база или копия каталога.

- **Подтверждение вызовов включено.** Клиент должен показывать каждый вызов инструмента и ждать вашего решения. Как это включить в конкретном клиенте — в руководствах по подключению.

- **Журнал.** Сохраните запросы и ответы первого сеанса: что модель вызывала, с какими параметрами, что сервер вернул. Ответы инструментов — второй канал ловушек («Утечки через ответы сервера»).

- **Только после этого** — рабочий профиль, рабочие ключи с ограниченными правами, и лучше по одному серверу за раз.

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

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

**На заметку**Готовые серверы с датой проверки и источником — в [каталоге MCP-серверов](https://mcpprotocol.ru/katalog/) справочника. Запись в каталоге означает, что источник и лицензия сверены на указанную дату; работу сервера каталог не гарантирует.
