Telegram channel plugin: notifications/claude/channel events never reach the session
Description
The Telegram channel plugin's MCP server starts, authenticates, polls Telegram, and fires notifications/claude/channel JSON-RPC events correctly, but the Claude Code session never receives or displays them. Messages are silently dropped.
Steps to Reproduce
- Install the Telegram plugin:
/plugin install telegram@claude-plugins-official - Configure token:
/telegram:configure <token> - Launch:
claude --channels plugin:telegram@claude-plugins-official - Complete pairing (DM bot, get code,
/telegram:access pair <code>) - Switch policy to allowlist:
/telegram:access policy allowlist - Send any DM to the bot from Telegram
Expected: Message appears in Claude Code session as a <channel source="telegram"> block.
Actual: Nothing happens. No output, no error, no indication a message was received.
Evidence
Running the MCP server standalone confirms it receives messages and fires notifications correctly:
$ cd ~/.claude/plugins/cache/claude-plugins-official/telegram/0.0.1
$ TELEGRAM_BOT_TOKEN=<token> bun server.ts
telegram channel: polling as @claude_id8_bot
{"method":"notifications/claude/channel","params":{"content":"test","meta":{"chat_id":"...","message_id":"19","user":"eddiebe147","user_id":"...","ts":"2026-03-24T14:59:25.000Z"}},"jsonrpc":"2.0"}
The gate() function correctly returns { action: 'deliver' } for allowlisted users. The notification is fired via mcp.notification() at line 578 of server.ts. But the Claude Code session does not consume the event.
Verified Configuration
| Component | Status |
|-----------|--------|
| Plugin installed | Yes (telegram@claude-plugins-official in enabledPlugins) |
| Bot token | Valid (getMe returns bot info) |
| access.json | dmPolicy: "allowlist", user ID in allowFrom |
| Bun | Installed |
| Claude Code version | 2.1.81 |
| macOS | 26.2.0, ARM64 |
| Single session | Confirmed (killed all duplicates, verified with ps aux) |
| No webhook conflict | getWebhookInfo returns empty URL |
| No competing bot consumers | Other bots (HYDRA) use different tokens |
Additional Notes
- The
mcp.notification()call on line 578 ofserver.tsis fire-and-forget (void). There is no retry, delivery confirmation, or message queue. If the session is not ready to receive at the exact moment, the message is lost permanently. - This may be a race condition where the stdio transport isn't set up to handle
notifications/claude/channelbefore messages arrive. - Possibly related to #36431 and #36802.
Workaround
Built a standalone bot using grammy + Anthropic SDK directly, bypassing Claude Code Channels entirely. Works perfectly but loses project context and tool access.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗