Telegram channel plugin: inbound notifications/claude/channel not surfaced in conversation

Resolved 💬 3 comments Opened Mar 22, 2026 by Matthias77-dot Closed Mar 23, 2026

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-official v0.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

  1. Install the telegram plugin: claude plugin install telegram@claude-plugins-official
  2. Configure bot token in ~/.claude/channels/telegram/.env
  3. Pair a Telegram user (user ID added to allowFrom in access.json)
  4. Start a Claude Code session — the telegram MCP server starts and polls
  5. Use the reply tool to send a message to the paired user — works
  6. 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.json has dmPolicy: "allowlist" with the correct user ID in allowFrom
  • /status bot command confirms "Paired"
  • Manual test of gate logic confirms allowFrom.includes(senderId) returns true

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.

View original on GitHub ↗

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