Cloudflare が 2026-09-28 に cf CLI を公開した。GitHubのAboutは “The agentic CLI for the entire Cloudflare API”——エージェント向けの、Cloudflare API全体を覆うCLI。面白いのは売り文句ではなく作りのほうで、cf --help を叩くと最初に出てくるのが人間向けの説明ではなく「AGENTS:」で始まるエージェント宛ての指示だった。Cloudflare のAPIは巨大で、同梱の索引を数えると 2,936コマンドある。それを全部エージェントに読ませたら文脈が吹き飛ぶ——この問題に対する回答が、このCLIの設計そのものになっている。npm の cf 1.0.0-beta.5 を実際に導入して、その設計をトークン数で測った。

cf CLIのエージェント向け発見フロー。①cf cli searchに『やりたいこと』を書いて意図で検索、②コマンドと要約だけの5件のJSONが112トークンで返る、③cf schemaで必要なAPI定義を70トークンで取る
出典: cf 1.0.0-beta.5 を実際に実行して計測(2026-09-29)。トークンは tools/token_audit.py の heuristic 近似
30秒でわかるcf CLI(2026-09-29時点)
  • ・Cloudflareの公開OpenAPIから生成された、API全体を覆うCLI。npmの無印パッケージ `cf` として配布
  • ・`cf --help` に出るトップレベルは80コマンド。同梱索引に載る総数は2,936コマンド
  • ・索引全体は約108万トークン。対して `cf cli search` 1回の応答は112トークンで済む
  • ・helpの冒頭に「AGENTS: --help を入れ子で辿るな、まず検索しろ」というバナー(約180トークン)が常に付く
  • ・検索はローカル。プロキシ環境変数を全部外しても動いた
  • ・1.0.0-beta.5・Node.js 22以上・ライセンスは 0.15.0 までのMITから MIT OR Apache-2.0 のデュアルへ変更済み

エージェント基盤そのものの比較はAIエージェントフレームワーク比較2026|LangGraph・CrewAI・Dify等9種をStar数・実コードで検証にまとめてある。本記事は、エージェントに操作させる側のツールがどう設計されるか、という話だ。

cf CLIとは:OpenAPIから生成された2,936コマンド

README の一文がこのCLIの正体を端的に説明している——「Cloudflare の公開OpenAPIサーフェスから生成され、スコープなしの cf npmパッケージとして公開された、Cloudflare の統合コマンドラインインターフェース」。手書きではなく生成物であることが、規模の説明になる。

導入して中身を数えた。

npm install cf          # 1.0.0-beta.5
./node_modules/.bin/cf --help | grep -cE '^  cf [a-z]'
# 80

cf --help に並ぶトップレベルは80。access ai ai-gateway ai-search analytics builds cache containers workers workflows zero-trust zones といった具合に、Cloudflare の製品名がほぼそのまま並ぶ。AI関連だけでも ai・ai-audit・ai-gateway・ai-search・agent-memory・browser-run があり、この会社が何を製品にしているかの一覧としても読める。

ただし80は入口にすぎない。パッケージに同梱された dist/_meta/commands.json を開くと、実際のコマンド定義は 2,936件、説明文が1,328件入っていた。cf abuse-reports appeals eligibility のような3階層4階層のコマンドが延々と続く。ファイルサイズは4.3MB。APIスキーマの schemas.json が別に2.8MBある。

cf CLIの実測データ。索引に載るコマンド総数2,936、トップレベルのコマンド80、npmパッケージ23MB(294ファイル)、GitHub star 147(fork 1)
star/fork はリポジトリページ、他は npm の cf 1.0.0-beta.5 を導入して実測(2026-09-29)

パッケージ自体もそれなりに重い。npmの unpackedSize は23.2MB・294ファイルで、空のプロジェクトに入れると node_modules は221MBになった。依存は7つで、miniflare(Workersのローカル実行環境)、minisearch(全文検索)、blake3-wasm、@cloudflare/config、@cloudflare/codemods ほか。ローカル開発ランタイムと検索エンジンを抱き込んでいる構成だ。bin には cf と cloudflare の2つが登録される。

helpの冒頭がエージェント宛ての指示になっている

このCLIで最初に驚くのはここだ。cf --help を叩くと、コマンド一覧より先にこれが出る。

helpバナーの4つの指示。探索の禁止として--helpを入れ子で辿ってコマンドを探すなと明記、入口の指定としてまずcf cli searchにやりたいことを書けと指示、匿名化の要求として名前・メール・ドメイン・ID・トークンを検索語に入れるなと警告、次の一手として詳細は該当コマンドのhelp、API定義はcf schemaへ
出典: cf --help 冒頭の STOP: AGENT COMMAND DISCOVERY ブロック(723バイト・約180トークン)を実測(2026-09-29)

=== STOP: AGENT COMMAND DISCOVERY === という見出しで始まり、「AGENTS: --help を入れ子で呼び続けてコマンドを探索するな」「最初に当たるべき、かつ最良の発見手段は cf cli search "<やりたいことの説明>" だ」「5件のコンパクトなJSONが短い説明つきで返る。似た検索を繰り返さず、その中から選べ」と続く。締めは「詳細は <見つけたコマンド> --help、APIリクエストの詳細は先頭の cf を cf schema に置き換えろ」。

ツールのhelpが、エージェントへのプロンプトになっている。しかもこのバナーは cf cli telemetry --help のようなサブコマンドのhelpにも毎回付く。723バイト・約180トークンを毎回払ってでも、入れ子探索で数万トークンを溶かすより安い、という判断だろう。

もうひとつ見逃せないのが、バナーに混ざっている一文だ——「AGENTS: cf cli search のクエリは匿名に保て。動作とリソース種別だけを書き、名前・メールアドレス・ドメイン・アカウントやリソースのID・トークン・その他の識別情報を決して含めるな」。エージェントは検索クエリに文脈をそのまま流し込みがちなので、先回りして禁止している。この種の注意書きをツール側のhelpに埋める発想は、エージェント運用の実務から出てきたものに見える。

エージェントに大きなツール表面を渡すときのコストは、当サイトでもMCPサーバーを測るたびに問題になってきた。39ツールで約16,603トークンだったHindsightとは|学習するAIエージェント記憶OSSをMCP 39ツールと6.8GBの実測で解説の例が分かりやすい。cf CLI が向き合っているのは、その2桁上の規模だ。

実測:全部渡すと108万トークン、検索1回なら112トークン

設計の意図は数字にするとはっきりする。同梱JSONと実行結果をそれぞれ計測した。

トークン量の比較。commands.json全体は2,936コマンドの定義で4.3MB・1,076,415トークン、schemas.jsonはAPIスキーマで2.8MB・703,296トークン、cf --helpはトップレベル80コマンドで10KB・2,548トークン、cf cli search 1回は5件のJSONで448バイト・112トークン
同梱の dist/_meta/*.json と実行結果を tools/token_audit.py の heuristic 近似トークナイザで計測(2026-09-29)
対象 サイズ 概算トークン
commands.json 全体(2,936コマンド) 4.3MB 約1,076,415
schemas.json(APIスキーマ) 2.8MB 約703,296
cf --help(トップレベル80コマンド) 10,195B 約2,548
cf cli search の応答1回(5件) 448B 約112
cf schema cache purge の応答1件 281B 約70

トークナイザは tools/token_audit.py の heuristic 近似(CJK 1字=1・ASCII 4字=1)で、tiktoken の cl100k_base は当環境からBPE辞書を取得できないため使っていない。実トークナイザとは数%ずれるが、桁の比較には十分だ。

全コマンド定義をそのまま読ませたら約108万トークン。現行のどのモデルの文脈にも入らない。対して検索1回は112トークン——約9,600分の1で済む。cf --help の2,548トークンですら、毎回払うには安くない部類なので、バナーが「まず検索しろ」と言っているのは筋が通っている。

実際の挙動も見ておく。

cf cli search "deploy a worker"
# [
#   { "command": "cf deploy",               "summary": "Deploy a worker to Cloudflare" },
#   { "command": "cf previews deploy",      "summary": "Deploy a Worker Preview" },
#   { "command": "cf builds deploy-hooks get", "summary": "Get a deploy hook" },
#   ... 計5件
# ]

返るのはコマンド名と一行要約だけ。エージェントはこの5件から選び、必要なら cf deploy --help で詳細を、cf schema cache purge でAPI定義(operationId・HTTPメソッド・パス・パラメータ)を281バイトで取る。段階的に開示する構造になっている。

検証環境:Linux 6.18.44/Node.js 24.21.0/npm/2026-09-29。npm から cf 1.0.0-beta.5(2026-09-28公開)を空のプロジェクトへ導入し、cf --help・cf cli search・cf schema・cf cli telemetry status・cf zones list を実行。トークン量は同梱の dist/_meta/commands.json・schemas.json と各コマンドの実出力を tools/token_audit.py の heuristic 近似トークナイザで計測。検索のローカル性はプロキシ環境変数をすべて env -u で外した状態での実行で確認した。未検証:Cloudflareアカウントを持たないため、実際のAPI操作を1つも行っていない。認証、Workersのデプロイ、ローカル開発(Vite連携)、cloudflare.config.ts による設定、テレメトリの送信内容と送信先はいずれも未確認。公式の発表ブログ(blog.cloudflare.com)は当環境から到達できず、READMEとCLIの実出力のみを根拠にしている。wrangler との関係についても一次情報に到達できていない。star 147・fork 1 はリポジトリページの表示値。

何を渡さないかを決めているCLI

この設計を一枚にまとめるとこうなる。

エージェントに渡さないものと渡すもの。渡さないのは2,936コマンドの定義(約108万トークン)、APIスキーマ全体(約70万トークン)、--helpを入れ子で辿る探索、検索語に含めた識別情報。渡すのは意図で引いた5件のJSON(約112トークン)、必要な1件のAPI定義(約70トークン)、トップレベルの80コマンド(約2,548トークン)、毎回のhelpに付く指示バナー(約180トークン)
すべて cf 1.0.0-beta.5 の実行結果と同梱JSONから計測(2026-09-29)

MCPサーバーが同じ問題にぶつかったとき、よく採られるのはツール数を絞る許可リスト方式だ。だが2,936という規模ではそれも成り立たない——どれを残すかを人間が決められないからだ。cf CLI の答えは絞るのではなく、引かせる。索引はローカルに全部持ち、エージェントには検索の窓口だけを見せる。

flowchart TD A["エージェント"] --> B["cf --help
約2,548トークン+バナー180"] B --> C{"バナーの指示"} C --> D["cf cli search 'やりたいこと'"] D --> E["ローカル索引 commands.json
2,936コマンド・約108万トークン"] E --> F["5件のJSON
約112トークン"] F --> G["cf <選んだコマンド> --help"] F --> H["cf schema <選んだコマンド>
API定義 約70トークン"] G --> I["実行"] H --> I

検索がローカルであることは確かめた。プロキシの環境変数を env -u で全部外した状態で cf cli search "purge cache" を実行しても、通常どおり5件のJSONが返る。依存に minisearch が入っていること、検索モジュールに fetch( が0件でURLも含まれないことと整合する。ネットワークなしで2,936コマンドから引けるわけで、エージェントのループに組み込むには都合がいい。

ここで冒頭の匿名化の注意書きに戻ると、少し捻れて見える。検索がローカルなら、クエリに識別情報を入れても外へは出ない——ただしテレメトリは別だ。

触ってわかる作法:認証・テレメトリ・ローカル実行

エージェント向けという看板の裏で、普通のCLIとしての作りも見ておく。

認証していない状態で実コマンドを叩くと、何が足りないかをその場で教えてくる。

cf zones list
# ┌ Error
# │ No authentication token found.
# │
# │ Please set one of the following:
# │   1. Set the CLOUDFLARE_API_TOKEN environment variable
# │   2. Run 'cf auth login' to authenticate via OAuth
cf cli telemetry status
# Status: Enabled
# Configure on this machine: `cf cli telemetry enable` / `cf cli telemetry disable`.
# Override per invocation with CF_SEND_TELEMETRY=true/false. DO_NOT_TRACK is also honored.

認証エラーが親切なのは、エージェントに渡すツールとしては地味に重要だ。「何をすれば直るか」が出力に書いてあれば、エージェントは次の一手を自分で決められる。逆に黙って空配列を返すようなCLIだと、エージェントは失敗に気づかないまま進む。

テレメトリは既定で有効だが、止め方が3通り明示されているうえ DO_NOT_TRACK を尊重すると書いてある。この環境変数は業界で共有されている取り決めで、これを読む実装はそう多くない。当サイトで最近測ったツールでも、既定ONかつ専用の環境変数しか用意していない例のほうが目立った——たとえばmem0とは|AIエージェントの記憶OSSを217MBで実測、公開ベンチ値が指すのはOSS版ではないで確かめた実装は、既定ONで MEM0_TELEMETRY=false のみという形だった。

グローバルフラグも設計思想が見える並びになっている。-q/--quiet(非必須の出力を抑制)、-z/--zone、--profile(認証プロファイルの切り替え)、-m/--mode、そして --local(ローカルのリソース模擬を使う) と --persist-to(ローカル状態の保存先、既定は ~/.config/cloudflare/state)。依存に miniflare が入っているのはこのためで、本番のAPIを叩かずにローカルで完結させる経路が最初から用意されている。エージェントに試行錯誤させる前提なら、この --local の存在は効く。エージェントに「作業場」を与える設計という点では、Officeの編集面をAPIとして開くUniverとは|AIエージェント向けOffice SDKを実測、OSSとProの境界はどこにあるかとも問題意識が重なる。あちらは編集と人のレビューを分けることで安全を確保し、こちらはローカル模擬と段階的な開示で文脈と本番環境の両方を守っている。

GitHubのREADMEによれば、設定は cloudflare.config.ts というTypeScriptのファイルで書き、Workers から順に対応していく方針で、ローカル開発は Vite 連携で提供されるという。@cloudflare/codemods が依存に入っているのも、既存設定からの移行を機械で行う想定だろう。ただしこれらは本記事では動かしていないため、README の記載として扱う。

導入前に押さえる点

・テレメトリは既定で有効:cf cli telemetry status は Status: Enabled を返す。無効化は cf cli telemetry disable、CF_SEND_TELEMETRY=false、そして DO_NOT_TRACK 環境変数も尊重される、と出力に明記されている。送信内容と送信先は本記事では確認していないが、業界標準の DO_NOT_TRACK を読む実装になっているのは好感が持てる
・ライセンスが途中で変わっている:npmのメタデータを全28バージョン見ると、0.15.0(2026-09-25)までは MIT、1.0.0-beta.0(同日)以降は MIT OR Apache-2.0 のデュアルライセンス。パッケージにも LICENSE-APACHE と LICENSE-MIT の2ファイルが入っている
・コマンド名は2つ入る:0.15.0 から bin に cf と cloudflare が登録される。短い cf は既存コマンドと衝突しうるので、環境によっては別名の側を使うことになる
・Node.js 22以上が必須:engines の指定。本記事は24.21.0で検証した
・まだ beta:1.0.0-beta.5 で、READMEも “This is a beta preview” と明記。28バージョンが2026-09-24からの5日間に出ており、変化は速い
・認証は明示的:未認証のまま cf zones list を叩くと、CLOUDFLARE_API_TOKEN を設定するか cf auth login を実行しろ、というエラーが返る。黙って失敗しないのは良い

総括。 cf CLI で見るべきは機能一覧ではなく、エージェントに何を渡さないかを先に決めたという設計判断のほうだ。2,936コマンドを持ちながら、エージェントの視界に入るのは検索の窓口と5件の候補だけ。helpの先頭を人間向けの説明ではなくエージェント宛ての指示に明け渡し、匿名化の注意まで書き込む——ここまで割り切ったCLIはまだ珍しい。

APIが数百・数千に膨らんだ製品をエージェントに触らせる方法は、これから各社がぶつかる問題だ。MCPでツールを並べるか、CLIに検索の窓口を付けるか。cf CLI は後者に振り切った実例で、その効き目は108万対112という比で測れる。beta なので今の挙動が続く保証はないが、設計の参照先としては今日から使える。

参照ソース

・cloudflare/cf(公式リポジトリ) — README・LICENSE-MIT/LICENSE-APACHE・star/fork を 2026-09-29 に確認
・cf(npmレジストリ) — 全28バージョンの公開日・license・engines・bin・dist メタデータ
・Cloudflare Developers Docs — cf --help の末尾が案内する公式ドキュメント
・cf CLI 発表ブログ(Cloudflare公式) — 発表本文(当記事の環境からは到達できず、内容は未取得)