Repository navigation
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server
Steps to reproduce
- Configure a working MCP server in a project’s
.codex/config.tomlwithenabled = true. In my case this is an authenticated local HTTP Obsidian MCP server - Use a Codex home whose user
config.tomlhas no trusted-project entry for that project or a parent directory - Open the project in T3 Code desktop, select the Codex provider, and start a chat in Full Access mode
- Ask the chat to use the project MCP server. Its tools are absent from the available tool catalog
- Inspect Codex app-server
config/readwith the actual projectcwdandincludeLayers: true. The project layer is found but disabled, with an explicit instruction to trust the project in the provider’s user config
The server endpoint was independently reachable and authenticated successfully, so the repro does not depend on the MCP service being down
Expected behavior
T3 should surface Codex’s project-layer disabledReason when project-local MCP configuration is skipped, including the affected project and the actual provider CODEX_HOME
Suggested remedy: Offer an explicit per-project “Trust this project for Codex” action or setting, with an explanation of what trusting the project enables. Full Access and Codex project trust are separate decisions. The action should update only the selected project’s trust in the Codex home used by that provider
After a trust or MCP config change, applying it must preserve other chats and running work. New provider sessions can pick up the change. Any refresh for the affected chat should preserve its conversation, wait for its running turn to finish, and avoid restarting a provider runtime shared with other chats
The reported failure is the missing actionable trust diagnostic. The trust action and scoped refresh are proposed remedies for that failure
Actual behavior
The chat cannot see the project’s Obsidian MCP tools, and I did not see a project-trust warning or a trust action explaining why the configured server was unavailable
Verified diagnostics:
- The provider used the correct project working directory
- Codex found the project
.codex/config.toml, butconfig/readmarked that layer disabled because the project was not trusted - The effective MCP configuration omitted the project server
- The project server was enabled, with no enabled/disabled tool filters
- Two isolated temporary
CODEX_HOMEcontrols used the same project config and differed in the project trust entry. The untrusted control omitted Obsidian. The trusted control loaded the project layer andmcpServerStatus/listauthenticated successfully and discovered 52 tools - Built-in MCP servers were ready before the affected turn. This is a config-loading gate rather than evidence of a slow Obsidian startup
- Restarting T3 did not remove the project-layer trust restriction
Related reports: #13437 concerns a partial catalog during MCP startup, #297 concerned the project working directory, and #9230 concerned unavailable env_vars. The verified cause in this reproduction is the untrusted project layer
Verification limit: The successful trust control was an isolated Codex app-server test. I have not trusted the real project config or verified a fresh T3 chat after enabling that trust
Impact
Major degradation or frequent failure
Version or commit
0.0.46-nightly.20261003.2623
Environment
Windows 10 Pro x64, build 19045 · T3 Code desktop nightly · Codex CLI 0.160.0 · Local authenticated HTTP Obsidian MCP
Logs or stack traces
Redacted diagnostic summary. Project and Codex-home paths are placeholders
config/read: cwd=<project>, includeLayers=true
Project layer: <project>\.codex\config.toml
disabledReason: To load project-local config, hooks, and exec policies, add <normalized-project-path> as a trusted project in <CODEX_HOME>\config.toml.
Untrusted isolated control:
Project layer disabled
Obsidian absent from effective MCP configuration
Trusted isolated control:
Project layer enabled
mcpServerStatus/list: Obsidian authenticated, 52 tools discoveredScreenshots, recordings, or supporting files
No response
Workaround
In an isolated temporary Codex home, adding the matching project entry with trust_level = "trusted" enabled the project MCP server
A manual trust entry in the actual provider’s user config followed by a fresh provider session is the proposed workaround. It has not been applied or verified in my real T3 project
A provider-wide restart could affect other chats sharing that runtime, so it should not be required to apply a project trust change to one chat
Activity
juliusmarminge commentedon Oct 3, 2026
Note
Grok responding on behalf of Julius.
Triage
Thanks @Neonsy for the thorough diagnosis, and especially the trusted and untrusted
CODEX_HOMEcontrols! This is a real gap on currentmain, including nightly0.0.46-nightly.20261003.2623. Nothing since that nightly touches the Codex session path.What happens
Codex loads a project
.codexlayer (MCP servers, hooks, and exec policies) only when that project is trusted in the Codex home'sconfig.toml. Full Access doesn't grant that trust. InCodexAdapterV2, Full Access only starts the turn withapprovalPolicy: "never"andsandboxPolicy: { type: "dangerFullAccess" }. Thread start passes the project cwd and session config overrides, which Codex layers above the user and project config.T3 never calls
config/readwithincludeLayers, and the adapter doesn't subscribe toconfigWarning. So when Codex disables the project layer, the MCP tools just go missing and the layer'sdisabledReasonnever reaches the chat. Codex's own TUI shows that reason by reading the project layer, and T3 doesn't. That matches your isolated controls: same project config, with and withouttrust_level = "trusted".This is separate from #13437 (open; a partial tool catalog while MCP servers are still starting), #297 (closed; an MCP process whose working directory didn't match the project), and #9230 (closed;
env_varson desktop-launched profiles).Scope
The bug is the missing diagnostic. A per-project "Trust this project" action would be a separate product change. Trusting a project also enables its hooks and exec policies, the entry has to use the exact project key from
disabledReason, and the app-server schema T3 generates has no trust RPC. Copying the project's MCP servers into the session config would quietly bypass Codex's trust gate. A maintainer will decide on the fix direction.Workaround
This matches your isolated control. In the
config.tomlof the Codex home named indisabledReason, add the project key Codex names, withtrust_level = "trusted". Then start a new Codex session, because an already-open session won't pick up the project layer. You don't need to restart T3 for the file edit itself. On a shadow-home instance,config.tomlis shared from the configured Codex home unless that shadow already has its own real file.juliusmarminge commentedon Oct 22, 2026
Reproduced on Linux with Codex 0.163.0 and the web dev app at defb7e6e6b. An enabled local MCP fixture in an untrusted project's
.codex/config.tomlwas absent from a Full Access chat's tool catalog, and the chat showed no trust diagnostic.config/readwith that project's cwd returned the disabled project layer and the remedy naming the actual provider Codex home. An isolated trusted control loaded the same MCP configuration.test(server): tighten Codex project config coverage after merge