ntfy-me-mcp
This server allows sending real-time notifications via ntfy with rich features and customization options.
Rich Notifications: Send notifications with titles, summaries, and priority levels (min, low, default, high, max)
Formatting Options: Support for Markdown text formatting
Customization: Add tags and emojis, specify custom topics and URLs
Security: Secure notifications with optional access tokens
Integration: Works with public or self-hosted ntfy servers
Smart Features: Automatic URL detection for clickable links
Provides containerized deployment option with official Docker images available on Docker Hub and GitHub Container Registry for running the server in a containerized environment.
Allows configuration of the server using environment variables stored in .env files, supporting settings for notification topics, server URLs, and authentication tokens.
Supports rich text formatting in notifications, with automatic detection and rendering of markdown syntax for creating formatted lists, code blocks, links, tables, and other text styling.
Enables sending real-time push notifications to devices through the ntfy service (public or self-hosted). Supports rich notifications with customizable titles, priorities, emoji tags, and markdown formatting.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ntfy-me-mcpnotify me when the backup is complete"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 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.
Related MCP server: ntfy-mcp-server
Features
🚀 Quick Setup: Run with npx or docker!
🔔 Real-time Notifications: Get updates on your phone/desktop when tasks complete
🎨 Rich Notifications: Support for topic, title, priorities, emoji tags, and detailed messages
🔍 Notification Fetching: Fetch and filter cached messages from your ntfy topics
🎯 Smart Action Links: Automatically detects URLs in messages and creates view actions
🔗 Click URLs: Choose the link that opens when the notification is tapped
📄 Intelligent Markdown: Auto-detects and enables markdown formatting when present
🔒 Secure: Optional authentication with access tokens
🔑 Input Masking: Securely store your ntfy token in your vs config!
🌐 Self-hosted Support: Works with both ntfy.sh and self-hosted ntfy instances
Coming soon...
📨 Email: Send notifications to email (requires ntfy email server configuration)
🖼️ Image urls: Intelligent image url detection to automatically include image urls in messages and notifications
🏁 and more!
Table of Contents
Quickstart - MCP Server Configuration
Choose the config shape that matches your client. All examples below use NTFY_TOPIC as the required variable and keep the optional auth settings commented out until you need them.
Tested with Ontheia: Ontheia, a self-hosted, open-source AI agent platform, reports that ntfy-me-mcp works with it and lists it among its compatible MCP servers.
Requirements: Node.js 24 or newer for the npx, global and local options. CI and the Docker image use Node 24. Node 22 and earlier aren't supported (npm warns
EBADENGINE). The Docker option needs only Docker.
Configuration Examples
[mcp_servers.ntfy-me-mcp.env] NTFY_TOPIC = "your-ntfy-topic" NTFY_URL = "https://ntfy.sh"
NTFY_TOKEN = "your-access-token"
</details>
</td>
</tr>
<tr>
<td>Token Auth</td>
<td>Required for protected topics or self-hosted servers. See <a href="#secure-token-handling-vscode">Secure Token Handling (vscode)</a> or set <code>NTFY_TOKEN</code> directly.</td>
<td>
<details>
<summary>Show config</summary>
<pre><code>{
"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": "your-access-token" } } }
Installation
If you need to install and run the server directly (alternative to the MCP configuration above):
Setting Up the Notification Receiver
Install the ntfy app on your device
or deploy your own ntfy server: https://docs.ntfy.sh/install/
Subscribe to your chosen topic (the same as your
NTFY_TOPICsetting)
Configuration
Environment Variables
Create a .env file by copying the example: cp .env.example .env — see .env.example for reference.
Variable | Required | Default | Description |
| Yes | — | The ntfy topic to publish notifications to |
| No |
| ntfy server URL — change this for self-hosted instances(include port if needed, e.g. |
| No | — | Access token for protected topics or private servers. Only ever sent to the |
| No |
| Set to |
| No | — | Comma-separated topics you subscribe to, e.g. |
| No |
| Set to |
Authentication
This MCP server supports both authenticated and unauthenticated ntfy endpoints:
Public Topics: When using public topics on ntfy.sh or other public servers, no authentication is required.
Protected Topics:
For protected topics or private servers, you need to provide an access token via
NTFY_TOKENenv variable or in theaccessTokenparameter of the tool.If authentication is required but not provided, you'll receive a clear error message explaining how to add your token.
Secure Token Handling (vscode)
If your client supports prompt-based secret inputs (i.e. VS Code), prefer that over hardcoding
NTFY_TOKENin config files. (Otherwise use your token directly)Use matching values like this in your
mcp.jsonfile:
// 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}"
}
}
}
}Field | Value | Purpose |
|
| References the secure prompt-backed token value |
|
| Defines the input name used by |
|
| Prompts the user for the token at runtime |
Your MCP client must resolve
"${input:ntfy_token}"before it launches the server, as VS Code does, so the server receives the real token. If your client doesn't support${input:…}references (Claude Desktop, Claude Code, Codex and others), setNTFY_TOKENto the real token or to an environment-variable reference your client does support. If the placeholder reaches the server unresolved, the server can't ask you for the token (stdin and stdout carry the MCP connection), so it exits at startup with an error sayingNTFY_TOKEN is an unresolved ${input:…} reference, which your client shows in its MCP server log. The same goes for any other placeholder your client didn't substitute, such as${env:NTFY_TOKEN}or${NTFY_TOKEN}: the server exits withNTFY_TOKEN contains an unresolved ${…} placeholderinstead of sending it as a token, which ntfy servers with auth enabled (such as ntfy.sh) reject on every request.The
PROTECTED_TOPICenv var was removed inv1.4.0. For protected topics, setNTFY_TOKEN, resolved by your client, instead.
Tools & Usage
ntfy_me: Sending Notifications
Using Natural Language
When working with your AI assistant, you can use natural phrases to request notifications:
"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"Example Usage
Message Parameters
ntfy_me_fetch: Polling Notifications
Using Natural Language
AI assistants understand various ways to request message fetching:
"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"Example Usage
Fetch Parameters
Tool output
Both tools return human-readable content for the model and a machine-readable structuredContent object. For ntfy_me_fetch, content also includes the fetched messages as JSON. That text comes from whoever published to the topic, so treat it as untrusted (see Security).
Tool | Success ( |
|
|
|
|
Invalid arguments (a missing title, a malformed topic, an unknown priority, …) are rejected by the MCP SDK's schema validation before the tool runs. They come back with isError: true and a text-only MCP error -32602: Input validation error: … message that names the field and the expected format, with no structuredContent.
Failures inside the tool set isError: true and return { "success": false, "error": "<message>" }. The error message is specific for an invalid url or topic, an authentication failure (HTTP 401/403), a non-2xx status code (... Status code: 500), or a network failure, named with Node's error code: ... could not connect to the ntfy server (ECONNREFUSED) when no connection was made, or ... the request to the ntfy server failed (ECONNRESET) when it broke after connecting (the notification may have been delivered). Anything else is reported generically (Failed to send ntfy notification / Failed to fetch ntfy messages), so raw input or server text is never echoed back to the model. The full underlying error is written to the server's stderr log.
Security
ntfy-me-mcp treats every tool argument as untrusted, because it comes from a model that may have read prompt-injected content.
URLs: only
http://andhttps://server URLs are accepted, from both theurlargument andNTFY_URL. URLs with embedded credentials (https://user:pass@…) are rejected; useNTFY_TOKENoraccessToken.Startup checks: a missing or invalid
NTFY_TOPIC, or an invalidNTFY_URL(not http(s), or containinguser:pass@), stops the server at startup. The error names the variable and is written to stderr, which your MCP client shows in its server log. The server checks these before loggingNTFY_URL, so embedded credentials never reach the log.Tokens and logs: access tokens must be printable ASCII without spaces. Errors are written to stderr with bearer values and URL credentials redacted.
Topics: letters, numbers,
_and-only, up to 128 characters.Error messages: only a fixed set of known-safe messages reaches the model. Everything else is replaced with a generic message, so attacker-controlled text is never reflected back (see #13).
Fetched messages are untrusted input.
ntfy_me_fetchhands message content to the model, and anyone who knows a public topic's name can publish to it. On ntfy.sh, use a hard-to-guess topic name, or a protected topic with an access token.Destination control: by default, every notification and fetch goes to
NTFY_TOPIConNTFY_URL. The agent is never offered thetopicorurlparameters, so a prompt-injected call can't send your messages, or your topic name (which is effectively a password on public ntfy.sh), anywhere else (see #21).NTFY_TOPICS_ALLOWLIST=alerts,buildslets the agent choose among the topics you actually subscribe to, plusNTFY_TOPIC, and no other topic (see #34). Any other topic is rejected before a request is made, with no silent fallback. These topic names, includingNTFY_TOPIC, appear in the tool schema, so the model and your MCP client can see them. Without an allowlist, the tool schema never contains a topic name. On public ntfy.sh, a topic name works like a password, so only use the allowlist with names you're comfortable sharing with them, or with protected topics.NTFY_ALLOW_TOPIC_OVERRIDE=trueandNTFY_ALLOW_URL_OVERRIDE=trueopt back in to any topic or server, independently. IfNTFY_TOPICS_ALLOWLISTis also set, it wins overNTFY_ALLOW_TOPIC_OVERRIDE.Even with url overrides on,
NTFY_TOKENis only ever sent to theNTFY_URLserver. Other servers get no credentials unless the call supplies its ownaccessToken.
Tokens: prefer your client's secret input (e.g. VS Code
${input:…}) or an environment variable over hardcodingNTFY_TOKENin a config file you share.
Found a vulnerability? Please report it privately through GitHub security advisories rather than in a public issue.
Development & Contributions
Contributions are welcome! Please see CONTRIBUTING.md, which include general guidelines, setup steps, etc.
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Made with ❤️ by gitmotion
Available Tools
2 toolsntfy_meSend ntfy notificationA
Send a notification to the user via ntfy. Use this tool when the user asks to 'send a notification', 'notify me', 'send me an alert', 'message me', 'ping me', or any similar request. This tool is perfect for sending status updates, alerts, reminders, or notifications about completed tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Notification title/status | |
| message | Yes | Notification message/body | |
| url | No | Optional custom ntfy URL (defaults to NTFY_URL env var or https://ntfy.sh) | |
| topic | No | Optional custom ntfy topic (defaults to NTFY_TOPIC env var) | |
| accessToken | No | Optional access token for authentication (defaults to NTFY_TOKEN env var) | |
| priority | No | Message priority level | default |
| tags | No | Tags for the notification | |
| markdown | No | Whether to format the message with Markdown support | |
| actions | No | Optional array of view actions to add to the notification |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It describes the basic function (sending a notification) and lists features like priority and tags, but it does not mention success/error behavior, blocking, or network requirements. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: three sentences that cover the tool's purpose, usage triggers, and suitable use cases. It is front-loaded and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, no output schema, and no annotations, the description could be more complete. It explains the tool's function and gives usage context, but it omits details about return values or error handling. However, the schema fully describes the parameters, so the description is not severely lacking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds minimal extra context beyond the parameter descriptions in the schema, such as noting that the URL defaults to an environment variable. It does not provide additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Send a notification to the user via ntfy.' It lists example user prompts, making the purpose unmistakable. This effectively distinguishes it from the sibling tool 'ntfy_me_fetch', which likely fetches notifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use this tool when the user asks to send a notification...' and lists several example phrases. It also mentions suitability for status updates, alerts, etc. However, it does not provide guidance on when not to use it or compare with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ntfy_me_fetchFetch ntfy messagesA
Fetch cached messages from an ntfy server topic. Use this tool when the user asks to 'show notifications', 'get my messages', 'show my alerts', 'find notifications', 'search notifications', or any similar request. Great for finding recent notifications, checking message history, or searching for specific notifications by content, title, tags, or priority.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional custom ntfy server URL (defaults to NTFY_URL env var or https://ntfy.sh) | |
| topic | No | Optional custom ntfy topic/channel to get messages from (defaults to NTFY_TOPIC env var) | |
| accessToken | No | Optional access token for authentication (defaults to NTFY_TOKEN env var) | |
| since | No | How far back to retrieve messages: timespan (e.g., '10m', '1h', '1d'), timestamp, message ID, or 'all' for all messages. Default: 10 minutes | |
| messageId | No | Find a specific message by its ID | |
| messageText | No | Find messages containing this exact text content | |
| messageTitle | No | Find messages with this exact title/subject | |
| priorities | No | Find messages with specific priority levels (min, low, default, high, max) | |
| tags | No | Find messages with specific tags (e.g., 'error', 'warning', 'success') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description indicates a read-only fetch operation and mentions default parameter sources. Lacks details on rate limits, authentication requirements beyond token, or error handling, but basic transparency is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is four sentences with front-loaded main purpose and clear structure. Could be slightly more concise but is efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage scenarios, and parameter defaults. No output schema, so return values are implicit. Additional context like output format would improve completeness, but it's adequate for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 9 parameters with 100% description coverage. The description adds context about defaults and usage but does not significantly go beyond the schema's own parameter descriptions, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Fetch' and the resource 'cached messages from an ntfy server topic'. Provides specific example user requests, distinguishing from sibling tool (ntfy_me).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use this tool with example phrases like 'show notifications' and 'get my messages'. Does not state when not to use or alternatives, but given only one sibling, the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.4.2- Added
ntfy_me - Added
ntfy_me_fetch
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one sends notifications, the other retrieves cached messages. There is no overlap or ambiguity in their functions.
Both tools share the prefix 'ntfy_me_', but the first tool lacks a specific verb suffix (e.g., 'send') while the second has '_fetch'. The pattern is mostly consistent but has a minor deviation.
With only two tools, the set is minimal but appropriate for the narrow scope of sending and fetching notifications. It feels slightly thin but not unreasonable for a simple domain.
The tool set covers the basic operations of sending and retrieving notifications, but lacks additional expected functionality such as deleting or managing topics, leaving some gaps for full lifecycle management.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Cloud-hosted MCP server for durable AI memory
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThe MCP server that keeps you informed by sending the notification on phone using ntfy.sh1,121 npm45Apache 2.0
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol server enabling AI systems to send real-time notifications to phones, desktops, and other devices through the ntfy publish/subscribe service.1,121 npm23Apache 2.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to send notifications and request user input via Discord during long-running tasks. It allows users to remotely interact with their AI assistants and provide feedback through the Discord messaging platform.26 npm2MIT
- AlicenseCqualityDmaintenanceMCP server for sending notifications to ntfy.sh or self-hosted ntfy instances.29 npmMIT