Codex mit dem Agents SDK verwenden
Rufen Sie Codex als MCP-Server auf, um Multi-Agenten-Entwicklungsworkflows zu erstellen
Codex als MCP-Server ausführen
Sie können Codex als MCP-Server ausführen und ihn mit anderen MCP-Clients verbinden (beispielsweise mit einem Agenten, der mit der MCP-Integration des OpenAI Agents SDK erstellt wurde).
Um Codex als MCP-Server zu starten, können Sie den folgenden Befehl verwenden:
codex mcp-serverSie können einen Codex MCP-Server mit dem Model Context Protocol Inspector starten:
npx @modelcontextprotocol/inspector codex mcp-serverSenden Sie eine tools/list-Anfrage, um zwei Tools anzuzeigen:
codex: Führt eine Codex-Sitzung mit dem folgenden Prompt und den angegebenen Konfigurationsüberschreibungen aus:
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
prompt (erforderlich) |
string |
Der anfängliche Benutzer-Prompt zum Starten der Codex-Unterhaltung. |
approval-policy |
string |
Genehmigungsrichtlinie für vom Modell erzeugte Shell-Befehle: untrusted, on-request und never. |
base-instructions |
string |
Die Anweisungen, die anstelle der Standardanweisungen verwendet werden sollen. |
compact-prompt |
string |
Prompt, der beim Komprimieren der Unterhaltung verwendet wird. |
config |
object |
Einzelne Konfigurationseinstellungen, die die Einstellungen in $CODEX_HOME/config.toml überschreiben. |
cwd |
string |
Arbeitsverzeichnis für die Sitzung. Relative Pfade werden ausgehend vom aktuellen Verzeichnis des Serverprozesses aufgelöst. |
developer-instructions |
string |
Entwickleranweisungen, die als Nachricht mit der Entwicklerrolle eingefügt werden. |
model |
string |
Optionale Überschreibung des Modellnamens (beispielsweise gpt-5.6-terra). |
sandbox |
string |
Sandbox-Modus: read-only, workspace-write oder danger-full-access. |
codex-reply: Setzt eine Codex-Sitzung durch Angabe der Thread-ID und eines Prompts fort. Das Tool codex-reply akzeptiert diese Eigenschaften:
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
prompt (erforderlich) |
string | Der nächste Benutzer-Prompt zum Fortsetzen der Codex-Unterhaltung. |
threadId (erforderlich) |
string | Die ID des fortzusetzenden Threads. |
conversationId (veraltet) |
string | Veralteter Alias für threadId (aus Kompatibilitätsgründen beibehalten). |
Verwenden Sie den threadId aus structuredContent.threadId in der tools/call-Antwort. Genehmigungs-Prompts (exec/patch) enthalten außerdem threadId in ihrer params-Nutzlast.
Beispiel für eine Antwortnutzlast:
{
"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."
}
]
}Beachten Sie, dass moderne MCP-Clients im Allgemeinen nur "structuredContent" als Ergebnis eines Tool-Aufrufs melden, sofern vorhanden. Der Codex MCP-Server gibt jedoch zugunsten älterer MCP-Clients auch "content" zurück.
Multi-Agenten-Workflows erstellen
Codex CLI kann weit mehr als nur Ad-hoc-Aufgaben ausführen. Indem Sie die CLI als Model Context Protocol-Server (MCP) bereitstellen und mit dem OpenAI Agents SDK orchestrieren, können Sie deterministische, überprüfbare Workflows erstellen, die von einem einzelnen Agenten bis zu einer vollständigen Softwarebereitstellungspipeline skalieren.
Dieser Leitfaden führt Sie durch denselben Workflow, der im OpenAI Cookbook vorgestellt wird. Sie werden:
- Codex CLI als dauerhaft laufenden MCP-Server starten,
- einen fokussierten Einzelagenten-Workflow erstellen, der ein spielbares Browserspiel erzeugt, und
- ein Multi-Agenten-Team mit Übergaben, Schutzmechanismen und vollständigen, nachträglich überprüfbaren Traces orchestrieren.
Stellen Sie vor Beginn sicher, dass Folgendes vorhanden ist:
- Codex CLI ist lokal installiert, sodass der Befehl
codexverfügbar ist. - Python 3.10+ mit
pip. - Node.js 18+, wenn Sie das obige Beispiel mit dem MCP Inspector ausführen möchten.
- Ein lokal gespeicherter OpenAI API key. Sie können Schlüssel im OpenAI-Dashboard erstellen oder verwalten.
Erstellen Sie ein Arbeitsverzeichnis für den Leitfaden und fügen Sie Ihren API key einer .env-Datei hinzu:
mkdir codex-workflows
cd codex-workflows
printf "OPENAI_API_KEY=sk-..." > .envAbhängigkeiten installieren
Das Agents SDK übernimmt die Orchestrierung von Codex, Übergaben und Traces. Installieren Sie die neuesten SDK-Pakete:
python -m venv .venv
source .venv/bin/activate
pip install --upgrade openai openai-agents python-dotenv
Codex CLI als MCP-Server initialisieren
Wandeln Sie zunächst Codex CLI in einen MCP-Server um, den das Agents SDK aufrufen kann. Der Server stellt zwei Tools bereit (codex() zum Starten und codex-reply() zum Fortsetzen einer Unterhaltung) und hält Codex über mehrere Agentendurchläufe hinweg aktiv.
Erstellen Sie eine Datei namens codex_mcp.py und fügen Sie Folgendes hinzu:
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())Führen Sie das Skript einmal aus, um zu überprüfen, ob Codex erfolgreich startet:
python codex_mcp.pyDas Skript wird beendet, nachdem es Codex MCP server started. ausgegeben hat. In den nächsten Abschnitten verwenden Sie denselben MCP-Server in umfangreicheren Workflows erneut.
Einen Einzelagenten-Workflow erstellen
Beginnen wir mit einem klar abgegrenzten Beispiel, das Codex MCP verwendet, um ein kleines Browserspiel bereitzustellen. Der Workflow basiert auf zwei Agenten:
- Spieldesigner: verfasst ein Briefing für das Spiel.
- Spieleentwickler: implementiert das Spiel durch Aufrufen von Codex MCP.
Aktualisieren Sie codex_mcp.py mit dem folgenden Code. Er übernimmt die obige MCP-Server-Konfiguration und fügt beide Agenten hinzu.
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())Führen Sie das Skript aus:
python codex_mcp.pyCodex liest das Briefing des Designers, erstellt eine index.html-Datei und schreibt das vollständige Spiel auf den Datenträger. Öffnen Sie die erzeugte Datei in einem Browser, um das Ergebnis zu spielen. Bei jeder Ausführung entsteht ein anderes Design mit einzigartigen Variationen des Spielstils und individuellem Feinschliff.
Zu einem Multi-Agenten-Workflow erweitern
Wandeln Sie die Einzelagenten-Konfiguration nun in einen orchestrierten, nachvollziehbaren Workflow um. Das System fügt Folgendes hinzu:
- Projektmanager: erstellt gemeinsame Anforderungen, koordiniert Übergaben und setzt Schutzmechanismen durch.
- Designer, Frontend-Entwickler, Serverentwickler und Tester: jeweils mit klar abgegrenzten Anweisungen und Ausgabeordnern.
Erstellen Sie eine neue Datei namens 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())Führen Sie das Skript aus und beobachten Sie die erzeugten Dateien:
python multi_agent_workflow.py
ls -RDer Projektmanager-Agent schreibt REQUIREMENTS.md, TEST.md und AGENT_TASKS.md und koordiniert anschließend die Übergaben zwischen den Designer-, Frontend-, Server- und Tester-Agenten. Jeder Agent schreibt klar abgegrenzte Artefakte in seinen eigenen Ordner, bevor er die Kontrolle an den Projektmanager zurückgibt.
Den Workflow nachverfolgen
Codex zeichnet automatisch Traces auf, die jeden Prompt, Tool-Aufruf und jede Übergabe erfassen. Öffnen Sie nach Abschluss des Multi-Agenten-Durchlaufs das Traces-Dashboard, um den Ausführungszeitverlauf zu untersuchen.
Der übergeordnete Trace hebt hervor, wie der Projektmanager Übergaben überprüft, bevor er fortfährt. Öffnen Sie einzelne Schritte, um Prompts, Codex MCP-Aufrufe, geschriebene Dateien und Ausführungszeiten anzuzeigen. Anhand dieser Details können Sie jede Übergabe unkompliziert prüfen und nachvollziehen, wie sich der Workflow von Durchlauf zu Durchlauf entwickelt hat. Mit diesen Traces können Sie Workflow-Probleme unkompliziert debuggen, das Verhalten der Agenten prüfen und die Leistung im Zeitverlauf messen, ohne zusätzliche Instrumentierung einzurichten.