Browser & Computer Use plugins silently unusable with a custom model_provider (no tool_search / dynamic tool discovery)
Summary
Codex supports custom model_provider endpoints (OpenAI-compatible /responses), but the Browser and Computer Use plugins silently do not work when a session uses one. Their required runtime tool (mcp__node_repl__js) is never exposed to the model. Switching the same machine/plugins to the official backend makes it work immediately. The differentiator is tool_search (dynamic tool discovery), which is not offered on custom providers.
Environment
- Codex Desktop build
26.623.141536(CLI0.142.5), Windows 11 - Plugins enabled:
browser@openai-bundled,computer-use@openai-bundled - Model:
gpt-5.5 - Reproduced with a custom OpenAI-compatible
model_provider(a local/responsesendpoint). Not specific to any particular endpoint.
What works (so this is not an install/packaging problem)
[mcp_servers.node_repl]is registered;node_repl.exestarts cleanly (startup_complete=true,tool_count=3).- Native pipes are created (
codex-computer-use-*,codex-browser-use-*); thebrowser-client.mjsSHA is in the node_repl trust allowlist. - Both plugin skills state that automation must run through
mcp__node_repl__js.
Repro
- Configure a custom
model_provider(any OpenAI-compatible/responsesendpoint) and select it. - Enable the Browser and/or Computer Use plugins; confirm
node_replstarts (serves 3 tools). - Ask the model to list its available tools.
Observed: the model's tool list contains no mcp__node_repl__js and no tool_search tool, so the runtime tool is unreachable and the plugins cannot control the in-app browser. [features].js_repl also resets to false on every launch and is not persistable via config.
Expected: the plugins' runtime tool is reachable, as it is on the official backend.
Official backend (same machine, same plugins) — works
tool_search.tool_search_toolis present;mcp__node_repl__jsbecomes discoverable via tool_search and the in-app browser can be driven end-to-end.
Apparent root cause (from investigation)
mcp__node_repl__js is a dynamic tool surfaced via tool_search, not a static tool. tool_search appears to be gated by a backend-delivered feature flag (anthropic_tool_search_enabled) tied to the official backend, so sessions on a custom model_provider never receive it — and therefore can never discover the plugins' runtime tool.
Request (any one of)
- Enable dynamic tool discovery (
tool_search) for custommodel_providerendpoints, or - Provide a config option to expose MCP/plugin tools statically (bypassing tool_search), so Browser/Computer Use work without the dynamic-discovery layer, or
- Document that Browser & Computer Use require the official backend.
5 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Verified workaround for custom
model_providersessions (Codex Desktop 26.803.5235.0, Windows):Set
"supports_search_tool": falsein the model catalog JSON referenced bymodel_catalog_jsoninconfig.toml(with cc-switch:~/.codex/cc-switch-model-catalog.json). When the field istrue, plugin MCP tools (e.g.mcp__node_repl__js) are routed throughtool_searchdynamic discovery, which custom providers never receive; withfalse, the MCP tools appear directly in the session tool list.After the change, a new conversation on the custom provider exposes
mcp__node_repl__jsand@Computerbecomes invocable. On Windows 26.803 the helper then hits #37383'sEnumWindows0x80070003 sandbox regression, but tool exposure itself is fixed.Additional reproduction details from a custom-provider setup:
Changing the model catalog entry to:
does expose the direct MCP tools, so this is a partial workaround for tool discovery. However, calls to the Browser plugin's
node_repl.jstool still lose their actual output. The model only receives:The expected
contentpayload is missing. In the same session,js_resetandjs_add_node_module_dirreturn text normally, so the failure seems specific to serialization/forwarding of the direct MCPnode_repl.jsresult through the custom Responses provider path.Should direct MCP
function_call_outputpreserve bothcontentandstructuredContentfor custom Responses providers? Is there an additional provider capability/configuration required beyondsupports_search_tool: false?Adding data that narrows this down: on my machine the lost-output half of this report reproduces without any custom provider, so the tool-result forwarding failure appears to be independent of
supports_search_tool/tool_search.Environment
26.803.61601, bundled CLI0.147.0-alpha.6.5, macOS (arm64)computer-use@openai-bundled,browser@openai-bundledWhat I measured
I parsed all 401 local rollout sessions in
~/.codex/sessionsand paired everymcp_tool_call_endwith thefunction_call_outputCodex actually forwards to the model. 746 MCP calls returned a non-emptycontent[]text block:|
structuredContentpresent |content[]text reached the model | count || --- | --- | --- |
| no | yes | 697 |
| yes | no | 49 |
Correlation is 100% with zero exceptions: whenever a
CallToolResultcarries bothcontent[]andstructuredContent, onlystructuredContentis forwarded and the text block is dropped. Same behaviour as #10334, observed here on the app/plugin path.The part that rules out the custom provider
Three of the 49 dropped calls are from 2026-07-26, about two weeks before I installed any routing proxy. That session's
session_metarecords:Native OpenAI backend, no proxy, no custom
model_provider, no catalog override, and thecontent[]text was dropped identically:So
supports_search_tool: falsefixes tool discovery (as @SIMON-WORLD and @Eleven-is-cool found), but the output loss looks like a separate, provider-independent defect.Direct repro on the Computer Use path
/tmp/probe.txtis created, so the code really ran.content: [{"type":"text","text":"wrote file"}]plusstructuredContent: {"execution_duration_ms":1}.{"execution_duration_ms":1}.A useful control: when the submitted code throws, the result carries no
structuredContent, and the error text arrives intact (I sawIdentifier 'fs' has already been declared). That matches @Eleven-is-cool's observation thatjs_resetandjs_add_node_module_dirreturn text normally, since those results also carry nostructuredContent. The discriminator is the presence ofstructuredContent, not the tool or the transport.Not limited to node_repl
Distinct tools affected in my logs:
node_repl/jscodex_apps/figma.get_metadata,codex_apps/figma.download_assetscodex_apps/github.search_branches,codex_apps/github.get_repo,codex_apps/github.fetch_fileWhy this makes the plugin look unused rather than broken
Computer Use itself is fully functional here: through
@oai/skyI enumerated 53 apps and captured a Finder screenshot successfully. But the model only ever receives{"execution_duration_ms": N}with no app list, no accessibility tree, and no screenshot. Given no usable feedback from the first call, the model falls back to shell commands, which presents as "the model won't use Computer Use" when the actual cause is that every result comes back empty.Images are affected on the same path:
nodeRepl.emitImage(...)output does not reach the model, though writing the screenshot to disk and reading it back works as a workaround.Question
Should
function_call_outputpreservecontent[]wheneverstructuredContentis present, either concatenated or withcontent[]taking precedence? As it stands, any MCP tool returning both, which includes the bundled Computer Use / Browser runtime and several connectors, is effectively mute to the model on official and custom providers alike.this should be addressed
@tibo-openai