MCP channel notifications (notifications/claude/channel) silently dropped — Discord plugin messages never surface

Resolved 💬 3 comments Opened Apr 11, 2026 by aeronan Closed Apr 15, 2026

Bug Description

MCP notifications/claude/channel sent by the official Discord plugin are silently dropped by Claude Code. The notification JSON is successfully written to the stdio transport (promise resolves), but Claude Code never surfaces it in the conversation.

This means Discord → Claude Code real-time messaging is completely broken. Tool calls (fetch_messages, reply) work perfectly — only the notification path is affected.

Environment

  • Claude Code version: 2.1.101 (latest as of 2025-04-11)
  • Discord plugin version: 0.0.4
  • MCP SDK version: 1.27.1 (@modelcontextprotocol/sdk)
  • OS: macOS (Darwin 25.3.0)
  • Node runtime: Bun

Reproduction Steps

  1. Install the official Discord plugin (discord@claude-plugins-official)
  2. Configure access.json with a valid allowlist entry
  3. Start a Claude Code session (MCP server starts, bot connects to Discord Gateway)
  4. Send a message from Discord to the bot

Expected: Message appears as <channel source="discord" ...> notification in Claude Code conversation
Actual: Nothing. No notification received. Complete silence.

Debugging Evidence

Every component was verified working individually:

| Component | Status | Evidence |
|-----------|--------|----------|
| Discord Gateway connection | ✅ | TCP connections to 162.159.x.x confirmed via lsof |
| messageCreate event | ✅ | ackReaction (👀) appears on Discord messages |
| gate() access check | ✅ | User ID matches allowFrom in access.json |
| mcp.notification() call | ✅ | Debug log confirms promise resolved with SUCCESS |
| Claude Code receives notification | ❌ | Never surfaces in conversation |

Debug log output

Added file-write debugging around the notification call:

2026-04-11T14:27:31.223Z SENDING: {"method":"notifications/claude/channel","params":{"content":"有嗎?","meta":{"chat_id":"1485133889038057493","message_id":"1492531548581531759","user":"aeron_an","user_id":"820109423686320169","ts":"2026-04-11T14:27:31.077Z"}}}
2026-04-11T14:27:31.223Z SUCCESS

The MCP SDK's notification() promise resolves (JSON written to stdout pipe), but Claude Code does not act on it.

Server capability declaration

The Discord MCP server correctly declares channel support:

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

Key Observation

  • Tool calls (request/response pattern) over the same stdio transport work perfectly — fetch_messages, reply, react, edit_message all function correctly.
  • Notifications (fire-and-forget, server→client) over the same stdio transport are silently dropped.
  • This has been tested across multiple session restarts. The issue is persistent.

Workaround

Currently using CronCreate to poll fetch_messages every minute, which wastes tokens and adds up to 60s latency.

🤖 Generated with Claude Code

View original on GitHub ↗

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