mcpField
N
notifyd

notifyd

リモート
github.comコミュニケーション171 週間前に更新
リポジトリ公式サイト

notifyd について

notifydは、メール、SMS、WhatsApp、プッシュ通知などを送るセルフホスト型通知サーバーです。MCPツールから配信状況を調べ、ジョブ、プロジェクト、抑制リストを操作でき、APIやCLIも利用できます。

主な機能

  1. 01複数チャネルへの通知配信
  2. 02キュー送信、再試行、プロバイダー切り替え
  3. 03優先レーンと受信者ごとの配信停止時間
  4. 04ジョブ運用向けMCPツール
  5. 05ダイジェスト、メトリクス、監査ログ

活用シーン

  1. 01エージェントによる配信問題の確認
  2. 02通知ジョブの再試行やキャンセル
  3. 03複数チャネルでのテスト送信
  4. 04プロジェクト設定と抑制リストの管理

MCP 対応

`/mcp`でStreamable HTTPのMCPサーバーを公開し、ダイジェスト、ジョブ、プロジェクト、抑制リスト、メトリクス、テスト送信のツールを提供します。読み取り専用キーにより、確認ツールだけに制限できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://{notifyd_host}/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://{notifyd_host}/mcp認証が必要
パッケージ
ocighcr.io/rmzlb/notifyd:0.4.0

ツール

詳細

notifyd

notifyd

1 回の API 呼び出しで、メール、SMS、WhatsApp、プッシュ通知、アプリ内通知を送信できます。
12 MB の Rust バイナリ 1 つで動作し、必要なのは PostgreSQL のみです。キュー、再試行、プロバイダーのフェイルオーバー、通知を控える時間帯の管理はすべて任せられ、AI エージェントは MCP 経由で操作できます。

ライセンス コンテナイメージ crates.io CI イメージサイズ メモリ MCP レジストリ エージェントスキル

クイックスタート • クライアント • 使用例 • エージェントによる運用 • API リファレンス • アーキテクチャ • ベンチマーク • llms.txt • コントリビューション


これは何か

アプリからユーザーに伝えることはたくさんあります。パスワードのリセット、荷物の発送、ニュースレター、画面の隅に表示する赤いバッジなどです。notifyd は、それらすべてを処理する小さなサーバーです。コードから1 回呼び出すだけで済み、プロバイダー、レート制限、再試行、タイムゾーンについて気にする必要はもうありません。

                 ┌───────────────────────────── notifyd ──────────────────────────────┐
your app ─────▶  │ POST /v1/send ─▶ queue ─▶ priority ─▶ pacing ─▶ retry ─▶ failover  │ ─▶ email · sms · whatsapp
                 │                                                                    │    push · in-app · telegram · slack · discord
your agent ───▶  │ POST /mcp ─▶ digest · jobs · retry · suppressions · settings       │
                 └───────────────────────── PostgreSQL only ──────────────────────────┘
  • 小さく、高速です。 12 MB のバイナリ 1 つ、取得するイメージは 14 MB、アイドル時の RAM 使用量は 13 MB です。ノート PC で毎秒 44,000 件の通知を受け付け、毎秒 3,500 件を処理します(測定方法)。Redis もメッセージブローカーも、ホストするダッシュボードも不要で、依存関係は PostgreSQL のみです。
  • 何も失われません。 パスワードリセットは常にキャンペーンより先に送信されます。プロバイダーから「速度を落としてください」と通知された場合、そのチャネルは指定された時間だけ正確に一時停止し、優先順位に従って再開します。プロバイダーが失敗した場合は、2 番目のプロバイダーに切り替わります。再試行、冪等性、受信者のタイムゾーンに合わせた通知を控える時間帯の管理が組み込まれています。
  • プロバイダーもデータも自分のものです。 Resend、Cloudflare Email、あらゆる SMTP、AgentMail、Telnyx、Twilio、smsmode、APNs、Web Push、FCM に対応しています。セルフホスト可能で、MIT ライセンスです。
  • API または AI エージェントで運用できます。 管理 UI はありません。ダイジェストエンドポイントが、対応が必要な項目とその対処方法を示します。同じ操作は MCP ツールとしても利用できるため、当番担当者の代わりにエージェントが対応できます。

現在、本番環境では 3 社でそれぞれ 1 インスタンスが稼働しており、この方法で運用されています。

60 秒の解説:1 回の送信呼び出し、プロバイダーの 429 発生時も優先順位を維持、エージェントが MCP 経由でインスタンスを運用
60 秒の解説動画。データは架空です。MP4 · Remotion のソース


1 回の呼び出しで送信

curl -X POST https://notifyd.example.com/v1/send \
  -H "X-Api-Key: sk_myapp_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "channels": ["email", "in_app"],
    "subscriber_id": "user-1",
    "subject": "Your report is ready",
    "body": "Hey {{first_name}}, the analysis you requested is complete.",
    "vars": {"first_name": "Alice"},
    "priority": "normal",
    "idempotency_key": "report-42-ready"
  }'

シンプルな REST API なので、curl で利用できます。TypeScript と Python のクライアントも用意されています。再試行は安全です(idempotency_key)。スケジュールはフィールド(scheduled_at)で指定します。マーケティングキャンペーンは、1 回の呼び出しで数千人の購読者に送信する POST /v1/batch で、バルクレーンに振り分けられるため、パスワードリセットが遅れることはありません。送信後は GET /v1/jobs/:id を実行してください。すべての言語で実行可能なサンプルを用意しています:examples/。


ターミナルから実行する

同じバイナリがオペレーター向け CLI としても機能し、あらゆるインスタンスに対して使用できます(サーバーホストの環境変数に ADMIN_API_KEY が設定されているため、その環境ではそのまま動作します)。

notifyd digest                       # what needs attention, with the action for each finding
notifyd jobs --status failed         # --project, --channel, --topic, --recipient, --since 24h, --limit, --json
notifyd job <id>                     # provider, attempts, delivery events
notifyd retry <id>                   # re-queue after fixing the cause
notifyd send-test --project myapp --channel email --to [email protected]
NOTIFYD_URL=https://notifyd.example.com NOTIFYD_ADMIN_API_KEY=… notifyd digest   # from your laptop

エージェントに実行させる

多くの通知ツールは、人がダッシュボードを操作することを前提に設計されています。notifyd は、オペレーターのジョブをツールとして公開し、人間のオペレーターが必要とする詳細情報も提供します。

1. 1 回の呼び出しで、対応が必要な項目がわかります。 GET /v1/admin/digest は、確認事項を優先度順に並べ、それぞれに必要な対応を JSON または Markdown で示します。

# notifyd digest — last 1d
Instance: commit e14e6f3, up 3d, email resend (+ smtp fallback), sms telnyx

## Findings
- **warning** — Primary email provider `resend` is resting for 47s after refusing messages; `smtp` is delivering.
  _Nothing lost. Check the primary provider's status page; if it repeats, lower EMAIL_RATE_PER_SEC or move the primary role to the other provider._
- **warning** — Bounce rate 5.3 % over the window (14 bounced / 263 delivered).
  _Above 5 % providers throttle or suspend the sender. Clean the recipient list; suppressions are applied automatically._
- **warning** — 3 job(s) failed in the last 1d (0.1 % of terminal jobs). Top cause: 422 unverified sender domain.
  _Inspect with list_jobs(status=failed); permanent errors need a fix on the caller side, then retry_job._

## Queue          pending 0, retry 2, processing 0
## Outcomes       email/resend 4 812 sent, 3 failed · in_app 1 203 sent
## Latency        email p50 0.6s, p95 2.1s (scheduled → accepted by provider)
## Deliverability delivered 4 790, bounced 14, complained 0, unsubscribed 9

2. 同じ操作を MCP ツールとして提供します。 POST /mcp は Streamable HTTP の MCP サーバーです(現行の仕様改訂に準拠し、従来の initialize も引き続き利用できます)。Claude Code、Claude Desktop、Cursor、または独自のエージェントに追加できます。

{ "mcpServers": { "notifyd": {
  "type": "http", "url": "https://notifyd.example.com/mcp",
  "headers": { "Authorization": "Bearer ${NOTIFYD_ADMIN_API_KEY}" } } } }
ツールエージェントができること
digest確認事項と対応策、キュー、結果、レイテンシー、配信状況をプロジェクトごとに優先度順で表示
list_jobs, get_jobプロジェクト、チャネル、ステータス、宛先、時間で絞り込み、プロバイダー、試行回数、直近のエラーを確認
retry_job, cancel_job停滞した送信や誤った送信に対処
list_projects, update_project送信者情報(from_email、from_name)、チャネル、受信レート制限、受信者のタイムゾーンでのバルク send_window を設定
list_suppressions, add_suppression, release_suppressionall または marketing のスコープで抑止リストを管理
template_metricsテンプレートごとの送信数、失敗数、バウンス数、開封数
send_test任意のチャネルでパイプライン全体の動作を確認

すべてのツールには readOnlyHint / destructiveHint アノテーションと outputSchema が付与されています。読み取り専用のオペレーターキー(READONLY_API_KEY)を使うと、読み取りツールのみが公開されるため、状況を報告しても操作は行わないエージェントに適しています。すべての MCP 呼び出しは監査ログに記録されます。

3. ダイジェストが届きます。 DIGEST_NOTIFY=telegram:<chat id>(または Slack / Discord の Webhook)を設定すると、対応が必要なときに上記の確認事項がチャットに届きます。notifyd digest --to telegram:… を実行すれば、今すぐ送信できます。

4. エージェントが統合に必要とするものはすべてリポジトリにあります。 docs/llms.txt には API 全体がコンテキストウィンドウ向けのプレーンテキストで記載されています。また、3 つの Agent Skills が skills/ に含まれています(notifyd-operate、notifyd-integrate、notifyd-deploy)。

npx skills add rmzlb/notifyd

公式 MCP レジストリに mcp-name: io.github.rmzlb/notifyd として公開されています(server.json)。オペレーター向けガイド全文:docs/AGENT.md。


機能

チャネル

  • メール — Resend、Cloudflare Email Service、AgentMail、任意の SMTP(lettre)、添付ファイル、プロジェクトごとの送信者 ID
  • SMS — Telnyx、Twilio、または smsmode。1 つの変数で切り替えられます
  • RCS — smsmode(BASIC / TEXT の自動選択、クイック返信、クリック発信、リッチカード、カルーセル)
  • WhatsApp — Telnyx
  • プッシュ通知 — APNs にネイティブ対応(.p8 トークン認証、HTTP/2、バッジ、サウンド、スレッド ID、サイレントプッシュ、無効なトークンの除外)、Web Push(VAPID)、FCM
  • アプリ内受信トレイ — REST + リアルタイム SSE(EventSource)、既読 / アーカイブ / スター、未読バッジ、Postgres NOTIFY による複数レプリカ対応

配信エンジン

  • 優先度 — critical、normal、bulk のレーン。/v1/batch とキャンペーンタグは bulk に振り分けられます
  • 送信速度制御 — チャネルごとのトークンバケット(EMAIL_RATE_PER_SEC)。プロバイダーから 429 が返されると、試行回数を消費せずに Retry-After の間そのチャネルを一時停止し、ほかのチャネルは送信を継続します。再開時には、クレームの順序で critical が優先されます
  • 再試行 — ジッター付きで 30 秒 → 2 分 → 10 分 → 30 分 → 2 時間。4xx は即時失敗し、拒否されたバッチはアイテムごとにフォールバックします
  • フェイルオーバー — サーキットブレーカー付きの 2 番目のメールプロバイダー(EMAIL_FALLBACK_PROVIDER)
  • 送信時間帯 — プロジェクトごとの配信停止時間を、各購読者のタイムゾーンに基づいて判定します
  • セグメント — batch を使い、"plan = pro and country in FR, BE" のように指定します。限られたフィルター語彙をバインド済み SQL にコンパイルし、事前に件数をプレビューできます
  • スケジューリング、冪等性、スタックしたジョブの回収、バッチの冪等性

ガバナンス

  • 配信停止 — すべてのマーケティングメールに RFC 8058 の List-Unsubscribe ワンクリック配信停止を適用します。抑制範囲は all / marketing です
  • トピックと設定 — 任意の送信に topic(「tips」、「billing」など)を指定できます。購読者はトピックとチャネルごとに配信を停止でき、キューへの登録時に適用されます。配信停止ページでは、「すべてのマーケティング」の前に「このトピックのみ」が提示されます
  • 複数プロジェクト — 1 つのインスタンスで多数のプロジェクトに対応し、API キーで分離できます。猶予期間付きのキーのローテーションにも対応します
  • PII のログ内マスキング、すべての変更の監査ログ、プロジェクトごとのレート制限

運用

  • ダイジェスト、MCP サーバー、エージェントスキル、llms.txt
  • メトリクス — /v1/metrics、/v1/metrics/prometheus、テンプレートごとのメトリクス
  • 開封・クリックトラッキング — すべてのメールプロバイダー向けの独自ピクセルと署名付きリダイレクトリンク。デフォルトではマーケティングメールに適用されます(トランザクションメールのリンクは変更されません)。ジョブに opened_at / clicked_at を記録し、プロジェクト単位またはリクエスト単位で無効にできます
  • Webhook — 配信イベントを指定したエンドポイントに送信します
  • ワークフロー — イベントをトリガーとする複数ステップのシーケンス。状態は Postgres に保存されます
  • テンプレート — {{variable}} の置換に対応し、プロジェクトごとに保存されます

クイックスタート

Docker(推奨)

イメージは環境変数から設定を読み込みます。マウントする設定ファイルは不要です。

git clone https://github.com/rmzlb/notifyd.git && cd notifyd
cat > .env <<'EOF'
JWT_SECRET=change-me-32-random-chars-minimum
ADMIN_API_KEY=change-me-32-random-chars-minimum
RESEND_API_KEY=re_xxx
[email protected]
EOF
docker compose up -d          # notifyd + Postgres 16, http://localhost:3400

プロジェクトを作成し、API キーを取得します。

curl -s -X POST http://localhost:3400/v1/admin/projects \
  -H "X-Api-Key: $ADMIN_API_KEY" -H "Content-Type: application/json" \
  -d '{"id":"myapp","name":"My app","channels":["email","in_app"],"from_email":"[email protected]"}'
# → {"project": {"id": "myapp", "api_key": "sk_myapp_…", …}}

ビルド済みイメージ(linux/amd64、linux/arm64):ghcr.io/rmzlb/notifyd。

バイナリ、crate、Nix、またはソース
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/rmzlb/notifyd/releases/latest/download/notifyd-installer.sh | sh
brew install rmzlb/tap/notifyd             # macOS and Linux, Homebrew
cargo binstall notifyd                     # prebuilt from the GitHub release
cargo install notifyd                      # build from crates.io
nix run github:rmzlb/notifyd               # flake: packages, devShell, NixOS module
# then
DATABASE_URL=postgres://notifyd:pass@localhost:5432/notifyd \
JWT_SECRET=… ADMIN_API_KEY=… RESEND_API_KEY=… EMAIL_FROM=… notifyd

リリースバイナリ:Linux x86_64 および aarch64、macOS Intel および Apple Silicon。 NixOS:environmentFile を指定して services.notifyd.enable = true; を設定します(flake.nix を参照)。

プロバイダーがまだない場合は、EMAIL_PROVIDER=log を指定すると、メールを送信せずに出力します。

動作確認
curl http://localhost:3400/v1/health
# → {"status":"ok","db":"ok","version":"0.2.2","commit":"…","uptime_seconds":12}

→ 詳細なセットアップ、TOML の代替方法、本番環境に関する注意事項:docs/SETUP.md


API の概要

プロジェクトのエンドポイントでは X-Api-Key: sk_<project>_… を使用します。オペレーターのエンドポイントでは、管理者キーまたは読み取り専用キーを X-Api-Key または Authorization: Bearer として使用します。 受信トレイのエンドポイントでは、サブスクライバーの JWT も使用できます。

メソッドエンドポイント機能
POST/v1/send1 つまたは複数のチャネルで送信します
POST/v1/batchサブスクライバーのリスト、または segment フィルター宛てに送信します(一括レーン、冪等)
POST/v1/segments/previewセグメントに一致するサブスクライバーの数とサンプルを取得します
GET/v1/jobs/:idステータス、プロバイダー、試行回数、最終エラー
GET/v1/inbox/:id · /streamアプリ内受信トレイ、SSE リアルタイムストリーム
POST/v1/workflows/triggerイベントベースのワークフローをトリガーします
GET/v1/admin/digest対応が必要な項目とアクション
GET/v1/admin/jobs · /:id · POST …/:id/retry · /admin/send-testオペレーター向けの表示と操作(CLI の通信にも使用)
PATCH/v1/admin/projects/:id送信者、チャネル、レート制限、送信時間帯
POST/mcpMCP サーバー(Streamable HTTP)
GET/v1/metrics/prometheusPrometheus 形式のメトリクス
GET/u/:tokenワンクリックで登録解除するためのランディングページ

→ 各エンドポイントの例は docs/API.md をご覧ください。または、docs/llms.txt をエージェントに読み込ませてください。


他の選択肢との比較

NovuKnock / Courier / SuprSendnotifyd
インフラMongoDB + Redis + アプリコンテナ 4 つホステッド SaaSPostgres のみ、14 MB のイメージ 1 つ
セットアップ30 分以上サインアップ + ダッシュボードdocker compose up(2 分)
言語Node.js(複数のサービス)該当なし(ホステッド)Rust(単一バイナリ)
アイドル時のメモリ6 コンテナで 1.1 GB(同じマシンで測定)該当なし13 MB、10 万件のジョブの処理中は 23 MB(測定方法)
プルするイメージのサイズ1.4 GB該当なし14 MB
スループット—クォータによる制限44k ジョブ/秒でキューに追加、3.5k ジョブ/秒で処理(ベンチマーク)
プロバイダーの 429ジョブが失敗マネージドRetry-After の間チャネルを一時停止し、試行回数は消費せず、最初にフェイルオーバープロバイダーを試行
優先度 / 送信時間帯❌✅✅ クリティカル → 一括レーン、サブスクライバーごとのタイムゾーンに応じた時間帯
運用機能React ダッシュボードダッシュボード + APIダイジェストエンドポイント、MCP サーバー、Agent Skills、Prometheus
リアルタイムWebSocketWebSocketSSE、ネイティブの EventSource、複数レプリカ
セルフホスト✅(大規模)❌✅ 会社ごとにコンテナ 1 つ
費用無料枠 / 有料通知ごと永久無料、MIT

この表の数値はすべて当社が測定したものです。Novu の数値は、同じマシン上で当社と同じツールを使用し、アイドル状態にした、Novu 独自のコミュニティ版 docker-compose に基づいています。測定方法、ハードウェア、バイアスに関する免責事項は docs/BENCHMARKS.md をご覧ください。


クライアント

どちらのクライアントも API 全体(送信、バッチ、ジョブ、サブスクライバー、設定、テンプレート、ワークフロー、抑制、受信トレイ)に対応し、2xx 以外のレスポンスでは型付きエラーを発生させます。

TypeScript / JavaScript — 今週 notifyd-sdk パッケージが npm に公開されるまでは npm i github:rmzlb/notifyd を使用してください。パッケージ名と以下のインポート方法は変わりません(Node 18 以降、ブラウザー、エッジランタイムに対応。依存関係ゼロ)。

import { createNotifydClient } from 'notifyd-sdk';

const notifyd = createNotifydClient({ url: process.env.NOTIFYD_URL!, apiKey: process.env.NOTIFYD_API_KEY! });

const { jobIds } = await notifyd.send({
  channels: ['email', 'in_app'], subscriberId: 'user-42',
  subject: 'Your order shipped', body: 'Hi {{first_name}}, parcel {{parcel}} is on its way.',
  vars: { first_name: 'Alice', parcel: 'FR-2041' }, idempotencyKey: 'order-2041-shipped',
});
const job = await notifyd.getJob(jobIds[0]);   // status, provider, attempts, delivery events

// Browser inbox: subscriber token from your backend, live updates over EventSource
const inbox = createNotifydClient({ url, subscriberToken });
const stream = await inbox.openInboxStream('user-42', { onMessage: (e) => {
  const event = JSON.parse(e.data);
  if (event.type === 'new_notification') showToast(event.notification);
  if (event.type === 'count_update') updateBadge(event.unread_count);
} });

Python — 今週 notifyd-sdk が PyPI に公開されるまでは pip install "git+https://github.com/rmzlb/notifyd.git#subdirectory=clients/python" を使用してください(3.9 以降、同期および asyncio に対応、httpx のみ使用) — clients/python

from notifyd import Notifyd

nd = Notifyd(os.environ["NOTIFYD_URL"], api_key=os.environ["NOTIFYD_API_KEY"])
result = nd.send(channels=["email", "in_app"], subscriber_id="user-42",
                 subject="Your order shipped", body="Hi {{first_name}}, parcel {{parcel}} is on its way.",
                 vars={"first_name": "Alice", "parcel": "FR-2041"}, idempotency_key="order-2041-shipped")
print(nd.get_job(result["job_ids"][0])["status"])

その他の言語では、API は HTTP 経由のフラットな JSON であり、docs/llms.txt に全仕様が 1 ページにまとまっています。


ワークフロー

イベントによってトリガーされる複数ステップのシーケンスです。Postgres に状態が保存され、再起動後も維持されます。ステップは順番に実行され、条件によってステップのインデックスにジャンプします。

curl -X POST http://localhost:3400/v1/workflows -H "X-Api-Key: sk_myapp_xxx" -d '{
  "id": "welcome-series", "name": "Welcome series", "trigger_event": "user.signup",
  "steps": [
    {"type": "send", "channel": "email", "template": "welcome"},
    {"type": "delay", "duration_secs": 86400},
    {"type": "condition", "field": "payload.plan", "operator": "eq", "value": "pro", "on_true": 4},
    {"type": "send", "channel": "email", "template": "nudge"}
  ]}'

curl -X POST http://localhost:3400/v1/workflows/trigger -H "X-Api-Key: sk_myapp_xxx" \
  -d '{"event": "user.signup", "subscriber_id": "user-42", "payload": {"plan": "free"}}'

ステップの種類:send、delay、condition(inbox.is_read または payload.<key>)、digest(一定期間イベントを収集してから、1 通のメッセージを送信)。完全なスクリプトはこちらです:examples/welcome-series.sh。


設定

環境変数が主なインターフェースです(イメージと compose ファイルでは環境変数を使用します)。ローカル開発では notifyd.toml も利用できます。必須項目:DATABASE_URL、JWT_SECRET、ADMIN_API_KEY。さらに、次のいずれかのプロバイダーが必要です。

変数用途
EMAIL_PROVIDERresend(RESEND_API_KEY が設定されている場合のデフォルト)、cloudflare、smtp、agentmail、log
EMAIL_FROM、EMAIL_FROM_NAMEインスタンスのデフォルト送信者。プロジェクトごとに上書きできます
EMAIL_FALLBACK_PROVIDER429 / 5xx が発生した場合の第 2 プロバイダー
EMAIL_RATE_PER_SECレプリカごとの送信ペース
SMS_PROVIDER、SMS_FROM認証情報を設定した telnyx、twilio、または smsmode
PUBLIC_URLワンクリック配信停止リンク、および Twilio と smsmode の SMS 配信状況確認用のベース URL
READONLY_API_KEYオプションの読み取り専用オペレーターキー

→ プロバイダーごとの全変数:docs/CONNECTORS.md および docker-compose.yml。TOML リファレンス: notifyd.toml.example。


アーキテクチャ

                 ┌──────────────────────── notifyd (one binary) ───────────────────────┐
 HTTP /v1, /mcp ─▶ axum API ─▶ jobs table ─▶ worker: claim (SKIP LOCKED, by priority) │
                 │                              ├─ pacer per channel, channel pause on 429│
                 │                              ├─ connectors (email/sms/whatsapp/push/in-app)
                 │                              ├─ failover breaker, retries, reaper      │
                 │                              └─ webhooks, metrics, audit               │
                 │  SSE hub ◀── Postgres NOTIFY ── (any replica)                          │
                 └───────────────────────────────┬──────────────────────────────────────┘
                                                 ▼
                                           PostgreSQL 16
src/
├── api/              # routes: send, batch, jobs, inbox, subscribers, templates, workflows, webhooks, admin ops, health
├── connectors/       # email (resend, cloudflare, smtp, agentmail, log), sms, whatsapp, push, in_app
├── worker.rs         # claim by priority, batch context, finalize, retries, failover
├── pacing.rs         # token buckets and channel pauses
├── failover.rs       # provider circuit breaker
├── ops.rs            # digest, findings, operator actions
├── mcp.rs            # MCP server (tools, annotations, audit)
├── send_window.rs    # quiet hours in the subscriber's timezone
├── unsubscribe.rs    # List-Unsubscribe tokens and landing
├── sse.rs            # inbox stream, Postgres NOTIFY fan-out
├── workflow_engine.rs, templates.rs, webhooks.rs, deliverability.rs, metrics.rs, pii.rs, middleware.rs
migrations/           # SQL, applied at start-up
skills/               # Agent Skills: operate, integrate, deploy
server.json           # MCP registry entry
flake.nix             # Nix package, devShell, NixOS module
dist-workspace.toml   # cargo-dist: release binaries and installer

約 14,000 行の Rust で構成され、unsafe はありません。バイナリは 12 MB(イメージ内の静的 musl 版は 16 MB)、プルするイメージは 14 MB、ディスク上では 31 MB です。アイドル時の RSS は 13 MB、100,000 件のジョブを処理している間は 23 MB です。→ docs/ARCHITECTURE.md


ステータス

notifyd は 0.x で、3 社の本番環境で稼働しています。まだ対応していないもの: Swift および Kotlin パッケージ。設計上、ダッシュボード、A/B テスト、受信メール機能はありません。順序と規模は docs/ROADMAP.md をご覧ください。破壊的変更はリリースノートで告知され、キュースキーマは自動的にマイグレーションされます。


ドキュメント

📦 セットアップローカル開発、Docker、本番環境
🧪 サンプルcurl、TypeScript、Python、10k 件のキャンペーン、ワークフロー、ブラウザーの受信トレイ、MCP 設定
🐍 Python クライアント · TypeScript クライアント全 API 対応クライアント、型付きエラー、コントラクトテスト
🔌 API リファレンスすべてのエンドポイントの curl / TypeScript / Rust サンプル
🤝 エージェント運用ダイジェスト、MCP ツール、読み取り専用キー、エージェントによるインスタンスの実行方法
🔌 コネクタープロバイダー、環境変数、追加方法
🏗️ アーキテクチャキュー、優先度、送信ペース、SSE、コネクター
📈 ベンチマークリソース使用量、スループット、再現方法
🚀 デプロイ会社ごとのインスタンス、運用手順書
📝 執筆記事PostgreSQL だけで通知キューを構築する:SKIP LOCKED では実現できないこと
🗺️ ロードマップ今後の予定と順序、規模、意図的に計画していない内容
📣 公開状況レジストリと公開チャネル
🤖 llms.txtエージェント向けのプレーンテキスト版 API

コントリビューション

Issue とプルリクエストを歓迎します。まずは good first issue から始めてください。大きな機能の開発は、まず Issue の作成から始めてください。CONTRIBUTING.md をお読みください。

git clone https://github.com/YOUR_USERNAME/notifyd.git && cd notifyd
cargo test && EMAIL_PROVIDER=log DATABASE_URL=… JWT_SECRET=dev ADMIN_API_KEY=dev cargo run

ライセンス

MIT。

フランス、グルノーブルで 🦀 とともに開発 🏔️

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。