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

  1. Install Discord plugin, configure bot token in ~/.claude/channels/discord/.env
  2. Add user to allowFrom in access.json (dmPolicy: "allowlist")
  3. Start Claude Code session — plugin tools (fetch_messages, reply, react, edit_message) all work correctly
  4. DM the bot from the allowlisted Discord user
  5. Bot shows typing indicator (confirms gate() passed and sendTyping() at line 847 executed)
  6. Expected: Message appears as <channel source="discord"> tag in the session
  7. Actual: Message never appears. Bot never replies. No error output visible.

What Works

  • fetch_messages: can read channel history
  • reply: can post messages to channels and DMs
  • react: can add reactions
  • edit_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 between mcp.notification() and Claude Code's handling of notifications/claude/channel.

🤖 Generated with Claude Code

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗