1. Conduid
  2. Developer Tools
  3. gitmotion/ntfy-me-mcp
MCP server · Developer Tools

gitmotion/ntfy-me-mcp

An ntfy MCP server for sending/fetching ntfy notifications to self-hosted or ANY ntfy.sh server from AI Agents 📤 (supports secure token auth & more - use with npx or docker!)

64Good

Scored 10 hours ago · breakdown

About gitmotion/ntfy-me-mcp

gitmotion/ntfy-me-mcp is an MCP server published by gitmotion in the Developer Tools category: an ntfy MCP server for sending/fetching ntfy notifications to self-hosted or ANY ntfy.sh server from AI Agents 📤 (supports secure token auth & more - use with npx or docker!).

The repository has 76 stars and 17 forks, with the last commit 10 days ago. Recent commit activity is the strongest signal that reported issues will get attention.

Install

From source
git clone https://github.com/gitmotion/ntfy-me-mcp

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about gitmotion/ntfy-me-mcp

Powered by Claude · Grounded in docs

I know everything about gitmotion/ntfy-me-mcp. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 10 hours ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • ✓Tests presentA test suite exists in the repository.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
  • !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.

Releases

v1.5.0v1.5.0 · 8 Oct 2026✨ New | Feature | What it does | How to use | Ref | |---|---|---|---| | `NTFY_TOPICS_ALLOWLIST` | Lets the agent choose only among the topics you subscribe to. Both tools offer `topic` as a list of `NTFY_TOPIC` plus these topics. Any…
v1.4.2v1.4.2 · 11 Apr 2026ntfy-me-mcp v1.4.2 What's Changed fix: disregard empty strings for ntfyTopic & priority + README/CONTRIBUTING cleanup by @gitmotion in https://github.com/gitmotion/ntfy-me-mcp/pull/16 | Input | Result | |--------|--------| | <img…
v1.4.1v1.4.1 · 8 Apr 2026Minor Dev Update Update publish-docker.yml workflow dockerhub username to vars allow for proper attestation link and image tags in summary generation workflow summary: https://github.com/gitmotion/ntfy-me-mcp/actions/runs/24125656035 Full…
v1.4.0v1.4.0 · 8 Apr 2026ntfy-me-mcp v1.4.0 Release Notes This release delivers a security and maintainability upgrade, addressing prompt-injection risks, improving schema validation, and refactoring the codebase for clarity and testability. Highlights Security…
v1.3.5v1.3.5 · 6 Aug 2025What's Changed Fixes: bugfix: print/log to sys.stderr insted of sys.stdout #6 - thanks @michalcamona 🙏🏻 bugfix: print/log to sys.stderr insted of sys.stdout #7 - thanks @michalcamona 🙏🏻 Enhancements: introduce logger abstraction, update…

README

ntfy-me-mcp

TypeScript Model Context Protocol NPM Version Docker Image Version License GitHub

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.

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

  1. Install the ntfy app on your device
  2. Subscribe to your chosen topic (the same as your NTFY_TOPIC setting)

Configuration

Environment Variables

Create a .env file by copying the example: cp .env.example .env — see .env.example for reference.

Variable Required Default Description
NTFY_TOPIC Yes — The ntfy topic to publish notifications to
NTFY_URL No https://ntfy.sh ntfy server URL — change this for self-hosted instances(include port if needed, e.g. https://your-server.com:8443)
NTFY_TOKEN No — Access token for protected topics or private servers. Only ever sent to the NTFY_URL server
NTFY_ALLOW_TOPIC_OVERRIDE No false Set to true to let the agent choose a per-call topic. When off (the default), the topic parameter isn't offered to the agent and every notification and fetch uses NTFY_TOPIC
NTFY_TOPICS_ALLOWLIST No — Comma-separated topics you subscribe to, e.g. alerts,builds,deploys. When set, the agent may send to or fetch from NTFY_TOPIC or one of these topics, and no other topic. The topic parameter is offered as a list of exactly those topics. Takes precedence over NTFY_ALLOW_TOPIC_OVERRIDE. An invalid entry, or a value that lists no topics (e.g. ,), stops the server at startup
NTFY_ALLOW_URL_OVERRIDE No false Set to true to let the agent choose a per-call server url. When off (the default), the url parameter isn't offered and every request goes to NTFY_URL. Even when on, NTFY_TOKEN is only sent to NTFY_URL

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_TOKEN env variable or in the accessToken parameter 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_TOKEN in config files. (Otherwise use your token directly)
  • Use matching values like this in your mcp.json file:
// 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
env.NTFY_TOKEN "${input:ntfy_token}" References the secure prompt-backed token value
inputs[].id "ntfy_token" Defines the input name used by NTFY_TOKEN
inputs[].type "promptString" 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), set NTFY_TOKEN to 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 saying NTFY_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 with NTFY_TOKEN contains an unresolved ${…} placeholder instead of sending it as a token, which ntfy servers with auth enabled (such as ntfy.sh) reject on every request.

The PROTECTED_TOPIC env var was removed in v1.4.0. For protected topics, set NTFY_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 (structuredContent)
ntfy_me { "success": true, "endpoint": "https://ntfy.sh/your-topic" }
ntfy_me_fetch { "success": true, "messageCount": 1, "topics": { "your-topic": [ /* messages */ ] } }When the server returns an empty response (no cached messages in the requested window): { "success": true, "topic": "your-topic", "messages": [] }When the response contains no valid message records: { "success": true, "messageCount": 0, "topics": {} }

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:// and https:// server URLs are accepted, from both the url argument and NTFY_URL. URLs with embedded credentials (https://user:pass@…) are rejected; use NTFY_TOKEN or accessToken.
  • Startup checks: a missing or invalid NTFY_TOPIC, or an invalid NTFY_URL (not http(s), or containing user: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 logging NTFY_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_fetch hands 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_TOPIC on NTFY_URL. The agent is never offered the topic or url parameters, 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,builds lets the agent choose among the topics you actually subscribe to, plus NTFY_TOPIC, and no other topic (see #34). Any other topic is rejected before a request is made, with no silent fallback. These topic names, including NTFY_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=true and NTFY_ALLOW_URL_OVERRIDE=true opt back in to any topic or server, independently. If NTFY_TOPICS_ALLOWLIST is also set, it wins over NTFY_ALLOW_TOPIC_OVERRIDE.
    • Even with url overrides on, NTFY_TOKEN is only ever sent to the NTFY_URL server. Other servers get no credentials unless the call supplies its own accessToken.
  • Tokens: prefer your client's secret input (e.g. VS Code ${input:…}) or an environment variable over hardcoding NTFY_TOKEN in 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

README fetched from the repository 10 hours ago. The original is authoritative.

Questions

About gitmotion/ntfy-me-mcp

How do I install gitmotion/ntfy-me-mcp?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is gitmotion/ntfy-me-mcp safe to use with an AI agent?

Its trust score is 64 out of 100 (good). It passes 5 of the 6 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is gitmotion/ntfy-me-mcp still maintained?

Yes — the latest release is v1.5.0 (8 Oct 2026), and the last commit was 10 days ago. The repository has 76 stars and 11 open issues.