Our history is just-every's with author emails rewritten, so the graphs are
disjoint and git finds no merge base. Supplied one by hand: d1f1f51a41, the
just-every commit matching our Oct-2025 fork point (22 files apart). 9618
upstream commits, 7004 files, +1.81M/-159k, 37 conflicts.
Resolution:
- Upstream code where our side was the Oct-2025 prototype of a feature they
have since reimplemented 3-5x larger (agent_runs, browser_sessions,
history_cell/{agent,browser}, the vt100 harness and its snapshots).
- Upstream's config.rs module split (builder/defaults/sources/validation)
kept; zen5-coder and the provider-follows-model rule re-applied on top.
- Ours where the file IS the identity: README, package.json, postinstall,
release notes pipeline, integration-zed.
- Hybrid where upstream improved a file we had branded: updates.rs (their
release-repo migration, our hanzoai/dev), release.yml (their fail-fast npm
auth check, our package name), chatwidget.rs (their turn handling, our
HANZO_USER_KEY hint), exec human output (their 237 lines, our banner).
Superseded and dropped deliberately: our resume_command_name() coder-alias
hack — upstream's derive_resume_command_name() reads the invocation basename
generically, which yields "dev" for us.
LLM.md now records the real topology and the sync point; AGENTS.md and
CLAUDE.md are symlinks to it again. Single parent on purpose: adopting
jecode/main as a second parent would re-import 13,742 commits carrying the
upstream author emails a prior rewrite deliberately removed.
Version 0.2.188 -> 0.2.189.
Co-authored-by: Hanzo Dev <[email protected]>
5.1 KiB
Codex MCP Interface [experimental]
This document describes Codex’s experimental MCP interface: a JSON‑RPC API that runs over the Model Context Protocol (MCP) transport to control a local Codex engine.
- Status: experimental and subject to change without notice
- Recommended entry point:
code mcp(alias:code acp; both wrap the same binary used by the CLI) - Underlying Rust binary (for development):
cargo run -p code-mcp-server - ACP compatibility: surfaces
session/new+session/promptas MCP tools and emitssession/updatenotifications - Transport: standard MCP over stdio (JSON‑RPC 2.0, line‑delimited)
Overview
Codex exposes a small set of MCP‑compatible methods to create and manage conversations, send user input, receive live events, and handle approval prompts. The types are defined in app-server-protocol/src/protocol.rs and re-used by the MCP server implementation in mcp-server/.
At a glance:
- Conversations
newConversation→ start a Codex sessionsendUserMessage/sendUserTurn→ send user input into a conversationinterruptConversation→ stop the current turnlistConversations,resumeConversation,archiveConversation
- Configuration and info
getUserSavedConfig,setDefaultModel,getUserAgent,userInfo
- Auth
loginApiKey,loginChatGpt,cancelLoginChatGpt,logoutChatGpt,getAuthStatus
- Utilities
gitDiffToRemote,execOneOffCommand
- Approvals (server → client requests)
applyPatchApproval,execCommandApproval
- Notifications (server → client)
loginChatGptComplete,authStatusChangecodex/eventstream with agent events
See code for full type definitions and exact shapes: app-server-protocol/src/protocol.rs.
Starting the server
Run Codex as an MCP server and connect an MCP client:
codex mcp-server | your_mcp_client
For a simple inspection UI, you can also try:
npx @modelcontextprotocol/inspector codex mcp-server
Use the separate codex mcp subcommand to manage configured MCP server launchers in config.toml.
Conversations
Start a new session with optional overrides:
Request newConversation params (subset):
model: string model id (e.g. "o3", "gpt-5.1", "gpt-5.1-codex")profile: optional named profilecwd: optional working directoryapprovalPolicy:untrusted|on-request|on-failure|neversandbox:read-only|workspace-write|danger-full-accessconfig: map of additional config overridesbaseInstructions: optional instruction overrideincludePlanTool/includeApplyPatchTool: booleans
Response: { conversationId, model, reasoningEffort?, rolloutPath }
Send input to the active turn:
sendUserMessage→ enqueue items to the conversationsendUserTurn→ structured turn with explicitcwd,approvalPolicy,sandboxPolicy,model, optionaleffort, andsummary
Interrupt a running turn: interruptConversation.
List/resume/archive: listConversations, resumeConversation, archiveConversation.
Event stream
While a conversation runs, the server sends notifications:
codex/eventwith the serialized Codex event payload. The shape matchescore/src/protocol.rs’sEventandEventMsgtypes. Some notifications include a_meta.requestIdto correlate with the originating request.- Auth notifications via method names
loginChatGptCompleteandauthStatusChange.
Clients should render events and, when present, surface approval requests (see next section).
Approvals (server → client)
When Codex needs approval to apply changes or run commands, the server issues JSON‑RPC requests to the client:
applyPatchApproval { conversationId, callId, fileChanges, reason?, grantRoot? }execCommandApproval { conversationId, callId, command, cwd, reason? }
The client must reply with { decision: "allow" | "deny" } for each request.
Auth helpers
For ChatGPT or API‑key based auth flows, the server exposes helpers:
loginApiKey { apiKey }loginChatGpt→ returns{ loginId, authUrl }; browser completes flow; thenloginChatGptCompletenotification followscancelLoginChatGpt { loginId },logoutChatGpt,getAuthStatus { includeToken?, refreshToken? }
Example: start and send a message
{ "jsonrpc": "2.0", "id": 1, "method": "newConversation", "params": { "model": "gpt-5.1", "approvalPolicy": "on-request" } }
Server responds:
{ "jsonrpc": "2.0", "id": 1, "result": { "conversationId": "c7b0…", "model": "gpt-5.1", "rolloutPath": "/path/to/rollout.jsonl" } }
Then send input:
{ "jsonrpc": "2.0", "id": 2, "method": "sendUserMessage", "params": { "conversationId": "c7b0…", "items": [{ "type": "text", "text": "Hello Codex" }] } }
While processing, the server emits codex/event notifications containing agent output, approvals, and status updates.
Compatibility and stability
This interface is experimental. Method names, fields, and event shapes may evolve. For the authoritative schema, consult app-server-protocol/src/protocol.rs and the corresponding server wiring in mcp-server/.