跳转到内容
搜索文档

允许 MCP 服务器访问自托管应用程序

最后更新 查看 MarkdownAgent 设置

MCP 服务器通常需要代表已通过身份验证的用户调用内部应用程序。例如,帮助员工与内部工具进行交互的 MCP 服务器需要将用户的身份转发给这些下游服务(MCP 服务器连接的内部应用程序),以便使用正确的权限授权每个请求。

关联应用令牌(Linked App Token)策略选择器通过允许一个应用程序上的 Access 策略接受为另一个应用程序签发的令牌来实现此目的。根据您的 MCP 服务器的部署方式,有两种设置方法。

自托管 MCP 服务器(推荐)

如果您的 MCP 服务器是一个自托管 Access 应用程序,Cloudflare Access 会自动处理身份验证。MCP 服务器会在 Cf-Access-Jwt-Assertion 标头中从 Access 接收用户的 JWT,并应将其在 Cf-Access-Token 标头中转发给下游应用程序。您的 MCP 服务器代码中不需要实现 OAuth。

flowchart LR
accTitle: 自托管 MCP 服务器访问内部应用程序
    User --> client["MCP 客户端"]
    client --> mcp["MCP 服务器 <br>(自托管应用)"]
    mcp -- "Cf-Access-Token: &lt;JWT&gt;" --> app1["内部 API <br>(自托管应用)"]
    mcp -- "Cf-Access-Token: &lt;JWT&gt;" --> app2["公司 Wiki <br>(自托管应用)"]
    idp[身份提供商] <--> mcp

前提条件

1. 配置下游应用程序

在 MCP 服务器需要访问的每个自托管应用程序上(例如 内部 API公司 Wiki 应用),创建一个关联应用令牌(Linked App Token)策略:

  1. Cloudflare 仪表板中,前往 Zero Trust > Access controls(访问控制) > Applications(应用程序)

  2. 选择 the downstream application,然后选择 Edit(编辑)

  3. 前往 Policies(策略) 选项卡,然后选择 Create new policy(创建新策略)

  4. 将策略 Action(操作) 设置为 Service Auth

  5. 对于 Selector(选择器),选择 Linked App Token

  6. 对于 Value(值),选择 the MCP server application。例如:

    Action(操作) Rule type(规则类型) Selector(选择器) Value(值)
    Service Auth(服务身份验证) Include(包含) Linked App Token mcp-server-app
  7. 保存策略。

  8. 在 the downstream application 中,将策略添加到 Access policies(Access 策略) 列表。

  9. 保存应用程序。

  1. 获取 the MCP server application 的 uid

    Required API token permissions

    At least one of the following token permissions is required:
    • Access: Apps and Policies Revoke
    • Access: Apps and Policies Write
    • Access: 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",
    	...
    }
  2. 在下游应用程序上创建 Access 策略,将 app_uid 值替换为 the MCP server application 的 uid

    Required API token permissions

    At least one of the following token permissions is required:
    • 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": "Allow requests from MCP server",
    		"decision": "non_identity",
    		"include": [
    				{
    						"linked_app_token": {
    								"app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    						}
    				}
    		]
    	}'

2. 配置您的 MCP 服务器

在您的 MCP 服务器代码中,将传入请求中的 Cf-Access-Jwt-Assertion 标头作为传出请求中的 Cf-Access-Token 标头转发给下游应用程序:

Cf-Access-Token: <JWT from Cf-Access-Jwt-Assertion>

Access 现在将针对关联应用令牌规则验证 JWT 令牌,并将用户的身份传播到下游应用程序。

SaaS MCP 服务器(通过 OAuth 运行 Access for SaaS)

如果您的 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 &lt;token&gt;" --> app1["内部 API <br>(自托管应用)"]
    mcp -- "Authorization: Bearer &lt;token&gt;" --> app2["公司 Wiki <br>(自托管应用)"]
    idp[身份提供商] <--> mcp

前提条件

1. 配置下游应用程序

在 MCP 服务器需要访问的每个自托管应用程序上(例如 内部 API公司 Wiki 应用),创建一个关联应用令牌(Linked App Token)策略:

  1. Cloudflare 仪表板中,前往 Zero Trust > Access controls(访问控制) > Applications(应用程序)

  2. 选择 the downstream application,然后选择 Edit(编辑)

  3. 前往 Policies(策略) 选项卡,然后选择 Create new policy(创建新策略)

  4. 将策略 Action(操作) 设置为 Service Auth

  5. 对于 Selector(选择器),选择 Linked App Token

  6. 对于 Value(值),选择 the MCP server application。例如:

    Action(操作) Rule type(规则类型) Selector(选择器) Value(值)
    Service Auth(服务身份验证) Include(包含) Linked App Token mcp-server-app
  7. 保存策略。

  8. 在 the downstream application 中,将策略添加到 Access policies(Access 策略) 列表。

  9. 保存应用程序。

  1. 获取 the MCP server application 的 uid

    Required API token permissions

    At least one of the following token permissions is required:
    • Access: Apps and Policies Revoke
    • Access: Apps and Policies Write
    • Access: 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",
    	...
    }
  2. 在下游应用程序上创建 Access 策略,将 app_uid 值替换为 the MCP server application 的 uid

    Required API token permissions

    At least one of the following token permissions is required:
    • 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": "Allow requests from MCP server",
    		"decision": "non_identity",
    		"include": [
    				{
    						"linked_app_token": {
    								"app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    						}
    				}
    		]
    	}'

2. 配置您的 MCP 服务器

配置 MCP 服务器以在传出请求中转发 access_token

Authorization: Bearer ACCESS_TOKEN

已知限制

  • 关联应用令牌策略只能添加到自托管应用程序,无法添加到 SaaS 应用程序或其他应用程序类型。
  • 该功能最适合依赖 Cloudflare Access JWT 进行身份验证和身份识别的应用程序。如果下游应用程序在 Cloudflare Access 之后实现了自己的身份验证层,通过 Access 验证的请求仍可能被该应用程序本身拒绝。
  • 当上游应用程序使用 Managed OAuth 时,客户端收到的是不透明访问令牌,而非 JWT。客户端无法将此令牌作为 Cf-Access-Token 标头直接转发给下游应用程序。此时,上游应用程序的源站必须读取 Cf-Access-Jwt-Assertion 标头(其中包含已解析的 JWT),并将其作为 Cf-Access-Token 转发给下游应用程序。如果您希望客户端无需代理即可访问多个端点,请考虑改用多域 Access 应用程序

这篇文档对您有帮助吗?