## Summary This removes the old app-server v1 methods and notifications we no longer need, while keeping the small set the main codex app client still depends on for now. The remaining legacy surface is: - `initialize` - `getConversationSummary` - `getAuthStatus` - `gitDiffToRemote` - `fuzzyFileSearch` - `fuzzyFileSearch/sessionStart` - `fuzzyFileSearch/sessionUpdate` - `fuzzyFileSearch/sessionStop` And the raw `codex/event/*` notifications emitted from core. These notifications will be removed in a followup PR. ## What changed - removed deprecated v1 request variants from the protocol and app-server dispatcher - removed deprecated typed notifications: `authStatusChange`, `loginChatGptComplete`, and `sessionConfigured` - updated the app-server test client to use v2 flows instead of deleted v1 flows - deleted legacy-only app-server test suites and added focused coverage for `getConversationSummary` - regenerated app-server schema fixtures and updated the MCP interface docs to match the remaining compatibility surface ## Testing - `just write-app-server-schema` - `cargo test -p codex-app-server-protocol` - `cargo test -p codex-app-server`
6.5 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.
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- one ofnone|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.
- 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/.