37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
from pydantic import BaseModel, Field
|
|
|
|
from mcp.server.fastmcp import Context, FastMCP
|
|
from mcp.server.session import ServerSession
|
|
|
|
mcp = FastMCP(name="Elicitation Example")
|
|
|
|
|
|
class BookingPreferences(BaseModel):
|
|
"""Schema for collecting user preferences."""
|
|
|
|
checkAlternative: bool = Field(description="Would you like to check another date?")
|
|
alternativeDate: str = Field(
|
|
default="2024-12-26",
|
|
description="Alternative date (YYYY-MM-DD)",
|
|
)
|
|
|
|
|
|
@mcp.tool()
|
|
async def book_table(date: str, time: str, party_size: int, ctx: Context[ServerSession, None]) -> str:
|
|
"""Book a table with date availability check."""
|
|
# Check if date is available
|
|
if date == "2024-12-25":
|
|
# Date unavailable - ask user for alternative
|
|
result = await ctx.elicit(
|
|
message=(f"No tables available for {party_size} on {date}. Would you like to try another date?"),
|
|
schema=BookingPreferences,
|
|
)
|
|
|
|
if result.action == "accept" and result.data:
|
|
if result.data.checkAlternative:
|
|
return f"[SUCCESS] Booked for {result.data.alternativeDate}"
|
|
return "[CANCELLED] No booking made"
|
|
return "[CANCELLED] Booking cancelled"
|
|
|
|
# Date available
|
|
return f"[SUCCESS] Booked for {date} at {time}"
|