OpenAI closed the MCP door to Codex. This reopens it — bounded, pinned, and honest about what it is.
The Codex MCP App-Server Bridge is a small Python stdio MCP server that exposes four tools — codex_start, codex_status, codex_result, codex_cancel — and translates them into native Codex App Server requests against a locally owned Codex process. It restores MCP access to Codex for hosts that cannot speak the app-server protocol — the hosts that lost Codex when OpenAI removed codex mcp-server and started failing with CONNECTION_CLOSED — without pretending to be the full app server.
Independent project, not an official OpenAI product.
What changed
For a while, codex mcp-server let any MCP-capable tool call Codex as a tool. That path is gone.
-
Aug 24, 2026
Deprecated. OpenAI's changelog: “
codex mcp-serveris now deprecated. Use the Codex app server instead.” -
Sep 5, 2026
Removed. Codex CLI 0.154.0 dropped the entry point (openai/codex PR #42993). Any assistant, orchestrator, or editor that still calls Codex as an MCP tool now fails with
CONNECTION_CLOSEDon every session. - The replacement The Codex App Server. A bespoke JSON-RPC protocol. OpenAI's own documentation says it “isn't an MCP server or a drop-in replacement” and is “experimental and not supported for production workloads.”
OpenAI's migration guidance covers two cases.
Build an app-server client
The full harness: streaming events, interactive approvals, threads, forks. It means implementing a JSON-RPC client in your language against an API OpenAI itself calls experimental.
Right answer if you can. Impossible when your host's only extension mechanism is MCP.Use the Codex plugin for Claude Code
Turnkey and maintained by OpenAI.
Claude Code only. Every other host got nothing.Who that leaves out
If your host can launch a stdio MCP server but cannot implement a native app-server client, you lost Codex overnight. The breakage is already visible in public issue trackers. The bridge is for you.
What the bridge does
Four stdio MCP tools, translated into native app-server requests against a Codex child process the bridge owns. Request and task IDs are UUID strings; unknown fields and wrong types are rejected.
codex_start
request_id, prompt, cwd, model, sandbox, deadline_utc
Persist intent and promptly return a task ID. The prompt is at most 1,000,000 UTF-8 bytes; the deadline is at most one hour after admission.
codex_status
task_id, wait_seconds=0, cursor=0
Read current progress, optionally waiting up to 30 seconds for a newer event or a state change.
codex_result
task_id, offset_bytes=0, limit_bytes=4096
Retrieve a base64-encoded byte page of the retained result, maximum 4096 bytes decoded per page.
codex_cancel
task_id
Persist stop intent and request interruption. The reply is an acknowledgement, not a confirmation.
The lifecycle, start to finish:
request_id and inputs returns the same task; changing bound inputs conflicts.starting, running, cancel-requested, completed, failed, cancelled and unknown.total_bytes and a whole-result SHA-256. Every successful reply stays within a 16 KiB serialized bound, so output is never truncated into a lie.cancel-requested records intent; cancelled / provider_interrupted confirms native interruption; cancelled / cancelled_before_dispatch means no turn was submitted; unknown preserves an unconfirmed outcome.completed means a complete final-message result was retained — not that the proposed code is correct or that tests passed. Verify the deliverable separately.
Safe on an experimental upstream
OpenAI calls the app server experimental and unsupported for production workloads. The bridge runs on it anyway — with a stricter operating posture than the command it replaces.
Pinned executable
The private profile binds the exact Codex executable by absolute path, its --version output, and its SHA-256. The bridge verifies all three before dispatch.
Allowlists, no fallback
Workspaces, models, and sandboxes are explicit allowlists. A model that is not listed is refused; there is no automatic fallback. Sandbox is read-only or an allowlisted workspace-write confined to the bound workspace with network disabled.
Fail-closed on drift
A runtime mismatch blocks dispatch rather than silently updating the digest. Deadlines are admitted up front and never extended by polling, replay, or a host timeout.
No secrets in the profile
No tool accepts credentials, a provider override, or an approval decision. Authentication stays with the operator and the Codex home; the bridge neither provisions nor copies credentials.
A lost start reply is uncertainty, not permission to resubmit. Replay the same request and the bridge returns the existing task. This is durable duplicate prevention across the failures the bridge can see, and it is described that way, not as a stronger guarantee.
What it does not do
This list is more useful than the feature list.
It is not
- Affiliated with OpenAI. It is an independent project.
- A drop-in for the removed
codex mcp-server— different tools, different semantics. - Streaming events, continuing a thread, forking, or handling interactive approvals.
- Promising exactly-once execution across provider failures — it promises you'll never accidentally submit twice.
- Treating “cancel acknowledged” as “cancelled.”
- Treating “completed” as “the code is correct.”
- A hosted service. You clone it, pin it, and run it on your machine.
What it does
Gives any stdio MCP host a bounded, async, replay-safe way to delegate a coding task to a pinned Codex binary and retrieve the complete, hash-verified result.
Compatibility depends on the host's stdio MCP implementation and its ability to keep a long-lived server process alive. Universal client support is not claimed; the repo has a host acceptance procedure so you can find out.
Tools that hide uncertainty produce confident wrong answers. This one refuses to.When to use the app server directly
The bridge deliberately exposes a small part of the native API. Each task creates one new thread and one turn. If you are building a full Codex client, go to the app server — it is the only place you will find:
We would rather lose a user to the right tool than keep one with a false promise.
“Why not just codex exec?” For a one-shot script, do. For an orchestrator with timeouts, task identity, and cancellation, exec holds one tool call open for the whole run and gives you nothing to replay or cancel safely.
Platforms
One Python package, one source layout, one dependency lock. The running operating system selects the backend; you select the platform during setup.
- Python3.12 or newer
- Dependencies
mcp==2.2.0,websockets==17.1, andpywin32==312on Windows only - LicenseApache-2.0
- SizeAbout 4,500 lines of Python in
src/ - MCP protocolRevision 2025-06-18 tested; server name
codex-app-server - AcceptanceOffline acceptance recorded on every platform at commit
cd5d3f6. One live validation recorded on macOS arm64 with Codex CLI 0.159.2 andgpt-6.1-sol/ low. Windows and WSL routes have offline acceptance only.
Unix uses private sockets, process groups and flock; native Windows uses private stdio pipes, ACLs, file locks and Job Objects. The same task IDs, replay, pagination, states and deadlines apply on every route.
Get started
GitHub hosts the source, not a running service. You clone the bridge, pin a reviewed commit, install its locked dependencies, write a private profile, and register the local executable with your MCP client. Unix commands are shown; the platform guide covers Windows PowerShell.
- Clone and select your platform.
# macOS, Linux, native Windows 11 or WSL2 git clone https://github.com/Aetheris-Platform/codex-mcp-app-server-bridge.git cd codex-mcp-app-server-bridge BRIDGE="$PWD" python3 tools/integrate.py - Install the locked dependencies. Setup is the only time anything is downloaded; launch never invokes
uv,pip, or a build.UV_CACHE_DIR="$BRIDGE/.local/uv-cache" uv sync --locked --no-dev \ --no-install-project --no-python-downloads - Create a private profile. Copy the example, replace every placeholder, and keep the real file outside version control with mode
0600. Record the exact executable's--versionoutput and SHA-256; the bridge verifies both before dispatch. Do not put credentials in it.{ "runtime_path": "/absolute/private/bin/codex", "runtime_version": "EXACT OUTPUT OF codex --version", "runtime_sha256": "REPLACE_WITH_64_HEX_SHA256_OF_EXECUTABLE", "socket_path": "/absolute/private/run/app.sock", "allowed_worktree_roots": ["/absolute/workspaces"], "allowed_models": ["EXPLICIT_MODEL_ID"], "allowed_sandboxes": ["read-only"], "data_root": "/absolute/private/state" } - Register it with your MCP client. Adapt the enclosing format to your client; the paths must be absolute.
{ "mcpServers": { "codex-bridge": { "command": "/absolute/path/codex-mcp-app-server-bridge/.venv/bin/python", "args": [ "-m", "codex_app_server_adapter", "--profile", "/absolute/private/profile.json" ], "env": { "PYTHONPATH": "/absolute/path/codex-mcp-app-server-bridge/src", "CODEX_HOME": "/absolute/private/codex-home" } } } } - Use it. Call
codex_start, retain the task ID, thencodex_status,codex_resultandcodex_cancelas needed. Before activating a host, run the client-neutral integration test procedure in the repo.
Independent project, not affiliated with OpenAI. Aetherion Core maintains the Codex MCP App-Server Bridge as open source under Apache-2.0. The name describes what it does, not who made Codex. Host-integration reports — working and not working — are welcome on GitHub.