Wrangler と cf(Cloudflare CLI)徹底比較:2026年10月時点のコマンド対応表と使い分け
Cloudflare の CLI といえば長らく Wrangler でしたが、2026 年 9 月 28 日に新しい cf(Cloudflare CLI)がオープンベータになりました。Workers 開発のツールとしての Wrangler と、Cloudflare API 全体をカバーする cf は何が違い、今どちらを何に使うべきか。公式ドキュメント、ブログ、changelog、API リファレンス、両ツールのソースコード(cloudflare/cf リポジトリと npm パッケージの同梱コード)、手元にインストールした両 CLI の --help / cf schema / cf cli search の出力を見比べて整理したメモです(調査日: 2026-10-11、追加検証: 2026-10-12)。
前提:cfはベータです。公式ドキュメントも「stable リリースまでにコマンド・設定・Build Output は変わりうる」と明記しています。本稿のコマンド名とフラグはcf1.0.0-beta.14 と Wrangler 4.147.0 で確認したものです。
TL;DR
cfは npm の unscoped パッケージcf(コマンド名cf/cloudflare)で配布される「Cloudflare CLI」。2026-09-28 にオープンベータ、最新は 1.0.0-beta.14。Wrangler の最新は 4.149.0(2026-10-08 リリース)。cfは Cloudflare の公開 API 全体を生成ベースでカバーし、DNS・ゾーン・WAF・Zero Trust なども扱える。コマンド数は、ブログでは約 3,000 オペレーション、ドキュメントでは 2,900 以上。1.0.0-beta.14 に同梱されたコマンド一覧(dist/_meta/commands.json)には 2,947 件が登録されている。Wrangler はブログによれば約 280 のコマンドパス。- ロードマップ上、
cfは Wrangler の後継。ベータ終了時に「cfへ誘導する Wrangler の最終メジャー版」が出て、その後 18 か月間メンテナンスされる。 - ただし
cf dev/cf build/cf deploy自体はバンドラーを持たず、フレームワーク、Cloudflare Vite プラグイン、または Wrangler(4.136.0 以上)に処理を委譲する。つまり「置き換え」と「ラップ」の両面がある。 - 設定は
wrangler.jsonc/wrangler.tomlから TypeScript のcloudflare.config.tsへ。移行はcf migrate。 wrangler tail(ライブログ)など、まだ Wrangler にしかない機能がある。既存の Wrangler プロジェクトは無理に移行せず、リソース操作だけcfを併用する使い方が公式に案内されている。
1. cf とは何か
名前・パッケージ・インストール
- 正式名称は Cloudflare CLI。changelog の見出しは「Cloudflare CLI is now in beta」、README では「Cloudflare のための統一されたコマンドラインインターフェイス」と説明されています。
- npm パッケージ名は unscoped の
cf。package.jsonのbinはcfとcloudflareの 2 つで、どちらも同じ実体です。PATH 上に別のcfコマンドがある場合はcloudflareを使うよう案内されています。 - リポジトリは
github.com/cloudflare/cf(packages/cli)。ライセンスは MIT OR Apache-2.0 のデュアルライセンス。 - 動作要件は Node.js 22.18 以上(公式ドキュメント。
package.jsonのenginesは>=22)。Bun は非サポートで、Bun 上ではcloudflare.config.tsを読むコマンドが失敗します。 - 匿名の利用テレメトリがあり、
CF_SEND_TELEMETRY=falseまたはDO_NOT_TRACK=1で無効化できます(cf cli telemetryコマンドもあります)。
# グローバルインストール(npm / yarn / pnpm / bun いずれも公式に記載あり)
npm install --global cf
cf --version # 1.0.0-beta.14(2026-10-12 時点の npm latest)
cf auth login
# プロジェクトでは devDependency に入れてバージョンを固定するのが推奨
npm i -D cf
npx cf --helpリリース状況とバージョン
- 2026-04-13: Cloudflare ブログ「Building a CLI for all of Cloudflare」で technical preview として初公開。この時点では一部プロダクトのみ対応で、「将来の Wrangler CLI の一部」と説明されていました。
- 2026-09-28: Birthday Week の発表「Introducing cf: the agentic CLI for the entire Cloudflare API」と changelog でオープンベータに。
cfの現行版は 1.0.0-beta.14(npm のlatestタグ)。GitHub の Releases ページにはリリースが掲載されておらず、バージョンは npm で確認しました。- Wrangler の現行版は 4.149.0(npm の
latest、workers-sdk の GitHub Releases で 10 月 8 日リリース)。本稿のコマンド確認はプロジェクトに入っていた 4.147.0 で行っています。
コマンドはどう作られているか
cf の API 系コマンドは Cloudflare の公開 API スキーマから生成されています。4 月の記事では、OpenAPI だけでは対話的な CLI コマンドや Workers バインディングを表現しきれないため、API・CLI コマンド・引数をまとめて定義する TypeScript ベースのスキーマを作ったと説明されています。9 月の記事では生成パイプラインを「Forge」と呼んでいます。コマンドは cf <product> [group…] <operation> という形にそろっており、cf schema <command> を実行すると、各コマンドが呼ぶ API の operationId・HTTP メソッド・パスを確認できます。
--help に出ないコマンドがある理由
cf cli search では見つかるのに、cf --help の一覧には出てこないコマンドがあります(例: cf mtls-certificates、cf tunnels、cf workers-builds)。理由はソースコードに書かれています。
packages/cli/src/index.tsでは、生成プロダクトのうちhideCommand: trueのものを yargs にdescribe: falseで登録しています。コメントには「invokable but suppressed from--help」とあり、コマンドとしては実行できます。- シェル補完(
packages/cli/src/commands/completions/index.ts)もhideCommandのコマンドを除外します。 - 一方、
cf cli search(packages/cli/src/commands/cli/search.ts)は同梱のcommands.jsonを MiniSearch で索引化しており、hideCommandによる除外をしていません。そのため検索には出てきます。 - 1.0.0-beta.14 の同梱コードでは、生成プロダクト 180 グループのうち 88 グループが
hideCommand: trueです。
2. 位置づけとロードマップ
Wrangler
Wrangler は「Developer Platform のための CLI」で、Workers プロジェクトのビルド・ローカル開発・デプロイと、D1 / R2 / KV / Queues などの Workers 周辺リソースの管理が中心です。9 月の記事によれば、各プロダクトチームが手作業でコマンドを追加してきたため用語やパターンに揺れがあり、カバーしているのは約 280 のコマンドパスです。
cf
cf は「Cloudflare API 全体のためのエージェント向け CLI」という位置づけです。ゾーン、DNS、ストレージ、セキュリティ設定などのリソース管理と、Workers プロジェクトの作成・開発・デプロイを 1 つのツールで扱います。設計上の特徴は次のとおりです。
- 出力はデフォルトで JSON(stdout)。メッセージやエラーは stderr に分かれるので
jqにそのままパイプできる。 cf cli search "<やりたいこと>"で自然文からコマンドを探せる(ローカル実行・認証不要・最大 5 件)。cf schema <command>で、生成コマンドが送る API リクエスト(operationId、HTTP メソッド、パス、ボディのフィールド)を確認できる。- 生成コマンドには
--dry-runがあり、リクエストを送らずに内容を確認できる。
実際に cf --help を実行すると、冒頭に「エージェントは入れ子の --help をたどらず、まず cf cli search を使うこと」という案内が表示されます。
置き換えか、ラップか
答えは「CLI としては後継であり、ビルドの実装としては Wrangler に委譲する部分がある」です。
- 置き換え: 9 月の発表によれば、オープンベータ終了時に
cfへ利用者とエージェントを誘導する Wrangler の最終メジャーバージョンがリリースされ、その後 18 か月間メンテナンスが続きます。 - 委譲:
cf dev・cf build・cf deployは自前の dev サーバーやバンドラーを持たず、フレームワーク自身のコマンド、Cloudflare Vite プラグイン、またはインストール済みの Wrangler(4.136.0 以上)に処理を渡します。9 月の記事では、esbuild ベースの JavaScript Worker と Rust・Python の Worker の開発・デプロイは引き続き Wrangler が担うとされています。 - 併用: Wrangler プロジェクトのまま
cfのリソース系コマンド(cf d1 listなど)を使うことは公式に想定されています。一方、cf dev/cf build/cf deployはcloudflare.config.tsを前提にしているため、先にcf migrateを実行する必要があります。
3. Wrangler → cf コマンド対応表
凡例: 「→」が対応関係、【cf のみ】【Wrangler のみ】は片方にしかないものです。対応関係は、公式ドキュメントの記載、または両ツールが同じ API エンドポイントを呼んでいること(cf schema の出力と Wrangler 4.147.0 の同梱コードで確認)を根拠にしています。「片方にしかない」は、cf 1.0.0-beta.14 の全コマンド一覧(commands.json、非表示コマンドを含む 2,947 件)と Wrangler 4.147.0 の --help で確認した結果です。
全体に共通する違いは、Wrangler はリソースを名前で指定することが多いのに対し、cf は API のパスパラメーターに合わせて ID を要求することが多い点です(D1 のデータベース、Queues のキューなど)。環境の切り替えは --env <NAME> が --mode <NAME> に変わります。
認証・アカウント
wrangler login→cf auth loginwrangler logout→cf auth logoutwrangler whoami→cf auth whoamiwrangler auth create/activate/deactivate/list/delete(Wrangler 側は experimental)→cf auth create/activate/deactivate/list/deletewrangler auth token(現在の認証情報を出力)【Wrangler のみ】cf authのサブコマンドは上記 8 つ(login/logout/whoamiとプロファイル管理 5 つ)で、認証情報を出力するものはありません。wrangler auth keyring(OS キーチェーン保存の設定)【Wrangler のみ】cf側はコマンドではなく環境変数で切り替えます(6 章参照)。
開発・ビルド・デプロイ・バージョン・ログ
wrangler init→cf init(cfはcloudflare.config.tsとvite.config.tsを含む Hello World を生成)wrangler dev→cf dev(cloudflare.config.tsが必要。実体はフレームワーク / Vite プラグイン / Wrangler に委譲)- (Wrangler に独立したビルドコマンドはない)→
cf build【cf のみ】.cloudflare/output/v0/に Build Output を生成し、cf deploy --prebuiltで再利用できる wrangler deploy→cf deploywrangler delete→cf workers delete <worker-id>wrangler versions upload→cf workers versions createwrangler versions list/view→cf workers versions list/get(cf workers versions listの Worker 指定は--worker-id)wrangler versions deploy→cf workers deployments create(どちらもPOST /accounts/{account_id}/workers/scripts/{script_name}/deployments)wrangler deployments list→cf workers deployments listwrangler deployments status→cf workers deployments listの先頭要素。Wrangler 4.147.0 のdeployments statusは、デプロイ一覧を取得して先頭(deployments.at(0))を表示する実装です。cf workers deployments listの help にも「一覧の最初のデプロイが、現在トラフィックを処理している最新のデプロイ」と書かれています。特定のデプロイの詳細はcf workers deployments get <deployment-id>で取得します。wrangler rollback→cf workers deployments create(下のコード例)。cfに Workers 用のrollbackという名前のコマンドはありません。詳細は次項。wrangler tail【Wrangler のみ】公式ドキュメントに「cfcannot stream live logs yet」とあり、npx wrangler tail <WORKER_NAME>を使うよう案内されています。wrangler triggers deploy→cf workers triggers deploywrangler types→cf workers types(出力先は.cloudflare/types/index.d.ts)wrangler preview(open beta)→cf previews deploy [preview-name]wrangler check startup→cf workers check- (なし)→
cf migrate [path]【cf のみ】Wrangler の設定ファイルをcloudflare.config.tsに変換
ロールバックの実体
- Workers のドキュメント(Rollbacks)では、ロールバックは「指定したバージョンで新しいデプロイを即座に作成する」操作と説明されています。分割デプロイからロールバックした場合も、選んだバージョンが 100% のトラフィックを受けます。対象は直近 100 バージョンまでです。
- Wrangler 4.147.0 の
wrangler rollbackは、同梱コード上POST /accounts/{account_id}/workers/scripts/{script_name}/deploymentsにstrategy: "percentage"と「対象バージョン 100%」を送っています。シークレットが変わっていてエラーになった場合は、確認のうえ?force=trueを付けて再送します。 cf workers deployments createは同じエンドポイントを呼びます(cf schemaで確認)。フラグは--worker(別名--script-name)、--strategy(percentageのみ)、--versions(version_idとpercentageの JSON 配列。合計 100)、--bypass-deployment-checksです。--bypass-deployment-checksの help は、API のforceクエリと同じく「シークレット変更後に古いバージョンへ戻すなど、通常はブロックされる場合でもデプロイを作成する」と説明しています。
# 戻したいバージョン ID を確認
cf workers versions list --worker-id <WORKER_NAME>
# そのバージョンに 100% のトラフィックを向けるデプロイを作成(= wrangler rollback と同じ API 呼び出し)
cf workers deployments create --worker <WORKER_NAME> --strategy percentage \
--versions '[{"version_id":"<VERSION_ID>","percentage":100}]'シークレット
ここは、公式ドキュメントの記述と CLI に実在するコマンドが一致していないので、両方を正確に書いておきます。
- ドキュメントの記述: 「cf for Wrangler users」と「Wrangler to cf reference」の両方に「
cfcannot set a single secret yet.」とあります。代わりにnpx wrangler secret put <SECRET_NAME> --name <WORKER_NAME>を使うか、cf deploy/cf workers versions createに--secrets-file <PATH>を渡して新しいバージョンと一緒にアップロードするよう案内されています。 - CLI の実体:
cf1.0.0-beta.14 には API から生成されたcf workers secrets update <name>があります。呼ぶのはPUT /accounts/{account_id}/workers/scripts/{script_name}/secretsで、API リファレンスでの説明は「Add a secret to a Worker script by creating a new version with that secret.」です。 cf workers secrets updateの引数: 位置引数の<name>がバインディング名です。フラグは--worker(別名--script-name)、--type(secret_text|secret_key)、--text(シークレットの値)、--format/--key-base64/--usages(secret_key用)、--body、--dry-runです。- Wrangler 4.147.0 の
wrangler secret putも、同梱コード上は同じPUT .../secretsエンドポイントを呼んでいます。違いは値の渡し方で、Wrangler は対話プロンプトか標準入力から読み、cfは--text引数で受け取ります。 wrangler secret list→cf workers secrets listwrangler secret delete→cf workers secrets delete <secret-name>wrangler secret bulk→cf workers secrets bulk- (なし)→
cf workers secrets get <secret-name>【cf のみ】 wrangler secrets-store(open beta)→cf secrets-store stores/secrets/quota
D1
wrangler d1 create <name>→cf d1 create(名前はフラグで渡す。公式例:cf d1 create --name my-database --dry-run)wrangler d1 list→cf d1 listwrangler d1 info <name>→cf d1 get <database-id>wrangler d1 delete <name>→cf d1 delete <database-id>wrangler d1 execute <database> --remote --command "..."→cf d1 query <DATABASE_ID> --sql "..."(公式ドキュメントの対応例。Wrangler は名前、cfは ID)。--localで使えるのはcf d1 raw <database-id>で、cf d1 queryにはローカル版がありません。wrangler d1 migrations create <database> <message>→cf d1 migrations create <message>wrangler d1 migrations list/apply <database>→cf d1 migrations list/apply <database>(cfはデフォルトでリモートが対象で、--localでローカル。設定のmigrations_dir/migrations_pattern/migrations_tableは--dir/--pattern/--tableに対応)wrangler d1 time-travel→cf d1 time-travel(get-bookmark/restore)wrangler d1 export【Wrangler のみ】API にはPOST /accounts/{account_id}/d1/database/{database_id}/exportがありますが(API リファレンス)、cf1.0.0-beta.14 の全コマンド一覧にこのエンドポイントを呼ぶコマンドはありません。D1 のコマンドはcreate/delete/edit/get/list/migrations/query/raw/time-travel/undelete/updateです。wrangler d1 insights(experimental)【Wrangler のみ】Wrangler は GraphQL Analytics API(d1QueriesAdaptiveGroups)を呼んで集計しています。cf1.0.0-beta.14 には GraphQL Analytics API を呼ぶ汎用コマンドがありません(名前に graphql を含むのはcf cloudforce-one events graphql ...だけです)。- (なし)→
cf d1 undelete、cf d1 edit/update【cf のみ】
# 公式ドキュメントに載っている対応例
wrangler d1 execute my-database --remote --command "SELECT 1"
cf d1 query <DATABASE_ID> --sql "SELECT 1"R2
wrangler r2 bucket create/list/delete/info→cf r2 buckets create/list/delete/getwrangler r2 bucket cors/lifecycle/lock/domain/notification/sippy/local-uploads→cf r2 buckets cors/lifecycle/locks/domains/event-notifications/sippy/local-uploadswrangler r2 bucket dev-url→cf r2 buckets domains managed list/update。Wrangler 4.147.0 の dev-url 系はGET/PUT /accounts/{account_id}/r2/buckets/{bucket_name}/domains/managedを呼んでおり、cfの 2 コマンドも同じエンドポイントです。有効化はcf r2 buckets domains managed update <bucket-name> --enabled。wrangler r2 object get/put/delete→cf r2 objects get/put/delete(cf r2 objects putは上限 300 MB。help では大きなファイルには S3 互換 API や R2 バインディングの利用を推奨)- (なし)→
cf r2 objects list、cf r2 objects bulk-delete、cf r2 super-slurper、cf r2 temporary-credentials【cf のみ】
KV
wrangler kv namespace create/list/delete/rename→cf kv namespaces create/list/delete/update(updateの help は「Rename a namespace」)wrangler kv key put/get/list/delete→cf kv keys put/get/list/deletewrangler kv bulk→cf kv bulkcfにはこのほかcf kv metadataグループがあります。
Queues
wrangler queues create/list/info/update/delete→cf queues create/list/get/edit/delete(cfは<queue-id>を取る)wrangler queues consumer add/remove/list→cf queues consumers create/delete/listwrangler queues purge→cf queues purgewrangler queues subscription→cf queues subscriptionswrangler queues pause-delivery/resume-delivery→cf queues edit <queue-id>の--settings-delivery-paused(boolean)。Wrangler 4.147.0 はPATCH /accounts/{account_id}/queues/{queue_id}にsettings.delivery_pausedを送っており、cf queues editは同じPATCHを呼ぶコマンドで、--settings-delivery-pausedフラグを持っています。- (なし)→
cf queues messages push/pull/ack/peekなど、メッセージを直接操作する API コマンド、およびcf queues metrics【cf のみ】
Durable Objects
- Wrangler 4.147.0 の
--helpには Durable Objects 専用のトップレベルコマンドはありません。クラスの宣言やマイグレーションは設定ファイルで行います。 cf durable-objects namespaces listとcf durable-objects namespaces objectsで、名前空間やオブジェクトを API 経由で参照できます【cf のみ】- 設定面では、Wrangler の
migrationsはcloudflare.config.tsのworker.exports(例:exports.durableObject({ storage: "sqlite" }))に置き換わります。cf migrateはこれを自動変換しないため、手作業での移行が必要です。
Pages
wrangler pages deploy [directory]→cf pages deploy [directory]wrangler pages project create/list/delete→cf pages create/list/delete(cf pages get/editもある)wrangler pages deployment list/delete→cf pages deployments list/deletewrangler pages deployment tail【Wrangler のみ】wrangler pages dev、wrangler pages functions【Wrangler のみ】- (なし)→
cf pages deployments rollback/retry、cf pages domains、cf pages build-cache【cf のみ】
Workers AI / Vectorize / Hyperdrive / Workflows ほか
wrangler ai models list→cf ai models list(どちらも/accounts/{account_id}/ai/models/search)wrangler ai models schema <model>→cf ai get-model-schema(どちらも/accounts/{account_id}/ai/models/schema)wrangler ai finetune→cf ai finetunes- (なし)→
cf ai run [model-name](CLI から推論を実行)、cf ai to-markdown【cf のみ】 - Vectorize:
create/delete/get/list/info/query/insert/upsert/list-vectorsは同名で対応。wrangler vectorize get-vectors/delete-vectors→cf vectorize get-by-ids/delete-by-ids、create-/list-/delete-metadata-index→cf vectorize metadata-index create/list/delete(いずれも同じ.../get_by_ids、.../delete_by_ids、.../metadata_index/*エンドポイント) - Hyperdrive:
create/delete/get/list/updateは同名で対応。cf hyperdrive replace/restart【cf のみ】 - Workflows:
wrangler workflows list/delete→cf workflows list/delete、wrangler workflows describe→cf workflows get(どちらもGET /accounts/{account_id}/workflows/{workflow_name})、wrangler workflows trigger→cf workflows instances create(どちらもPOST .../workflows/{workflow_name}/instances) wrangler ai-search↔cf ai-search、wrangler containers↔cf containers、wrangler mtls-certificate↔cf mtls-certificates(--help非表示)、wrangler turnstile(alpha)↔cf turnstileは両方に存在- AI Gateway(
cf ai-gateway)はcfのみ
4. それぞれにしかできないこと
cf にしかできないこと
- Workers 以外のプロダクトの操作:
cf zones(ゾーンの作成・設定)、cf dns records(list / create / import / export など)、cf cache(パージなど)、cf rulesets/cf firewall、cf zero-trust、cf load-balancers、cf images、cf stream、cf radar、cf billing、cf accounts、cf registrarなど。--helpに表示される生成プロダクトだけで 92 グループ、非表示を含めると 180 グループあります。 - API 由来の細かな操作: R2 のオブジェクト一覧、Queues のメッセージ push / pull、D1 の undelete など、Wrangler にコマンドがない操作も API があればそのまま使えます。
- エージェント向けの機能:
cf cli search、cf schema、JSON がデフォルトの出力。公式ドキュメントによれば、対応するコーディングエージェント内でcf devを実行すると Local Explorer API の URL も表示されます。 - グローバルな
--zone/-zフラグとCLOUDFLARE_ZONE_IDによる、ゾーン単位コマンドのデフォルト指定。 - ビルドとデプロイの分離:
cf buildで Build Output を作り、cf deploy --prebuiltで同じ成果物をデプロイできる。
Wrangler にしかできないこと(cf 1.0.0-beta.14 時点)
- ライブログ:
wrangler tail、wrangler pages deployment tail。 - esbuild ベースの Worker、Rust / Python Worker のビルドとデプロイ(9 月の発表による)。これらは
cf経由でも Wrangler が処理します。 - Wrangler 自身のローカル開発サーバー。
wrangler devは Miniflare(本番と同じworkerdランタイムで Worker を実行するシミュレーター)上で動き、バインディングはデフォルトでローカルにシミュレートされます。--remoteによるリモート実行や、wrangler pages devもあります。 wrangler d1 export、wrangler d1 insights、wrangler auth token(それぞれの根拠は 3 章を参照)。
ローカル実行と Miniflare
cf 自体は dev サーバーを持ちませんが、miniflare に依存しています(1.0.0-beta.14 の package.json では 5.20261006.1-alpha)。README によれば、これはリソース操作の --local フラグのためです。cf kv keys ... --local、cf d1 raw --local、cf d1 migrations apply --local、cf r2 objects ... --local などを付けると、本番 API ではなく短命の Miniflare インスタンスに対して操作します。ドキュメントでは、状態は cf の設定ディレクトリ配下に保存されるとされ(--help の既定値表示は ~/.config/cloudflare/state)、--persist-to で変更できます。ローカル版がないコマンドは本番にフォールバックせず、エラーになります。
5. 設定ファイル
Wrangler: wrangler.jsonc / wrangler.toml
wrangler.json、wrangler.jsonc、wrangler.tomlのいずれかを使います。新規プロジェクトにはwrangler.jsoncが推奨で、新しい機能の一部は JSON 設定でしか使えません。- 設定ファイルを Worker の source of truth として扱うのがベストプラクティスです。ダッシュボードで変えた変数やルートは次のデプロイで上書きされます(
keep_varsで変数は保持可能)。 - 環境は
env.<name>ブロックで定義し、--envで選択します。nameやcompatibility_dateは環境に継承されますが、varsや KV / D1 / R2 などのバインディングは環境ごとに明示が必要です。
cf: cloudflare.config.ts
- TypeScript モジュールで、
cf/configからdefineConfigを import します。cfを devDependency に入れ、package.jsonに"type": "module"が必要です。 - トップレベルは
accountId、complianceRegion、worker、containers。Worker の設定はworkerの下にまとまり、name→worker.name、main→worker.entrypoint、compatibility_date→worker.compatibilityDateのように camelCase になります。 - バインディングは
worker.envにbindings.d1(...)、bindings.secret(...)などのビルダーで書きます。トリガーはworker.triggers(triggers.fetch/scheduled/queue/emailなど)、Durable Objects や Workflows のクラスはworker.exportsで宣言します。 - 環境はマージされません。
defineConfigに関数を渡し、mode(--modeで指定)やisPreviewで分岐して、モードごとに完全な設定を返します。cf migrateはenv.<NAME>をswitch (ctx.mode)のcaseに変換します。 - ビルド設定は
cloudflare.config.tsに書きません。Vite を使う場合はvite.config.ts、Wrangler バンドラーの場合は自動生成されるwrangler.config.tsに置きます(ベータ中は experimental)。 - 生成物の置き場所は
.cloudflare/です(Build Output は.cloudflare/output/v0/、型は.cloudflare/types/index.d.ts)。
// cloudflare.config.ts の最小例(公式ドキュメントの例をもとにしたもの)
import { defineConfig } from "cf/config";
import * as entrypoint from "./src/index.ts" with { type: "cf-worker" };
export default defineConfig({
worker: {
name: "example-worker",
entrypoint,
compatibilityDate: "<COMPATIBILITY_DATE>",
},
});両者の関係
cloudflare.config.tsがあれば、cfは Wrangler の設定ファイルを無視します。逆に Wrangler はcloudflare.config.tsを読みません。wrangler tailなど Wrangler のコマンドを使い続けるうちは、移行後も Wrangler の設定ファイルを残しておく必要があります。cf migrateは既存ファイルを上書きしません。変換できない項目はTODO(@cloudflare)コメントとして書き込まれ、ファイル先頭にthrowが入るため、解消するまでcf dev/build/deployは失敗します。変換されないのは、Durable Object のmigrations、Workflows、Containers、Workers Sites(site)、preview_id系、keep_vars、シークレット(.dev.vars/.envは読まない)などです。- 移行前の Wrangler プロジェクトで
cf dev/cf build/cf deployを実行すると、自動設定がエントリーポイントやバインディングを含まないcloudflare.config.tsを作ったり、package.jsonなどを書き換えたりします。公式ドキュメントは、先にcf migrateを実行するよう案内しています。
cf migrate --dry-run # 変更内容の確認のみ
cf migrate # cloudflare.config.ts を生成し、cf を devDependency に追加
cf migrate --bundler vite # バンドラーを明示(vite | wrangler)6. 認証モデルの違い
どちらも「ブラウザでの OAuth ログイン」と「API トークン」の 2 本立てですが、ログイン情報は共有されません。公式ドキュメントにあるとおり、cf は Wrangler のログインを再利用しないため、cf auth login を別途実行する必要があります。
Wrangler(公式ドキュメントより)
wrangler loginのデフォルトは、ブラウザを開いてlocalhost:8976へのコールバックで完了する方式です。--deviceを付けると OAuth 2.0 Device Authorization Grant(RFC 8628)を使います。--scopesでスコープを絞れます。- 保存先はデフォルトで、グローバル設定ディレクトリ配下の平文 TOML(ドキュメント上「通常は
~/.config/.wrangler/config/default.toml」)です。 --use-keyring、またはwrangler auth keyringで OS キーチェーン方式にすると、AES-256-GCM で暗号化したdefault.encに保存し、鍵は macOS Keychain / libsecret / Windows Credential Manager に置きます。保存先はwrangler whoamiで確認できます。- 優先順位は
CLOUDFLARE_API_TOKEN→CLOUDFLARE_API_KEY+CLOUDFLARE_EMAIL(Global API Key)→ OAuth トークンです。
cf(ドキュメントと 1.0.0-beta.14 のソースコードより)
ログインフローと保存先は公式ドキュメントに詳しく書かれていないため、npm パッケージ cf@1.0.0-beta.14 の同梱コードで確認しました。
- ログインフロー:
cf auth loginの--deviceフラグはデフォルトで有効(help:「Use OAuth device authorization (use --no-device for the localhost callback flow)」)です。デフォルトでは OAuth 2.0 Device Authorization Grant(grant_type=urn:ietf:params:oauth:grant-type:device_code、エンドポイントdash.cloudflare.com/oauth2/device/auth)を使います。ドキュメントにある「リンクとワンタイムコードを表示し、ブラウザで承認する」流れがこれにあたります。 --no-deviceを付けると、PKCE(code_challenge_method=S256)付きの Authorization Code フローになり、http://localhost:8877/oauth/callbackで受け取ります。--no-browserはリンクを開かずに表示だけ行います。- 設定ディレクトリ: アプリ名
cloudflareの XDG 形式パスです。macOS は~/Library/Preferences/cloudflare、Linux は~/.config/cloudflare、Windows は%APPDATA%\xdg.config\cloudflareで、XDG_CONFIG_HOMEを設定するとそちらが優先されます。 - 認証情報ファイル: デフォルトでは平文 JSON の
<設定ディレクトリ>/config/default.json(名前付きプロファイルは<名前>.json)に、パーミッション 0600 で書き込みます。ディレクトリとプロファイルの紐づけは<設定ディレクトリ>/profiles/directory-bindings.jsonに保存されます。 - OS キーリング:
CLOUDFLARE_AUTH_USE_KEYRING=trueのとき(またはユーザー設定のkeyring_enabledが true のとき)は、AES-256-GCM で暗号化した<設定ディレクトリ>/config/<プロファイル>.encに保存し、鍵を@napi-rs/keyring経由で OS キーリング(サービス名cloudflare)に置きます。1.0.0-beta.14 のcf authサブコマンドの help には、これを有効にするフラグはありません。 - 認証情報の優先順位は
CLOUDFLARE_API_TOKEN(カレントディレクトリの.envも含む)→--profile <NAME>→cf auth activateでディレクトリに紐づけたプロファイル →cf auth loginのデフォルトプロファイルです。Global API Key はサポートされません(ドキュメント)。 - アカウントは、
CLOUDFLARE_ACCOUNT_ID→cloudflare.config.tsのaccountId→ プロジェクトに保存された前回の選択 → アクセスできる唯一のアカウント、の順で決まります。非対話環境で候補が複数ある場合はエラーになります。選択したアカウントのキャッシュは、最寄りのnode_modules/.cache/cloudflare/か.cloudflare/cache/のcloudflare-account.jsonです。 .envから読むのは認証・コンテキスト関連の限られた変数(CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID、CLOUDFLARE_ZONE_IDなど)だけで、.env.localや.env.<MODE>は読みません。トークンを含む.envはコミットしないこと。
Wrangler にも --profile と wrangler auth create / activate などのプロファイル機能(experimental)が入っており、ディレクトリ単位でアカウントを切り替える仕組みは両者で共通しています。
7. CI/CD での使い方
共通
- CI ではブラウザログインが使えないため、
CLOUDFLARE_API_TOKENとCLOUDFLARE_ACCOUNT_IDをシークレットとして渡します。トークンには必要最小限の権限だけを付けます(Wrangler のドキュメントでは「Edit Cloudflare Workers」テンプレートを起点にするよう案内)。 cfのドキュメントは、CI で毎回同じリリースを使うためにcfを devDependency としてインストールするよう案内しています。
Wrangler
- GitHub Actions の公式ドキュメントでは
cloudflare/wrangler-action@v4を使い、apiTokenとaccountIdを渡してwrangler deployを実行する構成が紹介されています。 - GitHub Actions を使わない選択肢として、Cloudflare 側でビルドする Workers Builds もあります。
cf
cloudflare.config.tsは必ずコミットしてください。ない場合、CI で自動設定が走り、レビューなしでファイルが書き換えられます。cf build→cf deploy --prebuilt --mode productionの 2 段構成で、同じ成果物をデプロイできます。ビルド時とデプロイ時の mode が一致しないと、アップロード前に停止します。cf deploy --dry-runは認証情報なしで動くため、フォークからの PR でも検証に使えます。cf previews deployはブランチ名(GITHUB_HEAD_REFなど)からプレビュー名を決めます。- 非対話モードの落とし穴: 破壊的なコマンドを
--forceなしで実行するとAborted.を stderr に出して何もせず、終了コード 0 で終わります。終了コードだけでは削除の成否を判断できません。 - テレメトリを止めたい場合は
CF_SEND_TELEMETRY=falseを設定します。
# cf を使う GitHub Actions のステップ(公式ドキュメントの構成を要約)
- run: npm ci
- run: npx cf build
- run: npx cf deploy --prebuilt --mode production --dry-run
- if: github.event_name == 'push'
run: npx cf deploy --prebuilt --mode production
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}8. 使い分けの推奨(2026-10 時点)
- 既存の Wrangler プロジェクト(
wrangler.jsonc/wrangler.toml)の dev / deploy は、当面 Wrangler のままで問題ありません。ベータ終了後も 18 か月のメンテナンス期間があります。 - DNS、ゾーン設定、キャッシュパージ、WAF、Zero Trust など Workers 以外の操作や、Wrangler にない API 操作は
cfを使います。Wrangler プロジェクトのままでもリソース系コマンドは併用できます。 - 新規の Vite ベース Worker で、ベータ版の変更を許容できるなら
cf initから始めると、cloudflare.config.tsによる型付き設定を使えます。 - 移行するなら、まず
cf migrate --dry-runで差分を確認します。Durable Object の migrations、Workflows、Containers、シークレットは手作業で移行し、wrangler tailを使い続けるあいだは Wrangler の設定ファイルを残します。 - コーディングエージェントに作業させる場合は、公式が提案するように AGENTS.md に「Wrangler 設定ファイルがないプロジェクトでは
cfを使う」と書いておくと、2 つのツールの使い分けをエージェントに伝えられます。 - CI は本番デプロイの経路を一本にします。Wrangler プロジェクトなら
wrangler-action、移行済みならcf buildとcf deploy --prebuilt。cfは devDependency で固定し、破壊的な操作では--forceの扱いに注意します。
比較サマリー
項目 | Wrangler | cf(Cloudflare CLI) |
|---|---|---|
状態 | GA、4.149.0(2026-10-08) | オープンベータ、1.0.0-beta.14 |
npm パッケージ |
|
|
対象範囲 | Workers / Developer Platform | Cloudflare の公開 API 全体 |
コマンド数 | 約 280(Cloudflare ブログ) | 2,947(beta.14 の |
作り方 | 製品チームごとに手書き | API スキーマから生成(Forge) |
設定ファイル |
|
|
環境の切り替え |
|
|
ローカル開発 |
|
|
ローカルリソース |
|
|
ビルド成果物 | 独立したビルドコマンドなし |
|
ロールバック |
|
|
ライブログ |
| なし(ドキュメントは |
ログインの既定 | OAuth、localhost:8976 へのコールバック | OAuth デバイス認可フロー( |
認証情報ファイル |
|
|
OS キーリング |
|
|
ログインの共有 | しない | しない |
CI の認証 |
|
|
出力 | 人向け(一部 | 既定で JSON |
エージェント向け機能 |
|
|
今後 | 最後のメジャー版のあと 18 か月サポート | 後継の CLI |
公開情報がない項目
- オープンベータの終了時期: 公式ブログ・changelog・ドキュメントに記載なし(2026-10-12 確認)。
cfへ誘導する Wrangler の「最終メジャー版」のバージョン番号と時期: 公式ブログ・changelog・ドキュメントに記載なし(2026-10-12 確認)。
参考資料
- Introducing cf: the agentic CLI for the entire Cloudflare API(Cloudflare Blog, 2026-09-28)
- Building a CLI for all of Cloudflare(Cloudflare Blog, 2026-04-13)
- Changelog: Cloudflare CLI is now in beta
- Cloudflare CLI ドキュメント(概要)
- cf: Get started(インストールとサインイン)
- cf for Wrangler users
- Migrate a Wrangler project
- Wrangler to cf reference
- cf: Develop, build, and deploy
- cf: Programmatic configuration(cloudflare.config.ts)
- Use cf with coding agents
- Use cf in CI
- cf: Environment variables
- GitHub: cloudflare/cf
- cloudflare/cf: packages/cli/src/index.ts(hideCommand の扱い)
- cloudflare/cf: packages/cli/src/commands/cli/search.ts
- npm: cf
- Wrangler ドキュメント
- Wrangler General commands(login / whoami / auth)
- Wrangler configuration
- Workers: Rollbacks
- Workers: Development & testing
- Workers CI/CD: GitHub Actions
- API: Create Worker Deployment
- API: Add script secret
- API: Export D1 Database
- GitHub: cloudflare/workers-sdk Releases
- npm: wrangler