Telegram plugin: inbound messages not delivered to conversation (outbound works)

Resolved 💬 6 comments Opened Apr 11, 2026 by DavidMorgade Closed May 5, 2026

Bug Description

The Telegram plugin (v0.0.5) receives inbound messages from Telegram (shows "typing" indicator) but does not inject them into the Claude Code conversation. Outbound messages via the reply tool work perfectly.

Environment

  • Claude Code: 2.1.101
  • Plugin: telegram@claude-plugins-official 0.0.5 (also tested with 0.0.4)
  • OS: WSL2 Ubuntu 24.04 / Linux 6.6.87.2-microsoft-standard-WSL2
  • Runtime: Bun (bun server.ts)

Configuration

~/.claude/channels/telegram/access.json:

{
  "dmPolicy": "pairing",
  "allowFrom": ["<my_telegram_id>"],
  "groups": {},
  "pending": {}
}
  • Bot token is valid (getMe returns OK)
  • Sender ID is in allowFrom
  • Plugin is enabled in settings.json

What works

  • mcp__plugin_telegram_telegram__reply sends messages to Telegram successfully
  • react and edit_message tools also work
  • Bot process is running and polling (getUpdates returns 409 Conflict confirming exclusive poll)
  • gate() function returns deliver for the allowed sender (verified by reading source)

What doesn't work

  • Messages sent from Telegram to the bot never appear as <channel source="telegram"> tags in the conversation
  • The bot shows "typing" indicator (line 940 in server.ts fires), confirming the message reaches handleInbound() and passes the gate
  • The MCP notification is dispatched (line 957: mcp.notification({ method: 'notifications/claude/channel', ... })) but Claude Code does not surface it

Steps to Reproduce

  1. Configure telegram plugin with valid bot token and sender ID in allowFrom
  2. Start a Claude Code session
  3. Verify plugin is running (ps aux | grep telegram)
  4. Send a message from Telegram to the bot
  5. Bot shows "typing" but no <channel> tag appears in the conversation
  6. Use the reply tool from Claude Code → message arrives in Telegram (outbound works)

Investigation Done

  • Confirmed single plugin process (no zombie/duplicate pollers)
  • Confirmed gate() returns deliver (sender is in allowFrom)
  • Confirmed bot.api.sendChatAction('typing') fires (user sees typing indicator)
  • Confirmed mcp.notification() is called at line 957 of server.ts
  • Killed and restarted plugin — same behavior
  • Tested with both plugin versions 0.0.4 and 0.0.5
  • Plugin connects via StdioServerTransport (line 630)

Expected Behavior

Messages from an allowed Telegram sender should appear in the Claude Code conversation as <channel source="telegram" chat_id="..." message_id="..." user="..." ts="...">message text</channel> tags.

View original on GitHub ↗

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