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连接建立失败。想请教大家:
- Cloud Run需要调整哪些网络、端口或超时配置才能允许WebSocket连接正常建立?
- 是不是MCP服务器通过npx启动的方式在容器环境里有什么限制?
- 代码层面有没有需要修改的地方来适配Cloud Run的环境?
麻烦各位帮忙看看,谢谢啦!




