uvicorn ASGI服务器 部署 fastmcp服务 --踩坑记录

1、基础部署

fastmcp 本身提供基础部署方案,如下:

from fastmcp import FastMCP

mcp = FastMCP(name="MyServer")

@mcp.tool
def hello(name: str) -> str:
    return f"Hello, {name}!"

if __name__ == "__main__":
    mcp.run()
    # 指定运行端口、协议、监听地址
    # mcp.run(host="0.0.0.0", port=12389, transport="streamable-http")

这种方案有一个弊端,当llm发起并发调用工具时,部分请求会超时,如下图(实测超过4个并发就很容易有部分请求超时):
image

因此这种基础方案只适用于本地测试用,如果上产环境会有很大隐患

2、ASGI 服务器部署

根据官网文档,fastmcp支持使用asgi服务器部署
参考链接:https://gofastmcp.com/deployment/asgi
参考代码:

from fastmcp import FastMCP
import uvicorn

mcp = FastMCP("MyServer")

http_app = mcp.http_app()

if __name__ == "__main__":
    uvicorn.run(http_app, host="0.0.0.0", port=8000)

命令行:

uvicorn path.to.your.app:http_app --host 0.0.0.0 --port 8000

到这看似一切正确,但是使用过 uvicorn 部署方案方案的同学都因该清楚,uvicorn 部署时可以填写 workers (进程数),如果不填写默认就是1, 1个进程
如果workers=1 还是单进程部署,那就失去了使用 uvicorn的意义

坑点:
当你尝试添加 workers, 使用mcp client时会报错,无法正常使用 | 连接 mcp server

uvicorn.run("main:http_app", host="0.0.0.0", port=8080, workers=4)

启动正常
image

通过cherry studio 添加 mcp 服务报错,无法正常使用 mcp server
image

3、解决方案

posted @ 2025-06-12 17:07  KaishinWE  阅读(678)  评论(0)    收藏  举报