Discord plugin inbound notifications silently dropped on CC 2.1.153 (Windows)

Resolved 💬 1 comment Opened May 28, 2026 by SideQuestTrading Closed Jun 28, 2026

Summary

The official discord plugin (v0.0.4) successfully sends notifications/claude/channel JSON-RPC notifications to Claude Code, but they are silently dropped — never converted into <channel source=\"discord\" ...> tool-result blocks in the session. Outbound tools (reply, fetch_messages, etc.) work normally. The asymmetry isolates the bug to the client-side notification dispatch / experimental capability handling.

Environment

  • Claude Code: 2.1.153 (Windows)
  • Discord plugin: 0.0.4 (claude-plugins-official/discord/0.0.4)
  • OS: Windows 11 Home 10.0.26200
  • MCP server: bun, parented correctly to the active claude.exe (verified via wmic)

Repro

  1. Install the official discord plugin, configure access (~/.claude/channels/discord/access.json) with requireMention: false.
  2. Start a CC session — discord MCP child spawns cleanly (verified ready event fires, gateway connects).
  3. From an allowlisted Discord user, post a message in an allowlisted channel.
  4. Observe: the message never appears in the CC session as a <channel> block. Calling fetch_messages from CC retrieves it normally.

Evidence — bug is client-side, not server-side

I instrumented server.ts to log every inbound message at the mcp.notification(...) call site. After sending one Discord test message:

2026-05-28T01:08:43.853Z ATTEMPT msg=1509362826270085213 chat=... user=... content=\"test after mcp reconnect\"
2026-05-28T01:08:43.854Z OK msg=1509362826270085213
  • ATTEMPT confirms server received the message and built the notification.
  • OK confirms the mcp.notification('notifications/claude/channel', ...) promise resolved successfully in ~1ms (no error path hit).
  • Despite that, the message never appeared as a <channel> block in the CC session.

Diff snippet of the instrumentation:

\\\ts
const debugLog = (line: string) => {
try { appendFileSync(join(homedir(), '.claude', 'channels', 'discord', 'inbound-debug.log'),
\
\${new Date().toISOString()} \${line}\n\) } catch {}
}
debugLog(\
ATTEMPT msg=\${msg.id} ...\)
mcp.notification({ method: 'notifications/claude/channel', params: { ... } })
.then(() => debugLog(\
OK msg=\${msg.id}\))
.catch(err => debugLog(\
FAIL msg=\${msg.id} err=\${err}\))
\
\\

Things ruled out

  • ❌ Stale spawn args (a full quit + relaunch of claude.exe did not fix it).
  • /mcp reconnect not re-running the experimental capability handshake (full restart should have re-done it; still broken).
  • ❌ Server-side delivery failure (mcp.notification(...) resolves, doesn't reject).
  • ❌ Access config (sender allowlisted, requireMention: false, server passes the gate).
  • ❌ Discord-side delivery (server logs every message arriving at the gateway).

Hypothesis

Either:

  1. CC 2.1.153 stopped declaring the claude/channel experimental capability during initialize (so the server's notification is accepted at the JSON-RPC transport but no handler exists for the method), or
  2. The handler exists but the path that converts notifications/claude/channel<channel> block injection regressed.

The official plugin's server.ts declares the capability correctly:

\\\ts
capabilities: {
tools: {},
experimental: {
'claude/channel': {},
'claude/channel/permission': {},
},
}
\
\\

Asks

  • Confirm whether notifications/claude/channel injection is still expected to work in 2.1.153.
  • If yes — needs a fix; happy to provide a debug build of the plugin that adds the file logging if helpful.
  • If no — please document the version it broke in and any replacement mechanism.

View original on GitHub ↗

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