Python FastMCP中文文档

FastMCP v2 🚀

构建 MCP 服务器和客户端的快速、Pythonic 方式。

FastMCP 2.0 和官方 MCP SDK

觉得 FastMCP 这个名字眼熟吗?您可能见过贡献给官方 MCP Python SDK 的版本,该版本基于 FastMCP 1.0

欢迎来到 FastMCP 2.0! 这是积极开发的继任者,它在 1.0 的基础上进行了显著扩展,引入了强大的客户端功能、服务器代理和组合、OpenAPI/FastAPI 集成以及更多高级特性。

FastMCP 2.0 是构建现代化、强大 MCP 应用程序的推荐路径。准备好升级或开始使用了吗?请遵循安装说明,其中包含从官方 MCP SDK 升级的具体步骤。


模型上下文协议 (MCP) 是一种全新的标准化方式,用于向您的 LLM 提供上下文和工具,而 FastMCP 使构建 MCP 服务器和客户端变得简单直观。使用简洁的 Pythonic 代码创建工具、暴露资源、定义提示并连接组件。

# server.py
from fastmcp import FastMCP

mcp = FastMCP("演示 🚀")

@mcp.tool()
def add(a: int, b: int) -> int:
    """两个数字相加"""
    return a + b

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

在本地运行服务器:

fastmcp run server.py

📚 文档

FastMCP 的完整文档可在 gofastmcp.com 获取,包括详细指南、API 参考和高级模式。此 readme 文件仅提供高级概述。

文档也以 llms.txt 格式 提供,这是一种 LLM 可以轻松使用的简单 Markdown 标准。

有两种方式可以访问 LLM 友好的文档:

  • llms.txt 本质上是一个站点地图,列出了文档中的所有页面。
  • llms-full.txt 包含完整的文档。请注意,这可能会超出您 LLM 的上下文窗口。

目录


什么是 MCP?

模型上下文协议 (MCP) 允许您构建服务器,以安全、标准化的方式向 LLM 应用程序暴露数据和功能。可以将其视为 Web API,但专为 LLM 交互设计。MCP 服务器可以:

  • 通过资源暴露数据(类似于 GET 请求;将信息加载到上下文中)
  • 通过工具提供功能(类似于 POST/PUT 请求;执行操作)
  • 通过提示定义交互模式(可重用模板)
  • 以及更多!

FastMCP 为构建和与这些服务器交互提供了高级的、Pythonic 的接口。

为什么选择 FastMCP?

MCP 协议功能强大,但实现它涉及大量样板代码——服务器设置、协议处理程序、内容类型、错误管理。FastMCP 处理所有复杂的协议细节和服务器管理,因此您可以专注于构建出色的工具。它被设计为高级且 Pythonic 的;在大多数情况下,您只需要装饰一个函数即可。

虽然 FastMCP 1.0 的核心服务器概念奠定了基础并被贡献给了官方 MCP SDK,但 FastMCP 2.0(本项目)是积极开发的继任者,增加了显著的增强功能和全新的能力,例如强大的客户端库、服务器代理组合模式、OpenAPI/FastAPI 集成等等。

FastMCP 旨在:

🚀 快速: 高级接口意味着更少的代码和更快的开发速度

🍀 简单: 以最少的样板代码构建 MCP 服务器

🐍 Pythonic: 对 Python 开发者而言感觉自然

🔍 完整: FastMCP 旨在为服务器和客户端提供核心 MCP 规范的完整实现

安装

我们建议使用 uv 安装 FastMCP:

uv pip install fastmcp

有关完整的安装说明,包括验证、从官方 MCPSDK 升级和开发者设置,请参阅安装指南

核心概念

这些是使用 FastMCP 创建 MCP 服务器和客户端的构建块。

The FastMCP 服务器

代表您的 MCP 应用程序的中心对象。它包含您的工具、资源和提示,管理连接,并且可以通过诸如身份验证提供者之类的设置进行配置。

from fastmcp import FastMCP

# 创建一个服务器实例
mcp = FastMCP(name="我的助手服务器")

FastMCP 服务器文档中了解更多。

工具

工具允许 LLM 通过执行您的 Python 函数(同步或异步)来执行操作。非常适合计算、API 调用或副作用(如 POST/PUT)。FastMCP 根据类型提示和文档字符串处理模式生成。工具可以返回各种类型,包括文本、JSON 可序列化对象,甚至使用 fastmcp.Image 助手的图像。

@mcp.tool()
def multiply(a: float, b: float) -> float:
    """将两个数字相乘。"""
    return a * b

工具文档中了解更多。

资源与模板

资源暴露只读数据源(如 GET 请求)。使用 @mcp.resource("your://uri")。在 URI 中使用 {占位符} 来创建接受参数的动态模板,允许客户端请求特定的数据子集。

# 静态资源
@mcp.resource("config://version")
def get_version():
    return "2.0.1"

# 动态资源模板
@mcp.resource("users://{user_id}/profile")
def get_profile(user_id: int):
    # 获取 user_id 的配置文件...
    return {"name": f"用户 {user_id}", "status": "active"}

资源与模板文档中了解更多。

提示

提示定义可重用的消息模板以指导 LLM 交互。使用 @mcp.prompt() 装饰函数。返回字符串或 Message 对象。

@mcp.prompt()
def summarize_request(text: str) -> str:
    """生成一个请求摘要的提示。"""
    return f"请总结以下文本:\n\n{text}"

提示文档中了解更多。

上下文

通过添加 ctx: Context 参数,在您的工具、资源或提示中访问 MCP 会话功能。上下文提供以下方法:

  • 日志记录: 使用 ctx.info()ctx.error() 等向 MCP 客户端记录消息。
  • LLM 采样: 使用 ctx.sample() 请求客户端 LLM 的补全。
  • HTTP 请求: 使用 ctx.http_request() 向其他服务器发出 HTTP 请求。
  • 资源访问: 使用 ctx.read_resource() 访问服务器上的资源。
  • 进度报告: 使用 ctx.report_progress() 向客户端报告进度。
  • 以及更多...

要访问上下文,请向任何 mcp 装饰的函数添加一个注解为 Context 的参数。当函数被调用时,FastMCP 将自动注入正确的上下文对象。

from fastmcp import FastMCP, Context

mcp = FastMCP("我的 MCP 服务器")

@mcp.tool()
async def process_data(uri: str, ctx: Context):
    # 向客户端记录一条消息
    await ctx.info(f"正在处理 {uri}...")

    # 从服务器读取资源
    data = await ctx.read_resource(uri)

    # 请求客户端 LLM 总结数据
    summary = await ctx.sample(f"总结:{data.content[:500]}")

    # 返回摘要
    return summary.text

上下文文档中了解更多。

MCP 客户端

使用 fastmcp.Client 以编程方式与任何 MCP 服务器交互。它支持各种传输方式(Stdio、SSE、内存中),并且通常会自动检测正确的传输方式。如果您提供适当的处理程序,客户端还可以处理高级模式,例如服务器发起的 LLM 采样请求

至关重要的是,客户端允许通过 FastMCPTransport 直接连接到 FastMCP 服务器实例,从而实现服务器的有效内存中测试,无需在测试期间进行进程管理或网络调用。

from fastmcp import Client

async def main():
    # 通过 stdio 连接到本地脚本
    async with Client("my_server.py") as client:
        tools = await client.list_tools()
        print(f"可用工具:{tools}")
        result = await client.call_tool("add", {"a": 5, "b": 3})
        print(f"结果:{result.text}")

    # 通过 SSE 连接
    async with Client("http://localhost:8000/sse") as client:
        # ... 使用客户端
        pass

要使用客户端测试服务器,请使用以下模式:

from fastmcp import FastMCP, Client

mcp = FastMCP("我的 MCP 服务器")

async def main():
    # 通过内存中传输连接
    async with Client(mcp) as client:
        # ... 使用客户端

客户端文档传输文档中了解更多。

高级特性

FastMCP 引入了构建和部署 MCP 应用程序的强大方法。

代理服务器

使用 FastMCP.from_client() 创建一个 FastMCP 服务器,作为另一个本地或远程 MCP 服务器的中介。这对于桥接传输(例如,远程 SSE 到本地 Stdio)或向您无法控制的服务器添加逻辑层特别有用。

代理文档中了解更多。

组合 MCP 服务器

通过使用 mcp.mount()(实时链接)或 mcp.import_server()(静态副本)将多个 FastMCP 实例挂载到父服务器上,构建模块化应用程序。

组合文档中了解更多。

OpenAPI 与 FastAPI 生成

从现有的 OpenAPI 规范(FastMCP.from_openapi())或 FastAPI 应用程序(FastMCP.from_fastapi())自动生成 FastMCP 服务器,立即将您的 Web API 引入 MCP 生态系统。

了解更多:OpenAPI 集成 | FastAPI 集成

运行您的服务器

运行 FastMCP 服务器的主要方法是在服务器实例上调用 run() 方法:

# server.py
from fastmcp import FastMCP

mcp = FastMCP("演示 🚀")

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

if __name__ == "__main__":
    mcp.run()  # 默认:使用 STDIO 传输

FastMCP 支持三种传输协议:

STDIO (默认):最适合本地工具和命令行脚本。

mcp.run(transport="stdio")  # 默认,因此 transport 参数是可选的

可流式 HTTP (Streamable HTTP):推荐用于 Web 部署。

mcp.run(transport="streamable-http", host="127.0.0.1", port=8000, path="/mcp")

SSE:用于与现有 SSE 客户端兼容。

mcp.run(transport="sse", host="127.0.0.1", port=8000)

有关更多详细信息,请参阅运行服务器文档

posted @ 2025-05-16 14:52  qiao39gs  阅读(5106)  评论(0)    收藏  举报