mcpField
C
cloudflare-api

cloudflare-api

github.com/jezwebクラウド・DevOps1.1k992 回インストール3 週間前に更新
リポジトリ

cloudflare-api について

cloudflare-apiは、wranglerやMCPツールが適さない場合にCloudflare REST APIを使うスキルです。DNS、ゾーン設定、ファイアウォールルール、分析データ、Cloudflare開発者向けプラットフォームのリソースを、スクリプトで一括・複数ゾーン処理します。

主な機能

  1. 01Cloudflare REST APIの直接利用
  2. 02DNSとリダイレクトの一括操作
  3. 03複数ゾーンへの設定適用
  4. 04ファイアウォール、キャッシュ、Workerルートの管理
  5. 05GraphQLによる分析データのクエリ
  6. 06安全策を含むスクリプト生成

活用シーン

  1. 01多数のDNSレコードの移行や更新
  2. 02複数ゾーンへの設定適用
  3. 03リダイレクトルールの一括作成
  4. 04アカウントリソースの監査や分析データの照会

MCP 対応

MCP サーバーが一括処理やスクリプト操作に適さない場合、Cloudflare APIへの直接リクエストを使います。個別操作ではMCPも選択肢として示されています。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jezweb/claude-skills --skill cloudflare-api

インストール後、Claude Code で/cloudflare-apiを入力して読み込まれたか確認します。

同梱ファイルreferences/developer-platform-api.md

詳細

Cloudflare API

wrangler CLI や MCP サーバーが適切でない場合は、Cloudflare REST API を直接呼び出します。大量操作、フリート全体にわたる変更、wrangler では公開されていない機能に使用します。

Wrangler や MCP の代わりにこれを使う場合

ユースケースWranglerMCPこのスキル
Worker をデプロイするはいはいいいえ
D1 データベースを作成するはいはいいいえ
DNS レコードを 50 件一括更新する遅い(一度に 1 件)遅い(ツール呼び出し 1 回につき 1 件)はい — バッチスクリプト
ホワイトラベル用のカスタムホスト名いいえ一部対応はい
メールルーティングルールいいえ一部対応はい
WAF/ファイアウォールルールいいえはい、ただし冗長はい — API を直接呼び出す
リダイレクトルールを一括設定するいいえ一度に 1 件はい — バッチスクリプト
20 個のゾーンにゾーン設定を適用するいいえ20 回の個別呼び出しはい — フリートスクリプト
タグ/プレフィックスでキャッシュをパージするいいえはいはい(スクリプトを作成する場合)
Worker のルート管理限定的はいはい(一括操作の場合)
アナリティクス/ログのクエリいいえ一部対応はい — GraphQL
複数のデータベースにまたがる D1 のクエリ/エクスポート一度に 1 個の DB一度に 1 個の DBはい — 複数 DB 対応スクリプト
R2 オブジェクトの一括操作いいえ一度に 1 件はい — S3 API + バッチ
KV の一括読み取り/書き込み/削除一度に 1 件一度に 1 件はい — 一括エンドポイント
Vectorize のクエリ/削除いいえWorker 経由のみはい — API を直接呼び出す
Queue へのメッセージ注入いいえWorker 経由のみはい — API を直接呼び出す
アカウント内のすべてのリソースを監査するいいえ手間がかかるはい — インベントリスクリプト

目安:単一操作 → MCP または wrangler。一括/フリート/スクリプトによる操作 → API を直接呼び出します。

認証の設定

API トークン(推奨)

Dashboard → My Profile → API Tokens → Create Token から、スコープを指定したトークンを作成します。

# Store it
export CLOUDFLARE_API_TOKEN="your-token-here"

# Test it
curl -s "https://api.cloudflare.com/client/v4/user/tokens/verify" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq '.success'

トークンのスコープ:常に最小限の権限を使用してください。よく使われるプリセット:

  • 「Edit zone DNS」— DNS 操作用
  • 「Edit zone settings」— ゾーン設定の変更用
  • 「Edit Cloudflare Workers」— Worker ルートの管理用
  • 「Read analytics」— GraphQL アナリティクス用
アカウント ID とゾーン ID
# List your zones (find zone IDs)
curl -s "https://api.cloudflare.com/client/v4/zones?per_page=50" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq '.result[] | {name, id}'

# Get zone ID by domain name
ZONE_ID=$(curl -s "https://api.cloudflare.com/client/v4/zones?name=example.com" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq -r '.result[0].id')

ID は環境変数または設定ファイルに保存し、スクリプトに直接記述しないでください。

ワークフロー

DNS の一括操作

複数のレコードを一度に追加/更新する(例:ドメインの移行、新しいクライアントの設定):

# Pattern: read records from a file, create in batch
while IFS=',' read -r type name content proxied; do
  curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"type\":\"$type\",\"name\":\"$name\",\"content\":\"$content\",\"proxied\":$proxied,\"ttl\":1}" \
    | jq '{name: .result.name, id: .result.id, success: .success}'
  sleep 0.25  # Rate limit: 1200 req/5min
done < dns-records.csv

ゾーンからすべてのレコードをエクスポートする(バックアップまたは移行):

curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?per_page=100" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  | jq -r '.result[] | [.type, .name, .content, .proxied] | @csv' > dns-export.csv

レコード全体から文字列を検索して置換する(例:IP の移行):

OLD_IP="203.0.113.1"
NEW_IP="198.51.100.1"

# Find records pointing to old IP
RECORDS=$(curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?content=$OLD_IP" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq -r '.result[].id')

# Update each one
for RECORD_ID in $RECORDS; do
  curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"content\":\"$NEW_IP\"}" | jq '.success'
done
カスタムホスト名(ホワイトラベルのクライアントドメイン)

クライアントが独自のドメイン(例:app.clientdomain.com → あなたの Worker)を使用する SaaS アプリ向け:

# Create custom hostname
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/custom_hostnames" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "app.clientdomain.com",
    "ssl": {
      "method": "http",
      "type": "dv",
      "settings": {
        "min_tls_version": "1.2"
      }
    }
  }' | jq '{id: .result.id, status: .result.status, ssl_status: .result.ssl.status}'

# List custom hostnames
curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/custom_hostnames?per_page=50" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  | jq '.result[] | {hostname, status, ssl_status: .ssl.status}'

# Check status (client needs to add CNAME)
curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/custom_hostnames/$HOSTNAME_ID" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq '.result.status'

クライアントの設定:CNAME を追加します:app.clientdomain.com → your-worker.your-domain.com

メールルーティングルール
# Enable email routing on zone
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/enable" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

# Create a routing rule (forward info@ to a real address)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/rules" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Forward info@",
    "enabled": true,
    "matchers": [{"type": "literal", "field": "to", "value": "[email protected]"}],
    "actions": [{"type": "forward", "value": ["[email protected]"]}]
  }' | jq '.success'

# Create catch-all rule
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/rules" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Catch-all",
    "enabled": true,
    "matchers": [{"type": "all"}],
    "actions": [{"type": "forward", "value": ["[email protected]"]}]
  }' | jq '.success'

# List rules
curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/rules" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq '.result[] | {name, enabled, matchers, actions}'
キャッシュのパージ
# Purge everything (nuclear option)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"purge_everything": true}'

# Purge specific URLs
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"files": ["https://example.com/styles.css", "https://example.com/app.js"]}'

# Purge by cache tag (requires Enterprise or cache tag headers)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tags": ["product-123", "homepage"]}'

# Purge by prefix
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"prefixes": ["https://example.com/images/"]}'
リダイレクトルール(一括)
# Create a redirect rule
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_request_dynamic_redirect/entrypoint" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [
      {
        "expression": "(http.request.uri.path eq \"/old-page\")",
        "description": "Redirect old-page to new-page",
        "action": "redirect",
        "action_parameters": {
          "from_value": {
            "target_url": {"value": "https://example.com/new-page"},
            "status_code": 301
          }
        }
      }
    ]
  }'

一括リダイレクトの場合(CSV から 301 リダイレクトを設定)、ルール配列をプログラムで生成します:

import json, csv

rules = []
with open('redirects.csv') as f:
    for row in csv.reader(f):
        old_path, new_url = row
        rules.append({
            "expression": f'(http.request.uri.path eq "{old_path}")',
            "description": f"Redirect {old_path}",
            "action": "redirect",
            "action_parameters": {
                "from_value": {
                    "target_url": {"value": new_url},
                    "status_code": 301
                }
            }
        })
print(json.dumps({"rules": rules}, indent=2))
ゾーン設定(フリート全体)

複数のゾーンに同じ設定を適用します:

# Settings to apply
SETTINGS='{"value":"full"}'  # SSL mode: full (strict)

# Get all active zones
ZONES=$(curl -s "https://api.cloudflare.com/client/v4/zones?status=active&per_page=50" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq -r '.result[].id')

# Apply to each zone
for ZONE in $ZONES; do
  curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE/settings/ssl" \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$SETTINGS" | jq "{zone: .result.id, success: .success}"
  sleep 0.25
done

よく使われるフリート設定:

  • ssl — 「full」または「strict」
  • min_tls_version — 「1.2」
  • always_use_https — 「on」
  • security_level — 「medium」
  • browser_cache_ttl — 14400
WAF/ファイアウォールルール
# Create a WAF custom rule (block by country)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [{
      "expression": "(ip.geoip.country in {\"RU\" \"CN\"})",
      "action": "block",
      "description": "Block traffic from RU and CN"
    }]
  }'

# Rate limiting rule
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_ratelimit/entrypoint" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [{
      "expression": "(http.request.uri.path contains \"/api/\")",
      "action": "block",
      "ratelimit": {
        "characteristics": ["ip.src"],
        "period": 60,
        "requests_per_period": 100
      },
      "description": "Rate limit API to 100 req/min per IP"
    }]
  }'
Worker ルート
# List routes
curl -s "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq '.result[] | {pattern, id}'

# Create route
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pattern": "api.example.com/*", "script": "my-worker"}'

# Delete route
curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes/$ROUTE_ID" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
アナリティクス(GraphQL)
# Worker analytics (requests, errors, CPU time)
curl -s -X POST "https://api.cloudflare.com/client/v4/graphql" \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "{ viewer { zones(filter: {zoneTag: \"'$ZONE_ID'\"}) { httpRequests1dGroups(limit: 7, filter: {date_gt: \"2026-03-10\"}) { dimensions { date } sum { requests pageViews } } } } }"
  }' | jq '.data.viewer.zones[0].httpRequests1dGroups'

レート制限

エンドポイント制限
ほとんどの API 呼び出し1200 リクエスト/5 分
DNS レコード操作1200/5 分(上記と共有)
キャッシュのパージ1000 回のパージ呼び出し/日
ゾーンの作成1 分あたり 5 件

スクリプトでの使用:継続的に操作する場合は、呼び出しの間に sleep 0.25 を追加します。並列数を制御するには、p-limit または xargs -P 4 を使用します。

スクリプト生成

ユーザーが必要なことを説明したら、.jez/scripts/ に次の条件を満たすスクリプトを生成します。

  • API トークンを環境変数から読み込みます(ハードコードしないでください)。
  • 一覧取得操作ではページネーションに対応します。
  • 各呼び出しの後にエラーチェック(jq '.success')を行います。
  • 呼び出しの間にレート制限対策のスリープを入れます。
  • 実行内容をログに記録します。
  • 可能な場合は --dry-run をサポートします。

単純な操作では curl と jq を優先します。複雑なロジック(ページネーションのループ、エラー処理、CSV 処理)には Python を使用します。大規模なスクリプトで型安全性が必要な場合は、cloudflare npm パッケージを使った TypeScript を使用します。

API リファレンス

ベース URL:https://api.cloudflare.com/client/v4/

ドキュメント全文:https://developers.cloudflare.com/api/

API は一貫したパターンに従います。

  • GET /zones — 一覧
  • POST /zones — 作成
  • GET /zones/:id — 読み取り
  • PATCH /zones/:id — 更新
  • DELETE /zones/:id — 削除
  • PUT /zones/:id/settings/:name — 設定の更新

すべてのレスポンスには { success: bool, errors: [], messages: [], result: {} } が含まれます。

リファレンスファイル

条件読むファイル
D1、R2、KV、Workers、Vectorize、Queues の API パターンreferences/developer-platform-api.md

コメント