Skip to content

v1.5.0

Latest

Choose a tag to compare

@gitmotion gitmotion released this 08 Oct 00:57
63598a9

✨ 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 other topic is rejected before a request is made. It takes precedence over NTFY_ALLOW_TOPIC_OVERRIDE. NTFY_TOPICS_ALLOWLIST=alerts,builds #34
click on ntfy_me Sets the link that opens when the notification itself is tapped (X-Click). { "click": "https://…" }. Accepts http://, https://, mailto:, geo: and ntfy://, without embedded credentials. #26

Important

This release changes some defaults. Read the upgrade notes below before updating.

⚠️ Upgrade notes (behaviour changes)

Change What you'll notice What to do Ref
Topic and server are locked by default The tools no longer offer topic and url. Every notification and fetch goes to NTFY_TOPIC on NTFY_URL. To let the agent choose again, set NTFY_ALLOW_TOPIC_OVERRIDE=true and/or NTFY_ALLOW_URL_OVERRIDE=true. Or allow specific topics with NTFY_TOPICS_ALLOWLIST. #21
NTFY_TOKEN is only sent to NTFY_URL's server Calls to any other server go without the token. A 401 from another server explains why. Pass accessToken in the call for other servers. #21
Node.js 24 or newer is required On Node 22, npm warns EBADENGINE. Upgrade to Node 24, or use the Docker image. #52
Unresolved token placeholders stop the server at startup An NTFY_TOKEN of ${input:…}, ${env:…}, ${NAME} or any other ${…} makes the server exit with a clear error. Before, it either prompted on stdio, which broke the MCP connection, or sent the placeholder as the token, which servers with auth enabled (such as ntfy.sh) reject with a 401. Set NTFY_TOKEN to the token itself, or to a reference your MCP client resolves. #28, #46
Invalid configuration stops the server at startup A missing or invalid NTFY_TOPIC, or an NTFY_URL that isn't http(s) or contains user:pass@, makes the server exit with an error naming the variable. Credentials in NTFY_URL are no longer written to the log. Fix the variable the error names. #30
Action buttons are validated More than 3 actions, or an action link that isn't http(s):// or contains credentials, is rejected. Nothing is sent. Use up to 3 http(s) links. #29
A blank accessToken means "not provided" In v1.4.2 a whitespace-only token was sent as an anonymous request. Now it falls back to NTFY_TOKEN on NTFY_URL's server. Nothing, unless you used a blank token to force anonymous access. #38
Error text no longer echoes input Validation errors keep the field name but drop the value you sent. For example, "unsupported scheme" no longer includes the scheme. Update anything that matches the old error text. #55

🐛 Fixes

Fix Before (v1.4.2) Now Ref
Non-ASCII text Emoji titles failed before anything was sent. Accented (Latin-1) text arrived mangled, e.g. Caf� cr�me. This affected titles, tags, action labels and the fetch filters. Header values are RFC 2047-encoded, which ntfy decodes, so text arrives intact. The server uses Node's native fetch instead of node-fetch. #18
Error logging Request errors were swallowed. They're logged, with tokens and URL credentials redacted. #18
stdout carries only the MCP connection dotenv 18 could print debug lines to stdout and corrupt it. dotenv runs quietly with debug and override off, and ./.env is read as UTF-8. #24, #35
The same accented title sent to ntfy.sh/ntfy-me by v1.5.0 (intact: Café crème, emoji, markdown, click link, action button) and by v1.4.2 (mangled: Caf� cr�me)

Both notifications were sent to the public ntfy.sh/ntfy-me test topic. The one from v1.5.0 shows accents, emoji, markdown, emoji tags, a click link (Copy/Open link) and an action button with a non-ASCII label. The one from v1.4.2 shows the mangled accents. Its emoji title never arrived, because v1.4.2 failed before sending it.

🔒 Security

Area Change Ref
MCP SDK advisory @modelcontextprotocol/sdk 1.29.0 → 1.32.0 clears the high-severity advisory GHSA-6qxp-vccf-f47h. npm audit is clean. #24
Destination control Topic and server are locked by default, and NTFY_TOKEN is only ever sent to NTFY_URL's server. #21
URLs URLs with embedded credentials are rejected. Startup checks NTFY_URL before anything logs it. #18, #30
Links Action and click links are checked for scheme and embedded credentials. #29, #26
Error messages Errors use fixed text and don't echo what the agent sent. #29, #55
Startup Token handling at startup never reads stdin or writes to stdout. #28, #46

📦 Dependencies and runtime

Package v1.4.2 v1.5.0 Note
@modelcontextprotocol/sdk 1.29.0 1.32.0 Fixes GHSA-6qxp-vccf-f47h
zod 4.3.6 4.6.5
dotenv 17.4.1 18.0.5 Options pinned (see Fixes)
markdown-it 14.1.1 15.0.2
node-fetch 3.3.2 removed Replaced by native fetch
prompts 2.4.2 removed No more startup prompt
Node.js (engines) not declared >=24
typescript (dev) 5.9.3 7.0.2
vitest (dev) 4.1.3 5.0.3
@types/node (dev) 25.5.2 24.19.1 Matches the Node 24 minimum
@vitest/coverage-v8 (dev) — 5.0.3 New: coverage in CI

🧪 Tests and CI

Area Change Ref
End-to-end tests npm run test:e2e runs the built server over MCP stdio against real ntfy servers in Docker: one open, one deny-all with auth. The ntfy image is pinned by digest. #31, #49
CI CI now type-checks the tests and checks that the committed build/ matches a clean rebuild. It enforces a coverage floor of 75% (about 84% today) and runs the e2e tests as their own job. #49

📝 Docs

Where Change Ref
README, CONTRIBUTING, AGENTS.md Refreshed to match current behaviour. AGENTS.md is the single source of agent guidance, with CLAUDE.md and .github/copilot-instructions.md as symlinks to it. #23
README "Tested with Ontheia" note #17
README The dead Smithery badge is replaced by the LightNow listing badge, and the Smithery install option is removed. smithery.yaml is kept. #22
.github/agents Outdated Copilot custom agents removed #33

🙌 Thanks to contributors

Every contribution was reviewed and, where needed, updated for the latest code before merging. Thank you!

✅ Verification

Check Result
npm audit (including dev dependencies) 0 vulnerabilities
Type-check (src and tests) and build/ drift check Clean
Unit tests 359/359, coverage about 84%
End-to-end tests against ntfy in Docker 26/26
Install from the packed npm tarball Works, and the ntfy-me-mcp bin serves both tools
Docker image Runs as the non-root mcp_user, and both tools are listed
Live round trip on ntfy.sh/ntfy-me Intact (see the screenshot)
CI on the release commit Green

Full changelog: v1.4.2...v1.5.0 · release PR #60