Skip to main content
Glama

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 ntfy

  • a simple notification channel for long-running workflows

Typical flow:

  1. A user or external system publishes a message to an ntfy topic.

  2. The MCP client reads it through wait-and-read-inbox or ntfy://inbox.

  3. The agent responds through send-ntfy.

  4. The user receives the response as an ntfy push 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.sh out of the box

Installation

Install globally:

npm install -g nfty-mcp-server

Or run through npx:

npx -y --yes nfty-mcp-server

Quick 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_TOPIC is required

  • --yes keeps npx installs 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:

  • message required

  • title optional

  • priority optional, 1 through 5

  • tags optional

  • attachUrl optional

Example:

{
  "message": "Task completed successfully.",
  "title": "Task Status",
  "priority": 4
}

set-ntfy-topic

Switches the active topic for the current session.

Parameters:

  • topic required

  • baseUrl optional

wait-and-read-inbox

Waits for new messages on the configured topic and returns when at least one arrives.

Parameters:

  • since optional

  • sinceTime optional

  • sinceNow optional, default true

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-inbox times 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.json

  • nfty-debug.log

  • nfty-process.log

  • nfty.lock

Environment Variables

Variable

Description

Default

NTFY_TOPIC

Topic to send/receive messages

required

NTFY_BASE_URL

ntfy server URL

https://ntfy.sh

NTFY_AUTH_TOKEN

Bearer token

optional

NTFY_USERNAME

Basic-auth username

optional

NTFY_PASSWORD

Basic-auth password

optional

NTFY_SINCE

Initial backlog cursor

1h

NTFY_FETCH_TIMEOUT_MS

Fetch timeout in milliseconds

10000

NTFY_CLEAN_ON_STARTUP

Clear logs/cache on startup

true

NTFY_KILL_EXISTING

Kill existing server instances

true

NTFY_DATA_DIR

Data directory override

default platform path

NTFY_CACHE_FILE

Cache file override

{NTFY_DATA_DIR}/nfty-messages.json

CLI Arguments

You can also configure the server directly:

npx nfty-mcp-server --topic my-topic --base-url https://ntfy.sh --auth-token your-token

Supported arguments:

  • --topic

  • --base-url or --server

  • --auth-token

  • --username

  • --password

  • --since

  • --log-incoming

How It Works

  1. The server opens a persistent HTTP subscription to the configured topic.

  2. Incoming messages are received through that live connection.

  3. Recent messages are cached in memory and persisted to disk.

  4. 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 dev

Project layout:

NFTY-MCP/
  src/server.js
  tests/server.test.js
  package.json

Troubleshooting

Messages not arriving:

  • verify NTFY_TOPIC

  • confirm 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_URL

  • verify authentication settings if the topic is protected

License

MIT

Available Tools

3 tools
send-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
titleNo
messageYes
priorityNo
attachUrlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
timeNo
topicYes
statusYes
priorityNo

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes
baseUrlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
topicYes
baseUrlYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoCursor to filter messages after this point
sinceNowNoIf true (default), only returns messages sent after this call starts. If false, returns all messages since the cursor.
sinceTimeNoUnix timestamp - filter messages with time >= sinceTime

Output Schema

ParametersJSON Schema
NameRequiredDescription
messagesYes
newCountYes
lastCursorYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

A3.8/5.0
Disambiguation5/5

Each tool serves a distinct purpose: sending messages, changing topic, and waiting for incoming messages. No overlap, clear boundaries.

Naming Consistency3/5

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.

Tool Count5/5

Three tools is appropriate for a focused notification server: send, configure topic, and receive. Each tool is necessary and none are redundant.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A 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.
    2
    151
    72
    GPL 3.0
  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables sending push notifications via ntfy with a single tool, allowing Claude agents to send notifications directly without shell access.
    MIT

Latest Blog Posts

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