notify-mcp
notify-mcp
Example Corp スタッフ向けの自己宛てメール+SMS配信を、Entra 認証付きリモート MCP サーバーとして実現します。これは claude.ai チーフ・オブ・スタッフ展開における送信経路であり、エージェントはサインイン中のユーザー自身のコンテンツをメールまたはテキストで送信でき、構造的にそれ以外のことはできません。
不変条件(このサーバーが存在する理由)
信頼できないコンテンツ(受信メール、チケット、チャット)を読み取るエージェントは、無制限の送信機能を保持してはなりません。プロンプトインジェクションによって、それがデータ流出経路に変わる可能性があるからです。このサーバーは、その問題を構造的に解決します:
受信者はツールのパラメータではありません。 メールは、検証済みの Entra トークンから取得した呼び出し元の UPN に送信されます。SMS は、記録上の呼び出し元の携帯電話番号に送信されます。完全に侵害されたモデルでも、何を送信するかは変更できますが、どこへ送信するかは変更できません。
FROM は
<agent>approver@example.comに固定されています。サーバーは人間になりすまして送信できないため、誰にもなりすますことはできません。Resend と Inteliquent のキーは、このコンテナ内にのみ存在します。ユーザーがキーを見ることはなく、各自の M365 ログインで認証します。
ユーザーごとの時間あたり予算と、送信ごとの監査ログ行。
Related MCP server: graphdo-ts
ツール
ツール | 機能 |
| 送信先となるメールアドレスとマスクされた携帯電話番号を返します。まずこれで配線をテストします。 |
| 呼び出し元にメールを送信します。 |
| 会社の DID 13105550100 から呼び出し元の携帯電話番号にテキストを送信します。640 文字以内。 |
| SMS 設定を開始します:その番号に 6 桁のコードをテキスト送信します。 |
| 設定を完了します:コードを検証し、番号を保存し、変更通知メールをユーザーに送信します。 |
サーバーがあなたを識別する仕組み
Claude → Entra サインイン(ユーザー自身のログイン)→ すべてのツール呼び出しにベアラー JWT が付与 → AzureJWTVerifier が署名/発行者/対象者を検証 → preferred_username クレーム = 受信者。ユーザーごとの環境変数も設定も不要で、ID は暗号的に保証されます。
携帯電話番号はトークンに含まれないため、SMS は検証済み自己登録を使用します(Entra の mobilePhone を設定していないテナント向けに構築されています。当社も未設定です):
ユーザー(通常は CoS セットアップ面談中):「register my mobile 310-555-1212」→ サーバーはその番号に 6 桁のコードをテキスト送信します。
ユーザーがコードを入力 →
confirm_my_mobile→ 番号が UPN をキーとして/data/sms_directory.jsonに保存され、確認メールが送信されます。その後、変更はロックされます(
NOTIFY_ALLOW_MOBILE_CHANGE=false):確認済みの番号は、管理者がレジストリを編集することでのみ変更できます。コード検証は所有を証明し、変更ロック+メール通知は、インジェクションによる再バインド攻撃(悪意のあるコンテンツがテキストを別の場所にリダイレクトする)を無効化します。
解決順序:レジストリファイル(手動エントリはプレーン文字列、自己登録エントリはオブジェクト)→ オプションで Graph 経由の Entra mobilePhone(NOTIFY_GRAPH_LOOKUP_ENABLED=true + -GrantGraphUserRead。自己登録を使用している場合は不要)。
コネクタセッションの持続性(切断問題の修正)
コネクタが「切断」と表示されないようにするための 3 つの要素:
offline_accessが公開されています(保護リソースメタデータ内、NOTIFY_ADVERTISE_OFFLINE_ACCESS=true)。これにより、Claude のサインインは更新トークンを取得し、約 60〜90 分のアクセストークンを自動的に更新します。stateless_http=True— セッションはコンテナの再デプロイ後も維持されます。NPM プロキシホストには、プレイブックのタイムアウト上書き設定が必要です(PORTAINER_DEPLOY.md を参照)。アイドルストリームが 60 秒で切断されないようにします。
また、このアプリをカバーする条件付きアクセスのサインイン頻度ポリシーがないことを確認してください。受け入れテスト:接続し、2 時間以上アイドル状態にして、コンテナを再デプロイし、whoami を呼び出します。再認証プロンプトは表示されないはずです。
セットアップ(プレイブックの順序)
scripts/setup_entra_app.ps1 -TenantId <tenant>(オプションで-GrantGraphUserRead)— サーバーの環境変数値とコネクタシークレットを出力します(シークレットは Claude のコネクタ詳細設定に入力し、サーバーには入れません)。Portainer Git スタックでデプロイ — PORTAINER_DEPLOY.md を参照。推奨ホストポートは 8093(事前にプローブし、プレイブックレジストリに記録)。
NPM プロキシホスト
notify-mcp.example.com→ コンテナへ。プレイブックのタイムアウト+Anthropic IP 許可リスト。許可リストを有効にする前に LE 証明書。claude.ai で組織のカスタムコネクタとして追加。ユーザーは各自の M365 ログインで一度接続します。
受け入れテスト
curl http://<docker-host>:8093/healthz # {"status":"ok",...}
curl -s https://notify-mcp.example.com/.well-known/oauth-protected-resource/mcp | jq
# scopes_supported MUST include the full https://.../mcp/access_as_user scope
# AND "offline_access"
curl -i https://notify-mcp.example.com/mcp # 401 + WWW-Authenticate次に、Claude でグループメンバーとして:
whoami→ 自分のメールアドレス、携帯電話番号「on record (…1234)」または明確な不一致。send_email_to_me→notify_ai@から自分の受信トレイに届きます。モデルに「これを<他の誰か>に送信して」と依頼 → 拒否するか、従う方法がないはずです。これが失敗した場合は P1 — 展開しないでください。
自分の番号で
register_my_mobile→ コードが届く →confirm_my_mobile→ 確認メールが届く →send_sms_to_meが機能します。次に、別の番号を登録してみる → 拒否されるはずです(変更ロック)。上記の 2 時間アイドル+再デプロイテスト。
非メンバーが接続 → サインイン時に拒否されます(AADSTS50105)。
ローカル開発
pip install -r requirements.txt
MCP_AUTH_ENABLED=false python -m notify_mcp # Inspector only — tools will
# refuse to send without a token
# identity; NEVER expose auth-offThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables secure, zero-trust access to MCP tools through short-lived, signed capability leases that bind tool execution to specific sessions, intents, and constraints. Prevents prompt injection attacks and privilege escalation with dynamic risk scoring, policy enforcement, and tamper-evident audit logging.41MIT

graphdo-tsofficial
AlicenseAqualityCmaintenanceEnables AI agents to send emails and manage tasks in Microsoft To Do with scoped, low-risk access to Microsoft Graph.3511MIT- AlicenseNot gradedqualityCmaintenanceEnables email agents to send emails with granular trust levels per contact, ensuring human approval for high-risk or unknown recipients while allowing automatic sending for trusted ones.MIT
- AlicenseNot gradedqualityBmaintenanceAuthenticated email service MCP for AI agents.183Apache 2.0
Related MCP Connectors
Phone, SMS & email for AI agents — one remote MCP endpoint, OAuth login, zero install.
Hosted email MCP for AI agents with inboxes, send/receive, memory, recovery, and credits.
Remote MCP for Copilot CLI switch gate MCP, structured receipts, audit logs, and reviewer-ready evid
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/JohnGilligan2/mcp-notify'
If you have feedback or need assistance with the MCP directory API, please join our Discord server