Использование Codex с Agents SDK
Использование Codex с Agents SDK
Запускайте Codex как MCP-сервер для создания многоагентных процессов разработки
Запуск Codex как MCP-сервера
Вы можете запустить Codex как MCP-сервер и подключаться к нему из других MCP-клиентов (например, из агента, созданного с помощью интеграции MCP в OpenAI Agents SDK).
Чтобы запустить Codex как MCP-сервер, используйте следующую команду:
codex mcp-serverMCP-сервер Codex можно запустить с помощью инспектора Model Context Protocol:
npx @modelcontextprotocol/inspector codex mcp-serverОтправьте запрос tools/list, чтобы увидеть два инструмента:
codex: запускает сеанс Codex со следующим запросом и переопределениями конфигурации:
| Свойство | Тип | Описание |
|---|---|---|
prompt (обязательно) |
string |
Исходный пользовательский запрос для начала диалога с Codex. |
approval-policy |
string |
Политика подтверждения команд оболочки, созданных моделью: untrusted, on-request и never. |
base-instructions |
string |
Набор инструкций, используемый вместо инструкций по умолчанию. |
compact-prompt |
string |
Запрос, используемый при сжатии диалога. |
config |
object |
Отдельные параметры конфигурации, переопределяющие значения из $CODEX_HOME/config.toml. |
cwd |
string |
Рабочий каталог сеанса. Относительный путь разрешается относительно текущего каталога серверного процесса. |
developer-instructions |
string |
Инструкции разработчика, внедряемые в виде сообщения с ролью разработчика. |
model |
string |
Необязательное переопределение имени модели (например, gpt-5.6-terra). |
sandbox |
string |
Режим песочницы: read-only, workspace-write или danger-full-access. |
codex-reply: продолжает сеанс Codex по идентификатору потока и запросу. Инструмент codex-reply принимает следующие свойства:
| Свойство | Тип | Описание |
|---|---|---|
prompt (обязательно) |
string | Следующий пользовательский запрос для продолжения диалога с Codex. |
threadId (обязательно) |
string | Идентификатор продолжаемого потока. |
conversationId (устарело) |
string | Устаревший псевдоним threadId (сохранён для совместимости). |
Используйте threadId из structuredContent.threadId в ответе tools/call. Запросы подтверждения (exec/patch) также содержат threadId в своей полезной нагрузке params.
Пример полезной нагрузки ответа:
{
"structuredContent": {
"threadId": "019bbb20-bff6-7130-83aa-bf45ab33250e",
"content": "`ls -lah` (or `ls -alh`) — long listing, includes dotfiles, human-readable sizes."
},
"content": [
{
"type": "text",
"text": "`ls -lah` (or `ls -alh`) — long listing, includes dotfiles, human-readable sizes."
}
]
}Обратите внимание: современные MCP-клиенты обычно возвращают только "structuredContent" как результат вызова инструмента, если это поле присутствует, хотя MCP-сервер Codex также возвращает "content" для поддержки старых MCP-клиентов.
Создание многоагентных процессов
Codex CLI способен не только выполнять разовые задачи. Предоставив CLI как сервер Model Context Protocol (MCP) и организовав его работу с помощью OpenAI Agents SDK, можно создавать детерминированные, проверяемые процессы, которые масштабируются от одного агента до полноценного конвейера поставки программного обеспечения.
В этом руководстве рассматривается тот же процесс, который представлен в OpenAI Cookbook. Вы:
- запустите Codex CLI как постоянно работающий MCP-сервер;
- создадите специализированный процесс с одним агентом, результатом которого станет браузерная игра;
- организуете многоагентную команду с передачей задач, защитными ограничениями и полными трассировками, доступными для последующего анализа.
Перед началом убедитесь, что у вас есть:
- локально установленный Codex CLI, позволяющий использовать команду
codex; - Python 3.10+ с
pip; - Node.js 18+, если вы хотите выполнить приведённый выше пример с MCP Inspector;
- локально сохранённый API key OpenAI. Создать ключи или управлять ими можно на панели OpenAI.
Создайте рабочий каталог для руководства и добавьте API key в файл .env:
mkdir codex-workflows
cd codex-workflows
printf "OPENAI_API_KEY=sk-..." > .envУстановка зависимостей
Agents SDK управляет оркестрацией Codex, передачей задач и трассировками. Установите последние пакеты SDK:
python -m venv .venv
source .venv/bin/activate
pip install --upgrade openai openai-agents python-dotenv
Инициализация Codex CLI как MCP-сервера
Сначала превратите Codex CLI в MCP-сервер, который сможет вызывать Agents SDK. Сервер предоставляет два инструмента (codex() для начала диалога и codex-reply() для его продолжения) и поддерживает работу Codex между несколькими ходами агента.
Создайте файл codex_mcp.py и добавьте в него следующее:
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStdio
async def main() -> None:
async with MCPServerStdio(
name="Codex CLI",
params={
"command": "codex",
"args": ["mcp-server"],
},
client_session_timeout_seconds=360000,
) as codex_mcp_server:
print("Codex MCP server started.")
# More logic coming in the next sections.
return
if __name__ == "__main__":
asyncio.run(main())Один раз запустите сценарий, чтобы убедиться, что Codex успешно запускается:
python codex_mcp.pyПосле вывода Codex MCP server started. сценарий завершает работу. В следующих разделах тот же MCP-сервер будет использоваться в более сложных процессах.
Создание процесса с одним агентом
Начнём с ограниченного примера, в котором Codex MCP используется для создания небольшой браузерной игры. В процессе участвуют два агента:
- Гейм-дизайнер: составляет краткое описание игры.
- Разработчик игры: реализует игру, вызывая Codex MCP.
Обновите codex_mcp.py следующим кодом. Он сохраняет приведённую выше конфигурацию MCP-сервера и добавляет обоих агентов.
import asyncio
import os
from dotenv import load_dotenv
from agents import Agent, Runner, set_default_openai_api
from agents.mcp import MCPServerStdio
load_dotenv(override=True)
set_default_openai_api(os.getenv("OPENAI_API_KEY"))
async def main() -> None:
async with MCPServerStdio(
name="Codex CLI",
params={
"command": "codex",
"args": ["mcp-server"],
},
client_session_timeout_seconds=360000,
) as codex_mcp_server:
developer_agent = Agent(
name="Game Developer",
instructions=(
"You are an expert in building simple games using basic html + css + javascript with no dependencies. "
"Save your work in a file called index.html in the current directory. "
"Always call codex with \"approval-policy\": \"never\" and \"sandbox\": \"workspace-write\"."
),
mcp_servers=[codex_mcp_server],
)
designer_agent = Agent(
name="Game Designer",
instructions=(
"You are an indie game connoisseur. Come up with an idea for a single page html + css + javascript game that a developer could build in about 50 lines of code. "
"Format your request as a 3 sentence design brief for a game developer and call the Game Developer coder with your idea."
),
model="gpt-5",
handoffs=[developer_agent],
)
await Runner.run(designer_agent, "Implement a fun new game!")
if __name__ == "__main__":
asyncio.run(main())Выполните сценарий:
python codex_mcp.pyCodex прочитает описание дизайнера, создаст файл index.html и запишет на диск готовую игру. Откройте созданный файл в браузере, чтобы запустить игру. При каждом запуске создаётся новый дизайн с уникальными особенностями игрового процесса и оформлением.
Расширение до многоагентного процесса
Теперь превратите конфигурацию с одним агентом в оркестрируемый процесс с трассировкой. В систему добавляются:
- Руководитель проекта: формирует общие требования, координирует передачу задач и обеспечивает соблюдение защитных ограничений.
- Дизайнер, Frontend-разработчик, Серверный разработчик и Тестировщик: каждый получает ограниченные инструкции и отдельные папки для результатов.
Создайте новый файл multi_agent_workflow.py:
import asyncio
import os
from dotenv import load_dotenv
from agents import (
Agent,
ModelSettings,
Runner,
WebSearchTool,
set_default_openai_api,
)
from agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX
from agents.mcp import MCPServerStdio
from openai.types.shared import Reasoning
load_dotenv(override=True)
set_default_openai_api(os.getenv("OPENAI_API_KEY"))
async def main() -> None:
async with MCPServerStdio(
name="Codex CLI",
params={"command": "codex", "args": ["mcp-server"]},
client_session_timeout_seconds=360000,
) as codex_mcp_server:
designer_agent = Agent(
name="Designer",
instructions=(
f"""{RECOMMENDED_PROMPT_PREFIX}"""
"You are the Designer.\n"
"Your only source of truth is AGENT_TASKS.md and REQUIREMENTS.md from the Project Manager.\n"
"Do not assume anything that is not written there.\n\n"
"You may use the internet for additional guidance or research."
"Deliverables (write to /design):\n"
"- design_spec.md – a single page describing the UI/UX layout, main screens, and key visual notes as requested in AGENT_TASKS.md.\n"
"- wireframe.md – a simple text or ASCII wireframe if specified.\n\n"
"Keep the output short and implementation-friendly.\n"
"When complete, handoff to the Project Manager with transfer_to_project_manager."
"When creating files, call Codex MCP with {\"approval-policy\":\"never\",\"sandbox\":\"workspace-write\"}."
),
model="gpt-5",
tools=[WebSearchTool()],
mcp_servers=[codex_mcp_server],
)
frontend_developer_agent = Agent(
name="Frontend Developer",
instructions=(
f"""{RECOMMENDED_PROMPT_PREFIX}"""
"You are the Frontend Developer.\n"
"Read AGENT_TASKS.md and design_spec.md. Implement exactly what is described there.\n\n"
"Deliverables (write to /frontend):\n"
"- index.html – main page structure\n"
"- styles.css or inline styles if specified\n"
"- main.js or game.js if specified\n\n"
"Follow the Designer’s DOM structure and any integration points given by the Project Manager.\n"
"Do not add features or branding beyond the provided documents.\n\n"
"When complete, handoff to the Project Manager with transfer_to_project_manager_agent."
"When creating files, call Codex MCP with {\"approval-policy\":\"never\",\"sandbox\":\"workspace-write\"}."
),
model="gpt-5",
mcp_servers=[codex_mcp_server],
)
backend_developer_agent = Agent(
name="Backend Developer",
instructions=(
f"""{RECOMMENDED_PROMPT_PREFIX}"""
"You are the Backend Developer.\n"
"Read AGENT_TASKS.md and REQUIREMENTS.md. Implement the backend endpoints described there.\n\n"
"Deliverables (write to /backend):\n"
"- package.json – include a start script if requested\n"
"- server.js – implement the API endpoints and logic exactly as specified\n\n"
"Keep the code as simple and readable as possible. No external database.\n\n"
"When complete, handoff to the Project Manager with transfer_to_project_manager_agent."
"When creating files, call Codex MCP with {\"approval-policy\":\"never\",\"sandbox\":\"workspace-write\"}."
),
model="gpt-5",
mcp_servers=[codex_mcp_server],
)
tester_agent = Agent(
name="Tester",
instructions=(
f"""{RECOMMENDED_PROMPT_PREFIX}"""
"You are the Tester.\n"
"Read AGENT_TASKS.md and TEST.md. Verify that the outputs of the other roles meet the acceptance criteria.\n\n"
"Deliverables (write to /tests):\n"
"- TEST_PLAN.md – bullet list of manual checks or automated steps as requested\n"
"- test.sh or a simple automated script if specified\n\n"
"Keep it minimal and easy to run.\n\n"
"When complete, handoff to the Project Manager with transfer_to_project_manager."
"When creating files, call Codex MCP with {\"approval-policy\":\"never\",\"sandbox\":\"workspace-write\"}."
),
model="gpt-5",
mcp_servers=[codex_mcp_server],
)
project_manager_agent = Agent(
name="Project Manager",
instructions=(
f"""{RECOMMENDED_PROMPT_PREFIX}"""
"""
You are the Project Manager.
Objective:
Convert the input task list into three project-root files the team will execute against.
Deliverables (write in project root):
- REQUIREMENTS.md: concise summary of product goals, target users, key features, and constraints.
- TEST.md: tasks with [Owner] tags (Designer, Frontend, Backend, Tester) and clear acceptance criteria.
- AGENT_TASKS.md: one section per role containing:
- Project name
- Required deliverables (exact file names and purpose)
- Key technical notes and constraints
Process:
- Resolve ambiguities with minimal, reasonable assumptions. Be specific so each role can act without guessing.
- Create files using Codex MCP with {"approval-policy":"never","sandbox":"workspace-write"}.
- Do not create folders. Only create REQUIREMENTS.md, TEST.md, AGENT_TASKS.md.
Handoffs (gated by required files):
1) After the three files above are created, hand off to the Designer with transfer_to_designer_agent and include REQUIREMENTS.md and AGENT_TASKS.md.
2) Wait for the Designer to produce /design/design_spec.md. Verify that file exists before proceeding.
3) When design_spec.md exists, hand off in parallel to both:
- Frontend Developer with transfer_to_frontend_developer_agent (provide design_spec.md, REQUIREMENTS.md, AGENT_TASKS.md).
- Backend Developer with transfer_to_backend_developer_agent (provide REQUIREMENTS.md, AGENT_TASKS.md).
4) Wait for Frontend to produce /frontend/index.html and Backend to produce /backend/server.js. Verify both files exist.
5) When both exist, hand off to the Tester with transfer_to_tester_agent and provide all prior artifacts and outputs.
6) Do not advance to the next handoff until the required files for that step are present. If something is missing, request the owning agent to supply it and re-check.
PM Responsibilities:
- Coordinate all roles, track file completion, and enforce the above gating checks.
- Do NOT respond with status updates. Just handoff to the next agent until the project is complete.
"""
),
model="gpt-5",
model_settings=ModelSettings(
reasoning=Reasoning(effort="medium"),
),
handoffs=[designer_agent, frontend_developer_agent, backend_developer_agent, tester_agent],
mcp_servers=[codex_mcp_server],
)
designer_agent.handoffs = [project_manager_agent]
frontend_developer_agent.handoffs = [project_manager_agent]
backend_developer_agent.handoffs = [project_manager_agent]
tester_agent.handoffs = [project_manager_agent]
task_list = """
Goal: Build a tiny browser game to showcase a multi-agent workflow.
High-level requirements:
- Single-screen game called "Bug Busters".
- Player clicks a moving bug to earn points.
- Game ends after 20 seconds and shows final score.
- Optional: submit score to a simple backend and display a top-10 leaderboard.
Roles:
- Designer: create a one-page UI/UX spec and basic wireframe.
- Frontend Developer: implement the page and game logic.
- Backend Developer: implement a minimal API (GET /health, GET/POST /scores).
- Tester: write a quick test plan and a simple script to verify core routes.
Constraints:
- No external database—memory storage is fine.
- Keep everything readable for beginners; no frameworks required.
- All outputs should be small files saved in clearly named folders.
"""
result = await Runner.run(project_manager_agent, task_list, max_turns=30)
print(result.final_output)
if __name__ == "__main__":
asyncio.run(main())Запустите сценарий и следите за создаваемыми файлами:
python multi_agent_workflow.py
ls -RАгент — руководитель проекта записывает REQUIREMENTS.md, TEST.md и AGENT_TASKS.md, а затем координирует передачу задач между дизайнером, frontend-разработчиком, серверным разработчиком и тестировщиком. Каждый агент записывает относящиеся к его области артефакты в собственную папку, а затем возвращает управление руководителю проекта.
Трассировка процесса
Codex автоматически записывает трассировки, содержащие каждый запрос, вызов инструмента и передачу задачи. После завершения многоагентного запуска откройте панель трассировок, чтобы изучить временную шкалу выполнения.
Общая трассировка показывает, как руководитель проекта проверяет передачу задач, прежде чем продолжить работу. Откройте отдельные этапы, чтобы просмотреть запросы, вызовы Codex MCP, записанные файлы и длительность выполнения. Благодаря этим сведениям можно легко проверить каждую передачу задачи и понять, как процесс развивался от хода к ходу. Эти трассировки упрощают поиск неполадок в процессе, аудит поведения агентов и измерение производительности с течением времени без дополнительного инструментирования.