CanYouGrab.it について
CanYouGrab.itはDNSを使ってドメインの利用可否を調べ、利用可能・不可・判定不能の結果を返すAPIです。ドメイン検索を必要とするAPI利用者向けに、アカウントの使用量、クォータ、キー管理も提供します。
主な機能
- 01最大100ドメインの一括チェック
- 02DNSに基づく利用可否の判定
- 03分単位・月単位のクォータ管理
- 04APIキーの作成・ローテーション・失効
- 05アカウント使用量の概要
活用シーン
- 01複数ドメインを一度に確認
- 02アプリケーションへのドメイン検索の組み込み
- 03APIクォータと使用量の監視
- 04API利用者の認証情報の管理
MCP 対応
READMEにはMCPサービスと実行環境への言及がありますが、クライアント向けのツールや機能は記載されていません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.canyougrab.it/mcpclaude mcp add --transport http einiba-canyougrab https://api.canyougrab.it/mcp{"mcpServers":{"einiba-canyougrab":{"type":"http","url":"https://api.canyougrab.it/mcp"}}}Cursor で開く{"servers":{"einiba-canyougrab":{"type":"http","url":"https://api.canyougrab.it/mcp"}}}VS Code で開く{"mcpServers":{"einiba-canyougrab":{"type":"http","url":"https://api.canyougrab.it/mcp"}}}{"mcpServers":{"einiba-canyougrab":{"serverUrl":"https://api.canyougrab.it/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
3| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| domains | array | はい |
詳細
CanYouGrab API
FastAPI + DNS(Unbound resolver)で構築された、サブスクリプション課金対応のドメイン利用可能状況検索 API です。
稼働中のサービス:
- API:
https://api.canyougrab.it - 開発者ポータル:
https://portal.canyougrab.it - 認証:
https://auth.canyougrab.it(Auth0 のカスタムドメイン)
アーキテクチャの概要
┌──────────────────────────────────────────────────────────────────┐
│ Developer Portal │
│ (Zudoku/React on portal.canyougrab.it) │
│ Usage Dashboard · API Keys · Pricing · API Reference (OAS) │
└──────────────────┬───────────────────────────────────────────────┘
│ Auth0 JWT (portal) / Bearer API key (API)
▼
┌──────────────────────────────────────────────────────────────────┐
│ FastAPI Backend (v5.0.0) │
│ api.canyougrab.it:8000 │
│ │
│ ┌─────────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ app.py │ │ keys.py │ │billing.py│ │ auth.py │ │
│ │ /check/bulk │ │ /keys │ │/billing │ │ API key + │ │
│ │ /usage │ │ CRUD │ │/stripe │ │ JWT auth │ │
│ │ │ │ rotate │ │ webhook │ │ │ │
│ └──────┬──────┘ └──────────┘ └────┬─────┘ └─────────────┘ │
│ │ │ │
└─────────┼────────────────────────────┼───────────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Valkey (Redis) │ │ Stripe API │
│ Job queue + │ │ Subscriptions │
│ Rate limiting │ │ Webhooks │
└────────┬────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────────────────┐
│ RQ Worker │──DNS──▶ │ Unbound Resolver │
│ (worker.py) │ │ (dedicated droplet) │
│ ThreadPool(10) │ │ NS queries via VPC │
│ via RQ queue │ └──────────────────────────────┘
└─────────────────┘
┌──────────────────────────────┐
───────────────────▶│ PostgreSQL │
(auth, usage, │ API keys + Usage logs │
billing only) └──────────────────────────────┘
ディレクトリ構成
zuplo/
├── backend/ # Python FastAPI backend
│ ├── app.py # Main API: /check/bulk, /usage, /health
│ ├── auth.py # API key auth (SHA-256) + Auth0 JWT auth (RS256)
│ ├── billing.py # Stripe checkout, portal, webhooks, card-on-file, usage details
│ ├── keys.py # API key CRUD: create, list, rotate, revoke (+ Turnstile)
│ ├── antifraud.py # Anti-fraud: Turnstile, device fingerprints, risk scoring
│ ├── email_utils.py # Email normalization + disposable email detection
│ ├── dns_client.py # DNS-based domain availability checking via Unbound
│ ├── queries.py # PostgreSQL queries: usage tracking, auth, billing
│ ├── valkey_client.py # Redis/Valkey job queue client (RQ-backed)
│ ├── rq_tasks.py # RQ task function: process_domain_job()
│ ├── worker.py # RQ worker process (ThreadPoolExecutor per job)
│ ├── migrations/ # SQL migrations
│ │ └── 001_free_tier_antifraud.sql
│ └── requirements.txt # Python dependencies
├── portal/ # Developer portal (Zuplo + Zudoku)
│ ├── config/
│ │ ├── routes.oas.json # OpenAPI 3.1 spec (public API documentation)
│ │ └── policies.json # Zuplo policies (empty — all routing is direct)
│ ├── docs/ # Zudoku documentation portal
│ │ ├── src/
│ │ │ ├── config.ts # API_BASE, Turnstile site key, Stripe PK
│ │ │ ├── UsageDashboard.tsx # Usage + billing dashboard component
│ │ │ ├── PricingPage.tsx # Plan selection + Stripe checkout
│ │ │ ├── PricingPlans.tsx # Pricing card grid component
│ │ │ └── CardSetupPage.tsx # Stripe Elements card-on-file for Free+
│ │ ├── public/ # Static assets (logos, banners, CSS overrides)
│ │ ├── zudoku.config.tsx # Portal config: theme, nav, Auth0, API key mgmt
│ │ └── package.json # Frontend dependencies (React 19, Zudoku)
│ ├── package.json # Workspace root (Zuplo v6, TypeScript v5)
│ └── README.md # Zuplo boilerplate (not project-specific)
├── mcp-server/ # MCP package for ChatGPT, Claude, and remote MCP clients
│ ├── pyproject.toml # MCP package metadata + version
│ ├── server.json # MCP registry/server metadata
│ ├── uv.lock # Locked MCP runtime dependencies
│ └── src/canyougrab_mcp/
│ ├── __init__.py
│ └── server.py # stdio + streamable-http MCP entrypoint
├── .github/workflows/
│ ├── deploy.yml # Production deploy (on tag push v*)
│ └── deploy-dev.yml # Dev deploy (on push to dev branch)
├── .claude/
│ └── launch.json # Local dev server config (port 9200)
└── package.json # Root workspace config
API エンドポイント
パブリック API(API キー認証:Authorization: Bearer cyg_...)
| メソッド | パス | 説明 |
|---|---|---|
POST | /api/check/bulk | 最大 100 件のドメインを確認します。結果が準備できるまでロングポーリングします(最大 30 秒)。 |
GET | /api/account/usage | 認証済みの利用者の使用状況の概要を取得します。 |
GET | /api/account/quota-check | 月次および分単位のクォータを簡易確認します。 |
GET | /health | ヘルスチェック(認証不要)。 |
ポータル API(Auth0 JWT 認証)
| メソッド | パス | 説明 |
|---|---|---|
POST | /api/keys | 新しい API キーを作成します。 |
GET | /api/keys | ユーザーの API キー一覧を取得します。 |
POST | /api/keys/{id}/rotate | キーをローテーションします(古いキーを失効させ、新しいキーを作成)。 |
DELETE | /api/keys/{id} | キーを失効させます(ソフト削除)。 |
POST | /api/billing/checkout | Stripe Checkout セッションを作成します。 |
POST | /api/billing/portal | Stripe Customer Portal セッションを作成します。 |
POST | /api/billing/setup-card | Free+ のカード登録用 SetupIntent を作成します。 |
POST | /api/billing/confirm-free-plus | カードのフィンガープリントを検証し、Free+ にアップグレードします。 |
GET | /api/billing/card-status | ユーザーのカードが登録済みか確認します。 |
GET | /api/billing/usage/detailed | ポータルのダッシュボード用に、キーごとの使用状況の内訳を取得します。 |
POST | /api/antifraud/turnstile/verify | Cloudflare Turnstile トークンを検証します。 |
POST | /api/antifraud/device/register | デバイスフィンガープリントを登録します(Fingerprint Pro)。 |
GET | /api/antifraud/risk | 認証済みユーザーのリスク評価を取得します。 |
POST | /api/antifraud/assess-signup | サインアップ時に複数のシグナルによるリスク評価を実行します。 |
内部 API/Webhook
| メソッド | パス | 説明 |
|---|---|---|
POST | /api/account/usage/detailed | 複数の利用者の使用状況の内訳を取得します。 |
POST | /api/stripe/webhook | Stripe Webhook の受信エンドポイント(署名を検証)。 |
主なリクエストフロー
ドメイン利用可能状況の確認
Client FastAPI Valkey Worker Unbound
│ │ │ │ │
│ POST /api/check/bulk │ │ │ │
│ { domains: [...] } │ │ │ │
│─────────────────────────▶│ │ │ │
│ │── validate key ──────────│ │ │
│ │── check minute rate ────▶│ INCR ratelimit:id:min │ │
│ │── check monthly quota ──▶│ (PostgreSQL) │ │
│ │── record usage ─────────▶│ (PostgreSQL) │ │
│ │── create_job() ─────────▶│ HSET job:{uuid} │ │
│ │ │ RQ enqueue (with retry) │ │
│ │ │ │ │
│ │ │◀── RQ Worker dequeues ───│ │
│ │ │ │ │
│ │ │──── claim_job() ────────▶│ │
│ │ │ │── ThreadPool(10) │
│ │ │ │── check_domain_dns()
│ │ │ │── NS query ───────▶│
│ │ │ │◀── NOERROR/NXDOMAIN│
│ │ │◀── complete_job() ───────│ │
│ │ │ │ │
│ │◀─ poll get_job_status() ─│ │ │
│ │ (0.3s interval, 30s │ │ │
│ │ max timeout) │ │ │
│◀─────────────────────────│ │ │ │
│ { results: [...] } │ │ │ │
課金/サブスクリプションのフロー
User → Pricing Page → Select Plan → Auth0 login
→ POST /api/billing/checkout (JWT auth)
→ Find/create Stripe customer (linked by auth0_sub metadata)
→ Stripe Checkout Session created → redirect to Stripe
→ User pays → Stripe fires webhook
→ POST /api/stripe/webhook (HMAC-SHA256 verified)
→ checkout.session.completed → fetch subscription → get price ID
→ Map price to plan → UPDATE api_keys SET plan, lookups_limit
サブスクリプションプラン
| プラン | 月間検索数 | 分あたりのレート制限 | 1 リクエストあたりのドメイン数 | 価格 |
|---|---|---|---|---|
| Free | 500 | 30/min | 30 | $0 |
| Free+ | 10,000 | 100/min | 100 | $0(カード登録が必要) |
| Basic | 20,000 | 300/min | 100 | $10/mo |
| Pro | 50,000 | 1,000/min | 100 | $20/mo |
| Business | 300,000 | 3,000/min | 100 | $30/mo |
認証
API キー認証(パブリック API の利用者)
- 形式:
Authorization: Bearer cyg_<token> - キーは
api_keysテーブル内で SHA-256 ハッシュ化されます(平文は保存されません)。 - キーのプレフィックス(
cyg_XXXXXXXX...)は、ポータルでの表示用に保存されます。 - 完全なキーが返されるのは、作成時の一度だけです。
- 失効時はソフト削除されます(
revoked_atタイムスタンプを設定し、物理削除はしません)。
JWT 認証(ポータル/ダッシュボード)
- Auth0 テナント:
dev-mqe5tavp6dr62e7u - カスタムドメイン:
auth.canyougrab.it - アルゴリズム:JWKS 検証を使用する RS256(キャッシュ期間:1 時間)
- オーディエンス:
https://api.canyougrab.it - ソーシャルログイン:Google、Apple(Sign in with Apple)
DNS によるドメインの空き状況確認
ドメインの空き状況は、別の DigitalOcean ドロップレットで稼働する専用のUnbound 再帰 DNS リゾルバーに問い合わせて確認します。ワーカーは VPC のプライベートネットワーク経由で NS レコードを問い合わせ、その応答を解釈します。
| DNS 応答 | available | 意味 |
|---|---|---|
| NOERROR + NS レコード | false | ドメインは登録済みで、委任されています |
| NXDOMAIN | true | ドメインはゾーンに存在しません — おそらく取得可能です |
| NoAnswer(NOERROR、NS なし) | false | 登録済みですが、パーキング中または未委任です |
| SERVFAIL / タイムアウト | null | 判定できません — 確認に失敗しました |
Unbound リゾルバーは積極的にキャッシュし(登録済みドメインは 7 日間、NXDOMAIN は 5 分間)、TLD の権威サーバーに直接問い合わせるため、パブリックリゾルバーのレート制限を回避できます。
データベーススキーマ
PostgreSQL は認証、使用状況の追跡、課金に使用されます。ドメインの検索には使用しません。
PostgreSQL テーブル
| テーブル | 用途 | 主なカラム |
|---|---|---|
api_keys | ユーザー API キー | id、user_sub、email_normalized、key_hash、key_prefix、plan、lookups_limit、revoked_at |
usage_log_daily | 日次の使用状況集計 | consumer、lookups、recorded_at(DATE、consumer と日付の組み合わせごとに一意) |
usage_log_minute | 分単位の使用状況集計 | consumer、lookups、minute_start(TIMESTAMP、consumer と分の組み合わせごとに一意) |
card_fingerprints | カード 1 枚につき無料アカウント 1 つ | user_sub、stripe_fingerprint(一意の組み合わせ) |
device_fingerprints | デバイスベースの複数アカウント検出 | user_sub、visitor_id(Fingerprint Pro) |
account_risk | 複合リスクスコアリング | user_sub(一意)、risk_score、risk_signals(JSONB) |
Valkey(Redis)データ構造
| キーパターン | 型 | 用途 | TTL |
|---|---|---|---|
job:{uuid} | ハッシュ | ジョブのステータス、ドメイン、結果 | 1 時間 |
rq:queue:canyougrab-jobs | リスト | RQ ジョブキュー(RQ によって管理) | — |
rq:job:{uuid} | ハッシュ | RQ ジョブのメタデータ(再試行、ステータス) | 設定可能 |
ratelimit:{consumer}:{YYYYMMDDHHmm} | 文字列 | 分単位のレート制限カウンター(INCR) | 60 秒 |
インフラストラクチャ
サーバー
| 環境 | ドメイン | 用途 |
|---|---|---|
| 本番環境 | api.canyougrab.it | FastAPI + ワーカー |
| 開発環境 | dev.canyougrab.it | FastAPI + ワーカー |
| ポータル | portal.canyougrab.it | Zudoku 静的サイト |
| 認証 | auth.canyougrab.it | Auth0 カスタムドメイン |
外部サービス
| サービス | 用途 |
|---|---|
| DigitalOcean | ドロップレット(API サーバー、Unbound リゾルバー)、マネージド PostgreSQL、マネージド Valkey |
| Cloudflare | canyougrab.it ゾーンの DNS、CDN、SSL、Turnstile によるボット対策 |
| Auth0 | ユーザー認証、ソーシャルログイン(Google + Apple)、JWT の発行 |
| Stripe | サブスクリプション課金、チェックアウト、顧客ポータル、Webhook |
| GitHub Actions | CI/CD デプロイパイプライン |
デプロイパイプライン
本番環境へのデプロイ
トリガー: v* に一致する git タグをプッシュします(例:v1.0.5)
git tag v1.0.5 && git push origin v1.0.5
パイプライン(.github/workflows/deploy.yml):
- GitHub Actions は
v*タグのプッシュ時に実行されます DEPLOY_SSH_KEYを使用して本番サーバー(DEPLOY_HOSTシークレット)に SSH 接続します- サーバー上で対象の ref を準備します(
git fetch+git checkout <tag>) - リポジトリ管理のデプロイスクリプトを実行します:
/opt/canyougrab-repo/scripts/deploy-host.sh
開発環境へのデプロイ
トリガー: dev ブランチにプッシュします
git push origin dev
パイプライン(.github/workflows/deploy-dev.yml):
- GitHub Actions は
devへのプッシュ時に実行されます - 同じ
DEPLOY_SSH_KEYを使用して開発サーバー(DEV_DEPLOY_HOSTシークレット)に SSH 接続します - サーバー上で
devの ref を準備します(git fetch+git checkout dev) - リポジトリ管理のデプロイスクリプトを実行します:
/opt/canyougrab-repo/scripts/deploy-host.sh
リポジトリ管理のホストデプロイスクリプト
どちらのパイプラインでも、簡単なインライン SSH ブートストラップを使って /opt/canyougrab-repo を対象の参照に更新し、そのチェックアウト済みリビジョンの scripts/deploy-host.sh を呼び出します。リポジトリ管理のデプロイスクリプトは、次の処理を行います。
- バックエンドの依存関係を
pip install -r requirements.txtでインストールします - バックエンド、ポータル、MCP のソースツリーを、それぞれの実行ディレクトリに
rsyncで同期します - ホスト上で
canyougrab-mcp.serviceも実行している場合、mcp-serverパッケージ/ランタイムを再インストールまたは更新します - systemd 経由で FastAPI(uvicorn)、ワーカー、MCP サービスを再起動します
/mcp が API と同じホストで提供されている場合、バックエンドのみのデプロイでは不十分です。OAuth メタデータと稼働中の MCP の動作が食い違わないよう、同じデプロイ中に MCP サービスも更新して再起動する必要があります。
既存の /opt/deploy.sh は、必要に応じて手動で使用する互換シムとして残すことができますが、自動化されたパイプラインでは、リポジトリ内の scripts/deploy-host.sh を信頼できる唯一の情報源として扱ってください。
ブランチ戦略
| ブランチ | 用途 | デプロイ先 |
|---|---|---|
main | 本番リリース | タグ付け後 → api.canyougrab.it |
dev | 開発/ステージング | 自動 → dev.canyougrab.it |
| フィーチャーブランチ | 開発中の作業 | 自動デプロイなし |
環境変数
バックエンド(サーバーで必須)
# DNS Resolver (Unbound on dedicated droplet)
DNS_RESOLVER_HOSTNAME=unbound.canyougrab.internal # VPC internal hostname (resolved via socket.gethostbyname)
DNS_RESOLVER_PORT=53
DNS_QUERY_TIMEOUT=5.0 # Per-query timeout in seconds
# PostgreSQL (DigitalOcean Managed Database — auth, usage, billing only)
POSTGRES_HOST= # DB cluster hostname
POSTGRES_PORT=5432
POSTGRES_DB=canyougrab
POSTGRES_USER=canyougrab
POSTGRES_PASSWORD= # DB password
POSTGRES_SSLMODE=require
# Valkey / Redis (DigitalOcean Managed Database)
VALKEY_HOST= # Valkey cluster hostname
VALKEY_PORT=25061
VALKEY_USERNAME=default
VALKEY_PASSWORD= # Valkey password
# Auth0
AUTH0_DOMAIN=dev-mqe5tavp6dr62e7u.us.auth0.com
AUTH0_AUDIENCE=https://api.canyougrab.it
# Stripe
STRIPE_SECRET_KEY= # sk_live_... (prod) or sk_test_... (dev)
STRIPE_WEBHOOK_SECRET= # whsec_... (per-environment)
STRIPE_PRICE_BASIC= # price_... (live price ID for Basic plan)
STRIPE_PRICE_PRO= # price_... (live price ID for Pro plan)
STRIPE_PRICE_BUSINESS= # price_... (live price ID for Business plan)
# Cloudflare Turnstile (bot prevention on key creation)
TURNSTILE_SECRET_KEY= # 0x4AAAA... (from Cloudflare dashboard)
# Portal
PORTAL_URL=https://portal.canyougrab.it
# Worker
BATCH_CONCURRENCY=10 # Thread pool size for domain checks
VALKEY_QUEUE_NAME=canyougrab-jobs # RQ queue name (default: canyougrab-jobs)
# Monitoring (optional — only if monitoring stack is installed)
SLACK_ALERTS_WEBHOOK_URL= # Slack incoming webhook for Alertmanager
RQ_METRICS_PORT=9122 # Prometheus metrics exporter port
# Auto-scaler (optional — only on API host with autoscaler enabled)
DO_API_TOKEN= # DigitalOcean API token
DO_WORKER_SNAPSHOT_ID= # Snapshot ID for new worker droplets
AUTOSCALER_MIN_WORKERS=1
AUTOSCALER_MAX_WORKERS=5
AUTOSCALER_SCALE_UP_THRESHOLD=50
AUTOSCALER_SCALE_DOWN_IDLE_MINUTES=10
GitHub Actions のシークレット
| シークレット | 用途 |
|---|---|
DEPLOY_HOST | 本番サーバーの IP |
DEV_DEPLOY_HOST | 開発サーバーの IP |
DEPLOY_SSH_KEY | 両サーバー用の SSH 秘密鍵 |
ローカル開発
バックエンド
cd backend
pip install -r requirements.txt
# Start API server
uvicorn app:app --reload --port 8000
# Start worker (separate terminal)
python worker.py
DNS_RESOLVER_HOST に Unbound インスタンスを指定する必要があります(または基本的なテストには 8.8.8.8 を使用してください)。また、PostgreSQL と Valkey/Redis(ローカルまたはマネージドインスタンスへのトンネル接続)が必要です。
ポータル
cd portal/docs
npm install
npm run dev # Starts Zudoku dev server (via zuplo)
または、設定済みの起動サーバーを使用してください。
# From repo root
npx zuplo dev # Starts on port 9200
ポータルの開発サーバーでは、portal/docs/src/config.ts の API_BASE が https://api.canyougrab.it にハードコードされています。ローカルのバックエンドに接続して開発する場合は、これを http://localhost:8000 に変更してください。
SEO:.it TLD の地域ターゲティング要件
canyougrab.it はイタリアの国別コード TLD(.it)を使用しているため、ユーザー向けのすべての HTML(ポータル、ドキュメント)に、コンテンツが英語話者を対象としていることを示す情報を含める必要があります。
- すべてのページに
<html lang="en">を含めてください。 <head>に hreflang タグを含めてください。<link rel="alternate" hreflang="en-US" href="{page_url}" /> <link rel="alternate" hreflang="en" href="{page_url}" /> <link rel="alternate" hreflang="x-default" href="{page_url}" />- canonical タグ — 自己参照する
<link rel="canonical" href="{page_url}" />。 - すべてのコンテンツを英語にする — どのページにもイタリア語のテキストを含めないでください。
これは、ポータル(portal.canyougrab.it)、API ドキュメント、および公開されるその他すべての HTML に適用されます。
主な設計上の決定事項
- DNS のリアルタイム照会:ドメインの利用可否は、専用の Unbound 再帰リゾルバーへの NS クエリで確認します。これにより、リアルタイムの結果が得られ(ゾーンファイルの反映に 24 時間かかることはありません)、あらゆる TLD に自動的に対応し、ゾーンファイルを毎日バッチで読み込む運用の複雑さを回避できます。Unbound は積極的にキャッシュするため(登録済みドメインは 7 日間)、繰り返しのクエリは約 1 ミリ秒で完了します。
- 利用可否は null を許容:DNS には、データベースへの照会よりも多くの失敗パターンがあります。Unbound が SERVFAIL を返すかタイムアウトした場合、API は危険な誤判定につながりかねない値ではなく、
available: nullを返します。利用側ではnullを「判定できなかった」として扱ってください。 - 一括確認用のジョブキュー:一括エンドポイントでは、Valkey をバックエンドとする RQ(Redis Queue)を使ってジョブをディスパッチし、自動再試行(2 回再試行、5 秒/30 秒のバックオフ)と失敗したジョブの追跡を行います。ワーカーはスレッドプールを使って DNS クエリを並列処理します。
- ロングポーリング:一括確認エンドポイントは、クライアント側でポーリングを実装する必要がないよう、HTTP 接続を開いたままにします(Valkey を 0.3 秒ごとにポーリングし、最大 45 秒間)。ジョブの結果は RQ 組み込みの結果ストレージではなく、独自の Valkey ハッシュに保存するため、ポーリング処理はキューフレームワークから独立しています。
- SHA-256 ハッシュによる API キー:キーは保存前にハッシュ化されるため(パスワードと同様)、データベースが侵害されてもキーの生値は漏えいしません。
- Stripe メタデータによる関連付け:Stripe の顧客オブジェクトにある
auth0_subメタデータを使って、Stripe の顧客を Auth0 ユーザーに関連付けます。これにより、別途マッピングテーブルを用意する必要がありません。 - 使用量の二重記録:月間クォータと 1 分あたりのレート制限にそれぞれ対応するため、日次(
usage_log_daily)と分単位(usage_log_minute)の使用量をどちらも記録します。 - Zuplo ゲートウェイポリシーなし:このプロジェクトでは当初、API ゲートウェイとして Zuplo を使用していましたが、FastAPI への直接接続に移行しました(コミット
3abef70)。開発者ポータルには引き続き Zuplo のポータル/ドキュメントフレームワークを使用しています。
サーバー上のプロセス
コアサービス(すべてのホスト)
- FastAPI(uvicorn):ポート 8000 ですべての HTTP エンドポイントを提供します
- RQ Worker(worker.py):RQ キューからドメイン確認ジョブを処理します
- MCP サーバー(このサーバーで
/mcpをホストする場合):リモート MCP クライアントにサービスを提供します
監視スタック(API ホスト、任意)
- Prometheus(localhost:9090):メトリクスをスクレイプし、アラートルールを評価します
- Alertmanager(localhost:9093):アラートを Slack にルーティングします
- redis_exporter(localhost:9121):Valkey のメトリクスを Prometheus にエクスポートします
- RQ metrics exporter(localhost:9122):キューの深さ、ワーカー数、失敗したジョブをエクスポートします
- Grafana(localhost:3000、nginx 経由でプロキシ):キューの健全性を示すダッシュボードを提供します
- Auto-scaler(任意):DO API 経由でワーカードロップレットの数を増減します
監視スタックをインストールするには、sudo bash scripts/setup-monitoring.sh を実行します。
ホスト上のすべての稼働中サービスは systemd で管理し、デプロイ時に再起動する必要があります。
すべての自動デプロイは scripts/deploy-host.sh 経由で行ってください。このスクリプトが、ホストにインストールされている該当サービスを再起動します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。