要在 Claude Code 完成时收到通知,可以在 ~/.claude/settings.json 中添加一个 Stop hook,让它执行系统的通知命令。Claude 一结束回复,Stop 就会立即触发。如果还想知道“Claude 在等我输入”,再加一个 Notification hook:权限提示等待约六秒,或 Claude 空闲约一分钟时,它就会触发。两者在 Mac、Windows 和 Linux 上都能用,借助 Claude Code Notifier 之类的工具,还能把同样的提醒推送到手机。
01Claude Code 自带的通知行为
Claude Code 在判断你不在 terminal 前时,本身就会尝试提醒你。默认情况下,它在 iTerm2、Ghostty 和 Kitty 中发送桌面通知,在 Apple Terminal 中可能会响铃,在其他 terminal 中则什么也不做。另外,iTerm2 还需要先打开提醒设置才会显示通知。
所以如果你用的是 VS Code 内置 terminal、Warp、Windows Terminal 或大多数 Linux terminal,通常什么提醒都收不到。你可以通过 preferredNotifChannel 设置强制使用 terminal 响铃,详见terminal 响铃指南。想在任何 terminal 中都收到真正的桌面通知,就需要用 hook。
02需要的两个 hook
hook 是 Claude Code 在会话中特定时间点执行的命令。这里用到其中两个:
StopClaude 结束回复时(被你中断时不触发)“Claude 已完成”Notification,matcher 为 permission_prompt权限提示已等待约六秒,且你一直没有输入“Claude 需要批准”Notification,matcher 为 idle_promptClaude 完成后约 60 秒,期间你没有输入提醒你该你操作了Stop 是最快的,每轮结束时立即执行。Notification 类型则只在你离开时才会触发:每次按键都会推迟它,所以你盯着屏幕时不会被打扰。如果想在 Claude 请求权限的那一刻就收到信号,请改用 PermissionRequest hook,详见PermissionRequest 指南。
关于 hook 的通用机制(事件、matcher、设置文件、退出码),请参阅Claude Code hook 详解。
03macOS 上的可用配置
打开 ~/.claude/settings.json(不存在就新建),加入以下内容。如果文件里已经有 hooks 对象,就把 Stop 和 Notification 作为键加到里面,不要整个替换。
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\"'"
}
]
}
],
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
Stop 没有 matcher,所以每轮都会触发。Notification 的 matcher 把它限制在表示“该回来了”的两种类型上。
如果没有任何通知,可能是 macOS 屏蔽了脚本编辑器(Script Editor),而 osascript 正是靠它来显示通知。先在 Terminal 中运行一次 osascript -e 'display notification "test"',然后打开系统设置 > 通知,找到脚本编辑器,开启允许通知。
04在 Linux 和 Windows 上的相同配置
保持上面的 JSON 结构不变,只替换 command 字符串即可。
Linux(需要桌面通知守护进程,因此无法在 headless 服务器上使用):
"command": "notify-send 'Claude Code' 'Claude has finished'"
如果没有 notify-send,在 Debian 和 Ubuntu 上安装 libnotify-bin,其他发行版请安装对应的包。SSH 和服务器环境请参阅通过 SSH 接收通知。
Windows(PowerShell)。Anthropic 官方示例弹出的是消息框,而不是角落里的 toast 通知:
"command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude has finished', 'Claude Code')\""
消息框可能会出现在 terminal 窗口后面,所以先在 PowerShell 里测试一下命令。在 WSL 下,需要能通过 Windows interop 调用 powershell.exe。更多方案见 Windows 指南。
05验证是否生效
- 在 Claude Code 中输入
/hooks,应该能在Stop和Notification下看到你的 hook。 - 随便问 Claude 一个简短的问题。它回复后,应该会弹出
Stop通知。 - 让它做一件需要权限的事,然后切到别的窗口等待。大约六秒后会收到
permission_prompt通知。
对 settings.json 的修改通常会立即生效。如果 /hooks 里没有显示某个 hook,检查文件是否是合法的 JSON(不能有尾随逗号,也不能有注释)。用 claude --debug 启动 Claude Code,可以看到每个 hook 的执行情况。更多解决办法见故障排查清单。
06在手机上接收提醒
桌面通知只有你坐在电脑前才有用。一旦离开,就需要把提醒发到别处。常见的方式有三种:
- 自建 push 服务,比如 ntfy,在同样的 hook 里用
curl调用。便宜又灵活。见 ntfy 指南。 - 聊天 webhook,适用于 Telegram、Slack 或 Discord。如果你平时就泡在聊天工具里,这个很合适。见聊天 webhook 指南。
- Claude Code Notifier,帮你配好 hook,还能直接在手机上回复。
如果只想收到一个提醒,自己动手的方案就够用了。它们的局限在于是单向的:你知道 Claude 在等你,但要批准什么操作,还得回到键盘前。
Claude Code Notifier 是一个独立工具(并非 Anthropic 出品),由两部分组成:ccn,一个适用于 Mac、Windows 和 Linux 的免费命令行工具;以及 iPhone 和 Android 应用。一行命令即可安装:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
在 Windows 上,在 PowerShell 中运行 irm https://claudecodenotifier.com/install.ps1 | iex(Windows 支持目前处于 beta 阶段)。其他安装方式,包括 Homebrew、npx @touchtap/ccn 和 Claude Code 插件,见 ccn 页面。
安装时会添加七个 hook 条目,每个都运行 ccn hook,settings.json 的其余内容保持不变,并在同目录下保存一份一次性备份。即使不连手机,ccn 也会在 Claude 完成、需要权限或提问时在电脑上弹出桌面通知。这部分免费,而且无需联网。
用 ccn pair 配对手机后,还能获得:
- 每轮结束时立即收到“Claude 已完成”的 push;
- 权限请求可以选择允许一次、在本次会话中允许或拒绝;
- 在手机上回答 Claude 的选择题;
- Claude 完成后,可在输入框里直接发送下一条指令。
如果你在最近 30 秒内打过字,就不会等待手机,terminal 会照常询问。应用需要订阅或买断,见价格。配对手机里有完整的设置步骤。
07常见问题
为什么我的 Notification hook 要过很久才触发?
permission_prompt 类型会等提示在屏幕上停留约六秒且你没有输入后才触发,idle_prompt 则在 Claude 完成约 60 秒后触发。这个延迟是有意设计的,避免你正盯着屏幕时还被打扰。想要即时的“已完成”提醒,用 Stop hook;想要即时的“需要批准”提醒,用 PermissionRequest hook。
按 Esc 打断 Claude 时,Stop hook 会触发吗?
不会。因为你打断而结束的轮次不会运行 Stop。因 API 错误(比如 rate limit)而结束的轮次也不会。对于后者,Claude Code 会触发单独的 StopFailure 事件,可以用同样的方式挂 hook。
Stop hook 是每条消息后都触发,还是整个任务完成后才触发?
每轮之后都会触发。Claude Code 并不知道你的整体任务何时完成,只知道它何时停止响应。如果来回对话很多,每次回复都会收到一条提醒。嫌太多的话,改用 idle_prompt 通知,它只会在你离开大约一分钟后触发。
在 VS Code 或 JetBrains 的 terminal 里能用吗?
能。hook 由 Claude Code 本身运行,而不是 terminal,所以在任何 terminal 里都能用,包括 IDE terminal。依赖 terminal 的是内置通知。见IDE terminal 指南。
不在手机上安装任何东西,也能收到通知吗?
部分可以。向 ntfy 或聊天 webhook 发消息的 hook,可以把通知推送到你已有的应用上,但只能告诉你发生了什么。要在手机上批准或回答,需要能把你的回复传回 hook 的东西,这正是 Claude Code Notifier 应用所做的。