Menggunakan Codex dengan Agents SDK
Panggil Codex sebagai server MCP untuk membangun alur kerja pengembangan multiagen
Menjalankan Codex sebagai server MCP
Anda dapat menjalankan Codex sebagai server MCP dan menghubungkannya dari klien MCP lain (misalnya, agen yang dibuat dengan integrasi MCP OpenAI Agents SDK).
Untuk memulai Codex sebagai server MCP, Anda dapat menggunakan perintah berikut:
codex mcp-serverAnda dapat meluncurkan server MCP Codex dengan Model Context Protocol Inspector:
npx @modelcontextprotocol/inspector codex mcp-serverKirim permintaan tools/list untuk melihat dua alat:
codex: Jalankan sesi Codex dengan prompt dan penggantian konfigurasi berikut:
| Properti | Jenis | Deskripsi |
|---|---|---|
prompt (wajib) |
string |
Prompt awal pengguna untuk memulai percakapan Codex. |
approval-policy |
string |
Kebijakan persetujuan untuk perintah shell yang dibuat oleh model: untrusted, on-request, dan never. |
base-instructions |
string |
Kumpulan instruksi yang digunakan sebagai pengganti instruksi default. |
compact-prompt |
string |
Prompt yang digunakan saat memadatkan percakapan. |
config |
object |
Pengaturan konfigurasi individual yang menggantikan pengaturan dalam $CODEX_HOME/config.toml. |
cwd |
string |
Direktori kerja untuk sesi. Jika relatif, jalurnya ditentukan berdasarkan direktori saat ini dari proses server. |
developer-instructions |
string |
Instruksi pengembang yang dimasukkan sebagai pesan dengan peran pengembang. |
model |
string |
Penggantian opsional untuk nama model (misalnya, gpt-5.6-terra). |
sandbox |
string |
Mode sandbox: read-only, workspace-write, atau danger-full-access. |
codex-reply: Lanjutkan sesi Codex dengan memberikan ID utas dan prompt. Alat codex-reply menerima properti berikut:
| Properti | Jenis | Deskripsi |
|---|---|---|
prompt (wajib) |
string | Prompt pengguna berikutnya untuk melanjutkan percakapan Codex. |
threadId (wajib) |
string | ID utas yang akan dilanjutkan. |
conversationId (tidak digunakan lagi) |
string | Alias usang untuk threadId (dipertahankan demi kompatibilitas). |
Gunakan threadId dari structuredContent.threadId dalam respons tools/call. Prompt persetujuan (exec/patch) juga menyertakan threadId dalam payload params-nya.
Contoh payload respons:
{
"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."
}
]
}Perhatikan bahwa klien MCP modern umumnya hanya melaporkan "structuredContent" sebagai hasil pemanggilan alat jika tersedia, meskipun server MCP Codex juga mengembalikan "content" untuk mendukung klien MCP lama.
Membuat alur kerja multiagen
Codex CLI dapat melakukan jauh lebih banyak daripada sekadar menjalankan tugas ad hoc. Dengan mengekspos CLI sebagai server Model Context Protocol (MCP) dan mengorkestrasikannya dengan OpenAI Agents SDK, Anda dapat membuat alur kerja deterministik dan dapat ditinjau yang berkembang dari satu agen hingga menjadi pipeline pengiriman perangkat lunak lengkap.
Panduan ini menguraikan alur kerja yang sama dengan yang ditampilkan dalam OpenAI Cookbook. Anda akan:
- meluncurkan Codex CLI sebagai server MCP yang berjalan terus-menerus,
- membangun alur kerja satu agen yang terfokus dan menghasilkan gim browser yang dapat dimainkan, serta
- mengorkestrasikan tim multiagen dengan serah terima, batasan pengaman, dan rekaman pelacakan lengkap yang dapat Anda tinjau setelahnya.
Sebelum memulai, pastikan Anda memiliki:
- Codex CLI yang terinstal secara lokal agar perintah
codextersedia. - Python 3.10+ dengan
pip. - Node.js 18+ jika Anda ingin menjalankan contoh MCP Inspector di atas.
- API key OpenAI yang disimpan secara lokal. Anda dapat membuat atau mengelola kunci di dasbor OpenAI.
Buat direktori kerja untuk panduan ini dan tambahkan API key Anda ke file .env:
mkdir codex-workflows
cd codex-workflows
printf "OPENAI_API_KEY=sk-..." > .envMenginstal dependensi
Agents SDK menangani orkestrasi di antara Codex, serah terima, dan rekaman pelacakan. Instal paket SDK terbaru:
python -m venv .venv
source .venv/bin/activate
pip install --upgrade openai openai-agents python-dotenv
Menginisialisasi Codex CLI sebagai server MCP
Mulailah dengan mengubah Codex CLI menjadi server MCP yang dapat dipanggil oleh Agents SDK. Server ini mengekspos dua alat (codex() untuk memulai percakapan dan codex-reply() untuk melanjutkannya) dan mempertahankan Codex tetap aktif selama beberapa giliran agen.
Buat file bernama codex_mcp.py dan tambahkan kode berikut:
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())Jalankan skrip satu kali untuk memastikan Codex berhasil diluncurkan:
python codex_mcp.pySkrip berhenti setelah mencetak Codex MCP server started.. Pada bagian berikutnya, Anda akan menggunakan kembali server MCP yang sama di dalam alur kerja yang lebih lengkap.
Membangun alur kerja satu agen
Mari mulai dengan contoh terbatas yang menggunakan Codex MCP untuk menghasilkan sebuah gim browser kecil. Alur kerja ini menggunakan dua agen:
- Perancang Gim: menulis ringkasan rancangan gim.
- Pengembang Gim: mengimplementasikan gim dengan memanggil Codex MCP.
Perbarui codex_mcp.py dengan kode berikut. Kode ini mempertahankan penyiapan server MCP di atas dan menambahkan kedua agen.
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())Jalankan skrip:
python codex_mcp.pyCodex akan membaca ringkasan perancang, membuat file index.html, dan menulis seluruh gim ke disk. Buka file yang dihasilkan di browser untuk memainkannya. Setiap eksekusi menghasilkan desain berbeda dengan variasi gaya bermain dan penyempurnaan yang unik.
Memperluas menjadi alur kerja multiagen
Sekarang ubah penyiapan satu agen menjadi alur kerja yang terorkestrasi dan dapat dilacak. Sistem menambahkan:
- Manajer Proyek: membuat persyaratan bersama, mengoordinasikan serah terima, dan menerapkan batasan pengaman.
- Perancang, Pengembang Frontend, Pengembang Server, dan Penguji: masing-masing memiliki instruksi dan folder output dengan cakupan tertentu.
Buat file baru bernama 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())Jalankan skrip dan amati file yang dihasilkan:
python multi_agent_workflow.py
ls -RAgen manajer proyek menulis REQUIREMENTS.md, TEST.md, dan AGENT_TASKS.md, lalu mengoordinasikan serah terima di antara agen perancang, frontend, server, dan penguji. Setiap agen menulis artefak sesuai cakupannya ke foldernya sendiri sebelum menyerahkan kembali kendali kepada manajer proyek.
Melacak alur kerja
Codex secara otomatis merekam jejak yang mencakup setiap prompt, pemanggilan alat, dan serah terima. Setelah eksekusi multiagen selesai, buka dasbor Traces untuk memeriksa linimasa eksekusi.
Jejak tingkat tinggi menyoroti cara manajer proyek memverifikasi serah terima sebelum melanjutkan. Buka setiap langkah untuk melihat prompt, panggilan Codex MCP, file yang ditulis, dan durasi eksekusi. Detail ini memudahkan Anda mengaudit setiap serah terima dan memahami perkembangan alur kerja dari satu giliran ke giliran berikutnya. Jejak ini memudahkan Anda men-debug kendala alur kerja, mengaudit perilaku agen, dan mengukur performa dari waktu ke waktu tanpa memerlukan instrumentasi tambahan.