`--channels` flag missing from CLI — Telegram plugin can send but never receive
Summary
The official Telegram plugin (telegram@claude-plugins-official) documents a --channels CLI flag in its README (step 4: "Relaunch with the channel flag"):
claude --channels plugin:telegram@claude-plugins-official
This flag does not exist in Claude Code CLI v2.1.81. It is not listed in claude --help, and passing it has no visible effect. As a result, the plugin starts as a regular MCP server (tools work), but inbound channel notifications (notifications/claude/channel) are silently dropped — messages from Telegram never reach the Claude session.
Environment
- Claude Code CLI: v2.1.81 (latest on npm as of 2025-03-23)
- OS: macOS 15.4 (Darwin 25.2.0), Apple Silicon
- Plugin:
telegram@claude-plugins-officialv0.0.1, commit61c0597 - MCP SDK:
@modelcontextprotocol/sdk1.27.1 - Runtime: Bun 1.x
Steps to Reproduce
- Install the Telegram plugin:
````
/plugin install telegram@claude-plugins-official
- Configure the bot token:
````
/telegram:configure <BOT_TOKEN>
- Pair with a Telegram user (works fine via
/telegram:access pair <code>) - Launch Claude Code with the documented flag:
``sh``
claude --channels plugin:telegram@claude-plugins-official
- Send a DM to the bot from Telegram
Expected: The message appears in the Claude session as a <channel source="telegram" ...> tag.
Actual: Nothing happens. The message is consumed by the plugin's Grammy polling loop but never surfaces in the conversation.
Diagnostic Evidence
1. --channels flag does not exist
$ claude --help 2>&1 | grep -i channel
(no output)
The flag is not listed among CLI options. Compare with the plugin's README which explicitly instructs users to use it.
2. Bot token and polling work correctly
$ curl -s "https://api.telegram.org/bot<TOKEN>/getMe"
{"ok":true,"result":{"id":...,"is_bot":true,"username":"claude_remote_mac_bot",...}}
3. Plugin process runs as child of Claude CLI
$ ps -o pid,ppid,command -p <PLUGIN_PID>
PID PPID COMMAND
96225 96161 bun run --cwd ...telegram/0.0.1 --shell=bun --silent start
$ ps -o pid,command -p 96161
PID COMMAND
96161 claude
4. Outbound MCP tools work (reply, react)
mcp__plugin_telegram_telegram__reply(chat_id="...", text="Test") → "sent (id: 33)"
The MCP stdio transport between the plugin and Claude CLI is functional for tool calls.
5. Messages ARE received by the bot
Killed the plugin process temporarily to stop polling, then checked directly:
$ curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates?timeout=5"
{
"ok": true,
"result": [{
"update_id": 410351172,
"message": {
"message_id": 38,
"from": {"id": 7843540521, "first_name": "...", "username": "..."},
"chat": {"id": 7843540521, "type": "private"},
"text": "test123"
}
}]
}
Messages arrive at the Telegram API. When the plugin is running, it consumes them via long polling (getUpdates returns empty). But the MCP notification never reaches the Claude session.
6. The notification call in server.ts
The plugin calls:
mcp.notification({
method: 'notifications/claude/channel',
params: {
content: text,
meta: { chat_id, message_id, user, user_id, ts },
},
})
This notification is sent over stdio, but Claude Code CLI apparently does not process it.
7. MCP server declares channel capability
const mcp = new Server(
{ name: 'telegram', version: '1.0.0' },
{
capabilities: { tools: {}, experimental: { 'claude/channel': {} } },
...
},
)
The experimental: { 'claude/channel': {} } capability is declared but seemingly not recognized by the CLI.
Impact
- Complete blocker for using the Telegram plugin for its primary purpose (receiving messages)
- The plugin installs, configures, and pairs successfully — giving users the impression everything works
- Only outbound messages work (via the
replytool), creating a one-way channel - Users spend significant time debugging because the failure is completely silent (no error, no warning, no log entry)
Suggested Fix
Either:
- Implement the
--channelsflag in the CLI so it processesnotifications/claude/channelfrom designated MCP servers, or - Process channel notifications from all enabled plugins that declare the
experimental: { 'claude/channel': {} }capability (no flag needed), or - At minimum, emit a warning at startup when a plugin declares the channel capability but the CLI doesn't support it, so users know it won't work.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗