## Summary
- Adds a new `thread/unarchive` RPC to move archived thread rollouts
back into the active `sessions/` tree.
## What changed
- **Protocol**
- Adds `thread/unarchive` request/response types and wiring.
- **Server**
- Implements `thread_unarchive` in the app server.
- Validates the archived rollout path and thread ID.
- Restores the rollout to `sessions/YYYY/MM/DD/...` based on the rollout
filename timestamp.
- **Core**
- Adds `find_archived_thread_path_by_id_str` helper for archived
rollouts.
- **Docs**
- Documents the new RPC and usage example.
- **Tests**
- Adds an end-to-end server test that:
1) starts a thread,
2) archives it,
3) unarchives it,
4) asserts the file is restored to `sessions/`.
## How to use
```json
{ "method": "thread/unarchive", "id": 24, "params": { "threadId": "<thread-id>" } }
```
## Author Codex Session
`codex resume 019bf158-54b6-7960-a696-9d85df7e1bc1` (soon I'll make this
kind of session UUID forkable by anyone with the right
`session_object_storage_url` line in their config, but for now just
pasting it here for my reference)
7.3 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 optionscollaborationMode/list→ enumerate collaboration mode presets (experimental)
- 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.1", "gpt-5.1-codex")profile: optional named profilecwd: optional working directoryapprovalPolicy:untrusted|on-request|on-failure|neversandbox:read-only|workspace-write|external-sandbox(honorsnetworkAccessrestricted/enabled) |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,summary, optionalpersonality, and optionaloutputSchema(JSON Schema for the final assistant message)
For v2 threads, turn/start also accepts outputSchema to constrain the final assistant message for that turn.
Interrupt a running turn: interruptConversation.
List/resume/archive: listConversations, resumeConversation, archiveConversation.
For v2 threads, use thread/list with archived: true to list archived rollouts and
thread/unarchive to restore them to the active sessions directory (it returns the restored
thread summary).
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 UIsupportsPersonality– whether the model supports personality-specific instructionsisDefault– whether the model is recommended for most users
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
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).
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, 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.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 protocol/src/mcp_protocol.rs and the corresponding server wiring in mcp-server/.