--channels plugin shows 'Channels are not currently available' but inbound notifications are ignored
Description
When running claude --channels plugin:telegram@claude-plugins-official, Claude Code displays "Channels are not currently available" at startup. Despite this message, the plugin runs correctly and polls Telegram successfully. However, inbound messages never trigger a Claude response.
Environment
- Claude Code version: 2.1.80
- OS: macOS 23.6.0 (Darwin)
- Plugin:
telegram@claude-plugins-officialv0.0.1
Steps to Reproduce
- Configure Telegram plugin:
~/.claude/channels/telegram/.envwithTELEGRAM_BOT_TOKEN=... - Run:
claude --channels plugin:telegram@claude-plugins-official --debug - Claude Code shows: "Channels are not currently available"
- DM the Telegram bot — Claude never replies
Evidence
The plugin IS polling and IS sending correct notifications/claude/channel notifications over stdio to Claude Code. Captured output after sending two messages:
telegram channel: polling as @maiclaude_bot
{"method":"notifications/claude/channel","params":{"content":"?","meta":{"chat_id":"2075759633","message_id":"17","user":"2075759633","user_id":"2075759633","ts":"2026-03-20T06:28:01.000Z"}},"jsonrpc":"2.0"}
{"method":"notifications/claude/channel","params":{"content":"?","meta":{"chat_id":"2075759633","message_id":"18","user":"2075759633","user_id":"2075759633","ts":"2026-03-20T06:28:17.000Z"}},"jsonrpc":"2.0"}
Claude Code receives these notifications but does not route them into the conversation or generate any response.
What Works
- MCP tools (reply, react, edit_message) function correctly — Claude can send messages TO Telegram
- Bot polling works (confirmed by 409 Conflict when a second instance is started)
- The
notifications/claude/channelJSON is well-formed and arrives over stdio
What Doesn't Work
- Claude Code does not act on received
notifications/claude/channelnotifications - No response is generated
- "Channels are not currently available" shown despite channel being active
Analysis
The plugin declares experimental: { 'claude/channel': {} } capability during MCP handshake. The notifications are correctly formatted and delivered over stdio. Claude Code appears to receive them but does not route them into the active conversation to trigger a response.
46 Comments
Root cause is the same as #36460 — server-side feature flag gates channel registration.
Your debug output confirms the plugin side is working perfectly. The
notifications/claude/channelJSON-RPC is well-formed and delivered over stdio. The problem is on Claude Code's side.The channel registration function (
JK9in the v2.1.80 binary) runs 7 eligibility gates before it will register a channel handler for any MCP server. Gate 2 checks a GrowthBook feature flag calledtengu_harbor:When this returns
false, JK9 returns{action: "skip", kind: "disabled", reason: "channels feature is not currently available"}— which is the exact message you're seeing. The notification arrives but there's no registered handler to route it into the conversation.Verify yourself:
Full 7-gate breakdown in my comment on #36460: https://github.com/anthropics/claude-code/issues/36460#issuecomment-4095918939
This is a server-side rollout flag — no local fix exists. Anthropic controls when it's enabled per account.
Since this is a server-side rollout flag, is there any way to opt in for early access? I'd love to test this feature — my setup is already working correctly on the plugin side, just waiting on the flag to be enabled. Happy to provide any additional debug info if helpful.
Same issue here. macOS Darwin 25.3.0, Claude Code 2.1.80,
telegram@claude-plugins-officialv0.0.1.On startup:
--channels ignored (plugin:telegram@claude-plugins-official)Outbound tools (reply, react, edit) work fine. Inbound notifications never surface in the conversation. Plugin side confirmed healthy — single process, active polling, valid token.
One detail that may help: inbound worked perfectly during my first session (2026-03-19 evening), then broke on every subsequent session. Suggests the feature gate may evaluate differently on initial plugin install vs. subsequent startups.
Possibly related: #36431, #36472
I saw same behavior as @dvaladares -- worked on the first session. Did not work after there. All logging indicates everything went fine but nothing appears in terminal. I think there's a genuine bug.
Same issue here.
What I tried (none worked):
DISABLE_TELEMETRYfrom settings.jsonCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICfrom settings.jsonDISABLE_ERROR_REPORTINGandDISABLE_AUTOUPDATERas wellenvoutput — no blocking vars in the environmentResult: Still getting
--channels ignored (plugin:telegram@claude-plugins-official)andChannels are not currently availableon every startup. Outbound MCP tools (reply, react, edit_message) work fine. Plugin polling is healthy. Thetengu_harborfeature gate is the blocker.Would appreciate being opted in for the flag. Happy to provide debug logs.
Codex fixed it for me. FYI.
Claude Code 2.1.80 Telegram dev-channel allowlist bug needs live CLI patching
plugin:telegram@claude-plugins-official · not on the approved channels allowlistChannel notifications skipped: plugin telegram@claude-plugins-official is not on the approved channels allowlist--channels plugin:telegram@claude-plugins-official--dangerously-load-development-channels plugin:telegram@claude-plugins-official2.1.80on hosts in this repo when using the official Telegram channel plugin as a development channel.--dangerously-load-development-channels, but the parsed list is not applied to the runtime channel state used by the later allowlist check.plugin:telegram:telegram: if you seeSuccessfully connectedfollowed byChannel notifications skipped, the plugin and token path are fine and the bug is in channel gating.cli.jsfor--dangerously-load-development-channels,allowedChannels,getChannelAllowlist, andtengu_harbor_ledger.dangerouslyLoadDevelopmentChannelswrites anything back into the runtime channel list before the laterChannel notifications skippedcheck runs.allowedChannelswithdev = true;cli.js.Confirming this bug still exists in Claude Code 2.1.81 (installed via Homebrew on macOS).
Setup:
telegram@claude-plugins-officialv0.0.1--dangerously-load-development-channels plugin:telegram@claude-plugins-official~/.local/bin/bunWhat works:
mcp__plugin_telegram_telegram__reply)What doesn't work:
Debug log shows:
The plugin is functioning correctly on the MCP side, but Claude Code is not routing the
notifications/claude/channelnotifications into the active conversation.Since Claude Code is installed as a compiled binary (not patchable JS), the workaround from the previous comment cannot be applied.
Please fix the
--dangerously-load-development-channelsflag so it properly updates the runtime channel allowlist.Install from
npmand you can format Claude Code "binary" (minified JS). Then ask Codex to work on CC.+1 — Experiencing the same issue. Bot receives messages and sends typing indicator, but the
<channel>tag never surfaces in the Claude Code session. Running in CLI mode withclaude --dangerously-skip-permissions plugin:telegram@claude-plugins-official. The feature flag gating explanation matches what I'm seeing.+1 — Experiencing the same. Filed #37184.
tengu_harborflag appears to be the gate.Session: Morpheus (ae19) | Task: 6gChXr7Cp3fPP5RG
Confirmed reproducible on my end as well.
Environment:
Exact same behavior: plugin polls Telegram successfully, notifications/claude/channel notifications arrive over stdio, but Claude Code does not route them into the conversation or generate any response. The "Channels are not currently available" message is also shown at startup.
Reproduces consistently. Hope this helps with prioritization.
Subscribing — we're hitting the same issue with the Discord plugin. Using a 60-second polling loop as a workaround. Looking forward to the fix.
Hi all!
I created a plugin to work around the Claude-Telegram issue (didn't create a solution for Discord yet).
https://github.com/StavPartouche/claude-channels-workaround
Just install the plugin, run
/telegram-bridge:setup, follow the steps, and you should be good to go!I found that this issue occurs when telemetry is disabled in my Claude Code settings (
DISABLE_TELEMETRY). IfDISABLE_TELEMETRYis removed, it returns to normal. I hope this helps everyone.This works for me 👍🏻 ! btw, you need to uninstall the perivous offical plugin to complete the setup.
Just running /reload-plugins fixed it for me since I had already set things up and paired my Telegram bot
The "Channels are not currently available" message combined with working polling but no response processing suggests the channel listener isn't connected to the conversation pipeline.
Workaround 1 — Use Remote Control instead of channels:
Remote Control provides a web/mobile interface for sending messages to Claude. Combined with a simple Telegram bot that forwards messages to the RC endpoint, you can achieve similar functionality.
Workaround 2 — Use pipe mode with a polling script:
This creates a simple bridge without depending on the channels plugin.
Workaround 3 — Check version compatibility:
Channels is a relatively new feature. Ensure you're on the latest version where it may be more stable.
Workaround 4 — File-based message passing:
Set up a watched file that the Telegram bot writes to, and a UserPromptSubmit hook that reads from it:
This is crude but avoids the channels infrastructure entirely.
While this issue is active for Telegram; if anyone is interested trying async task manager with always on Claude code agents using Claude channels, feel free to give it a try to
AgentRQ. Looking forward to getting some feedback and improving together.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.Thanks for posting. I followed your instructions and it didn't work:
@maciek-hyperdev I've tried with the official plugin and with yours, and I get the same issue with both:
notifications/claude/channel./startor/helpor/statusI do get a response back from the plugin.How can I troubleshoot this further?
Do you think that relates to https://github.com/anthropics/claude-code/issues/41275?
What Claude subscription do you use? I have maxx. Didn't test on any other.
Same, Max 20x, and the official Telegram channel worked for me yesterday, I don't think it's a server-side feature flag thing.
@clone45 Thanks for trying the workaround! The
ignored (server:telegram)message suggests Claude Code isn't picking up the MCP server entry before evaluating the--dangerously-load-development-channelsflag.Could you share a few details so we can help debug?
claude --version.mcp.jsonconfig (redact any tokens) — specifically where the file lives (project root vs~/.claude.json) and the exact server entryCommon gotchas we've seen:
.mcp.jsonmust exactly match the name afterserver:in the flag (e.g."telegram"→server:telegram).mcp.jsonmust be in the project directory you launchclaudefrom, or in~/.claude.jsonfor globalAlso — we've since published hdcd-telegram v0.1.1, a Rust drop-in replacement that's simpler to configure (single binary, no Bun dependency). Might be worth a try if you're still stuck with the Bun-based plugin setup.
@ricardbejarano Thanks for the detailed report — and for trying hdcd-telegram!
The symptoms you describe ("typing" indicator fires but no reply,
notifications/claude/channelvisible in plugin logs but Claude Code doesn't surface it) point to Claude Code receiving the notification but not routing it into the conversation. This is the same core issue as the original bug, but interesting that it worked for you yesterday.To help us narrow it down, could you share:
claude --version.mcp.jsonare you using? (project-level or~/.claude.json?) — redacted config would help--dangerously-load-development-channels ignoredor does it show the channel as active?Re: #41275 — it could be related if the channel registration path changed in a recent update. Knowing your exact version will help us cross-reference.
Also, we're about to release hdcd-telegram v0.1.1 with improved diagnostics and connection logging that should make this kind of issue easier to trace. Worth trying once it's out.
@clone45 @ricardbejarano — We've just updated the hdcd-telegram README with clearer setup instructions. A few things that may help:
How the bot token is discovered:
hdcd-telegramautomatically readsTELEGRAM_BOT_TOKENfrom~/.claude/channels/telegram/.envon startup — the same file the official Telegram plugin uses. You do NOT pass the token in.mcp.json. If the file doesn't exist or the token is missing, the binary will fail at startup with a clear error.Minimal working setup (3 files):
~/.claude/channels/telegram/.env:``
``TELEGRAM_BOT_TOKEN=123456789:AAHxxx...
.mcp.jsonin your project (or~/.claude.jsonfor global):``
json
`{
"mcpServers": {
"telegram": {
"command": "/path/to/hdcd-telegram",
"args": []
}
}
}
"telegram"The server name **must** be
to matchserver:telegram` in the launch flag.``
bash
``claude --dangerously-load-development-channels server:telegram
Common issues we've seen:
.mcp.jsonin the wrong directory (must be in the directory you runclaudefrom, or use~/.claude.jsonfor global)"command"is wrong or not executable (chmod +x)pkill -f hdcd-telegramfirst/setprivacy→ Disable) before adding the bot to the groupFull updated docs: https://github.com/gohyperdev/hdcd-telegram#quick-start
@maciek-hyperdev here's what I got as of right now:
---
On one hand, I have:
--dangerously-skip-permissions--channelsflag (successfully connected as per/mcpoutput and the fact that it doesn't show any error like it does when the plugin is not working)This works just fine.
---
On the other hand, I have:
--append-system-prompt '...' --permission-mode bypassPermissions--channelsand--dangerously-load-development-channels--dangerously-load-development-channels)This doesn't work.
---
Both scenarios use the same account, they're both logged in in the same way (OAuth browser "paste this token" flow).
In the non-working scenario, both the official Telegram plugin as well as yours successfully connect to Telegram. I know this because I can
/setupor text them and the plugin responds with the usual responses. Both, however, fail to notify Claude Code. Even when copying the sameaccess.jsonfrom the working scenario to skip having to pair again, the message arrives at the plugin (which is why it starts "typing") but it never shows up in the Claude Code session like it does on the working scenario. Eventually, both plugins stop "typing" and I get no response.I've tried turning off the working scenario before starting the latter, to see if maybe the channels feature flag is limited to one session. It didn't fix it.
I've also carried the same
~/.claude.jsonfile from the working one to the broken one, to no success either.So yeah, I'm not done trying to get things more "apples to apples" to figure out what's going on, but any help or pointers would be greatly appreciated.
@ricardbejarano Thanks for the thorough comparison — this is really valuable data!
The key difference between your two setups is clear:
| | Working | Not working |
|---|---|---|
| Claude Code | 2.1.84 | 2.1.96 |
| Platform | macOS VM (UTM) | Docker (OrbStack) |
| Channel flag |
--channels|--channelsand--dangerously-load-development-channels|Two things stand out:
1. Version difference (2.1.84 vs 2.1.96)
The fact that 2.1.84 works with
--channelsbut 2.1.96 doesn't suggests a regression in a recent Claude Code update. This is important — could you try downgrading the Docker instance to 2.1.84 to confirm?If 2.1.84 works in Docker too, that confirms a regression and would be worth filing as a separate issue with both versions.
2. Docker/OrbStack environment
Docker containers sometimes behave differently with stdio-based MCP servers. A few things to check:
hdcd-telegrambinary running inside the container or on the host? (It needs outbound HTTPS toapi.telegram.org)~/.claude/channels/telegram/.envandaccess.jsonfiles mounted/accessible inside the container?claude config getshould show the same account)Suggested next step
The version difference is the strongest lead. If you can test 2.1.84 in Docker and it works, we know it's a regression between .84 and .96. That would give Anthropic a clear window to bisect.
I find this in https://www.lowcode.agency/blog/claude-code-channels-setup-telegram-discord
@maciek-hyperdev all this troubleshooting for nothing. I was carrying auth wrong. Once I logged in it worked.
Status clarification for everyone following this issue
After extensive testing and community research (credit to @soumikbhatta's analysis in #36460), here's where things stand:
This is not a bug — it's an intentional feature gate. Claude Code's channel functionality is controlled by a server-side feature flag (
tengu_harborin GrowthBook). When this flag is disabled for your account, all inbound channel notifications are silently dropped — regardless of which plugin you use, which marketplace it comes from, or which CLI flags you pass.What works and what doesn't:
| Path | Inbound messages | Outbound tools (reply, react) |
|---|---|---|
|
--channels plugin:telegram@claude-plugins-official| Blocked by feature flag | Works ||
--channels plugin:*@any-marketplace| Blocked by feature flag | Works ||
--dangerously-load-development-channels server:<name>| Works (bypasses the flag) | Works |The workaround (
--dangerously-load-development-channels server:<name>with a manual.mcp.jsonentry) still works reliably because it follows a different code path that doesn't check the feature flag. See our earlier comment for setup instructions.What this means for plugin authors and users:
We'll continue maintaining the workaround instructions and helping users in this thread. If Anthropic has a timeline or opt-in process for broader channels rollout, that would be very helpful information for the community.
@ricardbejarano Glad you got it working! Thanks for reporting back — this is a crucial finding.
@oashua Great catch on the auth requirement — that's documented but easy to miss.
Key takeaway for everyone: Channels require claude.ai OAuth login
This is worth highlighting because it's been a hidden blocker for multiple users in this thread:
If you're running Claude Code in Docker, CI, or any headless environment, make sure you're authenticated via the OAuth flow (
claude login), not viaANTHROPIC_API_KEY.Quick check:
Should return
oauth(notapiKey).This likely explains several "it was working, then it stopped" reports — if a session switches auth methods (e.g., Docker container with API key vs local with OAuth), channels break silently.
Adding this to the hdcd-telegram README now.
Windows datapoint: workaround does not bypass feature flag
Environment:
What works:
/mcpshowstelegram · ✔ connected)What doesn't work:
--dangerously-load-development-channels server:telegram— no error shown, but inbound notifications never reach the conversationKey observation: The bot shows "typing..." in Telegram (confirming the MCP server receives the message), but Claude Code silently drops the
notifications/claude/channelnotification. This matches the feature flag behavior, not a config issue.It appears the
--dangerously-load-development-channels server:<name>workaround confirmed on macOS does not bypass thetengu_harborfeature flag on Windows.@Kullendorff Thanks for the detailed Windows datapoint — this is new and important information.
Your observation suggests the
--dangerously-load-development-channelsworkaround may not work on Windows even though it works reliably on macOS. This is a significant platform difference worth tracking.A few things to verify:
``
bash
`claude config get authMethod
oauth`. Even with Max plan, if the session falls back to API key auth, channels silently fail (confirmed by multiple users).Should return
.mcp.jsonexactly"telegram"matchingserver:telegramin the flag?If all of the above check out, this could be a Windows-specific issue in how Claude Code handles the
--dangerously-load-development-channelsflag — possibly related to stdio buffering differences on Windows. That would be worth filing as a separate issue.For reference, @Xch13 got hdcd-telegram working on Windows (v2.1.92) after fixing OAuth auth — so the channel substrate does work on Windows under the right conditions.
@maciek-hyperdev Confirmed — auth is
claudeAiOauth(Max plan, 5x rate-limit tier). OAuth is active and valid in this session:So auth is definitively not the blocker here. This appears to be a genuine Windows-specific issue where
--dangerously-load-development-channelsdoes not bypass thetengu_harborfeature flag, even with valid OAuth on a Max plan.Happy to run any additional diagnostics if it helps narrow down the Windows code path.
@Kullendorff Thanks for confirming the auth — this rules out the most common blocker.
With OAuth confirmed working on Max plan, this looks like a genuine Windows-specific issue where
--dangerously-load-development-channelsdoesn't bypass the feature flag. On macOS the same flag reliably enables channel routing (confirmed by multiple users on 2.1.92-2.1.96).This is worth filing as a separate issue — something like:
The Windows stdio handling differs from macOS/Linux (line ending conversion, buffering behavior), which could affect how the JSON-RPC notifications are delivered over the MCP subprocess pipe.
If you file it, link it here and we'll add our cross-platform observations. This would give Anthropic a clear, actionable bug report separate from the broader feature-flag discussion.
@maciek-hyperdev Filed the separate Windows issue as suggested:
#46125 — [Windows]
--dangerously-load-development-channelsdoes not enable inbound channel notificationsIncludes full repro steps, environment details, everything tested, and the cross-platform comparison. Linked back here and to #36460 and #36964.
--channels ignored (plugin:telegram@claude-plugins-official)
--dangerously-load-development-channels ignored (server:telegram)
issue still exists
Linux datapoint + binary analysis of the gate ordering
Environment:
Channels were working 2026-04-09, broke 2026-04-10 — no config changes, just the feature flag flipping.
--dangerously-load-development-channelscannot bypasstengu_harborI extracted and decompiled the channel registration gate function (
Y4$) from the v2.1.100 binary. Here's the check order:The
tengu_harborGrowthBook check at step 2 runs before thef.devflag at step 6. The function returns early with{action:"skip", kind:"disabled", reason:"channels feature is not currently available"}before it ever evaluates whether--dangerously-load-development-channelswas passed.This means the
--dangerously-load-development-channelsworkaround reported earlier in this thread can only bypass the allowlist check (step 6) — it cannot bypasstengu_harbor(step 2). Users who reported success with this flag likely hadtengu_harborenabled for their accounts at the time.Relevant decompiled snippet
Workaround
Using
telegram-bridge@claude-channels-workaroundby @StavPartouche — bypasses the channel system entirely by polling Telegram's Bot API and piping toclaude --print. Works but loses session persistence.Would really appreciate any timeline on when
tengu_harborwill be re-enabled for Max plan users.Hey — just checking in on this since the thread's been quiet for about a week. Is there any update on the tengu_harbor flag for Max plan accounts? Channels have been unavailable for 9+ days now and it's blocking a few workflows I've built around them.
Totally understand if there's a reason it's been rolled back — even a quick note on status or rough timeline would be really helpful for planning around it.
Thanks!
Summary
Claude Code is ignoring the documented
--channelsflag for the official Telegram plugin and reports that Channels are not currently available, even though I am logged in with aclaude.aiPro account.## Environment
claude.aifirstPartyprotelegram@claude-plugins-official## Command
```bash
claude --channels plugin:telegram@claude-plugins-official
--channels ignored (plugin:telegram@claude-plugins-official)
Channels are not currently available
Built a working workaround for this — file queue + bash watcher + tmux, zero token cost at idle, generalizes to any MCP channel plugin (Discord, Slack, webhooks). Generic pattern with pseudocode:
→ https://github.com/LozzKappa/claude-code-telegram-bot/blob/main/mcp-channel-workaround.md
@LozzKappa That is a roundabout hack and, although I'm sure we're all happy you made it work, doesn't really help this issue.
hello has this been addressed?
Possibly related, distinct symptom in the same
--channels/ MCP-ingest area: #69440 (mid-surrogate truncation of a channel notification persists a lone surrogate into the transcript, causing400 no low surrogate in stringon every subsequent request).