mcpField
C
CanYouGrab.it

CanYouGrab.it

リモート
github.com/einiba開発ツール14 週間前に更新
リポジトリ

CanYouGrab.it について

CanYouGrab.itはDNSを使ってドメインの利用可否を調べ、利用可能・不可・判定不能の結果を返すAPIです。ドメイン検索を必要とするAPI利用者向けに、アカウントの使用量、クォータ、キー管理も提供します。

主な機能

  1. 01最大100ドメインの一括チェック
  2. 02DNSに基づく利用可否の判定
  3. 03分単位・月単位のクォータ管理
  4. 04APIキーの作成・ローテーション・失効
  5. 05アカウント使用量の概要

活用シーン

  1. 01複数ドメインを一度に確認
  2. 02アプリケーションへのドメイン検索の組み込み
  3. 03APIクォータと使用量の監視
  4. 04API利用者の認証情報の管理

MCP 対応

READMEにはMCPサービスと実行環境への言及がありますが、クライアント向けのツールや機能は記載されていません。

設定

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

エンドポイントhttps://api.canyougrab.it/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 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
pypimcp-server-canyougrab1.1.1

ツール

3
パラメーター型必須説明
domainsarrayはい

詳細

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/checkoutStripe Checkout セッションを作成します。
POST/api/billing/portalStripe Customer Portal セッションを作成します。
POST/api/billing/setup-cardFree+ のカード登録用 SetupIntent を作成します。
POST/api/billing/confirm-free-plusカードのフィンガープリントを検証し、Free+ にアップグレードします。
GET/api/billing/card-statusユーザーのカードが登録済みか確認します。
GET/api/billing/usage/detailedポータルのダッシュボード用に、キーごとの使用状況の内訳を取得します。
POST/api/antifraud/turnstile/verifyCloudflare 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/webhookStripe 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 リクエストあたりのドメイン数価格
Free50030/min30$0
Free+10,000100/min100$0(カード登録が必要)
Basic20,000300/min100$10/mo
Pro50,0001,000/min100$20/mo
Business300,0003,000/min100$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ドメインは登録済みで、委任されています
NXDOMAINtrueドメインはゾーンに存在しません — おそらく取得可能です
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.itFastAPI + ワーカー
開発環境dev.canyougrab.itFastAPI + ワーカー
ポータルportal.canyougrab.itZudoku 静的サイト
認証auth.canyougrab.itAuth0 カスタムドメイン
外部サービス
サービス用途
DigitalOceanドロップレット(API サーバー、Unbound リゾルバー)、マネージド PostgreSQL、マネージド Valkey
Cloudflarecanyougrab.it ゾーンの DNS、CDN、SSL、Turnstile によるボット対策
Auth0ユーザー認証、ソーシャルログイン(Google + Apple)、JWT の発行
Stripeサブスクリプション課金、チェックアウト、顧客ポータル、Webhook
GitHub ActionsCI/CD デプロイパイプライン

デプロイパイプライン

本番環境へのデプロイ

トリガー: v* に一致する git タグをプッシュします(例:v1.0.5)

git tag v1.0.5 && git push origin v1.0.5

パイプライン(.github/workflows/deploy.yml):

  1. GitHub Actions は v* タグのプッシュ時に実行されます
  2. DEPLOY_SSH_KEY を使用して本番サーバー(DEPLOY_HOST シークレット)に SSH 接続します
  3. サーバー上で対象の ref を準備します(git fetch + git checkout <tag>)
  4. リポジトリ管理のデプロイスクリプトを実行します:/opt/canyougrab-repo/scripts/deploy-host.sh
開発環境へのデプロイ

トリガー: dev ブランチにプッシュします

git push origin dev

パイプライン(.github/workflows/deploy-dev.yml):

  1. GitHub Actions は dev へのプッシュ時に実行されます
  2. 同じ DEPLOY_SSH_KEY を使用して開発サーバー(DEV_DEPLOY_HOST シークレット)に SSH 接続します
  3. サーバー上で dev の ref を準備します(git fetch + git checkout dev)
  4. リポジトリ管理のデプロイスクリプトを実行します:/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(ポータル、ドキュメント)に、コンテンツが英語話者を対象としていることを示す情報を含める必要があります。

  1. すべてのページに <html lang="en"> を含めてください。
  2. <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}" />
    
  3. canonical タグ — 自己参照する <link rel="canonical" href="{page_url}" />。
  4. すべてのコンテンツを英語にする — どのページにもイタリア語のテキストを含めないでください。

これは、ポータル(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 のポータル/ドキュメントフレームワークを使用しています。

サーバー上のプロセス

コアサービス(すべてのホスト)
  1. FastAPI(uvicorn):ポート 8000 ですべての HTTP エンドポイントを提供します
  2. RQ Worker(worker.py):RQ キューからドメイン確認ジョブを処理します
  3. MCP サーバー(このサーバーで /mcp をホストする場合):リモート MCP クライアントにサービスを提供します
監視スタック(API ホスト、任意)
  1. Prometheus(localhost:9090):メトリクスをスクレイプし、アラートルールを評価します
  2. Alertmanager(localhost:9093):アラートを Slack にルーティングします
  3. redis_exporter(localhost:9121):Valkey のメトリクスを Prometheus にエクスポートします
  4. RQ metrics exporter(localhost:9122):キューの深さ、ワーカー数、失敗したジョブをエクスポートします
  5. Grafana(localhost:3000、nginx 経由でプロキシ):キューの健全性を示すダッシュボードを提供します
  6. Auto-scaler(任意):DO API 経由でワーカードロップレットの数を増減します

監視スタックをインストールするには、sudo bash scripts/setup-monitoring.sh を実行します。

ホスト上のすべての稼働中サービスは systemd で管理し、デプロイ時に再起動する必要があります。 すべての自動デプロイは scripts/deploy-host.sh 経由で行ってください。このスクリプトが、ホストにインストールされている該当サービスを再起動します。

コメント

MCP は初めてですか?

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

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