MCP tools return structured JSON, not free text. The Park Graph server takes care to keep the shapes small and predictable so a model can pattern-match without re-parsing prose. The search_parking tool returns at most limit lots ordered by walking distance, with a top-level summary field the model can quote verbatim if the user just wants a one-line answer. The create_session tool returns a session id, a session code, a Stripe client_secret, and a tappable receipt URL.
search_parking response (truncated)json
{
"summary": "Two covered options near Vail Village: Lifthouse Lot ($8/hr, 12 left) or Lionshead Public ($6/hr, 87 left).",
"lots": [
{ "id": "01HMZ8…", "name": "Vail Village Lifthouse Lot", "rate_per_hour": 8.0, "available_spaces": 12, "walking_minutes": 4, "lot_type": "covered" },
{ "id": "01HMZ9…", "name": "Lionshead Public Parking", "rate_per_hour": 6.0, "available_spaces": 87, "walking_minutes": 7, "lot_type": "open" }
],
"confidence_band": "narrow"
}
The summary field is intentionally short and is the only place we pre-compose any prose. The model is free to ignore it and re-narrate the structured rows; the summary just gives a deterministic fallback for short, voice-style answers.