「Cloudflare MCP」で調べると、Workers上で自作するリモートMCPサーバー、Cloudflareが運営する公式のMCPサーバー、組織のMCP接続を束ねるMCPサーバーポータルの3つが混ざって出てきます。この記事では3つを分けたうえで、2026年10月時点の構築方法を手順どおりに説明します。Agents SDKの McpAgent は非推奨になり、テンプレートも createMcpHandler のステートレス方式へ切り替わったため、McpAgent を前提にした解説記事の手順は現在のテンプレートと合いません。
まとめ:2026年10月時点のCloudflare MCPの要点
- 構築の現行方式は
createMcpHandler。リクエストごとにサーバーを作り直すステートレス方式で、McpAgentは非推奨です。 - 最短手順は
npm create cloudflareでテンプレート「remote-mcp-authless」を作り、npm startでローカル確認(http://localhost:8788/mcp)、npx wrangler@latest deployで公開します。 - 2025年版のStreamable HTTPクライアントも繋がる。実測では2025-11-25版と2026-07-28版の両方でツールを呼べました。ただしGETとDELETEは405で、セッションに依存する機能は使えません。
- 認証は
@cloudflare/workers-oauth-providerで、認可サーバーとMCPサーバーを別Workerに分け、Service Bindingでトークンを検証します。 - Cloudflareを操作したいだけなら自作不要。公式の
https://mcp.cloudflare.com/mcp(Cloudflare API MCP)が2,500超のAPIを約1,000トークンで扱います。GraphQLやAI Gatewayなどの個別サーバーは非推奨です。 - MCPサーバーポータルは2026-09-24にGA。複数のMCPサーバーを1つのURLにまとめ、Accessのポリシー・ログ・Gateway経由のDLPをかけられます。
Cloudflare MCPが指す3つのもの
MCP(Model Context Protocol)は、AIアプリが外部のツールやデータを共通の作法で呼び出すためのオープン標準です。Webサーバーの一種ではありません。仕組みやAPIとの違いはMCP(Model Context Protocol)とは?仕組み・APIとの違い・MCPサーバーの作り方で解説しています。Cloudflareの文脈で「MCP」と言うときは、次の3つのどれを指すかで読むべきドキュメントが変わります。
| 指すもの | 何をするか | 使う人 | 本記事の章 |
|---|---|---|---|
| Workers上の自作MCPサーバー | 自社APIやDBをツールとして公開 | 開発者 | デプロイ・認証 |
| Cloudflare公式のMCPサーバー | Cloudflareアカウントの設定をAIから操作 | Cloudflare利用者 | 公式MCPサーバー |
| MCPサーバーポータル | 社内で使うMCPサーバーを1つに束ねて統制 | 情報システム部門 | ポータル |
いずれも、ネットワーク越しにStreamable HTTPで接続するリモートMCPサーバーです(CloudflareのMCPドキュメント)。トランスポートの仕様はStreamable HTTPとは?MCPのトランスポートとSSEの違い、2026-07-28仕様の変更点にまとめました。
McpAgentからcreateMcpHandlerへ:2026年の構築方式の変更
2025年時点の公式テンプレートは、McpAgent(Durable Objectでセッションを保持するクラス)を使っていました。現在のMcpAgentのリファレンスは、このクラスを「deprecated and feature-frozen」(非推奨・機能凍結)とし、できるだけ早く createMcpHandler へ移るよう求めています。公式テンプレート remote-mcp-authless も2026-07-30のコミットでステートレス方式へ置き換わっています。
McpAgentとcreateMcpHandlerの違い
| 項目 | McpAgent(非推奨) | createMcpHandler(現行) |
|---|---|---|
| 状態 | Durable Objectでセッション保持 | リクエストごとに新しいサーバー |
| MCP SDK | v1(@modelcontextprotocol/sdk) | v2(@modelcontextprotocol/server) |
| importパス | agents/mcp | agents/mcp/server |
| 2026-07-28版の仕様 | 非対応 | 対応 |
| 今後の機能追加 | なし | あり |
McpAgent の中でSDK v2の McpServer は動かないため、部分的な書き換えはできません。MCP SDK v2への移行ガイドどおり、SDK v2のファクトリー関数として書き直します。
2025年版クライアントとの互換と、失う機能
createMcpHandler の既定値 legacy: "stateless" は、2025年版のクライアントからのツール・プロンプト・リソースの呼び出しをステートレスのまま受け付けます。ただしcreateMcpHandlerのリファレンスによると、次の機能はこの経路では使えません。
- HTTPのGETとDELETE(405を返す)と、MCPのセッションID
- サーバーからクライアントへ押し出すelicitation・sampling・rootsの要求(即座に失敗する)
- 単独のストリーム、再開(resumability)、再送(replay)
これらに依存するサーバーは、ステートレス版のルートを先に出し、既存セッションが消えるまで旧ルートと並行で動かします。その際はステートレス側を legacy: "reject" にしないと、旧クライアントの要求をステートレス側が先に受けてしまいます。セッションに置いていたユーザーごとのデータは、認証済みユーザーをキーにしてKV・D1・R2・Durable Objectへ移します。
WorkersにリモートMCPサーバーをデプロイする手順
公式のリモートMCPサーバー構築ガイドの手順を、2026-10-30にIntel Mac(Node.js v26.5.0・wrangler 4.156.0)で実行して確かめた結果とあわせて示します。Workersそのものの料金や対応言語はCloudflare Workersとは?料金・無料枠・Workers Paidの中身と対応言語・使い方を参照してください。
テンプレートからのプロジェクト作成
npm create cloudflare@latest -- remote-mcp-server-authless --template=cloudflare/ai/demos/remote-mcp-authless
cd remote-mcp-server-authless
npm start
作成時の質問(AGENTS.mdの追加・git・すぐにデプロイするか)は、ガイドではすべて「No」です。テンプレートは agents ^0.29.0 と @modelcontextprotocol/server 2.3.1(版を固定)を使います。後者は agents の任意のpeer依存なので、自分でプロジェクトを組むときは明示的に入れてください。
http://localhost:8788/mcp でのローカル確認
npm start を実行すると wrangler dev が起動し、ガイドの例では Ready on http://localhost:8788 と表示されます。MCPのエンドポイントは http://localhost:8788/mcp です。ポート番号は環境で変わるので、表示された番号を使ってください。
このURLをブラウザで開いても動きません。/mcp はMCPクライアントからのPOSTを待つエンドポイントで、ブラウザが送るGETには405を返します。動作確認には npx @modelcontextprotocol/inspector@latest でMCP Inspectorを起動し、上のURLを入れて「Connect」→「List Tools」と進めます。
curlとMCP TypeScript SDK v2のクライアントで同じエンドポイントを叩いた結果は次のとおりです(ポートは3488に変えて実行)。
| リクエスト | 結果 |
|---|---|
| GET /mcp | 405 Method Not Allowed |
| DELETE /mcp | 405 Method Not Allowed |
| POST(Origin: 外部ドメイン) | 403 Forbidden |
| 2025年版クライアント(SDK既定) | 2025-11-25で接続、add(23,19)=42 |
| 2026年版クライアント(mode: auto) | 2026-07-28で接続、add(23,19)=42 |
SDK v2のクライアントは既定で2025年版のプロトコルを使います。2026-07-28版で接続させたいときは、versionNegotiation: { mode: "auto" } を指定してください。
wrangler deployでの公開
npx wrangler@latest deploy
公開先は https://remote-mcp-server-authless.<アカウント名>.workers.dev/mcp です。このテンプレートは認証が無く、URLを知っていれば誰でもツールを呼べます。社外秘のデータに触るツールを載せる前に、後述のOAuthを付けてください。
コードの要点:createServerとツール登録
テンプレートの src/index.ts の骨格です(ツールは1つに減らしています)。
import { McpServer } from "@modelcontextprotocol/server";
import { createMcpHandler } from "agents/mcp/server";
import { z } from "zod";
function createServer() {
const server = new McpServer({ name: "Authless Calculator", version: "1.0.0" });
server.registerTool(
"add",
{ inputSchema: z.object({ a: z.number(), b: z.number() }) },
async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] }),
);
return server;
}
const handler = createMcpHandler(createServer);
export default {
fetch(request: Request, env: Env, ctx: ExecutionContext) {
return handler(request, env, ctx);
},
} satisfies ExportedHandler<Env>;
書き換えるときに引っかかりやすい点は3つあります。
handlerをそのままexport defaultしない。Wranglerは関数のdefault exportをWorkerEntrypointクラスとして扱うため、リファレンスはオブジェクトのfetch()から呼ぶよう指示しています。- 独自ドメインで公開するなら許可リストを設定する。既定で許可されるのは、localhost・エンドポイントの
workers.dev・corsOptions.originに具体的なURLを書いた場合のそのホスト名です。独自ドメインでCORSをワイルドカードにするなら、allowedHostnamesとallowedOriginHostnamesの両方を明示します。実測でも、外部ドメインのOriginを付けたPOSTは403になりました。 - ツールの失敗は
isError: trueで返す。テンプレートのcalculateはゼロ除算のとき「Error: Cannot divide by zero」という文字列を返すだけで、実測でもisErrorは付いていませんでした。isErrorが無い結果は成功として扱われるため、クライアントやアプリ側でエラーとして処理できません。
MCPクライアントからの接続(Claude Code・Cursor・AI Playground)
Streamable HTTPに対応したクライアントなら、デプロイしたURLを直接登録できます。Claude Codeでは次のコマンドで追加し、claude mcp list で接続を確認します。
claude mcp add --transport http math https://remote-mcp-server-authless.<アカウント名>.workers.dev/mcp
Cursorは、プロジェクトの .cursor/mcp.json かグローバルの ~/.cursor/mcp.json に書きます。Windsurfは同じ構造で、キー名が url ではなく serverUrl です。Claude Desktopについては、テンプレートのREADMEが、設定ファイルで npx mcp-remote <URL> を起動してローカルのプロキシ経由で接続する例を載せています。
{
"mcpServers": {
"my-server": {
"url": "https://remote-mcp-server-authless.<アカウント名>.workers.dev/mcp"
}
}
}
ブラウザだけで試すなら、Workers AI Playgroundの「MCP Servers」にURLを入れて「Connect」を押します。GitHubが提供するリモートMCPサーバーでの接続例はGitHub Remote MCP Serverとは?ローカル版との違い・接続手順・OAuth/PAT認証を解説【2026年10月】にあります。
OAuth認証を付ける:workers-oauth-providerの2 Worker構成
認証はCloudflareのAuthorizationドキュメントのとおり、@cloudflare/workers-oauth-provider(2026-10-30時点のnpm最新は1.2.4)で付けます。公式が推奨するのは、役割の違う2つのWorkerに分ける構成です(1つのWorkerで両方を兼ねる OAuthProvider も引き続きサポートされています)。
認可サーバーとMCPサーバーの役割分担
| Worker | 使うクラス | 持つもの |
|---|---|---|
| 認可サーバー | OAuthAuthorizationServer | ログイン画面、KV(OAUTH_KV) |
| MCPサーバー | OAuthResourceServer | Service Binding(AUTH_SERVER) |
認可サーバーは許可(grant)とトークンを OAUTH_KV という名前のKVに保存し、/authorize でユーザーをログインさせます。GitHubやGoogleでのログインには beginUpstream() と finishUpstream() を使います。Cloudflare AccessやAuth0などでのログイン例もドキュメントにあります。
MCPサーバー側は createMcpHandler を OAuthResourceServer で包みます。有効なトークンが無い要求には401を返し、その応答の中で認可サーバーの場所を知らせます。検証はService Binding経由で、MCPサーバー側にKVは要りません。ツールの中では getMcpAuthContext() でログイン中のユーザーを取り出せます。
DCRに代わるクライアント登録方式CIMDを使う場合は、認可サーバーに global_fetch_strictly_public の互換性フラグが必要です。CIMDの仕組みはCIMD(Client ID Metadata Documents)とは?MCPでDCRに代わるOAuthクライアント登録の仕組みと実装【2026年10月】で詳しく扱っています。
requiredScopesの注意点:宣言だけでスコープは強制されない
OAuthResourceServer の requiredScopes は、クライアントへ必要なスコープを知らせるだけで、強制はしません。公式のサンプルコードにも「advertised, not enforced: check it here」とコメントがあり、ハンドラー内で ctx.auth.scope を確かめ、足りなければ insufficientScope() を返します。この確認を書かないと、読み取り用のトークンで書き込み系のツールまで呼べてしまいます。
Cloudflare公式のMCPサーバー:Cloudflare API MCPとCode Mode
Cloudflareの設定をAIから読み書きしたいだけなら、自分でサーバーを作る必要はありません。CloudflareのMCPサーバー一覧は、https://mcp.cloudflare.com/mcp のCloudflare API MCPを「the only MCP server you need」と位置付けています。DNS・Workers・R2・Zero Trustなど2,500を超えるAPIエンドポイントと、開発者ドキュメントの検索を扱えます。
{
"mcpServers": {
"cloudflare-api": {
"url": "https://mcp.cloudflare.com/mcp"
}
}
}
接続するとCloudflareのOAuth画面で、エージェントへ渡す権限を選びます。CI/CDではAPIトークンをAuthorizationヘッダーのBearerで渡します。
Code Modeによるツール定義のトークン削減
このサーバーのツールは search()・execute()・docs() の3つだけです。モデルはOpenAPI仕様を型付きで参照しながらJavaScriptを書き、そのコードが隔離されたDynamic Workerで実行されます。Cloudflareの比較では、全エンドポイントを個別のツールとして公開すると2,594ツール・約117万トークン、必須パラメーターだけに絞っても約24.4万トークンかかるのに対し、Code Modeは約1,000トークンで済みます。
GraphQL・AI Gateway・Observabilityなどの個別サーバーは非推奨
以前は製品ごとに個別のMCPサーバーがありました。mcp-server-cloudflareのREADMEでは、次の10個が「Deprecated servers」に移され、Cloudflare API MCPへ移るよう案内されています。
| 区分 | サーバー |
|---|---|
| 非推奨 | AI Gateway、Audit Logs、AutoRAG、DNS Analytics、GraphQL |
| 非推奨 | Logpush、Observability、Radar、Workers Bindings、Workers Builds |
| 提供中(任意) | Documentation、Container、Browser Run、DEX、CASB |
| 提供中(任意) | Agents SDK Documentation(agents.cloudflare.com/mcp) |
GraphQLやAI Gatewayの古い設定例を見つけても、新しく組むならCloudflare API MCPを使ってください。
MCPサーバーポータルによる組織のMCP接続の集中管理
MCPサーバーポータルは、社内で使ってよいMCPサーバーを1つのURLにまとめるCloudflare One(Zero Trust)の機能です。ユーザーはCloudflare Accessでポータルにログインし、OAuthが必要な上流サーバーにはそれぞれ認証します。以前は一部で「Agents Gateway」と呼ばれており、ドキュメントはAPIパスや内部のコードに agents_gateway・agw の接頭辞が残っている場合があると説明しています。「cloudflare mcp gateway」で探している設定はこのポータルです。
オープンベータからGAまでに追加された機能
ポータルは2025-08-26にオープンベータで始まり、2026-09-24のチェンジログですべてのCloudflare顧客に一般提供(GA)されました。ベータ以降に加わった機能は次のとおりです。
- Cloudflare Gateway経由のHTTPログとDLP(情報漏えい防止)検査
- Code Modeのポリシー(使えない・任意・既定でオン・必須)
- DCR非対応の上流サーバー向けのOAuthクライアント情報の手動設定
- 自律型エージェント用のサービストークン認証
- LogpushでのSIEMなどへのログ出力(Enterpriseプランのみ)
ポータルの作成手順と接続URL
前提は2つです。ポータルのURLに使うドメインがCloudflare上で有効(フルセットアップかCNAMEの部分セットアップ)であることと、Zero TrustにIdP(IDプロバイダー)が設定済みであることです。
- ダッシュボードで「Zero Trust」→「Access controls」→「MCP Portals」を開き、「MCP servers」タブで上流のMCPサーバーを登録する
- ポータルを作り、公開するサーバー・ツール・プロンプトを選ぶ
- Accessポリシーで接続できるユーザーやグループを決める
- 利用者は
https://<サブドメイン>.<ドメイン>/mcpをMCPクライアントに登録する
ポータルには portal_toggle_single_server などのツールが組み込まれ、利用者は接続を切らずに上流サーバーを個別にオン・オフできます。
上流サーバーのトランスポートの自動判定
ポータルのドキュメントによると、上流サーバーの接続方式は登録したURLの末尾から決まり、管理者が指定する必要はありません。
| 上流URLの末尾 | 試す接続方式 |
|---|---|
| /mcp | Streamable HTTPのみ |
| /sse | SSE(Gateway経由ならStreamable HTTP) |
| それ以外 | 元URLでHTTP→SSE、次に /mcp、/sse |
404・405・406が返ると次の方式を試し、それ以外のエラーではそこで止まります。プライベートネットワーク内のMCPサーバーも、サーバー単位でGateway経由をオンにすれば登録できます(OAuthの認可・トークンのエンドポイントは公開が必要)。
料金と制限:Workers無料枠でのMCPサーバー運用
Workersの料金ページでは、無料プランは1日10万リクエスト、1回の実行あたりCPU時間10ミリ秒までです。有料プラン(月額最低5ドル)は月1,000万リクエストとCPU時間3,000万ミリ秒を含み、超過は100万リクエストごとに0.30ドル、CPU時間100万ミリ秒ごとに0.02ドルです。
MCPサーバーの場合、ツール呼び出し1回がHTTPリクエスト1回にあたります(2025年版クライアントは接続時の初期化要求も数えます)。CPU時間には、外部APIやKV・データベースの応答を待つ時間は含まれません。外部APIを呼んで結果を整形するだけなら、10ミリ秒で収まる余地があります。ただし、大きなJSONの解析や画像処理をツール内で行うと、無料枠の上限を超えて処理が打ち切られるおそれがあります。社内で毎日使うなら、有料プランで見積もるのが安全です。WorkersがV8 Isolateで軽く起動する仕組みはV8 Isolateとは?Contextとの違い・起動時間の実測とCloudflareの分離設計【2026年9月】で解説しています。
Cloudflareでホストすべきケース・避けるべきケース
Cloudflareが向くのは、TypeScriptで書いた薄いツール群をURL1本で社内外へ配りたい場合です。OAuth・ポータル・Accessのポリシーまで同じアカウント内で揃うので、社員が各自のPCでローカルのMCPサーバーを動かす「シャドーMCP」を止めたい組織にも合います。
避けるべきなのは次の3つの場合です。
- Pythonで書いたMCPサーバーをそのまま載せたい:
createMcpHandlerと公式テンプレートはTypeScript(JavaScript)用です。Pythonで作るならFastMCPとは?PythonでMCPサーバーを作る手順とFastMCP 4.1の使い方【2026年10月】のように、Python向けのホスティングを選ぶ方が手戻りがありません。 - サーバーからの通知やセッションに依存した設計を続けたい:非推奨の
McpAgentに新規で乗るのは避けてください。機能凍結済みで、2026-07-28版の仕様にも対応しません。 - 1回のツール実行で重い計算をする:CPU時間の上限(無料10ミリ秒・有料は既定30秒で最大5分)を超える処理は別のサーバーへ逃がします。
自社の業務システムに合わせたMCPサーバーやAIエージェントの設計から相談したい場合は、AIエージェント開発の支援もご覧ください。
よくある質問
Cloudflare MCPサーバーは無料で使えますか?
Workersの無料プラン(1日10万リクエスト・1回あたりCPU時間10ミリ秒)で動かせます。
McpAgentで作った既存のMCPサーバーは動かなくなりますか?
すぐには止まりません。移行中の既存サーバーのために残されていますが、機能凍結のため2026-07-28版の仕様には対応しません。セッションやサーバー主導の要求を使っていなければ、createMcpHandler へ直接移行できます。
http://localhost:8788 をブラウザで開いても何も表示されないのはなぜですか?
/mcp はMCPクライアントからのPOSTを受けるエンドポイントで、ブラウザのGETには405を返すためです。MCP Inspector(npx @modelcontextprotocol/inspector@latest)にURLを入れて確認してください。
cloudflare mcp server portalとは何ですか?
複数のMCPサーバーを1つのURLに束ね、Cloudflare Accessでログインとツールの利用範囲を管理するCloudflare Oneの機能です。2026-09-24にGAになりました。旧称はAgents Gatewayです。
Cloudflare PagesでMCPサーバーを動かせますか?
公式のテンプレートとガイドはWorkersへのデプロイ(wrangler deploy・workers.dev)を前提にしています。これから作るならWorkersを選ぶのが近道です。
関連記事
- MCP(Model Context Protocol)とは?仕組み・APIとの違い・MCPサーバーの作り方
- Streamable HTTPとは?MCPのトランスポートとSSEの違い、2026-07-28仕様の変更点
- CIMD(Client ID Metadata Documents)とは?MCPでDCRに代わるOAuthクライアント登録の仕組みと実装【2026年10月】
- Cloudflare Workersとは?料金・無料枠・Workers Paidの中身と対応言語・使い方
- GitHub Remote MCP Serverとは?ローカル版との違い・接続手順・OAuth/PAT認証を解説【2026年10月】