FastMCP服务器可以根据应用程序的需求以不同方式运行,从本地命令行工具到持久化Web服务。本指南涵盖了运行服务器的主要方法,重点介绍可用的传输协议:STDIO、可流式HTTP和SSE。

run() 方法

可以通过在FastMCP实例上调用run()方法直接从Python运行FastMCP服务器。

为了获得最佳的兼容性,最佳实践是将run()调用放在if __name__ == "__main__":代码块中。这样可以确保服务器仅在脚本直接执行时启动,而不是在被作为模块导入时启动。

my_server.py
from fastmcp import FastMCP

mcp = FastMCP(name="MyServer")

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

if __name__ == "__main__":
    mcp.run()

现在你可以通过执行python my_server.py来运行这个MCP服务器。

MCP服务器可以根据应用程序的需求,使用多种不同的传输选项运行。run()方法可以接收transport参数和其他特定于传输的关键字参数,用于配置服务器的运行方式。

FastMCP 命令行界面

FastMCP 还提供了无需修改源代码即可运行服务器的命令行界面。安装 FastMCP 后,您可以直接从命令行运行服务器:

fastmcp run server.py

重要提示:使用fastmcp run时,它会完全忽略if __name__ == "__main__"代码块。相反,它会查找名为mcpserverapp的FastMCP对象,并直接调用其run()方法,同时使用您指定的传输选项。

这意味着你可以使用fastmcp run来覆盖代码中指定的传输方式,这对于测试或更改部署方法而无需修改代码特别有用。

您可以指定传输选项和其他配置:

fastmcp run server.py --transport sse --port 9000

为了开发和测试,你可以使用dev命令来运行带有MCP检查器的服务器:

fastmcp dev server.py

查看CLI文档获取所有可用命令和选项的详细信息。

传输选项

以下是可用传输选项的对比,帮助您根据需求选择合适的方式:

传输方式使用场景推荐方案
STDIO本地工具、命令行脚本以及与Claude Desktop等客户端的集成最适合本地工具及由客户端管理服务器进程的场景
可流式HTTP基于Web的部署、微服务、通过网络暴露MCP基于Web部署的推荐选择
SSE现有基于网页的部署依赖SSE已弃用 - 新项目建议使用Streamable HTTP

标准输入输出

STDIO传输是本地MCP服务器执行的默认且兼容性最广的选项。它非常适合本地工具、命令行集成以及像Claude Desktop这样的客户端。然而,它的缺点是需要本地运行MCP代码,这可能带来第三方服务器的安全隐患。

STDIO是默认传输方式,因此在调用run()时无需特别指定。不过,你可以显式地指定它以明确你的意图:

from fastmcp import FastMCP

mcp = FastMCP()

if __name__ == "__main__":
    mcp.run(transport="stdio")

使用Stdio传输时,通常不需要将服务器作为独立进程运行。相反,您的客户端会为每个会话启动一个新的服务器进程。因此,无需额外配置。

可流式传输的HTTP

New in version: 2.3.0

Streamable HTTP 是一种现代化的高效传输协议,用于通过HTTP公开您的MCP服务器。它是基于Web部署场景的推荐传输方案。

要使用Streamable HTTP运行服务器,可以使用run()方法,并将transport参数设置为"streamable-http"。这将在默认主机(127.0.0.1)、端口(8000)和路径(/mcp)上启动一个Uvicorn服务器。

from fastmcp import FastMCP

mcp = FastMCP()

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

要自定义主机、端口、路径或日志级别,请向run()方法提供适当的关键字参数。

from fastmcp import FastMCP

mcp = FastMCP()

if __name__ == "__main__":
    mcp.run(
        transport="streamable-http",
        host="127.0.0.1",
        port=4200,
        path="/my-custom-path",
        log_level="debug",
    )

SSE

SSE传输方式已被弃用,可能在未来的版本中移除。 新应用程序应改用可流式HTTP传输。

Server-Sent Events (SSE) 是一种基于HTTP的服务器到客户端流传输协议。虽然FastMCP仍支持SSE,但该协议已被弃用,在新项目中建议使用Streamable HTTP。

要使用SSE运行服务器,可以使用run()方法并将transport参数设置为"sse"。这将在默认主机(127.0.0.1)、默认端口(8000)上启动一个Uvicorn服务器,并使用默认的SSE路径(/sse)和消息路径(/messages/)。

from fastmcp import FastMCP

mcp = FastMCP()

if __name__ == "__main__":
    mcp.run(transport="sse")

请注意,上述示例中的客户端使用了显式的SSETransport来连接服务器。FastMCP会尝试根据提供的配置推断合适的传输方式,但从FastMCP 2.3.0版本开始,HTTP URL默认会被视为可流式HTTP。

要自定义主机、端口或日志级别,请向run()方法提供适当的关键字参数。您还可以调整SSE路径(客户端应连接的位置)和消息POST端点(客户端用于发送后续消息)。

from fastmcp import FastMCP

mcp = FastMCP()

if __name__ == "__main__":
    mcp.run(
        transport="sse",
        host="127.0.0.1",
        port=4200,
        log_level="debug",
        path="/my-custom-sse-path",
    )

异步使用

FastMCP为运行您的服务器提供了同步和异步两种API。前面示例中看到的run()方法是一个同步方法,它在内部使用anyio.run()来运行异步服务器。对于已经在异步上下文中运行的应用程序,FastMCP提供了run_async()方法。

from fastmcp import FastMCP
import asyncio

mcp = FastMCP(name="MyServer")

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

async def main():
    # Use run_async() in async contexts
    await mcp.run_async(transport="streamable-http")

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

run()方法不能从异步函数内部调用,因为它已经在内部创建了自己的异步事件循环。如果尝试从异步函数内部调用run(),将会收到关于事件循环已在运行中的错误。

在异步函数中始终使用run_async(),在同步上下文中使用run()

run()run_async() 都接受相同的传输参数,因此上述所有示例都适用于这两种方法。

自定义路由

您还可以向FastMCP服务器添加自定义Web路由,这些路由将与MCP端点一起暴露。为此,请使用@custom_route装饰器。请注意,这比使用完整的ASGI框架灵活性较低,但对于向独立服务器添加健康检查等简单端点非常有用。

from fastmcp import FastMCP
from starlette.requests import Request
from starlette.responses import PlainTextResponse

mcp = FastMCP("MyServer")

@mcp.custom_route("/health", methods=["GET"])
async def health_check(request: Request) -> PlainTextResponse:
    return PlainTextResponse("OK")

if __name__ == "__main__":
    mcp.run()