MCP-сервер предоставляет агенту инструменты и контекст, расширяя его действия за пределы встроенных. Важно сразу развести роли трёх механизмов: MCP-сервер даёт tools, skill объясняет workflow вокруг них, а plugin может упаковать оба. Они дополняют друг друга, а не заменяют. И ключевая оговорка безопасности та же, что и везде: подключение сервера не делает его доверенным автоматически - это внешний источник, к которому применяют обычную настороженность.
Подключение сервера устроено единообразно и проверяемо. Полезно один раз увидеть команды. Ниже - добавление удалённого сервера по URL, список серверов и /mcp verbose в TUI для диагностики. Codex поддерживает и remote-серверы по Streamable HTTP, и локальные stdio-серверы, запускаемые как процесс. Разные транспорты - для разных источников: удалённый сервис по HTTP, локальный инструмент через stdio, - но модель подключения и проверки у них общая.
Полезно один раз увидеть и декларативную настройку сервера в config. Ниже - секция mcp_servers с URL, флагом required и таймаутами запуска и вызова инструмента. Таймауты здесь не формальность: startup_timeout_sec ограничивает ожидание готовности сервера, tool_timeout_sec - отдельный вызов. Required задаёт, обязателен ли сервер: если критичный для задачи сервер помечен required, его недоступность становится явной ошибкой, а не тихо пропущенной возможностью.
Локальные stdio-серверы подключают так же декларативно, но с командой запуска. Ниже - добавление сервера, который стартует через npx как дочерний процесс. Разница с remote в том, что локальный сервер - это исполняемый код, запускаемый на вашей машине с её правами, поэтому его источник проверяют так же, как любой сторонний скрипт. Удобство "одной команды" не отменяет того, что вы запускаете чужой процесс рядом со своим кодом и доступами.
Tool policy - это то, что превращает подключение сервера в контролируемую границу. В настройке сервера перечисляют enabled_tools и disabled_tools, задают default_tools_approval_mode и уточняют режим для отдельных инструментов. Полезно один раз увидеть такой фрагмент. Ниже - сервер, где разрешены search и read_record, запрещён delete_record, а режим подтверждения для чтения задан отдельно. Это принцип наименьших полномочий на уровне инструментов: включают ровно то, что нужно, а опасное отключают явно.
Отдельный режим подтверждения по инструментам решает тонкую задачу. Одному серверу могут принадлежать и безобидное чтение, и опасная мутация, и их нельзя одобрять одинаково. Поэтому default_tools_approval_mode задаёт общее правило - например, спрашивать на записи, - а для конкретного инструмента режим уточняют отдельно. Так read_record проходит автоматически, а операции с последствиями остаются под подтверждением. Гранулярность здесь - это разница между "доверяю серверу" и "доверяю этим его инструментам".
Диагностика MCP снимает частую путаницу "почему инструмента нет". /mcp verbose показывает состояние серверов и инструментов: подключился ли сервер, уложился ли в таймаут, какие инструменты доступны. Вместо предположения о том, что "MCP не работает", вы видите конкретную причину - недоступный сервер, истёкший startup timeout, отключённый инструмент. Проверять состояние командой дешевле, чем гадать, и это первый шаг при любой проблеме с MCP.
Типичные провалы вокруг MCP предсказуемы. Считать подключённый сервер доверенным по факту подключения. Запустить локальный stdio-сервер, не проверив его источник как стороннего кода. Оставить все инструменты сервера включёнными вместо узкого enabled_tools и явного disabled на опасное. И одобрять все инструменты одним режимом вместо гранулярного подтверждения на мутациях. Проверяйте источник, включайте только нужные инструменты, разводите подтверждение по опасности и диагностируйте через /mcp verbose.
[mcp_servers.openaiDeveloperDocs]
url = "https://developers.openai.com/mcp"
required = true
startup_timeout_sec = 20
tool_timeout_sec = 60
[mcp_servers.internal]
url = "https://mcp.example.com/mcp"
enabled_tools = ["search", "read_record"]
disabled_tools = ["delete_record"]
default_tools_approval_mode = "writes"
[mcp_servers.internal.tools.read_record]
approval_mode = "auto"codex mcp add openaiDeveloperDocs --url https://developers.openai.com/mcp
codex mcp list
codex mcp add context7 -- npx -y @upstash/context7-mcp # локальный stdio server
# В TUI: /mcp verbose (состояние серверов и инструментов)