[BUG] notifications/claude/channel silently dropped on stdin — slack-channel + telegram plugins, plain interactive + --agent modes, v2.1.144
Summary
Same root-cause bug as #44181, #42138, #36827, #37663, #36411, #37933 — filing a fresh report because #42138 is the only one still open (marked stale) and the others were closed as duplicates without resolution. Adding new diagnostic evidence: confirmed reproducible on Claude Code 2.1.144 (latest stable on Homebrew) in BOTH plain interactive mode AND --agent <name> mode, with a non-Anthropic local MCP channel plugin (Slack equivalent of the official Telegram plugin).
The plugin emits notifications/claude/channel JSON-RPC frames on its stdout. Claude Code's MCP transport receives the bytes (proven via plugin-side .then() resolving the promise, confirming the SDK has written successfully). No <channel source="..." ...> block ever appears in the conversation. Outbound MCP tools (reply, react, edit_message, read_thread) work normally — bug is strictly inbound.
Environment
- Claude Code 2.1.138 → 2.1.144 (both tested, both broken)
- macOS Darwin 25.3.0 (Apple Silicon)
- Plugin: local slack-channel plugin (own implementation; same MCP capability declaration as telegram@claude-plugins-official v0.0.6:
experimental: { 'claude/channel': {} }) - Plugin runtime: Bun
- MCP SDK:
@modelcontextprotocol/sdk ^1.0.0 - Run inside SSH session → tmux →
claude
Reproduction
- Local MCP plugin declares
experimental: { 'claude/channel': {} }and registers an event listener that firesmcp.notification({ method: 'notifications/claude/channel', params: { content, meta } })on inbound external events (Slack/Telegram/Discord — same pattern). - Tokens configured, Socket Mode connection opens successfully against Slack.
- User sends a Slack DM or @mention to the bot.
- Plugin's
handleInboundfires (verified via in-plugin trace logging). mcp.notification(...)promise resolves successfully (verified via.then()callback firing — bytes written to stdout).- Claude Code's
/mcppanel shows the plugin as✓ Connected · 4 tools. - Expected:
<channel source=\"slack\" channel_id=\"...\" message_ts=\"...\" user=\"...\" user_id=\"...\">message text</channel>appears in the conversation. - Actual: Nothing happens. Conversation is silent. No entry appears in
~/.claude/projects/<project>/<session>.jsonlfor the notification.
Trace evidence (this report)
In-plugin trace logging, captured 2026-05-20 against latest Claude Code:
[00:35:38.050Z] handleInbound user=U0A8XAZAJ3T channel=C0B4N83MVA7 isDM=false text=<@U0B4SGSC9QE> Hello?
[00:35:38.052Z] mcp.notification resolved (frame sent on stdout)
[00:35:38.747Z] handleInbound user=U0A8XAZAJ3T channel=C0B4N83MVA7 isDM=false text=<@U0B4SGSC9QE> Hello?
[00:35:38.748Z] mcp.notification resolved (frame sent on stdout)
[00:36:01.806Z] handleInbound user=U0A8XAZAJ3T channel=C0B4N83MVA7 isDM=false text=<@U0B4SGSC9QE> Hello?
[00:36:01.808Z] mcp.notification resolved (frame sent on stdout)
[00:36:01.917Z] handleInbound user=U0A8XAZAJ3T channel=C0B4N83MVA7 isDM=false text=<@U0B4SGSC9QE> Hello?
[00:36:01.918Z] mcp.notification resolved (frame sent on stdout)
(Two user @mentions, each delivered twice — once as app_mention, once as message.channels — both subscribed.)
Channel session log (~/.claude/projects/-Users-renewassistant-dev-Onai-v3/<session>.jsonl) shows zero entries for any of these four notifications.
Workarounds attempted
| Workaround | Result |
|---|---|
| Upgrade Claude Code 2.1.138 → 2.1.144 (latest stable) | No change |
| Plain claude vs claude --agent <name> mode | Identical behavior in both |
| await mcp.notification(...) patch (per anthropics/claude-plugins-official#902) | No change — bytes were already being written successfully (promise resolves either way); not surprising that Anthropic's own telegram plugin v0.0.6 doesn't apply it either |
| Killed all other slack-channel bun processes (eliminate Socket Mode contention) | No change; single connection confirmed via Slack's num_connections: 1 and process inventory |
| /mcp shows plugin as ✓ Connected | Confirmed |
Suggested next steps for Anthropic
- Reopen #42138 or designate one canonical issue for tracking; the duplicate-closure cycle without a fix is generating user friction (visible in the issue threads).
- Add server-side logging (Claude Code-internal) when
notifications/claude/channelframes are received but no agent is dispatched, so future reports include the missing routing-side evidence. - Confirm whether
experimental: { 'claude/channel': {} }is still the supported capability declaration, or whether it has been replaced/renamed in newer Claude Code versions (no public docs found).
Happy to provide additional traces, sanitized configs, or a minimal reproduction MCP server if useful. Reachable via this account.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗