Claude Desktop blocks SendMessage entirely, which also removes subagent continuation
Claude Desktop blocks SendMessage entirely, which also removes subagent continuation
Summary
Claude Desktop launches the bundled Claude Code CLI with --disallowedTools SendMessage, and
additionally auto-denies the tool through an internal PreToolUse hook. The deny message explains the
block in terms of cross-session reachability:
Usemcp__ccd_session_mgmt__send_messageto message another session from the desktop app; the CLI-nativeSendMessagetool is unavailable here (terminal sessions outside Claude Desktop are not reachable from this session).
But SendMessage does two unrelated jobs. Blocking the whole tool also removes the second one —
continuing a previously spawned subagent with its context intact — which has nothing to do with
reaching terminal sessions, and which the replacement MCP tool does not cover.
The result is that the model is instructed to use a tool that cannot exist in this surface: theAgent tool description still says *"Use SendMessage with the agent's ID or name to continue a
previously spawned agent with its context intact", ListAgents still says "send with
SendMessage({to: ...})"*, and every subagent result still ends withagentId: <id> (use SendMessage with to: '<id>', summary: '...' to continue this agent). All of that
is dead text in Claude Desktop, and the model has no way to know it until it tries.
Environment
| | |
|---|---|
| Claude Desktop | 1.46388.4 (Windows MSIX, Claude_1.46388.4.0_x64__pzs8sxrjxfjjc) |
| Bundled Claude Code | 2.1.260 (%APPDATA%\Claude\claude-code\2.1.260\claude.exe) |
| CLI on PATH | 2.1.263 (%USERPROFILE%\.local\bin\claude.exe) |
| OS | Windows 11 Pro 26200 |
| Account | claude.ai, no managed settings |
What I observe
The desktop app spawns the CLI as (abridged):
...\Roaming\Claude\claude-code\2.1.260\claude.exe --output-format stream-json --verbose
--input-format stream-json --model claude-opus-5 --permission-prompt-tool stdio
--allowedTools mcp__computer-use,mcp__ccd_session__spawn_task,...,mcp__ccd_session_mgmt__send_message,...
--disallowedTools SendMessage
--permission-mode auto ...
So SendMessage is never registered, and ToolSearch with select:SendMessage returnsNo matching deferred tools found. A second layer in app/resources/app.asar denies it even if it
were reached, emitting desktop_ccd_permission_auto_denied with reason: "cli_native_send_message".
Meanwhile ListAgents stays available and happily lists 29 reachable peers, telling the model to
message them with a tool that is not there.
Why this is not a CLI regression
I ran both bundled binaries headless and read the actual tool list from the init event:
| binary | flag | SendMessage present |
|---|---|---|
| 2.1.258 (the last version where it worked) | --disallowedTools SendMessage | no |
| 2.1.260 | --disallowedTools SendMessage | no |
| 2.1.260 | (no flag) | yes |
| 2.1.263 (terminal) | (no flag) | yes |
The CLI honours the flag identically in 2.1.258 and 2.1.260, so the CLI version is not the variable.
Timeline
Counting real SendMessage tool calls (not mentions) across all local transcripts:
| CLI version | sessions | SendMessage calls |
|---|---|---|
| 2.1.246 | 9 | 7 |
| 2.1.247 | 3 | 9 |
| 2.1.255 | 1 | 7 |
| 2.1.258 | 4 | 84 |
| 2.1.260 | 7 | 0 |
| 2.1.263 | 2 | 0 |
Last real call: 2026-09-03. Claude Desktop 1.46388.4 was installed 2026-09-05 20:11. Every session
from 2026-09-06 onward has zero, while subagent results kept advertising use SendMessage with to:
the whole time.
I could not compare against the previous desktop bundle (MSIX keeps only the current version), so I
cannot say whether the older app lacked this code or had it behind a flag that flipped — only that
the CLI is not the cause and the behaviour changed with the app update.
Steps to reproduce
- Open a Claude Code session in the Claude Desktop app (Code tab).
- Ask it to call
ToolSearchwithselect:SendMessage→No matching deferred tools found. - Spawn any subagent with the
Agenttool and let it finish. The result ends with
agentId: <id> (use SendMessage with to: '<id>' ... to continue this agent).
- There is no way to act on that instruction.
Expected: either SendMessage is available for subagent continuation, or the surface stops
advertising it.
Suggested fixes (either would do)
- Narrow the block to what the message describes. Allow
SendMessagewhentoaddresses a
subagent spawned by this session; deny only cross-session/peer targets. That matches the stated
rationale exactly.
- If the whole tool must stay blocked, suppress the instructions that depend on it in this
surface — the use SendMessage with to: hint on subagent results, and the sentences in the
Agent and ListAgents descriptions — and say in their place that a subagent cannot be
continued here.
Option 1 is the one that restores lost capability; option 2 at least stops the surface from
contradicting itself.
Impact
On a project that leans on subagents, follow-up questions to a running agent are gone: a subagent
that returns an incomplete result has to be killed and respawned with a rewritten brief, paying its
whole context again. That is a real cost, and it is invisible until you try — the model is told the
capability exists right up to the moment it isn't there.
3 Comments
Facing similar issue. Don't want to create a duplicate so sharing my findings here:
ListAgentscorrectly shows the peer asRemote Control · idle, butSendMessagestill reports itself as explicitly "disabled for this session"Steps to reproduce
claude remote-controlto link it to the same account./remote-control(needed forListAgentsto see Remote Control peers at all — this part worked once done).ListAgents. Result: the peer session appears correctly, labeledRemote Control · idle.ListAgents's own tool description documents:SendMessage({to: "<peer-name>", message: "..."}).Expected behavior
The message is delivered to the peer session, per
ListAgents's documented usage pattern (this is the literal example given in that tool's own description).Actual behavior
The tool call fails immediately with:
No further explanation, and no discoverable setting (checked
/config— not available in this session type; found no toggle referencingSendMessagespecifically).Notes
ListAgents), so this seems to be a narrower restriction onSendMessagespecifically, possibly tied to this desktop-app session type ("Code tab") rather than Remote Control being off.SendMessagework consistently wherever a peer isListAgents-visible, or (b) a clear error message stating why/where it's disabled and how to enable it, sinceListAgents's own docs advertiseSendMessageas the way to act on its results.Just to note, same issue on Mac (Claude 1.46388.4 (50e62f) 2026-09-05T01:57:47.000Z)
I am specifically hitting issues in the scenario of continuing a previously spawned subagent, which should be and was possible until very recently.
Still reproduces on Claude Desktop 1.49585.0.0 (
app.asarmtime 2026-09-09 04:40 GMT+9), so this is not fixed in the current desktop build — your report was against 1.46388.4. Same bundled CLI (claude-code 2.1.260), Windows 11 Pro 26200.I ran into this from a different direction and independently confirmed every mechanism you describe: the
--disallowedTools SendMessagelaunch flag (all four of my desktop sessions carry it), thepd="SendMessage"/md=["ListAgents","ListPeers"]pair inapp.asar, and thecli_native_send_messageauto-deny. Launching the same 2.1.260 binary from a plain shell and reading theinitevent givesSendMessage: true, so the capability is intact and only the app blocks it.One thing to add:
SendMessagedoes a third job, and it is also gone — Agent Teams.Teammate-to-teammate messaging within a single session is what makes Agent Teams more than a set of parallel subagents. That is distinct from both cross-session peer messaging (which the replacement covers) and subagent continuation (which you documented).
What makes it worse than a plain removal is that the rest of the feature is still wired up and looks healthy:
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1is still injected into the session environment, so the setting now silently does nothingTaskCreate/TaskList/TaskUpdateare all still registered, so the shared task list still worksListAgentsstill lists the teammatesA team can therefore be spawned, given a shared task list, and enumerated — but its members cannot talk to each other. There is no error and no "unsupported" notice; the feature just quietly stops doing the one thing it exists for.
Your suggested fix 1 (narrow the block to cross-session/peer targets and allow same-session agents) would restore this case too. Adding it here rather than opening a duplicate.