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]>
6.8 KiB
Codex MCP Server Interface [experimental]
This document describes Codex's experimental MCP server 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
- Server binary:
codex mcp-server(orcodex-mcp-server) - Transport: standard MCP over stdio (JSON-RPC 2.0, line-delimited)
Overview
Codex exposes MCP-compatible methods to manage threads, turns, accounts, config, and approvals. The types live in app-server-protocol/src/protocol/{common,v1,v2}.rs and are consumed by the app server implementation in app-server/.
At a glance:
- Primary v2 RPCs
thread/start,thread/resume,thread/fork,thread/read,thread/listturn/start,turn/steer,turn/interruptaccount/read,account/login/start,account/login/cancel,account/logout,account/rateLimits/readconfig/read,config/value/write,config/batchWritemodel/list,app/list,collaborationMode/list
- Remaining v1 compatibility RPCs
getConversationSummarygetAuthStatusgitDiffToRemotefuzzyFileSearch,fuzzyFileSearch/sessionStart,fuzzyFileSearch/sessionUpdate,fuzzyFileSearch/sessionStop
- Notifications
- v2 typed notifications such as
thread/started,turn/completed,account/login/completed codex/event/*stream notifications for live agent eventsfuzzyFileSearch/sessionUpdated,fuzzyFileSearch/sessionCompleted
- v2 typed notifications such as
- Approvals (server -> client requests)
applyPatchApproval,execCommandApproval
See code for full type definitions and exact shapes: app-server-protocol/src/protocol/{common,v1,v2}.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.
Threads and turns
Use the v2 thread and turn APIs for all new integrations. thread/start creates a thread, turn/start submits user input, turn/interrupt stops an in-flight turn, and thread/list / thread/read expose persisted history.
getConversationSummary remains as a compatibility helper for clients that still need a summary lookup by conversationId or rolloutPath. Lookups by conversationId are preferred; lookups by rolloutPath won't work with non-local thread stores.
For complete request and response shapes, see the app-server README and the protocol definitions in app-server-protocol/src/protocol/v2.rs.
Models
Fetch the catalog of models available in the current Codex build with model/list. The request accepts optional pagination inputs:
limit- number of models to return (defaults to a server-selected value)cursor- opaque string from the previous response'snextCursor
Each response yields:
data- ordered list of models. A model includes:id,model,displayName,descriptionsupportedReasoningEfforts- array of objects with:reasoningEffort- a string value advertised by the model; common values arenone|minimal|low|medium|high|xhighdescription- human-friendly label for the effort
defaultReasoningEffort- suggested effort for the UIinputModalities- accepted input types for the modelsupportsPersonality- whether the model supports personality-specific instructionsisDefault- whether the model is recommended for most usersupgrade- optional recommended upgrade model idupgradeInfo- optional upgrade metadata object with:model- recommended upgrade model idupgradeCopy- optional display copy for the upgrade recommendationmodelLink- optional link for the upgrade recommendationmigrationMarkdown- optional markdown shown when presenting the upgrade
nextCursor- pass into the next request to continue paging (optional)
Collaboration modes (experimental)
Fetch the built-in collaboration mode presets with collaborationMode/list. This endpoint does not accept pagination and returns the full list in one response:
data- ordered list of collaboration mode masks (partial settings to apply on top of the base mode)- For tri-state fields like
reasoning_effortanddeveloper_instructions, omit the field to keep the current value, set it tonullto clear it, or set a concrete value to update it. - Built-in presets do not set
model. The Plan preset setsreasoning_effortto medium; clients keep or override model separately.
- For tri-state fields like
When sending turn/start with collaborationMode, settings.developer_instructions: null means "use built-in instructions for the selected mode".
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.fuzzyFileSearch/sessionUpdatedandfuzzyFileSearch/sessionCompletedfor the legacy fuzzy search flow.
Clients should render events and, when present, surface approval requests (see next section).
Tool responses
The codex and codex-reply tools return standard MCP CallToolResult payloads. For compatibility with MCP clients that prefer structuredContent, Codex mirrors the content blocks inside structuredContent alongside the threadId.
Example:
{
"content": [{ "type": "text", "text": "Hello from Codex" }],
"structuredContent": {
"threadId": "019bbed6-1e9e-7f31-984c-a05b65045719",
"content": "Hello from Codex"
}
}
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, approvalId?, command, cwd, reason? }
The client must reply with { decision: "allow" | "deny" } for each request.
Auth helpers
For the complete request/response shapes and flow examples, see the Auth endpoints (v2) section in the app-server README.
Legacy compatibility methods
The server still accepts a narrow v1 compatibility surface for existing app clients:
getConversationSummarygetAuthStatusgitDiffToRemotefuzzyFileSearch,fuzzyFileSearch/sessionStart,fuzzyFileSearch/sessionUpdate,fuzzyFileSearch/sessionStop
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/{common,v1,v2}.rs and the corresponding server wiring in app-server/.