MCP стандартизирует описание инструментов, но не делает исполняемый код безопасным автоматически. Локальный сервер запускается на вашем компьютере и наследует доступ процесса. Удаленный сервер получает переданные данные и токены. Поэтому модель доверия должна быть такой же, как для CLI-утилиты или интеграции с API.
Четыре вопроса до установки
- Кто написал и распространяет сервер?
- Какой код фактически будет запущен?
- К каким данным и действиям он получит доступ?
- Что произойдет при компрометации сервера или его зависимости?
Если на один вопрос нет ответа, не подключайте production-секреты.
MCP-сервер — реальная граница доверия
Описание tool видит модель, но операционная система исполняет программу. Красивое имя read_chart не мешает коду дополнительно читать домашнюю папку или отправлять телеметрию, если права и сеть это позволяют.
В официальных Security Best Practices MCP локальный компрометированный сервер рассматривается как источник произвольного выполнения кода, утечки данных и потери файлов. Документ требует осознанного согласия перед запуском локальной команды и рекомендует показывать пользователю точную команду.
1. Проверяйте источник, а не название
Найдите официальный сайт автора и ссылку на репозиторий с него. Остерегайтесь похожих имен пакетов, форков без объяснений и инструкций, которые предлагают запуск одной длинной команды с загрузкой скрипта.
Проверьте:
- возраст репозитория и историю коммитов;
- авторов последних релизов;
- issues о безопасности и неожиданных запросах;
- лицензию;
- наличие lock-файла;
- опубликованный package соответствует репозиторию или нет;
- изменялась ли команда установки недавно.
Для TradingView важно помнить: официального MCP нет. Список сторонних вариантов и их архитектура собраны в статье лучшие MCP для TradingView.
2. Читайте entrypoint и установочные скрипты
Перед первым запуском найдите:
package.jsonscripts и зависимости;pyproject.toml, requirements и entrypoint;- postinstall/preinstall hooks;
- вызовы shell и дочерних процессов;
- чтение файлов за пределами рабочей папки;
- сетевые домены;
- сбор cookies и браузерных профилей;
- телеметрию и crash reports.
| Признак | Почему важен | Безопасное действие |
|---|---|---|
| `curl … | sh` | Код меняется между просмотром и запуском |
npx -y package@latest |
Каждый запуск может получить новую версию | Закрепить точную версию |
| Postinstall | Код выполняется при установке | Прочитать script до install |
| Полный browser profile | Доступ к cookies многих сайтов | Создать отдельный профиль |
| Shell tool без ограничений | Произвольные команды | Не включать или изолировать |
3. Закрепляйте версию и зависимости
Запуск из main, latest или непроверенного git URL делает код подвижным. Сегодня проверена одна версия, завтра исполнится другая.
Практика:
- выберите release или commit hash;
- сохраните lock-файл;
- проверьте checksum артефакта, если он опубликован;
- отключите автоматическое обновление для production;
- обновляйте отдельным процессом с diff и тестом.
Даже надежный автор может потерять учетную запись или выпустить уязвимую зависимость. Pinning уменьшает непредсказуемость, но не заменяет аудит.
4. Давайте минимум секретов
Ключ должен иметь минимальные scopes, отдельный аккаунт и ограниченный срок. Для чтения данных не выдавайте право торговли, удаления или администрирования.
Не передавайте секрет:
- в аргументах команд — они видны в списке процессов;
- в prompt — он может попасть в историю;
- в
config.toml, который синхронизируется или коммитится; - в URL query;
- в обычных логах.
Используйте переменную окружения или системный secret store. В Codex для STDIO можно разрешить конкретную переменную через env_vars, а для HTTP указать имя переменной bearer token. Формат описан в официальной документации Codex MCP.
5. Ограничивайте tools на стороне клиента
Если сервер предлагает десять инструментов, а нужны два, включите allowlist. Для новых write-tools задайте подтверждение.
Пример Codex:
[mcp_servers.market_data]
command = "node"
args = ["C:/mcp/market-data/index.js"]
enabled_tools = ["get_quote", "get_history"]
disabled_tools = ["place_order", "delete_file"]
default_tools_approval_mode = "prompt"
Allowlist уменьшает случайные вызовы модели. Он не защищает от вредоносного кода внутри разрешенного процесса, поэтому нужен вместе с изоляцией ОС.
6. Изолируйте файлы и браузер
Запускайте незнакомый сервер:
- под отдельным пользователем или в контейнере;
- в каталоге без личных документов;
- с read-only mount там, где запись не нужна;
- с отдельным браузерным профилем;
- без SSH-ключей, cloud credentials и production
.env; - с ограниченной исходящей сетью.
Если MCP управляет TradingView Desktop через DevTools, считайте browser session секретом. Не открывайте в том же профиле почту, банк и админки.
7. Контролируйте сеть
Запишите все необходимые домены и заблокируйте остальные. Для удаленного MCP используйте HTTPS и проверяйте точный URL.
Официальные MCP security practices отдельно разбирают SSRF: злонамеренный сервер может подсовывать OAuth metadata URL во внутреннюю сеть, localhost или cloud metadata endpoint. Серверные клиенты должны проверять redirects, блокировать private ranges и использовать egress policy.
Для локальной разработки loopback может быть необходим. Разрешайте конкретный порт, а не всю частную сеть.
8. Не передавайте чужой токен насквозь
Token passthrough — схема, где MCP принимает токен, выпущенный для другого API, и просто передает его дальше. Спецификация запрещает этот анти-паттерн: сервер не может надежно проверить audience и теряет корректный аудит.
Токен должен быть выпущен для конкретного MCP resource server. Для downstream API сервер использует отдельный authorization flow с понятным согласием и scopes.
9. Учитывайте prompt injection
MCP может читать веб-страницы, документы, issue и сообщения. Внутри внешнего текста может находиться инструкция для модели: раскрыть секрет, вызвать другой tool или изменить файл.
Защита строится слоями:
- внешний контент считается данными, а не системной инструкцией;
- read и write tools разделены;
- чувствительные действия требуют подтверждения;
- секреты недоступны модели без необходимости;
- ответы сервера очищаются и ограничиваются;
- действия журналируются.
Спецификация MCP Tools требует от серверов валидировать inputs, применять access control, rate limit и очищать outputs; клиентам рекомендуется подтверждать чувствительные операции и показывать inputs пользователю.
10. Проверяйте OAuth и сессии
Для удаленного сервера убедитесь, что consent screen показывает правильного клиента, scopes и redirect URI. Redirect должен совпадать точно, а state быть одноразовым и проверяться на callback.
Session ID не является аутентификацией. Сервер обязан проверять каждый входящий запрос и связывать сессию с авторизованным пользователем.
11. Ведите журнал и план отзыва
Минимальный audit log содержит:
- время;
- сервер и версию;
- имя tool;
- нормализованные inputs без секретов;
- результат и ошибку;
- пользователя или задачу;
- факт подтверждения.
До запуска ответьте, как быстро отключить сервер, отозвать токен, найти затронутые действия и восстановить данные. Backup без процедуры восстановления — слабая защита.
Безопасный первый запуск
- Создайте тестового пользователя ОС или контейнер.
- Подготовьте синтетические данные.
- Отключите write-tools.
- Запретите доступ к домашним секретам.
- Ограничьте сеть allowlist.
- Запустите сервер и зафиксируйте процессы и соединения.
- Вызовите каждый read-only tool с граничными inputs.
- Проверьте логи на секреты.
- Перезапустите и убедитесь, что версия не изменилась.
- Только затем подключайте минимальный рабочий scope.
Для TradingView-сервера продолжите по инструкции как подключить TradingView MCP к Codex, сохраняя read-only режим.
Вывод
Безопасность MCP определяется не протоколом, а границами процесса, токенами и набором разрешенных действий. Проверяйте точный код, фиксируйте версию, изолируйте окружение и включайте инструменты по одному. Любой сервер, способный читать внешний контент и выполнять запись, нужно проектировать с учетом prompt injection и обязательного подтверждения.
