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 を実際に導入して、その設計をトークン数で測った。
- ・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ある。
パッケージ自体もそれなりに重い。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 を叩くと、コマンド一覧より先にこれが出る。
=== 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コマンド) |
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
この設計を一枚にまとめるとこうなる。
MCPサーバーが同じ問題にぶつかったとき、よく採られるのはツール数を絞る許可リスト方式だ。だが2,936という規模ではそれも成り立たない——どれを残すかを人間が決められないからだ。cf CLI の答えは絞るのではなく、引かせる。索引はローカルに全部持ち、エージェントには検索の窓口だけを見せる。
約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公式) — 発表本文(当記事の環境からは到達できず、内容は未取得)