MCP服务器部署工具

用于在Cloud Run上部署MCP服务器并连接Gemini CLI的工具,支持快速部署和认证管理。

  • by jindalvivek10
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 jindalvivek10/mcp_on_cloud_run_with_docker_gemini_cli

使用说明

配置Gcloud项目

jindal_vivek10@cloudshell:~/projects/mcp_on_docker_cloud_run_gemini_cli_connect$ gcloud config set project vjindal-project-ai-basic

在终端中,启用API:(此步骤在之前的codelab中完成,因此暂时跳过)

gcloud services enable \   run.googleapis.com \   artifactregistry.googleapis.com \   cloudbuild.googleapis.com

安装UV

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$ uv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$ uv add fastmcp==2.12.4 --no-sync

这将向您的项目添加一个uv.lock文件。

为MCP服务器创建代码

在server.py文件中添加以下zoo MCP服务器源代码:

<在server.py文件中添加代码>

Deloy您的MCP服务器

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$ gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"

已创建服务帐户[mcp服务器sa]。

提示💡💡💡💡 --

This server account mcp-server-sa will be used in the gcloud run deploy command. Using a Service Account is "Keyless."
There is no password to steal; the permission is built into the identity of the server itself.
so you don't need to pass the API key as env var in the **gcloud run deploy** command

创建并打开一个新的Dockerfile以部署到Cloud Run: 在Dockerfile中包含以下代码,以使用uv工具运行server.pyfile:

// Use the official Python image
FROM python:3.13-slim

// Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

// Install the project into /app
COPY . /app
WORKDIR /app

// Allow statements and log messages to immediately appear in the logs
ENV PYTHONUNBUFFERED=1

// Install dependencies
RUN uv sync

EXPOSE $PORT

// Run the FastMCP server
CMD ["uv", "run", "server.py"]

提示💡💡💡💡

如果你跳过Dockerfile,gcloud run-deploy不会在你的文件夹中“创建”一个文件;它只是在背景中构建图像。

  • 问题: Buildpack通常会查找main.py或FastAPI/Flask等web框架来决定如何启动应用程序。
  • 冲突: 因为您正在构建一个MCP服务器(不是标准的web应用程序),并使用uv run Server.py作为启动命令,所以“魔术”构建可能不知道如何正确启动您的服务。你可能需要创建一个Procfile来告诉它该做什么,这和一个Dockerfile一样多!

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$

gcloud run deploy zoo-mcp-server \ 
    --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
    --no-allow-unauthenticated \
    --region=europe-west1 \
    --source=. \
    --labels=dev-tutorial=codelab-mcp

从源代码部署需要一个工件注册表Docker存储库来存储构建的容器。名为的存储库 将创建[europe-west1]地区的[云运行源代码部署]。

是否要继续(Y/n)?Y

在项目[vjindal项目ai基础]区域[europe-west1]中使用Dockerfile构建并将容器部署到云运行服务[zoo-mcp服务器] |构建和部署新服务。..正在上传源。
OK构建和部署新服务。..完成。
确定创建容器存储库。..
OK正在验证配置。..
好的,正在上传源代码。..
好的,建造集装箱。..日志可在[https://console.cloud.google.com/cloud-build/builds;地区=欧洲西部1/ bbde0965-f410-4be4-bc5b-af86ebde5391?项目=658050955671]。
确定创建修订。..
OK路由流量。..
完成。
服务[zoo-mcp服务器]修订版[zoo-mcp-server-00001-nbr]已部署,并为100%的流量提供服务。 服务URL:https://zoo-mcp-server-658050955671.europe-west1.run.app

注意:如果您尝试直接访问该URL,您将看到“禁止错误”,因为您的MCP服务器需要身份验证。 您已部署MCP服务器。现在你可以使用它了。

提示💡💡💡💡

运行gcloud时,运行deploy--source。,谷歌云编排了一个“源到服务”的管道。由于你的文件夹中有一个Dockerfile,谷歌云跳过了“猜测”阶段(Buildpack),并按照你的确切指示进行操作。

步骤--组件--操作

1. Upload	-- GCS	-- Stores your raw code files temporarily.
2. Build -- Cloud Build	-- Uses your Dockerfile to bake the image.
3. Store -- Artifact Registry --	Keeps the baked image in a secure private vault.
4. Deploy	-- Cloud Run	-- Creates a "Revision" (Version 1, Version 2, etc.).
5. Run	-- Container -- Starts your Python code and listens on the port.
6. Expose	-- HTTPS URL --	Provides the final endpoint for your Gemini CLI to call.

将远程MCP服务器添加到Gemini CLI

现在您已经成功部署了远程MCP服务器,您可以使用各种应用程序(如Google Code Assist或Gemini CLI)连接到它。在本节中,我们将使用Gemini CLI建立与新的远程MCP服务器的连接。

授予您的用户帐户调用远程MCP服务器的权限

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member=user:$(gcloud config get-value account) \
    --role='roles/run.invoker'

您的活动配置为:[cloudshell-21554] 更新了项目[vjindal项目ai basic]的IAM政策。 绑定:

  • 成员:
    • 用户:jindal.vivek10@gmail.com 角色:角色/run.invoker

此命令执行项目级IAM策略绑定,将roles/run.invoker预定义角色授予经过身份验证的主体,授权您在目标项目中执行私有Cloud run服务的经过身份验证HTTPS调用。

在运行上述命令之前,vjindal项目ai basic的IAM权限如下 主要姓名角色 658050955671-compute@developer.gserviceaccount.com默认计算服务帐户•编辑器 jindal.vivek10@gmail.comVivek Jindal所有者

运行上述命令后,添加了•Cloud run Invoker的角色jindal.vivek10@gmail.com

主要姓名角色 658050955671-compute@developer.gserviceaccount.com默认计算服务帐户•编辑器 jindal.vivek10@gmail.comVivek Jindal所有者,云运行调用者

将您的Google Cloud凭据和项目编号保存在环境变量中,以便在Gemini设置文件中使用:

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$export ID_TOKEN=$(gcloud auth print-identity-token)

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$ echo $PROJECT_NUMBER 658050955671

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$ echo $ID_TOKEN eyJhbGciOiJSUzI1NiIsImtpZCI6ImExMGU1OGRmNTVlNzI4NTY2ZWM1NmJkYTZlYjNiZDQ1NDM5ZjM1ZDciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbguuY29tIwYXpwIjoiNjE4MTA0NzA4MDU0LTlyOXMxYzRhbGczNmVybGl1Y2hvOXQ1Mm4zMm42ZGDxLmFwcHMuZ29vZ2xldXNlcmNvbn RlbnQuY29tIiwiYXVkIjoiNjE4MTA0NzA4MDU0LTlyOXMxYzRhbGczNmVybGl1Y2hvOXQ1Mm4zMm42ZGDxLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQY29tIw3iIjoiMTAxMDC5ODM5NTY0MjAzMDg3MzQ2Iiw1haWwiJqaW5kwwwudml2ZwxMEBC5jb20iLCJlbWFpbF92ZmlZCI6dHJ1ZSwi YXRfaGFzaCI6Ing4V1prZnVudFFZQ0VBB1JoQlB1MFEiLCJUYmYiOje3NzUxMD3MDgsImlhdCI6MTc3NTEwOTAWOCwiZXhwIjoxNzc1MTEyNjA4LCJqdGkiOijlM2U3NjE0OGZjODIYWIYWMwMzE3YjYxNGM4ODY3NGQwNzEyoWY3In0.vilicDTziu4B_zcBt68UVxCdM08zkrMrplQw33SO-BswDq_SUj0haWQajiSK fVismkO1Xe4FCghZmPMFA3VTBjxX_ySxWIkVkXgSOaPMMdq-5XCOfEYpSwCBtzxtpyqWh3DkX2JYG30bfu2D3g-kbG0DGXUeBVLypLfIZ_S_zmxDZ65PvPX7fUIWeycMCwbr3lJW9GRyNxlDT_tby24A6kKWyKrvMyxWrgl3f5vpkqG-Pab-iSTvU-Dkal3zmMftlETh13uMmfQAv3X2WZEyZ6o9NSB-euDrLBhcuIHk3IKWrl 4VcuSD_tI3APkF75azrCskUBITo_w9gsExQ

这些命令将您的唯一项目数字ID和短期身份验证令牌捕获到环境变量中,使Gemini CLI能够动态定位并安全访问您的私有Cloud Run端点。

cd~/.双子座 打开Gemini CLI设置文件
jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$cloudshell edit ~/.gemini/settings.json

替换Gemini CLI设置文件以添加Cloud Run MCP服务器

{
    "ide": {
        "hasSeenNudge": true
    },
    "mcpServers": {
        "zoo-remote": {
            "httpUrl": "https://zoo-mcp-server-$PROJECT_NUMBER.europe-west1.run.app/mcp",
            "headers": {
                "Authorization": "Bearer $ID_TOKEN"
            }
        }
    },
    "security": {
        "auth": {
            "selectedType": "cloud-shell"
        }
    }
}

在Cloud Shell中运行上述导出命令的同一终端中启动Gemini CLI jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$gemini

如果你看到这样的错误:

🔍 正在尝试为“zoo remote”进行OAuth发现。.. ❌ 'zoo remote需要身份验证,但找不到OAuth配置 连接到MCP服务器“zoo remote”时出错:MCP服务器“zoo remote”需要身份验证。请配置OAuth或检查服务器设置。 ID令牌可能已超时,需要重新设置ID_Token。 键入/退出,然后按Enter退出Gemini CLI。 在终端中设置项目
jindal_vivek10@cloudshell:~/.gemini(vjindal项目ai基础)$ gcloud config set project vjindal-project-ai-basic

重新运行Google Cloud凭据命令以获取新的ID_TOKEN,因为您的ID_TOKEN可能已过期。

$export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")

$export ID_TOKEN=$(gcloud auth print-identity-token) 之后,当您调用gemini时,它应该显示2个MCP服务器-VerTex AI地图服务器和地图动物园服务器已连接,并开始工作

验证日志以检查对MCP服务器的所有请求 $gcloud run services logs read zoo-mcp-server --region europe-west1 --limit=25

如日志所示,以下3个列表请求将立即发送到MCP服务器

处理ListPromptsRequest类型的请求 处理ListToolsRequest类型的请求 处理ListResourcesRequest类型的请求

当你问“我在哪里可以找到企鹅”时,你的mcp服务器工具将被调用

DEFAULT 2026-04-02T07:37:20.560988Z[信息]:处理CallToolRequest类型的请求 默认2026-04-02T07:37:20.562952Z[信息]:>>>🛠️ 工具:“get_animals_by_species”被称为“狮子”

10.(可选)向服务器添加MCP提示

MCP提示可以通过为较长的提示创建简写来加快您经常运行的提示的工作流程。 Gemini CLI会自动将MCP提示转换为自定义斜线命令,以便您可以通过键入/promppt_name来调用MCP提示,其中prompt_name是MCP提示的名称。

将MCP服务器重新部署到Cloud RUN— jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$

gcloud run deploy zoo-mcp-server \                                                          
    --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
    --no-allow-unauthenticated \
    --region=europe-west1 \
    --source=. \
    --labels=dev-tutorial=codelab-mcp

运行命令将您的gemini CLI再次连接到MCP服务器 $gcloud config set project vjindal-project-ai-basic

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")

jindal_vivek10@cloudshell:~/projects/mcp_ondocker_cloud_run_gemini_cli_connect(vjindal项目ai基础)$export ID_TOKEN=$(gcloud auth print-identity-token)

再次调用Gemini并输入-/find Lions(它将首先发送GetPromptRequest,然后发送GetToolRequest