.mcp.json servers silently absent from session tool manifest despite enableAllProjectMcpServers:true and 'claude mcp list' reporting Connected
Title: .mcp.json servers silently absent from session tool manifest despite enableAllProjectMcpServers: true and claude mcp list reporting Connected
Summary
In Claude Code 2.1.140 on macOS, a project's .mcp.json is partially ignored when starting a session: only servers also present in the user-scope mcpServers (top-level of ~/.claude.json) get loaded into the session's tool manifest. Servers that exist only in the project .mcp.json never produce mcp__<server>__* tools, even though:
enableAllProjectMcpServers: trueis set for the project in~/.claude.jsonhasTrustDialogAccepted: truefor the projectenabledMcpjsonServersanddisabledMcpjsonServersare both[](no allowlist, no blocklist)claude mcp listshows all servers as✓ Connected
Result: the session is silently broken — the CLI subcommand and the in-session manifest disagree about which servers are active. No warning, no log line surfaced to the user.
Environment
- Claude Code: 2.1.140 (installed via npm into nvm-managed Node 20.19.5, downgraded from 2.1.152 in attempt to work around [the 2.1.142+ tool-indexing regression])
- OS: macOS 15.3 (Darwin 25.3.0)
- Shell: zsh
Repro
- Project root has
.mcp.jsonwith four servers (two HTTP, two stdio):
``json``
{
"mcpServers": {
"atlassian": { "type": "http", "url": "https://mcp.atlassian.com/v1/mcp", "alwaysLoad": true },
"aio-tests": { "type": "http", "url": "${AIO_MCP_URL}", "headers": { "Authorization": "Bearer ${AIO_API_TOKEN}" }, "alwaysLoad": true },
"playwright": { "command": "npx", "args": ["-y", "@playwright/mcp@latest", "--config", "./packages/e2e-web/playwright-mcp.config.json"], "alwaysLoad": true },
"chrome-devtools": { "command": "npx", "args": ["-y", "chrome-devtools-mcp@latest"], "alwaysLoad": true }
}
}
Env vars resolve via .claude/settings.local.json env block.
~/.claude.jsonfor this project entry:
``json``
{
"enableAllProjectMcpServers": true,
"enabledMcpjsonServers": [],
"disabledMcpjsonServers": [],
"hasTrustDialogAccepted": true,
"mcpServers": {}
}
Top-level ~/.claude.json mcpServers contains only atlassian (added previously via claude mcp add --scope user).
- Run
claudefrom the project root.
- Run
claude mcp list— all four servers (and Google Drive integration) reported✓ Connected, env interpolation inaio-testsURL works correctly.
- Inside the same session, the tool manifest only contains
mcp__atlassian__*(andmcp__claude_ai_Google_Drive__*from the account-level integration).mcp__aio-tests__*,mcp__playwright__*,mcp__chrome-devtools__*are missing.
Expected
With enableAllProjectMcpServers: true and the trust dialog accepted, every server defined in .mcp.json should be loaded into the session's tool manifest.
Actual
Only servers that are also declared in user-scope mcpServers end up in the manifest. Servers exclusive to .mcp.json are silently dropped, regardless of transport (HTTP or stdio) and regardless of whether they would otherwise connect successfully (proven by claude mcp list).
Workaround
Mirror every project-scope server into user scope via claude mcp add --scope user .... For stdio servers with relative paths in their args, pass an absolute path. This makes the servers global rather than per-project, but it's the only way to get the tools into the session manifest.
Another suggested workaround from issue #29652 — replacing enableAllProjectMcpServers: true with an explicit enabledMcpjsonServers: [...] allowlist — has not yet been tested in this report; if it works it would be the cleanest fix and would indicate enableAllProjectMcpServers itself is the broken code path.
Hypothesis
enableAllProjectMcpServers: true does not actually flip the manifest loader to include project-scope entries. Either the flag is being checked against the wrong project key, or the loader path was changed to consume only user-scope mcpServers and never re-merges .mcp.json once the trust dialog is past.
Why this is bad
The CLI (claude mcp list) and the session disagree about which servers are active, with no surfaced warning. Teams sharing .mcp.json via git assume teammates have the same tooling — silently they don't, and the failure mode is "the model just doesn't know about those tools." This is especially painful for project-scoped automations (e.g. test runners, custom MCP servers) that are meant to be checked in.
Related
- #29652 — hangs caused by
enableAllProjectMcpServers: trueon Windows; the same flag, different failure mode. MentionsenabledMcpjsonServersas a workaround. - #5037 —
.claude/.mcp.jsonvs.mcp.jsonlocation; not the same root cause, but a similar "silent partial load" symptom.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗