Агент умеет читать ваш код и запускать команды в терминале — но он не видит тикет в трекере, макет в Figma и свежую документацию библиотеки, которую вы обновили вчера. Всё это приходится копировать в чат руками. MCP закрывает именно эту дыру: вы один раз объявляете внешний сервер, и его инструменты появляются у агента в сессии. Разберём, как это делается в OpenAI Codex — где лежит конфигурация, какие ключи в ней работают, как передать секрет, что делать с молчащим сервером и сколько такое подключение стоит в токенах.
- Коротко (TL;DR)
- Что даёт Codex подключённый MCP-сервер
- Два транспорта Codex: локальный stdio и удалённый Streamable HTTP
- Объявляем сервер в config.toml: разбор каждого ключа
- Команды codex mcp add, list, get и remove
- Переменные окружения и секреты: чем env отличается от env_vars
- Авторизация сервера: codex mcp login, bearer-токен и сессия ChatGPT
- Проверяем, что инструменты доехали до агента
- Молчащий MCP-сервер: пять причин и что смотреть в каждой
- MCP в облачных задачах против локального запуска Codex
- Сколько контекста стоит десяток серверов: замер на четырёх
- Доверие к сторонним серверам: чем рискует репозиторий
- Codex сам как MCP-сервер: команда codex mcp-server
- MCP, скилл или плагин: что выбрать под задачу
- Какие MCP-серверы стоит подключить к Codex и как объявить каждый
- Что в настройке MCP устареет первым и чем проверить у себя
- FAQ
Коротко (TL;DR)
MCP (Model Context Protocol) — это стандарт, по которому агент подключается к внешним инструментам и данным. Если вам нужно понять сам протокол — клиент, сервер, инструменты, ресурсы — у нас есть отдельный разбор что такое MCP и как он устроен. Здесь речь только про настройку в OpenAI Codex: что именно писать в файл и какие грабли ждут.
Главное, что нужно знать сразу (данные на 11 августа 2026, Codex CLI версии 0.147.0):
- Настройки MCP живут в общем файле конфигурации
~/.codex/config.toml, в секциях вида[mcp_servers.<имя>](официальная документация Codex по MCP). Отдельного файла под MCP нет. - Один конфиг на три поверхности. Десктоп-приложение ChatGPT, Codex CLI и расширение для IDE делят одну MCP-конфигурацию для одного хоста: настроили один раз — переключаетесь между клиентами без повторной настройки.
- Транспорта два. Локальный процесс (
stdio), который Codex запускает сам командой, и удалённый сервер по адресу (Streamable HTTP). Третьего варианта нет. - Есть путь через терминал:
codex mcp add,list,get,remove,login,logout. Команда удобнее для первой настройки, файл — для того, что нужно повторять на новой машине. - Проверка подключения — команда
/mcpв интерфейсе Codex: она показывает подключённые серверы и их инструменты. - Подключение не бесплатное. По моему замеру четыре типовых сервера дают 69 инструментов, схемы которых занимают около 13 тысяч токенов контекста в каждом ходу — ещё до первой строчки вашего кода.
Дальше — по порядку: транспорты, все ключи конфигурации, команды, секреты, авторизация, проверка, отладка, облако, цена и доверие к чужим серверам.
Что даёт Codex подключённый MCP-сервер
После подключения у агента появляются инструменты — функции, которые он может вызвать во время сессии сам, без вашего копирования данных в чат. Сервер Linear отдаёт инструменты работы с тикетами, сервер Figma — доступ к макетам, Context7 — свежую документацию библиотек.
Кроме инструментов Codex читает у сервера поле instructions — текст, который сервер возвращает при инициализации. Codex использует его как указание, действующее на весь сервер, рядом с описаниями отдельных инструментов. Официальная документация советует авторам серверов держать первые 512 символов этого поля самодостаточными: именно они доступны модели в момент, когда она решает, как пользоваться сервером.
Практическая рамка простая. Встроенных возможностей Codex — файловая система, команды оболочки, git, веб-поиск — хватает для почти любой работы внутри репозитория. MCP нужен там, где задача выходит за его границы: трекер задач, дизайн-инструмент, браузер, база данных, внутренний сервис компании. Это же говорит и сама документация OpenAI: MCP берут, когда агенту нужны возможности, которые живут вне локального рабочего пространства.
Два транспорта Codex: локальный stdio и удалённый Streamable HTTP
Первое решение при настройке — какой транспорт. Codex поддерживает ровно два, и они же являются двумя стандартными привязками в спецификации протокола.STDIO Streamable HTTP Где живёт сервер на вашей машине, отдельным процессом на удалённом адресе Кто запускает Codex сам, указанной командой никто, сервер уже работает Обязательный ключ commandurlКак общаются JSON-RPC по стандартным потокам процесса HTTP POST на единственный эндпоинт Авторизация через переменные окружения bearer-токен, OAuth, сессия ChatGPT, статические заголовки Чем удобен доступ к локальным файлам, свой закрытый код ничего не ставить, работает сразу Чем неудобен нужен установленный рантайм, холодный старт нужна сеть, данные уходят наружу
Про SSE стоит сказать отдельно, потому что вокруг него много путаницы. Отдельного транспорта «HTTP+SSE» больше нет: Streamable HTTP заменил его начиная с ревизии протокола 2024-11-05. Но сам механизм Server-Sent Events никуда не делся — он используется внутри Streamable HTTP, когда сервер отдаёт ответ потоком. То есть умер транспорт, а не технология.
Ещё одна тонкость для тех, кто копает глубже. Свежая ревизия спецификации от 28 июля 2026 заметно поменяла устройство протокола: убрала сессию с рукопожатием initialize и запретила серверу самому инициировать запросы. При этом все четыре сервера, которые я поднимал для замеров 11 августа 2026, согласовали предыдущую ревизию — 2025-06-18, а документация Codex по-прежнему описывает чтение поля instructions «при инициализации». Вывод для практики: экосистема живёт на предыдущей ревизии, и сверять состояние надо не по гайдам, а по ответу самого сервера.
Объявляем сервер в config.toml: разбор каждого ключа
Codex хранит настройки MCP в config.toml рядом с остальной конфигурацией. По умолчанию это ~/.codex/config.toml. Можно ограничить серверы одним проектом через .codex/config.toml в репозитории — но только для проектов, которым вы явно доверяете.
Каждый сервер описывается таблицей [mcp_servers.<имя>]. Имя вы придумываете сами, по нему потом обращаются команды get, remove и login.
Вот рабочий пример локального сервера:
[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]
env_vars = ["LOCAL_TOKEN"]
[mcp_servers.context7.env]
MY_ENV_VAR = "MY_ENV_VALUE"
Ключи stdio-сервера:Ключ Обязателен Что делает commandда команда, которая запускает сервер argsнет аргументы команды, списком envнет переменные окружения со значениями для процесса сервера env_varsнет переменные, которые разрешено пробросить из окружения по имени cwdнет рабочий каталог, из которого стартует сервер experimental_environmentнет значение remote запускает сервер через удалённый исполнитель, если он доступен
А вот удалённый сервер:
[mcp_servers.figma]
url = "https://mcp.figma.com/mcp"
bearer_token_env_var = "FIGMA_OAUTH_TOKEN"
http_headers = { "X-Figma-Region" = "us-east-1" }
Ключи HTTP-сервера:Ключ Обязателен Что делает urlда адрес MCP-эндпоинта authнет что пробовать после токенов и заголовков: oauth (по умолчанию) или chatgptbearer_token_env_varнет имя переменной, из которой брать токен для заголовка Authorizationhttp_headersнет заголовки со статическими значениями env_http_headersнет заголовки, значения которых берутся из переменных окружения scopesнет OAuth-права, которые запрашивать при входе oauth_resourceнет параметр resource по RFC 8707, если сервер его требует
Общие ключи работают для обоих транспортов:Ключ По умолчанию Что делает startup_timeout_sec10 секунд сколько ждать запуска сервера tool_timeout_sec60 секунд сколько ждать выполнения одного инструмента enabledtruefalse выключает сервер, не удаляя настройкуrequiredfalsetrue роняет запуск Codex, если сервер не смог поднятьсяenabled_tools— разрешительный список имён инструментов disabled_tools— запретительный список, применяется после разрешительного default_tools_approval_mode— политика одобрения для инструментов сервера: auto, prompt, writes, approvetools.<инструмент>.approval_mode— политика для одного конкретного инструмента
Собранный вместе тонко настроенный сервер выглядит так:
[mcp_servers.chrome_devtools]
url = "http://localhost:3000/mcp"
enabled_tools = ["open", "screenshot"]
disabled_tools = ["screenshot"] # применяется ПОСЛЕ enabled_tools
default_tools_approval_mode = "prompt"
startup_timeout_sec = 20
tool_timeout_sec = 45
enabled = true
[mcp_servers.chrome_devtools.tools.open]
approval_mode = "approve"
Обратите внимание на screenshot: он стоит в обоих списках, и запрет побеждает. Это официальный пример, и он специально показывает приоритет.
Ключ type в конфигурацию не пишем
По сторонним гайдам кочует строка type = "stdio" внутри блока сервера. В справочнике опций Codex такого ключа нет, и я решил проверить это не на слово, а экспериментом на изолированной копии конфигурации.
В обычном режиме Codex такую строку молча проглатывает — конфигурация загружается, сервер работает. Но у CLI есть флаг --strict-config, который сам описан как «ошибиться, если config.toml содержит поля, не распознанные этой версией Codex». Под ним тот же файл падает с конкретной формулировкой:
Error: error loading config: .../config.toml:2:1:
unknown configuration field `mcp_servers.withtype.type`
Метод я проверил контролем: дописал в заведомо валидный конфиг несуществующий ключ bogus_key_check — и режим назвал его по имени точно так же. То есть проверка работает, и вердикт по type однозначный: этой версией Codex ключ не распознаётся.
Откуда тогда путаница? Поле type действительно существует — но в выводе, а не во входном файле. Команда codex mcp list --json печатает блок transport с полем type и значениями stdio или streamable_http. Авторы гайдов видят его в выводе и переносят во входной конфиг. Вреда от лишней строки в обычном режиме нет, пользы — тоже.
Команды codex mcp add, list, get и remove
Второй путь настройки — терминал, без ручной правки файла. Точный синтаксис по версии 0.147.0:Команда Что делает codex mcp add <ИМЯ> -- <команда>добавляет локальный stdio-сервер codex mcp add <ИМЯ> --url <АДРЕС>добавляет удалённый HTTP-сервер codex mcp list [--json]показывает настроенные серверы codex mcp get <ИМЯ> [--json]показывает конфигурацию одного сервера codex mcp remove <ИМЯ>удаляет запись codex mcp login <ИМЯ> [--scopes ПРАВА]запускает OAuth-вход у сервера codex mcp logout <ИМЯ>сбрасывает авторизацию
Форма записи у add строгая: codex mcp add [OPTIONS] <NAME> (--url <URL> | -- <COMMAND>...). Либо адрес, либо команда после двойного тире — вместе они не используются. Полезные флаги:
--env KEY=VALUE— переменные окружения для сервера, только для stdio;--bearer-token-env-var ENV_VAR— имя переменной с токеном, только для HTTP;--oauth-client-idи--oauth-resource— параметры OAuth-входа.
Официальный пример добавления бесплатного сервера документации выглядит так:
codex mcp add context7 -- npx -y @upstash/context7-mcp
А удалённый сервер GitHub, по инструкции самого GitHub, подключается через HTTP-эндпоинт:
codex mcp add github --url https://api.githubcopilot.com/mcp/ \
--bearer-token-env-var GITHUB_PAT_TOKEN
Когда что выбирать: команда быстрее и не даёт опечататься в имени ключа, а файл воспроизводим — его можно положить в свои dotfiles и развернуть на новой машине одним движением. Тонкая настройка вроде enabled_tools или политики одобрений в любом случае делается файлом.
Переменные окружения и секреты: чем env отличается от env_vars
Это та развилка, на которой чаще всего застревают: сервер запускается, а токена не видит. У stdio-сервера есть два разных ключа, и они делают разные вещи.
env— задаёт переменным значения. ПишетеMY_ENV_VAR = "MY_ENV_VALUE"— процесс сервера получит именно это значение.env_vars— перечисляет переменные, которые разрешено пробросить из окружения. В справочнике опций это названо белым списком: вы указываете имя, а значение подхватывается из вашего окружения.
Разница видна в выводе codex mcp list --json: env возвращается картой со значениями, а env_vars — списком имён. В моём эксперименте это выглядело как "env": {"MY_ENV_VAR": "MY_ENV_VALUE"} против "env_vars": ["LOCAL_TOKEN"].
У env_vars есть расширенная форма записи с указанием источника:
env_vars = ["LOCAL_TOKEN", { name = "REMOTE_TOKEN", source = "remote" }]
Простая строка и source = "local" читают локальное окружение Codex. source = "remote" читает окружение удалённого исполнителя и работает только с удалённым stdio.
Отдельно про секреты у HTTP-серверов: ключ bearer_token_env_var хранит имя переменной, а не сам токен. Записать токен значением в config.toml нельзя ни одним из документированных ключей — и это правильное поведение, потому что конфигурация нередко попадает в dotfiles-репозиторий.
Приятная деталь, которую я заметил в эксперименте: табличный вывод codex mcp list маскирует значения переменных звёздочками (MY_ENV_VAR=*****), оставляя видимыми имена. Конфигурацию можно показать коллеге или вставить в тикет, не раскрыв секретов.
Авторизация сервера: codex mcp login, bearer-токен и сессия ChatGPT
У stdio-серверов авторизации как отдельного механизма нет — и это не упущение Codex, а требование спецификации: реализациям на stdio предписано не следовать OAuth-спецификации, а получать учётные данные из окружения. Отсюда и набор ключей: только env и env_vars.
У HTTP-серверов источников несколько, и порядок важен. Ключ auth — это то, что пробуется после настроенных bearer-токенов и заголовков авторизации:
oauth(значение по умолчанию) — берёт сохранённые MCP-OAuth-креды;chatgpt— использует текущую сессию ChatGPT для доверенного первопартийного адреса, с откатом на сохранённый OAuth.
Важная оговорка из документации: если ни один источник учётных данных не разрешился, Codex может подключиться к серверу вообще без авторизации. То есть «подключилось» не означает «авторизовалось», и это стоит проверять глазами.
Для входа у сервера, который требует OAuth, есть отдельная команда:
codex mcp login figma --scopes files:read,file_comments:write
Сама спецификация требует от HTTP-транспорта OAuth 2.1 с обязательным PKCE, реализации Protected Resource Metadata (RFC 9728) на стороне сервера и параметра resource по RFC 8707 на стороне клиента. Отсюда и ключи scopes и oauth_resource в конфигурации Codex — они прямое следствие этих требований.
Две настройки спасают в неудобных случаях:
mcp_oauth_callback_port(верхнеуровневый ключ, в официальном примере5555) — если провайдер требует фиксированный порт обратного вызова. Без него Codex занимает произвольный свободный порт.mcp_oauth_callback_url— если нужен свой адрес обратного вызова. Здесь легко ошибиться: этот ключ задаёт базовый адрес, к которому Codex дописывает серверный идентификатор, и регистрировать в провайдере нужно полный итоговыйredirect_uriвместе с этим суффиксом, а не только базовый хост.
Где лежат полученные токены, задаёт ключ mcp_oauth_credentials_store. Допустимые значения — auto, file и keyring, и этот набор я получил от самого Codex: подставил в конфигурацию заведомо неверное значение под --strict-config и получил ответ «unknown variant bogus_value, expected one of auto, file, keyring». То есть по умолчанию (auto) выбор делает сам Codex, а keyring явно просит системное хранилище ключей.
Дальше начинается зона, где я не могу дать гарантию. По разбору исходников на стороннем ресурсе, при недоступном системном хранилище Codex откатывается на файл $CODEX_HOME/.credentials.json открытым текстом. Официального подтверждения этой детали я не нашёл, поэтому считаю её вероятной, но непроверенной. Практический вывод от неё не зависит: если для вас важно, где физически лежит токен от чужого сервиса, ставьте keyring явно, а не полагайтесь на auto.
Проверяем, что инструменты доехали до агента
Объявить сервер и подключить сервер — разные события. Приёмка настройки занимает минуту и делается тремя способами.
/mcpв интерфейсе Codex. Штатный способ: команда показывает активные серверы и их инструменты. Работает и в терминальном интерфейсе — если вы с ним ещё не освоились, весь рабочий цикл Codex CLI разобран отдельно, — и в композере приложения. Если сервер в списке есть, а инструментов у него ноль — проблема на стороне сервера, а не конфигурации.codex mcp listв терминале. Выводит две таблицы — отдельно локальные stdio-серверы, отдельно удалённые HTTP — с колонками статуса и авторизации. Флаг--jsonотдаёт то же машиночитаемо.codex mcp get <имя> --json— конфигурация одного сервера так, как её увидел Codex. Быстрый способ поймать опечатку в ключе: если вы ждалиenabled_tools, а в выводе его нет, значит написали не то.
В выводе есть поле, которого нет на странице документации про MCP, — auth_status (в таблице это колонка Auth). У stdio-сервера оно показало unsupported, у HTTP-сервера с bearer-токеном — bearer_token. Это самый быстрый способ увидеть, какой источник учётных данных разрешился, ещё до запуска сессии.
Общая диагностика установки — команда codex doctor: она проверяет установку, конфигурацию, авторизацию и состояние рантайма. А вот точечной проверки одного сервера в Codex пока нет: команды codex mcp check <server> не существует, это открытый запрос на функциональность в репозитории с 25 мая 2026.
Молчащий MCP-сервер: пять причин и что смотреть в каждой
Самая частая жалоба звучит так: сервер добавлен, в конфигурации всё правильно, а инструментов у агента нет. Причин немного, и они хорошо различаются по симптому.Симптом Причина Что делать Codex не стартует, ругается на конфигурацию в блоке нет ни command, ни url — транспорт не определёндобавить command для локального сервера или url для удалённогоСервер в списке есть, инструментов ноль сервер печатает в стандартный вывод что-то помимо сообщений протокола смотреть, что пакет пишет при старте; запустить команду сервера руками в терминале Сервер «не успевает» не хватает дефолтных 10 секунд на старт поднять startup_timeout_sec, прогреть пакет заранееРаботает на macOS и Linux, падает на Windows запуск через npx/corepack не резолвитсяуказать абсолютный путь к node.exeИнструмент вызывается, но обрывается не хватает дефолтных 60 секунд на вызов поднять tool_timeout_sec
Первую строку я воспроизвёл сам: положил в изолированную конфигурацию блок только с args, без команды и адреса. Codex отвечает так:
Error: failed to load bootstrap configuration
Caused by:
invalid transport
in `mcp_servers.broken`
Вторая строка — самая недооценённая, и её стоит объяснить подробно, потому что она объясняет большинство «молчащих» серверов. Спецификация требует от stdio-сервера жёстко: он не имеет права писать в стандартный вывод ничего, кроме валидных сообщений протокола; для логов есть стандартный поток ошибок. А пакеты из npm любят напечатать при старте баннер, предупреждение об устаревшей версии или подсказку. Любая такая строка ломает поток JSON-RPC — и Codex видит сервер, который отвечает мусором. Проверяется просто: запустите ту же команду в терминале руками и посмотрите, что она печатает до первой строки JSON.
Про таймауты полезно знать порядок величин. В моём замере «прогретые» серверы поднимались за 0,62–0,82 секунды, а при первом холодном запуске с загрузкой пакета — за 1,64–4,91 секунды. Дефолтный лимит старта — 10 секунд, то есть на быстром канале запас есть, а на медленном первый запуск в него укладывается уже не всегда.
Windows-случай отмечен в репозитории отдельным открытым тикетом от 30 марта 2026: stdio-сервер падает при запуске через corepack/npx, но работает при указании абсолютного пути к node.exe. Тикет заведён на десктопное приложение (версия 0.117.0-alpha), но конфигурация у поверхностей общая, поэтому относиться к этому стоит как к общей особенности Windows, а не как к баге одного клиента. Если у команды часть разработчиков на Windows, проще сразу договориться об абсолютных путях в проектной конфигурации.
MCP в облачных задачах против локального запуска Codex
Здесь нужна честность, потому что гайды обычно пишут «настройте MCP в Codex», не разделяя поверхности продукта. А поверхности ведут себя по-разному.Поверхность Настройка MCP Примечание Codex CLI да, config.tomlполный набор ключей Расширение для IDE да, общий конфиг тот же файл, что у CLI Десктоп-приложение ChatGPT да, общий конфиг плюс настройка через интерфейс ChatGPT в браузере только через плагины локальные файлы конфигурации не читаются Облачные задачи в документации не описано см. ниже
По состоянию на 11 августа 2026 официальные страницы про облачное окружение Codex — устройство контейнера, скрипты установки, кэш, доступ в интернет — MCP-серверы не упоминают вовсе, а на форуме OpenAI с 7 октября 2025 висит открытый запрос на поддержку MCP в облачных задачах, без ответа. Прямой формулировки «в облаке MCP не поддерживается» в документации нет, поэтому корректно говорить о состоянии документации, а не о невозможности в принципе. Практический вывод один: рассчитывать на MCP в облачных задачах не стоит, а сценарии с внешними инструментами держать на локальном клиенте.
Две особенности облака объясняют, почему это не лечится обходными путями.
Во-первых, сеть. В фазе работы агента доступ в интернет по умолчанию заблокирован; скрипт установки при этом выполняется с доступом, чтобы поставить зависимости. Разрешить сеть можно, но осмысленно — списком доменов (есть готовый набор для сборки зависимостей) и, для дополнительной защиты, ограничением методов до GET, HEAD и OPTIONS, при котором POST, PUT, PATCH и DELETE блокируются. Удалённый MCP-сервер, которому нужен POST на свой эндпоинт, в такую политику не впишется.
Во-вторых, секреты. Обычные переменные окружения живут всю задачу, а секреты доступны только скриптам установки и по соображениям безопасности удаляются до начала фазы агента. То есть привычная схема «положу токен сервера в секреты окружения» в облаке не работает по устройству.
Есть экспериментальный ключ experimental_environment со значением remote, который запускает stdio-сервер через удалённый исполнитель, когда тот доступен. Но для удалённых HTTP-серверов такое размещение, по формулировке справочника, не реализовано — так что полноценным ответом на «MCP в облаке» этот ключ считать нельзя.
Сколько контекста стоит десяток серверов: замер на четырёх
«MCP съедает контекст» — общее место, но цифр почти никто не приводит. Я решил измерить сам, потому что от этого зависит практическое решение, сколько серверов держать включёнными.
Метод простой и воспроизводимый: поднять сервер по stdio, выполнить инициализацию, запросить список инструментов и посчитать, сколько занимают их схемы — имя, описание и JSON Schema входных параметров. Именно эти схемы клиент обязан положить в промпт, чтобы модель знала, что она может вызвать. Считал тем же токенизатором, который используют модели OpenAI. Замер от 11 августа 2026:Сервер Версия Инструментов Символов схем Токенов Chrome DevTools MCP 1.7.0 29 23 257 5 098 Playwright MCP 1.63.0-alpha 24 18 502 4 024 Filesystem (референсный) 0.2.0 14 12 973 2 823 Context7 4.0.2 2 4 860 1 052 Итого 69 59 592 12 997
Тринадцать тысяч токенов за четыре сервера — столько уезжает в контекст в каждом ходу, до первой строки вашего кода и до вашего вопроса.
Самое полезное в этой таблице — не итог, а разброс. На один инструмент выходит от 168 до 526 токенов, и «дорогой» сервер — не тот, у кого больше инструментов. У Context7 их всего два, но каждый стоит 526 токенов, потому что описания длинные. А у Playwright с его 24 инструментами выходит 168 токенов на штуку. То есть считать надо не серверы и даже не инструменты, а объём описаний.
Оговорю ограничение метода: я мерил сами схемы, а фактический промпт клиента добавляет собственную обвязку вокруг каждого инструмента, поэтому мою цифру честно считать нижней границей. Независимая оценка есть только одна: сторонняя публикация от 8 апреля 2026 даёт 200–500 токенов накладных на сервер, 550–1400 токенов на инструмент и около 55 тысяч токенов за ход у сервера GitHub с 93 инструментами. Это существенно больше моего замера, метод там не описан — привожу как чужую оценку, а не как факт.
Цена не только в токенах. В репозитории Codex открыт тикет от 6 мая 2026 о том, что при большом числе настроенных серверов обнаружение инструментов блокирует первый ход, а команды-слэши недоступны, пока идёт запуск MCP. Другой открытый тикет, от 20 июля 2026, описывает, как при большом каталоге инструментов отладочные записи пишут в локальный журнал дампы списка инструментов примерно по 1,3 МБ. Ещё один, уже закрытый, был про лаги десктоп-приложения на «токен-тяжёлых» серверах.
Лечится это не отключением серверов, а урезанием каталога:
enabled_tools— оставить у сервера только те инструменты, которыми реально пользуетесь. Из 29 инструментов браузерного сервера в конкретной задаче нужны три-четыре.disabled_tools— убрать точечно то, что мешает; помните, что запрет применяется после разрешения.enabled = false— держать сервер объявленным, но выключенным до момента, когда он понадобится.
Правильная настройка десятка серверов — это не «включить пять из десяти», а «оставить у каждого те три инструмента, которые нужны». Цена падает пропорционально объёму описаний, а не количеству блоков в конфигурации.
Доверие к сторонним серверам: чем рискует репозиторий
MCP-сервер — это чужой код, который агент запускает у вас на машине или чужой сервис, которому агент отправляет запросы. Риск здесь не гипотетический, и OpenAI разбирает его на своём примере.
Внедрение инструкций через данные. Всё, что возвращает инструмент, модель читает как текст — и не всегда отличает данные от указаний. В официальном разборе есть рабочий пример: вы просите Codex починить проблему по ссылке на тикет, а в описании тикета спрятана инструкция выполнить команду, которая отправляет последний коммит на сторонний сервер. Если агент её выполнит, код утечёт. MCP-сервер — точно такой же канал недоверенного текста: ответ трекера, описание задачи, содержимое веб-страницы.
Права инструментов шире, чем кажется. Деструктивные вызовы инструментов обязательно требуют одобрения, если инструмент объявил соответствующую аннотацию. Ключевое слово — «объявил»: гарантия зависит от добросовестности автора сервера. Управляемая часть на вашей стороне — политика одобрений: default_tools_approval_mode со значениями auto, prompt, writes и approve (режим writes спрашивает по инструментам, не помеченным как читающие) и переопределение на конкретный инструмент через tools.<инструмент>.approval_mode. Как это стыкуется с общими правилами доступа агента, разобрано в материале про режимы одобрения и песочницу.
Секрет уходит дальше, чем вы думаете. Токен, который вы дали серверу, доступен серверу целиком — а не «только для чтения тикетов». Личный токен доступа с широкими правами, отданный чужому серверу, эквивалентен выдаче этих прав автору сервера.
Что делать практически:
- давать серверу минимальные права в самом сервисе, а не полагаться на настройки Codex;
- держать
default_tools_approval_mode = "prompt"у любого сервера, которому не доверяете полностью; - урезать каталог до нужных инструментов — это одновременно и про токены, и про безопасность;
- предпочитать официальные серверы вендора сервиса неофициальным обёрткам;
- помнить про дефолты: локальный режим песочницы
workspace-writeдержит сеть выключенной, а в облаке интернет в фазе агента тоже выключен по умолчанию. Риск создаёт тот, кто эти дефолты ослабляет.
Проектная конфигурация .codex/config.toml заслуживает отдельной осторожности: она работает только для доверенных проектов, и это не формальность. Файл в чужом репозитории — это чужой список серверов, которые запустятся у вас.
Codex сам как MCP-сервер: команда codex mcp-server
У Codex две роли, и вторая почти не описана в русскоязычных материалах. Если поискать «MCP-сервер для Codex», половина выдачи окажется про сторонние обёртки с названиями вроде codex-mcp-server на GitHub — то есть про Codex в роли сервера для других агентов. Штатный способ для этого есть, и чужой пакет для него не нужен:
codex mcp-server
Команда описана самим CLI как «запустить Codex как MCP-сервер (stdio)». Она отдаёт два инструмента:
codex— запустить сессию Codex. Кроме обязательногоpromptпринимает переопределения: политику одобрений, режим песочницы (read-only,workspace-write,danger-full-access), модель, рабочий каталог, отдельные настройки конфигурации.codex-reply— продолжить сессию по идентификатору потока.
Осмотреть интерфейс можно инспектором протокола:
npx @modelcontextprotocol/inspector codex mcp-server
Важная оговорка: в репозитории этот интерфейс помечен как экспериментальный и подверженный изменениям без предупреждения. Для рабочего конвейера это значит «закрепите версию и ждите поломок при обновлении», а не «не используйте».
Зачем это нужно на практике: так Codex встраивается в чужого агента как исполнитель — например, оркестратор вызывает Codex на задачу по репозиторию и получает результат. Если вам ближе обратный сценарий, где Codex остаётся главным, — это всё, о чём шла речь выше.
MCP, скилл или плагин: что выбрать под задачу
Прежде чем подключать сервер, стоит проверить, нужен ли он вообще. У Codex три механизма расширения, и они решают разные задачи — эту развилку документация описывает прямо, а гайды по настройке обычно пропускают.Механизм Для чего Цена контекста Скилл повторяемый рабочий процесс: инструкции, скрипты, справочные материалы заранее грузятся только метаданные, полный текст — при выборе MCP-сервер доступ к системам вне локального рабочего пространства схемы инструментов в контексте постоянно Плагин упаковка готового набора для распространения; может нести MCP-серверы в манифесте зависит от содержимого
Практическая лесенка получается такая. Если задача решается встроенными возможностями — файлы, команды оболочки, git — не подключайте ничего. Если это повторяемый процесс с вашими правилами — это скилл; кстати, правила проекта в целом задаются файлом AGENTS.md, и он часто закрывает то, для чего люди тянутся к MCP. Если нужны внешние системы — трекер, дизайн, браузер, база — тогда MCP.
Часто лучший ответ — комбинация: скилл описывает процесс и называет, какие инструменты MCP использовать. Разница в цене контекста здесь не в пользу MCP: у скиллов работает постепенное раскрытие, когда заранее видны только метаданные, а у MCP схемы инструментов лежат в контексте всё время.
У серверов, пришедших из плагина, есть своя особенность: транспорт и команду такого сервера пользовательская конфигурация не задаёт — они приходят из манифеста плагина. Но включением и политикой инструментов управлять можно, через отдельную секцию plugins.<плагин>.mcp_servers.<сервер>.
Если вы работаете и с другими агентами, полезно сравнить механику: в Claude Code тот же протокол настраивается иначе, и разбор MCP в Claude Code показывает, где различия принципиальные, а где косметические.
Какие MCP-серверы стоит подключить к Codex и как объявить каждый
Список серверов растёт быстро, поэтому ниже — те, что названы в официальной документации Codex как обычные рабочие варианты, с типом подключения и точкой внимания при отладке.Сервер Что даёт агенту Как объявить На что смотреть при отладке Context7 свежую документацию библиотек и фреймворков stdio: npx -y @upstash/context7-mcpдва инструмента, но описания длинные — дороже, чем кажется OpenAI Docs MCP поиск и чтение документации OpenAI по инструкции сервиса сетевой доступ, авторизация GitHub pull request, issues и всё, чего нет в gitHTTP: https://api.githubcopilot.com/mcp/ + bearer_token_env_varправа токена; большой каталог инструментов Figma доступ к макетам HTTP (удалённый) либо локальный вариант адрес берётся в интерфейсе Figma; OAuth-вход Playwright управление браузером и проверка страниц stdio: npx -y @playwright/mcp@latestхолодный старт против таймаута 10 секунд Chrome DevTools инспекция и управление Chrome stdio по инструкции сервера самый большой каталог из замеренных Sentry доступ к журналам ошибок по инструкции сервиса права токена, объём ответов
Отдельно про подход к выбору. Соблазн подключить всё сразу понятен, но по замеру выше видно, чем это оплачивается. Разумная стартовая конфигурация — один сервер документации и один сервер того сервиса, где живут ваши задачи. Браузерные серверы включать под конкретную работу: у них самые большие каталоги.
Что в настройке MCP устареет первым и чем проверить у себя
Тема быстро движется, поэтому отмечу, что проверять в первую очередь. Волатильны версия CLI и состав подкоманд (на 11 августа 2026 это 0.147.0, релиз от 7 августа), набор ключей конфигурации, дефолтные таймауты, поддержка MCP в облаке, ревизия протокола и цена схем в токенах.
Проверять лучше не по гайдам, а по трём командам: codex mcp --help покажет актуальный состав подкоманд, codex mcp get <имя> --json — как Codex прочитал вашу конфигурацию, а codex doctor — состояние установки в целом. Если сомневаетесь, признаёт ли Codex какой-то ключ, воспроизведите мой приём: запустите с --strict-config и посмотрите, не назовёт ли он поле неизвестным. Ещё один надёжный ход — привыкнуть смотреть в /mcp после каждой правки конфигурации; это две секунды, а лечит большинство недоразумений.
FAQ
Работают ли MCP-серверы в облачных задачах Codex?
По состоянию на 11 августа 2026 официальная документация по облачному окружению MCP-серверы не описывает, а запрос на такую поддержку висит на форуме OpenAI открытым с октября 2025. Настройка MCP документирована для локальных клиентов — CLI, расширения IDE и десктоп-приложения. Планируйте сценарии с внешними инструментами на локальном запуске.
Где Codex хранит настройки MCP и можно ли держать их в репозитории?
В общем файле конфигурации: по умолчанию ~/.codex/config.toml, секции [mcp_servers.<имя>]. Проектный вариант .codex/config.toml в репозитории тоже поддерживается, но только для проектов, которым вы явно доверяете. Секреты в файл не пишите: ключ bearer_token_env_var принимает имя переменной окружения, а не сам токен.
Почему сервер добавлен, но в /mcp нет ни одного инструмента?
Чаще всего сервер печатает в стандартный вывод что-то помимо сообщений протокола — баннер, предупреждение об устаревшей версии. Спецификация это запрещает, и поток ломается. Запустите команду сервера руками в терминале и посмотрите, что она печатает до первой строки JSON. Вторая по частоте причина — не хватило дефолтных 10 секунд на старт.
Сколько MCP-серверов можно держать включёнными одновременно?
Жёсткого лимита нет, но есть цена. По моему замеру четыре типовых сервера дают 69 инструментов и около 13 тысяч токенов схем в каждом ходу. Считать надо не серверы, а объём описаний инструментов: разброс составил от 168 до 526 токенов на инструмент. Лучше держать много серверов объявленными, но урезать каталог каждого через enabled_tools.
Можно ли записать токен прямо в config.toml?
Ни один документированный ключ этого не позволяет: bearer_token_env_var и env_http_headers принимают имена переменных окружения, а не значения. У локальных серверов значения можно задать через env, но это тот же файл, который часто попадает в dotfiles-репозиторий, поэтому для секретов лучше использовать env_vars и держать значение в окружении. Где хранятся OAuth-токены, задаёт ключ mcp_oauth_credentials_store со значениями auto, file и keyring.
Нужен ли в конфигурации ключ type = «stdio»?
Нет. В справочнике опций Codex такого ключа нет, а под флагом --strict-config эта версия называет его неизвестным полем. В обычном режиме строка просто игнорируется. Путаница возникает потому, что поле type есть в выводе команды codex mcp list --json со значениями stdio и streamable_http — авторы гайдов переносят выходное поле во входной файл.
Курс «OpenAI Codex: агентный кодинг» · модуль «Конфиг и кастомизация». Полная программа и два маршрута обучения — на странице курса.
Предыдущий урок: config.toml и профили Codex · Следующий урок: Окружение облачных задач: setup, кэш, интернет



