Telegram channel plugin: inbound notifications/claude/channel not surfaced in conversation
Bug: Telegram channel plugin inbound notifications not surfaced in conversation
Environment
- Claude Code version: 2.1.81 (latest)
- OS: macOS (Darwin 25.3.0)
- Plugin:
telegram@claude-plugins-officialv0.0.1 (commit 61c0597) - Runtime: Bun
- grammy: 1.41.1
- MCP SDK: ^1.0.0
Summary
The Telegram channel plugin's outbound path (reply tool) works correctly, but inbound messages from Telegram are never surfaced in the Claude Code conversation. The MCP server sends notifications/claude/channel notifications correctly over stdout, but Claude Code does not present them to the model.
Steps to Reproduce
- Install the telegram plugin:
claude plugin install telegram@claude-plugins-official - Configure bot token in
~/.claude/channels/telegram/.env - Pair a Telegram user (user ID added to
allowFrominaccess.json) - Start a Claude Code session — the telegram MCP server starts and polls
- Use the
replytool to send a message to the paired user — works - Have the paired user send a text message back — never appears in the conversation
Debugging Evidence
1. Bot process is running and connected to Claude Code
$ ps aux | grep telegram
bun run --cwd ~/.claude/plugins/cache/.../telegram/0.0.1 --shell=bun --silent start
Parent process confirmed as the active claude CLI process.
2. Bot receives updates and handlers fire correctly
Running server.ts standalone with a proper MCP initialize handshake piped to stdin, messages ARE received and processed:
# stderr:
telegram channel: polling as @Neo_Regu_bot
# stdout (MCP notification sent):
{"method":"notifications/claude/channel","params":{"content":"Hallo","meta":{"chat_id":"840425507","message_id":"41","user":"matthiascebula","user_id":"840425507","ts":"2026-03-22T09:33:30.000Z"}},"jsonrpc":"2.0"}
3. Gate/access control passes
access.jsonhasdmPolicy: "allowlist"with the correct user ID inallowFrom/statusbot command confirms "Paired"- Manual test of gate logic confirms
allowFrom.includes(senderId)returnstrue
4. grammy works correctly
A minimal grammy test script (same token, same handlers, no MCP) receives messages and fires bot.on('message:text') correctly. Adding MCP transport also works — the notification is sent on stdout.
5. No typing indicator visible
The user does not see a "typing..." indicator from the bot when sending messages during a normal Claude Code session, suggesting either:
- The handler is not reached (gate drops silently), OR
- Claude Code's MCP client doesn't process the notification, and something in the transport layer prevents the handler from completing
However, standalone testing proves the handler DOES fire and the notification IS sent.
6. Outbound works perfectly
The reply MCP tool sends messages successfully, confirming the MCP connection between Claude Code and the telegram server is alive.
Expected Behavior
When the telegram MCP server sends a notifications/claude/channel JSON-RPC notification over stdout, Claude Code should present it in the conversation as a <channel> message that the model can see and respond to.
Actual Behavior
The notification is sent but never surfaces. The model has no awareness that a message arrived. Only outbound (tool calls to reply) works.
Server Capability Declaration
The server announces channel support during MCP initialization:
{
"capabilities": {
"tools": {},
"experimental": { "claude/channel": {} }
}
}
Workaround
None found. The inbound path is completely non-functional.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗