Telegram channel stops processing inbound messages after completing a turn
Bug Description
When running Claude Code with the Telegram channel (--channels plugin:telegram@claude-plugins-official), the session stops processing new inbound Telegram messages after completing a response turn. Claude returns to the > prompt and sits idle — new messages from Telegram are received by the MCP server but do not trigger a new conversation turn.
The user has to manually type something in the terminal (e.g., press Enter or type a message) to "wake up" the session and get it to process queued Telegram messages.
Steps to Reproduce
- Launch Claude Code with Telegram channel:
``sh``
claude --channels plugin:telegram@claude-plugins-official --dangerously-skip-permissions
- Send a message to the bot in Telegram — Claude responds correctly
- After Claude finishes responding, it returns to the
>prompt - Send another message in Telegram
- Expected: Claude processes the new message and responds
- Actual: Claude sits idle at
>prompt. The message is not processed until the user interacts with the terminal
Environment
- Claude Code v2.1.81
- Model: Opus 4.6 (1M context)
- macOS (Darwin 25.3.0)
- Telegram plugin v0.0.4 (
claude-plugins-official) - Permissions: bypass on (
--dangerously-skip-permissions)
Screenshots
Terminal shows Claude completed a reply ("sent (id: 333)"), returned to idle > prompt, and does not react to subsequent Telegram messages (including a forwarded PDF + text messages).
Notes
- This is not a permissions issue —
bypass permissions onis active - The MCP server appears to stay connected (no errors in terminal)
- Messages with attachments (forwarded PDFs) seem especially likely to be missed, but plain text messages are also affected
- The issue is intermittent but frequent enough to make the Telegram channel unreliable for async use
🤖 Generated with Claude Code
12 Comments
This is blocking production usage for us. After every turn completes,
the session stops processing new Telegram messages entirely until
manual terminal input is given. The only workaround is /mcp reconnect
or pressing Enter — neither is acceptable for an always-on bot setup.
Please prioritize this fix. The root cause has already been analyzed
in #36477 by @salty-flower. This needs to be addressed in the main
REPL loop to process channel notifications even when idle between turns.
This is related to the channels bug in #36477 — the Discord channels plugin stops processing after the first response in v2.1.85.
We built a custom MCP server that replaces the broken channels plugin entirely. It connects directly to the Discord gateway via discord.js (event-driven, no polling) and pushes messages to Claude Code through the standard MCP notification protocol.
We've been running it in production across 13 AI agents on Discord. Full architecture breakdown and a downloadable template here:
https://www.MetroPointTechnology.com/claude-discord-fix
I am experiencing similar issues. Telegram is unreliable, and I have to message claude 3-5 times and each time pray that it will respond on Telegram
Same experience here on Telegram (Claude Code v2.1.87, macOS). Outbound messages work, inbound completely dead.
This is the same root cause as #36477, where @salty-flower identified 4 core bugs: channel name mismatch, stale MCP connection handlers, no auto-reconnect, and duplicate client instances. The fact that both Telegram and Discord are affected confirms this is a platform-level issue in how Claude Code handles channel notifications — not plugin-specific.
10+ open issues, same symptoms, zero Anthropic response so far. Would love to see this acknowledged.
Same experience here on Mac Tahoe 26.2, Claude Code v2.1.91.
Why is Claude advertising that they shipped this feature when it is clearly not working AT ALL?
Workaround: use
--dangerously-load-development-channels server:<name>instead of--channels plugin:<name>@<marketplace>We've confirmed that the
--channels plugin:telegram@claude-plugins-officialpath does not deliver inboundnotifications/claude/channelto the session, while a bare.mcp.jsonserver entry with--dangerously-load-development-channelsworks end-to-end on the same machine, same token, same Claude Code version (2.1.92).Steps
.mcp.json(or~/.claude.jsonfor global):(Adjust the version path to match your cached plugin version.)
--channels:<channel source="telegram" ...>tag and Claude responds via thereplytool.Why this works
The
--dangerously-load-development-channels server:<name>flag activates channel routing for a bare MCP server entry (keyed by the name in.mcp.json). It bypasses the plugin resolution + allowlist path that--channels plugin:<name>@<marketplace>uses. The MCP server itself is identical — same binary, same capability negotiation — but the CLI-side activation path is different and apparently not affected by the bug.Environment
This also works for Discord and custom channel servers — any plugin that advertises
experimental.claude/channelcan be registered as a bare.mcp.jsonentry and activated with--dangerously-load-development-channels server:<name>.Update: We've published a full Rust drop-in replacement for the official Bun-based Telegram plugin: hdcd-telegram (v0.1.0).
access.jsonand.env— zero migrationWorks with the
--dangerously-load-development-channels server:telegramworkaround described above. Pre-built binaries for Linux, macOS (Intel + Apple Silicon), and Windows available on the releases page.I confirm that the @maciek-hyperdev solution worked for me
Still reproducing on Claude Code 2.1.109 + telegram plugin 0.0.6 (commit
79caa0d), macOS Darwin 25.4 (Apple Silicon). Inbound went silent again today after one completed turn — same pattern as the original report. Not fixed in 0.0.6.Setup:
clauderunning inside a detachedtmuxsession, started/restarted by a LaunchAgent watchdog every 5 min. (Note: the--channels plugin:<name>@<marketplace>flag was removed in 2.1.105 — the plugin now auto-loads fromenabledPluginsinsettings.json.)Repro:
sendMessage).Workarounds we run (all needed together; none is sufficient alone):
Escape+Enterto the tmux pane if no screen change. Unsticks ~80% of cases without a full restart."enabledPlugins": { "telegram@claude-plugins-official": false }in~/.claude/settings.jsonand override totruein the channel project's.claude/settings.local.json. Prevents every other CC instance on the machine from spawning a competinggetUpdatesconsumer that drain-steals messages.--continue: if the session is idle >10 min with no screen change, kill+restart and resume context.Local gotcha worth flagging (not an upstream bug, but it broke us for weeks): tmux constructs its socket as
$TMUX_TMPDIR/tmux-$UID/default. If your watchdog setsTMUX_TMPDIR=/private/tmp/tmux-501, it ends up looking at/private/tmp/tmux-501/tmux-501/default— which never exists, so the watchdog believes the session is dead and crash-loops it every 2 min. Correct value isTMUX_TMPDIR=/private/tmp.Second local gotcha: a stale Homebrew
claudesymlink pinned at v1.0.6 on/opt/homebrew/bin/claudewill be silently preferred over an nvm-installed 2.1.x by a LaunchAgent that doesn't inherit nvm's PATH. v1.0.6 exits immediately with "needs update" → tmux tears down the pane → watchdog crash-loops. Pin an absoluteCLAUDE_BINpath in the watchdog.Confirming @maciek-hyperdev's finding: the bug is specifically in the plugin-channel activation path (was
--channels plugin:..., now the auto-load path). A plain.mcp.json+--dangerously-load-development-channels server:telegramdoes not exhibit the silent-inbound failure. So the plugin code itself is fine — it's the CLI-side activation/notification routing that drops inboundnotifications/claude/channelbetween turns.Would really appreciate any acknowledgement that this is being looked at — a month with no Anthropic response across #38259, #38098, and #36477, all describing the same root issue.
Follow-up: switched to @maciek-hyperdev's
hdcd-telegramv0.1.2 drop-in with--dangerously-load-development-channels server:telegramon Claude Code 2.1.110, macOS arm64. Channel is responsive again — inbound messages land reliably, outboundreplyworks, no 409 Conflict / zombie process issues. Retiring the bun plugin entirely (enabledPlugins: falseglobally). Confirming the workaround fix.One gotcha for anyone copying this: the
--dangerously-load-development-channelsconfirm prompt shows on every launch (not sticky), so any tmux/LaunchAgent restart script has to auto-ack it — grep for"development channels"case-insensitive and sendEnter.Closing for now — inactive for too long. Please open a new issue if this is still relevant.
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.