cloudflare-api について
cloudflare-apiは、wranglerやMCPツールが適さない場合にCloudflare REST APIを使うスキルです。DNS、ゾーン設定、ファイアウォールルール、分析データ、Cloudflare開発者向けプラットフォームのリソースを、スクリプトで一括・複数ゾーン処理します。
主な機能
- 01Cloudflare REST APIの直接利用
- 02DNSとリダイレクトの一括操作
- 03複数ゾーンへの設定適用
- 04ファイアウォール、キャッシュ、Workerルートの管理
- 05GraphQLによる分析データのクエリ
- 06安全策を含むスクリプト生成
活用シーン
- 01多数のDNSレコードの移行や更新
- 02複数ゾーンへの設定適用
- 03リダイレクトルールの一括作成
- 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 の代わりにこれを使う場合
| ユースケース | Wrangler | MCP | このスキル |
|---|---|---|---|
| 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 |