Observation
Split out of #100, which is closed by #104. #100 raised four sub-questions; three are answered there (no per-tool cancel exists at the app-server layer, aborted turns are now failureClass: "stalled", MCP calls got their own inactivity budget). The fourth is a policy question that PR #104 deliberately did not decide:
Whether MCP servers should be filtered per workspace — e.g. a server that reports it cannot serve this workspace gets dropped from the turn's tool list rather than offered to the model.
Why it is still live
The incident behind #100 was a reviewer calling codegraph/codegraph_explore in a workspace that deliberately carries no .codegraph/ index. Under Claude Code the same server answers immediately and usefully ("No CodeGraph project is loaded for this session"). Under Codex the call sat in flight until a watchdog fired.
#104 made that outcome cheaper and legible — the budget is more patient and the abort is now classified — but the reviewer is still offered a tool that cannot answer for this workspace, and it still costs the turn when the call hangs rather than errors.
What would need deciding
The plugin does not configure Codex's MCP servers today; they come from the user's own ~/.codex/config.toml and are inherited wholesale. thread/start does accept an arbitrary config override map (ThreadStartParams.config, the same shape as Codex's -c overrides), so narrowing or clearing mcp_servers for a specific thread class looks mechanically possible — untested.
Non-prescriptive, and the choice is a policy call rather than a patch:
- Leave it alone. A reviewer that can reach the user's MCP servers is a feature; the workspace is the right place to say "do not call this one" (which is what the downstream repo did in patriyang/obsidian-vault#652).
- Scope MCP servers per thread class. Review threads are short, read-only, and self-contained; dropping MCP from them removes a whole class of stall at the cost of tools a reviewer might genuinely want.
- Probe and drop. Ask each server whether it can serve this workspace before offering it. Most protocol-correct, most work, and depends on servers answering a health question promptly — the exact thing the failing server did not do.
Option 2 or 3 would need to establish first that config: { mcp_servers: ... } on thread/start actually takes effect against a live app-server; the generated types permit it, but nothing in this repo exercises it.
Related
Observation
Split out of #100, which is closed by #104. #100 raised four sub-questions; three are answered there (no per-tool cancel exists at the app-server layer, aborted turns are now
failureClass: "stalled", MCP calls got their own inactivity budget). The fourth is a policy question that PR #104 deliberately did not decide:Why it is still live
The incident behind #100 was a reviewer calling
codegraph/codegraph_explorein a workspace that deliberately carries no.codegraph/index. Under Claude Code the same server answers immediately and usefully ("No CodeGraph project is loaded for this session"). Under Codex the call sat in flight until a watchdog fired.#104 made that outcome cheaper and legible — the budget is more patient and the abort is now classified — but the reviewer is still offered a tool that cannot answer for this workspace, and it still costs the turn when the call hangs rather than errors.
What would need deciding
The plugin does not configure Codex's MCP servers today; they come from the user's own
~/.codex/config.tomland are inherited wholesale.thread/startdoes accept an arbitraryconfigoverride map (ThreadStartParams.config, the same shape as Codex's-coverrides), so narrowing or clearingmcp_serversfor a specific thread class looks mechanically possible — untested.Non-prescriptive, and the choice is a policy call rather than a patch:
Option 2 or 3 would need to establish first that
config: { mcp_servers: ... }onthread/startactually takes effect against a live app-server; the generated types permit it, but nothing in this repo exercises it.Related