Telegram plugin: inbound notifications not routed to conversation despite correct setup
Bug description
The Telegram plugin's inbound notifications (notifications/claude/channel) are never delivered to the active conversation, even though:
- The plugin is correctly installed and registered in
installed_plugins.json installed_plugins.jsonexists before Claude Code boots (confirmed by starting a fresh session after install)- The plugin is enabled in
~/.claude/settings.json(enabledPlugins.telegram@claude-plugins-official: true) - The MCP server process is running (bun, PID verified via
ps) - The bot is actively polling Telegram API (TCP connections to 149.154.166.110 confirmed via
lsof) - Outbound tool calls work perfectly (reply, react, edit_message all succeed)
access.jsonis correctly configured withdmPolicy: "allowlist"and the sender's Telegram ID
Reproduction steps
- Install the Telegram plugin from
claude-plugins-official - Configure
~/.claude/channels/telegram/.envwith a valid bot token - Configure
~/.claude/channels/telegram/access.jsonwith an allowlisted user ID - Enable the plugin in
~/.claude/settings.json - Restart Claude Code (to ensure
installed_plugins.jsonis read at boot) - In the new session, use the
replytool to send a message to the allowlisted user — this works - Have the user reply on Telegram — the message never appears in the conversation
Diagnosis
The MCP server emits notifications correctly via mcp.notification({ method: 'notifications/claude/channel', params: { ... } }) on stdout. The stdio pipe chain is intact:
Claude Code (node) <--unix socket--> bun launcher <--inherited stdio--> bun server.ts
The bot receives the Telegram message (it sends typing indicator and ack reaction), processes it through the gate (user is allowlisted), and calls mcp.notification(). But the harness never surfaces the notification in the conversation.
Tool calls (request-response) work over the same stdio pipe, proving the MCP transport is functional. Only server-initiated notifications are lost.
Previous session debug
In a prior session, we found that installed_plugins.json was created after boot, which explained why Found 0 plugins appeared in the debug log. We did a clean reinstall and restarted. In this new session, installed_plugins.json was present at boot, but notifications still don't arrive.
Environment
- Claude Code: v2.1.80
- macOS (Darwin 25.3.0)
- bun: v1.3.11
- Plugin version: 0.0.1 (from claude-plugins-official, commit b664e15)
- grammy: v1.41.1
- @modelcontextprotocol/sdk: v1.27.1
Expected behavior
When a Telegram message passes the access gate, the notifications/claude/channel notification should appear in the active Claude Code conversation as a <channel source="telegram" ...> block.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗