Telegram channel plugin: notifications/claude/channel events never reach the session

Resolved 💬 3 comments Opened Mar 24, 2026 by eddiebelaval Closed Mar 28, 2026

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

  1. Install the Telegram plugin: /plugin install telegram@claude-plugins-official
  2. Configure token: /telegram:configure <token>
  3. Launch: claude --channels plugin:telegram@claude-plugins-official
  4. Complete pairing (DM bot, get code, /telegram:access pair <code>)
  5. Switch policy to allowlist: /telegram:access policy allowlist
  6. 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 of server.ts is 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/channel before 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.

View original on GitHub ↗

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