ntfy-me-mcp について
ntfy-me-mcp は、AI エージェントが ntfy サービスを通じて通知を送信・取得するための MCP サーバーです。ntfy.sh またはセルフホスト可能な ntfy サーバーで利用できます。アクセストークン認証に対応し、メッセージ内の URL や Markdown を自動で検出します。
主な機能
- 01タイトル、優先度、タグ付きの通知送信
- 02トピックのキャッシュメッセージの取得と絞り込み
- 03URL からビューアクションを自動作成
- 04アクセストークンによる認証
- 05npx または Docker での実行
活用シーン
- 01AI のタスク完了やエラー時にスマートフォンへ通知
- 02長時間の処理後に結果を通知で受け取る
- 03ntfy トピックをポーリングして過去のメッセージを確認
MCP 対応
本プロジェクトは MCP サーバーであり、通知の送信とメッセージ取得をツールとして MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ntfy-me-mcp
ntfy サービス(パブリックまたはセルフホスト、トークン対応)を介して通知を送受信する、シンプルな Model Context Protocol(MCP)サーバーです 📲
概要
ntfy-me-mcp を使うと、AI アシスタントから ntfy.sh サービス(パブリック、またはトークン対応のセルフホスト)を通じて、デバイスにリアルタイム通知を送信できます。AI がタスクを完了したとき、エラーが発生したとき、または重要な節目に到達したときに、常に監視し続けなくても通知を受け取れます。
このサーバーには、表示アクションを作成するための URL の自動検出や、スマートな Markdown 形式の検出などの便利な機能が備わっています。追加設定なしで、AI アシスタントがリッチでインタラクティブな通知を作成しやすくなります。
| プレビュー | 利用可能な場所 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
近日公開予定...
- 📨 メール:メールに通知を送信します(ntfy メールサーバーの設定が必要です)
- 🖼️ 画像 URL:画像 URL をインテリジェントに検出し、メッセージや通知に自動で含めます
- 🏁 その他!
目次
クイックスタート - MCP サーバーの設定
クライアントに合った設定形式を選択してください。以下の例では、必須変数として NTFY_TOPIC を使用し、任意の認証設定は必要になるまでコメントアウトしています。
Ontheia でのテスト済み: セルフホスト可能なオープンソースの AI エージェントプラットフォームである Ontheia は、ntfy-me-mcp が動作することを報告しており、対応 MCP サーバーの一覧に掲載しています。
要件: npx、グローバル、ローカルの各オプションでは Node.js 24 以降が必要です。CI と Docker イメージでは Node 24 を使用します。Node 22 以前はサポートされていません(npm は
EBADENGINEの警告を表示します)。Docker オプションに必要なのは Docker のみです。
設定例
| 種類 | ユースケース | 例 |
|---|---|---|
| NPM / NPX | 最小限のセットアップで利用したい場合に、ほとんどの MCP クライアントにおすすめです。 |
設定を表示
|
| ローカル | サーバーを自分で開発または変更する場合は、ローカルのチェックアウトを使用します。
ビルド後、 /absolute/path/to/ntfy-me-mcp/build/index.js を置き換えてください。
|
設定を表示
|
| Docker | すでに環境で Docker を使用している場合は、コンテナ化されたセットアップを使用します。
- DockerHub: gitmotion/ntfy-me-mcp:latest- GHCR: ghcr.io/gitmotion/ntfy-me-mcp:latest
|
設定を表示
|
| OpenCode | プロジェクトのルートにある opencode.json(プロジェクト単位の設定)または ~/.config/opencode/opencode.json(グローバル設定)に追加します。トップレベルのキーに "mcp" を使用し、type: "local" と配列形式の command を指定します。 |
設定を表示
|
| Claude Code | 最も手早い方法は、claude mcp add ntfy-me-mcp -e NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp を実行することです(すべてのプロジェクトで使う場合は --scope user を、.mcp.json に書き込む場合は --scope project を追加します)。
または、プロジェクトのルートにある .mcp.json に手動で追加します(バージョン管理を通じてチームと共有できます)。${NTFY_TOKEN:-} はシェル環境からトークンを読み込み、値がない場合は空になります。 |
設定を表示
|
| Copilot CLI | すべてのセッションでユーザーレベルのアクセスを利用できるよう、~/.copilot/mcp-config.json に追加します。このサーバーのような stdio ベースのサーバーには、type: "local" を使用します。 |
設定を表示
|
| Codex | codex mcp add ntfy-me-mcp --env NTFY_TOPIC=your-ntfy-topic -- npx -y ntfy-me-mcp を実行するか、ブロックを ~/.codex/config.toml に手動で追加します。 |
設定を表示
|
| トークン認証 | 保護されたトピックまたはセルフホストサーバーで必要です。トークンの安全な取り扱い(vscode)を参照するか、NTFY_TOKENを直接設定してください。 |
設定を表示
|
インストール
サーバーを直接インストールして実行する必要がある場合(上記のMCP設定の代替手段):
| オプション | 例 |
|---|---|
グローバルにインストールntfy-me-mcpコマンドを使って、どこからでも実行できるように一度だけインストールします。 |
npm install -g ntfy-me-mcp
|
| npxで実行 インストール不要です。手早く一度だけ実行する場合や、テストに最適です。 |
npx ntfy-me-mcp
|
| ローカルにインストール リポジトリをクローンし、依存関係をインストールしてビルドし、 npm startで実行します。 |
手順を表示
|
通知受信側のセットアップ
ntfy受信側のセクションを表示
- お使いのデバイスにntfyアプリをインストールします
- または、独自のntfyサーバーをデプロイします:https://docs.ntfy.sh/install/
- 選択したトピックを購読します(
NTFY_TOPICの設定と同じもの)
設定
環境変数
例をコピーして.envファイルを作成します:cp .env.example .env。参考として.env.exampleを確認してください。
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
NTFY_TOPIC | はい | — | 通知の送信先となるntfyトピック |
NTFY_URL | いいえ | https://ntfy.sh | ntfyサーバーのURL。セルフホストのインスタンスでは変更してください (必要に応じてポートを含めます。例: https://your-server.com:8443) |
NTFY_TOKEN | いいえ | — | 保護されたトピックまたはプライベートサーバー用のアクセストークン。このトークンが送信されるのはNTFY_URLサーバーのみです |
NTFY_ALLOW_TOPIC_OVERRIDE | いいえ | false | trueに設定すると、エージェントが呼び出しごとにtopicを選べるようになります。無効の場合(デフォルト)、topicパラメーターはエージェントに提示されず、すべての通知と取得にはNTFY_TOPICが使用されます |
NTFY_TOPICS_ALLOWLIST | いいえ | — | 購読するトピックをカンマ区切りで指定します(例:alerts,builds,deploys)。設定すると、エージェントはNTFY_TOPICまたはこのリスト内のトピックにのみ送信または取得でき、他のトピックは使用できません。topicパラメーターには、指定したトピックのみがリストとして提示されます。NTFY_ALLOW_TOPIC_OVERRIDEより優先されます。無効な項目がある場合、またはトピックが1つもない値(例:,)の場合、サーバーは起動時に停止します |
NTFY_ALLOW_URL_OVERRIDE | いいえ | false | trueに設定すると、エージェントが呼び出しごとにサーバーのurlを選べるようになります。無効の場合(デフォルト)、urlパラメーターは提示されず、すべてのリクエストはNTFY_URLに送信されます。有効にした場合でも、NTFY_TOKENが送信されるのはNTFY_URLのみです |
認証
認証セクションを表示
この MCP サーバーは、認証が必要な ntfy エンドポイントと認証不要の ntfy エンドポイントの両方に対応しています。
- パブリックトピック:ntfy.sh やその他のパブリックサーバーでパブリックトピックを使用する場合、認証は不要です。
- 保護されたトピック:
- 保護されたトピックまたはプライベートサーバーの場合は、環境変数
NTFY_TOKENまたはツールのaccessTokenパラメーターでアクセストークンを指定する必要があります。 - 認証が必要なのに指定されていない場合は、トークンの追加方法を説明する明確なエラーメッセージが表示されます。
- 保護されたトピックまたはプライベートサーバーの場合は、環境変数
トークンの安全な取り扱い(vscode)
- クライアントがプロンプトベースのシークレット入力(VS Code など)に対応している場合は、設定ファイルに
NTFY_TOKENをハードコーディングするよりも、そちらを優先してください。(対応していない場合は、トークンを直接使用してください) mcp.jsonファイルでは、次のように対応する値を使用してください。
VS Code の mcp.json の例を表示
// Add this to your VS Code `mcp.json` file, either the user-level file or your workspace `.vscode/mcp.json`
// Set `NTFY_TOKEN` exactly to `"${input:ntfy_token}"` when you want VS Code to treat it as a secure prompt-backed value.
{
"inputs": [
{
"type": "promptString",
"id": "ntfy_token",
"description": "Ntfy Token",
"password": true
}
],
"servers": {
"ntfy-me-mcp": {
"command": "npx",
"args": ["-y", "ntfy-me-mcp"],
"env": {
"NTFY_TOPIC": "your-ntfy-topic",
"NTFY_URL": "https://your-ntfy-server.com",
"NTFY_TOKEN": "${input:ntfy_token}"
}
}
}
}
| フィールド | 値 | 用途 |
|---|---|---|
env.NTFY_TOKEN | "${input:ntfy_token}" | セキュアなプロンプトで入力されたトークン値を参照します |
inputs[].id | "ntfy_token" | NTFY_TOKEN で使用する入力名を定義します |
inputs[].type | "promptString" | 実行時にユーザーにトークンの入力を求めます |
MCP クライアントは、サーバーの起動前に
"${input:ntfy_token}"を解決する必要があります。VS Code はこのように処理するため、サーバーは実際のトークンを受け取ります。クライアントが${input:…}参照に対応していない場合(Claude Desktop、Claude Code、Codex など)は、NTFY_TOKENに実際のトークン、またはクライアントが対応している環境変数参照を設定してください。プレースホルダーが未解決のままサーバーに渡されると、stdin と stdout が MCP 接続に使われているため、サーバーはトークンの入力を求めることができません。そのため、NTFY_TOKEN is an unresolved ${input:…} referenceというエラーを出して起動時に終了し、クライアントの MCP サーバーログに表示されます。${env:NTFY_TOKEN}や${NTFY_TOKEN}など、クライアントが置換しなかったほかのプレースホルダーも同様です。その場合、トークンとして送信するのではなく、サーバーはNTFY_TOKEN contains an unresolved ${…} placeholderというエラーを出して終了します。ntfy.sh などの認証が有効な ntfy サーバーは、すべてのリクエストでこれを拒否します。環境変数
PROTECTED_TOPICはv1.4.0で削除されました。保護されたトピックでは、クライアントによって解決されるNTFY_TOKENを設定してください。
ツールと使い方
ntfy_me:通知の送信
自然言語を使用する
- AI アシスタントを使用する際は、自然な表現で通知をリクエストできます。
"ntfyme with a summary of the task when complete"
"Send me a notification when the build is complete"
"Notify me when the task is done"
"Alert me after generating the code"
"Message me when the process finishes"
"Send an alert with high priority"
使用例
| 入力 | 出力 |
|---|---|
| |
メッセージのパラメーター
| パラメーター | 説明 | 必須 | 詳細/例 |
|---|---|---|---|
title | 通知のタイトルです。Unicode と絵文字に対応しています | はい | — |
message | 通知の本文です | はい | — |
url | カスタム ntfy サーバーの URL です。NTFY_ALLOW_URL_OVERRIDE=true の場合にのみ指定できます。NTFY_TOKEN は NTFY_URL サーバーにのみ送信されます。別のサーバーには accessToken を渡してください | いいえ | デフォルト:NTFY_URL |
topic | カスタム ntfy トピックです。NTFY_TOPICS_ALLOWLIST が設定されている場合(その場合、NTFY_TOPIC と許可リスト内のトピックに制限されます)、または NTFY_ALLOW_TOPIC_OVERRIDE=true の場合にのみ指定できますNTFY_TOPIC に送信されます | いいえ | デフォルト:NTFY_TOPIC |
accessToken | 保護されたトピック用のアクセストークンです。空の値(""、空白文字)は、指定されていないものとして扱われます | いいえ | デフォルト:NTFY_TOKEN |
priority | メッセージの優先度です | いいえ | デフォルト:"default"選択肢: min、low、default、high、max |
tags | 通知タグの配列です。視覚的なインジケーターとして絵文字のショートコードを使用できます。全リストをご覧ください。 | いいえ |
warning → ⚠️white_check_mark → ✅rocket → 🚀tada → 🎉
|
markdown | Markdown 形式を有効にするブール値です。Markdown 構文(見出し、リスト、コードブロック、リンク、太字/斜体)が含まれている場合は自動検出されるため、明示的に設定する必要はありません。手動で上書きできます。 | いいえ |
自動検出:設定は不要です。手動で上書きする例
|
actions | クリック可能なリンク用の表示アクションオブジェクトの配列です(通知ごとに最大 3 件)。メッセージ本文内の URL は自動検出され、最大 3 件のアクションが作成されます。手動で指定する場合、各アクションには action、label、埋め込み認証情報のない http:// または https:// の url が必要です。任意で clear フラグも指定できます。 | いいえ |
自動検出の例
検出された URL に対する表示アクションが自動的に作成されます。
手動設定の例
|
click | 通知自体をタップしたときに開くリンクです(ntfy のクリックアクション)。埋め込み認証情報のない http://、https://、mailto:、geo:、ntfy:// のいずれかである必要があります。空の値は、指定されていないものとして扱われます | いいえ | { "click": "https://github.com/user/repo/actions/runs/123" } |
自然言語を使う
AI アシスタントは、メッセージの取得をさまざまな表現でリクエストできます。
"Show me my recent notifications"
"Get messages from the last hour"
"Find notifications with title 'Build Complete'"
"Search for messages with the test_tube tag"
"Show notifications from the updates topic from the last 24hr" # needs updates in NTFY_TOPICS_ALLOWLIST (or NTFY_ALLOW_TOPIC_OVERRIDE=true)
"Check my latest alerts"
使用例
| 入力 | 出力 |
|---|---|
| |
取得パラメーター
| パラメーター | 説明 | 必須 | 詳細/例 |
|---|---|---|---|
url | カスタム ntfy サーバーの URL です。NTFY_ALLOW_URL_OVERRIDE=true の場合にのみ提供されます。NTFY_TOKEN は NTFY_URL サーバーにのみ送信されます。別のサーバーを使う場合は accessToken を渡してください | いいえ | デフォルト:NTFY_URL |
topic | メッセージを取得するトピックです。NTFY_TOPICS_ALLOWLIST が設定されている場合(NTFY_TOPIC とそのトピックに限定)、または NTFY_ALLOW_TOPIC_OVERRIDE=true の場合にのみ提供されます | いいえ | デフォルト:NTFY_TOPIC{ "topic": "updates", "since": "all" } |
accessToken | 保護されたトピックにアクセスするためのアクセストークンです。空の値(""、空白)は未指定として扱われます | いいえ | デフォルト:NTFY_TOKEN |
since | メッセージをどこまでさかのぼって取得するかを指定します | いいえ |
デフォルト:"10m"選択肢: '10m'、'1h'、'1d'、タイムスタンプ、メッセージ ID、または 'all'例: { "since": "30m" }
|
messageId | ID を指定して特定のメッセージを検索します | いいえ | { "messageId": "xxxxXXXXxxxx" } |
messageText | 完全一致するテキスト内容を含むメッセージを検索します | いいえ | { "messageText": "Build Complete" } |
messageTitle | タイトル/件名が完全一致するメッセージを検索します | いいえ | { "messageTitle": "Build Complete", "priorities": "high", "since": "1d" } |
priorities | 特定の優先度レベルのメッセージを検索します。単一の値または配列を指定できます。 | いいえ | { "priorities": "high" }{ "priorities": ["high", "max"] } |
tags | 特定のタグが付いたメッセージを検索します。単一のタグまたは配列を指定できます。指定したタグがすべて含まれている必要があります。 | いいえ | { "tags": "error" }{ "tags": ["error", "warning"] } |
どちらのツールも、モデル向けの読みやすいcontentと、機械可読なstructuredContentオブジェクトを返します。ntfy_me_fetchのcontentには、取得したメッセージもJSONとして含まれます。このテキストはトピックに投稿した人が作成したものなので、信頼できないデータとして扱ってください(セキュリティを参照)。
| ツール | 成功時(structuredContent) |
|---|---|
ntfy_me | { "success": true, "endpoint": "https://ntfy.sh/your-topic" } |
ntfy_me_fetch | { "success": true, "messageCount": 1, "topics": { "your-topic": [ /* messages */ ] } }サーバーが空の応答を返した場合(リクエストされた期間内にキャッシュ済みメッセージがない場合): { "success": true, "topic": "your-topic", "messages": [] }応答に有効なメッセージレコードが含まれていない場合: { "success": true, "messageCount": 0, "topics": {} } |
無効な引数(titleがない、topicの形式が正しくない、未知のpriorityが指定されているなど)は、ツールの実行前にMCP SDKのスキーマ検証によって拒否されます。isError: trueと、フィールド名および期待される形式を示すテキストのみのメッセージMCP error -32602: Input validation error: …が返され、structuredContentは返されません。
ツール内での失敗では、isError: trueが設定され、{ "success": false, "error": "<message>" }が返されます。エラーメッセージには、無効なurlまたはtopic、認証の失敗(HTTP 401/403)、2xx以外のステータスコード(... Status code: 500)、ネットワークの失敗が具体的に示されます。接続できなかった場合はNodeのエラーコードを使って... could not connect to the ntfy server (ECONNREFUSED)、接続後に切断された場合は... the request to the ntfy server failed (ECONNRESET)と示されます(通知が配信されている可能性があります)。それ以外のエラーは一般的なメッセージ(Failed to send ntfy notification/Failed to fetch ntfy messages)で報告されるため、生の入力やサーバーのテキストがモデルに返されることはありません。エラーの詳細はサーバーの標準エラーログに書き込まれます。
セキュリティ
ntfy-me-mcp では、すべてのツール引数を信頼できないものとして扱います。プロンプトインジェクションされたコンテンツを読み込んだ可能性のあるモデルから渡されるためです。
- URL:
url引数とNTFY_URLのどちらからも、http://とhttps://のサーバー URL のみ受け付けます。認証情報が埋め込まれた URL(https://user:pass@…)は拒否されます。NTFY_TOKENまたはaccessTokenを使用してください。 - 起動時のチェック:
NTFY_TOPICが未設定または無効の場合、あるいはNTFY_URLが無効(http(s) ではない、またはuser:pass@を含む)の場合、サーバーは起動時に停止します。エラーには変数名が含まれ、stderr に書き込まれます。MCP クライアントのサーバーログで確認できます。サーバーはNTFY_URLをログに記録する前にこれらをチェックするため、埋め込み認証情報がログに記録されることはありません。 - トークンとログ: アクセストークンには、スペースを含まない印字可能な ASCII 文字のみ使用できます。エラーは stderr に書き込まれ、ベアラー値と URL 認証情報は伏せられます。
- トピック: 使用できるのは英字、数字、
_、-のみで、最大 128 文字です。 - エラーメッセージ: 既知の安全なメッセージだけがモデルに渡されます。それ以外はすべて汎用メッセージに置き換えられるため、攻撃者が制御するテキストがそのまま返されることはありません(#13を参照)。
- 取得したメッセージは信頼できない入力です。
ntfy_me_fetchはメッセージの内容をモデルに渡します。また、公開トピックの名前を知っている人なら誰でも、そのトピックにメッセージを投稿できます。ntfy.sh では、推測しにくいトピック名を使用するか、アクセストークンで保護されたトピックを使用してください。 - 送信先の制御: デフォルトでは、すべての通知と取得先は
NTFY_URL上のNTFY_TOPICです。エージェントにはtopicまたはurlパラメーターが提示されないため、プロンプトインジェクションされた呼び出しによって、メッセージやトピック名(公開 ntfy.sh では実質的にパスワードです)が別の場所に送られることはありません(#21を参照)。NTFY_TOPICS_ALLOWLIST=alerts,buildsを設定すると、エージェントは実際に登録しているトピックとNTFY_TOPICの中から選択できます。それ以外のトピックは選択できません(#34を参照)。ほかのトピックはリクエストを行う前に拒否され、黙って代替されることはありません。これらのトピック名(NTFY_TOPICを含む)はツールスキーマに表示されるため、モデルと MCP クライアントから確認できます。許可リストがない場合、ツールスキーマにトピック名が含まれることはありません。公開 ntfy.sh ではトピック名はパスワードのように機能するため、共有しても問題ない名前、または保護されたトピックに限って許可リストを使用してください。NTFY_ALLOW_TOPIC_OVERRIDE=trueとNTFY_ALLOW_URL_OVERRIDE=trueを設定すると、それぞれ独立して、任意のトピックまたはサーバーを再び指定できるようになります。NTFY_TOPICS_ALLOWLISTも設定されている場合は、NTFY_ALLOW_TOPIC_OVERRIDEよりも優先されます。- URL の上書きを有効にしていても、
NTFY_TOKENが送信されるのはNTFY_URLのサーバーだけです。呼び出し時に独自のaccessTokenが指定されない限り、ほかのサーバーには認証情報が送信されません。
- トークン: 共有する設定ファイルに
NTFY_TOKENを直接記述するのではなく、クライアントのシークレット入力(例:VS Code の${input:…})または環境変数を使用してください。
脆弱性を発見しましたか? 公開 issue ではなく、GitHub のセキュリティアドバイザリーから非公開で報告してください。
開発と貢献
貢献を歓迎します!一般的なガイドラインやセットアップ手順などについては、CONTRIBUTING.mdを参照してください。
ライセンス
このプロジェクトは GNU General Public License v3.0 のもとでライセンスされています。詳細は LICENSE ファイルを参照してください。
❤️ を込めて gitmotion が作成
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
