一个展示具有智能引导功能的模型上下文协议(MCP)的演示,用于交互式数据收集。该项目展示了MCP服务器如何在需要时动态请求客户端的信息。
此演示实现了一个餐厅预订系统,展示了MCP的引导特性。服务器可以通过交互提示智能地从客户端请求缺失或无效的数据。
mcp-elicitation-example/
├── .gitignore # Git忽略模式
├── .python-version # Python版本规范
├── elicitation-server.py # 预订工具的MCP服务器
├── elicitation-client.py # 测试用的交互式客户端
├── pyproject.toml # 项目依赖和配置
├── README.md # 此文件
└── uv.lock # 依赖锁定文件
克隆仓库(如果尚未完成):
git clone <repository-url>
cd mcp--elicitation-example
使用uv安装依赖:
uv sync
这将自动:
pyproject.toml安装所有依赖uv.lock中锁定依赖以实现可重复构建注意:无需手动创建或激活虚拟环境 -
uv会自动处理!
替代方案(使用pip):
python -m venv venv
source venv/bin/activate # 在Windows上:venv\Scripts\activate
pip install -e .
在一个终端中启动MCP服务器:
uv run python elicitation-server.py
服务器默认将在http://localhost:8000/mcp启动。
在另一个终端中运行交互式客户端:
uv run python elicitation-client.py
提示:使用
uv run可以自动使用项目的虚拟环境,无需手动激活!
客户端演示了三个场景:
elicitation-server.py)elicitation-client.py)class GetDate(BaseModel):
date: str = Field(
description="请输入您的预订日期(YYYY-MM-DD)",
pattern=r"^\d{4}-\d{2}-\d{2}$"
)
@mcp.tool()
async def book_table(ctx: Context, date: str = "", party_size: int = 0) -> str:
"""通过智能引导来预订餐桌,针对缺失或无效的数据。"""
async def smart_elicitation_callback(
context: RequestContext["ClientSession", Any],
params: types.ElicitRequestParams,
) -> types.ElicitResult | types.ErrorData:
🍽️ 开始餐桌预订流程...
--- 测试:无参数(全引导)---
--- 服务器请求 ---
消息:请输入您的预订日期:
请输入您的预订日期(YYYY-MM-DD):2025-07-15
--- 服务器请求 ---
消息:请输入您的预订人数:
请输入人数(1-20):4
--- 服务器请求 ---
消息:您是否确认于2025年7月15日预订4人的餐桌?
您是否确认此预订?(y/n):y
是否有特殊要求或备注?(可选):请安排靠窗的桌子
✅ 结果:✅ 您已成功预订2025年7月15日4人的餐桌。备注:请安排靠窗的桌子
项目遵循PEP 8标准,包括:
运行客户端以测试不同场景:
python elicitation-client.py
客户端将自动测试三种场景,并在每个场景之间提示继续。
要添加新的引导类型:
ElicitationSchema类中定义一个模式uv sync安装通过修改elicitation-server.py中的日志级别启用调试日志记录:
logging.getLogger("mcp").setLevel(logging.DEBUG)
本项目作为MCP功能演示提供。请参阅MCP SDK许可以获取使用条款。
此演示展示了MCP引导特性的强大功能,可用于构建能够从用户动态收集信息的交互式、智能工具。