MCP server portal は、複数の Model Context Protocol(MCP)サーバー ↗ を、1 つの HTTP エンドポイントに集約します。
このガイドでは、MCP サーバーを Cloudflare Access に追加し、ツールとポリシーをカスタマイズした MCP portal を作成し、MCP クライアントでユーザーを portal に接続する方法を説明します。
MCP server portals は、次の機能を提供します。
- 複数 MCP サーバーへのアクセスを簡素化: MCP server portals は、未認証の MCP サーバーと、OAuth で保護された MCP サーバー(例: Access for SaaS または 第三者 OAuth プロバイダー)の両方に対応します。ユーザーは Cloudflare Access 経由で portal URL にログインし、OAuth が必要な各サーバーへは別途認証を求められます。
- MCP プロトコル互換: portal は、ステートレス MCP
2026-07-28と、それ以前の 2025 Streamable HTTP クライアントおよびサーバーに対応します。portal は接続ごとに対応プロトコルを選び、プロトコル設定は不要です。 - portal ごとのカスタムツール: 管理者は、portal 経由でユーザーに公開する特定のツールとプロンプトテンプレートを選び、用途に合わせて MCP portal を調整できます。ユーザーは厳選されたツールとプロンプトにアクセスできます。AI モデルに渡す外部コンテキストが少ないほど、応答はよくなる傾向があります。
- ツールとプロンプトのエイリアス: 管理者は、アップストリーム MCP サーバーを変更せずに、ツールとプロンプトの名前を変更 し、説明を編集できます。エイリアスは、エンドユーザーが適切なツールを見つけ、AI エージェントが正しいツールを選ぶのに役立ちます。
- コンテキスト最適化: portal は、ツール定義を最小化または非表示にし、コンテキストウィンドウの使用量を減らすクエリパラメーターオプションに対応します。詳細は コンテキストを最適化する を参照してください。
- 非ブラウザークライアント対応: MCP クライアントは、managed OAuth 経由の標準 OAuth 2.0 authorization code フローで portal に認証します。この managed OAuth 設定は、portal の Access アプリケーションに適用されます。portal 内の個別 MCP サーバーが使うアップストリーム OAuth とは別です。非ブラウザークライアントは、ブラウザーリダイレクトではなく、Access の OAuth discovery エンドポイントを指す
WWW-Authenticateヘッダー付きの401応答を受け取ります。マシン間アクセスでは、Access サービストークン でも接続できます。 - Code Mode: Code Mode は、すべてのアップストリームツールを、検索とコード実行の 2 つのツールにまとめます。AI エージェントは、各ツール向けの型付きメソッドを呼ぶ JavaScript を書きます。コードは隔離された Dynamic Worker 環境で実行されます。管理者は、Code Mode を利用不可、任意、デフォルトオン、必須のいずれかにできます。設定と接続手順は Code Mode を参照してください。
- 観測性: ユーザーの AI エージェントが portal に接続すると、Cloudflare Access は portal 内のツールを使った個別リクエストを記録します。より豊富な HTTP ログとデータ損失防止(DLP)スキャンのために、Cloudflare Gateway 経由で portal トラフィックをルーティングすることもできます。
次の図は、リクエストが MCP server portal をどう流れるかを示します。
- MCP クライアントは portal URL に接続し、OAuth discovery メタデータ付きの
401応答を受け取ります。 - ユーザーは IdP 経由で Cloudflare Access に認証するか、サービストークン ヘッダーを使います。
- Access がユーザーの ID を検証し、portal は有効なアップストリームサーバーから利用可能なツールを返します。
- ユーザーがツールを呼ぶと、portal は ツールの名前空間 から対象サーバーを特定し、適切な認証情報を付けてリクエストをプロキシします。Gateway ルーティング がオンの場合、リクエストは HTTP ログと DLP 検査のために Cloudflare Gateway を通ります。
- アップストリームサーバーはリクエストを処理し、同じ経路で応答を返します。
自動 OAuth 登録を使うサーバーでは、管理者認証情報を使ったツールとプロンプトのバックグラウンド同期が、およそ 2 時間ごとに実行されます。この同期はアップストリームサーバーへ直接接続し、Gateway 経由ではルーティングしません。
portal は、/mcp エンドポイントでステートレス MCP 2026-07-28 ↗ と、それ以前の 2025 Streamable HTTP クライアントを受け付けます。portal は各リクエストからプロトコルを選びます。プロトコルバージョンの設定は不要です。
portal は、Streamable HTTP ↗ または SSE ↗ トランスポートでアップストリーム MCP サーバーに接続します。Streamable HTTP サーバーでは、portal は MCP 2026-07-28 対応を確認し、利用可能ならステートレスプロトコルを使います。アップストリームサーバーが対応していない場合、portal は同じ接続で 2025 ハンドシェイクにフォールバックします。SSE 接続は常にレガシープロトコルを使います。
クライアントとアップストリームのプロトコル選択は独立しています。たとえば、2025 クライアントは portal 経由でステートレスなアップストリームサーバーに接続できます。ステートレスクライアントがレガシーアップストリームサーバーに接続することもできます。
アップストリームサーバーが使うトランスポートを指定する必要はありません。portal は複数の接続戦略を順に試し、正しいトランスポートを自動検出します。
| アップストリーム URL のパターン | 接続戦略(順) |
|---|---|
/mcp で終わる |
Streamable HTTP のみ |
/sse で終わる |
SSE(Gateway ルーティングがオンの場合は Streamable HTTP) |
| その他の URL | 元の URL で Streamable HTTP、次に元の URL で SSE、次に {url}/mcp で Streamable HTTP、次に {url}/sse で SSE |
接続試行が 404、405、または 406 エラーを返すと、portal は次の戦略にフォールバックします。その他のエラーでは接続試行を止めます。
すべての portal は、アップストリームサーバーのツールに加え、次の組み込みツールを MCP クライアントへ公開します。
| ツール | 説明 |
|---|---|
portal_list_servers |
利用可能なすべてのアップストリームサーバーを、ID、名前、現在オンかどうかを含めて一覧します。 |
portal_toggle_servers |
サーバーをオンまたはオフにできる、URL ベースのサーバー選択ページを開きます。 |
portal_toggle_single_server |
MCP クライアントを離れずに、サーバー ID で 1 つのサーバーをオンまたはオフにします。 |
コンテキスト最適化 がオンのとき、モードに応じて追加ツールが公開されます。
| モード | 追加ツール |
|---|---|
minimize_tools |
portal_query_tools — 正規表現パターンでツールを検索し、完全な定義を返します。 |
search_and_execute |
portal_query_tools と portal_execute — ツールを検索し、プロキシ経由で実行します。 |
MCP 2026-07-28 リクエストはステートレスで、MCP プロトコルセッションは作りません。portal は、ユーザーの portal 認可グラント向けに、認証、サーバー選択、アップストリーム OAuth の状態を保持します。
以前の 2025 クライアントは、ユーザーが切断するか、24 時間の無操作でセッションが期限切れになるまで続くセッションを作ります。
ユーザーは、切断せずに個別サーバーをオンまたはオフにできます。ステートレスリクエストでは、サーバートグルは同じ portal 認可グラントを使うすべてのリクエストに適用されます。レガシークライアントでは、トグルは MCP セッションに限定されます。トグルはほかのユーザーには影響しません。
MCP server portals は、以前一部の文脈で Agents Gateway と呼ばれていました。API パス、Terraform リソース、内部コードベースでは、まだ agents_gateway または agw プレフィックスを使うことがあります。製品名は MCP server portals で、ダッシュボードのナビゲーションは MCP Portals です。
- portal URL 用のドメイン。次のいずれかを使えます。
- フルセットアップ または パーシャル(
CNAME)セットアップ を使う、Cloudflare 上のアクティブなドメイン - アカウントの
workers.devサブドメイン - Cloudflare Pages プロジェクトに関連付けられた
pages.devドメイン
- フルセットアップ または パーシャル(
- Cloudflare Zero Trust に設定した IdP
個別の MCP サーバーを Cloudflare Access に追加し、一元管理します。
MCP サーバーを追加する手順:
-
Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
-
MCP servers タブを開きます。
-
Add an MCP server を選びます。
-
サーバーの任意の名前を入力します。
-
(任意)Server ID にカスタム文字列を入力します。
-
HTTP URL に、MCP サーバーの完全な URL を入力します。たとえば Cloudflare Documentation MCP server ↗ を追加する場合は、
https://docs.mcp.cloudflare.com/mcpを入力します。 -
MCP server portal でサーバーを表示または非表示にするための Access ポリシー を追加します。MCP サーバーのリンクは、Allow ポリシーに一致するユーザーにだけ portal に表示されます。Allow ポリシーを通過しないユーザーは、どの portal 経由でもこのサーバーを見ません。
-
Save and connect server を選びます。
-
MCP サーバーが OAuth に対応している場合、OAuth プロバイダーへのログインへリダイレクトされます。MCP サーバー上の任意のアカウントでログインできます。認証に使ったアカウントは、その MCP サーバーの管理者認証情報になります。MCP portal を設定 し、この管理者認証情報でリクエストできます。
Cloudflare Access はサーバー接続を検証し、プロンプトとツールの一覧を取得します。サーバーの接続が成功すると、サーバーステータス は Ready になります。これで MCP サーバーを MCP server portal に追加できます。
アップストリームプロバイダーが OAuth Dynamic Client Registration ↗ に対応していないときは、手動 OAuth 認証情報を使います。このフローは、アップストリームプロバイダーに登録した OAuth アプリケーションを使います。
- 認証方法を OAuth にして MCP サーバーを追加します。
- Zero Trust > Access controls > MCP Portals で MCP servers タブを開きます。
- サーバーを見つけ、三点リーダー > Edit を選び、Authentication を開きます。
- OAuth credentials で Manual credentials を選びます。
- 表示される Redirect URI to register at the upstream provider をコピーします。OAuth アプリケーションの許可されたリダイレクト URI に追加します。
- Discover OAuth endpoints を選びます。検出に失敗した場合は、Show OAuth endpoints (advanced) を展開し、Authorization endpoint と Token endpoint を入力します。任意の Revocation endpoint と Issuer も入力できます。
- OAuth アプリケーションの Client ID と Client secret を入力します。
- (任意)ユーザーに要求する、スペース区切りの Scope 値を入力します。
- (任意)プロバイダーが期待する Token endpoint auth method を入力します。対応値は
client_secret_postとclient_secret_basicです。 - Save server を選びます。
サーバーを自動認証情報から手動認証情報へ切り替えると、ダッシュボードは 共有 Cloudflare コールバック URL を使います。
https://oauth-callbacks.cloudflareaccess.com/cdn-cgi/access/outbound-oauth-callback常にダッシュボードに表示されるリダイレクト URI を登録します。OAuth プロバイダーは通常、URI の完全一致を要求します。
Cloudflare はクライアントシークレットを暗号化して保存し、ダッシュボードや API では返しません。サーバーを編集するときは、既存値を維持するために Client secret を空のままにします。シークレットをローテーションするには、アップストリームプロバイダーで置き換えを作成または有効化し、新しい値を入力してサーバーを保存します。
手動認証情報には、ユーザーごとの認証が必要です。サーバーを portal に追加するときは、Require user auth を有効のままにします。最初のユーザーがアップストリーム OAuth を完了するまで、サーバーは Waiting ステータスのままです。そのあと Cloudflare はサーバーのツールとプロンプトを取得し、ステータスを Ready に変更します。
説明に UI リソースを宣言するツールである MCP Apps ↗ も、MCP サーバーへの接続成功後に利用できます。MCP Apps に対応する MCP クライアントの一覧は、Extension Support Matrix ↗ で確認できます。
MCP サーバーステータスは、Cloudflare Access でのサーバー接続と、ツールおよびプロンプトの同期状態を示します。
| ステータス | 説明 |
|---|---|
| Error | サーバーに到達できないか、エラーを返しました。原因の特定と修正は エラー詳細 を参照してください。 |
| Sync Required | サーバーの OAuth 認証情報を更新できなくなり、サーバーの再認証が必要です。修正するには、サーバーを再認証 します。 |
| Waiting | サーバーのツールとプロンプトを同期中です。手動 OAuth 認証情報のサーバーは、最初のユーザーがアップストリーム OAuth を完了するまでこの状態のままです。 |
| Ready | サーバーは正常に接続し、ツールとプロンプトが同期されました。このステータスは、クエリ時にサーバーが接続またはリソースを返すことを保証しません。 |
MCP サーバーが Error または Sync Required のとき、ダッシュボードでステータスにカーソルを合わせると、利用可能な診断情報を確認できます。API はこれらの詳細を error_details オブジェクトで返します。
| フィールド | 説明 |
|---|---|
status_code |
MCP サーバーが返した HTTP ステータスコード(ある場合)。 |
mcp_code |
サーバーが MCP エラーを返した場合の、MCP プロトコルエラーコード。 |
retryable |
エラーが一時的で、接続を再試行する価値がありそうかどうか。 |
is_upstream |
MCP サーバーがエラーを返した場合は true。MCP サーバーへの接続自体が失敗した場合は false。 |
cause |
根本のエラーメッセージ。 |
is_upstream が true のときは、status_code、mcp_code、cause を使って MCP サーバーをトラブルシューティングします。false のときは、サーバー URL が正しく到達可能かを確認します。retryable が true なら同期を再試行します。それ以外は、再試行前に報告された原因を修正します。エラーが期限切れまたは無効な認証情報を示すときだけ、サーバーを再認証します。
Cloudflare Access で MCP サーバーを再認証する手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- MCP servers タブを開きます。
- 再認証するサーバーを選び、Edit を選びます。
- Authenticate server を選びます。
OAuth プロバイダーへのログインへリダイレクトされます。認証に使ったアカウントは、この MCP サーバーの新しい管理者認証情報になります。
自動 OAuth 登録を使うサーバーでは、Cloudflare Access はおよそ 2 時間ごとにツールとプロンプトを同期します。同期中、Cloudflare は 管理者認証情報 で MCP サーバーに接続し、現在のツールとプロンプト一覧を取得します。管理者認証情報の OAuth アクセストークンが期限切れの場合、Cloudflare は接続前に保存済みリフレッシュトークンで自動更新します。
リソースは同期も保存もされません。MCP クライアントが resources/list リクエストを送ると、portal はアップストリームサーバーからライブでリソースを取得します。接続できない、または応答しないサーバーは結果から省かれます。
Zero Trust で MCP サーバーを手動更新する手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- MCP servers タブを開き、更新するサーバーを見つけます。
- 三点リーダー > Sync capabilities を選びます。
MCP サーバーページに、更新されたツールとプロンプトの一覧が表示されます。新しいツールとプロンプトは、MCP server portal で自動的に有効になります。
API でも同期を起動できます。同期エンドポイントは、同期後の現在のサーバー状態を返します。更新された サーバーステータス、ツール数、同期失敗時の エラー詳細 を含みます。
ユーザーがユーザーごとの OAuth を必要とするアップストリーム MCP サーバーを認可すると、portal はユーザーの代わりにアップストリームサーバーと OAuth authorization code フローを実行します。このフローの一部として、portal はコールバック URL(redirect_uri)をアップストリームサーバーに登録します。ユーザーがアクセスを認可したあと、アップストリームサーバーはこの URL へリダイレクトします。
デフォルトでは、portal は portal ドメイン上のコールバック URL を使います。
https://<your-portal-hostname>/servers-callbackこの URL を、アップストリーム OAuth プロバイダーのリダイレクト URI として許可リストに入れます。OAuth プロバイダーは通常、パスを含む完全 URI を完全一致します。
MCP サーバーで共有コールバック URL をオンにすると、そのサーバーを使うすべての portal は、次の Cloudflare 所有 URL を代わりに使います。
https://oauth-callbacks.cloudflareaccess.com/cdn-cgi/access/outbound-oauth-callbackアップストリームベンダーが許可するリダイレクト URI 数が少ないとき、または複数 portal でサーバーに 1 つのコールバック URL を使いたいときに、共有コールバック URL を使います。この設定はデフォルトでオフで、OAuth サーバーごとに別々に設定します。オンにするには、Zero Trust > Access controls > MCP Portals > MCP servers を開き、OAuth サーバーを追加または編集し、Basic information > Advanced settings で Use the Cloudflare-hosted OAuth callback をオンにします。
MCP server portal を作成する手順:
-
Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
-
Add MCP server portal を選びます。
-
portal の任意の名前を入力します。
-
Custom domain で、portal URL のドメインを選びます。アカウント内のアクティブなゾーンのドメイン、アカウントの
workers.devサブドメイン、または Pages プロジェクトに関連付けられたpages.devドメインを選べます。任意でサブドメインも指定できます。 -
portal に MCP サーバーを追加 します。
-
(任意)MCP servers で、portal 経由で利用できる ツールとプロンプトを設定 します。
-
(任意)OAuth に対応するサーバーの Require user auth を設定します。 -
Enabled:(デフォルト)ユーザーは自身のログイン認証情報で MCP サーバーとの接続を確立するよう求められます。 -Disabled: portal に接続したユーザーは、その 管理者認証情報 経由で MCP サーバーへ自動的にアクセスできます。 -
portal URL に接続できるユーザーを定義する Access ポリシー を追加します。
-
Add an MCP server portal を選びます。
-
(任意)portal の ログイン体験をカスタマイズ します。
ユーザーは、MCP クライアントを使い https://<subdomain>.<domain>/mcp で portal に接続 できます。
Cloudflare Access は、MCP server portal ごとに Access アプリケーションを自動作成します。Access アプリケーション設定を更新し、portal のログイン体験をカスタマイズできます。
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > Applications を開きます。
- 設定する portal を見つけ、三点リーダー > Edit を選びます。
- portal の IdP を設定するには:
- Authentication を開きます。
- アプリケーションで有効にする IdP を選びます。
- (推奨)単一の IdP 経由のアクセスだけを許可する場合は、Apply instant authentication をオンにします。エンドユーザーには Cloudflare Access ログインページ は表示されません。代わりに Cloudflare は、SSO ログインへ直接リダイレクトします。
- ブロックページをカスタマイズするには:
- Additional settings を開きます。
-
Custom block pages: アプリケーションへのアクセスを拒否されたときに、ユーザーへ表示する内容を選びます。
- Cloudflare default: ログインページ を再読み込みし、Cloudflare Access のロゴの下にブロックメッセージを表示します。既定のメッセージは
That account does not have accessです。カスタムメッセージを入力することもできます。 - Redirect URL: 指定した Web サイトへリダイレクトします。
- Custom page template: Cloudflare One でホストする カスタムブロックページ を表示します。
- Cloudflare default: ログインページ を再読み込みし、Cloudflare Access のロゴの下にブロックメッセージを表示します。既定のメッセージは
- Save を選びます。
MCP サーバーを portal に追加すると、そのツールとプロンプトはデフォルトですべて portal ユーザーに公開されます。公開するツールとプロンプトをカスタマイズし、エイリアスで名前を変更し、説明を上書きできます。
portal ユーザーから特定のツールまたはプロンプトを隠す手順:
-
Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
-
設定する portal を見つけ、三点リーダー > Edit を選びます。
-
Servers でサーバー名を選び、ツールパネルを開きます。
-
Tools セクションまでスクロールし、ユーザーから隠したいツールまたはプロンプトの横のトグルをオフにします。
-
Save を選びます。
オフにしたツールは、portal のツール一覧に出ません。ユーザーは呼べません。
デフォルトでは、MCP サーバーのすべてのツールとプロンプトが portal で利用できます。この動作を反転し、デフォルトですべてのツールを隠し、明示的にオンにしたツールだけを公開できます。MCP サーバーにツールが多く、厳選した一部だけを公開したいときに便利です。
API で許可リストを設定するには、サーバーと portal の対応づけで default_disabled を true にし、公開したいツールを updated_tools に明示的に列挙します。
{
"servers": [
{
"id": "example-server",
"default_disabled": true,
"updated_tools": [
{
"name": "search_documents",
"enabled": true
},
{
"name": "list_projects",
"enabled": true
}
]
}
]
}default_disabled を true にすると、search_documents と list_projects だけが portal ユーザーに公開されます。このサーバーのほかのツールはすべて隠れます。
エイリアスを使うと、portal 内でツールとプロンプトにより分かりやすい名前を付けられます。エイリアスの用途:
- 分かりにくいツール名を、組織の用語に合わせた名前に置き換える。
- 説明を追加または改善し、AI エージェントが正しいツールを選ぶようにする。
- portal 内の複数 MCP サーバーで命名を揃える。
エイリアス名は 1〜40 文字で、文字、数字、ハイフン、アンダースコアのみです。先頭と末尾は英数字である必要があります。値は ^[a-zA-Z0-9]+([_-][a-zA-Z0-9]+)*$ に一致する必要があります。例: search_customer_records または get-user-profile。同じサーバー上で、2 つのツールまたはプロンプトが同じ名前を共有することはできません。その名前がエイリアスでも、元のアップストリーム名でも同じです。
エイリアスは 2 つのレベルで設定できます。portal レベルのエイリアスは、サーバーレベルのエイリアスより優先されます。
| レベル | フィールド | 範囲 |
|---|---|---|
| サーバーレベル | alias |
このサーバーを含むすべての portal に適用 |
| portal レベル | portal_alias |
特定の portal 内のみに適用。サーバーレベルを上書き |
複数の名前があるとき、portal は次の順で解決します: portal_alias > server_alias > alias > 元のツール名。
エイリアスが設定されていない場合、portal はアップストリームサーバーの元の名前と説明を使います。
カスタム説明も同じ優先順位です。updated_tools または updated_prompts のエントリに description フィールドを含めて説明を設定します。API 応答では、サーバーレベルの説明は server_description、portal レベルの説明は portal_description として返ります。両方あるときは、portal レベルの説明が優先されます。
特定の portal に適用するエイリアスを設定する手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- 設定する portal を見つけ、三点リーダー > Edit を選びます。
- Servers タブを開きます。
- 設定するサーバーの Tools authorized または Prompts authorized の値(例:
10/10)を選びます。 - 変更するツールまたはプロンプトを見つけ、三点リーダー > Edit を選びます。
- モーダルで、必要に応じて Name と Description を更新します。
- Confirm を選びます。
サーバーを使うすべての portal に適用するエイリアスを設定する手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- MCP servers タブを開きます。
- 設定するサーバーを見つけ、三点リーダー > Edit を選びます。
- Tools または Prompts タブを開きます。
- 変更するツールまたはプロンプトを見つけ、三点リーダー > Edit を選びます。
- モーダルで、必要に応じて Name と Description を更新します。
- Confirm を選びます。
- ページ下部までスクロールし、Save server を選びます。
変更されたツールとプロンプトは、ダッシュボードに Modified ラベルを表示します。
MCP portal の更新 エンドポイントへ PUT リクエストを送ります。名前を変更する各ツールまたはプロンプトに alias フィールドを含めます。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/portals/%7Bid%7D" \
--request PUT \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"servers": [
{
"server_id": "example-server",
"updated_tools": [
{
"name": "original_tool_name",
"enabled": true,
"description": "A clearer description of what this tool does.",
"alias": "renamed_tool"
}
],
"updated_prompts": [
{
"name": "original_prompt_name",
"enabled": true,
"description": "An updated description for this prompt.",
"alias": "renamed_prompt"
}
]
}
]
}'すべての portal に適用するサーバーレベルのエイリアスを設定するには、同じ updated_tools と updated_prompts フィールドを付けて、MCP サーバーの更新 エンドポイントへ PUT リクエストを送ります。
ツールまたはプロンプトを元のアップストリーム名に戻すには、ダッシュボードでそのツールまたはプロンプトの編集モーダルを開き、「Reset to server definition」を選びます。API を使うときは、対応する updated_tools または updated_prompts のエントリから alias フィールドを省略します。
MCP クライアントは、元の名前ではなくエイリアス名と説明を受け取ります。エンドユーザーは元の名前を見ません。
ユーザーがアクティブなセッションを持っているあいだにエイリアスを変更した場合、更新を見るには再認証が必要です。再認証の選択肢は portal セッションを管理する を参照してください。
portal 経由で公開されるすべてのツールとプロンプトは、サーバー ID をプレフィックスとして自動的に名前空間化されます。形式は {server_id}_{original_name} です。たとえば、ID が github のサーバー上の list_issues というツールは、portal では github_list_issues になります。これにより、複数の MCP サーバーが同じ名前のツールを公開しても、名前の衝突を防げます。
プロンプトも同じパターンです。ID が github のサーバー上の summarize というプロンプトは、github_summarize になります。
名前空間に使うサーバー ID は、MCP サーバーの追加 時に設定した Server ID フィールドから来ます。セットアップのステップ 5 でカスタムサーバー ID を入力するか、Cloudflare に自動生成させます。
サーバーを portal 経由で公開する予定なら、短く説明的なサーバー ID を選びます。サーバー ID は、MCP クライアントと AI エージェントが見るすべてのツール名の一部になります。
portal は、名前空間化された名前を 最初の アンダースコアだけで分割します。最初のアンダースコアより前がサーバー ID、それ以降がツールまたはプロンプト名です。そのため、ツール名にアンダースコアが含まれても曖昧になりません。
| 名前空間化された名前 | サーバー ID | ツール名 |
|---|---|---|
github_list_issues |
github |
list_issues |
github_create_pull_request |
github |
create_pull_request |
sentry_get_issue_details |
sentry |
get_issue_details |
分割は最初のアンダースコアで行われるため、サーバー ID 自体にアンダースコアは使えません。複数語のサーバー ID が必要なときは、代わりにハイフンを使います(例: my-server)。
エイリアスでツールの名前を変更 すると、名前空間形式では元のツール名の代わりにエイリアスが使われます。サーバー ID プレフィックスは引き続き適用されます。
たとえば、ID が github のサーバーでツール list_issues を issues にエイリアスすると、名前空間化された名前は github_issues になります。
Code Mode が有効なとき、portal は追加の変換を適用し、名前空間化されたツール名を JavaScript 識別子として安全に使えます。名前空間化された名前のハイフンとドットはアンダースコアに置き換わり、数字で始まる名前には _ プレフィックスが付き、JavaScript 予約語には _ サフィックスが付きます。たとえば、ID が my-server のサーバーと get-data というツールは、Code Mode サンドボックスでは my_server_get_data になります。
このサニタイズは自動です。エンドユーザーとして Code Mode を使うときに、ヘルパー関数を呼ぶ必要はありません。
Agents SDK で MCP クライアントを構築する場合、SDK はサーバー ID とツール名向けのヘルパー関数を提供します。
normalizeServerId(agents/mcp/clientからエクスポート)は、呼び出し元が渡したサーバー ID を安全な文字列に正規化します。たとえば"GitHub MCP!"は"github-mcp"になります。addMcpServer()にidオプションを渡すと、SDK が自動で呼びます。sanitizeToolName(@cloudflare/codemodeからエクスポート)は、ハイフンとドットをアンダースコアに置き換え、ツール名を有効な JavaScript 識別子に変換します。Code Mode のコンテキストでは自動で呼ばれます。詳細は Code Mode SDK リファレンス を参照してください。
アップストリーム MCP サーバーのツールに加え、portal は、セッション中に AI エージェントがサーバー接続を管理し、ツールを発見できるようにする独自の組み込みツールを公開します。これらのツールは portal_ プレフィックスを使い、どのアップストリームサーバーにも紐づきません。
次のツールは、接続モードに関係なく、すべての portal セッションで利用できます。
| ツール | 説明 |
|---|---|
portal_list_servers |
すべてのアップストリーム MCP サーバーを、ID、名前、セッションで現在有効かどうかを含めて一覧します。 |
portal_toggle_servers |
サーバー選択フローを開きます。ユーザーがブラウザーで訪問し、サーバーの有効化 / 無効化と OAuth 認証情報の管理を行う URL を返します。 |
portal_toggle_single_server |
ブラウザー訪問なしで、1 つのサーバーをオンまたはオフにします。server_id と action(toggle または untoggle)を受け付けます。サーバーが OAuth を必要とし、ユーザーがまだ認証していない場合、portal はブラウザーベースの portal_toggle_servers フローにフォールバックします。 |
これらのツールは、このガイド後半の セッション管理 機能を支えます。サーバーの有効化、無効化、サーバー選択ページへの戻りを依頼すると、AI エージェントが自動で呼びます。
optimize_context クエリパラメーター付きで接続すると、portal はアップストリームツールの発見と呼び出し用の追加ツールを公開します。
| ツール | 利用可能なモード | 説明 |
|---|---|---|
portal_query_tools |
minimize_tools、search_and_execute |
正規表現パターンで、名前、説明、またはスキーマからアップストリームツールを検索します。エージェントが呼べるように完全なツール定義を返します。minimize_tools モードでは、コンテキストサイズを減らすためにアップストリームツールスキーマが削られるため必須です。 |
portal_execute |
search_and_execute |
指定した引数で、名前によりアップストリームツールを呼びます。search_and_execute モードでは、アップストリームツールはツール一覧から完全に隠れるため、エージェントは発見に portal_query_tools、呼び出しに portal_execute を使う必要があります。 |
Code Mode を有効にして接続すると、portal はすべてのアップストリームツールを、2 つのコード実行ツールに置き換えます。
| ツール | 説明 |
|---|---|
portal_codemode_search |
サンドボックス化された Worker で JavaScript を実行し、利用可能なツールを検索します。サンドボックスは、サニタイズ済み名前付きのすべてのアップストリームツール定義を返す codemode.tools() 関数を提供します。 |
portal_codemode_execute |
サンドボックス化された Worker で JavaScript を実行し、アップストリームツールを呼びます。サンドボックスは、各プロパティがアップストリームツールに対応する codemode プロキシオブジェクトを提供します。並列ツール呼び出しには Promise.all() に対応します。 |
これらのツール向けのコードの書き方は、Code Mode SDK リファレンス を参照してください。
ダッシュボードに加え、Cloudflare API でプログラムから MCP server portals を管理できます。次の例はよくある操作です。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/portals" \
--request GET \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/portals" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "Engineering Portal",
"hostname": "mcp.example.com",
"code_mode": "opt_in",
"secure_web_gateway": false
}'curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/servers" \
--request GET \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/servers" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "GitHub MCP Server",
"hostname": "https://github-mcp.example.workers.dev/mcp",
"auth_type": "oauth"
}'auth_type フィールドは次の値を受け付けます。
| 値 | 説明 |
|---|---|
oauth |
サーバーは OAuth 認証を必要とします。自動 OAuth 登録を使うか、手動 OAuth 認証情報を提供できます。 |
bearer |
サーバーは静的な bearer トークンまたはカスタム認証ヘッダーを使います。認証情報は auth_credentials で提供します(Bearer 認証情報 を参照)。 |
unauthenticated |
サーバーは認証を必要としません。 |
事前登録した OAuth クライアントで MCP サーバーを作成するには、auth_type を oauth にし、auth_credentials と client_secret の両方を提供します。auth_credentials の値は必須で、JSON エンコードされた文字列である必要があります。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/servers" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"id": "github",
"name": "GitHub MCP Server",
"hostname": "https://github-mcp.example.com/mcp",
"auth_type": "oauth",
"auth_credentials": "{\"auth_mode\":\"manual\",\"config\":{\"authorization_endpoint\":\"https://github.com/login/oauth/authorize\",\"token_endpoint\":\"https://github.com/login/oauth/access_token\"},\"registration_info\":{\"client_id\":\"<client-id>\",\"redirect_uris\":[\"https://mcp.example.com/servers-callback\"],\"token_endpoint_auth_method\":\"client_secret_basic\",\"scope\":\"repo read:user\"}}",
"client_secret": "<client-secret>"
}'デコードした auth_credentials オブジェクトには次が必要です。
auth_mode:manualである必要があります。config.authorization_endpointとconfig.token_endpoint: アップストリームプロバイダーの OAuth エンドポイントです。issuerとrevocation_endpointは任意です。registration_info.client_id: アップストリームプロバイダーが発行したクライアント ID です。registration_info.redirect_uris: 登録済みリダイレクト URI が 1 つ以上。is_shared_oauth_callback_enabledがtrueのときは省略できます。その場合 Cloudflare が共有コールバック URL を追加します。registration_info.token_endpoint_auth_method: 任意。受け付ける値はnone、client_secret_post、client_secret_basicです。registration_info.scope: 任意のスペース区切りスコープ文字列です。
client_secret や OAuth トークンを auth_credentials 内に含めないでください。client_secret は、上に示した別の兄弟フィールドとして送ります。
OAuth メタデータを変更するには、MCP サーバーの更新 エンドポイントへの PUT リクエストで auth_credentials を送ります。既存の手動 OAuth サーバーは client_secret なしで更新でき、保存済みシークレットは変わりません。ローテーションするには新しい client_secret を送ります。新しい手動 OAuth サーバー、または手動 OAuth へ変更するサーバーには、空でない client_secret が必要です。
クライアントシークレットは書き込み専用です。Cloudflare は保存前に暗号化し、読み取り、作成、更新のどのリクエストからも返しません。応答は生の auth_credentials 値も省略します。シークレットが設定されていることと現在のバージョンを確認するには、auth_config_summary.has_client_secret と auth_config_summary.client_secret_version を使います。
auth_credentials フィールドは 2 つの形式を受け付けます。
-
生の bearer トークン — portal は、アップストリーム MCP サーバーへのリクエストで値を
Authorization: Bearer <token>ヘッダーとして送ります。{ "auth_type": "bearer", "auth_credentials": "your-bearer-token" } -
カスタムヘッダーの JSON エンコードオブジェクト — 複数ヘッダーまたは非標準ヘッダー名を必要とするアップストリーム MCP サーバー向けです。
{ "auth_type": "bearer", "auth_credentials": "{\"headers\":{\"X-Api-Key\":\"<api-key>\",\"X-Client-Id\":\"<client-id>\"}}" }auth_credentialsの値は JSON 文字列である必要があります。パースしたオブジェクトには、ヘッダー名を文字列値に対応づけるheadersフィールドが必要です。portal はすべてのヘッダーを、そのままアップストリーム MCP サーバーへ転送します。
アカウントエンドポイントを使い、アカウント全体の日次または月次の MCP ツール呼び出し数を取得します。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/analytics/tool-calls/timeseries?granularity=daily&aggregate=false&tz=utc&days=30" \
--request GET \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"同じクエリパラメーターが各エンドポイントに適用されます。
| パラメーター | 値と動作 |
|---|---|
granularity |
daily または monthly。デフォルトは daily。 |
aggregate |
true または false。デフォルトは false。集計件数を要求するには true にします。 |
tz |
utc、Z、または固定の +HH:MM または -HH:MM オフセット。デフォルトは utc。オフセットの範囲は -12:00 から +14:00 までです。+14:00 と -12:00 が上限です。オフセットはローカル日のバケット分けに使い、期間内の夏時間変更は考慮しません。 |
days |
1 から 179 の整数。日次結果では、後方の期間を設定し、デフォルトは 7 です。granularity=monthly のときは無視されます。 |
応答の result には、選択した granularity、aggregate、tz、エポックミリ秒でのウィンドウの start と end、day と count の series、total 件数が含まれます。ウィンドウは start を含み、end を含みません。日次の day 値は、要求したタイムゾーンオフセットの YYYY-MM-DD です。
スコープ付きエンドポイントで件数を限定できます。
- サーバー:
GET /accounts/{account_id}/access/ai-controls/mcp/analytics/servers/{server_id}/tool-calls/timeseries - Portal:
GET /accounts/{account_id}/access/ai-controls/mcp/analytics/portals/{portal_id}/tool-calls/timeseries
アップストリーム MCP サーバーからツールとプロンプトの同期を手動で起動します。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/servers/%7Bserver_id%7D/sync" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/portals/%7Bid%7D" \
--request DELETE \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"Cloudflare Terraform プロバイダー ↗ で MCP server portals を管理できます。cloudflare_zero_trust_access_mcp_server_portal リソースを使い、プログラムから portal を作成・設定します。
次の例は、CNAME レコード付きの MCP server portal を作成します。
# Create the MCP server portal
resource "cloudflare_zero_trust_access_mcp_server_portal" "example" {
account_id = var.cloudflare_account_id
name = "Engineering Portal"
hostname = "mcp.example.com"
}
# Required: Create the CNAME record for the portal hostname
resource "cloudflare_dns_record" "mcp_portal" {
zone_id = var.cloudflare_zone_id
name = "mcp"
content = "gateway.agents.cloudflare.com"
type = "CNAME"
proxied = true
}対応するリソース引数の全一覧は、Terraform プロバイダーのドキュメント ↗ を参照してください。
Code Mode は、アップストリームツール定義を、検索とコード実行の 2 つのツールに置き換え、コンテキストウィンドウの使用量を減らします。接続した AI エージェントは、型付きの codemode.* メソッドを呼ぶ JavaScript を書きます。生成されたコードは、隔離された Dynamic Worker 環境で実行されます。認証情報と環境変数はモデルコンテキストの外に残ります。
Code Mode は、MCP サーバーやツールが多い portal に向いています。portal にツールを追加しても、コンテキストウィンドウの使用量は固定です。
各 portal には Code Mode ポリシーがあります。デフォルトポリシーは Opt-in です。
| ポリシー | API 値 | デフォルトの動作 | クライアントの上書き |
|---|---|---|---|
| Off | off |
Code Mode は利用不可 | クエリパラメーターは無視されます |
| Opt-in | opt_in |
Code Mode はオフ | オンにするには ?codemode=search_and_execute を追加します |
| On by default | default_on |
Code Mode はオン | オフにするには ?codemode=off を追加します |
| Enforced | enforced |
Code Mode はオン | クエリパラメーターは無視されます |
一部のクライアントが独自の Code Mode 実装を動かす場合は、Opt-in または On by default を使います。これらのポリシーでは、クライアントは入れ子のコード実行を避けられます。
MCP portal は、独自の Code Mode がオンのアップストリーム MCP サーバーには対応しません。portal にサーバーを追加するときは、完全なツール一覧を返すバージョンのサーバーに接続します。アップストリームサーバーが独自の Code Mode を実行している場合は、利用可能ならサーバーのオプトアウト機構を使います。または、MCP portal の Code Mode をオフにすることを検討します。
-
既存の MCP portal 設定を取得します。
curl "https://api.cloudflare.com/client/v4/accounts/%7Baccount_id%7D/access/ai-controls/mcp/portals/%7Bid%7D" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" -
応答本体に
code_modeを追加します。値はoff、opt_in、default_on、またはenforcedにします。 -
完全な本体を、MCP Portal の更新 エンドポイントへの
PUTリクエストで送ります。完全な本体を含めると、ほかの portal 設定が上書きされません。
allow_code_mode API フィールドは非推奨です。新しい連携では code_mode を使います。
portal ポリシーによって、MCP クライアントにクエリパラメーターが必要かが決まります。Opt-in では、portal URL に ?codemode=search_and_execute を付けます。On by default では、クライアントは代わりに ?codemode=off を付けられます。
たとえば、https://<subdomain>.<domain>/mcp の Opt-in portal では、この URL を使います。
https://<subdomain>.<domain>/mcp?codemode=search_and_executeサーバー設定ファイルを持つ MCP クライアントでは、クエリ文字列パラメーター付きの portal URL を使います。
{
"mcpServers": {
"example-portal": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://<subdomain>.<domain>/mcp?codemode=search_and_execute"
]
}
}
}Code Mode が有効なとき、portal は portal_codemode_search と portal_codemode_execute を広報します。AI エージェントはツールを発見し、1 回の実行で複数のツール呼び出しを組み立てられます。
Code Mode での構築の詳細は、Code Mode SDK リファレンス を参照してください。
Gateway ルーティングがオンのとき、MCP server portal で保護された MCP サーバーへの呼び出しは Cloudflare Gateway 経由でルーティングされます。これにより、portal トラフィックが組織のほかの HTTP トラフィックと並んで Gateway HTTP ログ に現れます。そのあと、Data Loss Prevention(DLP)ポリシー を作り、アップストリーム MCP サーバーへ送られる機微データを検出・ブロックできます。
ユーザーが portal 経由でツールを呼ぶと、portal はリクエストをアップストリーム MCP サーバーへプロキシします。Gateway ルーティングがオンのとき、この送信リクエストはアップストリームサーバーに届く前に Cloudflare Gateway を通ります。Gateway はトラフィックを検査し、一致する HTTP ポリシー(DLP スキャンを含む)を適用します。
portal トラフィックが Gateway 経由になるため、Gateway エグレスポリシー も尊重します。つまり、アップストリーム MCP サーバーへの送信リクエストは、汎用 Cloudflare IP ではなく、専用エグレス IP または Gateway IP 範囲から発信されます。アップストリーム MCP サーバーが送信元 IP で受信トラフィックを制限している場合(VPN または社内 IP 範囲など)、エグレスポリシーを使い、portal トラフィックが予測可能な IP セットから来るようにできます。
DLP 検査には、Gateway が TLS トラフィックを復号する必要があります。portal トラフィックでは、Gateway はペイロードを自動で復号・検査します。アカウントレベルの TLS 復号 設定をオンにする必要はありません。portal は MCP クライアントからの接続を終端し、Gateway 経由でリクエストを再発信するため、グローバル TLS 復号設定がオンかどうかに関係なく、Gateway は portal トラフィックを復号します。
この自動復号は、portal を流れるトラフィックだけに適用されます。portal を通らない MCP トラフィック(Cloudflare One Client を実行するデバイス 上のエージェントがアップストリーム MCP サーバーへ直接接続する場合など)を検査するには、ほかの HTTP ポリシー と同様に TLS 復号 をオンにする必要があります。
Gateway ルーティングが対応するのは Streamable HTTP ↗ 接続だけです。アップストリーム MCP サーバーが Server-Sent Events(SSE)エンドポイント(/sse で終わる URL)で設定されている場合、portal は代わりに Streamable HTTP で接続を自動試行します。アップストリームサーバーが Streamable HTTP に対応していない場合、Gateway ルーティングがオンだと接続は失敗します。
portal 内のすべてのサーバーを Gateway 経由にするか、個別サーバーのルーティングをオンにできます。portal で Gateway ルーティングが有効な場合、サーバーレベルの設定に関係なく、その portal 内のすべてのサーバーに適用されます。
portal 内のすべての MCP サーバーからのトラフィックを Gateway 経由にする手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- 設定する portal を見つけ、三点リーダー > Edit を選びます。
- Basic information で Route traffic through Cloudflare Gateway をオンにします。
- Save を選びます。
portal 全体の Gateway ルーティングを有効にせず、1 つの MCP サーバーからのトラフィックを Gateway 経由にする手順:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > AI controls を開きます。
- MCP servers タブを開きます。
- 設定するサーバーを見つけ、三点リーダー > Edit を選びます。
- Basic information で Route traffic through Cloudflare Gateway をオンにします。
- Save を選びます。
サーバーレベルの設定の API フィールドは secure_web_gateway です。デフォルトは false です。
portal トラフィックは Gateway HTTP ログ に現れます。DLP スキャンを適用するには、Gateway HTTP ポリシーを作成 します。
機微データをスキャンするには、MCP サーバーと、定義済みまたはカスタムの DLP プロファイル の両方に一致する Gateway HTTP ポリシーを作成 します。
MCP portal トラフィック向けの Gateway HTTP ポリシーは、アップストリーム MCP サーバーを明示的に対象にする必要があります。ポリシーが portal URL(<subdomain>.<domain>)ではなく、アップストリーム MCP サーバーのホスト名(例: example-mcp-server.example.workers.dev)に一致することを確認します。
たとえば、次のポリシーは、認証情報とシークレット または 財務情報 を含むトラフィックをブロックします。
| Selector | Operator | Value | Logic | Action |
|---|---|---|---|---|
| Host | in | example-mcp-server.example.workers.dev |
And | Block |
| DLP Profile | in | Credentials and Secrets、Financial Information |
ツール呼び出しが Block DLP ポリシーに一致すると、Gateway はそれをブロックし、portal はツール呼び出しを完了せず、MCP クライアントへエラーとしてブロックを伝えます。これは両方向に適用されます。
- ツール呼び出しリクエスト: エージェントがツールへ送るデータが DLP プロファイルに一致すると、Gateway は送信リクエストをブロックし、エージェントはリクエストがブロックされたことを示すエラーを受け取ります。
- ツール呼び出し応答: アップストリームサーバーが返すデータが DLP プロファイルに一致すると、Gateway は応答をブロックし、portal は一致したコンテンツの代わりにエラーを返します。
エージェントはリクエストを再試行できますが、コンテンツがポリシーに一致しなくなるまでブロックされ続けます。
- DLP の AI prompt プロファイル は、MCP server portal トラフィックには適用されません。AI prompt プロファイルは特定の Web クライアント API パス向けで、MCP プロトコル形式には一致しません。代わりに標準 DLP プロファイルを使います。
- Gateway 経由の SSE トランスポートには対応しません。アップストリーム MCP サーバーが SSE のみに対応する場合、そのサーバーでは Gateway ルーティングは動きません。
- ツールとプロンプトのバックグラウンド同期は Gateway 経由ではルーティングされません。検査されるのはリアルタイムのユーザーリクエストだけです。
ユーザーは、Workers AI Playground ↗、MCP inspector ↗、またはリモート MCP サーバーに対応する ほかの MCP クライアント を使い、https://<subdomain>.<domain>/mcp で動く MCP サーバーに接続できます。
Workers AI Playground でテストする手順:
- Workers AI Playground ↗ を開きます。
- MCP Servers で、portal URL として
https://<subdomain>.<domain>/mcpを入力します。 - Connect を選びます。
- ポップアップウィンドウで、Cloudflare Access の IdP にログインします。
- ポップアップウィンドウに、認証が必要な portal 内の MCP サーバーが一覧されます。これらの MCP サーバーごとに Connect を選び、ログイン手順に従います。
- Done を選び、portal 認証を完了します。
Workers AI Playground は Connected ステータスと利用可能なツールを表示します。利用可能なツールを使い、AI モデルにタスクを依頼できます。MCP サーバーへのリクエストは portal ログ に現れます。
サーバー設定ファイルを持つ MCP クライアントでは、mcp-remote@latest 引数付きの npx コマンドの使用を推奨します。
{
"mcpServers": {
"example-mcp-server": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://<subdomain>.<domain>.com/mcp"
]
}
}
}serverURL パラメーターは、portal セッションの作成と管理で問題を起こすことがあるため、推奨しません。
ユーザーがブラウザーで portal ドメイン(https://<subdomain>.<domain>/)を開くと、portal は接続の詳細とセットアップ手順があるホームページを表示します。
ホームページには次が表示されます。
- portal 名と組織のブランディング(Cloudflare Access で設定している場合)
- コピーボタン付きの MCP エンドポイント URL
- Claude Desktop、Workers AI Playground、OpenCode、Windsurf、その他の MCP クライアント向けの、OS 固有のファイルパス付き接続手順
認証済みユーザーは、セッションバーにメールアドレスと Sign out ボタンを見ます。未認証のユーザーでも、ホームページと接続手順は見られます。
portal セッションを終了するには、portal ホームページ(https://<subdomain>.<domain>/)で Sign out を選びます。サインアウトフローは次を行います。
- ユーザーのすべての portal レベルの OAuth グラントを取り消します。
- セッションに関連するすべてのアップストリーム MCP サーバー OAuth 状態を削除します。
- Cloudflare Access のログアウト経由でリダイレクトします。
サインアウト後、portal は取り消したセッションの要約付き確認ページを表示します。再接続するには、portal ホームページを開き、もう一度認証します。
マシン間アクセス向けに、Access サービストークン で MCP portal に接続できます。サービストークンはブラウザーベースの OAuth フローを迂回し、CF-Access-Client-Id と CF-Access-Client-Secret ヘッダーで認証します。
サービストークンセッションは 2 回認可されます。1 回は portal URL、もう 1 回は portal 経由で到達しようとする各アップストリーム MCP サーバーです。両方のチェックに、一致する Service Auth ポリシー が必要です。
| 場所 | ポリシーアクション | Include ルール | 目的 |
|---|---|---|---|
| Portal の Access アプリケーション | Service Auth | サービストークン | ボットが portal URL に接続できるようにします。 |
| リンクされた各 MCP サーバーの Access アプリ | Service Auth | サービストークン | ボットが portal 経由でそのサーバーのツールを見て呼べるようにします。 |
| サーバーの portal 対応づけ | 該当なし | 該当なし | ポータルが管理者認証情報を使うよう、Require user auth は オフ である必要があります。 |
リンクされた MCP サーバーに、トークンに一致する Service Auth ポリシーがない場合、そのサーバーはボットのツール一覧から隠れます。
- Zero Trust アカウントで サービストークンを作成 します。
- portal の Access アプリケーションを開き、サービストークンを含む Service Auth ポリシーを追加します。
- ボットに到達させたい各アップストリーム MCP サーバーについて:
- サーバーの Access アプリケーションを開き、同じサービストークンを含む Service Auth ポリシーを追加します。
- portal を開き、サーバーを編集します。portal がそのサーバーの 管理者認証情報 を使うよう、Require user auth をオフにします。
- サービストークンヘッダー付きで MCP クライアントから接続します。
CLI クライアントでは、ヘッダーを直接設定します。
curl https://<subdomain>.<domain>/mcp \
-H "CF-Access-Client-Id: <CLIENT_ID>" \
-H "CF-Access-Client-Secret: <CLIENT_SECRET>"mcp-remote では、--header でヘッダーを渡します。
{
"mcpServers": {
"example-portal": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://<subdomain>.<domain>/mcp",
"--header",
"CF-Access-Client-Id: <CLIENT_ID>",
"--header",
"CF-Access-Client-Secret: <CLIENT_SECRET>"
]
}
}
}MCP server portals には、ブラウザーベースの認証フローが必要です。デバイス認証(ブラウザーリダイレクトなしで Cloudflare One Client から ID を取得すること)は、現在 MCP portal では対応していません。ユーザーは、最初の接続時にブラウザーで Access ログインフローを完了する必要があります。
MCP server portals は、モデルのコンテキストウィンドウでツール定義が消費するトークン数を減らすコンテキスト最適化オプションに対応します。portal が多数の MCP サーバー、または多数のツールを公開するサーバーを集約するときに便利です。
コンテキスト最適化を使うには、MCP クライアントから接続するとき、portal URL に optimize_context クエリパラメーターを付けます。
minimize_tools オプションは、すべてのアップストリームツールからツール説明と入力スキーマを削り、名前だけを残します。portal は、エージェントがオンデマンドで完全なツール定義を検索・取得するために使う特別な query ツールを公開します。エージェントは、すべての定義を事前に読み込まずにツールを発見できます。
このオプションはトークン使用量を最大 5 倍節約できますが、使用前にツール定義をクエリする小さなオーバーヘッドが加わります。
minimize_tools で接続するには、次の portal URL を使います。
https://<subdomain>.<domain>/mcp?optimize_context=minimize_toolsサーバー設定ファイルを持つ MCP クライアント向け:
{
"mcpServers": {
"example-portal": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://<subdomain>.<domain>/mcp?optimize_context=minimize_tools"
]
}
}
}search_and_execute オプションはすべてのアップストリームツールを隠し、エージェントには query と execute の 2 つのツールだけを公開します。query ツールはツール定義を検索・取得します。execute ツールはアップストリームツールを実行します。生成されたコードは隔離された Dynamic Worker 環境で動き、認証情報と環境変数をモデルコンテキストの外に保ちます。
このオプションは、利用可能なツール数に関係なく、portal ツールの初期トークンコストを小さな定数に減らします。ただし、エージェントはツールを呼ぶ前に、発見を完全に query に依存します。
search_and_execute で接続するには、次の portal URL を使います。
https://<subdomain>.<domain>/mcp?optimize_context=search_and_executeサーバー設定ファイルを持つ MCP クライアント向け:
{
"mcpServers": {
"example-portal": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://<subdomain>.<domain>/mcp?optimize_context=search_and_execute"
]
}
}
}search_and_execute の背後にある Code Mode パターンの詳細は、Code Mode を参照してください。
portal に接続したあと、ユーザーは MCP クライアントを離れずに、アップストリーム MCP サーバーセッションを管理できます。portal は MCP elicitations ↗ を使い、サーバーの有効化 / 無効化、個別サーバーからのログアウト、再認証ができるサーバー選択ページを提供します。
アクティブなセッション中にサーバー接続を管理するには、AI エージェントにサーバー選択ページへ戻るよう依頼します。たとえば、次のようにプロンプトします。
Take me back to the server selection page.
portal は認可 URL を返します。この URL を Web ブラウザーで開き、サーバー選択ページにアクセスします。
https://<subdomain>.<domain>/authorize?elicitationId=<ELICITATION_ID>このページでは次ができます。
- サーバーの有効化または無効化 — 個別のアップストリーム MCP サーバーをオンまたはオフにします。サーバーを無効にすると、アクティブセッションからそのツールが外れ、コンテキストウィンドウの使用量が減ります。
- ログアウトと再認証 — サーバーがアクセスできるデータを変える必要がある場合は、サーバーからログアウトして再ログインします。たとえば、別の権限で再認証が必要なことがあります。
サーバー選択ページを開かずに、MCP クライアントから特定のサーバーを直接有効化または無効化することもできます。例:
Enable the wiki server.
Disable my Jira server.
portal はサーバーを切り替え、アクティブなツール一覧をすぐに更新します。サーバーを無効にすると、セッションからそのツールが外れ、コンテキストウィンドウの使用量が減ります。
アップストリーム MCP サーバーのトークンが期限切れになると、portal は MCP クライアント内で再認証を求めます。提供された URL をブラウザーで開き、ログインを完了してセッションを復元します。
MCP クライアントが再認証プロンプトを表示しない場合は、キャッシュされた認証情報を手動で消せます。
rm -rf ~/.mcp-auth認証情報を消したあと、MCP クライアントから portal に再接続します。
管理者が新しいアップストリーム MCP サーバーを portal に追加すると、portal は接続中のユーザーに新しいサーバーの認可を自動で求めます。portal は管理者の変更をまとめ、サーバー更新ごとに中断せず、認可フローへ 1 回だけリダイレクトします。
portal ログでは、MCP server portal 経由のユーザーアクティビティを監視できます。ログは portal 単位またはサーバー単位で見られます。
- Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > MCP Portals を開きます。
- ログを見たい portal またはサーバーを見つけ、三点リーダー > Edit を選びます。
- Logs を選びます。
| フィールド | 説明 |
|---|---|
| Time | リクエストの日時 |
| Status | サーバーが応答を正常に返したかどうか |
| Server | リクエストを処理した MCP サーバー名 |
| Capability | リクエストの処理に使ったツール |
| Duration | リクエストの処理時間(ミリ秒) |
Logpush を使い、MCP portal ログを第三者ストレージ先またはセキュリティ情報イベント管理(SIEM)ツールへ自動エクスポートできます。既存のセキュリティワークフローと連携し、ビジネスが必要とする期間ログを保持できます。
MCP portal ログ向けの Logpush ジョブをセットアップするには、Logpush 連携 を参照してください。利用可能なログフィールドの一覧は MCP portal ログ を参照してください。
MCP server portals には、次の既知の制限があります。
- 対応するのはリモート HTTP MCP サーバーだけです。 stdio トランスポートのみ ↗ を使う MCP サーバー(例:
github/github-mcp-server)は、リモート HTTP エンドポイントを公開せず、MCP server portal に追加できません。stdio のみのサーバーを使うには、HTTP エンドポイントの背後でセルフホストし、bearer トークンまたはカスタムヘッダー で認証する必要があります。 - 一部の MCP サーバーはプロキシベースのクライアントをブロックします。 一部の MCP サーバーは、MCP server portal のようなプロキシベースのクライアントからのリクエストを拒否し、登録エンドポイントで
403エラーを返します。それらのプロバイダーが Cloudflare を対応 MCP クライアントとして追加するまで、これらのサーバーは MCP server portals と互換がありません。 - 手動 OAuth の機能は、最初のユーザー認可時にキャプチャされます。 手動 OAuth 認証情報 で設定したサーバーは、ユーザーがアップストリーム OAuth を完了するまで Waiting ステータスのままです。Cloudflare は、その接続中に返されたツールとプロンプトを保存します。バックグラウンドおよび手動の機能同期では、それらを更新しません。
- 管理者 OAuth トークンは静かに期限切れになることがあります。 MCP サーバーの認証 に使う管理者認証情報は、アップストリームプロバイダーのトークン期限切れポリシーに従います。トークンが期限切れになると、サーバーステータスは Error または Sync Required になり、サーバーはエンドユーザーの portal に現れません。このとき管理者への通知はありません。サーバーステータス を定期的に確認し、エラーを示すサーバーを 再認証 します。
- 各 portal は最大 80 の MCP サーバーに対応します。
MCP サーバーは専用の Access アプリケーション種別(mcp)を使い、portal 経由でサーバーが認可されるとき、次の Access ポリシー機能には対応しません。
- Independent MFA — MFA のグローバル強制が有効でも、サーバーに MFA ポリシーが割り当てられていても、サーバー認可時に Cloudflare Access 経由の MFA は求められません。
- Purpose justification — サーバー認可時に、目的の正当化は求められません。
- 一時認証 — ユーザーがサーバーを認可するとき、アクセス要求は求められず、承認者も承認リクエストを受け取りません。
これらの制限は、portal 経由で認可されるサーバーにだけ適用されます。Emails、Groups、Country、Device Posture Checks などの Access ポリシーセレクターは強制されます。
portal 経由で認可されないサーバーでは、Independent MFA、purpose justification、一時認証は強制されます。
Cloudflare は、各 portal カスタムドメイン向けにカスタムホスト名を作成します。サブドメインを含むゾーンホールドがこのホスト名に適用されていると、portal 作成は失敗します。
選択したゾーンと各親ゾーンの ゾーンホールドを解除 します。そのあと、portal を再作成します。親ゾーンは別の Cloudflare アカウントに属することがあります。
- MCP portal とサーバーの両方に、Access ポリシーが付いている必要があります。portal に割り当てたすべての MCP サーバーに、それぞれ関連ポリシーがあることを確認します。
- サーバーの管理者認証が期限切れのことがあります。サーバーのステータス が Ready であることを確認します。ステータスが Error または Sync Required の場合は、サーバーを再認証 します。
- portal に Access ポリシーが割り当てられていることを確認します。
- portal URL に、適用された Workers、Page Rules、カスタムホスト名 定義、または MCP クライアントへの接続を妨げるほかの設定がないことを確認します。
522 エラーは、Cloudflare が portal のオリジンに到達できないことを示します。通常、portal ホスト名の DNS レコードがないか、誤設定です。
- portal サブドメインを
gateway.agents.cloudflare.comに向ける CNAME レコードがあることを確認します。 - Cloudflare DNS で、CNAME レコードの Proxy status がオンであることを確認します。
- API または Terraform プロバイダー で portal を作成した場合は、DNS レコードを別途作成する必要があります。ダッシュボードとは異なり、API と Terraform プロバイダーは DNS レコードを自動作成しません。
Waiting ステータスは、Cloudflare がアップストリーム MCP サーバーへ接続し、ツールとプロンプトを取得しようとしていることを意味します。サーバーがこのステータスのままの場合:
- アップストリーム MCP サーバー URL が正しく、サーバーに到達できることを確認します。
- アップストリームサーバーが Streamable HTTP ↗ または SSE トランスポートに対応していることを確認します。portal は複数の接続戦略を自動で試します。
- サーバーが認証を必要とする場合は、サーバーを再認証 し、管理者認証情報が有効であることを確認します。
- 三点リーダー > Sync capabilities を選び、接続を手動で再試行します。
Stale ステータスは、前回の同期試行中にサーバーの管理者認証情報を更新できなかったことを意味します。独自の OAuth トークンを持つユーザー(Require user auth がオンのサーバー)ではツールがまだ動くことがありますが、管理者認証情報の更新が必要です。
解決するには、有効な管理者認証情報で サーバーを再認証 します。
- サーバーがユーザーごとの OAuth(Require user auth がオン)を使う場合、ユーザーの OAuth トークンが期限切れのことがあります。ユーザーに、MCP クライアントから サーバーを再認証 するよう依頼します。
- サーバーが管理者認証情報を使う場合は、サーバーステータス を確認します。Error または Sync Required は、管理者認証情報の更新が必要であることを示します。
- ユーザーが最近、アップストリームサービスで権限を変更した場合(OAuth スコープの取り消しなど)、再認証が必要です。
invalid_redirect_uri、invalid_client_metadata、Redirect URI not allowed などのエラーは、OAuth フロー中に portal が登録したコールバック URL を、アップストリーム MCP サーバーが拒否したことを示します。コールバック URL の決まり方は アップストリーム OAuth コールバック URL を参照してください。
- デフォルトでは、アップストリームプロバイダーは
https://<your-portal-hostname>/servers-callbackをリダイレクト URI として許可リストに入れる必要があります(例:https://my-portal.example.com/servers-callback)。OAuth プロバイダーは通常、パスを含む完全 URI を完全一致します。許可リストを制御できない場合は、アップストリーム MCP サーバーベンダーに連絡します。 - portal が 共有 Cloudflare コールバック URL を使う設定の場合、アップストリームプロバイダーは代わりに
https://oauth-callbacks.cloudflareaccess.com/cdn-cgi/access/outbound-oauth-callbackを許可リストに入れる必要があります。
- アップストリーム MCP サーバーが Streamable HTTP トランスポートに対応していることを確認します。SSE トランスポートは Gateway 経由では使えません。
- アップストリームサーバー URL が
/sseで終わる場合、portal は代わりに/mcpパスで Streamable HTTP 接続を自動試行します。サーバーがこれに対応していない場合、接続は失敗します。 - Gateway HTTP ログ で DLP ブロックイベントを確認します。DLP ポリシーがトラフィックをブロックしている場合、portal は DLP ルール ID 付きのエラーを MCP クライアントに返します。
- 最新版の
mcp-remoteを使っていることを確認します。更新するにはnpx -y mcp-remote@latestを実行します。 - MCP クライアント設定では、
serverURLパラメーターではなくcommandとargs形式を使います。serverURLパラメーターは、portal セッション作成で問題を起こすことがあります。 - 認証が繰り返し失敗する場合は、
rm -rf ~/.mcp-authを実行してキャッシュされた認証情報を消し、再接続します。
portal ホームページは、Access の組織名とブランディングを表示します。表示名が正しくない場合:
- Cloudflare ダッシュボード ↗ で、Zero Trust > Settings > General > Team name を開きます。
- チーム名を更新します。変更は、次にユーザーが portal ホームページを開いたときに反映されます。