Mcp Server Ntfy — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server Ntfy (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Let your AI agent reach you on your phone—so you can leave the chat.
An MCP server that sends ntfy push notifications to the human operator and waits for your reply on the same topic—without you watching the session in Cursor.
Long-running agent work creates a bad choice:
Email and Slack are heavy for a quick “deploy finished” or “approve this?” Mobile push is instant, but agents do not have a standard way to use it. ntfy is simple HTTP; this server bridges MCP ↔ ntfy so the model can reach you and read your answer back.
Every notify call:
The agent gets replied with your text, or timeout as a tool error. Server and tool instructions steer the agent to treat ntfy as the only operator channel during an ntfy session (not Cursor chat).
message, optional title; always waits for a replyntfy.sh or self-hostedNTFY_POLL_WINDOW_MS (default 10 minutes) before timeoutntfy client, notify service, separated prompts)Agent (Cursor) → MCP notify tool → POST ntfy topic → your phone (ntfy app)
│
└─ GET …/json?poll=1&since=<unix-time> every 3s until you reply
(only treats messages newer than the outbound message as a reply)NTFY_TOPIC).notify with a message (and optional title).npx -y mcp-server-ntfySee Cursor configuration below.
git clone [email protected]:BirajMainali/mcp-server-ntfy.git
cd mcp-server-ntfy
npm install
npm run buildCopy env template and set your topic (treat it like a password on public ntfy):
cp .env.example .env
# edit NTFY_SERVER_URL and NTFY_TOPICAdd to Cursor Settings → MCP (or .cursor/mcp.json):
{
"mcpServers": {
"ntfy": {
"command": "npx",
"args": ["-y", "mcp-server-ntfy"],
"env": {
"NTFY_SERVER_URL": "https://ntfy.sh",
"NTFY_TOPIC": "your-secret-topic-name"
}
}
}
}Restart MCP / Cursor after changing config.
| Variable | Required | Default | Description |
|---|---|---|---|
NTFY_SERVER_URL | Yes | — | ntfy base URL (e.g. https://ntfy.sh or http://localhost:8080) |
NTFY_TOPIC | Yes | — | Topic name; agent and you must use the same channel |
NTFY_POLL_WINDOW_MS | No | 600000 (10 min) | Max wait for your reply before timeout |
See .env.example.
notify tool| Parameter | Required | Description |
|---|---|---|
message | Yes | Body of the push (plain text); say what you need them to reply |
title | No | Notification title |
Example results
{ "status": "replied", "messageId": "…", "reply": "production" }{
"status": "timeout",
"messageId": "…",
"pollWindowMs": 600000,
"guidance": "No reply yet. Call notify again with a short reminder. Do not guess secrets or approvals."
}(timeout is returned as a tool error; the agent is instructed to call notify again)
The operator is assumed not in Cursor chat—they only see ntfy pushes and replies on the topic.
| Situation | Use notify |
|---|---|
| Starting an ntfy session (e.g. “start ntfy session”) | Yes — then stay in ntfy mode until they close the loop on ntfy (thanks, ok, published, done, or end session) |
| Question, approval, blocker, error, or “done” for the operator | Yes — do not put these only in chat |
| After they reply on ntfy | Yes again for the next step or result |
| Timeout (no reply within poll window) | Call notify again with a short reminder (do not guess secrets or approvals) |
Every notify call blocks until you reply or the poll window expires.
Ntfy session flow (what the prompts teach the agent):
thanks, published, done, or end session).Add a Cursor user rule if you want extra guardrails, e.g. “During an ntfy session I am not at the desk; only ntfy counts.”
.env or put secrets in notification bodies.Clone the repo, then:
npm install
npm run dev # tsx src/index.ts (stdio)
npm run build # compile to dist/
npm testTo run the built server from a checkout in MCP, point args at your local dist/index.js:
{
"mcpServers": {
"ntfy": {
"command": "node",
"args": ["/path/to/mcp-server-ntfy/dist/index.js"],
"env": {
"NTFY_SERVER_URL": "https://ntfy.sh",
"NTFY_TOPIC": "your-secret-topic-name"
}
}
}
}src/
├── index.ts # stdio entry
├── mcp.ts # McpServer wiring
├── config.ts # env → config
├── ntfy/client.ts # publish + poll
├── notify/service.ts # notify orchestration
├── tools/notify.ts # MCP tool registration
└── prompts/ # server + tool descriptionsnpm test for reply-detection unit testsnotify blocks the tool call until you reply or the poll window ends (by design)ISC
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.