Telegram channel plugin: inbound notifications/claude/channel not surfaced as <channel> tags

Resolved 💬 3 comments Opened Mar 24, 2026 by maxtongwang Closed Mar 27, 2026

Summary

The official Telegram channel plugin (telegram@0.0.4) sends notifications/claude/channel MCP notifications on inbound messages, but Claude Code never renders them as <channel> tags in the conversation. Outbound tools (reply, react) work fine.

Environment

  • Claude Code: 2.1.81
  • Plugin: telegram@claude-plugins-official v0.0.4 (user scope)
  • Platform: macOS (Darwin 25.2.0)
  • Runtime: Bun

Steps to Reproduce

  1. Install the official Telegram plugin, configure bot token and allowlist
  2. Start a Claude Code session (only one session active)
  3. Send a DM to the bot from an allowlisted Telegram user
  4. Observe: bot reacts with 👀 (ack reaction fires), typing indicator shows — confirming gate() passes and handleInbound() runs
  5. mcp.notification({ method: 'notifications/claude/channel', params: { content, meta } }) is called (server.ts line 925)
  6. No <channel source="telegram"> tag appears in the conversation

What Works

  • MCP server process starts and stays running (single instance confirmed)
  • claude/channel experimental capability declared in server capabilities
  • Ack reaction (👀) fires on every inbound message — bot receives and processes it
  • Outbound reply tool sends messages successfully
  • Tool calls (react, reply, edit_message, download_attachment) all reachable

What Doesn't Work

  • notifications/claude/channel notification is sent by MCP server but never surfaces as a <channel> tag in the active conversation
  • No error visible on the server side (the .catch() on the notification doesn't fire)

Expected Behavior

Inbound Telegram messages should appear as <channel source="telegram" chat_id="..." message_id="..." user="..." ts="...">message text</channel> in the conversation, allowing the model to see and reply to them.

Notes

  • Only one Claude Code session was active during testing
  • Only one bun server.ts process running (no competing getUpdates consumers)
  • access.json policy is allowlist with the sender's ID included
  • The notification method notifications/claude/channel matches what the server declares in experimental: { 'claude/channel': {} }

View original on GitHub ↗

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