このコンテンツは自動機械翻訳サービスによる翻訳版であり、皆さまの便宜のために提供しています。原本の英語版と異なる誤り、省略、解釈の微妙な違いが含まれる場合があります。ご不明な点がある場合は、英語版原本をご確認ください。
モデルコンテキストプロトコル(MCP)は、AIエージェントが外部ツールを利用するための標準的な方法となっています。しかし、その中には緊張関係があります。エージェントが有用な作業を行うためには、多くのツールが必要であるのに、追加されたツールごとにモデルのコンテキストウィンドウが埋められ、実際のタスクの余地が減ってしまうのです。
コードモードは、エージェントツール使用中のコンテキストウィンドウの使用を減らすために最初に導入した技術です。すべての操作を個別のツールとして説明するのではなく、モデルが型付きSDKに対してコードを記述し、Dynamic Worker Loader内で安全にコードを実行できるようにします。このコードは、コンパクトなプランとして機能します。このモデルは、ツールの操作を調査し、複数の呼び出しを構成し、必要なデータだけを返すことができます。Anthropicは、Code Execution with MCPに関する投稿で、同じパターンを独自に調査しました。
本日、DNSやZero TrustからWorkers、R2まで、Cloudflare API全体にコードモードを使用する新しいMCPサーバーをご紹介します。サーバーは、search()と実行()の2つのツールを使用するだけで、サーバーはわずか1,000のトークンを消費しながら、MCP上でCloudflare API全体へのアクセスを提供することができます。APIエンドポイントの数に関係なく、フットプリントは固定されます。
Cloudflare APIのような大規模なAPIの場合、コードモードは使用される入力トークンの数を99.9%削減します。コードモードを持たない同等のMCPサーバーは、117万トークンを消費します。これは、最先端の基盤モデルのコンテキストウィンドウ全体よりも多いものです。
ネイティブMCPに対するコードモードの節約(Tiktokenでの測定)
この新しいCloudflare MCPサーバーは、今すぐ使い始めることができます。また、 Cloudflare Agents SDK で新しいコードモードSDK をオープンソースとして公開しています。これにより、独自のMCPサーバーやAIエージェントでも同じアプローチを使用できます。
この新しいMCPサーバーは、コードモードをサーバー側に適用します。サーバーは、数千のツールの代わりに、search()とexecute()の2つのツールをエクスポートします。どちらもコードモードで動作します。以下は、モデルコンテキストに読み込まれるツールの全領域です。
[
{
"name": "search",
"description": "Search the Cloudflare OpenAPI spec. All $refs are pre-resolved inline.",
"inputSchema": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "JavaScript async arrow function to search the OpenAPI spec"
}
},
"required": ["code"]
}
},
{
"name": "execute",
"description": "Execute JavaScript code against the Cloudflare API.",
"inputSchema": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "JavaScript async arrow function to execute"
}
},
"required": ["code"]
}
}
]
何ができるかを探るために、エージェントはsearch()を呼び出します。OpenAPI仕様の型付け表現に対してJavaScriptを記述しています。エージェントは、製品、パス、タグ、またはその他のメタデータでエンドポイントをフィルタリングし、何千ものエンドポイントを必要なものに絞り込むことができます。OpenAPIの完全仕様がモデルコンテキストに入ることは決してありません。エージェントはコードを通じてのみ対話します。
エージェントが行動する準備ができると、execute() を呼び出します。エージェントは、Cloudflare APIリクエストを実行し、ページ指定の処理、応答の確認、および単一の実行で操作を連鎖させることができるコードを記述します。
どちらのツールも、Dynamic Worker Isolate(ファイルシステムなし、プロンプトインジェクションによって漏えいする環境変数がデフォルトで無効化されている)機能を備えた軽量なV8サンドボックス内で生成されたコードを実行します。アウトバウンドリクエストは、必要に応じてアウトバウンドフェッチハンドラーを使用して明示的に制御することができます。
あるユーザーがエージェントに「DDoS攻撃からオリジンを保護してください」と伝えたとします。エージェントの最初のステップは、ドキュメントを参照することです。Cloudflare Docs MCPサーバーを呼び出したり、Cloudflareスキルを使用したり、Webを直接検索したりする場合があります。ドキュメントから学ぶ:Cloudflare WAFとDDoS攻撃対策ルールをオリジンの前に配置する。
ステップ1:適切なエンドポイントを検索します。
検索ツールはモデルにspecオブジェクトを与えます。完全なCloudflare OpenAPIの仕様で、すべての$refsが事前に解決されています。モデルはそれに反してJavaScriptを書きます。ここでは、エージェントはゾーン上のWAFとルールセットエンドポイントを探します:
async () => {
const results = [];
for (const [path, methods] of Object.entries(spec.paths)) {
if (path.includes('/zones/') &&
(path.includes('firewall/waf') || path.includes('rulesets'))) {
for (const [method, op] of Object.entries(methods)) {
results.push({ method: method.toUpperCase(), path, summary: op.summary });
}
}
}
return results;
}
サーバーはWorkers分離でこのコードを実行し、以下を返します。
[
{ "method": "GET", "path": "/zones/{zone_id}/firewall/waf/packages", "summary": "List WAF packages" },
{ "method": "PATCH", "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}", "summary": "Update a WAF package" },
{ "method": "GET", "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules", "summary": "List WAF rules" },
{ "method": "PATCH", "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules/{rule_id}", "summary": "Update a WAF rule" },
{ "method": "GET", "path": "/zones/{zone_id}/rulesets", "summary": "List zone rulesets" },
{ "method": "POST", "path": "/zones/{zone_id}/rulesets", "summary": "Create a zone ruleset" },
{ "method": "GET", "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Get a zone entry point ruleset" },
{ "method": "PUT", "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Update a zone entry point ruleset" },
{ "method": "POST", "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules", "summary": "Create a zone ruleset rule" },
{ "method": "PATCH", "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}", "summary": "Update a zone ruleset rule" }
]
Cloudflare APIの全仕様には、2,500を超えるエンドポイントがあります。このモデルは、必要なWAFとルールセットのエンドポイントに絞り込み、Specをコンテキストウィンドウに入力することはありませんでした。
モデルは、特定のエンドポイントを呼び出す前に、そのスキーマに掘り下げることもできます。ここでは、ゾーンルールセットで利用可能なフェーズを検査します:
async () => {
const op = spec.paths['/zones/{zone_id}/rulesets']?.get;
const items = op?.responses?.['200']?.content?.['application/json']?.schema;
// Walk the schema to find the phase enum
const props = items?.allOf?.[1]?.properties?.result?.items?.allOf?.[1]?.properties;
return { phases: props?.phase?.enum };
}
{
"phases": [
"ddos_l4", "ddos_l7",
"http_request_firewall_custom", "http_request_firewall_managed",
"http_response_firewall_managed", "http_ratelimit",
"http_request_redirect", "http_request_transform",
"magic_transit", "magic_transit_managed"
]
}
これで、エージェントは必要なフェーズ(DDoS攻撃対策にはddos_l7、WAFにはhttp_request_firewall_managed)を把握することができます。
ステップ2:API上で実行
エージェントは実行の使用に切り替えます。サンドボックスは cloudflare.request() を取得します。Cloudflare APIに対して認証された呼び出しを行うことができるクライアントです。まず、エージェントはゾーンに既に存在するルールセットをチェックします。
async () => {
const response = await cloudflare.request({
method: "GET",
path: `/zones/${zoneId}/rulesets`
});
return response.result.map(rs => ({
name: rs.name, phase: rs.phase, kind: rs.kind
}));
}
[
{ "name": "DDoS L7", "phase": "ddos_l7", "kind": "managed" },
{ "name": "Cloudflare Managed","phase": "http_request_firewall_managed", "kind": "managed" },
{ "name": "Custom rules", "phase": "http_request_firewall_custom", "kind": "zone" }
]
エージェントは、管理されたDDoSおよびWAFルールセットがすでに存在することを認識します。呼び出しを連鎖してルールを検査し、一度の実行で感度レベルを更新できるようになりました。
async () => {
// Get the current DDoS L7 entrypoint ruleset
const ddos = await cloudflare.request({
method: "GET",
path: `/zones/${zoneId}/rulesets/phases/ddos_l7/entrypoint`
});
// Get the WAF managed ruleset
const waf = await cloudflare.request({
method: "GET",
path: `/zones/${zoneId}/rulesets/phases/http_request_firewall_managed/entrypoint`
});
}
仕様の検索とスキーマの検査から、ルールセットのリスト作成、DDoSとWAFの設定の取得に至るまで、この操作全体で4回のツール呼び出しが必要でした。
まずは、個々の製品用のMCPサーバーから始めました。DNSを管理するエージェントをご希望ですか? DNS MCPサーバーを追加します。Workersのログが必要ですか?Workers Observability MCPサーバーを追加します。各サーバーは、API操作にマッピングされた固定のツールセットをエクスポートしました。これはツールセットが小規模だったときは機能していましたが、Cloudflare APIには2,500以上のエンドポイントがあります。手作業でメンテナンスしているサーバーの集合体では対応しきれません。
CloudflareのMCPサーバーはこれを簡単に実現します。2つのツール、およそ1,000のトークン、APIの全エンドポイントをカバーします。新しい製品を追加するとき、同じsearch()およびexecute()のコードパスがそれらを発見し、呼び出すことができます。新しいツール定義も、新しいMCPサーバーも必要ありません。GraphQL Analytics APIのサポートもあります。
当社のMCPサーバーは、最新のMCP仕様に基づいて構築されています。OAuth 2.1に準拠しており、Workers OAuth Provider を使用して、トークンの範囲を、接続時にユーザーが承認した選択した権限にダウンスコープします。エージェントは、ユーザーが明示的に許可された機能のみを取得します。
開発者にとっては、シンプルなエージェントループを使用しながら、エージェントが組み込みのプログレッシブ機能検出機能を備えたすべてのCloudflare APIにアクセスできることを意味します。
MCPツールが消費するトークンの数を減らすためのいくつかのアプローチが登場しました。
クライアントサイドのコードモードは、当社の最初の実験でした。モデルは、型付けされたSDKに対してTypeScriptを記述し、クライアント上のDynamic Worker Loaderで実行します。その代償として、エージェントに安全なサンドボックスアクセスを提供する必要があります。コードモードは、GooseとAnthropics Claude SDKにProgrammatic Tool Callingとして実装されています。
コマンドラインインターフェイスは、別の経路です。CLIは自己文書型であり、エージェントが検討している機能を明らかにします。OpenClawやMoltworkerなどのツールは、MCPorterを使用してMCPサーバーをCLIに変換し、エージェントにプログレッシブな情報開示を提供します。限界は明らかです。エージェントにはシェルが必要ですが、すべての環境が提供できるわけではなく、サンドボックス化された分離よりもはるかに広い攻撃対象領域をもたらします。
動的ツール検索は、Claude CodeでAnthropicが使用しているように、現在のタスクに関連すると思われるより少ないツールを表示します。コンテキストの利用は縮小しますが、維持および評価しなければならない検索機能が必要であり、一致した各ツールは依然としてトークンを使用します。
いずれのアプローチも現実的な問題を解決します。しかし、特にMCPサーバーでは、サーバーサイドコードモードはその利点を組み合わせています。APIサイズに関係なくトークンコストが固定されている、エージェント側での変更は不要、プログレッシブ検出が組み込まれている、サンドボックス化された隔離内での安全な実行が可能です。エージェントはコードを使用して2つのツールを呼び出すだけです。それ以外のことはすべてサーバー上で行われます。
Cloudflare MCPサーバーが利用可能になりました。MCPクライアントをサーバーのURLに向けると、Cloudflareにリダイレクトされ、エージェントに付与する権限を承認および選択します。この設定をMCPクライアントに追加します。
{
"mcpServers": {
"cloudflare-api": {
"url": "https://mcp.cloudflare.com/mcp"
}
}
}
CI/CD、自動化、またはトークンをご自身で管理したい場合は、必要な権限を持つCloudflare APIトークンを作成してください。ユーザートークンとアカウントトークンの両方がサポートされており、Authorization ヘッダーのベアラートークンとして渡すことができます。
さまざまなMCPのセットアップ設定の詳細については、Cloudflare MCPリポジトリをご覧ください。
コードモードは、単一のAPIのコンテキストコストを解決します。しかし、エージェントが1つのサービスと通信することはほとんどありません。開発者エージェントは、GitHub、データベース、および内部ドキュメントサーバーとともにCloudflare APIを必要とする場合があります。追加のMCPサーバーが発生するたびに、最初に挙げたものと同じコンテキストウィンドウでの圧力が得られます。
Cloudflare MCPサーバーポータルを使用すると、統合された認証とアクセス制御を備えた単一のゲートウェイの背後で複数のMCPサーバーを構成できます。私たちは、すべてのMCPサーバーに対して第一級のコードモード統合を構築し、ゲートウェイの背後にあるサービスの数に関係なく、組み込みのプログレッシブディスカバリーと同じ固定トークンフットプリントでエージェントに公開します。