Ntfy MCP Server について
Ntfy MCP Serverは、ntfyのプッシュ通知を管理する機能をMCPクライアントに提供します。通知の送信・更新・消去やトピック履歴の取得に対応し、STDIOとStreamable HTTPを利用できます。
主な機能
- 01通知の送信と更新
- 02送信済み通知の消去と削除
- 03トピック履歴のフィルタリング取得
- 04絵文字タグコードの検索
- 05STDIOとStreamable HTTPに対応
活用シーン
- 01AIワークフローからntfyアラートを送信
- 02アラート用トピックの最近のメッセージを確認
- 03送信済み通知を消去または削除
MCP 対応
4つのツールと`ntfy://{topic}`リソースをMCPクライアントに公開します。STDIOとStreamable HTTPのトランスポートに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y ntfy-mcp-serverNTFY_SERVERSJSON 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.NTFY_BASE_URLSingle-server shorthand — base URL of the ntfy server (no trailing slash). Used when NTFY_SERVERS is unset.NTFY_DEFAULT_TOPICTopic used when a tool call omits `topic`. Treat the topic name as a secret — anyone who knows it can publish or subscribe.NTFY_AUTH_TOKENシークレットBearer access token (`tk_…`) for the single-server shorthand. Mutually exclusive with NTFY_AUTH_USERNAME / NTFY_AUTH_PASSWORD.NTFY_AUTH_USERNAMEシークレットBasic-auth username for the single-server shorthand — must be set together with NTFY_AUTH_PASSWORD.NTFY_AUTH_PASSWORDシークレットBasic-auth password for the single-server shorthand — must be set together with NTFY_AUTH_USERNAME.NTFY_REQUEST_TIMEOUT_MSPer-attempt HTTP timeout in milliseconds, covering the response body. Each call is also capped at 50 s across all attempts.NTFY_MAX_RETRIESMax retry attempts for transient upstream failures (5xx, network, 429).NTFY_BLOCK_PRIVATE_HOSTSWhen 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.NTFY_ENABLE_EMOJI_TAGSSet 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.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').LOGS_DIRDirectory for file-based logs (Node only; ignored on Workers).OTEL_ENABLEDEnable OpenTelemetry instrumentation (spans, metrics, completion logs).MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_SESSION_MODEHTTP session model: 'auto', 'stateful', or 'stateless'. This server requires 'stateful' over HTTP — the consent prompt on destructive and outbound calls is a multi-round-trip request that a 2025-era HTTP client can only complete over a live session — so an HTTP start with 'stateless' is refused. 'auto' resolves to 'stateful'; stdio ignores the setting.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEシークレットAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_REQUEST_STATE_KEYシークレットRecommended for HTTP. Key (>= 32 bytes, the same on every instance) that seals the requestState carrying the consent-record id of a confirmation prompt, bound to the caller for 900 s; a forged, tampered, or expired state is rejected before the handler runs.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
4掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| call | string | いいえ | 音声通話を発信します。`+CCNNNNNNNNNN` を指定するか、認証済みユーザーの最初の確認済み電話番号を使う場合は `'yes'` を指定します。認証済みの ntfy アカウントが必要です。ntfy.sh では Pro プランのみ利用できます。 |
| icon | string | いいえ | メッセージ本文の横に表示する絶対 URL 形式の JPEG/PNG アイコンです。24 時間キャッシュされます。 |
| tags | array | いいえ | タグは最大 10 個です。ntfy の絵文字ショートコードに一致する文字列はタイトルの前に絵文字として表示され、それ以外はタグのリストとして表示されます。ショートコードの検索には `ntfy_search_emoji_tags` を使用します。 |
| cache | boolean | いいえ | false に設定するとサーバー側のキャッシュをスキップします。オンラインの購読者には引き続きメッセージが届きますが、`ntfy_fetch_messages` では取得できません。`X-Cache: no` として送信されます。 |
| click | string | いいえ | 通知をタップしたときに開く URL です。http(s)、mailto:、geo:、ntfy:// などを指定できます。 |
| delay | string | いいえ | 後で配信するようスケジュールします。期間(`30m`、`2h`、`1d`)、Unix タイムスタンプ、または自然言語の時刻(`tomorrow, 10am`、`Tuesday, 7am`)を指定できます。サーバー側で最短 10 秒、最長 3 日に制限されます。 |
| string | いいえ | メールに転送します。アドレス(`[email protected]`)を指定するか、認証済みユーザーの最初の確認済みアドレスを使う場合は `'yes'` を指定します。 | |
| title | string | いいえ | 通知のタイトルです。既定では受信側デバイスのトピック URL が使われます。 |
| topic | string | いいえ | 送信先のトピックです。`NTFY_DEFAULT_TOPIC` が設定されていない場合は必須です。トピック名を知っている人は誰でも公開または購読できるため、秘密として扱ってください。 |
| attach | string | いいえ | 外部添付ファイルの絶対 URL です。ntfy は受信者のデバイス上でファイルを取得するため、あらかじめアクセス可能な場所にファイルをホストしてください。ローカルファイルのアップロードには対応していません。 |
| actions | array | いいえ | アクションボタンは最大 3 個です。`action`(`view`、`broadcast`、`http`、`copy`)で種類を指定します。 |
| message | string | いいえ | 通知本文は最大 4096 バイトです(文字数ではありません。アクセント付き文字、CJK 文字、絵文字はそれぞれ 2~4 バイトを使用します)。空または未指定の場合、サーバー側でリテラル `triggered` に置き換えられます。ping のような通知でも、実際の内容を指定してください。 |
| base_url | string | いいえ | この呼び出しに限り、設定済みの `NTFY_BASE_URL` を上書きします。絶対 `http(s)://` URL を指定してください。上書き値が設定済みのベース URL と異なる場合、サーバーで設定された認証情報は転送されません。 |
| filename | string | いいえ | クライアントに表示する添付ファイル名を上書きします。 |
| firebase | boolean | いいえ | false に設定すると Firebase Cloud Messaging をスキップします。受信者が即時配信を有効にしていない場合、Android への配信が最大 15 分遅れます。`X-Firebase: no` として送信されます。 |
| markdown | boolean | いいえ | メッセージ本文を Markdown としてレンダリングします(Web アプリのみ。モバイルではプレーンテキストとして表示されます)。 |
| priority | integer | いいえ | 通知の優先度——1=最低、2=低、3=デフォルト、4=高、5=最高/緊急。省略時、サーバーは 3 をデフォルトにします。 |
| sequence_id | string | いいえ | 新しいメッセージを作成する代わりに、以前に公開したメッセージを更新または置換します。`ntfy_manage_message` と同じ識別子を使用します。1~64 文字、`[a-zA-Z0-9_-]`。 |
詳細
ntfy-mcp-server
MCP 経由で ntfy プッシュ通知を送信、管理、再送します。STDIO または Streamable HTTP に対応しています。
概要
ntfy を通じてスマートフォンやデスクトップにプッシュ通知を送信します。通知の公開、更新、管理、トピックの最近の履歴の取得、タグ用の絵文字ショートコードの検索ができます。
ツール
| ツール | 説明 |
|---|---|
ntfy_publish_message | ntfy トピックにプッシュ通知を送信または更新します。 |
ntfy_manage_message | sequence_id を指定して、送信済みの通知を消去または削除します。 |
ntfy_fetch_messages | 任意のフィルターを指定して、1 つ以上のトピックからキャッシュされたメッセージを取得します。 |
ntfy_search_emoji_tags | tags で使用する ntfy 絵文字タグのショートコードを検索します。 |
リソース
| リソース | 説明 |
|---|---|
ntfy://{topic} | トピックのスナップショット — 過去 1 時間の最新 20 件のメッセージと、トピックのブラウザー URL。 |
リソースの固定されたデフォルト設定では不十分な場合、ntfy_fetch_messages でカスタムの期間やフィルターを指定して同じトピックデータを取得できます。
機能リファレンス
ntfy_publish_message ツール
- トピックは初回の公開時に作成されます。トピック名は秘密として扱ってください。名前を知っている人なら誰でも公開または購読できます
title、priority(1~5)、tags、click、attach、icon、filename、markdown、delay、email、call、cache、firebase、および最大 3 個のアクションボタン(view、broadcast、http、copy)を受け取ります。本文は最大 4096 バイトで、空の場合はデフォルトでtriggeredになります。送信済みメッセージを更新するには、元のsequence_idを渡してくださいemail、call、またはbroadcast/httpボタンを使って公開する場合は、送信前に対象をユーザーに確認します- 呼び出しごとの
base_urlに認証情報が付与されるのは、登録済みサーバー(NTFY_BASE_URLまたはNTFY_SERVERSのエントリー)と一致する場合のみです。それ以外の場合、リクエストは認証されません
ntfy_manage_message tool
operation:clearは通知を既読にして閉じます(購読者にはmessage_clearが表示されます)。deleteは通知一覧から削除します(購読者にはmessage_deleteが表示されます)。- 呼び出しごとに、最初にトピック、
sequence_id、操作の確認をユーザーに求めます。確認を拒否するとconsent_declinedで失敗します。 - 元のメッセージはキャッシュに残り、同じ操作を繰り返しても問題ありません。ntfy.sh は不明な
sequence_idを受け入れますが、より厳格なデプロイではnot_foundが返されます。
ntfy_fetch_messages tool
- ライブストリームではなくスナップショットを返します。カンマ区切りのトピック(例:
alerts,backups)と、since(期間/タイムスタンプ/メッセージ ID/all/latest)、priority、tags、id、title、message、スケジュール済みのみ、によるフィルターを受け付けます。 - デフォルトの対象期間は
10m、デフォルトの上限は20件で、1回の呼び出しにつき最大100件です。対象期間を広げると、最新のlimit件がtotalCountとともに返されます。nextCursorをcursorとして渡すことで続きを取得できます。 - 本文は約500文字で切り詰められます(省略された文字数は
messageTruncatedで示されます)。全文を取得するにはidを指定して再取得してください。 - ntfy が再生データを上限で切り詰めた場合は
upstreamTruncatedを設定し、サーバーが ntfy メッセージストリームを返さない場合はupstream_malformedで失敗します。
ntfy_search_emoji_tags tool
- タグ名を大文字と小文字を区別せず部分一致で検索します。
queryを省略すると、参照リストを順番どおりに返します。 limitのデフォルトは25件で、1回の呼び出しにつき最大200件です。totalCountを使い、offsetでページを移動します。- 返された
tag文字列は、そのままntfy_publish_messageのtagsに指定できます。 - デフォルトで有効です。
NTFY_ENABLE_EMOJI_TAGS=falseを設定すると、tools/listから削除されます。
ntfy://{topic} resource
- 固定スナップショットです。過去1時間の最新20件のメッセージと、そのトピックのブラウザー URL を、
ntfy_fetch_messagesと同じ形式(upstreamTruncatedを含む)で返します。 - 独自の対象期間やフィルターを指定する場合は、
ntfy_fetch_messagesを使用してください。
機能
@cyanheads/mcp-ts-core を基盤とし、stdio および Streamable HTTP トランスポート、切り替え可能な認証方式(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースを伴う構造化ロギングを備えています。
ntfy 固有の機能:
- ntfy クライアントは再試行に対応し、試行ごとのタイムアウトを設定できます。各呼び出しは最大50秒で打ち切られるため、MCP クライアントのデフォルトである60秒以内に処理が完了します。
- サーバーごとの認証:認証情報は登録された各ベース URL(
NTFY_BASE_URLまたはNTFY_SERVERSのエントリ)に紐づきます。ベアラートークンとベーシック認証は相互排他的です。 - stdio と Streamable HTTP の両方で、clear/delete、または
email、call、broadcast/httpボタンを含む publish の前に、ユーザーに確認を求めます。 base_urlの上書きに対するオプションの SSRF ガード(NTFY_BLOCK_PRIVATE_HOSTS)。登録済みサーバーは対象外です。- 絵文字タグの参照データを同梱しています。上流の
docs/ntfy/emojis.mdからscripts/build-emoji-tags.tsを使って再生成されます。
エージェント向けの出力:
- publish と manage は解決済みのトピック、ID、タイムスタンプを返します。fetch は解決済みの
sinceと適用されたフィルターも返します。 - 型付きの
reasonコード(consent_declined、forbidden_topic、rate_limited、not_found、payload_too_largeなど)により、呼び出し側は失敗の種類に応じて処理を分岐できます。 - fetch と絵文字検索は
truncated、totalCount、次の手順(nextCursorをcursorとして渡す、またはoffsetを進める)を示すnoticeを返します。
はじめに
以下を MCP クライアントの設定ファイルに追加してください。公開 ntfy.sh はアカウントなしですぐに利用できます。保護されたトピックの場合は、https://ntfy.sh/account でアクセストークンを生成してください。
{
"mcpServers": {
"ntfy-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["ntfy-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"NTFY_DEFAULT_TOPIC": "your-topic-name"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"ntfy-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "ntfy-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"NTFY_DEFAULT_TOPIC": "your-topic-name"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"ntfy-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "NTFY_DEFAULT_TOPIC=your-topic-name",
"ghcr.io/cyanheads/ntfy-mcp-server:latest"
]
}
}
}
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 NTFY_DEFAULT_TOPIC=your-topic bun run start:http
# Server listens at http://127.0.0.1:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24+)。
- ntfy サーバー上のトピック名。公開
ntfy.shはアカウント不要です。セルフホストのインスタンスや保護されたトピックでは、ベアラートークンまたはベーシック認証の認証情報が必要になる場合があります。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/ntfy-mcp-server.git
- ディレクトリに移動します:
cd ntfy-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and set NTFY_DEFAULT_TOPIC (and auth, if needed)
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
NTFY_SERVERS | { baseUrl, authToken? | authUsername?+authPassword? } エントリの JSON 配列です。ntfy サーバーごとに 1 つのエントリを指定し、先頭のエントリがデフォルトになります。以下の単一サーバー用変数より優先されます。 | — |
NTFY_BASE_URL | 単一サーバー用の省略形です。ntfy サーバーのベース URL(末尾にスラッシュを付けません)。NTFY_SERVERS が未設定の場合に使用されます。 | https://ntfy.sh |
NTFY_DEFAULT_TOPIC | ツール呼び出しで topic が省略された場合に使用するトピックです。 | — |
NTFY_AUTH_TOKEN | 単一サーバー用の省略形で使う Bearer アクセストークン(tk_…)です。NTFY_AUTH_USERNAME / NTFY_AUTH_PASSWORD とは併用できません。 | — |
NTFY_AUTH_USERNAME | 単一サーバー用の省略形で使う Basic 認証のユーザー名です。NTFY_AUTH_PASSWORD と併せて指定する必要があります。 | — |
NTFY_AUTH_PASSWORD | 単一サーバー用の省略形で使う Basic 認証のパスワードです。NTFY_AUTH_USERNAME と併せて指定する必要があります。 | — |
NTFY_REQUEST_TIMEOUT_MS | 1 回の試行に対する HTTP タイムアウト(ミリ秒)です。すべての試行を通じて、各呼び出しの上限も 50 秒です。 | 15000 |
NTFY_MAX_RETRIES | 一時的なアップストリーム障害(5xx、ネットワーク、429)に対する最大再試行回数です。 | 3 |
NTFY_BLOCK_PRIVATE_HOSTS | true の場合、呼び出しごとの base_url オーバーライドはパブリックアドレスに解決される必要があり、リダイレクトは追跡されません。登録済みサーバーは対象外です。制御できない呼び出し元からサーバーにアクセスできる環境では有効にしてください。 | false |
NTFY_ENABLE_EMOJI_TAGS | false に設定すると ntfy_search_emoji_tags が無効になります。認識されない値が指定されると、起動に失敗します。 | true |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_SESSION_MODE | HTTP セッションモデル:auto、stateful、または stateless。HTTP ではこのサーバーに stateful が必要です(auto はこれに解決されます)。起動時に stateless は拒否されます。stdio では無視されます。 | stateful |
MCP_HTTP_HOST | HTTP ホストです。 | 127.0.0.1 |
MCP_HTTP_PORT | HTTP ポートです。 | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP エンドポイントのパスです。 | /mcp |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth。 | none |
MCP_REQUEST_STATE_KEY | HTTP での設定を推奨します。同意の requestState を 900 秒間封印するキー(32 バイト以上。例:openssl rand -base64 32。すべてのインスタンスで同じ値を使用してください)です。無効または期限切れの状態は -32602 invalid_request_state で拒否されます。 | — |
STORAGE_PROVIDER_TYPE | 同意レコードの保存先(TTL は 600 秒)です。複数インスタンスの HTTP では共有ストレージが必要です。filesystem(共有ボリューム)、supabase、または cloudflare-d1 を使用し、cloudflare-kv は使用しないでください。 | in-memory |
MCP_LOG_LEVEL | ログレベル(RFC 5424)です。 | info |
LOGS_DIR | ファイルベースのログのディレクトリです(Node のみ。Workers では無視されます)。 | ./logs |
LOG_TOOL_FAILURE_PAYLOADS | 失敗した各ツール呼び出しの引数と結果をログに記録します。キー名に基づいて機密情報をマスキングし、LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルトは 16384)を上限とします。自由形式の値に含まれる機密情報はマスキングされません。 | false |
OTEL_ENABLED | OpenTelemetry instrumentation(スパン、メトリクス、完了ログ)を有効にします。 | false |
任意のオーバーライドの全一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行します:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行します:
bun run devcheck # Lint, format, typecheck, security, changelog sync bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t ntfy-mcp-server .
docker run --rm -e NTFY_DEFAULT_TOPIC=your-topic -p 3010:3010 ntfy-mcp-server
Dockerfile はデフォルトで HTTP トランスポート、stateful セッションモードを使用し、/var/log/ntfy-mcp-server にログを記録します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツールとリソースを登録し、サービスを初期化します。 |
src/config | Zod を使用した、サーバー固有の環境変数(NTFY_*)の解析です。 |
src/mcp-server/tools | ツールの定義(*.tool.ts)です。 |
src/mcp-server/resources | リソースの定義(*.resource.ts)です。 |
src/services/ntfy | ntfy の HTTP クライアント、型、エラー分類機能です。 |
src/services/emoji-tags | バンドルされた絵文字ショートコードのリファレンスと検索サービスです。 |
docs/ntfy | 上流の ntfy API ドキュメントのミラーです(固定されたコミットは SOURCES.md に記載されています)。 |
tests/ | src/ の構成を反映した単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークがキャッチします。ツールのロジック内で
try/catchを使用しないでください。 - リクエスト単位のロギングには
ctx.logを、テナント単位のストレージにはctx.stateを使用してください。 - 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに沿って返します。不足しているフィールドを決して捏造しないでください。
- ツールごとの
errors[]コントラクトはインラインに保ちます。重複は局所性を保つための意図的なものです。
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。