.mcp.json servers silently absent from session tool manifest despite enableAllProjectMcpServers:true and 'claude mcp list' reporting Connected

Resolved 💬 3 comments Opened May 27, 2026 by demyanm Closed Jun 27, 2026

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: true is set for the project in ~/.claude.json
  • hasTrustDialogAccepted: true for the project
  • enabledMcpjsonServers and disabledMcpjsonServers are both [] (no allowlist, no blocklist)
  • claude mcp list shows 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

  1. Project root has .mcp.json with 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.

  1. ~/.claude.json for 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).

  1. Run claude from the project root.
  1. Run claude mcp list — all four servers (and Google Drive integration) reported ✓ Connected, env interpolation in aio-tests URL works correctly.
  1. Inside the same session, the tool manifest only contains mcp__atlassian__* (and mcp__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: true on Windows; the same flag, different failure mode. Mentions enabledMcpjsonServers as a workaround.
  • #5037 — .claude/.mcp.json vs .mcp.json location; not the same root cause, but a similar "silent partial load" symptom.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗