MCP server for ntfy: publish notifications, read cached messages, manage users and topic access
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add ntfy-mcp -- npx -y @ni-c/ntfy-mcp{
"mcpServers": {
"ntfy-mcp": {
"command": "npx",
"args": ["-y", "@ni-c/ntfy-mcp"],
"env": {
"NTFY_URL": "<ntfy_url>"
}
}
}
}NTFY_URLMCP Servers overview
# ntfy-mcp
<!-- badges: start -->
[](https://github.com/ni-c/ntfy-mcp/actions/workflows/ci.yml)
[](https://scorecard.dev/viewer/?uri=github.com/ni-c/ntfy-mcp)
<a href="https://socket.dev/npm/package/@ni-c/ntfy-mcp"><img src="https://socket.dev/api/badge/npm/package/@ni-c/ntfy-mcp" alt="Socket supply-chain report" height="20"></a>
[](https://glama.ai/mcp/servers/ni-c/ntfy-mcp)
<br>
[](https://www.npmjs.com/package/@ni-c/ntfy-mcp)
[](https://github.com/ni-c/ntfy-mcp/pkgs/container/ntfy-mcp)
[](https://mcp-hub.ni-c.de)
<br>
[](https://ntfy-mcp.ni-c.de)
[](https://github.com/sponsors/ni-c)
<!-- badges: end -->
A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for
[ntfy](https://ntfy.sh), the pub-sub notification service that sends push messages
to your phone with an HTTP request and nothing else.
Lets MCP clients like Claude Code, Claude Desktop or Codex send you notifications,
read back what was sent, revise a notification in place while a job runs, and — with
an admin account — create accounts and grant or revoke their access to topics, which
otherwise means the `ntfy` command line on the server.
Thirteen tools is the ceiling, not the floor: `NTFY_ALLOW_TOOLS=essential` registers
a curated six instead, and a model picks the right tool far more reliably from six
than from thirteen — see [choosing which tools load](#choosing-which-tools-load).
<!-- <picture> is resolved against the colour scheme of the page showing it, so GitHub
picks the variant that matches its own theme toggle. npm strips <picture> and
<source> when it sanitises the README and keeps the <img>, which is why that
fallback brings its own dark card instead of relying on a media query.
The URLs must stay absolute: a relative path is simply invisible on npm. -->
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://ntfy-mcp.ni-c.de/architecture-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://ntfy-mcp.ni-c.de/architecture-light.svg">
<img src="https://ntfy-mcp.ni-c.de/architecture.svg" alt="An MCP client speaks stdio to ntfy-mcp, which publishes notifications and polls the message cache over HTTPS against an ntfy server that pushes them to the subscribed devices" width="800">
</picture>
<!-- Recorded with vhs from docs/demo.tape against a throwaway ntfy container, so it
reproduces without touching a real instance — see the header of that file. -->

## What makes it different
**A progress report stays one notification.** The id `publish_message` returns is
also the notification's sequence id, and `update_message` replaces its content in
place — subscribers watch one notification change from "building" to "deployed"
instead of collecting five.
**`NTFY_TOPICS` is the fence.** On ntfy a topic name is a bearer credential:
knowing it is often the whole of the access control. One variable names the topics
this server may touch and supplies the default when a tool omits one, so the name
stays out of the tool arguments and out of the model's context.
## Requirements
- Node.js ≥ 22
- A reachable **ntfy** server. Credentials are optional: an instance that allows
anonymous access needs none.
## Configuration
| Variable | Required | Description |
| ------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `NTFY_URL` | yes | Base URL, e.g. `https://ntfy.example.net`. There is deliberately no default — `https://ntfy.sh` would make a misconfiguration publish to the public internet. |
| `NTFY_TOKEN` | no | Access token (`tk_…`). Mutually exclusive with the two below. |
| `NTFY_USERNAME` | no | Basic-auth user. Must be set together with `NTFY_PASSWORD`. |
| `NTFY_PASSWORD` | no | Basic-auth password. |
| `NTFY_TOPICS` | no | Comma-separated topics this server may use. The first is the default when a tool omits one, and the list restricts every tool, read and write — access grants included. |
| `NTFY_READ_ONLY` | no | `true`, `1` or `yes` (any case) registers only the six read tools. Default `false`. |
| `NTFY_ALLOW_TOOLS` | no | Comma-separated tool names, `list_*` prefixes, or `essential` for a curated preset |
| `NTFY_DENY_TOOLS` | no | Same syntax; removed from whatever `NTFY_ALLOW_TOOLS` left |
| `NTFY_INSECURE_TLS` | no | `true` accepts self-signed certificates (scoped to this connection) |
Setting `NTFY_TOKEN` together with `NTFY_USERNAME`/`NTFY_PASSWORD` is refused at
startup rather than resolved by a precedence rule: which credential is in force must
never be ambiguous.
> **Use `https://`.** Over plain http the credentials travel unencrypted — basic
> auth is base64, not encryption — and the server prints a warning unless the host is
> local. For self-signed certificates prefer a proper internal CA over
> `NTFY_INSECURE_TLS`.
Without configuration the server still starts and lists its tools (so registries and
inspectors can introspect it), but every call fails with setup instructions instead
of reaching the API.
### Writes are on by default
`NTFY_READ_ONLY` defaults to `false`. ntfy exists to publish, and a read-only default
would ship a notification server that cannot notify — this is the opposite of
[imap-mcp](https://github.com/ni-c/imap-mcp), where the same variable defaults to
`true` because a mailbox is an irreplaceable archive.
Two consequences worth knowing:
- **A typo still fails open.** `true`, `1` and `yes` are all read as read-only, in
any case — a protection switch is parsed generously on purpose. But
`NTFY_READ_ONLY=ture` is not any of them, and because the default is permissive it
leaves the write tools enabled, where in imap-mcp it would fail closed.
- **A client that can publish can publish anywhere on the instance** unless you say
otherwise. Confirmation tokens do not help against that — publishing is not a
destructive operation. `NTFY_TOPICS` is the control that does.
The recommended shape for anything unattended:
```sh
NTFY_TOPICS=deploys # the server can only touch this topic
NTFY_ALLOW_TOOLS=essential # or:
NTFY_DENY_TOOLS=delete_messages,create_user,delete_user,manage_user_access
```
On a self-hosted instance, also give the server its own ntfy account with `write-only`
access to exactly the topics it needs.
### Choosing which tools load
`NTFY_ALLOW_TOOLS` and `NTFY_DENY_TOOLS` take comma-separated tool names; a trailing
`*` matches a whole family. `essential` is a curated preset — `get_server_info`,
`check_topic_access`, `publish_message`, `list_messages`, `get_message` and
`update_message` — marked as such in the
[tool reference](https://ntfy-mcp.ni-c.de/reference/tools). Four of the six are read
tools, so the preset stays useful under `NTFY_READ_ONLY=true`.
```sh
NTFY_ALLOW_TOOLS=essential
NTFY_ALLOW_TOOLS=publish_message,list_messages
NTFY_DENY_TOOLS=delete_*,create_user,manage_user_access
```
An entry that matches no tool aborts startup and names it, so a typo cannot silently
hide a tool — an absent tool is not something anyone traces back to an environment
variable. A filtered tool is never registered, so it is absent from `tools/list` and
unknown to `tools/call` alike, exactly like a write tool under `NTFY_READ_ONLY`.
If you run several of these servers at once, [mcp-hub](https://mcp-hub.ni-c.de) is
the other answer — its `/hub` endpoint replaces every server's tools with six
meta-tools.
## Installation
### Claude Code
```sh
claude mcp add ntfy-mcp -- npx -y @ni-c/ntfy-mcp
```
### Claude Desktop
```json
{
"mcpServers": {
"ntfy-mcp": {
"command": "npx",
"args": ["-y", "@ni-c/ntfy-mcp"],
"env": {
"NTFY_URL": "https://ntfy.example.net",
"NTFY_TOKEN": "…",
"NTFY_TOPICS": "deploys"
}
}
}
}
```
### Codex
```toml
[mcp_servers.ntfy-mcp]
command = "npx"
args = ["-y", "@ni-c/ntfy-mcp"]
env = { NTFY_URL = "https://ntfy.example.net", NTFY_TOKEN = "…", NTFY_TOPICS = "deploys" }
```
### Docker
```sh
docker runWhat people ask about ntfy-mcp
What is ni-c/ntfy-mcp?
+
ni-c/ntfy-mcp is mcp servers for the Claude AI ecosystem. MCP server for ntfy: publish notifications, read cached messages, manage users and topic access It has 0 GitHub stars and its last recorded update is dated 2026-09-07.
How do I install ntfy-mcp?
+
You can install ntfy-mcp by cloning the repository (https://github.com/ni-c/ntfy-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is ni-c/ntfy-mcp safe to use?
+
Our security agent has analyzed ni-c/ntfy-mcp and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains ni-c/ntfy-mcp?
+
ni-c/ntfy-mcp is maintained by ni-c. The last recorded GitHub activity is dated 2026-09-07, with 0 open issues.
Are there alternatives to ntfy-mcp?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy ntfy-mcp to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/ni-c-ntfy-mcp)<a href="https://claudewave.com/repo/ni-c-ntfy-mcp"><img src="https://claudewave.com/api/badge/ni-c-ntfy-mcp" alt="Featured on ClaudeWave: ni-c/ntfy-mcp" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!