RuntimeError: Failed to connect to MCP server after 3 attempts: Client failed to connect: Server disconnected without sending a response.

用户使用 MCP Python SDK 客户端连接一个 内部集群 URL (仅集群内可解析和访问),而客户端运行在集群外部,触发了连接失败。用户同时提到,同样的代码连接其他公网 URL 时正常工作。

RuntimeError: Failed to connect to MCP server after 3 attempts: Client failed to connect: Server disconnected without sending a response.

RuntimeError: Failed to connect to MCP server after 3 attempts: Client failed to connect: Server disconnected without sending a response.

快速结论:该报错通常发生在 MCP 客户端无法通过 TCP 连接到 MCP 服务器,或服务器在返回任何数据之前就断开了连接。优先排查目标 URL 的 网络可达性(DNS 解析、端口连通性、代理/防火墙拦截)以及 SSL/TLS 证书 配置(内部 CA 证书未被信任)。

问题场景

用户使用 MCP Python SDK 客户端连接一个内部集群 URL(仅集群内可解析和访问),而客户端运行在集群外部,触发了连接失败。用户同时提到,同样的代码连接其他公网 URL 时正常工作。

报错原文

RuntimeError: Failed to connect to MCP server after 3 attempts: Client failed to connect: Server disconnected without sending a response.

During handling of the above exception, another exception occurred:
...
  File "/usr/app/.venv/lib/python3.13/site-packages/agent/tools/mcp/mcp_tools_factory.py", line 227, in get_fastmcp_tools
    raise RuntimeError(
        f"Failed to connect to MCP server after {max_retries} attempts: {last_error}"
    )
RuntimeError: Failed to connect to MCP server after 3 attempts: Client failed to connect: Server disconnected without sending a response.

原因分析

根本原因是 环境/网络问题,而非 SDK 本身的 Bug。可能原因包括:

  • 目标 URL 在客户端所在网络不可达:客户端无法解析域名(DNS 失败),或目标主机/端口被防火墙、安全组、代理阻断。
  • 服务器主动断连:服务器在 MCP 协议握手前关闭了 TCP 连接(例如负载均衡器、反向代理配置错误,或服务尚未就绪)。
  • SSL/TLS 证书问题:当使用 HTTPS URL 时,如果服务器使用内部 CA 签发的证书,而客户端的系统信任库不包含该 CA,会导致 SSL: CERTIFICATE_VERIFY_FAILED 错误(用户遇到的另一个问题场景与此相关)。

环境排查

  • 确认客户端主机能否通过 curl -v <url>ping <hostname> 访问目标 MCP 地址和端口。
  • 检查 DNS 解析是否正常(nslookupdig)。
  • 如果目标是 HTTPS,检查证书是否有效:openssl s_client -connect <host:port> -servername <hostname>
  • 确认客户端没有使用错误的 HTTP 代理环境变量(如 http_proxy / https_proxy)将请求导向无效代理。
  • 查看框架封装层(如 agent 包)是否在连接过程中传递了错误的 httpx 客户端参数。

解决步骤

  1. 测试基本网络连通性:在客户端所在主机运行 curl -v http(s)://<mcp-server-url>,观察是否返回任何数据或报错信息。
  2. 排查 DNS 和路由:如果不能解析域名,先将域名/IP 加入内部 DNS 解析,或者通过 /etc/hosts 临时绑定主机名。
  3. 代理/防火墙配置:检查客户端是否通过公司或集群代理访问公网。如果是内部服务,确保请求不经过外部代理;可由管理员开放防火墙规则或提供直接路由。
  4. SSL/TLS 证书处理(可优先尝试):如果目标 URL 是 HTTPS 且使用内部 CA 证书,需要将内部 CA 证书导入系统信任库,或通过 SSL_CERT_FILE 环境变量指定 CA 包路径,或在 MCP 传输层传入 httpx.AsyncClient(verify="<path-to-ca-bundle>")
  5. 检查服务端日志:如果以上均通过,请检查 MCP 服务器端日志,确认服务是否正常监听端口、是否正确完成 MCP 协议初始化。

验证方法

重新运行 MCP 客户端,观察是否不再抛出 Server disconnected without sending a response 错误。若使用 HTTPS,确保 SSL: CERTIFICATE_VERIFY_FAILED 错误也已消失。最终可执行一个成功的 MCP 工具调用或资源列表请求,确认连接正常。

参考来源

modelcontextprotocol/python-sdk #2517

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8569

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注