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 distance, with a top-level summary field the model can quote verbatim if the user just wants a one-line answer. The create_parking_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", "lot_type": "covered", "availability": { "available_spaces": 12 }, "pricing": { "base_rate": 8.0, "rate_unit": "hour" } },
{ "id": "01HMZ9…", "name": "Lionshead Public Parking", "lot_type": "open", "availability": { "available_spaces": 87 }, "pricing": { "base_rate": 6.0, "rate_unit": "hour" } }
]
}
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.