[BUG] Desktop app ignores mcpServers "alwaysLoad": true (stdio server) — tools deferred behind ToolSearch; identical config honored by CLI
Summary
The Desktop app ignores config-level "alwaysLoad": true on a stdio MCP server: all of the server's tools appear in the deferred-tools list and require a ToolSearch round-trip before they can be called. The same config file is honored correctly by the CLI — verified with a control showing deferral was otherwise active in that CLI session.
Docs reference: MCP — "Exempt a server from deferral" says every tool from an alwaysLoad: true server "loads into context at session start regardless of the ENABLE_TOOL_SEARCH setting," and that the field "is available on all server types." The Desktop docs say the app "reads the same settings files as the CLI."
Environment
- Claude Code CLI: 2.1.228
- Claude Desktop app (macOS): 1.28929.0
- macOS: Darwin 25.6.0
- Server: local stdio MCP server (7 tools), registered globally in
~/.claude.json:
"armory": {
"command": "node",
"args": ["--no-deprecation", "~/Projects/Armory/mcp-server/dist/index.js"],
"alwaysLoad": true,
"env": {},
"type": "stdio"
}
No project-level .mcp.json exists that could shadow this entry.
Expected
In Desktop app sessions, the server's tool schemas load at session start; tools are directly callable with no ToolSearch step.
Actual
In Desktop app sessions, all 7 mcp__armory__* tools are listed under "deferred tools ... Use ToolSearch ... before calling them", and a direct call fails with InputValidationError until the schema is fetched. Observed in two independent Desktop sessions on the same day (2026-08-13).
Evidence the config itself is honored by the CLI
All probes against the same ~/.claude.json, headless CLI (claude -p):
- Default env: armory tools loaded upfront; a direct
mcp__armory__armory_statscall succeeded with no ToolSearch. - Control (same conditions): deferral was active in that session — other MCP servers' tools (e.g.
mcp__lean-ctx__*) and WebSearch were deferred while armory was not. So this isalwaysLoadbeing honored specifically, not "CLI loads everything." ENABLE_TOOL_SEARCH=false: armory loaded upfront and directly callable (expected).
Repro
- Register a stdio MCP server in
~/.claude.jsonwith"alwaysLoad": true. - Open a session in the Desktop app; inspect the deferred-tools listing (or attempt a direct tool call).
- Compare with
claude -pon the CLI: CLI loads the server's tools upfront while still deferring other servers; Desktop defers them.
Related
- #82900 — first-turn absence of HTTP MCP servers under deferred loading; notes the server-side
_metaalwaysLoadkey not compensating. This issue is the config-level field on a stdio server, Desktop-specific. - #56551 (closed) — plugin MCP servers ignoring the alwaysLoad annotation.