MCP stdio server tool-list stale across new sessions and full reboot (Claude Desktop, Code tab)

Status Open
Reported on v2.1.258
Maintainer reply None cached
Activity 1 comment · opened Sep 8, 2026

Environment

  • Claude Desktop (Windows), Code tab
  • Multiple claude-code binary versions found installed side-by-side under

%APPDATA%\Claude\:

  • claude-code\2.1.258\claude.exe
  • claude-code\2.1.260\claude.exe
  • claude-code-vm\2.1.229\claude (older — possibly a separate sandboxed

runtime channel used to actually run Code-tab sessions)

Summary

A project-scoped stdio MCP server (.mcp.json) that gained two new tools
after a rebuild continues to advertise its old, pre-rebuild tool list to
Code-tab sessions — even in a brand-new conversation, and even after a full
OS reboot. Speaking the MCP protocol directly to the same binary (bypassing
the app) proves the server itself returns the correct, current tool list.
The staleness is therefore in the app's MCP client/session layer, not the
server or the project config.

Steps to reproduce

  1. Configure a project-scoped stdio MCP server in .mcp.json

("runsnative": { "type": "stdio", "command": "node", "args": ["<path>/dist/index.js"] }).

  1. Start a Code-tab session; note the tool list the server advertises.
  2. Add new tools to the server's source, rebuild (npm run build), so the

dist artifact now includes the new tools. Confirm on disk: new tool files
exist, and the bundled server's tools/list handler array includes them.

  1. Start a new Code-tab conversation in the same project.
  2. Observe: the new session's tool list for that MCP server still shows only

the old, pre-rebuild tools.

  1. Fully reboot the machine (not just restart the app — a full OS reboot).
  2. Start another new Code-tab conversation.
  3. Observe: still the old tool list.

Expected behavior

A new Code-tab conversation — and certainly one started after a full OS
reboot, which kills every process on the machine — should spawn a fresh
stdio subprocess for each configured MCP server and issue a fresh
initialize/tools/list handshake, reflecting whatever the server
currently returns.

Actual behavior

The stale, pre-rebuild tool list persists across:

  • a brand-new conversation, and
  • a full OS reboot.

Diagnostic evidence

Speaking MCP protocol directly to the exact binary the app's .mcp.json
points to, bypassing the app entirely:

node dist/index.js < initialize+tools_list_request.jsonl

returned the correct, current tool list (version 0.10.0, includes the two
new tools with full schemas and metadata) — proving:

  • the dist build is current and correctly wired
  • .mcp.json (both the project's main checkout and its worktree copy)

points at the right path

  • neither the Claude Desktop app's own claude_desktop_config.json nor the

user-scope ~/.claude/.mcp.json override or shadow this server entry

None of those are the cause. The gap reproduces only through the app's own
session/conversation layer.

Suspected cause (unconfirmed)

Version skew between claude-code-vm\2.1.229 and the newer
claude-code\2.1.258 / 2.1.260 installs found side-by-side in
%APPDATA%\Claude\. If Code-tab sessions dispatch through the older -vm
binary, an MCP-client tool-list caching bug already fixed in a newer release
could explain reproduction across both a new conversation and a full reboot.
Not confirmed — just the most concrete lead found during triage.

Impact

Blocks verification/demo of any MCP tool added or changed after a server's
first connection in a given install, without a clear recovery path short of
reinstalling or manually intervening in app internals.

🤖 Generated with Claude Code

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗