You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google Cloud Run中调用MCP工具时WebSocket连接关闭的配置解决方案咨询

Google Cloud Run中调用MCP工具时WebSocket连接关闭的配置解决方案咨询

大家好,我最近在开发一个基于MCP(Model Context Protocol)服务器的旅行规划Agent,用Python + Streamlit实现,本地运行完全正常,但部署到Google Cloud Run后遇到了WebSocket连接的棘手问题,折腾了好几天没找到头绪,来请教下各位大佬怎么配置Cloud Run才能让MCP工具正常连接外部服务器。

问题核心

本地环境下,MCP工具能正常连接Airbnb MCP和Travel Planner MCP服务器,返回数据毫无问题;但部署到Cloud Run后,WebSocket连接会立刻关闭,直接导致MCP工具调用失败,完全没法获取数据。

错误信息汇总

  • 前端控制台报错:
    WebSocket connection closed unexpectedly
    Connection to MCP server failed: Connection closed
    
  • Cloud Run后台日志报错:
    [ERROR] WebSocket handshake failed
    [ERROR] MCP server connection timeout after 60 seconds
    

环境与依赖细节

  • 本地环境:Python 3.11(Windows 10),运行稳定
  • Cloud Run环境:Python 3.11(官方容器镜像),连接失败
  • 使用的Python库
    • streamlit==1.36.0
    • asyncio(Python 3.11内置)
    • websockets==12.0
  • MCP服务器依赖
    • @openbnb/mcp-server-airbnb(通过npx启动)
    • @gongrzhe/server-travelplanner-mcp(通过npx启动)

Cloud Run服务配置详情

我当前的Cloud Run服务配置如下:

  • 服务名称:travel-planner
  • 区域:us-central1
  • 访问URL:https://travel-planner-809145899609.us-central1.run.app
  • 入口规则:允许所有访问
  • 流量分配:100%指向最新版本(travel-planner-00009-zvv)
  • 扩缩容策略:自动扩缩容,最小实例数0
  • 容器配置:
    • 镜像地址:gcr.io/ai-agent-travel-planner/travel-planner
    • 监听端口:8080
    • 资源分配:2Gi内存,1000m CPU
    • 挂载密钥:GEMINI_API_KEY(latest版本)、GOOGLE_MAPS_API_KEY(latest版本)
  • 启动探针:TCP类型,每240秒检查一次8080端口,初始延迟0s,超时240s,失败阈值1
  • 服务账号:809145899609-compute@developer.gserviceaccount.com
  • 并发设置:单实例并发数80,最大实例数20,请求超时300s

核心代码片段

下面是调用MCP工具的核心异步代码,本地运行正常,但Cloud Run里卡在await mcp_tools.connect()这一步:

import os
import asyncio
from MultiMCPTools import MultiMCPTools

async def run_mcp_travel_planner(destination: str, num_days: int, preferences: str, budget: int, openai_key: str, google_maps_key: str):
    try:
        # 设置Google Maps API环境变量
        os.environ["GOOGLE_MAPS_API_KEY"] = google_maps_key
        
        # 初始化MCP工具,加载两个MCP服务器
        mcp_tools = MultiMCPTools(
            [
                "npx -y @openbnb/mcp-server-airbnb --ignore-robots-txt",
                "npx @gongrzhe/server-travelplanner-mcp",
            ],
            env={
                "GOOGLE_MAPS_API_KEY": google_maps_key,
            },
            timeout_seconds=60,
        )
        
        # 本地正常,Cloud Run中此处WebSocket连接直接关闭
        await mcp_tools.connect()
        
        # 后续调用MCP工具的代码...
    except Exception as e:
        print(f"MCP connection failed: {e}")
        raise

# 测试函数
async def main():
    await run_mcp_travel_planner("Paris", 3, "museums", 1000, "dummy-key", "dummy-maps-key")

if __name__ == "__main__":
    asyncio.run(main())

我的排查与疑问

目前我已经确认Cloud Run的密钥挂载正常,环境变量能正确读取,容器启动也没有问题,但就是WebSocket连接建立失败。想请教大家:

  1. Cloud Run需要调整哪些网络、端口或超时配置才能允许WebSocket连接正常建立?
  2. 是不是MCP服务器通过npx启动的方式在容器环境里有什么限制?
  3. 代码层面有没有需要修改的地方来适配Cloud Run的环境?

麻烦各位帮忙看看,谢谢啦!

火山引擎 最新活动