欢迎光临
我们一直在努力

09_FastMCP 2.x 干货笔记之 FastMCP 服务端高级功能:服务器组成详解

一、服务器组合

通过挂载和导入将多个 FastMCP 服务器组合成单个更大的应用程序。

新版本 2.2.0 功能

随着 MCP 应用程序的增长,您可能希望将工具、资源和提示组织到逻辑模块中,或重用现有的服务器组件。FastMCP 通过两种方法支持组合:

  • import_server:用于带前缀的组件一次性复制(静态组合)。
  • mount:用于创建主服务器将请求委托给子服务器的实时链接(动态组合)。

更多相关视频教程: 👉 《FastMCP快速入门教程》

更多相关文章内容: 👉 《FastMCP 2.x 干货笔记》专栏

二、为什么需要组合服务器?

模块化:将大型应用程序分解为更小、专注的服务器(例如,WeatherServer、DatabaseServer、CalendarServer)。

  • 可重用性:创建通用工具服务器(例如,TextProcessingServer)并在需要的地方挂载它们。
  • 团队协作:不同的团队可以分别处理独立的 FastMCP 服务器,之后再进行组合。
  • 组织性:将相关功能按逻辑分组。

三、导入 vs 挂载

选择导入还是挂载取决于您的用例和需求。 在这里插入图片描述

四、代理服务器

FastMCP 支持 MCP 代理,允许您在本地 FastMCP 实例中镜像本地或远程服务器。代理与导入和挂载完全兼容。

新版本 2.4.0 功能

您还可以从遵循 MCPConfig 模式的配置字典创建代理,这对于快速连接到一个或多个远程服务器非常有用。有关基于配置的代理的详细信息,请参阅代理服务器文档。请注意,MCPConfig 遵循一个新兴标准,其格式可能会随时间演变。

工具、提示、资源和模板的前缀规则在导入、挂载和代理中都是相同的。

五、导入(静态组合)

import_server() 方法将一个 FastMCP 实例(子服务器)的所有组件(工具、资源、模板、提示)复制到另一个实例(主服务器)中。可以提供可选的 prefix 以避免命名冲突。如果未提供前缀,组件将不经修改地导入。当多个服务器以相同的前缀(或无前缀)导入时,最近导入的服务器的组件优先。

from fastmcp import FastMCP
import asyncio

# 定义子服务器
weather_mcp = FastMCP(name=\”WeatherService\”)

@weather_mcp.tool
def get_forecast(city: str) > dict:
\”\”\”获取天气预报。\”\”\”
return {

\”city\”: city, \”forecast\”: \”Sunny\”}

@weather_mcp.resource(\”data://cities/supported\”)
def list_supported_cities() > list[str]:
\”\”\”列出支持天气的城市。\”\”\”
return [\”London\”, \”Paris\”, \”Tokyo\”]

# 定义主服务器
main_mcp = FastMCP(name=\”MainApp\”)

# 导入子服务器
async def setup():
await main_mcp.import_server(weather_mcp, prefix=\”weather\”)

# 结果:main_mcp 现在包含带前缀的组件:
# – 工具:\”weather_get_forecast\”
# – 资源:\”data://weather/cities/supported\”

if __name__ == \”__main__\”:
asyncio.run(setup())
main_mcp.run()

5.1 导入的工作原理

当您调用 await main_mcp.import_server(subserver, prefix={whatever}) 时: 工具:subserver 的所有工具都添加到 main_mcp 中,名称使用 {prefix}_ 前缀。

  • subserver.tool(name=“my_tool”) 变为 main_mcp.tool(name=“{prefix}_my_tool”)。 资源:所有资源都添加了前缀的 URI 和名称。
  • URI:subserver.resource(uri=“data://info”) 变为 main_mcp.resource(uri=“data://{prefix}/info”)。
  • 名称:resource.name 变为 “{prefix}_{resource.name}”。 资源模板:模板的前缀方式与资源类似。
  • URI:subserver.resource(uri=“data://{id}”) 变为 main_mcp.resource(uri=“data://{prefix}/{id}”)。
  • 名称:template.name 变为 \”{prefix}{template.name}\”。 提示:所有提示都添加了使用 {prefix} 前缀的名称。
  • subserver.prompt(name=“my_prompt”) 变为 main_mcp.prompt(name=“{prefix}_my_prompt”)。

请注意,import_server 执行组件的一次性复制。在导入之后对 subserver 所做的更改不会反映在 main_mcp 中。subserver 的 lifespan 上下文也不会由主服务器执行。

提示:prefix 参数是可选的。如果省略,组件将不经修改地导入。

5.2 无前缀导入

新版本 2.9.0 功能

您也可以导入服务器而不指定前缀,这会使用其原始名称复制组件:

from fastmcp import FastMCP
import asyncio

# 定义子服务器
weather_mcp = FastMCP(name=\”WeatherService\”)

@weather_mcp.tool
def get_forecast(city: str) > dict:
\”\”\”获取天气预报。\”\”\”
return {

\”city\”

赞(0)
未经允许不得转载:171主机测评 » 09_FastMCP 2.x 干货笔记之 FastMCP 服务端高级功能:服务器组成详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址