Claude Code Channels与计划任务完整指南:把外部事件推入会话
Claude Code Channels与计划任务完整指南:把外部事件推入会话
本课学习目标
完成本课后,你将能:
- 理解 Channels、Remote Control、MCP、Cloud Tasks 之间的区别
- 正确安装并启用官方 channel plugin
- 用
--channels把 Telegram / Discord / iMessage / fakechat 推入当前会话 - 正确使用
/schedule、/loop、CronCreate / CronList / CronDelete - 避开“用 polling 解决 push 问题”这种常见设计误区
1. 先说结论
Channels 和计划任务,解决的是两类不同问题:
- Channels:外部事件主动推给 Claude
- 计划任务:Claude 按时间轮询或提醒
如果你只记一句话:
有事件就用 Channels,没有事件源才考虑
/loop或/schedule。
2. Channels 是什么
官方当前定义里,Channels 是:
通过 MCP server 把消息、提醒、Webhook 直接推入你已经打开的 Claude Code 会话。
它不是新开云端会话,也不是轮询。
它的核心价值是:
- CI 失败了,直接把结果推进当前会话
- Telegram / Discord / iMessage 上给 Claude 发消息
- 你不在终端前时,也能让外部事件进到当前 session
2.1 当前官方状态
- research preview
- 需要 Claude Code v2.1.80+
- 需要 claude.ai 登录
- Team / Enterprise 默认可能关闭,需要管理员启用
v2.1.128 变更:--channels 现在也支持 Console auth(API key)登录,不再仅限 claude.ai 登录。如果你之前因为 API key 模式无法使用 Channels,可以重新尝试。
3. Channels、Remote Control、普通 MCP 的区别
| 功能 | 解决什么问题 | 最适合场景 |
|---|---|---|
| Channels | 外部事件主动推进来 | CI、聊天桥、Webhook |
| Remote Control | 你自己从别的设备继续控制会话 | 手机继续本地会话 |
| 普通 MCP | Claude 在任务中主动调用外部工具 | 按需查数据 / 操作系统 |
/loop / Cron* | 按时间轮询或提醒 | 没有事件推送源时 |
一个特别重要的判断标准:
- 外部系统会主动发事件:优先 Channels
- 只能自己定时检查:才用
/loop
4. 开始前准备
4.1 基础条件
- Claude Code 已安装并登录 claude.ai
- 能看到
/plugin - 若要跑官方 channel plugin,必须安装 Bun(所有官方 channel plugin 都依赖 Bun 运行时)
4.2 当前官方支持的典型 channel plugin
- Telegram
- Discord
- iMessage
- fakechat(官方 demo)
5. 最推荐的入门方式:fakechat
如果你第一次接触 Channels,别一上来就配 Telegram。
先用官方 demo fakechat 最稳。
5.1 安装插件
在 Claude Code 里:
/plugin install fakechat@claude-plugins-official如果提示 marketplace 不存在或未更新,先执行:
/plugin marketplace update claude-plugins-official或:
/plugin marketplace add anthropics/claude-plugins-official5.2 启动 channels
退出当前会话后重新启动:
claude --channels plugin:fakechat@claude-plugins-official如果要同时启动多个 channel,用空格分隔:
claude --channels plugin:telegram@claude-plugins-official plugin:discord@claude-plugins-official5.3 打开本地界面
浏览器打开:
http://localhost:8787在页面输入消息,它会作为 <channel source="fakechat"> 事件进入你当前 Claude Code 会话。
这就是理解 Channels 最快的方法。
6. Telegram / Discord / iMessage 的核心模式
它们虽然接法不同,但逻辑一致:
- 装 plugin
- 配 token 或权限
- 用
--channels启动 - 做 pairing / allowlist
- 之后该平台的消息会直接推入当前 session
6.1 Telegram
官方主路径大致是:
/plugin install telegram@claude-plugins-official
/reload-plugins
/telegram:configure <token>然后重启:
claude --channels plugin:telegram@claude-plugins-official再做配对:
/telegram:access pair <code>
/telegram:access policy allowlist6.2 Discord
同理:
/plugin install discord@claude-plugins-official
/reload-plugins
/discord:configure <token>然后:
claude --channels plugin:discord@claude-plugins-official最后:
/discord:access pair <code>
/discord:access policy allowlistDiscord Bot 必须开启的权限:
- Message Content Intent(在 Developer Portal 的 Bot 设置中开启)
- View Channels
- Send Messages
- Send Messages in Threads
- Read Message History
- Attach Files
- Add Reactions
6.3 iMessage
iMessage 逻辑不同:
- 只支持 macOS
- 直接读本机 Messages 数据库
- 需要 Full Disk Access
- 回复靠 AppleScript
启动方式:
/plugin install imessage@claude-plugins-officialclaude --channels plugin:imessage@claude-plugins-official默认给自己发消息即可打通;允许其他联系人则用:
/imessage:access allow +155512345676.4 Token 存储位置
各 channel 的 token 默认存储在:
- Telegram:
~/.claude/channels/telegram/.env(包含TELEGRAM_BOT_TOKEN) - Discord:
~/.claude/channels/discord/.env(包含DISCORD_BOT_TOKEN)
如果你需要迁移配置或排查连接问题,直接检查这些文件。
7. Channels 的安全边界
官方当前强调的几个点很关键:
7.1 allowlist 是核心
所有 approved channel plugin 都有 sender allowlist。
也就是说:
- 不是“谁知道 bot 就能发”
- 而是“只有被允许的 sender 才能推消息进来”
7.2 --channels 只是本会话启用
即便 .mcp.json 里有 server,也不代表它能推送消息。
必须当前会话显式用:
claude --channels plugin:xxx@marketplace7.3 Team / Enterprise 还能再控一层
管理员可以通过:
channelsEnabledallowedChannelPlugins
控制:
- 组织是否允许 Channels
- 哪些 plugin 可以注册成 channel
另外,如果你在开发自定义 channel plugin,需要加:
claude --channels plugin:my-channel --dangerously-load-development-channels该参数绕过 marketplace 验证,仅用于本地开发调试。
7.4 Permission Relay:远端审批权限请求
从 v2.1.81 起(v2.1.100 完全实现),Channels 支持权限中继(Permission Relay):
当 Claude 需要执行需要审批的操作时(如写文件、执行命令),权限确认请求会被转发到你的 Channel(如 Telegram / Discord),你可以直接在手机上批准或拒绝。
这意味着你不需要守在终端前也能让 Claude 继续有权限地工作。
7.5 事件只在会话打开时到达
Channel 消息只会在 Claude Code 会话运行时被接收。如果你关掉了终端,消息就丢了。
如果你需要 always-on 的 Channel 接收:
- 在后台进程中运行 Claude Code
- 或使用持久终端(如 tmux / screen)
8. 什么时候该用 /loop
/loop 不是 Channels 的替代品,它是:
当前会话仍然开着时,用最低成本做“定时轮询”。
官方当前把 /loop 归为 bundled skill,不是固定逻辑 built-in command。
8.1 最基础用法
/loop 5m check if the deployment finished and tell me what happened8.2 /loop 不带 prompt 时的默认行为
如果你只打 /loop 不带任何参数,Claude 会使用内置的维护提示词,按以下优先级自动工作:
- 继续未完成的工作
- 维护当前 PR(查看 review comments、CI 失败、merge conflicts)
- 运行清理(bug 排查、代码简化)
你也可以自定义默认提示词:在项目目录创建 .claude/loop.md,或在用户目录创建 ~/.claude/loop.md。项目级优先于用户级。修改后下一次迭代自动生效。
8.3 它支持几种写法
/loop 30m check the build
/loop check the build every 2 hours
/loop check the build如果你不写间隔且带了自定义 prompt,Claude 会动态选择间隔(1 分钟到 1 小时之间),根据观察到的情况自行调整。不带 prompt 的纯 /loop 也是动态间隔。
8.4 支持单位
smhd
但底层 cron 只有分钟粒度,所以秒会向上取整到分钟。
8.5 还能循环执行另一个命令
/loop 20m /sync-inbox8.6 取消正在等待的 /loop
在 /loop 等待下一次迭代时,按 Esc 即可取消(v2.1.111+)。
8.7 /proactive 别名
从 v2.1.105 起,/proactive 是 /loop 的别名,功能完全相同。如果你觉得 "loop" 不够语义化,可以用 /proactive。
9. /schedule、CronCreate、CronList、CronDelete
除了 /loop,Claude Code 现在还有更底层的 cron 调度能力。
9.1 当前官方工具
| 工具 | 作用 |
|---|---|
CronCreate | 创建任务 |
CronList | 列出任务 |
CronDelete | 删除任务 |
计划任务功能(/loop、CronCreate 等)从 v2.1.72+ 开始可用,比 Channels(v2.1.80+)更早。
9.2 Cron 表达式参考
如果 Claude 直接使用 CronCreate,底层走的是标准 cron 表达式:
| 表达式 | 含义 |
|---|---|
*/5 * * * * | 每 5 分钟 |
0 * * * * | 每小时整点 |
0 9 * * * | 每天早上 9 点 |
0 9 * * 1-5 | 工作日早上 9 点 |
30 14 15 3 * | 3 月 15 日下午 2:30 |
所有时间均为本地时区,不是 UTC。
9.3 /schedule 是什么
/schedule 是当前用户入口,用来创建、更新、列出和运行 Cloud scheduled tasks。
但在本地 session 里,Claude 也会借助 CronCreate / CronList / CronDelete 做 session-scoped 的计划任务和提醒。
9.4 一次性提醒
你甚至不一定非得手打 /schedule。
自然语言也可以:
remind me at 3pm to push the release branchin 45 minutes, check whether the integration tests passed10. 当前本地计划任务的关键限制
官方当前明确写了几个限制,必须知道:
10.1 任务是 session-scoped
只要当前 Claude Code 会话结束,任务就没了。
10.2 不跨重启持久化(v2.1.110 部分改善)
重启 Claude Code 后,本地 cron 任务默认不会继续。
但从 v2.1.110 起,如果用 --resume 或 --continue 恢复之前的会话,未过期的计划任务会一起恢复。也就是说:
- 正常重启 → 任务丢失
claude --resume/claude --continue→ 未过期任务自动恢复
10.3 Claude 忙的时候不会插队
定时任务会在 turn 之间触发,不会在 Claude 正在回答时硬插进去。
10.4 recurring task 7 天自动过期
官方当前默认策略是:
- 循环任务 7 天后自动过期
- 最后再触发一次,然后删除
这是为了防止遗忘的轮询长期跑下去。
10.5 退出确认会提示剩余任务(v2.1.113+)
从 v2.1.113 起,当你退出会话时,如果还有未完成的计划任务,Claude Code 会显示确认提示并展示倒计时:
- 一次性任务:显示距离触发还有多久
- 循环任务:显示下一次触发时间
这样你就不会不小心退出然后丢掉还没跑的任务。
10.6 每个会话最多 50 个计划任务
官方当前限制:单个会话最多 50 个计划任务。超过后需要先删除旧的才能创建新的。
10.7 --resume 不会恢复所有任务
v2.1.110 的 --resume 恢复策略有细节:
- 循环任务:创建后 7 天内的会恢复
- 一次性任务:计划时间未过的会恢复
- 后台 Bash 和监控任务:永远不恢复
10.8 Jitter 策略
为了避免大规模部署时所有 Claude 实例在同一时刻触发:
- 循环任务:最多延迟周期的 10%(上限 15 分钟)
- 一次性任务:整点/半点前后最多提前 90 秒
这是确定性偏移,不是随机的。
10.9 Bedrock / Vertex / Foundry 限制
在 Bedrock、Vertex 或 Foundry 环境下,/loop <prompt> 固定为 10 分钟间隔,不支持动态调整。
10.10 禁用调度器
如果你完全不需要计划任务功能:
CLAUDE_CODE_DISABLE_CRON=1 claude11. 什么时候该用 Cloud / Desktop scheduled tasks
如果你需要:
- 关掉终端后也继续
- 重启后依然在
- 不依赖当前 session 持续存活
那就别靠 /loop。
官方建议:
- 要可靠、无需你机器在线:用 Cloud scheduled tasks
- 要跑在你本机且跨重启:用 Desktop scheduled tasks
- 只是在当前 session 临时盯一件事:用
/loop
12. 常见误区
误区 1:Channels = Remote Control
不是。
- Remote Control 是你自己远程接管
- Channels 是外部系统把消息推过来
误区 2:有 /loop 就不用 Channels
不对。
如果外部系统本来就能发事件,轮询只是更慢、更贵、更脆。
误区 3:计划任务会一直留着
不会。当前本地计划任务是 session-scoped,循环任务还有 7 天自动过期。
13. 实用速查
/plugin install fakechat@claude-plugins-official
/reload-pluginsclaude --channels plugin:fakechat@claude-plugins-official# 同时启动多个 channel
claude --channels plugin:telegram@claude-plugins-official plugin:discord@claude-plugins-official/loop 5m check if the deployment finished# 按 Esc 取消正在等待的 /loopwhat scheduled tasks do I have?
cancel the deploy check job# 自定义 /loop 默认提示词
# 创建 .claude/loop.md 或 ~/.claude/loop.md# 恢复会话时自动恢复未过期任务
claude --resume