Windows Desktop does not surface a healthy WSL stdio MCP server
Windows Desktop does not surface a healthy WSL stdio MCP server
Summary
On Windows, Codex Desktop did not expose the tools of a healthy stdio MCP
server launched through wsl.exe, although the same configuration was enabled
in codex mcp list and the exact server command completed a full MCP protocol
probe. This resembles the existing WSL spawn-bridge reports, but the server in
this reproduction is Docker-backed and does not require Node or Python on the
Windows host.
Environment
- Codex Desktop Windows:
26.715.3651.0 - Codex CLI:
0.144.1 - WSL distribution: Ubuntu 24.04
- Docker Desktop engine: 29.6.1
- MemPalace container: 3.5.0
Sanitized configuration
[mcp_servers.mempalace]
command = "wsl.exe"
args = ["-d", "Ubuntu-24.04", "--", "docker", "run", "-i", "--rm",
"-v", "theseus-mempalace-clean:/data", "theseus-mempalace:pilot"]
enabled = true
startup_timeout_sec = 60
tool_timeout_sec = 120
Evidence
codex mcp get mempalacereported the server as enabled using stdio.- Running the exact launcher independently completed MCP
initialize, then
notifications/initialized, then tools/list.
- The response identified MemPalace 3.5.0 and returned 36 tools.
- In the running Desktop task, no
mempalace_*tools were surfaced, while
other configured MCP tools were available.
- A bounded Windows process/network snapshot found Codex Desktop, its
code-mode host, Docker Desktop, and expected local service listeners alive;
it did not indicate a Docker or WSL outage.
Candidate workaround
The same container and volume pass the identical full MCP probe when launched
with native docker.exe instead of wsl.exe:
[mcp_servers.mempalace]
command = "docker.exe"
args = ["run", "-i", "--rm", "-v", "theseus-mempalace-clean:/data",
"theseus-mempalace:pilot"]
This removes only the Desktop-to-WSL process hop. It preserves the volume and
MCP server. Desktop reload verification is still pending after a full restart,
so this is a candidate workaround rather than a confirmed product fix.
Expected behavior
When codex mcp list reports an enabled stdio server and the exact command
successfully completes initialize and tools/list, Codex Desktop should
surface the server tools or provide a visible startup error with captured
stderr.
Related reports
- #21147: Windows Desktop WSL mode launches a Windows app-server path.
- Discussion #5471: MCP servers work from WSL CLI but are not detected in the
Windows IDE/WSL bridge.
2 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Update — 2026-08-06: Docker-backed Streamable HTTP works in Desktop; stdio remains invisible
I ran a controlled A/B comparison using the same read-only Sonar MCP server, the same Docker image, the same named DuckDB volume, and the same AutoMem-backed index.
Baseline: Docker-backed stdio
The stdio route completed the MCP protocol smoke test outside Desktop:
initialize: passednotifications/initialized: passedtools/list: passedsonar_statussonar_refreshsonar_preflightHowever, after a full Codex Desktop restart, none of the
sonar_*tools appeared in the running Desktop task.Candidate workaround: localhost Streamable HTTP
I then exposed the same container service through a localhost-only Docker port:
The container still uses the same named DuckDB volume and the same read-only FastMCP tools.
The direct Streamable HTTP protocol smoke passed:
tools/listreturned exactly the three Sonar tools;sonar_statusreturnedOK;sonar_preflightreturnedstatus: OK, with no conflicts and no gaps.After restarting Codex Desktop with the project-scoped HTTP profile, the tools were surfaced and callable in the Desktop task:
A live
sonar_statuscall and a selectivesonar_preflightcall both succeeded.Updated isolation
This comparison keeps the backend, image, volume, and MCP tool implementation constant while changing only the Desktop-facing transport:
This narrows the failure to the Windows Desktop stdio/process-chain or stdio tool-injection path. It also shows that a localhost-only Streamable HTTP route is a working practical workaround for this reproduction.
The global Codex configuration was not modified. The working HTTP profile is project-scoped and binds only to
127.0.0.1.Related reports:
The current reproduction is not limited to post-compaction recovery: the stdio-vs-HTTP comparison was performed after a full restart.