Discord plugin inbound notifications silently dropped on CC 2.1.153 (Windows)
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
- Install the official discord plugin, configure access (
~/.claude/channels/discord/access.json) withrequireMention: false. - Start a CC session — discord MCP child spawns cleanly (verified
readyevent fires, gateway connects). - From an allowlisted Discord user, post a message in an allowlisted channel.
- Observe: the message never appears in the CC session as a
<channel>block. Callingfetch_messagesfrom 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
ATTEMPTconfirms server received the message and built the notification.OKconfirms themcp.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\${new Date().toISOString()} \${line}\n\
const debugLog = (line: string) => {
try { appendFileSync(join(homedir(), '.claude', 'channels', 'discord', 'inbound-debug.log'),
\) } catch {}ATTEMPT msg=\${msg.id} ...\
}
debugLog(\)OK msg=\${msg.id}\
mcp.notification({ method: 'notifications/claude/channel', params: { ... } })
.then(() => debugLog(\))FAIL msg=\${msg.id} err=\${err}\
.catch(err => debugLog(\))\
\\
Things ruled out
- ❌ Stale spawn args (a full quit + relaunch of
claude.exedid not fix it). - ❌
/mcpreconnect 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:
- CC 2.1.153 stopped declaring the
claude/channelexperimental capability duringinitialize(so the server's notification is accepted at the JSON-RPC transport but no handler exists for the method), or - 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/channelinjection 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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗