Desktop app shows MCP servers in Settings, but /mcp in chat shows none (tools unusable); TUI works
What version of Codex is running?
0.94.0
What subscription do you have?
Plus
Which model were you using?
gpt-5.2-codex
What platform is your computer?
Darwin 25.2.0 arm64 arm
What terminal emulator and version are you using (if applicable)?
Terminal.app 2.15
What issue are you seeing?
<img width="300" alt="Settings screenshot" src="https://github.com/user-attachments/assets/3233e5b8-5c51-417e-a8e0-9ad733325603" />
In Codex Desktop, MCP servers appear in Settings → MCP Servers, but inside the Desktop chat the /mcp command shows only global MCPs, and the model cannot use the project-scoped tools.
In the TUI (codex CLI), /mcp lists all project MCPs correctly and tools work.
<img width="300" alt="MCP list screenshot" src="https://github.com/user-attachments/assets/458e183d-c288-4b6c-9adb-e63dad194ebd" />
What steps can reproduce the bug?
Create [config.toml](app://-/index.html#) in the repo with several [mcp_servers.*](app://-/index.html#).
Trust the project in CLI (Desktop has no trust UI) and restart Desktop.
Open Settings → MCP Servers (servers appear).
In Desktop chat, run /mcp — only global MCPs are listed (project MCPs missing).
In terminal, cd to the project, run codex, then /mcp — all project MCPs are listed and usable.
What is the expected behavior?
Desktop chat /mcp should list the same MCP servers shown in Settings, and the model should be able to use them.
Additional information
_No response_
7 Comments
In addition to that, local mcps, which are defined on the project level are not working in the Desktop App, although fully functional in the TUI.
I stumbled upon the similar issue, but when opening Codex App from terminal via
codex appenvironment is loaded properlyI can reproduce a closely related desktop MCP failure locally with a third-party local stdio MCP server.
In my case the server command is
tap mcpfrom https://github.com/jlrickert/tapper, but I do not think the server implementation is the issue.What I see on March 18, 2026:
config/batchWritefollowed byconfigValidationError: invalid type: null, expected any valid TOML value.This looks like a desktop settings serialization bug rather than an MCP server bug.
Local repro:
command = "tap"andargs = ["mcp"]Expected:
Actual:
configValidationErrorCurrent hypothesis: the settings UI/save path is emitting optional unset values in a way that becomes
nullduring config write, and the TOML validator rejects that write.same issue here
I’m seeing a similar issue in Codex Desktop.
Environment:
0.130.0-alpha.5.codex/config.tomlFrom the repo root,
codex mcp listcorrectly shows the project MCPs, including Sentry, Grafana, kubectl-readonly, and Postgres read-only. These also appear in Codex Desktop Settings.But inside a Desktop thread,
/mcponly showscodex_appsand does not expose the project MCP tools to the model. The agent cannot call any of the expected project tools (mcp__Sentry__*, Grafana, kubectl, Postgres, etc.).This makes MCP-backed workflows basically unusable in Desktop: the config is visible, but the actual thread/tool surface does not receive the tools, so project skills that rely on MCPs fail or have to fall back to ad hoc shell/API work.
The key mismatch is:
codex mcp listsees the MCPs/mcpin the thread does not show themIt would be very helpful to have diagnostics that distinguish “configured”, “server initialized”, “tools discovered”, and “tools injected into this thread”. Right now the UI suggests the MCPs exist, but the session behaves as if they do not.
I am seeing the same Desktop-side discrepancy on a newer version:
26.707.722210.144.2Both servers appear enabled through
codex mcp list, including when using the CLI bundled inside Codex.app. Both successfully complete MCP initialization and return valid tool definitions fromtools/list. Their tools are callable through a direct MCP client.Despite that, a fresh Desktop thread exposes no
mcp__<server>__...namespace or callable tools. Restarting Desktop and opening a new thread does not resolve it.I added the detailed reproduction to #19425. Because these servers are tool-oriented and do not advertise resources, #14242 may describe a contributing discovery path. #19649 also documents the same registered-but-not-injected regression family.
This confirms that the Desktop Settings/configuration inventory and the actual per-thread callable tool registry can still diverge on app-server
0.144.2.Follow-up: I found a concrete cause for the Desktop/thread discrepancy and prepared a tested fix.
When
code_mode_onlyis active, discovered MCP tools are deferred totool_search. However,tool_searchitself had normal exposure and was filtered off the direct model tool surface. This explains how Desktop/config inventory and successfultools/listcan coexist with a thread that has neither directmcp__...tools nor a search bridge.The patch keeps
tool_searchtop-level asDirectModelOnly, leaves MCP tools deferred, and tests the complete Responses Lite search -> namespace -> MCP call flow.The review PR is in the fork because the upstream repository uses invitation-only external contributions and rejected direct PR creation. The branch is ready to submit unchanged if a maintainer invites it.