服务器组成
通过挂载和导入功能,将多个FastMCP服务器整合为一个更大的应用程序。
New in version: 2.2.0
随着您的MCP应用程序不断发展,您可能希望将工具、资源和提示组织成逻辑模块,或复用现有的服务器组件。FastMCP通过两种方式支持组合:
import_server: 用于带前缀的组件一次性复制(静态组合)。mount: 用于创建实时链接,主服务器将请求委托给子服务器(动态组合)。
为什么要组合服务器?
- 模块化: 将大型应用拆分为更小、功能专注的服务器(例如
WeatherServer、DatabaseServer、CalendarServer)。 - 可复用性: 创建通用的工具服务器(例如
TextProcessingServer),并在需要的地方挂载它们。 - 团队协作: 不同团队可以在独立的FastMCP服务器上工作,之后再合并。
- 组织: 将相关功能按逻辑分组在一起。
导入与挂载
选择导入还是挂载取决于您的使用场景和需求。
| 功能 | 导入 | 挂载 |
|---|---|---|
| Method | FastMCP.import_server() | FastMCP.mount() |
| 组合类型 | 一次性复制(静态) | 实时链接(动态) |
| 更新情况 | 子服务器变更不会立即生效 | 子服务器变更立即生效 |
| 最佳适用场景 | 打包最终组件 | 模块化运行时组合 |
代理服务器
FastMCP支持MCP代理功能,允许您在本地FastMCP实例中镜像本地或远程服务器。代理完全兼容导入和挂载两种操作模式。
导入(静态组合)
import_server() 方法将所有组件(工具、资源、模板、提示)从一个 FastMCP 实例(子服务器)复制到另一个实例(主服务器)。添加 prefix 前缀以避免命名冲突。
导入工作原理
当你调用await main_mcp.import_server(prefix, subserver)时:
- Tools: All tools from
subserverare added tomain_mcpwith names prefixed using{prefix}_.subserver.tool(name="my_tool")变为main_mcp.tool(name="{prefix}_my_tool")。
- Resources: All resources are added with URIs prefixed using
{prefix}+.subserver.resource(uri="data://info")变为main_mcp.resource(uri="{prefix}+data://info")。
- Resource Templates: Templates are prefixed similarly to resources.
subserver.resource(uri="data://{id}")变为main_mcp.resource(uri="{prefix}+data://{id}")。
- Prompts: All prompts are added with names prefixed like tools.
subserver.prompt(name="my_prompt")变为main_mcp.prompt(name="{prefix}_my_prompt")。
请注意,import_server执行的是组件的一次性复制。导入后对subserver所做的更改不会反映在main_mcp中。subserver的lifespan上下文也不会由主服务器执行。
挂载(实时链接)
mount()方法在main_mcp服务器和subserver之间创建了一个实时链接。不同于复制组件,运行时对匹配prefix的组件请求会被委派给subserver处理。
挂载机制工作原理
当配置挂载时:
- 实时链接: 父服务器与挂载服务器建立连接。
- 动态更新: 通过父级访问时,挂载服务器的变更会立即反映出来。
- 前缀访问:父服务器使用前缀将请求路由到挂载的服务器。
- 委托: 运行时将匹配前缀的组件请求委托给已挂载的服务器。
与import_server相同的命名前缀规则适用于工具、资源、模板和提示词。
直接挂载 vs 代理挂载
New in version: 2.2.7
FastMCP支持两种挂载模式:
- Direct Mounting (default): The parent server directly accesses the mounted server’s objects in memory.
- 已挂载服务器上不会发生客户端生命周期事件
- 挂载服务器的生命周期上下文未执行
- 通信通过直接方法调用处理
- Proxy Mounting: The parent server treats the mounted server as a separate entity and communicates with it through a client interface.
- 完整的客户端生命周期事件发生在挂载的服务器上
- 挂载服务器的生命周期在客户端连接时执行
- 通信通过内存中的Client传输实现
当挂载的服务器具有自定义生命周期时,FastMCP会自动使用代理挂载,但您可以通过as_proxy参数覆盖此行为。
与代理服务器的交互
当使用FastMCP.from_client()创建代理服务器时,挂载该服务器将始终使用代理挂载方式:
自定义分隔符
无论是import_server()还是mount(),都允许您自定义用于组件前缀的分隔符。默认情况下,工具和提示使用_,资源使用+。
在选择分隔符时需谨慎。某些MCP客户端(如Claude Desktop)可能对工具名称中允许使用的字符有限制(例如,可能不支持/)。默认设置(名称使用_,URI使用+)通常是安全的。
要"干净地"导入或挂载服务器,请将前缀和所有分隔符设置为""(空字符串)。这通常是不必要的,但可以节省几个token,代价是可能发生名称冲突!