claude-code - 💡(How to fix) Fix [BUG] notifications/claude/channel silently dropped on stdin — slack-channel + telegram plugins, plain interactive + --agent modes, v2.1.144 [1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
anthropics/claude-code#60721Fetched 2026-05-20 03:51:14
View on GitHub
Comments
1
Participants
2
Timeline
7
Reactions
0
Timeline (top)
labeled ×6commented ×1

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.

Root Cause

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

Fix Action

Fix / Workaround

Workarounds attempted

WorkaroundResult
Upgrade Claude Code 2.1.138 → 2.1.144 (latest stable)No change
Plain claude vs claude --agent <name> modeIdentical 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 ✓ ConnectedConfirmed
  • 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/channel frames 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).

Code Example

[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)
RAW_BUFFERClick to expand / collapse

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

  1. Local MCP plugin declares experimental: { 'claude/channel': {} } and registers an event listener that fires mcp.notification({ method: 'notifications/claude/channel', params: { content, meta } }) on inbound external events (Slack/Telegram/Discord — same pattern).
  2. Tokens configured, Socket Mode connection opens successfully against Slack.
  3. User sends a Slack DM or @mention to the bot.
  4. Plugin's handleInbound fires (verified via in-plugin trace logging).
  5. mcp.notification(...) promise resolves successfully (verified via .then() callback firing — bytes written to stdout).
  6. Claude Code's /mcp panel shows the plugin as ✓ Connected · 4 tools.
  7. Expected: <channel source=\"slack\" channel_id=\"...\" message_ts=\"...\" user=\"...\" user_id=\"...\">message text</channel> appears in the conversation.
  8. Actual: Nothing happens. Conversation is silent. No entry appears in ~/.claude/projects/<project>/<session>.jsonl for 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

WorkaroundResult
Upgrade Claude Code 2.1.138 → 2.1.144 (latest stable)No change
Plain claude vs claude --agent <name> modeIdentical 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 ✓ ConnectedConfirmed

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/channel frames 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.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

claude-code - 💡(How to fix) Fix [BUG] notifications/claude/channel silently dropped on stdin — slack-channel + telegram plugins, plain interactive + --agent modes, v2.1.144 [1 comments, 2 participants]