MCP サーバーは、認証済みユーザーの代わりに社内アプリケーションを呼び出すことがよくあります。たとえば、従業員が社内ツールを使うのを助ける MCP サーバーは、ユーザーの ID をダウンストリームサービス(MCP サーバーが接続する社内アプリケーション)に転送し、各リクエストが正しい権限で認可されるようにします。
Linked App Token ポリシーセレクターを使うと、あるアプリケーションの Access ポリシーで、別のアプリケーション向けに発行されたトークンを受け入れられます。MCP サーバーのデプロイ方法に応じて、次の 2 通りの設定があります。
MCP サーバーが セルフホスト Access アプリケーション の場合、Cloudflare Access が認証を自動で処理します。MCP サーバーは Access からユーザーの JWT を Cf-Access-Jwt-Assertion ヘッダーで受け取り、ダウンストリームアプリケーションへは Cf-Access-Token ヘッダーで転送します。MCP サーバーのコードで OAuth を実装する必要はありません。
flowchart LR
accTitle: セルフホスト MCP サーバーから社内アプリケーションへのアクセス
User[ユーザー] --> client["MCP クライアント"]
client --> mcp["MCP サーバー <br> (セルフホストアプリ)"]
mcp -- "Cf-Access-Token: <JWT>" --> app1["Internal API <br> (セルフホストアプリ)"]
mcp -- "Cf-Access-Token: <JWT>" --> app2["Company wiki <br> (セルフホストアプリ)"]
idp[ID プロバイダー] <--> mcp
- ダウンストリームアプリケーション(例:
Internal APIとCompany wiki)を セルフホスト Access アプリケーション として追加します。 - MCP サーバーを セルフホスト Access アプリケーション として追加します。
MCP サーバーがアクセスする各セルフホストアプリケーション(例: Internal API と Company wiki)で、Linked App Token ポリシーを作成します。
-
Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > Applications を開きます。
-
ダウンストリームアプリケーション を選び、Edit を選びます。
-
Policies タブを開き、Create new policy を選びます。
-
ポリシーの Action を Service Auth に設定します。
-
Selector で Linked App Token を選びます。
-
Value で MCP サーバーアプリケーション を選びます。例:
アクション ルールタイプ セレクター 値 Service Auth Include Linked App Token mcp-server-app -
ポリシーを保存します。
-
ダウンストリームアプリケーション で、ポリシーを Access policies リストに追加します。
-
アプリケーションを保存します。
-
MCP サーバーアプリケーション の
uidを取得します。
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationsbash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "self_hosted", "name": "mcp-server-app", ... } -
ダウンストリームアプリケーションに Access ポリシーを作成し、
app_uidの値を MCP サーバーアプリケーション のuidに置き換えます。
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies Write
Create an Access reusable policybash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "MCP サーバーからのリクエストを許可", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
MCP サーバーのコードで、受信リクエストの Cf-Access-Jwt-Assertion ヘッダーを、ダウンストリームアプリケーションへの送信リクエストの Cf-Access-Token ヘッダーとして転送します。
Cf-Access-Token: <JWT from Cf-Access-Jwt-Assertion>Access は JWT を Linked App Token ルールに照合して検証し、ユーザーの ID をダウンストリームアプリケーションに伝播します。
MCP サーバーを Access for SaaS の OIDC アプリケーション として登録し、MCP OAuth ↗ を実装している場合、Cloudflare Access から OAuth の access_token を受け取ります。MCP サーバーは、このトークンをダウンストリームのセルフホストアプリケーションへ Authorization: Bearer ヘッダーで転送します。
この方法では、MCP サーバー側で OAuth の認可コードフローを実装する必要があります。認証を Cloudflare に任せたい場合は、セルフホスト MCP サーバー を使います。
flowchart LR
accTitle: SaaS MCP サーバーから社内アプリケーションへのアクセス
User[ユーザー] --> client["MCP クライアント"]
client --> mcp["MCP サーバー <br> (Access for SaaS アプリ)"]
mcp -- "Authorization: Bearer <token>" --> app1["Internal API <br> (セルフホストアプリ)"]
mcp -- "Authorization: Bearer <token>" --> app2["Company wiki <br> (セルフホストアプリ)"]
idp[ID プロバイダー] <--> mcp
- ダウンストリームアプリケーション(例:
Internal APIとCompany wiki)を セルフホスト Access アプリケーション として追加します。 - MCP サーバーを Access for SaaS の OIDC アプリケーション として追加します。
MCP サーバーがアクセスする各セルフホストアプリケーション(例: Internal API と Company wiki)で、Linked App Token ポリシーを作成します。
-
Cloudflare ダッシュボード ↗ で、Zero Trust > Access controls > Applications を開きます。
-
ダウンストリームアプリケーション を選び、Edit を選びます。
-
Policies タブを開き、Create new policy を選びます。
-
ポリシーの Action を Service Auth に設定します。
-
Selector で Linked App Token を選びます。
-
Value で MCP サーバーアプリケーション を選びます。例:
アクション ルールタイプ セレクター 値 Service Auth Include Linked App Token mcp-server-app -
ポリシーを保存します。
-
ダウンストリームアプリケーション で、ポリシーを Access policies リストに追加します。
-
アプリケーションを保存します。
-
MCP サーバーアプリケーション の
uidを取得します。
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationsbash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "saas", "name": "mcp-server-app", ... } -
ダウンストリームアプリケーションに Access ポリシーを作成し、
app_uidの値を MCP サーバーアプリケーション のuidに置き換えます。
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies Write
Create an Access reusable policybash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "MCP サーバーからのリクエストを許可", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
MCP サーバーが送信リクエストで access_token を転送するように設定します。
Authorization: Bearer ACCESS_TOKEN- Linked App Token ポリシーは セルフホストアプリケーション にのみ追加できます。SaaS アプリケーション やほかのアプリケーション種類には追加できません。
- この機能は、認証と ID に Cloudflare Access JWT を使うアプリケーションで最もよく動作します。ダウンストリームアプリケーションが Cloudflare Access のあとに独自の認証層を実装している場合、Access の検証を通過したリクエストでも、アプリケーション側で拒否されることがあります。
- 上流アプリケーションが Managed OAuth を使う場合、クライアントが受け取るのは JWT ではなく 不透明なアクセストークン です。クライアントはこのトークンを
Cf-Access-Tokenヘッダーとしてダウンストリームアプリケーションへ直接転送できません。代わりに、上流アプリケーションのオリジンがCf-Access-Jwt-Assertionヘッダー(解決済み JWT を含む)を読み取り、Cf-Access-Tokenとしてダウンストリームアプリケーションへ転送する必要があります。プロキシなしでクライアントから複数のエンドポイントへアクセスしたい場合は、代わりに マルチドメイン Access アプリケーション を検討してください。