fastmcp: 更好用的 MCP Python 框架

发布于:2025-05-10 ⋅ 阅读:(7) ⋅ 点赞:(0)

GitHubhttps://github.com/jlowin/fastmcp

更多AI开源软件发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI

用于构建 MCP(Model Context Protocol)服务器和客户端的 Python 框架,帮助开发者以更快速、简洁的方式向 LLM 暴露数据资源和工具。相比官方 SDK,它的 API 设计更加简洁、开发效率更高,且具备更强的可扩展性,支持多种客户端/服务端传输模式(Stdio、SSE、内存)、资源模板机制,并可通过 OpenAPI/FastAPI 自动生成 MCP 服务,极大地降低了 MCP 服务器与客户端的开发门槛。

主要功能:

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

🍀 简单:使用最少的样板构建 MCP 服务器

🐍 Pythonic:对 Python 开发人员来说感觉很自然

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

安装和使用

我们建议使用 uv 安装 FastMCP:

uv pip install fastmcp

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

开始使用

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

服务器FastMCP​

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

from fastmcp import FastMCP

# Create a server instance
mcp = FastMCP(name="MyAssistantServer")

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

工具

工具允许 LLM 通过执行 Python 函数(同步或异步)来执行作。非常适合计算、API 调用或副作用(如 /)。FastMCP 处理从类型提示和文档字符串生成架构。工具可以使用 fastmcp 返回各种类型的内容,包括文本、JSON 可序列化对象,甚至图像。图像辅助方法。POSTPUT​

@mcp.tool()
def multiply(a: float, b: float) -> float:
    """Multiplies two numbers."""
    return a * b

工具文档中了解更多信息。

资源和模板

资源公开只读数据源(如请求)。用。在 URI 中使用可创建接受参数的动态模板,从而允许客户端请求特定数据子集。GET@mcp.resource("your://uri"){placeholders}​

# Static resource
@mcp.resource("config://version")
def get_version(): 
    return "2.0.1"

# Dynamic resource template
@mcp.resource("users://{user_id}/profile")
def get_profile(user_id: int):
    # Fetch profile for user_id...
    return {"name": f"User {user_id}", "status": "active"}

资源和模板文档中了解更多信息。

提示

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

@mcp.prompt()
def summarize_request(text: str) -> str:
    """Generate a prompt asking for a summary."""
    return f"Please summarize the following text:\n\n{text}"

Prompts 文档中了解更多信息。

上下文

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

  • 伐木:使用 、 等将消息记录到 MCP 客户端。ctx.info()ctx.error()​
  • LLM 采样:用于从客户端的 LLM 请求完成。ctx.sample()​
  • HTTP 请求:用于向其他服务器发出 HTTP 请求。ctx.http_request()​
  • 资源访问:用于访问服务器上的资源ctx.read_resource()​
  • 进度报告:用于向客户端报告进度。ctx.report_progress()​
  • 以及更多...

要访问上下文,请添加一个带 Comments 的参数,该参数被注释为任何 mcp 修饰的函数。FastMCP 将在调用函数时自动注入正确的上下文对象。Context​

from fastmcp import FastMCP, Context

mcp = FastMCP("My MCP Server")

@mcp.tool()
async def process_data(uri: str, ctx: Context):
    # Log a message to the client
    await ctx.info(f"Processing {uri}...")

    # Read a resource from the server
    data = await ctx.read_resource(uri)

    # Ask client LLM to summarize the data
    summary = await ctx.sample(f"Summarize: {data.content[:500]}")

    # Return the summary
    return summary.text

上下文文档中了解更多信息。

MCP 客户端

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

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

from fastmcp import Client

async def main():
    # Connect via stdio to a local script
    async with Client("my_server.py") as client:
        tools = await client.list_tools()
        print(f"Available tools: {tools}")
        result = await client.call_tool("add", {"a": 5, "b": 3})
        print(f"Result: {result.text}")

    # Connect via SSE
    async with Client("http://localhost:8000/sse") as client:
        # ... use the client
        pass

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

from fastmcp import FastMCP, Client

mcp = FastMCP("My MCP Server")

async def main():
    # Connect via in-memory transport
    async with Client(mcp) as client:
        # ... use the client

实战演习

场景1:代理服务器

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

代理文档 中了解更多信息。

场景2:编写 MCP 服务器

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

合成文档中了解更多信息。

场景3:OpenAPI & FastAPI 生成

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

知道更多: OpenAPI 整合 |FastAPI 集成

场景4:运行服务器

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

# server.py
from fastmcp import FastMCP

mcp = FastMCP("Demo 🚀")

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

if __name__ == "__main__":
    mcp.run()  # Default: uses STDIO transport

FastMCP 支持三种传输协议:

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

mcp.run(transport="stdio")  # Default, so transport argument is optional

可流式传输 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)

网站公告

今日签到

点亮在社区的每一天
去签到