# ntfy-me-mcp
[](https://www.typescriptlang.org/)
[](https://modelcontextprotocol.io/)
[](https://www.npmjs.com/package/ntfy-me-mcp)
[](https://hub.docker.com/r/gitmotion/ntfy-me-mcp)
[](LICENSE)
[](https://github.com/gitmotion/ntfy-me-mcp)
> A streamlined Model Context Protocol (MCP) server for sending and fetching notifications via the ntfy service (public or self-hosted, with token support) 📲
## Overview
ntfy-me-mcp provides AI assistants with the ability to send real-time notifications to your devices through the [ntfy.sh](https://ntfy.sh) service (either public or selfhosted with token support). Get notified when your AI completes tasks, encounters errors, or reaches important milestones - all without constant monitoring.
The server includes intelligent features like automatic URL detection for creating view actions and smart markdown formatting detection, making it easier for AI assistants to create rich, interactive notifications without extra configuration.
| Preview | Available via | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| Type | Use Case | Example |
|---|---|---|
| NPM / NPX | Recommended for most MCP clients when you want the lightest setup. |
Show config
|
| Local | Use a local checkout when you are developing or changing the server yourself.
Replace /absolute/path/to/ntfy-me-mcp/build/index.js after building.
|
Show config
|
| Docker | Use a containerized setup when Docker is already part of your environment.
- DockerHub: gitmotion/ntfy-me-mcp:latest- GHCR: ghcr.io/gitmotion/ntfy-me-mcp:latest
|
Show config
|
| OpenCode | Add to opencode.json in your project root (for project-level config) or ~/.config/opencode/opencode.json (for global config). Uses "mcp" as the top-level key with type: "local" and command as an array. |
Show config
|
| Claude Code | Quickest: run claude mcp add ntfy-me-mcp -e NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp (add --scope user for all projects, or --scope project to write .mcp.json).
Or add it by hand to .mcp.json at your project root (shared with your team via version control). ${NTFY_TOKEN:-} reads the token from your shell environment and falls back to empty. |
Show config
|
| Copilot CLI | Add to ~/.copilot/mcp-config.json for user-level access across all sessions. Use type: "local" for stdio-based servers like this one. |
Show config
|
| Codex | Run codex mcp add ntfy-me-mcp --env NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp, or add the block to ~/.codex/config.toml by hand. |
Show config
|
| Token Auth | Required for protected topics or self-hosted servers. See Secure Token Handling (vscode) or set NTFY_TOKEN directly. |
Show config
|
| Option | Example |
|---|---|
| Install globally Install once, run anywhere with the ntfy-me-mcp command. |
npm install -g ntfy-me-mcp
|
| Run with npx No install needed — ideal for a quick one-off run or testing. |
npx ntfy-me-mcp
|
| Install locally Clone the repo, install deps, build, and run via npm start. |
Show steps
|
| Input | Output |
|---|---|
|
|
| Parameter | Description | Required | Details / Example |
|---|---|---|---|
title |
The notification title. Unicode and emoji are supported | Yes | — |
message |
The notification body | Yes | — |
url |
Custom ntfy server URL. Only offered when NTFY_ALLOW_URL_OVERRIDE=true. NTFY_TOKEN is only sent to the NTFY_URL server; pass accessToken for another server |
No | Default: NTFY_URL |
topic |
Custom ntfy topic. Only offered when NTFY_TOPICS_ALLOWLIST is set (then limited to NTFY_TOPIC and those topics) or NTFY_ALLOW_TOPIC_OVERRIDE=true; otherwise every notification goes to NTFY_TOPIC |
No | Default: NTFY_TOPIC |
accessToken |
Access token for protected topics. A blank value ("", spaces) counts as not provided |
No | Default: NTFY_TOKEN |
priority |
Message priority level | No | Default: "default"Options: min, low, default, high, max |
tags |
Array of notification tags. Supports emoji shortcodes for visual indicators — see the full list. | No |
warning → ⚠️white_check_mark → ✅rocket → 🚀tada → 🎉
|
markdown |
Boolean to enable markdown formatting. Auto-detected when markdown syntax is present (headers, lists, code blocks, links, bold/italic) — no need to set explicitly. Can be overridden manually. | No |
Auto-detection: no configuration needed.Manual override example
|
actions |
Array of view action objects for clickable links (at most 3 per notification). URLs in the message body are auto-detected (up to 3 actions). For manual control, each action requires action, label, and an http:// or https:// url without embedded credentials, with an optional clear flag. |
No |
Auto-detection example
Automatically creates view actions for detected URLs.
Manual configuration example
|
click |
Link opened when the notification itself is tapped (ntfy's click action). Must be http://, https://, mailto:, geo: or ntfy://, without embedded credentials. A blank value counts as not provided |
No | { "click": "https://github.com/user/repo/actions/runs/123" } |
| Input | Output |
|---|---|
|
|
| Parameter | Description | Required | Details / Example |
|---|---|---|---|
url |
Custom ntfy server URL. Only offered when NTFY_ALLOW_URL_OVERRIDE=true. NTFY_TOKEN is only sent to the NTFY_URL server; pass accessToken for another server |
No | Default: NTFY_URL |
topic |
Topic to fetch messages from. Only offered when NTFY_TOPICS_ALLOWLIST is set (limited to NTFY_TOPIC and those topics) or NTFY_ALLOW_TOPIC_OVERRIDE=true |
No | Default: NTFY_TOPIC{ "topic": "updates", "since": "all" } |
accessToken |
Access token for protected topics. A blank value ("", spaces) counts as not provided |
No | Default: NTFY_TOKEN |
since |
How far back to retrieve messages | No |
Default: "10m"Options: '10m', '1h', '1d', timestamp, message ID, or 'all'Example: { "since": "30m" }
|
messageId |
Find a specific message by its ID | No | { "messageId": "xxxxXXXXxxxx" } |
messageText |
Find messages containing exact text content | No | { "messageText": "Build Complete" } |
messageTitle |
Find messages with exact title/subject | No | { "messageTitle": "Build Complete", "priorities": "high", "since": "1d" } |
priorities |
Find messages with specific priority levels. A single value or an array. | No | { "priorities": "high" }{ "priorities": ["high", "max"] } |
tags |
Find messages with specific tags. A single tag or an array; every listed tag must be present. | No | { "tags": "error" }{ "tags": ["error", "warning"] } |