ntfy-mcp
Enables sending push notifications via ntfy with a single tool, allowing Claude agents to send notifications directly without shell access.
README
ntfy-mcp
MCP server for sending push notifications via ntfy. One tool, no database, stateless — it's an HTTP proxy between Claude and your ntfy instance.
I added this because every automated workflow on claudebox already uses ntfy for push notifications (memory pipeline completions, backup results, resource alerts), but agents had to go through a shell-access MCP or write raw curl to send them. This gives every Claude Code session a native send_notification tool call instead.
flowchart LR
A["Claude Code agent"] -->|"send_notification"| B["ntfy-mcp\n:8484"]
B -->|"HTTP POST"| C["ntfy server"]
C --> D["subscribers\nmobile · web · desktop"]
Tool
send_notification
send_notification(
message,
topic?,
title?,
priority?,
tags?,
markdown?,
click?,
icon?
)
| Parameter | Type | Default | Description |
|---|---|---|---|
message |
string | required | Notification body. Supports Markdown if markdown=true. |
topic |
string | NTFY_DEFAULT_TOPIC |
ntfy topic to publish to. |
title |
string | — | Bold title shown above the message. |
priority |
string | default |
min | low | default | high | urgent (alias: max) |
tags |
list[str] | — | Emoji short codes or plain tags, e.g. ["white_check_mark", "claudebox"]. See the ntfy emoji list. |
markdown |
bool | false |
Enable Markdown rendering in the notification body. |
click |
string | — | URL to open when the notification is tapped. |
icon |
string | — | URL of an icon image to display with the notification. |
Returns {"ok": true, "topic": "...", "status": 200} on success, or {"ok": false, "error": "..."} on failure.
Setup
Docker
No external dependencies — the container only needs outbound HTTP access to your ntfy instance.
services:
ntfy-mcp:
build:
context: /path/to/ntfy-mcp
dockerfile: Dockerfile
container_name: ntfy-mcp
ports:
- "8484:8484"
environment:
- NTFY_URL=https://ntfy.yourdomain.com
- NTFY_DEFAULT_TOPIC=claudebox
- NTFY_TOKEN= # leave empty for open instances
- MCP_PORT=8484
networks:
- claudebox-net
restart: unless-stopped
networks:
claudebox-net:
external: true
cd /path/to/docker/ntfy-mcp
docker compose up -d
docker logs ntfy-mcp --tail 10
The container logs should show Uvicorn running on http://0.0.0.0:8484.
Claude Code
Add to ~/.claude/settings.json under mcpServers:
{
"mcpServers": {
"ntfy": {
"type": "streamable-http",
"url": "http://localhost:8484/mcp"
}
}
}
LibreChat
Add to librechat.yaml under mcpServers:
mcpServers:
ntfy:
type: streamable-http
url: http://host.docker.internal:8484/mcp
Note the difference: Claude Code uses localhost; LibreChat containers reach the host via host.docker.internal.
Environment Variables
| Variable | Default | Description |
|---|---|---|
NTFY_URL |
https://ntfy.sh |
Base URL of your ntfy instance |
NTFY_DEFAULT_TOPIC |
claudebox |
Topic used when topic is not passed to the tool |
NTFY_TOKEN |
(empty) | Bearer token for authenticated instances. Leave empty for open instances. |
MCP_PORT |
8484 |
Port the MCP server listens on |
Copy .env.example to .env and fill in the values you need. Blank values use the defaults shown above.
Testing
pip install -r requirements.txt -r requirements-dev.txt
pytest -v
Nine tests covering header construction, priority validation, default topic fallback, HTTP error handling, and bearer token injection.
Gotchas
Topic values containing / or .. are rejected. The handler returns {"ok": false, "error": "Invalid topic: ..."} for any topic that would alter the URL path. Topics must be plain strings with no path separators.
Open vs authenticated instances. If NTFY_TOKEN is empty, no Authorization header is sent. If your ntfy instance requires auth and the token is missing or wrong, you'll get a 401 back as {"ok": false, "status": 401, "error": "..."}.
Port 8484 is the default. Adjust if you have a conflict — set MCP_PORT in the environment and update the ports binding in the compose file to match.
Standalone Value
High. If you're already running ntfy for push notifications, this is a 10-minute integration that makes every Claude agent a first-class notification sender. No dependencies, no state, nothing to maintain.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。