Added doc for auth v2 endpoints. Updated the auth section in Codex MCP interface doc too.
5.7 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 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 protocol/src/mcp_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,userInfomodel/list→ enumerate available models and reasoning options
- Auth
account/read,account/login/start,account/login/cancel,account/logout,account/rateLimits/read- notifications:
account/login/completed,account/updated,account/rateLimits/updated
- 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: protocol/src/mcp_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", "gpt-5-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 overridecompactPrompt: optional replacement for the default compaction promptincludePlanTool/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.
Models
Fetch the catalog of models available in the current Codex build with model/list. The request accepts optional pagination inputs:
pageSize– number of models to return (defaults to a server-selected value)cursor– opaque string from the previous response’snextCursor
Each response yields:
items– ordered list of models. A model includes:id,model,displayName,descriptionsupportedReasoningEfforts– array of objects with:reasoningEffort– one ofminimal|low|medium|highdescription– human-friendly label for the effort
defaultReasoningEffort– suggested effort for the UIisDefault– whether the model is recommended for most users
nextCursor– pass into the next request to continue paging (optional)
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 the complete request/response shapes and flow examples, see the “Auth endpoints (v2)” section in the app‑server README.
Example: start and send a message
{ "jsonrpc": "2.0", "id": 1, "method": "newConversation", "params": { "model": "gpt-5", "approvalPolicy": "on-request" } }
Server responds:
{ "jsonrpc": "2.0", "id": 1, "result": { "conversationId": "c7b0…", "model": "gpt-5", "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 protocol/src/mcp_protocol.rs and the corresponding server wiring in mcp-server/.