[BUG] Telegram channel plugin: inbound notifications silently dropped (outbound works)

Resolved 💬 3 comments Opened Mar 26, 2026 by beavailableorg Closed Mar 30, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

Environment:

  • Claude Code v2.1.84
  • Windows 11 Pro 10.0.26200
  • Telegram plugin v0.0.4 (telegram@claude-plugins-official)
  • Shell: PowerShell + bash (Git Bash)
  • IDE: VS Code extension + CLI

Description:
The Telegram channel plugin successfully sends outbound messages (via the reply MCP tool + Telegram Bot API sendMessage), but inbound messages from Telegram never reach the Claude Code conversation. The bot's mcp.notification({ method: 'notifications/claude/channel', ... }) call appears to execute without error, but the notification is silently dropped by Claude Code.

Diagnostic evidence:

  • getWebhookInfo shows pending_update_count: 0 after sending a message, confirming the bot's long polling IS consuming updates
  • getWebhookInfo shows pending_update_count: 1 when the bot process is stopped, confirming Telegram IS queuing messages correctly
  • Bot sends "typing" chat action (line 908 of server.ts) before calling mcp.notification(), confirming the handleInbound() function runs and passes the gate() check
  • access.json correctly lists the sender in allowFrom with dmPolicy: "allowlist"
  • The .env file contains the correct TELEGRAM_BOT_TOKEN
  • Killed all competing bun.exe processes and verified single-instance polling — same result

Additional complication: zombie bun processes
Multiple Claude Code sessions (Cursor IDE) each spawn their own Telegram MCP server (bun.exe), causing 409 Conflict polling collisions. Even after killing all zombies and ensuring a single bot instance, inbound still fails. The zombie issue is separate but exacerbates debugging.

Workaround attempted:
Disabled plugin at project level (settings.json → enabledPlugins: { "telegram@claude-plugins-official": false }) to prevent Cursor sessions from spawning competing bots, then ran CLI from home directory. Outbound works; inbound still dropped.

Expected behavior:
Inbound Telegram messages should appear in the Claude Code conversation as <channel source="telegram" ...> blocks, as described in the plugin's MCP server instructions.

Actual behavior:
Inbound messages are consumed by the bot (typing indicator fires, pending_update_count goes to 0), mcp.notification() is called, but nothing appears in the Claude Code conversation. No error output observed.

What Should Happen?

Inbound Telegram messages should appear in the Claude Code conversation as <channel source="telegram" ...> blocks, as described in the plugin's MCP server instructions.

Error Messages/Logs

Steps to Reproduce

  1. Install Telegram plugin: /plugin install telegram@claude-plugins-official
  2. Configure bot token via /telegram:configure <token>
  3. Pair a Telegram user via /telegram:access pair <code> (allowlist policy, user ID confirmed in access.json)
  4. Start a Claude Code CLI session from home directory (cd ~ && claude)
  5. Ask Claude to send a test message to Telegram — succeeds (message delivered to Telegram chat)
  6. Send a message from Telegram to the bot — bot shows "typing" indicator for ~3 seconds, then nothing appears in the Claude Code session
  7. Prompt Claude with "Listen for incoming Telegram messages" — still no inbound delivery
  8. Submit empty prompt or hi immediately after sending Telegram message — still no inbound delivery

Claude Model

Opus

Is this a regression?

I don't know

Last Working Version

_No response_

Claude Code Version

2.1.84

Platform

Other

Operating System

Windows

Terminal/Shell

PowerShell

Additional Information

<img width="569" height="479" alt="Image" src="https://github.com/user-attachments/assets/8a90352c-f1e7-4648-a90d-fdc0f597f5e8" />

View original on GitHub ↗

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