Claude Code Channels与计划任务完整指南:把外部事件推入会话
课程信息
-
作者:老金
-
GitHub:https://github.com/KimYx0207
-
公众号:老金带你玩AI
-
X(Twitter):老金带你玩AI
-
个人博客:https://aiking.dev
-
预计学时:2-3小时
-
难度等级:⭐⭐⭐ 进阶
-
更新日期:2026年10月3日
-
适用版本:Claude Code v2.1.270 为 2026-09-14 的历史参考;截至 2026-10-03 的新增行为按正文标注版本与官方文档
-
信息来源:
-
Claude Code 官方文档 - Channels
-
Claude Code 官方文档 - Scheduled tasks
-
GitHub Releases v2.1.128+
本课学习目标
老金在课程里讲计划任务时,始终把“谁来接结果”放在前面;自动化没人收口,就只是更快地产生混乱。
完成本课后,你将能:
-
理解 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 登录或 Claude Console API key 认证;不支持 Bedrock、Google Cloud Agent Platform 和 Foundry
-
Team / Enterprise 以及托管 Console 组织需要管理员显式启用
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. 开始前准备
v2.1.139+ 注意:当环境中设置 ANTHROPIC_API_KEY、apiKeyHelper 或 ANTHROPIC_AUTH_TOKEN 时,/schedule、Remote Control、claude.ai MCP connectors 和通知偏好会被禁用。Channels / 计划任务教程默认按 Claude.ai 登录路径讲解;企业 API key 环境请先核对当前 /status。
4.1 基础条件
-
Claude Code 已安装,并通过 claude.ai 或 Claude Console API key 完成认证
-
能看到 /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-official
5.2 启动 channels
退出当前会话后重新启动:
claude --channels plugin:fakechat@claude-plugins-official
如果要同时启动多个 channel,用空格分隔:
claude --channels plugin:telegram@claude-plugins-official plugin:discord@claude-plugins-official
5.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 allowlist
6.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 allowlist
Discord 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-official
claude --channels plugin:imessage@claude-plugins-official
默认给自己发消息即可打通;允许其他联系人则用:
/imessage:access allow +15551234567
6.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@marketplace
7.3 Team / Enterprise 还能再控一层
管理员可以通过:
-
channelsEnabled
-
allowedChannelPlugins
控制:
-
组织是否允许 Channels
-
哪些 plugin 可以注册成 channel
另外,如果你在开发自定义 channel plugin,需要加:
claude --dangerously-load-development-channels plugin:my-channel@my-marketplace
该参数绕过 marketplace 验证,仅用于本地开发调试。
7.4 Permission Relay:远端审批权限请求
Channels 支持权限中继(Permission Relay),但需要所用 channel server 实现并声明 claude/channel/permission capability,而且该服务器已通过 --channels(开发时可用开发参数)加入本次会话,并通过组织的 Channels 策略。
当工具调用需要审批时,本地终端仍会打开审批框,支持中继的 Channel 可以同时把请求发到手机。按插件提供的请求 ID 和回复格式批准或拒绝;先到达的有效答复会生效,另一侧的审批框随后关闭。只说“同意”或使用错误的请求 ID 不会完成审批。
中继覆盖 Bash、Write、Edit 等工具审批,不覆盖工作区信任或 MCP 服务器同意对话框;后两类仍需在本地终端处理。如果插件没有权限中继能力,会话就会停在终端审批处,不能保证手机消息能解锁它。具体能力与格式见官方权限中继参考。
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 happened
8.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 支持单位
-
s
-
m
-
h
-
d
但底层 cron 只有分钟粒度,所以秒会向上取整到分钟。
8.5 还能循环执行另一个命令
/loop 20m /sync-inbox
8.6 取消正在等待的 /loop
动态间隔的 /loop 等待下一次迭代时,按 Esc 可以清除待执行的唤醒。固定间隔或直接创建的 cron 任务不受 Esc 影响;让 Claude 列出任务并删除对应 ID,例如“取消部署检查任务”。
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。
云 routine 的运行时间不等于精确计时器。新建计划默认会放在整点后几分钟;例如希望接近早上9点执行,可以选9:07,整点9:00的任务可能晚几分钟启动。保存后在详情中核对时区、下次运行时间和实际运行记录。这是云 routine 的排队行为,不改变前面本地 CronCreate 表达式的含义。
Team / Enterprise 中,如果组织关闭 routines,成员不能新建,已有任务也停止运行。管理员开关在 Admin settings → Capabilities → Remote sessions;成员看到被组织禁用时,请管理员核对这个入口。详见官方 routines 指南及管理员入口变更。
云任务暂停后怎么恢复:先在网页中打开对应 routine 的详情,查看提示和运行记录,再按原因处理。从 v2.1.274 起,GitHub 连接缺失或过期时会跳过运行,并保留最多 72 小时的恢复窗口;在窗口内重新连接 GitHub,任务会自行恢复。超过 72 小时仍未恢复连接,任务会关闭,需要重新连接后再打开详情页顶部的开关。
订阅暂停是另一种情况:routine 会处于 on hold,订阅恢复后仍需要你到详情页把任务重新打开。不能把 GitHub 的恢复窗口套到订阅暂停上,也不要把云 routine 的恢复行为套到本地 /loop。恢复后打开运行记录读实际执行结果;绿色状态只说明会话没有基础设施错误,不保证提示词中的任务已经完成。详见官方仓库连接说明和用量与订阅限制。
但在本地 session 里,Claude 也会借助 CronCreate / CronList / CronDelete 做 session-scoped 的计划任务和提醒。
9.4 一次性提醒
你甚至不一定非得手打 /schedule。
自然语言也可以:
remind me at 3pm to push the release branch
in 45 minutes, check whether the integration tests passed
10. 当前本地计划任务的关键限制
官方当前明确写了几个限制,必须知道:
10.1 任务是 session-scoped
任务绑定当前会话,只在它运行且空闲时触发。结束进程会停止调度;恢复原会话时,符合条件的 CronCreate 任务可以恢复,因此“停了”不等于“所有任务都删除了”。
10.2 不跨重启持久化(v2.1.110 部分改善)
重启 Claude Code 后,本地 cron 任务默认不会继续。
但从 v2.1.110 起,如果用 --resume 或 --continue 恢复之前的会话,未过期的计划任务会一起恢复。也就是说:
-
新开会话 → 不会继承旧会话的本地任务
-
claude --resume / claude --continue → 恢复未过期、未错过执行时间的 CronCreate 任务
-
动态间隔的 /loop → 不会随恢复重启,需要再次执行 /loop
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 实例在同一时刻触发:
-
固定 cron 循环任务:当前最多延迟 30 分钟;间隔小于一小时时,上限为该间隔的一半
-
一次性任务:安排在整点或半点时,最多提前 90 秒
-
动态间隔 /loop:不适用上述 jitter 规则
这是确定性偏移,不是随机的。
10.9 Bedrock / Vertex / Foundry 的版本差异
从 v2.1.248 起,Bedrock、Vertex、Foundry 上的 /loop 也支持动态间隔和无 prompt 的默认维护模式,不能再按「固定 10 分钟、不支持动态调整」配置。教程基线已包含此变化;旧客户端请先查本机版本。来源:官方 changelog(核查日:2026-09-14)。
10.10 禁用调度器
如果你完全不需要计划任务功能:
CLAUDE_CODE_DISABLE_CRON=1 claude
11. 什么时候该用 Cloud / Desktop scheduled tasks
如果你需要:
-
关掉终端后也继续
-
重启后依然在
-
不依赖当前 session 持续存活
那就别靠 /loop。
官方建议:
-
要可靠、无需你机器在线:用 Cloud scheduled tasks
-
要跑在本机且跨重启保留任务:用 Desktop scheduled tasks;执行时仍需电脑醒着、Desktop 打开且对应环境可用,错过的运行按官方补跑规则处理
-
只是在当前 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-plugins
claude --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
# 动态间隔 /loop 等待时按 Esc;固定间隔任务请让 Claude 删除对应任务
what scheduled tasks do I have?
cancel the deploy check job
# 自定义 /loop 默认提示词
# 创建 .claude/loop.md 或 ~/.claude/loop.md
# 恢复会话时自动恢复未过期任务
claude --resume
14. 下一步建议
-
想跨设备继续本地会话:继续看 Remote Control完整指南
-
想控制模型、1M 上下文和 opusplan:继续看 安装指南中的模型配置章节
最后更新:2026年9月14日 | 适用版本:Claude Code v2.1.270