MCP fixes and known issues in Codex
If you are running into MCP problems with Codex, this page documents the known issues and the releases that fixed them.
Known issues
codex mcp login fails with "No authorization support detected" on macOS, from 2026-07-22. Against a spec-compliant OAuth MCP server, the same Codex version completes login on Linux but fails discovery on macOS. Tracked in openai/codex#34684. Reach the server through an mcp-remote stdio bridge, which moves the OAuth flow out of Codex.
OAuth discovery and callback handling
Codex added the pieces of OAuth separately: scopes in config first, then the callback URL, then protected resource metadata discovery. A server that works against the newest build can fail on a release from two months earlier because discovery took a different path.
rust-v0.142.0 introduced RFC 9728 protected resource discovery. Require it if your authorization server is found that way; on earlier releases point Codex at the authorization server directly with a pre-registered client.
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Stopped blocking thread startup on MCP OAuth discovery |
| rust-v0.143.0 2026-07-08 | ChatGPT-hosted MCP servers can explicitly use session authentication |
| rust-v0.142.0 2026-06-22 | Added protected resource OAuth discovery (RFC 9728) |
| rust-v0.134.0 2026-05-26 | codex mcp add supports OAuth options for streamable HTTP servers, and routes servers through explicit environments |
| rust-v0.131.0 2026-05-18 | Added support for explicit MCP OAuth client IDs, binds local OAuth callbacks explicitly, and adds callback IDs to local redirects |
Earlier OAuth discovery fixes (January 2026 to April 2026)
| Release | Change |
|---|---|
| rust-v0.125.0 2026-04-24 | Hid the unsupported MCP bearer_token field from the config schema, so it stops looking like a working option |
| rust-v0.105.0 2026-02-25 | Added a configurable MCP OAuth callback URL for codex mcp login |
| rust-v0.93.0 2026-01-31 | OAuth error descriptions are shown in callback responses |
| rust-v0.81.0 2026-01-14 | Added static MCP callback URI support |
Token lifecycle and credential storage
rust-v0.145.0 serializes the credential refresh itself, where rust-v0.144.0 serializes only the shared store. Require rust-v0.145.0 when several MCP servers can renew credentials at the same moment, or when your server rotates refresh tokens on every use.
rust-v0.144.0 turned on interactive re-authentication for a mid-session 401. Earlier releases surface the 401 as a failed tool call rather than a sign-in prompt.
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Serializes MCP OAuth credential refreshes, and resolves and pins MCP OAuth credential stores |
| rust-v0.144.0 2026-07-09 | Serializes shared MCP OAuth credential stores, enables interactive authentication requests without an experimental opt-in, and refreshes expired authentication for the hosted connector in long-running sessions |
| rust-v0.140.0 2026-06-15 | MCP OAuth credentials move to encrypted local secret storage with auth-specific namespaces, and unusable credentials are reported as logged out rather than as a connection error |
| rust-v0.138.0 2026-06-08 | Refreshes expired OAuth-backed MCP credentials before startup instead of failing the connection |
Scope, resource, and audience binding
Set oauth_resource explicitly on the server entry rather than relying on it being derived, and keep one canonical URL for your MCP endpoint across the MCP URL, the protected resource metadata resource field, the authorize request, and the token audience.
| Release | Change |
|---|---|
| rust-v0.142.0 2026-06-22 | Protected resource discovery supplies the resource identity for the authorize step |
| rust-v0.115.0 2026-03-16 | Uses scopes_supported for OAuth when the MCP server publishes it |
| rust-v0.107.0 2026-03-02 | MCP OAuth login forwards configured oauth_resource values for servers that require a resource parameter |
| rust-v0.92.0 2026-01-27 | MCP servers can define OAuth scopes in config.toml, used as a fallback for OAuth login instead of passing --scopes each time |
Transport and connection reliability
Codex supports stdio and streamable HTTP MCP servers, including stdio servers launched inside a remote execution environment.
rust-v0.143.0 introduced persistence for Cloudflare affinity cookies. Require it if you terminate MCP traffic behind Cloudflare and rely on that cookie to pin a session to one backend, since earlier releases can land a streamable HTTP session on a different backend mid-session.
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Serializes concurrent MCP stdin writes, and bounds remote MCP stdio line length |
| rust-v0.143.0 2026-07-08 | Persists Cloudflare affinity cookies for MCP HTTP connections |
| rust-v0.142.2 2026-06-25 | Remote stdio servers accept absolute working directories written in the remote platform's path format |
| rust-v0.142.0 2026-06-22 | Exec-server processes and stdio MCP sessions survive transient disconnects, including signed-URL refresh and retry-safe stdin writes |
| rust-v0.136.0 2026-06-01 | Updated the MCP implementation to rmcp 1.7.0 |
Earlier transport fixes (April 2026 to May 2026)
| Release | Change |
|---|---|
| rust-v0.134.0 2026-05-26 | Read-only MCP tools run concurrently when they advertise readOnlyHint |
| rust-v0.129.0 2026-05-07 | Truncates large MCP tool outputs in rollouts, bounding unchecked output growth |
| rust-v0.128.0 2026-04-30 | Terminates stdio servers on shutdown to avoid process leaks |
| rust-v0.124.0 2026-04-23 | Fixed local stdio launches for relative commands with no explicit cwd |
A server can connect and still be unusable, and a slow server can stall the session. Require rust-v0.145.0 for enforced startup timeouts, and rust-v0.141.0 for the 300-second default tool timeout.
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Enforces MCP startup timeouts during client creation |
| rust-v0.143.0 2026-07-08 | Surfaces reauthentication-required startup failures, classifies nested MCP authentication startup errors, and retries failed hosted connector startup |
| rust-v0.141.0 2026-06-18 | Raised the default MCP tool timeout to 300 seconds |
| rust-v0.140.0 2026-06-15 | Retries transient MCP startup failures, and preserves explicitly disabled servers across runtime overlays |
| rust-v0.139.0 2026-06-09 | Subagent MCP startup warnings stay in the thread that owns them, avoiding duplicate parent-thread alerts and stuck startup spinners |
Earlier startup and diagnostics fixes (February 2026 to June 2026)
| Release | Change |
|---|---|
| rust-v0.136.0 2026-06-01 | Added focused diagnostics for MCP HTTP send failures, and exposed MCP server info in server status |
| rust-v0.123.0 2026-04-23 | Added /mcp verbose for full server diagnostics, resources, and resource templates |
| rust-v0.119.0 2026-04-10 | Skips auth probing for disabled servers, and speeds up /mcp inventory listing |
| rust-v0.118.0 2026-03-31 | Increased the MCP startup timeout for local servers, and restored TUI warnings for failed handshakes that had been reported as clean startups |
| rust-v0.99.0 2026-02-11 | Required MCP servers fail fast during start and resume flows instead of continuing in a broken state, and stdio servers get process-group cleanup to prevent orphan process storms |
Tool discovery and tool catalogs
Codex defaults to tool search, so tool definitions are deferred and discovered on demand rather than injected upfront, and it caches tool catalogs across sessions.
rust-v0.119.0 fixed tool listing for hyphenated server names, and rust-v0.139.0 preserved oneOf and allOf in tool input schemas. rust-v0.145.0 added an opt-out from tool catalog caching, which you need if your tool list changes at runtime, otherwise a stale catalog is reused in the next session.
Keep tool names ASCII and conservative, because they are namespaced and normalized before the model sees them, and keep input schemas simple.
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Reuses MCP tool catalogs across sessions, and lets servers opt out of tool catalog caching |
| rust-v0.143.0 2026-07-08 | Tool search is the default for MCP tools |
| rust-v0.142.2 2026-06-25 | MCP tools use tool search by default when supported, preserving compatibility with older models and providers |
| rust-v0.139.0 2026-06-09 | Tool and connector input schemas preserve oneOf and allOf, and large schemas keep more shallow structure when compacted |
| rust-v0.131.0 2026-05-18 | Removed the unavailable-MCP placeholder tool backfill |
Earlier tool discovery fixes (March 2026 to May 2026)
| Release | Change |
|---|---|
| rust-v0.129.0 2026-05-07 | Uses MCP server instructions in deferred namespace descriptions |
| rust-v0.122.0 2026-04-20 | Tool discovery enabled by default, and placeholder tools added for previously called but currently missing tools |
| rust-v0.121.0 2026-04-15 | Registers all MCP tools with a namespace, and fixed flattened deferred tool names and empty namespace descriptions |
| rust-v0.119.0 2026-04-10 | Fixed tool listing for hyphenated server names, and expanded tool search to custom MCP servers |
| rust-v0.118.0 2026-03-31 | Normalizes /mcp tool grouping for hyphenated server names |
| rust-v0.115.0 2026-03-16 | Normalizes MCP tool names to a code-mode safe form |
Approvals, policy, and governance
Codex approval prompts run on the client, so a user can always answer yes.
| Release | Change |
|---|---|
| rust-v0.143.0 2026-07-08 | Added managed MCP server matchers |
| rust-v0.128.0 2026-04-30 | Fixed plugin MCP approval policy persistence |
| rust-v0.125.0 2026-04-24 | Permission profiles round-trip through MCP sandbox state |
| rust-v0.124.0 2026-04-23 | Hooks can observe MCP tools |
| rust-v0.122.0 2026-04-20 | Added server-level approval defaults for custom MCP servers |
Earlier approval and policy changes (January 2026 to April 2026)
| Release | Change |
|---|---|
| rust-v0.119.0 2026-04-10 | codex mcp-server respects data residency requirements |
| rust-v0.113.0 2026-03-10 | Approval prompts use the MCP-style elicitation payload, with an always-allow option |
| rust-v0.105.0 2026-02-25 | Requires approval for destructive MCP tool calls |
| rust-v0.97.0 2026-02-05 | Added a session-scoped "Allow and remember" option for MCP and app tool approvals |
| rust-v0.93.0 2026-01-31 | Smart approvals on by default, with explicit approval prompts for MCP tool calls |
| rust-v0.81.0 2026-01-14 | Restricts which MCP servers can be declared in requirements.toml, and adds hot reload for MCP servers |
Protocol features
| Release | Change |
|---|---|
| rust-v0.145.0 2026-07-21 | Preserves encrypted content in MCP tool outputs |
| rust-v0.132.0 2026-05-20 | Preserves MCP result metadata in tool call results |
| rust-v0.129.0 2026-05-07 | Routes opted-in MCP elicitations through Guardian review |
| rust-v0.121.0 2026-04-15 | Fixed elicitation timeout accounting, so the timer pauses while waiting on the user |
| rust-v0.119.0 2026-04-10 | Added support for server-driven elicitations and file-parameter uploads |
Earlier protocol feature support (January 2026 to March 2026)
| Release | Change |
|---|---|
| rust-v0.111.0 2026-03-05 | App-server exposes MCP elicitation as a structured request and response flow |
| rust-v0.99.0 2026-02-11 | Sanitizes MCP image output for text-only models |
| rust-v0.93.0 2026-01-31 | Tool image outputs render reliably even when image blocks are not first or are partially malformed |
| rust-v0.86.0 2026-01-16 | Accepting an elicitation sends an empty JSON payload instead of null, satisfying servers that expect content |