[BUG] Desktop app ignores mcpServers "alwaysLoad": true (stdio server) — tools deferred behind ToolSearch; identical config honored by CLI

Status Open
Reported on v2.1.228
Maintainer reply None cached
Activity 0 comments · opened Aug 13, 2026

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):

  1. Default env: armory tools loaded upfront; a direct mcp__armory__armory_stats call succeeded with no ToolSearch.
  2. 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 is alwaysLoad being honored specifically, not "CLI loads everything."
  3. ENABLE_TOOL_SEARCH=false: armory loaded upfront and directly callable (expected).

Repro

  1. Register a stdio MCP server in ~/.claude.json with "alwaysLoad": true.
  2. Open a session in the Desktop app; inspect the deferred-tools listing (or attempt a direct tool call).
  3. Compare with claude -p on 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 _meta alwaysLoad key not compensating. This issue is the config-level field on a stdio server, Desktop-specific.
  • #56551 (closed) — plugin MCP servers ignoring the alwaysLoad annotation.

View original on GitHub ↗