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-officialv0.0.4 (user scope) - Platform: macOS (Darwin 25.2.0)
- Runtime: Bun
Steps to Reproduce
- Install the official Telegram plugin, configure bot token and allowlist
- Start a Claude Code session (only one session active)
- Send a DM to the bot from an allowlisted Telegram user
- Observe: bot reacts with 👀 (ack reaction fires), typing indicator shows — confirming
gate()passes andhandleInbound()runs mcp.notification({ method: 'notifications/claude/channel', params: { content, meta } })is called (server.ts line 925)- No
<channel source="telegram">tag appears in the conversation
What Works
- MCP server process starts and stays running (single instance confirmed)
claude/channelexperimental capability declared in server capabilities- Ack reaction (👀) fires on every inbound message — bot receives and processes it
- Outbound
replytool sends messages successfully - Tool calls (
react,reply,edit_message,download_attachment) all reachable
What Doesn't Work
notifications/claude/channelnotification 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.tsprocess running (no competinggetUpdatesconsumers) access.jsonpolicy isallowlistwith the sender's ID included- The notification method
notifications/claude/channelmatches what the server declares inexperimental: { 'claude/channel': {} }
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗