Telegram plugin: inbound notifications not routed to conversation despite correct setup

Resolved 💬 2 comments Opened Mar 20, 2026 by fratl21 Closed Apr 17, 2026

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.json exists 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.json is correctly configured with dmPolicy: "allowlist" and the sender's Telegram ID

Reproduction steps

  1. Install the Telegram plugin from claude-plugins-official
  2. Configure ~/.claude/channels/telegram/.env with a valid bot token
  3. Configure ~/.claude/channels/telegram/access.json with an allowlisted user ID
  4. Enable the plugin in ~/.claude/settings.json
  5. Restart Claude Code (to ensure installed_plugins.json is read at boot)
  6. In the new session, use the reply tool to send a message to the allowlisted user — this works
  7. 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.

View original on GitHub ↗

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