ntfy-mcp-server
An MCP server that enables agents to send, manage, and replay push notifications via the ntfy service. It supports publishing messages with various options like priority and tags, updating or clearing existing notifications by sequence ID, polling topic history, and searching for emoji tags. It operates over STDIO or Streamable HTTP.
Package and access
Local package with source-attributed installation metadata. Koskamo does not execute packages during review.
Checks and signals
Each line is separate evidence, not a trust score.
- Popularity 25 GitHub stars
What you can do with it
- Send push notifications to phone or desktop
- Update or clear previously sent notifications
- Poll cached messages from ntfy topics
- Look up emoji short codes for notification tags
Source and maintenance
- Last repository push
- Latest release
- v2.4.0
- Maintenance checked
Packages and installation
Source-provided package data. Koskamo has not executed or live-probed this package.
ntfy-mcp-server 2.4.0
{
"version": "2.4.0",
"transport": "stdio",
"identifier": "ntfy-mcp-server",
"runtimeHint": "npx",
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"environmentVariables": [
{
"name": "NTFY_SERVERS",
"format": "string",
"description": "JSON array of `{ baseUrl, authToken? | authUsername?+authPassword? }` entries — one per ntfy server. First entry is the default base. Auth is scoped to the entry's `baseUrl`; per-call `base_url` overrides that match a registered base forward that server's auth. Takes precedence over the single-server NTFY_BASE_URL / NTFY_AUTH_* shorthand."
},
{
"name": "NTFY_BASE_URL",
"format": "string",
"default": "https://ntfy.sh",
"description": "Single-server shorthand — base URL of the ntfy server (no trailing slash). Used when NTFY_SERVERS is unset."
},
{
"name": "NTFY_DEFAULT_TOPIC",
"format": "string",
"description": "Topic used when a tool call omits `topic`. Treat the topic name as a secret — anyone who knows it can publish or subscribe."
},
{
"name": "NTFY_AUTH_TOKEN",
"format": "string",
"description": "Bearer access token (`tk_…`) for the single-server shorthand. Mutually exclusive with NTFY_AUTH_USERNAME / NTFY_AUTH_PASSWORD."
},
{
"name": "NTFY_AUTH_USERNAME",
"format": "string",
"description": "Basic-auth username for the single-server shorthand — must be set together with NTFY_AUTH_PASSWORD."
},
{
"name": "NTFY_AUTH_PASSWORD",
"format": "string",
"description": "Basic-auth password for the single-server shorthand — must be set together with NTFY_AUTH_USERNAME."
},
{
"name": "NTFY_REQUEST_TIMEOUT_MS",
"format": "string",
"default": "15000",
"description": "Per-attempt HTTP timeout in milliseconds, covering the response body. Each call is also capped at 50 s across all attempts."
},
{
"name": "NTFY_MAX_RETRIES",
"format": "string",
"default": "3",
"description": "Max retry attempts for transient upstream failures (5xx, network, 429)."
},
{
"name": "NTFY_BLOCK_PRIVATE_HOSTS",
"format": "string",
"default": "false",
"description": "When true, a per-call `base_url` override must resolve to a public address and its redirects are not followed. Servers registered under NTFY_SERVERS / NTFY_BASE_URL are exempt. Turn it on where callers you do not control can reach the server."
},
{
"name": "NTFY_ENABLE_EMOJI_TAGS",
"format": "string",
"default": "true",
"description": "Set to false to disable the ntfy_search_emoji_tags tool: it leaves tools/list, and the server instructions and ntfy_publish_message stop pointing at it."
},
{
"name": "MCP_LOG_LEVEL",
"format": "string",
"default": "info",
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
},
{
"name": "LOGS_DIR",
"format": "string",
"default": "./logs",
"description": "Directory for file-based logs (Node only; ignored on Workers)."
},
{
"name": "OTEL_ENABLED",
"format": "string",
"default": "false",
"description": "Enable OpenTelemetry instrumentation (spans, metrics, completion logs)."
}
]
}Tools
Reported by the attributed source; not independently observed by Koskamo.
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · repository · passed · metadata changed · updated
- · backfill · recorded · Pre-expansion baseline; unobserved rich metadata remains unknown
Connect from your client
Each snippet configures the same source-provided package; replace placeholders before use.
Cursor
{
"mcpServers": {
"ntfy-mcp-server": {
"command": "npx",
"args": [
"-y",
"ntfy-mcp-server@2.4.0"
],
"env": {
"NTFY_SERVERS": "<YOUR_NTFY_SERVERS>",
"NTFY_BASE_URL": "<YOUR_NTFY_BASE_URL>",
"NTFY_DEFAULT_TOPIC": "<YOUR_NTFY_DEFAULT_TOPIC>",
"NTFY_AUTH_TOKEN": "<YOUR_NTFY_AUTH_TOKEN>",
"NTFY_AUTH_USERNAME": "<YOUR_NTFY_AUTH_USERNAME>",
"NTFY_AUTH_PASSWORD": "<YOUR_NTFY_AUTH_PASSWORD>",
"NTFY_REQUEST_TIMEOUT_MS": "<YOUR_NTFY_REQUEST_TIMEOUT_MS>",
"NTFY_MAX_RETRIES": "<YOUR_NTFY_MAX_RETRIES>",
"NTFY_BLOCK_PRIVATE_HOSTS": "<YOUR_NTFY_BLOCK_PRIVATE_HOSTS>",
"NTFY_ENABLE_EMOJI_TAGS": "<YOUR_NTFY_ENABLE_EMOJI_TAGS>",
"MCP_LOG_LEVEL": "<YOUR_MCP_LOG_LEVEL>",
"LOGS_DIR": "<YOUR_LOGS_DIR>",
"OTEL_ENABLED": "<YOUR_OTEL_ENABLED>"
}
}
}
}Cline
{
"mcpServers": {
"ntfy-mcp-server": {
"command": "npx",
"args": [
"-y",
"ntfy-mcp-server@2.4.0"
],
"env": {
"NTFY_SERVERS": "<YOUR_NTFY_SERVERS>",
"NTFY_BASE_URL": "<YOUR_NTFY_BASE_URL>",
"NTFY_DEFAULT_TOPIC": "<YOUR_NTFY_DEFAULT_TOPIC>",
"NTFY_AUTH_TOKEN": "<YOUR_NTFY_AUTH_TOKEN>",
"NTFY_AUTH_USERNAME": "<YOUR_NTFY_AUTH_USERNAME>",
"NTFY_AUTH_PASSWORD": "<YOUR_NTFY_AUTH_PASSWORD>",
"NTFY_REQUEST_TIMEOUT_MS": "<YOUR_NTFY_REQUEST_TIMEOUT_MS>",
"NTFY_MAX_RETRIES": "<YOUR_NTFY_MAX_RETRIES>",
"NTFY_BLOCK_PRIVATE_HOSTS": "<YOUR_NTFY_BLOCK_PRIVATE_HOSTS>",
"NTFY_ENABLE_EMOJI_TAGS": "<YOUR_NTFY_ENABLE_EMOJI_TAGS>",
"MCP_LOG_LEVEL": "<YOUR_MCP_LOG_LEVEL>",
"LOGS_DIR": "<YOUR_LOGS_DIR>",
"OTEL_ENABLED": "<YOUR_OTEL_ENABLED>"
}
}
}
}VS Code
{
"servers": {
"ntfy-mcp-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"ntfy-mcp-server@2.4.0"
],
"env": {
"NTFY_SERVERS": "<YOUR_NTFY_SERVERS>",
"NTFY_BASE_URL": "<YOUR_NTFY_BASE_URL>",
"NTFY_DEFAULT_TOPIC": "<YOUR_NTFY_DEFAULT_TOPIC>",
"NTFY_AUTH_TOKEN": "<YOUR_NTFY_AUTH_TOKEN>",
"NTFY_AUTH_USERNAME": "<YOUR_NTFY_AUTH_USERNAME>",
"NTFY_AUTH_PASSWORD": "<YOUR_NTFY_AUTH_PASSWORD>",
"NTFY_REQUEST_TIMEOUT_MS": "<YOUR_NTFY_REQUEST_TIMEOUT_MS>",
"NTFY_MAX_RETRIES": "<YOUR_NTFY_MAX_RETRIES>",
"NTFY_BLOCK_PRIVATE_HOSTS": "<YOUR_NTFY_BLOCK_PRIVATE_HOSTS>",
"NTFY_ENABLE_EMOJI_TAGS": "<YOUR_NTFY_ENABLE_EMOJI_TAGS>",
"MCP_LOG_LEVEL": "<YOUR_MCP_LOG_LEVEL>",
"LOGS_DIR": "<YOUR_LOGS_DIR>",
"OTEL_ENABLED": "<YOUR_OTEL_ENABLED>"
}
}
}
}Claude Desktop
{
"mcpServers": {
"ntfy-mcp-server": {
"command": "npx",
"args": [
"-y",
"ntfy-mcp-server@2.4.0"
],
"env": {
"NTFY_SERVERS": "<YOUR_NTFY_SERVERS>",
"NTFY_BASE_URL": "<YOUR_NTFY_BASE_URL>",
"NTFY_DEFAULT_TOPIC": "<YOUR_NTFY_DEFAULT_TOPIC>",
"NTFY_AUTH_TOKEN": "<YOUR_NTFY_AUTH_TOKEN>",
"NTFY_AUTH_USERNAME": "<YOUR_NTFY_AUTH_USERNAME>",
"NTFY_AUTH_PASSWORD": "<YOUR_NTFY_AUTH_PASSWORD>",
"NTFY_REQUEST_TIMEOUT_MS": "<YOUR_NTFY_REQUEST_TIMEOUT_MS>",
"NTFY_MAX_RETRIES": "<YOUR_NTFY_MAX_RETRIES>",
"NTFY_BLOCK_PRIVATE_HOSTS": "<YOUR_NTFY_BLOCK_PRIVATE_HOSTS>",
"NTFY_ENABLE_EMOJI_TAGS": "<YOUR_NTFY_ENABLE_EMOJI_TAGS>",
"MCP_LOG_LEVEL": "<YOUR_MCP_LOG_LEVEL>",
"LOGS_DIR": "<YOUR_LOGS_DIR>",
"OTEL_ENABLED": "<YOUR_OTEL_ENABLED>"
}
}
}
}Let your agent find its tools
Find servers like ntfy-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.