ECC writes invalid `url` field under [mcp_servers.exa] in Codex config.toml, breaking Codex CLI + app
## Summary
`ecc-universal`'s Codex MCP merge emits `[mcp_servers.exa]` with a `url` key. Codex's `[mcp_servers.*]` TOML schema is **stdio-only** (`command`/`args`), so `url` is rejected and the **entire** config fails to load — both the `codex` CLI and the Codex desktop app become unusable (can't even change model reasoning effort).
## Environment
- ecc-universal: **2.0.0**
- Codex CLI: 0.133.0 / Codex.app (current)
- OS: macOS (darwin), Node 24
## Error
```
Error loading config.toml: url is not supported for stdio in `mcp_servers.exa`
```
## Root cause
`scripts/codex/merge-mcp-config.js`, the `ECC_SERVERS.exa` entry (~lines 94–96):
```js
exa: {
fields: { url: 'https://mcp.exa.ai/mcp' },
toml: `[mcp_servers.exa]\nurl = "https://mcp.exa.ai/mcp"`
}
```
This is the **only** server in `ECC_SERVERS` declared with `url`; every other (`supabase`, `playwright`, `context7`, `github`) uses `command`/`args`. It also **contradicts ECC's own Codex template** `.codex/config.toml`, which correctly ships:
```toml
[mcp_servers.exa]
command = "npx"
args = ["-y", "mcp-remote", "https://mcp.exa.ai/mcp"]
startup_timeout_sec = 30
```
The `http`/`url` form is valid only for Claude Code's `.mcp.json` (`"type":"http","url":...`), not for Codex's `[mcp_servers.*]`.
## Proposed fix
Make the merge entry match the template (stdio via `mcp-remote`):
```js
exa: {
fields: { command: 'npx', args: ['-y', 'mcp-remote', 'https://mcp.exa.ai/mcp'], startup_timeout_sec: 30 },
toml: `[mcp_servers.exa]\ncommand = "npx"\nargs = ["-y", "mcp-remote", "https://mcp.exa.ai/mcp"]\nstartup_timeout_sec = 30`
}
```
Also check the `urlEntry` branch (~line 253) — it preserves pre-existing `url` entries on re-merge, which is what makes the breakage persist across updates.
## Impact
Every install/update that runs the Codex upstream installer re-injects the invalid line, re-breaking Codex until the user manually deletes it.
关闭于 2026-06-11 0 条评论