[BUG] ### Title Plugin MCP server tools intermittently never register in-session despite `claude mcp list` showing "Connected"
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Environment
- Claude Code 2.1.216
- macOS 26.5.2 (build 25F84)
- Plugin marketplace: local-path marketplace (
claude plugin marketplace add <local dir>) - Affected plugins:
awesome@2.11.0(serveratlassian-mcp,uvx mcp-atlassian@0.21.1),qa@0.5.0(serverzephyr-mcp, bash-launched bundled Node script)
Summary
Two of seven plugin MCP servers pass claude mcp list's health check ("✔ Connected") but their tools never appear in the live session — not discoverable via tool search, not callable. All other servers in the same plugins register correctly. Reproduced across 6+ separate session restarts / /reload-plugins runs over multiple days (2026-07-03 through 2026-07-21), including reloads performed after the server was already confirmed healthy — so it isn't just "server wasn't up yet at reload time."
Affected servers
plugin:awesome:atlassian-mcp—mcp__plugin_awesome_atlassian-mcp__*never registersplugin:qa:zephyr-mcp—mcp__plugin_qa_zephyr-mcp__*never registers
Working servers for comparison (same plugins, same restarts)
plugin:awesome:microsoft-mcp(alsouvx-launched — rules out "uvx is the problem")plugin:awesome:gitlab-mcp,plugin:awesome:tempo-mcp,plugin:awesome:estimate-mcpplugin:qa:playwright-test(also bash/node-launched bundled-style — rules out "bundled node server is the problem")
Evidence the broken servers are themselves healthy
Manually ran the exact atlassian-mcp launch command and sent a raw MCP initialize + tools/list request over stdin (bypassing Claude Code entirely). It returned a complete, correctly-schema'd 22-tool list matching the plugin's ENABLED_TOOLS config — even with a deliberately invalid PAT (this server's auth is lazy, only checked on tool invocation). So the server process, its config, and its MCP implementation are all provably correct; something specific to Claude Code's client-side registration for these two servers is dropping their tools.
Ruled out as causes: missing deps (uv/uvx installed correctly), invalid tokens, slow startup (~1.5s, comparable to working microsoft-mcp), oversized tools/list payload (~42KB/22 tools, unremarkable vs. working servers).
Impact
Any workflow depending on these two servers' tools (e.g. reading/writing Jira issues, Zephyr Scale test plans/cycles/cases) is completely blocked, with no visible error — claude mcp list reports success, giving no indication anything is wrong.
What Should Happen?
When claude mcp list reports a plugin's MCP server as "Connected", that server's tools should be discoverable and callable in the same session — the same way the other 5 servers from the same two plugins (microsoft-mcp, gitlab-mcp, tempo-mcp, estimate-mcp, playwright-test) already behave after the same restart/reload.
claude-code-mcp-bug-report-logs.md
Error Messages/Logs
Steps to Reproduce
- Install a plugin bundling multiple MCP servers, including at least one
uvx-launched Python server with required sensitiveuserConfigtokens. - Configure required tokens,
/reload-plugins(or restart). claude mcp list→ server shows Connected.- Search for that server's tools (or try calling one) → not found / not registered, while sibling servers in the same plugin register fine.
Claude Model
Sonnet (default)
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.216
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_
3 Comments
I've seen this pattern a lot. The tools ARE connecting initially (hence claude mcp list shows "Connected") but the actual ools/list response during session initialization fails or arrives late.
Quick way to verify: wrap the server with a transcript proxy to capture the full JSON-RPC exchange during session start:
ash
pip install mcp-debug-proxy
mcp-debug --out session.json -- python your_server.py
Then connect Claude Code. After it fails, check the report — it'll show whether ools/list was called, what it returned, and how long it took. If the response arrives after Claude's timeout window (common with slow-starting servers), that explains the intermittent behavior.
The fix is usually: make sure your server's ools/list handler returns within Claude's timeout (around 10s). Adding a warmup phase before listing tools helps.
Here's what Claude debugged.
Agent-view worktree sessions fail to launch: plugin MCP bootstrap is fail-closed (
sendFailed: Server not found: <server>)<!--
Repo: https://github.com/anthropics/claude-code/issues
Suggested labels: bug, vscode-extension, mcp, worktrees
-->
Summary
Launching a worktree-isolated agent from the VSCode extension's agent view fails on the very
first turn with:
The worktree and its branch are created, but the session dies immediately. The session appears to
receive the manifest of plugin-provided ("Workspace"-scoped) MCP servers it should have, but never
connects them, and the bootstrap is fail-closed: it aborts the first send on the first
unconnected server. Persistently disabling that server just advances the identical error to the
next plugin MCP server in line. The main (non-worktree) window connects the same servers without
issue, and the CLI / subagent worktree path works perfectly - so this is specific to the
agent-view worktree launcher, not git, not the OS, and not the model/agent chosen.
Environment
| | |
|---|---|
| Claude Code VSCode extension |
2.1.219(win32-x64) || Claude CLI |
2.1.219|| VSCode |
1.130.0|| OS | Windows 11 Pro 10.0.22631 |
| Node | v18.20.8 via nvm-for-Windows (
C:\nvm4w\nodejs); plugin MCP servers launch vianpx|| Plugin MCP servers enabled | context7, cwm-roslyn-navigator (dotnet-claude-kit), roslyn-lsp |
Steps to reproduce
view's MCP Servers panel).
agents/<name>", immediately followed byError: (sendFailed) Error: Server not found: <first plugin MCP server>.defect #2). Relaunch. The error advances to the next plugin MCP server.
Observed progression in our testing:
context7-> (disabled) ->cwm-roslyn-navigator-> ...Expected
The worktree session should start successfully, connecting the same plugin MCP servers the main
window connects (or degrading gracefully / fail-open if one cannot start), exactly as the main
window and the CLI worktree path already do.
Actual
The first send is aborted with
sendFailed: Server not found: <server>and the session is dead.Evidence
<details>
<summary>Main window connects the same server fine (extension-host log)</summary>
Note the server registers under the fully-qualified id
plugin:context7:context7, but theagent-view error reports the bare display name (
context7,cwm-roslyn-navigator). Thisname-resolution mismatch may be the direct cause of "not found".
</details>
<details>
<summary>The plugin packages themselves are healthy</summary>
Launching context7 standalone under the same Node succeeds:
</details>
<details>
<summary>Control case: the CLI / subagent worktree path works perfectly</summary>
A worktree-isolated subagent created and used an isolated worktree with all MCP tools intact:
Only the agent-view worktree launcher fails.
</details>
<details>
<summary>The failure is surfaced above the extension-host log layer</summary>
The strings
sendFailed,Server not found, and the dead session id never appear in.../exthost/Anthropic.claude-code/Claude VSCode.log. They are produced only by thewebview / SDK session layer, which is why the extension-host log shows the servers connecting
"successfully" while the agent-view session reports them "not found".
</details>
Root-cause hypothesis
Worktree/agent-view sessions receive the plugin-MCP manifest but do not actually spawn/connect the
servers for that session (or the first send fires before they connect). The bootstrap then treats
any not-yet-connected required server as fatal, aborts the send, and reports the bare server
name. Two candidate mechanisms, not mutually exclusive:
context7) instead ofthe fully-qualified id (
plugin:context7:context7) they register under.bootstrap is fail-closed instead of fail-open like the main window.
Secondary defects observed during diagnosis
follow-up message fails with
Cannot resume unknown session: <id> (not present in SDK transcript. The session is permanently unresumable.store)
"Disable (Session)". A session-scoped disable does not propagate to a newly-spawned worktree
session, so it cannot be used to work around this bug. The only persistent lever is disabling the
entire plugin (which also removes that plugin's skills/tooling).
(expected) but leaves an orphan git branch (
agents/<name>) behind.Impact
The agent-view worktree feature is effectively unusable for any user with plugin-provided MCP
servers enabled - the default for anyone using context7, the dotnet/Roslyn kit, etc. Because
"Disable (Session)" cannot reach the new session, there is no in-UI workaround short of disabling
whole plugins.
Workarounds (current)
view, accepting the loss of those plugins' tools/skills.
Hitting what looks like the same underlying bug, with a different connector type — the hosted
claude.ai Atlassian Rovoconnector (https://mcp.atlassian.com/v1/mcp), not a plugin-launched server. Adding in case the extra data point about status inconsistency helps narrow it down.Environment
claudesessionSymptoms
claude mcp listreports the connector as✔ Connected(occasionally! Connected · tools fetch failed — Request timed out, but clean on retry most of the time).jira,atlassian,confluence, and common guessed tool names (getJiraIssue,searchJiraIssuesUsingJql, etc.), nothing surfaces.id.atlassian.com/manage-profile/appsshows Claude/Rovo authorized with "Read Jira project and issue data..." and "Create and edit issues in Jira..." permissions.New data point: inconsistent status across code paths
Within the same Claude Code install/login, two different invocations disagree about whether the connector is even authorized:
claude mcp list→✔ Connected.claude -p "<query about available jira tools>"invocation → reports the same server as requiring authentication and never having been authorized.So it's not just "Connected but tools missing" — the authorization state itself isn't consistently tracked across how the CLI is invoked, which suggests the bug may be in session/auth-state handling rather than (or in addition to) tool registration specifically.
Expected behavior
If
mcp listreports a connector as✔ Connected, its tools should be discoverable and callable in that same session. If authorization is actually incomplete,mcp listshould reflect that (e.g.! Needs authentication, consistent with how other unauthenticated connectors like Slack/Zoom are shown) instead of showing Connected with silently zero tools — and that status shouldn't differ depending on which code path (interactive vs-p) checks it.