[ PROMPT_NODE_24740 ]
user-elicitation
[ SKILL_DOCUMENTATION ]
# 用户引导 (User Elicitation)
> 在工具执行期间通过 MCP 上下文请求用户的结构化输入。
用户引导允许 MCP 服务器在工具执行期间请求用户的结构化输入。工具无需预先要求所有输入,而是可以根据需要交互式地询问缺失的参数、澄清说明或额外上下文。
引导功能使工具能够暂停执行并向用户请求特定信息:
* **缺失参数**:询问最初未提供的必要信息
* **澄清请求**:获取用户对模糊场景的确认或选择
* **渐进式披露**:逐步收集复杂信息
* **动态工作流**:根据用户响应调整工具行为
例如,文件管理工具可能会询问“我应该创建哪个目录?”,或者数据分析工具可能会请求“我应该分析什么日期范围?”
## 概览
在任何工具函数中使用 `ctx.elicit()` 方法来请求用户输入。指定要显示的消息以及您期望的响应类型。
python
from fastmcp import FastMCP, Context
from dataclasses import dataclass
mcp = FastMCP("Elicitation Server")
@dataclass
class UserInfo:
name: str
age: int
@mcp.tool
async def collect_user_info(ctx: Context) -> str:
"""通过交互式提示收集用户信息。"""
result = await ctx.elicit(
message="Please provide your information",
response_type=UserInfo
)
if result.action == "accept":
user = result.data
return f"Hello {user.name}, you are {user.age} years old"
elif result.action == "decline":
return "Information not provided"
else: # cancel
return "Operation cancelled"
引导结果包含一个 `action` 字段,指示用户的响应方式:
| 操作 | 描述 |
| --------- | --------------------------------------------------------------- |
| `accept` | 用户提供了有效输入——数据可在 `data` 字段中获取 |
| `decline` | 用户选择不提供所请求的信息 |
| `cancel` | 用户取消了整个操作 |
FastMCP 还提供了用于模式匹配的类型化结果类:
python
from fastmcp.server.elicitation import (
AcceptedElicitation,
DeclinedElicitation,
CancelledElicitation,
)
@mcp.tool
async def pattern_example(ctx: Context) -> str:
result = a