Usa Codex con Agents SDK
Invoca Codex como servidor MCP para crear flujos de trabajo de desarrollo multiagente
Ejecutar Codex como servidor MCP
Puedes ejecutar Codex como servidor MCP y conectarlo desde otros clientes MCP (por ejemplo, un agente creado con la integración MCP de OpenAI Agents SDK).
Para iniciar Codex como servidor MCP, puedes usar el siguiente comando:
codex mcp-serverPuedes iniciar un servidor MCP de Codex con el Inspector de Model Context Protocol:
npx @modelcontextprotocol/inspector codex mcp-serverEnvía una solicitud tools/list para ver dos herramientas:
codex: ejecuta una sesión de Codex con el siguiente prompt y las siguientes sustituciones de configuración:
| Propiedad | Tipo | Descripción |
|---|---|---|
prompt (obligatoria) |
string |
El prompt inicial del usuario para iniciar la conversación de Codex. |
approval-policy |
string |
Política de aprobación para los comandos de shell generados por el modelo: untrusted, on-request y never. |
base-instructions |
string |
El conjunto de instrucciones que se usará en lugar de las predeterminadas. |
compact-prompt |
string |
Prompt utilizado al compactar la conversación. |
config |
object |
Ajustes de configuración individuales que sustituyen los de $CODEX_HOME/config.toml. |
cwd |
string |
Directorio de trabajo de la sesión. Si es relativo, se resuelve con respecto al directorio actual del proceso del servidor. |
developer-instructions |
string |
Instrucciones del desarrollador insertadas como mensaje con rol de desarrollador. |
model |
string |
Sustitución opcional del nombre del modelo (por ejemplo, gpt-5.6-terra). |
sandbox |
string |
Modo de entorno aislado: read-only, workspace-write o danger-full-access. |
codex-reply: continúa una sesión de Codex proporcionando el ID del hilo y el prompt. La herramienta codex-reply acepta estas propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
prompt (obligatoria) |
string | El siguiente prompt del usuario para continuar la conversación de Codex. |
threadId (obligatoria) |
string | El ID del hilo que se continuará. |
conversationId (obsoleta) |
string | Alias obsoleto de threadId (se conserva por compatibilidad). |
Usa el threadId de structuredContent.threadId en la respuesta tools/call. Los prompts de aprobación (exec/patch) también incluyen threadId en su carga útil params.
Ejemplo de carga útil de respuesta:
{
"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."
}
]
}Ten en cuenta que los clientes MCP modernos generalmente solo notifican "structuredContent" como resultado de una llamada a una herramienta, si está presente, aunque el servidor MCP de Codex también devuelve "content" para los clientes MCP más antiguos.
Crear flujos de trabajo multiagente
Codex CLI puede hacer mucho más que ejecutar tareas puntuales. Al exponer la CLI como servidor de Model Context Protocol (MCP) y orquestarla con OpenAI Agents SDK, puedes crear flujos de trabajo deterministas y revisables que abarcan desde un solo agente hasta un proceso completo de entrega de software.
Esta guía explica el mismo flujo de trabajo presentado en el OpenAI Cookbook. Harás lo siguiente:
- iniciar Codex CLI como servidor MCP de larga duración,
- crear un flujo de trabajo específico de un solo agente que produzca un juego ejecutable en el navegador, y
- orquestar un equipo multiagente con transferencias, medidas de protección y trazas completas que podrás revisar posteriormente.
Antes de comenzar, asegúrate de tener:
- Codex CLI instalado localmente para que el comando
codexesté disponible. - Python 3.10+ con
pip. - Node.js 18+ si quieres ejecutar el ejemplo anterior de MCP Inspector.
- Una API key de OpenAI almacenada localmente. Puedes crear o administrar claves en el panel de OpenAI.
Crea un directorio de trabajo para la guía y añade tu API key a un archivo .env:
mkdir codex-workflows
cd codex-workflows
printf "OPENAI_API_KEY=sk-..." > .envInstalar las dependencias
Agents SDK gestiona la orquestación entre Codex, las transferencias y las trazas. Instala los paquetes más recientes del SDK:
python -m venv .venv
source .venv/bin/activate
pip install --upgrade openai openai-agents python-dotenv
Inicializar Codex CLI como servidor MCP
Para comenzar, convierte Codex CLI en un servidor MCP al que Agents SDK pueda llamar. El servidor expone dos herramientas (codex() para iniciar una conversación y codex-reply() para continuarla) y mantiene Codex activo durante varios turnos de los agentes.
Crea un archivo llamado codex_mcp.py y añade lo siguiente:
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())Ejecuta el script una vez para verificar que Codex se inicia correctamente:
python codex_mcp.pyEl script finaliza después de imprimir Codex MCP server started.. En las siguientes secciones reutilizarás el mismo servidor MCP en flujos de trabajo más completos.
Crear un flujo de trabajo de un solo agente
Comencemos con un ejemplo acotado que usa Codex MCP para entregar un pequeño juego de navegador. El flujo de trabajo se basa en dos agentes:
- Diseñador del juego: redacta una descripción breve del juego.
- Desarrollador del juego: implementa el juego mediante llamadas a Codex MCP.
Actualiza codex_mcp.py con el siguiente código. Conserva la configuración anterior del servidor MCP y añade ambos agentes.
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())Ejecuta el script:
python codex_mcp.pyCodex leerá la descripción del diseñador, creará un archivo index.html y escribirá el juego completo en el disco. Abre el archivo generado en un navegador para jugar. Cada ejecución produce un diseño diferente con variaciones únicas en el estilo de juego y en los acabados.
Ampliar a un flujo de trabajo multiagente
Ahora convierte la configuración de un solo agente en un flujo de trabajo orquestado y rastreable. El sistema añade:
- Gestor de proyectos: crea requisitos compartidos, coordina las transferencias y aplica medidas de protección.
- Diseñador, Desarrollador frontend, Desarrollador del servidor y Responsable de pruebas: cada uno con instrucciones y carpetas de salida específicas.
Crea un archivo nuevo llamado 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())Ejecuta el script y observa los archivos generados:
python multi_agent_workflow.py
ls -REl agente gestor de proyectos escribe REQUIREMENTS.md, TEST.md y AGENT_TASKS.md y, a continuación, coordina las transferencias entre los agentes de diseño, frontend, servidor y pruebas. Cada agente escribe artefactos específicos en su propia carpeta antes de devolver el control al gestor de proyectos.
Rastrear el flujo de trabajo
Codex registra automáticamente trazas que capturan cada prompt, llamada a una herramienta y transferencia. Cuando finalice la ejecución multiagente, abre el panel de trazas para inspeccionar la cronología de ejecución.
La traza de alto nivel muestra cómo el gestor de proyectos verifica las transferencias antes de avanzar. Selecciona cada paso para ver los prompts, las llamadas a Codex MCP, los archivos escritos y la duración de la ejecución. Estos detalles permiten auditar fácilmente cada transferencia y comprender cómo evolucionó el flujo de trabajo turno a turno. Estas trazas facilitan la depuración de problemas en el flujo de trabajo, la auditoría del comportamiento de los agentes y la medición del rendimiento a lo largo del tiempo sin necesidad de instrumentación adicional.