在 Cloud Run 上托管 MCP 服务器

本指南介绍了如何在 Cloud Run 上托管具有可流式传输的 HTTP 传输的 Model Context Protocol (MCP) 服务器,并提供了有关对 MCP 客户端进行身份验证的指南。如果您刚开始接触 MCP,请阅读简介指南,了解更多背景信息。

MCP 是一种开放协议,可标准化 AI 智能体与其环境的互动方式。AI 智能体托管 MCP 客户端,与其互动的工具和资源是 MCP 服务器。MCP 客户端可以通过两种不同的传输类型与 MCP 服务器通信:

您可以在同一本地机器上托管 MCP 客户端和服务器,在本地托管 MCP 客户端并让其与托管在 Cloud Run 等云平台上的远程 MCP 服务器通信,或在云平台上同时托管 MCP 客户端和服务器。

Cloud Run 支持托管具有可流式传输的 HTTP 传输的 MCP 服务器,但不支持具有 stdio 传输的 MCP 服务器。

无论您是自行开发 MCP 服务器还是使用现有 MCP 服务器,本页面的指导都适用。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 在 Google Cloud 项目中设置 Cloud Run 开发环境
  7. 确保您拥有部署服务的相应权限,并且您的账号已获授 Cloud Run Admin (roles/run.admin) 和 Service Account User (roles/iam.serviceAccountUser) 角色。
  8. 了解如何授予角色

    控制台

    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      前往 IAM
    2. 选择相应项目。
    3. 点击 授予访问权限
    4. 新的主账号字段中,输入您的用户标识符。这通常是用于部署 Cloud Run 服务的 Google 账号邮箱。

    5. 选择角色列表中,选择一个角色。
    6. 如需授予其他角色,请点击 添加其他角色,然后依次添加所需角色。
    7. 点击保存

    gcloud

    如需向您在项目中的账号授予所需的 IAM 角色,请执行以下操作:

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member=PRINCIPAL \
           --role=ROLE
       

    您需要进行如下替换:

    • PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
    • PROJECT_ID 替换为您的 Google Cloud 项目 ID。
    • PRINCIPAL 替换为要为其添加绑定的主账号。这通常是用于部署 Cloud Run 服务的 Google 账号邮箱。
    • ROLE 替换为要添加到部署者账号的角色。

    托管远程 SSE 或可流式传输的 HTTP MCP 服务器

    使用服务器发送的事件 (SSE) 或可流式传输的 HTTP 传输的 MCP 服务器可以从 MCP 客户端远程托管。

    如需将此类型的 MCP 服务器部署到 Cloud Run,您可以根据 MCP 服务器的打包方式,将 MCP 服务器部署为容器映像或源代码(通常为 Node.js 或 Python)。

    容器映像

    以容器映像形式分发的远程 MCP 服务器是监听特定端口上的 HTTP 请求的 Web 服务器,这意味着它们遵循 Cloud Run 的容器运行时合同,并且可以部署到 Cloud Run 服务。

    如需部署打包为容器映像的 MCP 服务器,您需要拥有容器映像的网址以及该容器映像预期接收请求的端口。您可以使用以下 gcloud CLI 命令部署这些映像:

    gcloud run deploy --image IMAGE_URL --port PORT

    您需要进行如下替换:

    • IMAGE_URL 替换为容器映像网址,例如 us-docker.pkg.dev/cloudrun/container/mcp
    • PORT 替换为应用监听的端口,例如 3000

    来源

    未以容器映像形式提供的远程 MCP 服务器可以从来源部署到 Cloud Run,尤其是当它们是用 Node.js 或 Python 编写时。

    1. 克隆 MCP 服务器的 Git 代码库:

      git clone https://github.com/ORGANIZATION/REPOSITORY.git

    2. 前往 MCP 服务器的根目录:

      cd REPOSITORY

    3. 使用以下 gcloud CLI 命令部署到 Cloud Run:

      gcloud run deploy --source .

    将 HTTP MCP 服务器部署到 Cloud Run 后,MCP 服务器会获得一个 HTTPS 网址,并且通信可以使用 Cloud Run 对 HTTP 响应串流的内置支持。

    对 MCP 客户端进行身份验证

    根据您托管 MCP 客户端的位置,参阅相关部分:

    对本地 MCP 客户端进行身份验证

    如果托管 MCP 客户端的 AI 智能体在本地机器上运行,请使用以下方法之一对 MCP 客户端进行身份验证:

    如需了解详情,请参阅 MCP 身份验证规范

    IAM 调用方权限

    默认情况下,Cloud Run 服务的网址要求所有请求都必须通过 Cloud Run Invoker (roles/run.invoker) IAM 角色进行授权。此 IAM 政策绑定可确保使用强大的安全机制来验证本地 MCP 客户端的身份。

    将 MCP 服务器部署到某个区域的 Cloud Run 服务后,在本地计算机上运行 Cloud Run 智能体,以使用您自己的凭证安全地向客户端公开远程 MCP 服务器:

    gcloud run services proxy MCP_SERVER_NAME --region REGION --port=3000
    

    您需要进行如下替换:

    • MCP_SERVER_NAME 替换为您的 Cloud Run 服务的名称。
    • REGION 替换为您部署服务的 Google Cloud区域。例如 europe-west1

    Cloud Run 智能体命令会在端口 3000 上创建一个本地智能体,该智能体会将请求转发到远程 MCP 服务器并注入您的身份。

    使用以下内容更新 MCP 客户端的 MCP 配置文件:

    {
      "mcpServers": {
        "cloud-run": {
          "url": "http://localhost:3000/sse"
        }
      }
    }
    

    如果您的 MCP 客户端不支持 url 属性,请使用 mcp-remote npm 软件包

    {
      "mcpServers": {
        "cloud-run": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-remote",
            "http://localhost:3000/sse"
          ]
        }
      }
    }
    

    OIDC ID 令牌

    根据 MCP 客户端是否公开标头或使用提供自定义身份验证传输的方式,您可以考虑使用 OIDC ID 令牌对 MCP 客户端进行身份验证。

    您可以使用各种 Google 身份验证库从运行时环境中获取 ID 令牌,例如 Python 版 Google 身份验证库。除非您使用自定义受众群体,否则此令牌必须具有与接收服务的 *.run.app 网址匹配的正确受众群体声明。您还必须在客户端请求(例如 Authorization: Bearer <token value>)中包含 ID 令牌。

    如果 MCP 客户端未公开标头或传输,请使用其他身份验证方法。

    对在 Cloud Run 上运行的 MCP 客户端进行身份验证

    如果托管 MCP 客户端的 AI 智能体在 Cloud Run 上运行,请使用以下方法之一对 MCP 客户端进行身份验证:

    将 MCP 服务器部署为边车

    MCP 服务器可以部署为边车,在其中运行 MCP 客户端。

    在此应用场景下,由于 MCP 客户端和 MCP 服务器位于同一实例上,因此无需进行特定身份验证。客户端可以使用 http://localhost:PORT 上的端口连接到 MCP 服务器。将 PORT 替换为与用于向 Cloud Run 服务发送请求的端口不同的端口。

    对服务到服务进行身份验证

    如果 MCP 服务器和 MCP 客户端作为不同的 Cloud Run 服务运行,请参阅对服务到服务进行身份验证

    使用 Cloud Service Mesh

    托管 MCP 客户端的智能体可以使用 Cloud Service Mesh 连接到远程 MCP 服务器。

    您可以将 MCP 服务器服务配置为在网格上具有简称,并且 MCP 客户端可以使用简称 http://mcp-server 与 MCP 服务器通信。身份验证由网格管理。

    后续步骤