虽然FastMCP提供独立的服务器功能,您也可以将FastMCP服务器集成到现有的Web应用程序中。这种方法适用于:

  • 向现有网站或API添加MCP功能
  • 将MCP服务器挂载到特定URL路径下
  • 在单个应用中集成多个服务
  • 利用现有的身份验证和中间件

请注意,所有FastMCP服务器都有一个run()方法可用于启动服务器。本指南主要关注与更广泛的ASGI框架的集成。

ASGI服务器

FastMCP服务器可以作为Starlette ASGI应用程序创建,便于直接托管或集成到现有应用中。

第一步是使用http_app()方法从您的FastMCP服务器获取一个Starlette应用实例:

http_app() 方法是 FastMCP 2.3.2 中新增的。在旧版本中,使用 sse_app() 进行 SSE 传输或使用 streamable_http_app() 进行 Streamable HTTP 传输。

from fastmcp import FastMCP

mcp = FastMCP("MyServer")

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

# Get a Starlette app instance for Streamable HTTP transport (recommended)
http_app = mcp.http_app()

# For legacy SSE transport (deprecated)
sse_app = mcp.http_app(transport="sse")

两种方法都会返回一个可与其它ASGI兼容的Web框架集成的Starlette应用。

MCP服务器的端点挂载在根路径/mcp用于可流式HTTP传输,以及/sse用于SSE传输,不过您可以通过向http_app()方法传递path参数来更改这些路径:

# For Streamable HTTP transport
http_app = mcp.http_app(path="/custom-mcp-path")

# For SSE transport (deprecated)
sse_app = mcp.http_app(path="/custom-sse-path", transport="sse")

运行服务器

要运行FastMCP服务器,您可以使用uvicorn 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

自定义中间件

New in version: 2.3.2

您可以通过向应用创建方法传递中间件实例列表,为FastMCP ASGI应用添加自定义Starlette中间件:

from fastmcp import FastMCP
from starlette.middleware import Middleware
from starlette.middleware.cors import CORSMiddleware

# Create your FastMCP server
mcp = FastMCP("MyServer")

# Define custom middleware
custom_middleware = [
    Middleware(CORSMiddleware, allow_origins=["*"]),
]

# Create ASGI app with custom middleware
http_app = mcp.http_app(middleware=custom_middleware)

Starlette 集成

New in version: 2.3.1

您可以将FastMCP服务器挂载到另一个Starlette应用程序中:

from fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Mount

# Create your FastMCP server as well as any tools, resources, etc.
mcp = FastMCP("MyServer")

# Create the ASGI app
mcp_app = mcp.http_app(path='/mcp')

# Create a Starlette app and mount the MCP server
app = Starlette(
    routes=[
        Mount("/mcp-server", app=mcp_app),
        # Add other routes as needed
    ],
    lifespan=mcp_app.router.lifespan_context,
)

MCP端点将在生成的Starlette应用的/mcp-server/mcp路径下可用。

对于可流式传输的HTTP传输,您必须将生命周期上下文从FastMCP应用传递到生成的Starlette应用,因为嵌套的生命周期不会被识别。否则,FastMCP服务器的会话管理器将无法正确初始化。

嵌套挂载

您可以通过嵌套挂载创建复杂的路由结构:

from fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Mount

# Create your FastMCP server as well as any tools, resources, etc.
mcp = FastMCP("MyServer")

# Create the ASGI app
mcp_app = mcp.http_app(path='/mcp')

# Create nested application structure
inner_app = Starlette(routes=[Mount("/inner", app=mcp_app)])
app = Starlette(
    routes=[Mount("/outer", app=inner_app)],
    lifespan=mcp_app.router.lifespan_context,
)

在此设置中,MCP服务器可通过生成的Starlette应用程序的/outer/inner/mcp路径访问。

对于可流式传输的HTTP传输,您必须将生命周期上下文从FastMCP应用传递到外部Starlette应用,因为嵌套的生命周期不会被识别。否则,FastMCP服务器的会话管理器将无法正确初始化。

FastAPI集成

New in version: 2.3.1

FastAPI基于Starlette构建,因此您可以用类似的方式挂载FastMCP服务器:

from fastmcp import FastMCP
from fastapi import FastAPI
from starlette.routing import Mount

# Create your FastMCP server as well as any tools, resources, etc.
mcp = FastMCP("MyServer")

# Create the ASGI app
mcp_app = mcp.http_app(path='/mcp')

# Create a FastAPI app and mount the MCP server
app = FastAPI(lifespan=mcp_app.router.lifespan_context)
app.mount("/mcp-server", mcp_app)

MCP端点将在生成的FastAPI应用的/mcp-server/mcp路径下可用。

对于可流式传输的HTTP传输,您必须将生命周期上下文从FastMCP应用传递到生成的FastAPI应用,因为嵌套的生命周期不会被识别。否则,FastMCP服务器的会话管理器将无法正确初始化。

自定义路由

除了将您的FastMCP服务器添加到现有的ASGI应用程序中,您还可以向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")

当FastMCP应用被挂载到您的Web应用程序中时,这些路由将被包含在内。