MCP channel notifications (notifications/claude/channel) silently dropped — Discord plugin messages never surface
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
- Install the official Discord plugin (
discord@claude-plugins-official) - Configure access.json with a valid allowlist entry
- Start a Claude Code session (MCP server starts, bot connects to Discord Gateway)
- 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_messageall 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
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗