You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastMCP搭建的MCP Server初始化完成后仍报初始化未完成错误求解

问题

使用FastMCP构建MCP Server,确认服务已完成初始化(已处理多个工具请求),但仍出现如下错误:

INFO:     192.168.182.1:2520 - "GET /sse HTTP/1.1" 200 OK
INFO:     192.168.182.1:2691 - "POST /messages/?session_id=aa9fa14634144092aed00e8a04f84ca4 HTTP/1.1" 202 Accepted
INFO:     192.168.182.1:2760 - "POST /messages/?session_id=aa9fa14634144092aed00e8a04f84ca4 HTTP/1.1" 202 Accepted
ERROR:    Exception in ASGI application
  + Exception Group Traceback (most recent call last):
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/h11_impl.py", line 403, in run_asgi
  |     result = await app(  # type: ignore[func-returns-value]
  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |         self.scope, self.receive, self.send
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |     )
  |     ^
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
  |     return await self.app(scope, receive, send)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/applications.py", line 112, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 187, in __call__
  |     raise exc
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 165, in __call__
  |     await self.app(scope, receive, _send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
  |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/routing.py", line 714, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/routing.py", line 734, in app
  |     await route.handle(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/routing.py", line 288, in handle
  |     await self.app(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/routing.py", line 76, in app
  |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/starlette/routing.py", line 73, in app
  |     response = await f(request)
  |                ^^^^^^^^^^^^^^^^
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/fastmcp/server.py", line 485, in handle_sse
  |     async with sse.connect_sse(
  |                ~~~~~~~~~~~~~~~^
  |         request.scope,
  |         ^^^^^^^^^^^^^^
  |         request.receive,
  |         ^^^^^^^^^^^^^^^^
  |         request._send,  # type: ignore[reportPrivateUsage]
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |     ) as streams:
  |     ^
  |   File "/home/lewis/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py", line 235, in __aexit__
  |     await self.gen.athrow(value)
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/sse.py", line 123, in connect_sse
  |     async with anyio.create_task_group() as tg:
  |                ~~~~~~~~~~~~~~~~~~~~~~~^^
  |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 772, in __aexit__
  |     raise BaseExceptionGroup(
  |         "unhandled errors in a TaskGroup", self._exceptions
  |     ) from None
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Exception Group Traceback (most recent call last):
    |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/sse.py", line 131, in connect_sse
    |     yield (read_stream, write_stream)
    |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/fastmcp/server.py", line 490, in handle_sse
    |     await self._mcp_server.run(
    |     ...<3 lines>...
    |     )
    |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/lowlevel/server.py", line 483, in run
    |     async with AsyncExitStack() as stack:
    |                ~~~~~~~~~~~~~~^^
    |   File "/home/lewis/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py", line 768, in __aexit__
    |     raise exc
    |   File "/home/lewis/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/contextlib.py", line 751, in __aexit__
    |     cb_suppress = await cb(*exc_details)
    |                   ^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 210, in __aexit__
    |     return await self._task_group.__aexit__(exc_type, exc_val, exc_tb)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 772, in __aexit__
    |     raise BaseExceptionGroup(
    |         "unhandled errors in a TaskGroup", self._exceptions
    |     ) from None
    | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
    +-+---------------- 1 ----------------
      | Traceback (most recent call last):
      |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/shared/session.py", line 324, in _receive_loop
      |     await self._received_request(responder)
      |   File "/home/lewis/mcp/mcp_k8s_server/.venv/lib/python3.13/site-packages/mcp/server/session.py", line 163, in _received_request
      |     raise RuntimeError(
      |         "Received request before initialization was complete"
      |     )
      | RuntimeError: Received request before initialization was complete
      +------------------------------------

创建FastMCP实例时已添加初始化超时参数:

# Create the MCP server with initialization timeout
# This helps prevent "Received request before initialization was complete" errors
# by automatically closing connections that don't initialize properly
mcp = FastMCP(
    config.server.name,
    host=config.server.host,
    port=config.server.port,
    settings={"initialization_timeout": 10.0}  # 10 second timeout
)

MCP Server运行代码:

mcp.run(transport="sse")

客户端为CherryStdio,如何解决该问题?

解决方案

  • 延长初始化超时时间
    当前10秒的超时可能无法覆盖复杂初始化场景(如依赖外部资源加载),尝试将超时调整至20-30秒:

    mcp = FastMCP(
        config.server.name,
        host=config.server.host,
        port=config.server.port,
        settings={"initialization_timeout": 30.0}  # 延长至30秒
    )
    
  • 修正客户端请求时序
    检查CherryStdio的逻辑,确保只有在收到服务端初始化完成的信号后,再发送业务请求,避免连接未就绪时的提前调用。

  • 添加服务端初始化状态校验
    若使用自定义MCP实现,可在初始化完成后设置状态标记,在处理请求前先校验状态:

    class CustomMCPHandler:
        def __init__(self):
            self._initialized = False
    
        async def initialize(self):
            # 执行原初始化逻辑
            self._initialized = True
    
        async def _received_request(self, responder):
            if not self._initialized:
                await responder.error("Service not ready, please wait")
                return
            # 处理业务请求逻辑
    
  • 排查SSE连接异常
    在服务端添加日志,记录每个SSE连接的建立、初始化、断开事件,定位是否存在频繁重连的异常连接,这类场景可能导致旧连接未清理完成时新请求提前到达。


内容的提问来源于stack exchange,提问作者Dangerman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:24:51