A channel is an MCP server that can push messages, alerts and webhooks into the Claude Code session you already have open. Claude can react to events from Telegram, Discord, iMessage, CI systems, monitoring tools or other external services without starting a fresh session.
A Channel connects an external event source to a running local Claude Code session. The external system sends an event through an MCP server, and that event is injected into the session Claude is already using.
A normal MCP server is something Claude queries during a task. A Channel can push an event into Claude's running session even when you are not at the terminal.
A Channel is implemented as an MCP server. The channel server receives external messages and injects them into Claude Code as channel events.
Telegram / Discord / iMessage / CI / Webhook
│
▼
Channel MCP Server
│
▼
Running Claude Code Session
│
▼
Claude's tools
│
▼
Reply through the channel
Channel events only arrive while the Claude Code session is open. If you want an always-on setup, run Claude in a background process or another persistent terminal environment.
| Feature | What it does | Best use |
|---|---|---|
| Claude Code on the web | Runs work in a fresh cloud sandbox cloned from GitHub. | Delegate self-contained async work. |
| Claude in Slack | An @Claude mention starts a web session. |
Start work directly from team conversations. |
| Standard MCP server | Claude queries external tools/data during a task. | On-demand access to systems. |
| Remote Control | You drive your local session from claude.ai or the mobile app. | Steer an existing session remotely. |
| Channels | External systems push events into the already-running local session. | Chat bridges, webhooks, CI and monitoring events. |
The current research preview includes official plugins for:
Each supported channel is installed as a plugin and requires Bun. The official fakechat channel is also available as a local demonstration.
Open Telegram's BotFather and send:
/newbot
Give the bot a display name and unique username ending in bot.
Copy the token returned by BotFather.
/plugin install telegram@claude-plugins-official
If the official marketplace is unavailable:
/plugin marketplace add anthropics/claude-plugins-official
Then install again.
/telegram:configure <token>
The plugin saves the token under:
~/.claude/channels/telegram/.env
Alternatively, set:
TELEGRAM_BOT_TOKEN
in your shell environment before launching Claude Code.
Exit Claude Code and restart:
claude --channels plugin:telegram@claude-plugins-official
Send any message to your Telegram bot. The bot returns a pairing code. In Claude Code:
/telegram:access pair <code>
Then restrict access:
/telegram:access policy allowlist
--channels →
Message bot → Pair code → Allowlist.
Open the Discord Developer Portal, create a new application, go to the Bot section, create a username, reset the token and copy it.
In the bot settings, under Privileged Gateway Intents, enable:
Message Content Intent
Use OAuth2 → URL Generator and select the bot scope with these permissions:
/plugin install discord@claude-plugins-official
/discord:configure <token>
The plugin stores it under:
~/.claude/channels/discord/.env
You can alternatively set:
DISCORD_BOT_TOKEN
claude --channels plugin:discord@claude-plugins-official
DM your Discord bot. It responds with a pairing code:
/discord:access pair <code>
Then restrict access:
/discord:access policy allowlist
The Messages database is:
~/Library/Messages/chat.db
macOS protects this file. When the channel first reads it, allow the access request. If the prompt does not appear, go to:
System Settings → Privacy & Security → Full Disk Access
Add your terminal application. Without this access, the server exits with
authorization denied.
/plugin install imessage@claude-plugins-official
claude --channels plugin:imessage@claude-plugins-official
Open Messages on a device signed into your Apple ID and send a message to yourself. Self-chat bypasses access control without additional pairing.
/imessage:access allow +15551234567
Handles can be phone numbers in +country format or Apple ID email addresses.
Fakechat is the easiest way to understand the Channel architecture. It provides a local chat UI without authentication or an external messaging service.
/plugin install fakechat@claude-plugins-official
claude --channels plugin:fakechat@claude-plugins-official
You can pass multiple channel plugins separated by spaces.
claude --channels plugin:fakechat@claude-plugins-official plugin:telegram@claude-plugins-official
http://localhost:8787
Type:
what's in my working directory?
The message enters the running Claude Code session as a channel event. Claude can then call its normal tools and use the channel's reply tool to send the answer back to the browser.
← fakechat · web: what's in my working directory?
The model receives a channel event with a scoped source such as:
<channel source="plugin:fakechat:fakechat">
Every approved Channel plugin maintains a sender allowlist. Only senders you explicitly add can push messages into the session. Other senders are silently dropped.
Texting yourself automatically passes the access gate. Other contacts must be added with
/imessage:access allow.
Some channel servers can declare a permission relay capability. This allows permission prompts from Claude Code to be forwarded through the channel.
This is useful when you are away from the terminal, but it increases the importance of sender access control.
For unattended use, the documentation mentions:
--dangerously-skip-permissions
In non-interactive -p mode, tools that require terminal input, such as multiple-choice
questions and plan-mode approval, are disabled so the session does not stall waiting for input.
Organizations have controls over whether Channels can be used.
| Setting | Purpose |
|---|---|
channelsEnabled |
Master switch. Must be true for channel messages to be delivered. |
allowedChannelPlugins |
Controls which channel plugins may register. |
| Organization/authentication | Default |
|---|---|
| claude.ai Team / Enterprise | Channels are blocked until an Owner enables them. |
| Anthropic Console API key | Channels are allowed by default unless managed settings are deployed. |
| Pro / Max without organization | Organization checks are skipped; user opts in per session with --channels. |
An Owner can enable Channels from the Claude.ai administration area:
Admin settings → Claude Code → Channels
Or managed settings can contain:
{
"channelsEnabled": true
}
{
"channelsEnabled": true,
"allowedChannelPlugins": [
{
"marketplace": "claude-plugins-official",
"plugin": "telegram"
},
{
"marketplace": "claude-plugins-official",
"plugin": "discord"
},
{
"marketplace": "acme-corp-plugins",
"plugin": "internal-alerts"
}
]
}
This lets an organization allow specific official plugins and/or internal plugins.
allowedChannelPlugins is an empty array, all channel plugins from the allowlist
are blocked, although the development flag can still bypass this for local testing.
To block Channels entirely, leave channelsEnabled disabled.
If the system you care about does not have an official Channel plugin, you can build your own. The documentation provides a Channels reference for this purpose.
Conceptually, your custom Channel needs to:
GitHub Actions / Jenkins / GitLab CI
│
▼
Your channel server
│
▼
Running Claude Code
│
▼
Claude investigates
│
▼
Reply / status update
{
"source": "ci",
"event": "build_failed",
"repository": "acme/payments",
"branch": "main",
"job": "integration-tests",
"url": "https://ci.example.com/job/123",
"message": "17 integration tests failed"
}
Claude can receive the event and use the local repository and normal Claude Code tools to investigate.
During the research preview, the normal --channels flag only accepts channel plugins
from the effective approved allowlist.
For a channel you are building, the documentation provides:
--dangerously-load-development-channels
| Limitation | Meaning |
|---|---|
| Research preview | The feature is still evolving. |
| Flag may change | --channels syntax and protocol contract may change. |
| Not in help | During preview, the flags may work without appearing in claude --help. |
| Anthropic auth | Requires claude.ai authentication or Console API key. |
| Provider limitation | Not available on Bedrock, Google Cloud Agent Platform or Microsoft Foundry. |
| Session must run | Events arrive only while the Claude Code session is open. |
| Allowlist | Only approved/allowed channel plugins can register during the preview. |
A deployment fails in CI. Instead of manually opening the terminal and explaining the failure, the CI system pushes an event into your running Claude session.
Imagine a monitoring service reports:
HTTP 500 spike
service=payments
error=DataIntegrityViolationException
rate=18% in 5 minutes
A Channel can deliver that event into the running Claude Code session. Claude can inspect the Spring Boot code, search logs/files and prepare a diagnosis.
Vercel deployment failed
branch=main
error=TypeScript compilation failed
file=src/app/dashboard/page.tsx
Claude receives the event, examines the repository and can investigate the relevant TypeScript file.
You are away from your laptop but want to ask Claude about the project:
Telegram:
"Check why the integration tests were failing earlier."
Claude receives the message in the existing local session, where it can use the real working directory.
| Mistake | Why it happens | Fix |
|---|---|---|
Installing plugin but not using --channels | Plugin is installed but not opted into the session. | Restart Claude with --channels plugin:.... |
| Bot does not respond | Claude was started without the channel flag. | Restart with the channel enabled. |
| Everyone can message the bot | Access control was not configured. | Pair and use an allowlist. |
| Assuming channel works after Claude exits | Channels deliver to a running session. | Use a persistent/background process for always-on behavior. |
| Using a local MCP server as a Channel automatically | MCP configuration alone does not enable push delivery. | The server must be named in --channels. |
| Admin enabled plugin but messages do not arrive | channelsEnabled may be off. | Have an Owner/admin enable Channels. |
| Custom channel won't register | It is not on the effective preview allowlist. | Use the development flag for testing or configure an org allowlist. |
| Giving permission relay to untrusted users | Channel sender can approve/deny tool use. | Allowlist only trusted senders. |
| Feature | Trigger | Example |
|---|---|---|
| Hook | Claude Code lifecycle event | After Edit → run formatter. |
| Scheduled task | Time-based schedule | Every morning → run a prompt. |
| Channel | External pushed event | CI failure → tell running Claude. |
| Goal | Command / setting |
|---|---|
| Install Telegram | /plugin install telegram@claude-plugins-official |
| Configure Telegram | /telegram:configure <token> |
| Pair Telegram | /telegram:access pair <code> |
| Telegram allowlist | /telegram:access policy allowlist |
| Start Telegram | claude --channels plugin:telegram@claude-plugins-official |
| Install Discord | /plugin install discord@claude-plugins-official |
| Configure Discord | /discord:configure <token> |
| Pair Discord | /discord:access pair <code> |
| Discord allowlist | /discord:access policy allowlist |
| Start Discord | claude --channels plugin:discord@claude-plugins-official |
| Install iMessage | /plugin install imessage@claude-plugins-official |
| Start iMessage | claude --channels plugin:imessage@claude-plugins-official |
| Allow iMessage sender | /imessage:access allow +country-number |
| Install fakechat | /plugin install fakechat@claude-plugins-official |
| Start fakechat | claude --channels plugin:fakechat@claude-plugins-official |
| Fakechat UI | http://localhost:8787 |
| Enable org-wide | "channelsEnabled": true |
| Restrict plugins | allowedChannelPlugins |
| Custom channel testing | --dangerously-load-development-channels |
--channels flag do?channelsEnabled control?allowedChannelPlugins control?Install fakechat, start Claude with --channels and send a message from the browser.
Create a test bot, pair your account and send a harmless message to your local Claude session.
Configure a Channel so only your account can send events.
Design the JSON payload a CI system could send when a build fails.
Design a monitoring event for a Spring Boot HTTP 500 spike and describe how Claude should investigate it.
Create a managed settings example that allows only Telegram and an internal alert plugin.
Channel = external event → existing Claude Code session.
MCP gives Claude on-demand access to external systems.
Channel lets external systems push events into Claude.
--channels explicitly opts a channel into the current session.
Allowlist decides who can send events.
channelsEnabled controls whether an organization permits Channels.
Channels are useful when Claude needs to react to something that happens outside the terminal. Instead of polling or starting a new cloud session, a Channel can deliver the event directly into the Claude Code process that is already running against your local project.
The strongest mental model is:
Normal MCP:
Claude → asks system → gets data
Channel:
External system → pushes event → Claude's running session → reacts
Hook:
Claude Code event → hook → automation
Scheduled task:
Clock → prompt → Claude
For practical learning, start with fakechat, then try Telegram or Discord, and only after that connect real CI/monitoring systems. Always keep sender access restricted, especially when permission relay or unattended operation is involved.