[ PROMPT_NODE_24780 ]
Server 工具
[ SKILL_DOCUMENTATION ]
# 工具 (Tools)
> 将函数公开为 MCP 客户端的可执行功能。
工具是允许你的 LLM 与外部系统交互、执行代码以及访问其训练数据之外的数据的核心构建块。在 FastMCP 中,工具是通过 MCP 协议公开给 LLM 的 Python 函数。
FastMCP 中的工具将常规 Python 函数转换为 LLM 在对话期间可以调用的功能。当 LLM 决定使用工具时:
1. 它发送带有基于工具模式的参数的请求。
2. FastMCP 根据你的函数签名验证这些参数。
3. 你的函数使用经过验证的输入执行。
4. 结果返回给 LLM,LLM 可以在其响应中使用该结果。
这允许 LLM 执行诸如查询数据库、调用 API、进行计算或访问文件等任务,从而将其能力扩展到训练数据之外。
## `@tool` 装饰器
创建工具非常简单,只需使用 `@mcp.tool` 装饰 Python 函数即可:
python
from fastmcp import FastMCP
mcp = FastMCP(name="CalculatorServer")
@mcp.tool
def add(a: int, b: int) -> int:
"""将两个整数相加。"""
return a + b
注册此工具后,FastMCP 会自动:
* 使用函数名称 (`add`) 作为工具名称。
* 使用函数的文档字符串(`将两个整数相加...`)作为工具描述。
* 基于函数的参数和类型注解生成输入模式。
* 处理参数验证和错误报告。
你定义 Python 函数的方式决定了工具在 LLM 客户端中的外观和行为。
> **提示:** 不支持带有 `*args` 或 `**kwargs` 的函数作为工具。存在此限制是因为 FastMCP 需要为 MCP 协议生成完整的参数模式,而可变参数列表无法实现这一点。
### 装饰器参数
虽然 FastMCP 会从你的函数中推断名称和描述,但你可以使用 `@mcp.tool` 装饰器的参数覆盖这些内容并添加额外的元数据:
python
@mcp.tool(
name="find_products", # LLM 的自定义工具名称
description="使用可选的类别过滤搜索产品目录。", # 自定义描述
tags={"catalog", "search"}, # 用于组织/过滤的可选标签
meta={"version": "1.2", "author": "product-team"} # 自定义元数据
)
def search_products_implementation(query: str, category: str | None = None) -> list[dict]: