想用 ntfy 接收 Claude Code 的 push 通知,只需在手机上安装 ntfy 应用,订阅一个难以猜到的 topic,再添加一个运行 curl -d "message" https://ntfy.sh/your-topic 的 Claude Code hook。Notification hook 会在 Claude 需要权限或等你操作时提醒你,Stop hook 则在一轮对话结束时立刻通知你。完全免费,大约十分钟就能配好,支持 Mac、Windows 和 Linux。
01第 1 步:选定 topic 并订阅
ntfy 无需注册。topic 在第一次有人发布或订阅时自动创建,任何知道名字的人都能读取。ntfy 官方文档说 topic 本质上就是密码,所以要取得又长又随机,例如 claude-7f3k9q2xw4mz。topic 名可以包含字母、数字、下划线和短横线,最长 64 个字符。
安装 ntfy 应用(App Store、Google Play 或 F-Droid),点 +,在 ntfy.sh 上订阅你的 topic。
在 terminal 里测试一下:
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
手机应该在一两秒内收到提醒。在 Windows 上,Windows 10 和 11 自带 curl.exe,同样的命令可以直接用。
02第 2 步:hook 脚本(Mac 和 Linux)
Claude Code 会通过标准输入给每个 hook 传一个 JSON 对象。两种事件都有 cwd 和 hook_event_name 等字段。Notification 额外提供 message 和 notification_type,Stop 额外提供 last_assistant_message,即 Claude 最后一条回复的文本。下面的脚本会把两者都转成易读的 push。脚本依赖 jq(brew install jq,Debian 和 Ubuntu 上用 apt install jq)。
保存为 ~/.claude/ntfy-notify.sh,然后运行 chmod +x ~/.claude/ntfy-notify.sh:
#!/bin/sh
TOPIC_URL="https://ntfy.sh/claude-7f3k9q2xw4mz"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
title="Claude finished: $project"
body=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "Done") | .[0:300]')
priority=3
else
title="Claude needs you: $project"
body=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
priority=4
fi
curl -s -H "Title: $title" -H "Priority: $priority" -H "Tags: robot" \
-d "$body" "$TOPIC_URL" > /dev/null
exit 0
优先级范围是 1(最低)到 5(紧急)。Tags 会给通知加一个 emoji,robot 显示的是机器人脸。
03第 3 步:接入 settings.json
把 hook 加到 ~/.claude/settings.json。如果文件里已经有 hooks 对象,把这些事件加进去,不要整个替换掉。
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh", "async": true }
]
}
]
}
}
"async": true 让 Stop hook 在后台发送,网络再慢也不会拖住 Claude。改完后要开一个新的 Claude Code 会话,因为 hook 是在会话启动时加载的。
用 Stop 还是 idle_prompt?
只要 Claude 一完成,Stop 就会触发,哪怕你就坐在电脑前。如果嫌太频繁,可以去掉 Stop 配置块,改用 matcher permission_prompt|idle_prompt。根据 Anthropic 的文档,idle_prompt 会在 Claude 完成约 60 秒后、且期间你没有输入时触发;permission_prompt 则在权限提示等待约六秒无按键后触发。这样不用额外工作,就有了一个粗略的“只在我离开时提醒”的过滤。各字段和触发时机详见 Notification hook 指南和 Stop hook 指南。
04Windows(PowerShell)
在 Windows 上,把下面的内容保存为 %USERPROFILE%\.claude\ntfy-notify.ps1,无需额外安装任何东西:
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') {
$title = "Claude finished: $project"
$body = [string]$in.last_assistant_message
if ($body.Length -gt 300) { $body = $body.Substring(0, 300) }
$priority = '3'
} else {
$title = "Claude needs you: $project"
$body = [string]$in.message
$priority = '4'
}
Invoke-RestMethod -Method Post -Uri 'https://ntfy.sh/claude-7f3k9q2xw4mz' `
-Headers @{ Title = $title; Priority = $priority } `
-Body ([Text.Encoding]::UTF8.GetBytes($body)) | Out-Null
然后用这个 hook 配置替换上面的 command 行:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\ntfy-notify.ps1\""
}
如果你在 WSL 里运行 Claude Code,请改用 Mac 和 Linux 版脚本;对 hook 来说,WSL 就是 Linux。
05保护隐私
push 的所有内容都会经过 ntfy 服务器,而在 ntfy.sh 上,任何知道 topic 名的人都能读到。上面的 Stop 消息包含 Claude 回复的开头部分,里面可能有代码或文件名。有三种方式可以收紧:
- 少发内容。把
Stop的正文换成固定字符串,比如"Done",标题里只保留项目名。 - 使用 access token。ntfy 的任何发布请求都支持
-H "Authorization: Bearer tk_..."。在自己的服务器上,设置auth-default-access: "deny-all",用ntfy user add创建用户,再用ntfy token add创建 token。 - 自建服务器。ntfy 支持自托管。若要让 iPhone 应用即时收到消息,ntfy 文档建议设置
upstream-base-url: "https://ntfy.sh",这样只会把消息 ID 和 topic 哈希转发给 ntfy.sh 用于唤醒手机,应用随后再从你的服务器拉取消息内容。
如果 Claude Code 跑在远程服务器上,同一个 hook 无需修改就能用,所以 ntfy 也很适合通过 SSH 接收通知。
06Claude Code Notifier 的定位
如果只需要单向提醒,上面的配置已经足够,我们也不会劝你换掉。但它只负责通知。push 告诉你 Claude 需要权限时,会话仍然会一直等到你回到键盘前。
ntfy 支持发起 HTTP 请求的操作按钮,所以你可以自己搭一条回复通道:用一个 PermissionRequest hook 发布请求,在第二个 topic 上等待回复,然后返回决定。有些开源项目就是这么做的(见对比)。
Claude Code Notifier 把这条通道做成了现成方案。配对手机后,你可以直接在手机上单次允许、在本会话内允许或拒绝权限请求,在 Claude 提问时选择答案,并在 Claude 完成后发送下一条指令。它还会检测你是否在场:如果你在最近 30 秒内有输入,terminal 会照常询问,不会等手机;如果你不在,terminal 会等待你的回复,直到你设定的上限,而你一碰键盘它就停止等待。ccn 支持 Mac、Windows 和 Linux;手机应用请见 ccn 页面和价格。
07常见问题
用 ntfy 接收 Claude Code 通知免费吗?
在 ntfy.sh 上发布和订阅都不需要账号,服务器对所有人开放。ntfy 也提供付费套餐,并支持自托管。当前限额请以 ntfy 官网为准。
为什么我的 ntfy hook 没有触发?
修改 settings.json 后要开一个新的 Claude Code 会话,因为 hook 在启动时加载。然后手动运行那行 curl 测试命令,再把示例 JSON 通过管道传给脚本,例如 echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh。其他情况见排查清单。
可以直接在 ntfy 通知里回复 Claude Code 吗?
单纯发布消息做不到。ntfy 的 HTTP 操作按钮可以发请求,但你还需要一个 hook 来等待回复,并把它转换成 Claude Code 能理解的决定。
每种通知类型都会推送吗?
只会推送你列出的 matcher。如果在 Notification 配置中省略 matcher,就会收到所有类型,包括认证和 MCP 对话框。