关于 ntfy-me-mcp
ntfy-me-mcp 是一个 MCP 服务,让 AI Agent 通过 ntfy 服务发送和获取通知,可用于公共 ntfy.sh 或可自托管的 ntfy 服务器。支持访问令牌认证,并能自动识别消息中的链接和 Markdown 格式。
主要功能
- 01发送带标题、优先级和标签的通知
- 02获取并筛选主题中的缓存消息
- 03自动识别 URL 并生成查看动作
- 04支持访问令牌认证
- 05支持 npx 与 Docker 运行方式
适用场景
- 01AI 完成任务或出错时推送提醒到手机
- 02在长时间任务结束后接收结果通知
- 03通过 ntfy 主题轮询查看历史消息
MCP 相关
该项目是一个 MCP 服务,向 MCP 客户端暴露通知发送与消息获取的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
ntfy-me-mcp
一个精简的模型上下文协议(MCP)服务,可通过 ntfy 服务(公共或可自托管,并支持令牌)发送和获取通知 📲
概述
ntfy-me-mcp 可让 AI 助手通过 ntfy.sh 服务(公共服务,或支持令牌的可自托管服务)向你的设备发送实时通知。AI 完成任务、遇到错误或达到重要里程碑时,你都能收到通知,无需持续监控。
该服务包含智能功能,例如自动检测 URL 以创建查看操作,以及智能检测 Markdown 格式,让 AI 助手无需额外配置即可创建内容丰富、可交互的通知。
| 预览 | 可通过以下平台访问 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
即将推出……
- 📨 电子邮件:向电子邮箱发送通知(需要配置 ntfy 邮件服务)
- 🖼️ 图片 URL:智能检测图片 URL,并自动将其添加到消息和通知中
- 🏁 等更多功能!
目录
| 章节 | 主题 |
|---|---|
| 快速入门 - MCP 服务配置 | 配置示例 |
| 安装 | 设置通知接收端 |
| 配置 |
环境变量 身份验证 ↳ 安全处理令牌(vscode) |
| 工具与用法 |
ntfy_me:发送通知 ↳ 使用自然语言 ↳ 用法示例 ↳ 消息参数 ntfy_me_fetch:轮询通知 ↳ 使用自然语言 ↳ 用法示例 ↳ 获取参数 工具输出 |
| 安全 | |
| 开发与贡献 | |
| 许可证 |
快速入门 - MCP 服务配置
选择与你的客户端相匹配的配置格式。以下所有示例都使用必需变量 NTFY_TOPIC,并将可选的身份验证设置保留为注释,直到你需要使用它们为止。
已通过 Ontheia 测试: Ontheia 是一个可自托管的开源 AI Agent 平台;该平台报告称 ntfy-me-mcp 可与其配合使用,并将其列入兼容的 MCP 服务列表。
要求: npx、全局和本地选项需要 Node.js 24 或更高版本。CI 和 Docker 镜像使用 Node 24。不支持 Node 22 及更早版本(npm 会发出
EBADENGINE警告)。Docker 选项仅需 Docker。
配置示例
| 类型 | 使用场景 | 示例 |
|---|---|---|
| NPM / NPX | 如果希望采用最轻量的配置,推荐大多数 MCP 客户端使用此方式。 |
显示配置
|
| 本地 | 如果你要自行开发或修改服务,请使用本地检出版本。
构建后替换 /absolute/path/to/ntfy-me-mcp/build/index.js。
|
显示配置
|
| Docker | 如果你的环境已包含 Docker,请使用容器化配置。
- DockerHub: gitmotion/ntfy-me-mcp:latest- GHCR: ghcr.io/gitmotion/ntfy-me-mcp:latest
|
显示配置
|
| OpenCode | 将配置添加到项目根目录中的 opencode.json(项目级配置),或 ~/.config/opencode/opencode.json(全局配置)。顶层键使用 "mcp",并设置 type: "local",同时将 command 设为数组。 |
显示配置
|
| Claude Code | 最快的方式:运行 claude mcp add ntfy-me-mcp -e NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp(添加 --scope user 可用于所有项目,或添加 --scope project 以写入 .mcp.json)。
或者手动将其添加到项目根目录的 .mcp.json 中(通过版本控制与团队共享)。${NTFY_TOKEN:-} 会从 shell 环境读取令牌,若未设置则使用空值。 |
显示配置
|
| Copilot CLI | 添加到 ~/.copilot/mcp-config.json,以便在所有会话中使用用户级配置。对于此类基于 stdio 的服务,请使用 type: "local"。 |
显示配置
|
| Codex | 运行 codex mcp add ntfy-me-mcp --env NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp,或手动将配置块添加到 ~/.codex/config.toml。 |
显示配置
|
| 令牌身份验证 | 受保护的主题或自托管服务必需。请参阅 安全令牌处理(vscode),或直接设置 NTFY_TOKEN。 |
显示配置
|
安装
如果需要直接安装并运行服务(作为上述 MCP 配置的替代方案):
| 选项 | 示例 |
|---|---|
| 全局安装 安装一次,即可在任意位置通过 ntfy-me-mcp 命令运行。 |
npm install -g ntfy-me-mcp
|
| 通过 npx 运行 无需安装——适合快速运行一次或进行测试。 |
npx ntfy-me-mcp
|
| 本地安装 克隆仓库、安装依赖、构建,然后通过 npm start 运行。 |
显示步骤
|
设置通知接收端
查看 ntfy 接收端部分
- 在设备上安装 ntfy 应用
- 或部署自己的 ntfy 服务:https://docs.ntfy.sh/install/
- 订阅选定的主题(与
NTFY_TOPIC设置相同)
配置
环境变量
复制示例文件创建 .env 文件:cp .env.example .env——请参阅 .env.example 以供参考。
| 变量 | 必需 | 默认值 | 说明 |
|---|---|---|---|
NTFY_TOPIC | 是 | — | 用于发布通知的 ntfy 主题 |
NTFY_URL | 否 | https://ntfy.sh | ntfy 服务 URL——自托管实例需更改此项 (如有需要,请包含端口,例如 https://your-server.com:8443) |
NTFY_TOKEN | 否 | — | 用于受保护主题或私有服务的访问令牌。此令牌只会发送到 NTFY_URL 服务 |
NTFY_ALLOW_TOPIC_OVERRIDE | 否 | false | 设置为 true,允许 Agent 为每次调用选择 topic。关闭时(默认),不会向 Agent 提供 topic 参数,所有通知和获取操作都会使用 NTFY_TOPIC |
NTFY_TOPICS_ALLOWLIST | 否 | — | 以逗号分隔的订阅主题列表,例如 alerts,builds,deploys。设置后,Agent 可以向 NTFY_TOPIC 或其中一个主题发送内容,或从中获取内容,不能使用其他主题。topic 参数将显示为仅包含这些主题的列表。优先级高于 NTFY_ALLOW_TOPIC_OVERRIDE。如果包含无效条目,或未列出任何主题(例如 ,),服务将在启动时停止 |
NTFY_ALLOW_URL_OVERRIDE | 否 | false | 设置为 true,允许 Agent 为每次调用选择服务 url。关闭时(默认),不会提供 url 参数,所有请求都会发送到 NTFY_URL。即使启用此选项,NTFY_TOKEN 也只会发送到 NTFY_URL |
身份验证
查看身份验证部分
此 MCP 服务支持经过身份验证和未经过身份验证的 ntfy 端点:
- 公共主题:使用 ntfy.sh 或其他公共服务上的公共主题时,无需身份验证。
- 受保护主题:
- 对于受保护主题或私有服务,你需要通过
NTFY_TOKEN环境变量或工具的accessToken参数提供访问令牌。 - 如果需要身份验证但未提供令牌,你会收到一条清晰的错误消息,说明如何添加令牌。
- 对于受保护主题或私有服务,你需要通过
安全的令牌处理(vscode)
- 如果你的客户端支持基于提示词的机密输入(例如 VS Code),请优先使用此方式,而不要在配置文件中硬编码
NTFY_TOKEN。(否则,请直接使用令牌。) - 在
mcp.json文件中使用如下对应值:
显示 VS Code mcp.json 示例
// Add this to your VS Code `mcp.json` file, either the user-level file or your workspace `.vscode/mcp.json`
// Set `NTFY_TOKEN` exactly to `"${input:ntfy_token}"` when you want VS Code to treat it as a secure prompt-backed value.
{
"inputs": [
{
"type": "promptString",
"id": "ntfy_token",
"description": "Ntfy Token",
"password": true
}
],
"servers": {
"ntfy-me-mcp": {
"command": "npx",
"args": ["-y", "ntfy-me-mcp"],
"env": {
"NTFY_TOPIC": "your-ntfy-topic",
"NTFY_URL": "https://your-ntfy-server.com",
"NTFY_TOKEN": "${input:ntfy_token}"
}
}
}
}
| 字段 | 值 | 用途 |
|---|---|---|
env.NTFY_TOKEN | "${input:ntfy_token}" | 引用由安全提示词提供的令牌值 |
inputs[].id | "ntfy_token" | 定义 NTFY_TOKEN 使用的输入名称 |
inputs[].type | "promptString" | 在运行时提示用户输入令牌 |
你的 MCP 客户端必须像 VS Code 一样,在启动服务之前解析
"${input:ntfy_token}",这样服务才能收到真实令牌。如果你的客户端不支持${input:…}引用(Claude Desktop、Claude Code、Codex 等),请将NTFY_TOKEN设置为真实令牌,或设置为客户端支持的环境变量引用。如果占位符未经解析就传递给服务,服务将无法向你索取令牌(stdin 和 stdout 承载 MCP 连接),因此会在启动时退出,并提示错误NTFY_TOKEN is an unresolved ${input:…} reference;你的客户端会在 MCP 服务日志中显示此错误。其他客户端未替换的占位符也一样,例如${env:NTFY_TOKEN}或${NTFY_TOKEN}:服务会提示NTFY_TOKEN contains an unresolved ${…} placeholder并退出,而不会将其作为令牌发送;启用了身份验证的 ntfy 服务(例如 ntfy.sh)会拒绝每个请求。
PROTECTED_TOPIC环境变量已在v1.4.0中移除。对于受保护主题,请设置由客户端解析的NTFY_TOKEN。
工具与用法
ntfy_me:发送通知
使用自然语言
- 使用 AI 助手时,你可以用自然的措辞请求发送通知:
"ntfyme with a summary of the task when complete"
"Send me a notification when the build is complete"
"Notify me when the task is done"
"Alert me after generating the code"
"Message me when the process finishes"
"Send an alert with high priority"
使用示例
| 输入 | 输出 |
|---|---|
| |
消息参数
| 参数 | 描述 | 必填 | 详细信息 / 示例 |
|---|---|---|---|
title | 通知标题。支持 Unicode 和表情符号 | 是 | — |
message | 通知正文 | 是 | — |
url | 自定义 ntfy 服务 URL。仅当 NTFY_ALLOW_URL_OVERRIDE=true 时提供。NTFY_TOKEN 只会发送到 NTFY_URL 服务;若要使用其他服务,请传入 accessToken | 否 | 默认值:NTFY_URL |
topic | 自定义 ntfy 主题。仅当设置了 NTFY_TOPICS_ALLOWLIST(此时主题仅限 NTFY_TOPIC 和允许列表中的主题)或 NTFY_ALLOW_TOPIC_OVERRIDE=true 时提供;否则,所有通知都会发送到 NTFY_TOPIC | 否 | 默认值:NTFY_TOPIC |
accessToken | 受保护主题的访问令牌。空白值(""、空格)视为未提供 | 否 | 默认值:NTFY_TOKEN |
priority | 消息优先级 | 否 | 默认值:"default"选项: min、low、default、high、max |
tags | 通知标签数组。支持用于视觉提示的表情符号简码 — 请参阅完整列表。 | 否 |
warning → ⚠️white_check_mark → ✅rocket → 🚀tada → 🎉
|
markdown | 用于启用 Markdown 格式的布尔值。检测到 Markdown 语法(标题、列表、代码块、链接、粗体 / 斜体)时会自动启用 — 无需显式设置。也可以手动覆盖。 | 否 |
自动检测:无需配置。手动覆盖示例
|
actions | 用于可点击链接的视图操作对象数组(每条通知最多 3 个)。会自动检测消息正文中的 URL(最多创建 3 个操作)。如需手动控制,每个操作都必须包含 action、label 和一个不含内嵌凭据的 http:// 或 https:// url,并可选择添加 clear 标志。 | 否 |
自动检测示例
会为检测到的 URL 自动创建视图操作。
手动配置示例
|
click | 点按通知本身时打开的链接(ntfy 的点击操作)。必须是 http://、https://、mailto:、geo: 或 ntfy://,且不含内嵌凭据。空白值视为未提供 | 否 | { "click": "https://github.com/user/repo/actions/runs/123" } |
使用自然语言
AI 助手能理解多种请求获取消息的表达方式:
"Show me my recent notifications"
"Get messages from the last hour"
"Find notifications with title 'Build Complete'"
"Search for messages with the test_tube tag"
"Show notifications from the updates topic from the last 24hr" # needs updates in NTFY_TOPICS_ALLOWLIST (or NTFY_ALLOW_TOPIC_OVERRIDE=true)
"Check my latest alerts"
使用示例
| 输入 | 输出 |
|---|---|
| |
获取参数
| 参数 | 说明 | 必填 | 详情 / 示例 |
|---|---|---|---|
url | 自定义 ntfy 服务 URL。仅在设置 NTFY_ALLOW_URL_OVERRIDE=true 时提供。NTFY_TOKEN 仅会发送到 NTFY_URL 服务;如需使用其他服务,请传入 accessToken | 否 | 默认值:NTFY_URL |
topic | 要获取消息的主题。仅在设置 NTFY_TOPICS_ALLOWLIST(仅限 NTFY_TOPIC 和允许列表中的主题)或 NTFY_ALLOW_TOPIC_OVERRIDE=true 时提供 | 否 | 默认值:NTFY_TOPIC{ "topic": "updates", "since": "all" } |
accessToken | 受保护主题的访问令牌。空值(""、空格)视为未提供 | 否 | 默认值:NTFY_TOKEN |
since | 获取多长时间以前的消息 | 否 |
默认值:"10m"选项: '10m'、'1h'、'1d'、时间戳、消息 ID 或 'all'示例: { "since": "30m" }
|
messageId | 按 ID 查找特定消息 | 否 | { "messageId": "xxxxXXXXxxxx" } |
messageText | 查找包含完全匹配文本内容的消息 | 否 | { "messageText": "Build Complete" } |
messageTitle | 查找标题/主题完全匹配的消息 | 否 | { "messageTitle": "Build Complete", "priorities": "high", "since": "1d" } |
priorities | 查找具有指定优先级的消息。可填写单个值或数组。 | 否 | { "priorities": "high" }{ "priorities": ["high", "max"] } |
tags | 查找带有指定标签的消息。可填写单个标签或数组;列出的每个标签都必须存在。 | 否 | { "tags": "error" }{ "tags": ["error", "warning"] } |
两个工具都会为模型返回易于阅读的 content 和机器可读的 structuredContent 对象。对于 ntfy_me_fetch,content 还会以 JSON 格式包含获取到的消息。这些文本来自向主题发布消息的用户,因此应将其视为不可信内容(参见安全)。
| 工具 | 成功(structuredContent) |
|---|---|
ntfy_me | { "success": true, "endpoint": "https://ntfy.sh/your-topic" } |
ntfy_me_fetch | { "success": true, "messageCount": 1, "topics": { "your-topic": [ /* messages */ ] } }当服务返回空响应时(所请求时间范围内没有缓存的消息): { "success": true, "topic": "your-topic", "messages": [] }当响应中不包含有效消息记录时: { "success": true, "messageCount": 0, "topics": {} } |
无效参数(缺少 title、格式错误的 topic、未知的 priority,……)会在工具运行前由 MCP SDK 的架构验证拒绝。返回结果中,isError: true,并附带一条纯文本 MCP error -32602: Input validation error: … 消息,其中会指出字段及预期格式,且不包含 structuredContent。
工具内部发生故障时,会设置 isError: true,并返回 { "success": false, "error": "<message>" }。错误消息会针对无效的 url 或 topic、身份验证失败(HTTP 401/403)、非 2xx 状态码(... Status code: 500),或网络故障给出具体说明。网络故障会使用 Node 的错误代码标明:未建立连接时为 ... could not connect to the ntfy server (ECONNREFUSED);连接后请求中断时为 ... the request to the ntfy server failed (ECONNRESET)(通知可能已送达)。其他错误会以通用消息报告(Failed to send ntfy notification / Failed to fetch ntfy messages),因此原始输入或服务端文本绝不会回显给模型。完整的底层错误会写入服务的 stderr 日志。
安全
ntfy-me-mcp 将所有工具参数视为不可信内容,因为这些参数来自可能读取过提示词注入内容的模型。
- URL: 只接受
http://和https://服务器 URL,包括来自url参数和NTFY_URL的 URL。包含嵌入式凭据的 URL(https://user:pass@…)会被拒绝;请使用NTFY_TOKEN或accessToken。 - 启动检查: 如果
NTFY_TOPIC缺失或无效,或者NTFY_URL无效(不是 http(s),或包含user:pass@),服务器会在启动时停止。错误会指出变量名并写入 stderr,MCP 客户端会在服务器日志中显示该错误。服务器会先检查这些变量,再记录NTFY_URL,因此嵌入式凭据绝不会进入日志。 - 令牌和日志: 访问令牌必须是没有空格的可打印 ASCII 字符。错误会写入 stderr,其中的 bearer 值和 URL 凭据会被遮盖。
- 主题: 只能包含字母、数字、
_和-,长度最多为 128 个字符。 - 错误消息: 只有一组固定的已知安全消息会传递给模型。其他所有内容都会替换为通用消息,因此攻击者控制的文本绝不会被原样返回(参见 #13)。
- 获取的消息是不可信输入。
ntfy_me_fetch会将消息内容交给模型,而任何知道公开主题名称的人都可以向该主题发布消息。在 ntfy.sh 上,请使用难以猜测的主题名称,或使用带访问令牌的受保护主题。 - 目标控制: 默认情况下,所有通知和获取操作都会发送到
NTFY_URL上的NTFY_TOPIC。Agent 不会获得topic或url参数,因此提示词注入调用无法将你的消息,或你的主题名称(在公开的 ntfy.sh 上实际上相当于密码),发送到其他位置(参见 #21)。NTFY_TOPICS_ALLOWLIST=alerts,builds允许 Agent 在你实际订阅的主题和NTFY_TOPIC之间进行选择,但不能选择其他主题(参见 #34)。任何其他主题都会在发出请求前被拒绝,不会静默回退。这些主题名称,包括NTFY_TOPIC,都会出现在工具架构中,因此模型和 MCP 客户端可以看到它们。未设置允许列表时,工具架构中绝不会包含主题名称。在公开的 ntfy.sh 上,主题名称相当于密码,因此只应在你愿意与它们共享名称的情况下使用允许列表,或者使用受保护的主题。NTFY_ALLOW_TOPIC_OVERRIDE=true和NTFY_ALLOW_URL_OVERRIDE=true可分别重新允许使用任意主题或服务器。如果同时设置了NTFY_TOPICS_ALLOWLIST,则以它为准,而不遵循NTFY_ALLOW_TOPIC_OVERRIDE。- 即使启用了 URL 覆盖,
NTFY_TOKEN也只会发送到NTFY_URL服务器。除非调用提供了自己的accessToken,否则其他服务器不会收到任何凭据。
- 令牌: 相比于将
NTFY_TOKEN硬编码在共享的配置文件中,建议使用客户端的机密输入(例如 VS Code${input:…})或环境变量。
发现了漏洞?请通过 GitHub 安全公告 私下报告,而不要在公开议题中报告。
开发与贡献
欢迎贡献!请参阅 CONTRIBUTING.md,其中包含一般指南、设置步骤等内容。
许可证
本项目采用 GNU General Public License v3.0 许可,详情请参阅 LICENSE 文件。
由 gitmotion 用 ❤️ 制作
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
