[ PROMPT_NODE_24768 ]
自定义提供程序
[ SKILL_DOCUMENTATION ]
> 构建从任何数据源获取组件的提供程序
自定义提供程序允许您从任何地方获取组件——数据库、API、配置系统或动态运行时逻辑。只要您能编写 Python 代码来获取或生成组件,就可以将其封装在提供程序中。
## 何时构建自定义提供程序
内置提供程序处理常见情况:装饰器 (`LocalProvider`)、组合 (`FastMCPProvider`) 和代理 (`ProxyProvider`)。当您的组件来自其他地方时,请构建自定义提供程序:
* **数据库支持的工具**:管理员在数据库中定义工具,服务器动态公开它们
* **API 支持的资源**:按需从外部服务获取内容的资源
* **配置驱动的组件**:在启动时从 YAML/JSON 配置文件加载的组件
* **多租户系统**:不同的用户根据其权限看到不同的工具
* **插件系统**:第三方代码在运行时注册组件
## 提供程序 vs 中间件
提供程序和中间件都可以影响客户端看到的组件,但它们在不同层面工作。
**提供程序**是获取组件的对象。它们使您可以轻松理清工具、资源和提示词的来源——数据库、其他服务器或 API。
**中间件**拦截单个请求。它非常适合处理特定于请求的决策,如日志记录、速率限制或身份验证。
您*可以*使用中间件根据请求上下文动态添加工具。但通常更清晰的做法是让提供程序获取所有可能的工具,然后使用中间件或可见性控制来过滤每个请求可以看到的内容。这种分离使得理清组件如何获取以及它们如何与其他服务器机制交互变得更加容易。
## 提供程序接口
提供程序实现受保护的 `_list_*` 方法,这些方法返回可用组件。公共的 `list_*` 方法会自动处理转换——您只需覆盖带有下划线前缀的版本:
python
from collections.abc import Sequence
from fastmcp.server.providers import Provider
from fastmcp.tools import Tool
from fastmcp.resources import Resource
from fastmcp.prompts import Prompt
class MyProvider(Provider):
async def _list_tools(self) -> Sequence[Tool]:
"""返回此提供程序提供的所有工具。"""
return []
async def _list_resources(self) -> Sequence[Resource]:
"""返回此提供程序提供的所有资源。"""
return []
async