[ PROMPT_NODE_24736 ]
dependency-injection
[ SKILL_DOCUMENTATION ]
# 依赖注入
> 将运行时值(如 HTTP 请求、访问令牌和自定义依赖项)注入到您的 MCP 组件中。
FastMCP 使用依赖注入为您的工具、资源和提示词提供运行时值。您无需在代码的每一层传递上下文,只需将所需内容声明为参数默认值——FastMCP 会在函数运行时自动解析它们。
依赖注入系统由 [Docket](https://github.com/chrisguidry/docket) 提供支持。核心 DI 功能(如 `Depends()` 和 `CurrentContext()`)无需安装 Docket 即可使用。对于后台任务和高级任务相关依赖项,请安装 `fastmcp[tasks]`。有关依赖模式的全面介绍,请参阅 [Docket 依赖文档](https://chrisguidry.github.io/docket/dependencies/)。
> **注意:** 依赖参数会自动从 MCP 模式中排除——客户端永远不会将其视为可调用参数。这种分离保持了函数签名的整洁,同时让您可以访问所需的运行时上下文。
## 依赖注入的工作原理
FastMCP 中的依赖注入遵循一个简单的模式:声明一个带有已识别类型注解或依赖默认值的参数,FastMCP 会在运行时注入解析后的值。
python
from fastmcp import FastMCP
from fastmcp.server.context import Context
mcp = FastMCP("Demo")
@mcp.tool
async def my_tool(query: str, ctx: Context) -> str:
await ctx.info(f"Processing: {query}")
return f"Results for: {query}"
当客户端调用 `my_tool` 时,他们只看到 `query` 作为参数。`ctx` 参数被自动注入,因为它具有 `Context` 类型注解——FastMCP 识别出这一点并为请求提供活动上下文。
这对于工具、资源、资源模板和提示词同样适用。
### 使用 CurrentContext 进行显式依赖
为了使代码更明确,您可以使用 `CurrentContext()` 作为默认值,而不是依赖类型注解:
python
from fastmcp import FastMCP
from fastmcp.dependencies import CurrentContext
from fastmcp.server.context import Context
mcp = FastMCP("Demo")
@mcp.tool
async def my_tool(query: str, ctx: Context = CurrentContext()) -> str:
await ctx.info(f"Processing: {query}")
return f"Results for: {query}"
两种方法效果相同。类型注解方法更简洁;显式的 `CurrentContext()` 方法使依赖注入在代码中可见。