fastmcp: 更好用的 MCP Python 框架

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)
<think>好的,用户想了解金仓数据库对MySQL YEAR函数的兼容性。首先,我需要确认KingbaseES是否有直接支持YEAR函数。根据引用内容,KingbaseES对未原生支持的MySQL功能提供了移植建议,比如数据类型或语法转换。可能YEAR函数不在原生支持中,但可能有替代方法。 接下来,检查是否有插件或配置可以启用兼容性。例如,引用3提到加载kdb_exists_expand插件来优化EXISTS子链接,说明插件机制可以扩展功能。可能KingbaseES通过类似的插件支持MySQL函数。 然后,考虑函数替代方案。MySQL的YEAR函数提取日期中的年份,KingbaseES可能使用EXTRACT(YEAR FROM date_column)来实现相同效果。需要确认语法是否正确,并给出示例。 另外,用户可能需要修改应用代码中的SQL语句,将YEAR(date)替换为EXTRACT形式。如果有兼容性模式或参数设置,比如设置sql_mode为mysql,可能自动处理函数替换,如引用1中的移植建议。 还要注意日期格式的兼容性,确保输入的日期字符串能被正确解析,可能需要使用TO_DATE函数转换,如引用2中的函数转换示例。 总结回答结构:1. 直接兼容性情况;2. 替代方案;3. 插件或配置支持;4. 应用层修改建议;5. 注意事项。同时生成相关问题,覆盖移植策略、日期处理和其他函数兼容性。</think>关于金仓数据库(KingbaseES)对MySQL的`YEAR`函数的兼容性,以下是综合分析: 1. **直接兼容性** 金仓数据库未原生支持MySQL的`YEAR(date)`函数[^1]。若直接使用该函数,会触发语法错误。例如,执行`SELECT YEAR('2023-10-01');`会报错。 2. **替代实现方案** KingbaseES可通过标准SQL函数`EXTRACT`实现相同功能: ```sql SELECT EXTRACT(YEAR FROM date_column) FROM table_name; ``` 例如,`SELECT EXTRACT(YEAR FROM TIMESTAMP '2023-10-01');`将返回`2023`。 3. **插件扩展支持** 若启用了MySQL兼容模式(如通过`kdb_ora_parser`或`kdb_mysql_parser`插件),部分MySQL函数可能被映射为等效实现。需通过参数`sql_mode`设置为`mysql`激活此特性。 4. **应用层适配建议** 移植MySQL应用时,需将`YEAR(date)`统一替换为`EXTRACT(YEAR FROM date)`。例如: ```sql -- MySQL原语句 SELECT YEAR(create_time) FROM orders; -- KingbaseES修改后 SELECT EXTRACT(YEAR FROM create_time) FROM orders; ``` 5. **日期格式注意事项** 若日期字段为字符串类型,需先通过`TO_DATE`转换: ```sql SELECT EXTRACT(YEAR FROM TO_DATE('2023-10-01', 'YYYY-MM-DD')); ``` ### 引用依据 - KingbaseES对未原生支持的MySQL功能提供移植方案(如数据类型和函数替换) - 通过插件机制可扩展语法兼容性(如`kdb_exists_expand`优化器插件)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值