notifyd について
notifydは、メール、SMS、WhatsApp、プッシュ通知などを送るセルフホスト型通知サーバーです。MCPツールから配信状況を調べ、ジョブ、プロジェクト、抑制リストを操作でき、APIやCLIも利用できます。
主な機能
- 01複数チャネルへの通知配信
- 02キュー送信、再試行、プロバイダー切り替え
- 03優先レーンと受信者ごとの配信停止時間
- 04ジョブ運用向けMCPツール
- 05ダイジェスト、メトリクス、監査ログ
活用シーン
- 01エージェントによる配信問題の確認
- 02通知ジョブの再試行やキャンセル
- 03複数チャネルでのテスト送信
- 04プロジェクト設定と抑制リストの管理
MCP 対応
`/mcp`でStreamable HTTPのMCPサーバーを公開し、ダイジェスト、ジョブ、プロジェクト、抑制リスト、メトリクス、テスト送信のツールを提供します。読み取り専用キーにより、確認ツールだけに制限できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://{notifyd_host}/mcpclaude mcp add --transport http rmzlb-notifyd https://{notifyd_host}/mcp{"mcpServers":{"rmzlb-notifyd":{"type":"http","url":"https://{notifyd_host}/mcp"}}}Cursor で開く{"servers":{"rmzlb-notifyd":{"type":"http","url":"https://{notifyd_host}/mcp"}}}VS Code で開く{"mcpServers":{"rmzlb-notifyd":{"type":"http","url":"https://{notifyd_host}/mcp"}}}{"mcpServers":{"rmzlb-notifyd":{"serverUrl":"https://{notifyd_host}/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://{notifyd_host}/mcp認証が必要ghcr.io/rmzlb/notifyd:0.4.0Streamable HTTPツール
詳細
notifyd
1 回の API 呼び出しで、メール、SMS、WhatsApp、プッシュ通知、アプリ内通知を送信できます。
12 MB の Rust バイナリ 1 つで動作し、必要なのは PostgreSQL のみです。キュー、再試行、プロバイダーのフェイルオーバー、通知を控える時間帯の管理はすべて任せられ、AI エージェントは 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 秒の解説動画。データは架空です。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_suppression | all または 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)、既読 / アーカイブ / スター、未読バッジ、PostgresNOTIFYによる複数レプリカ対応
配信エンジン
- 優先度 —
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/send | 1 つまたは複数のチャネルで送信します |
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 | /mcp | MCP サーバー(Streamable HTTP) |
GET | /v1/metrics/prometheus | Prometheus 形式のメトリクス |
GET | /u/:token | ワンクリックで登録解除するためのランディングページ |
→ 各エンドポイントの例は docs/API.md をご覧ください。または、docs/llms.txt をエージェントに読み込ませてください。
他の選択肢との比較
| Novu | Knock / Courier / SuprSend | notifyd | |
|---|---|---|---|
| インフラ | MongoDB + Redis + アプリコンテナ 4 つ | ホステッド SaaS | Postgres のみ、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 |
| リアルタイム | WebSocket | WebSocket | SSE、ネイティブの 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_PROVIDER | resend(RESEND_API_KEY が設定されている場合のデフォルト)、cloudflare、smtp、agentmail、log |
EMAIL_FROM、EMAIL_FROM_NAME | インスタンスのデフォルト送信者。プロジェクトごとに上書きできます |
EMAIL_FALLBACK_PROVIDER | 429 / 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。
フランス、グルノーブルで 🦀 とともに開発 🏔️
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。