{"schema_version":2,"server":{"name":"zarvo","version":"2.0.0"},"transport":{"type":"streamable-http","endpoint":"/mcp","health_endpoint":"/mcp/health","docs_endpoint":"/mcp/docs","schema_endpoint":"/mcp/schema"},"capabilities":{"tools":true,"prompts":true,"resources":true},"discovery":{"canonical_method":"tools/list","call_method":"tools/call","note":"MCP clients should discover tools, resources, and prompts at runtime; this document is a human- and generator-friendly snapshot."},"instructions":"Use search_venues to resolve venue descriptions or partial names before requesting venue-specific availability. Use search_courts for live bookable court options and ask only for the smallest missing required detail. Use get_venue for catalogue details and get_availability for a named provider venue. Pass the user's stated location, date or date range, time window, duration, player count, travel, court-type, singles-court, and price constraints as typed inputs. Return no more than three court options in prose; the client may render structured results separately. Treat travel minutes as straight-line estimates, not live traffic or routing guarantees. Use search_public_games for existing games needing players. Prefer its broad 14-day default and omit optional date, time, level, and result-limit filters unless the user supplied them. After the user clearly chooses a slot, call get_booking_handoff; it revalidates and may return unavailable. Use recheck_slot for a standalone availability check without proceeding to handoff. Use create_game_plan only with explicit user intent, age_confirmed=true, and an explicit choose_one or book_all mode. Never claim Zarvo reserved, booked, joined, or paid. The user completes booking or joining on the provider website. Never ask for names, contact details, health information, private exact addresses, or another person's private availability. Include venue, local date and time, duration, whole-court price when known, and the provider handoff URL. Do not invent availability, prices, venues, travel guarantees, or links. Share guest links with invitees and keep organiser links private.","tools":[{"name":"search_courts","title":"Search available padel courts","description":"Use this when a group wants bookable court options near a UK location on one date or across a bounded date range. Searches configured providers, normalizes known whole-court and per-player prices, adds catalogue venue IDs and coordinates, and returns at most the requested limit across all dates. Providers such as MATCHi may return a null anonymous price; those slots remain visible under a price ceiling with price_details.basis unknown and must not be presented as budget matches. Travel time is a straight-line heuristic with a 15% soft-filter tolerance near max_travel_minutes, not live routing. number_of_players affects per-player price only; use singles_court to require explicit singles support. Do not use for venue-only discovery or public games.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"date_range":{"type":"object","properties":{"start":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"end":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"max_days":{"default":7,"type":"integer","minimum":1,"maximum":14}},"required":["start","end"]},"earliest_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"latest_end_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"duration_minutes":{"type":"integer","minimum":30,"maximum":180,"multipleOf":30},"number_of_players":{"type":"integer","minimum":1,"maximum":4,"description":"Used to compute per-player price only. Does not filter court capacity; use singles_court for that."},"singles_court":{"default":false,"description":"When true, restrict results to courts or venues explicitly identified as supporting singles play.","type":"boolean"},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"location":{"type":"string","minLength":2,"maxLength":120},"radius_km":{"default":10,"type":"number","exclusiveMinimum":0,"maximum":200},"max_travel_minutes":{"type":"integer","exclusiveMinimum":0,"maximum":180},"travel_mode":{"default":"drive","type":"string","enum":["drive"]},"court_type":{"type":"string","enum":["indoor","outdoor","covered","unspecified"]},"max_price_per_player":{"type":"number","exclusiveMinimum":0,"maximum":1000},"limit":{"default":3,"type":"integer","minimum":1,"maximum":20}},"required":["earliest_time","duration_minutes","number_of_players","location"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"slot_id":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"location":{"type":"string","minLength":1}},"required":["id","name","location"],"additionalProperties":false},"court":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"duration":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"venue_id":{"type":"string","minLength":1},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable","unknown"]},"confidence":{"type":"string","enum":["confirmed_live","provider_reported","derived","unknown"]}},"required":["status","confidence"],"additionalProperties":false},"price_details":{"type":"object","properties":{"amount":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"basis":{"type":"string","enum":["whole_court","per_player","session","unknown"]},"number_of_players":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"calculated_per_player":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"required":["amount","currency","basis","number_of_players","calculated_per_player"],"additionalProperties":false},"travel":{"type":"object","properties":{"coordinates":{"anyOf":[{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},{"type":"null"}]},"straight_line_distance_km":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"estimated_duration_minutes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"mode":{"type":"string","enum":["drive"]},"confidence":{"type":"string","enum":["estimated","unavailable"]},"method":{"type":"string","enum":["straight_line_heuristic","not_calculated"]}},"required":["coordinates","straight_line_distance_km","estimated_duration_minutes","mode","confidence","method"],"additionalProperties":false},"travel_estimate_uncertain":{"type":"boolean"},"revalidation":{"type":"object","properties":{"required":{"type":"boolean"},"recheck_after":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"semantics":{"type":"string","enum":["recheck_before_handoff","rechecked_for_handoff"]}},"required":["required","recheck_after","expires_at","semantics"],"additionalProperties":false}},"required":["slot_id","provider","venue","court","starts_at","duration","price","currency","venue_id","date","source","checked_at","availability","price_details","travel","travel_estimate_uncertain","revalidation"],"additionalProperties":false}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"providers":{"type":"object","properties":{"requested":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"succeeded":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"failed":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"code":{"type":"string","minLength":1}},"required":["provider","code"],"additionalProperties":false}}},"required":["requested","succeeded","failed"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"partial":{"type":"boolean"},"result_limit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"travel_time_is_estimated":{"type":"boolean","const":true}},"required":["count","providers","checked_at","partial","result_limit","travel_time_is_estimated"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"example":{"location":"St Albans","max_travel_minutes":20,"travel_mode":"drive","date":"2026-08-13","earliest_time":"19:00","latest_end_time":"21:00","duration_minutes":90,"number_of_players":4,"court_type":"indoor","max_price_per_player":15,"limit":3}},{"name":"search_venues","title":"Search padel venues","description":"Use this lightweight catalogue lookup to resolve a venue description, nearby landmark, or partial venue name into candidate venue_id, venue_name, and provider values. It returns snapshot metadata, not live court availability. Follow with get_venue for full metadata or get_availability for live slots at a selected provider venue.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"location":{"type":"string","minLength":2,"maxLength":120},"query":{"type":"string","minLength":1,"maxLength":120},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"radius_km":{"default":10,"type":"number","exclusiveMinimum":0,"maximum":200},"limit":{"default":10,"type":"integer","minimum":1,"maximum":20}},"required":["location"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"venue_id":{"type":"string","minLength":1},"venue_name":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"address":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"distance_km":{"type":"number","minimum":0}},"required":["venue_id","venue_name","provider","address","distance_km"],"additionalProperties":false}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"result_limit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"radius_km":{"type":"number","exclusiveMinimum":0},"snapshot_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["count","result_limit","radius_km","snapshot_at"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"example":{"location":"Kings Cross, London","query":"padel","radius_km":10,"limit":10}},{"name":"search_public_games","title":"Search public padel games","description":"Use this when a player wants an existing public padel game with an open spot. Omit date, time, level, and limit filters unless the user requested them; by default it returns every matching game around the location across the next 14 UK days. Returns anonymous match metadata and the provider join page; it never reveals player identities or joins on the user’s behalf. Do not use for empty-court bookings.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"location":{"type":"string","minLength":2,"maxLength":120},"radius_km":{"default":10,"type":"number","exclusiveMinimum":0,"maximum":200},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"date_range":{"type":"object","properties":{"start":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"end":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"max_days":{"default":14,"type":"integer","minimum":1,"maximum":14}},"required":["start","end"]},"earliest_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"player_level":{"type":"number","minimum":1,"maximum":7},"limit":{"type":"integer","minimum":1,"maximum":500}},"required":["location"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"game_id":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"location":{"type":"string","minLength":1}},"required":["id","name","location"],"additionalProperties":false},"court":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"sport":{"type":"string","minLength":1},"gender":{"type":"string","enum":["mixed","male","female","unknown"]},"level":{"type":"object","properties":{"minimum":{"anyOf":[{"type":"number","minimum":1,"maximum":7},{"type":"null"}]},"maximum":{"anyOf":[{"type":"number","minimum":1,"maximum":7},{"type":"null"}]}},"required":["minimum","maximum"],"additionalProperties":false},"players":{"type":"object","properties":{"joined":{"type":"integer","minimum":0,"maximum":9007199254740991},"capacity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"open_spots":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["joined","capacity","open_spots"],"additionalProperties":false},"counts_for_ranking":{"type":"boolean"},"join_url":{"type":"string","format":"uri"},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable","unknown"]},"confidence":{"type":"string","enum":["confirmed_live","provider_reported","derived","unknown"]}},"required":["status","confidence"],"additionalProperties":false},"price_details":{"type":"null"},"travel":{"type":"object","properties":{"coordinates":{"anyOf":[{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},{"type":"null"}]},"straight_line_distance_km":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"estimated_duration_minutes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"mode":{"type":"string","enum":["drive"]},"confidence":{"type":"string","enum":["estimated","unavailable"]},"method":{"type":"string","enum":["straight_line_heuristic","not_calculated"]}},"required":["coordinates","straight_line_distance_km","estimated_duration_minutes","mode","confidence","method"],"additionalProperties":false},"revalidation":{"type":"object","properties":{"required":{"type":"boolean","const":true},"semantics":{"type":"string","const":"provider_controls_join_availability"}},"required":["required","semantics"],"additionalProperties":false}},"required":["game_id","provider","venue","court","starts_at","sport","gender","level","players","counts_for_ranking","join_url","source","checked_at","availability","price_details","travel","revalidation"],"additionalProperties":false}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"providers":{"type":"object","properties":{"requested":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"succeeded":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"failed":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"code":{"type":"string","minLength":1}},"required":["provider","code"],"additionalProperties":false}}},"required":["requested","succeeded","failed"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"partial":{"type":"boolean"},"result_limit":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"travel_time_is_estimated":{"type":"boolean","const":true},"search":{"type":"object","properties":{"start_date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"end_date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"days_checked":{"type":"integer","minimum":1,"maximum":14}},"required":["start_date","end_date","days_checked"],"additionalProperties":false}},"required":["count","providers","checked_at","partial","result_limit","travel_time_is_estimated","search"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"example":{"location":"St Albans","radius_km":20,"date":"2026-08-13","earliest_time":"18:00","player_level":4.5,"limit":10}},{"name":"get_venue","title":"Get a padel venue","description":"Use this after a Zarvo catalogue venue ID is known and the user wants its address, coordinates, facilities, racket rental, contact information, official website, or social links. This returns snapshot metadata, not live availability.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"venue_id":{"type":"string","minLength":1,"maxLength":120}},"required":["venue_id"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"slug":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"public_path":{"type":"string","pattern":"^\\/clubs\\/[a-z0-9-]+\\/[a-z0-9-]+$"},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"country_code":{"type":"string","minLength":2,"maxLength":2},"status":{"type":"string","enum":["open","coming_soon","closed"]},"source_status":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","minLength":1},"operator":{"anyOf":[{"type":"string"},{"type":"null"}]},"coordinates":{"anyOf":[{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"courts":{"type":"object","properties":{"indoor":{"type":"integer","minimum":0,"maximum":9007199254740991},"outdoor":{"type":"integer","minimum":0,"maximum":9007199254740991},"covered":{"type":"integer","minimum":0,"maximum":9007199254740991},"unspecified":{"type":"integer","minimum":0,"maximum":9007199254740991},"total":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["indoor","outdoor","covered","unspecified","total"],"additionalProperties":false},"price":{"anyOf":[{"type":"object","properties":{"minimum":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"maximum":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["minimum","maximum","currency"],"additionalProperties":false},{"type":"null"}]},"address":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"racket_rental":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"facilities":{"type":"array","items":{"type":"string","minLength":1}},"details_available":{"type":"boolean"},"details_extracted_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"descriptions":{"type":"object","properties":{"courts":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"price":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"racket_rental":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]}},"required":["courts","price","racket_rental"],"additionalProperties":false},"contact":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1},"phone":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"website_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["name","phone","email","website_url"],"additionalProperties":false},{"type":"null"}]},"social_media_urls":{"type":"array","items":{"type":"string","format":"uri"}}},"required":["id","name","city","slug","public_path","country_code","status","source_status","platform","operator","coordinates","distance_km","courts","price","address","racket_rental","facilities","details_available","details_extracted_at","descriptions","contact","social_media_urls"],"additionalProperties":false},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"snapshot_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["data","source","checked_at","snapshot_at"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"example":{"venue_id":"m_stalbans_urpsa"}},{"name":"get_availability","title":"Get venue availability","description":"Use this when the user has selected a named provider venue and wants its available courts on one date or across a bounded date range. Results include catalogue venue IDs and the total limit applies across all dates. number_of_players affects per-player price only; use singles_court to require explicit singles support. Do not use for a broad nearby search; use search_courts instead.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"date_range":{"type":"object","properties":{"start":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"end":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"max_days":{"default":7,"type":"integer","minimum":1,"maximum":14}},"required":["start","end"]},"earliest_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"latest_end_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"duration_minutes":{"type":"integer","minimum":30,"maximum":180,"multipleOf":30},"number_of_players":{"type":"integer","minimum":1,"maximum":4,"description":"Used to compute per-player price only. Does not filter court capacity; use singles_court for that."},"singles_court":{"default":false,"description":"When true, restrict results to courts or venues explicitly identified as supporting singles play.","type":"boolean"},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue_name":{"type":"string","minLength":2,"maxLength":160},"limit":{"default":10,"type":"integer","minimum":1,"maximum":20}},"required":["earliest_time","duration_minutes","number_of_players","provider","venue_name"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"slot_id":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"location":{"type":"string","minLength":1}},"required":["id","name","location"],"additionalProperties":false},"court":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"duration":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"venue_id":{"type":"string","minLength":1},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable","unknown"]},"confidence":{"type":"string","enum":["confirmed_live","provider_reported","derived","unknown"]}},"required":["status","confidence"],"additionalProperties":false},"price_details":{"type":"object","properties":{"amount":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"basis":{"type":"string","enum":["whole_court","per_player","session","unknown"]},"number_of_players":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"calculated_per_player":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"required":["amount","currency","basis","number_of_players","calculated_per_player"],"additionalProperties":false},"travel":{"type":"object","properties":{"coordinates":{"anyOf":[{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},{"type":"null"}]},"straight_line_distance_km":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"estimated_duration_minutes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"mode":{"type":"string","enum":["drive"]},"confidence":{"type":"string","enum":["estimated","unavailable"]},"method":{"type":"string","enum":["straight_line_heuristic","not_calculated"]}},"required":["coordinates","straight_line_distance_km","estimated_duration_minutes","mode","confidence","method"],"additionalProperties":false},"travel_estimate_uncertain":{"type":"boolean"},"revalidation":{"type":"object","properties":{"required":{"type":"boolean"},"recheck_after":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"semantics":{"type":"string","enum":["recheck_before_handoff","rechecked_for_handoff"]}},"required":["required","recheck_after","expires_at","semantics"],"additionalProperties":false}},"required":["slot_id","provider","venue","court","starts_at","duration","price","currency","venue_id","date","source","checked_at","availability","price_details","travel","travel_estimate_uncertain","revalidation"],"additionalProperties":false}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"providers":{"type":"object","properties":{"requested":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"succeeded":{"type":"array","items":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]}},"failed":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"code":{"type":"string","minLength":1}},"required":["provider","code"],"additionalProperties":false}}},"required":["requested","succeeded","failed"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"partial":{"type":"boolean"},"result_limit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"travel_time_is_estimated":{"type":"boolean","const":true}},"required":["count","providers","checked_at","partial","result_limit","travel_time_is_estimated"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"example":{"provider":"playtomic","venue_name":"Rocket Padel St Albans","date":"2026-08-13","earliest_time":"19:00","latest_end_time":"21:00","duration_minutes":90,"number_of_players":4,"limit":10}},{"name":"recheck_slot","title":"Recheck a selected court slot","description":"Optional standalone check. get_booking_handoff already revalidates before returning a URL; call this only to confirm availability without proceeding to handoff. It never books, holds inventory, takes payment, or returns checkout.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slot_id":{"type":"string","minLength":1,"maxLength":2048},"number_of_players":{"default":4,"type":"integer","minimum":1,"maximum":4}},"required":["slot_id"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"available"},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"data":{"type":"object","properties":{"slot_id":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"location":{"type":"string","minLength":1}},"required":["id","name","location"],"additionalProperties":false},"court":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"duration":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"venue_id":{"type":"string","minLength":1},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable","unknown"]},"confidence":{"type":"string","enum":["confirmed_live","provider_reported","derived","unknown"]}},"required":["status","confidence"],"additionalProperties":false},"price_details":{"type":"object","properties":{"amount":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"basis":{"type":"string","enum":["whole_court","per_player","session","unknown"]},"number_of_players":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"calculated_per_player":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"required":["amount","currency","basis","number_of_players","calculated_per_player"],"additionalProperties":false},"travel":{"type":"object","properties":{"coordinates":{"anyOf":[{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},{"type":"null"}]},"straight_line_distance_km":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"estimated_duration_minutes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"mode":{"type":"string","enum":["drive"]},"confidence":{"type":"string","enum":["estimated","unavailable"]},"method":{"type":"string","enum":["straight_line_heuristic","not_calculated"]}},"required":["coordinates","straight_line_distance_km","estimated_duration_minutes","mode","confidence","method"],"additionalProperties":false},"travel_estimate_uncertain":{"type":"boolean"},"revalidation":{"type":"object","properties":{"required":{"type":"boolean"},"recheck_after":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"semantics":{"type":"string","enum":["recheck_before_handoff","rechecked_for_handoff"]}},"required":["required","recheck_after","expires_at","semantics"],"additionalProperties":false}},"required":["slot_id","provider","venue","court","starts_at","duration","price","currency","venue_id","date","source","checked_at","availability","price_details","travel","travel_estimate_uncertain","revalidation"],"additionalProperties":false}},"required":["status","checked_at","data"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unavailable"},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"slot_id":{"type":"string","minLength":1},"reason":{"type":"string","minLength":1}},"required":["status","checked_at","slot_id","reason"],"additionalProperties":false}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"example":{"slot_id":"opaque-slot-id-from-search_courts","number_of_players":4}},{"name":"create_game_plan","title":"Create a shareable padel game plan","description":"Use this only when the user explicitly wants to organise one to three selected court options with other people and confirms they are 18 or over. Rechecks each selected slot, creates an expiring Zarvo plan, and returns separate guest and private organiser links. This changes Zarvo state but does not book a court.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"age_confirmed":{"type":"boolean","const":true},"original_request":{"type":"string","minLength":3,"maxLength":4000},"slot_ids":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","minLength":1,"maxLength":2048}},"mode":{"type":"string","enum":["choose_one","book_all"]}},"required":["age_confirmed","original_request","slot_ids","mode"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"public_id":{"type":"string","minLength":1},"status":{"type":"string","enum":["draft","collecting","ready","awaiting_booking","confirmed","cancelled","expired"]},"plan_url":{"type":"string","format":"uri"},"organiser_url":{"type":"string","format":"uri"},"organiser_link":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"candidate_count":{"type":"integer","minimum":1,"maximum":3},"mode":{"type":"string","const":"choose_one"},"guest_url":{"type":"string","format":"uri"},"guest_link":{"type":"string","format":"uri"}},"required":["public_id","status","plan_url","organiser_url","organiser_link","expires_at","candidate_count","mode","guest_url","guest_link"],"additionalProperties":false},{"type":"object","properties":{"public_id":{"type":"string","minLength":1},"status":{"type":"string","enum":["draft","collecting","ready","awaiting_booking","confirmed","cancelled","expired"]},"plan_url":{"type":"string","format":"uri"},"organiser_url":{"type":"string","format":"uri"},"organiser_link":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"candidate_count":{"type":"integer","minimum":1,"maximum":3},"mode":{"type":"string","const":"book_all"},"guest_url":{"type":"string","format":"uri"},"guest_links":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"slot_id":{"type":"string","minLength":1},"guest_link":{"type":"string","format":"uri"}},"required":["slot_id","guest_link"],"additionalProperties":false}}},"required":["public_id","status","plan_url","organiser_url","organiser_link","expires_at","candidate_count","mode","guest_url","guest_links"],"additionalProperties":false}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"example":{"age_confirmed":true,"original_request":"Four players need an indoor court near St Albans Thursday evening.","slot_ids":["opaque-first-slot-id","opaque-second-slot-id"],"mode":"choose_one"}},{"name":"get_booking_handoff","title":"Get a provider booking handoff","description":"Use this directly after the user chooses a slot. It revalidates the provider slot and returns status unavailable with a reason if the slot was taken, or status available with a provider handoff URL and current price. The user completes login, booking, and payment on the provider site; Zarvo does not reserve inventory or complete checkout.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slot_id":{"type":"string","minLength":1,"maxLength":2048},"number_of_players":{"default":4,"type":"integer","minimum":1,"maximum":4}},"required":["slot_id"]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"slot_id":{"type":"string","minLength":1},"provider":{"type":"string","enum":["padelstars","playtomic","padelmates","matchi","clubspark"]},"venue":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"location":{"type":"string","minLength":1}},"required":["id","name","location"],"additionalProperties":false},"court":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"duration":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"booking_url":{"type":"string","format":"uri"},"prepared_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"status":{"type":"string","const":"available"},"handoff_url":{"type":"string","format":"uri"},"current_price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"source":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"provider_url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["provider_live_api","provider_public_page","catalog_snapshot"]}},"required":["provider","provider_url","method"],"additionalProperties":false},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availability":{"type":"object","properties":{"status":{"type":"string","enum":["available","unavailable","unknown"]},"confidence":{"type":"string","enum":["confirmed_live","provider_reported","derived","unknown"]}},"required":["status","confidence"],"additionalProperties":false},"price_details":{"type":"object","properties":{"amount":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"basis":{"type":"string","enum":["whole_court","per_player","session","unknown"]},"number_of_players":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"calculated_per_player":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"required":["amount","currency","basis","number_of_players","calculated_per_player"],"additionalProperties":false},"revalidation":{"type":"object","properties":{"required":{"type":"boolean"},"recheck_after":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"semantics":{"type":"string","enum":["recheck_before_handoff","rechecked_for_handoff"]}},"required":["required","recheck_after","expires_at","semantics"],"additionalProperties":false}},"required":["slot_id","provider","venue","court","starts_at","duration","price","currency","booking_url","prepared_at","status","handoff_url","current_price","source","checked_at","availability","price_details","revalidation"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unavailable"},"slot_id":{"type":"string","minLength":1},"checked_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"current_price":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"reason":{"type":"string","minLength":1}},"required":["status","slot_id","checked_at","current_price","reason"],"additionalProperties":false}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"example":{"slot_id":"opaque-slot-id-from-search_courts","number_of_players":4}}],"resources":[{"name":"provider-capabilities","uri":"zarvo://providers","title":"Zarvo provider capabilities","description":"Configured provider coverage and the distinction between live provider data and catalogue snapshots.","mimeType":"application/json"},{"name":"availability-semantics","uri":"zarvo://availability-semantics","title":"Zarvo availability and revalidation semantics","description":"Definitions for freshness, confidence, price basis, travel estimates, slot rechecks, and booking handoffs.","mimeType":"application/json"}],"prompts":[{"name":"find-court-for-group","title":"Find a court for a group","description":"Turn a group’s location, date, time, player count, court, travel, and price preferences into a safe Zarvo search and handoff workflow."}]}