NTFY MCP Server
Enables sending and receiving messages through ntfy.sh with real-time subscriptions, supporting push notifications, bidirectional chat workflows, and message management with optional authentication, priorities, tags, and attachments.
Click on "Install 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 MCP Serversend me a reminder to call mom tomorrow at 3pm"
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 MCP Server
MCP server for ntfy.sh notifications, asynchronous agent messaging, and human-in-the-loop workflows.
It provides a simple way for an MCP client to publish messages to an ntfy topic, maintain a live subscription, and wait for replies without building a custom messaging layer.
What It Does
This server is useful when you need:
push notifications from an MCP-connected agent
asynchronous message exchange between a user and an agent
a lightweight human approval or reply loop over
ntfya simple notification channel for long-running workflows
Typical flow:
A user or external system publishes a message to an
ntfytopic.The MCP client reads it through
wait-and-read-inboxorntfy://inbox.The agent responds through
send-ntfy.The user receives the response as an
ntfypush notification.
Related MCP server: Chat Human MCP Server
Features
publish messages with optional title, priority, tags, and attachments
maintain a persistent subscription for near real-time delivery
switch topics without restarting the server
keep recent messages in memory and on disk
support bearer-token and basic-auth protected topics
work with public
ntfy.shout of the box
Installation
Install globally:
npm install -g nfty-mcp-serverOr run through npx:
npx -y --yes nfty-mcp-serverQuick Start
1. Choose a topic
Create or reuse a topic on ntfy.sh. Public topics are easy to set up, so pick a unique name.
2. Configure your MCP client
For Cursor or VS Code, add this to your MCP settings:
{
"mcpServers": {
"nfty": {
"command": "npx",
"args": ["-y", "--yes", "nfty-mcp-server"],
"env": {
"NTFY_TOPIC": "your-topic-name",
"NTFY_BASE_URL": "https://ntfy.sh"
}
}
}
}For Claude Desktop, add the same server entry to claude_desktop_config.json.
Notes:
NTFY_TOPICis required--yeskeepsnpxinstalls in its own cache instead of polluting a project directory
3. Restart the client
Restart Cursor, VS Code, or Claude Desktop so the MCP server is loaded.
Tools
send-ntfy
Publishes a message to the configured topic.
Parameters:
messagerequiredtitleoptionalpriorityoptional,1through5tagsoptionalattachUrloptional
Example:
{
"message": "Task completed successfully.",
"title": "Task Status",
"priority": 4
}set-ntfy-topic
Switches the active topic for the current session.
Parameters:
topicrequiredbaseUrloptional
wait-and-read-inbox
Waits for new messages on the configured topic and returns when at least one arrives.
Parameters:
sinceoptionalsinceTimeoptionalsinceNowoptional, defaulttrue
Important:
many MCP clients impose an approximately 60-second timeout
if you are waiting on human input, the client or calling agent should retry on timeout
Recommended prompt behavior for agent chat flows:
If
wait-and-read-inboxtimes out while waiting for a user response, retry until a new message arrives.
Resources
ntfy://inbox
Returns recent messages for the configured topic as JSON.
Example shape:
{
"topic": "your-topic",
"baseUrl": "https://ntfy.sh",
"messages": [
{
"id": "message-id",
"time": 1234567890,
"title": "Message Title",
"message": "Message body",
"priority": 3,
"tags": ["tag1"],
"topic": "your-topic"
}
]
}Configuration
Data Storage
The server stores logs, cache files, and lock files in a dedicated data directory so it does not clutter the current project.
Default location:
macOS / Linux:
~/.nfty-mcp-server/Windows:
C:\Users\<user>\.nfty-mcp-server\
Files written there include:
nfty-messages.jsonnfty-debug.lognfty-process.lognfty.lock
Environment Variables
Variable | Description | Default |
| Topic to send/receive messages | required |
| ntfy server URL |
|
| Bearer token | optional |
| Basic-auth username | optional |
| Basic-auth password | optional |
| Initial backlog cursor |
|
| Fetch timeout in milliseconds |
|
| Clear logs/cache on startup |
|
| Kill existing server instances |
|
| Data directory override | default platform path |
| Cache file override |
|
CLI Arguments
You can also configure the server directly:
npx nfty-mcp-server --topic my-topic --base-url https://ntfy.sh --auth-token your-tokenSupported arguments:
--topic--base-urlor--server--auth-token--username--password--since--log-incoming
How It Works
The server opens a persistent HTTP subscription to the configured topic.
Incoming messages are received through that live connection.
Recent messages are cached in memory and persisted to disk.
MCP tools expose send, topic-switching, and wait/read behavior on top of that subscription.
Use Cases
asynchronous user-agent messaging
push notifications for long-running tasks
human approval loops
lightweight operator alerts
agent-to-agent coordination through a shared topic
Development
git clone https://github.com/harshwasan/NFTY-MCP.git
cd NFTY-MCP
npm install
npm test
npm run devProject layout:
NFTY-MCP/
src/server.js
tests/server.test.js
package.jsonTroubleshooting
Messages not arriving:
verify
NTFY_TOPICconfirm the topic exists and is reachable
inspect the debug log in the configured data directory
Connection problems:
verify network access to the configured
NTFY_BASE_URLverify authentication settings if the topic is protected
License
MIT
Available Tools
3 toolssend-ntfySend ntfy messageA
Publish a message to the configured ntfy topic (set in mcp.json). Supports optional title, priority (1-5), tags, and attachUrl. After sending, use wait-and-read-inbox to wait for responses.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| message | Yes | ||
| priority | No | ||
| attachUrl | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| time | No | |
| topic | Yes | |
| status | Yes | |
| priority | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only describes the action as 'publish' without mentioning side effects, idempotency, permission requirements, or rate limits. The description lacks transparency on common behavioral aspects for a send operation.
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 consists of two concise sentences with essential information front-loaded. The first sentence establishes the core purpose, and the second provides a useful cross-reference. No superfluous content.
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 the output schema exists, return values need not be explained. The description covers the basic operation but omits potential constraints (e.g., message length, priority semantics) and error scenarios. It assumes the topic is configured in mcp.json without discussing what happens if it's not. Completeness is adequate but not thorough.
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?
The schema has 0% description coverage, so the description partially compensates by listing all optional parameters and noting priority range (1-5). However, it does not explain the purpose of tags or attachUrl, nor does it provide formats or examples, leaving some semantics unclear.
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 'Publish a message to the configured ntfy topic', specifying the verb and resource. It lists supported optional fields (title, priority, tags, attachUrl). This differentiates it from siblings set-ntfy-topic (configuration) and wait-and-read-inbox (response handling).
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 advises to use wait-and-read-inbox after sending, providing sequential guidance. It does not discuss when not to use this tool or prerequisites, but the context is clear: it is for sending a message to a preconfigured topic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set-ntfy-topicSet ntfy topicB
Change the ntfy topic for this MCP server session (no restart needed).
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| baseUrl | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| topic | Yes | |
| baseUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description should disclose behavioral traits. It only mentions 'no restart needed', but does not explain implications of changing topic mid-session, whether the change is persistent, or what happens to ongoing notifications. Lacks detail on side effects and conditions.
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 and front-loaded with the core action. However, it could be structured to include more detail without being wasteful; currently it is slightly under-specified for a 2-parameter tool.
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?
The description is adequate for a simple tool but fails to address the baseUrl parameter. Completeness is acceptable for a minimal tool but has a clear gap given the presence of an optional parameter.
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 0%, so the description must compensate. It explains the 'topic' parameter implicitly but does not mention the 'baseUrl' parameter at all, leaving its purpose unclear for the agent.
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 verb ('Change') and resource ('ntfy topic'), specifying it is for the session and does not require restart. This distinguishes it from siblings send-ntfy and wait-and-read-inbox, which are about message sending and receiving.
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 implies usage context (changing topic in session) but does not explicitly state when to use compared to siblings or when not to use it. 'No restart needed' hints at immediate effect but lacks comprehensive guidance on appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait-and-read-inboxWait for new messagesA
Waits for new messages on the configured topic (set in mcp.json) and returns when a new message arrives. Does not return until at least one new message is received. Uses the existing subscription. Note: The MCP protocol has a ~60s client-side timeout that cannot be controlled from the server, but this tool will wait as long as possible within that limit.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Cursor to filter messages after this point | |
| sinceNow | No | If true (default), only returns messages sent after this call starts. If false, returns all messages since the cursor. | |
| sinceTime | No | Unix timestamp - filter messages with time >= sinceTime |
Output Schema
| Name | Required | Description |
|---|---|---|
| messages | Yes | |
| newCount | Yes | |
| lastCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it waits indefinitely (subject to timeout), uses existing subscription, and returns only on new message. No contradictions.
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?
Three concise sentences, front-loaded with the core function, each providing essential information without redundancy.
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 the tool's waiting behavior and 3 parameters, the description covers the key aspects including timeout and return condition. Output schema exists, so return values are covered.
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 coverage is 100%, so baseline is 3. The description does not add extra meaning beyond what the input schema already describes for each parameter.
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 action (wait for new messages) and resource (inbox on configured topic), and distinguishes from siblings (send-ntfy, set-ntfy-topic) which are different tools.
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 explains that the tool blocks until a new message arrives and notes the client-side timeout, providing clear usage context. However, it does not explicitly state when not to use it or compare with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool serves a distinct purpose: sending messages, changing topic, and waiting for incoming messages. No overlap, clear boundaries.
Tool names mix patterns: 'send-ntfy' and 'set-ntfy-topic' use verb-ntfy, but 'wait-and-read-inbox' uses a different structure with 'and'. Inconsistent naming conventions.
Three tools is appropriate for a focused notification server: send, configure topic, and receive. Each tool is necessary and none are redundant.
Core publish/subscribe functionality is covered with send and wait. The set-topic tool adds flexibility. A minor gap is lack of explicit unsubscribe or message history, but not essential for core use.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Push notifications for AI agents - send instant iPhone notifications from any MCP client.
Reach your own phone from an AI agent: notifications, approval questions, reminders, ring, files.
Let your AI agent notify you by email, Slack, Discord, or webhook. One tool: send_notification.
Zero-setup WhatsApp notifications + human-in-the-loop for AI agents — text 'join', send in 60s.
Related MCP Servers
- AlicenseAqualityCmaintenanceA streamlined MCP server that enables AI assistants to send real-time notifications to your devices through the ntfy service, allowing you to receive alerts when tasks complete or important events occur.215172GPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to send messages to human users via chat platforms (currently Discord) and optionally wait for human responses, facilitating human-in-the-loop interactions.MIT
- AlicenseBqualityDmaintenanceEnables AI agents to send push notifications to your phone through ntfy, with built-in security controls to prevent data exfiltration. It exposes a single tool notify_user for notifying when tasks complete or need attention.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables sending push notifications via ntfy with a single tool, allowing Claude agents to send notifications directly without shell access.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/harshwasan/NFTY-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server