Discord plugin: inbound DM notifications not delivered to active session
Resolved 💬 3 comments Opened Apr 3, 2026 by ajwjpg Closed Apr 6, 2026
Bug
The Discord channel plugin (discord@claude-plugins-official v0.0.4) successfully receives DMs (typing indicator fires, gate() passes for allowlisted users), but the mcp.notification({ method: 'notifications/claude/channel', ... }) call at server.ts:868 never surfaces in the active Claude Code session as a <channel source="discord"> tag.
Steps to Reproduce
- Install Discord plugin, configure bot token in
~/.claude/channels/discord/.env - Add user to
allowFrominaccess.json(dmPolicy: "allowlist") - Start Claude Code session — plugin tools (
fetch_messages,reply,react,edit_message) all work correctly - DM the bot from the allowlisted Discord user
- Bot shows typing indicator (confirms
gate()passed andsendTyping()at line 847 executed) - Expected: Message appears as
<channel source="discord">tag in the session - Actual: Message never appears. Bot never replies. No error output visible.
What Works
fetch_messages: can read channel historyreply: can post messages to channels and DMsreact: can add reactionsedit_message: can edit bot messages
All MCP tool-based interactions work. Only the inbound notification push path (notifications/claude/channel) is broken.
What Doesn't Work
- DMs to the bot show typing but never produce a response
- No
<channel source="discord">tags appear in the conversation - The
mcp.notification()call at server.ts:868 either fails silently or Claude Code doesn't process the notification
Environment
- Windows 10 Pro 10.0.19045
- Claude Code CLI (desktop app)
- Discord plugin v0.0.4 (bun runtime)
- bun v1.x
Additional Context
- Previously worked for this user — broke without config changes
- Found duplicate plugin server processes running (two bun instances of server.ts). Killed the stale one but issue persists with single instance.
- The
handleInbound()function at server.ts:807 executes successfully through the typing indicator, confirming the message reaches the bot and passes access control. The disconnect is betweenmcp.notification()and Claude Code's handling ofnotifications/claude/channel.
🤖 Generated with Claude Code
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗