此 MCP 可以做什么
Searches Australian holiday parks and campgrounds and assesses accommodation, availability, equipment fit, pet restrictions, room details, and booking paths.
工具
输入模式
{'type': 'object', 'properties': {'breed': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['staffordshire-bull-terrier'], 'description': 'Alias of pet_breed. Guest-supplied breed name or slug.'}, 'adults': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'examples': [2], 'description': 'Number of adults in the party. Default 2 when omitted. Example: 2.'}, 'intent': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'default': None, 'description': 'Optional stay-intent object. Prefer the flattened check_in, property_ref, guests, pet, and equipment arguments on this tool. If both are supplied, explicit flattened arguments win.'}, 'infants': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'examples': [0], 'description': 'Number of infants in the party. Default 0 when omitted.'}, 'width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'check_in': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-03'], 'description': "Stay check-in date (YYYY-MM-DD). Pair with check_out. Example: '2026-10-03'."}, 'children': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'examples': [0], 'description': 'Number of children in the party, excluding infants. Default 0 when omitted.'}, 'end_date': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-06'], 'description': "Alias of check_out/end. Exclusive or last date depending on the tool; pair with start/start_date. Example: '2026-10-06'."}, 'length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'pet_size': {'anyOf': [{'enum': ['small', 'medium', 'large'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['medium'], 'description': 'Optional pet size declaration: small, medium, or large.'}, 'pet_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['dog'], 'description': "Primary pet type, usually 'dog'. Example: 'dog'."}, 'check_out': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-06'], 'description': "Stay check-out date (YYYY-MM-DD). Must be after check_in. Example: '2026-10-06'."}, 'pet_breed': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['staffordshire-bull-terrier'], 'description': "Guest-supplied breed name or slug for restricted-breed checks. Example: 'staffordshire-bull-terrier'."}, 'pet_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'examples': [1], 'description': 'Number of pets travelling. Example: 1.'}, 'start_date': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-03'], 'description': "Alias of check_in/start. Inclusive first date (YYYY-MM-DD). Example: '2026-10-03'."}, 'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'option_limit': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'examples': [5], 'description': 'Maximum room/site options to return for a broad assessment. Default 5. Example: 5.'}, 'powered_site': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'examples': [True], 'description': 'Alias of power_required. Whether a powered site is required.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}, 'room_type_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal room/site type ID. Compatibility only; prefer room_type_ref or room_type_url from a previous tool result.'}, 'option_cursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Opaque cursor from a previous tp_assess_stay options_page to fetch the next page of room/site options.'}, 'option_facets': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [['powered', 'ensuite']], 'description': "Canonical room/site option facts such as powered, ensuite, drive_through, slab, accessible, spa, or pet_friendly. Accepts one value or a list. Example: ['powered','ensuite']."}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': "Public room/site ref returned by search or tp_assess_stay. Example: 'victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': 'Traveller-facing Total Parks room/site URL returned by a previous tool. Accepted as an alias of room_type_ref.'}, 'equipment_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['caravan'], 'description': "Canonical rig type such as caravan, camper, motorhome, or tent. Example: 'caravan'."}, 'power_required': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'examples': [True], 'description': 'Whether the traveller requires a powered site. Alias: powered_site.'}, 'equipment_width': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'equipment_length': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'equipment_width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Optional rig width in metres. Canonical name; aliases equipment_width and width_m are also accepted. Example: 2.5.'}, 'accommodation_kind': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['site'], 'description': "Stay-kind filter: 'site' for caravan/camping sites, 'accommodation' for cabins and other roofed stays. Natural words such as 'cabins' or 'powered sites' are also accepted."}, 'equipment_length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Rig length in metres. Canonical name; aliases equipment_length and length_m are also accepted. Example: 7.5.'}, 'option_facet_names': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [['powered']], 'description': 'Alias of option_facets. Canonical room/site option fact names.'}, 'preferred_room_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['ensuite'], 'description': "Soft ranking hint for a named room/site type such as 'ensuite' or a returned room_type_ref. Does not filter alternatives out."}, 'traveling_with_pets': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'examples': [True], 'description': 'Set true when the traveller is travelling with pets. Alias: travelling_with_pets.'}, 'travelling_with_pets': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'examples': [True], 'description': 'Alias of traveling_with_pets. Set true when travelling with pets.'}}}
输出模式
{'type': 'object', 'required': ['verdict'], 'properties': {'quote': {'anyOf': [{'type': 'object', 'required': ['room_type_ref'], 'properties': {'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review and pay for a paid availability watch when this stay is sold out. Opening it does not create a watch, hold a site, or take payment in chat. Mention it only after free alternatives, and only if the traveller still wants this park. Say paid, not a dollar amount.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link for this stay intent. Opening this URL starts the normal room-page checkout path; it does not create a cart, reserve inventory, or grant transaction authority. When present for a stay the traveller is considering, present the URL prominently as the next step to review, change details, and book. Do not expose raw field names or internal implementation jargon in traveller-facing prose.'}}}, {'type': 'null'}], 'default': None}, 'currency': {'type': 'string', 'default': 'AUD'}, 'grand_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'service_fee': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'verified_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}, 'nightly_rates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'pet_fee_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'room_type_ref': {'type': 'string', 'description': "Public room/site reference accepted by MCP tools, e.g. 'victoria/example-park/rooms/powered-site'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for this room/site type.'}, 'pricing_source': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'room_type_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'accommodation_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review and pay for a paid availability watch when this stay is sold out. Opening it does not create a watch, hold a site, or take payment in chat. Mention it only after free alternatives, and only if the traveller still wants this park. Say paid, not a dollar amount.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link for this stay intent. Opening this URL starts the normal room-page checkout path; it does not create a cart, reserve inventory, or grant transaction authority. When present for a stay the traveller is considering, present the URL prominently as the next step to review, change details, and book. Do not expose raw field names or internal implementation jargon in traveller-facing prose.'}}}, {'type': 'null'}], 'default': None}, 'address': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Public park address for traveller-facing disambiguation.'}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['room_type_ref', 'verdict'], 'properties': {'quote': {'anyOf': [{'type': 'object', 'required': ['room_type_ref'], 'properties': {'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review and pay for a paid availability watch when this stay is sold out. Opening it does not create a watch, hold a site, or take payment in chat. Mention it only after free alternatives, and only if the traveller still wants this park. Say paid, not a dollar amount.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link for this stay intent. Opening this URL starts the normal room-page checkout path; it does not create a cart, reserve inventory, or grant transaction authority. When present for a stay the traveller is considering, present the URL prominently as the next step to review, change details, and book. Do not expose raw field names or internal implementation jargon in traveller-facing prose.'}}}, {'type': 'null'}], 'default': None}, 'currency': {'type': 'string', 'default': 'AUD'}, 'grand_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'service_fee': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'verified_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}, 'nightly_rates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'pet_fee_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'room_type_ref': {'type': 'string', 'description': "Public room/site reference accepted by MCP tools, e.g. 'victoria/example-park/rooms/powered-site'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for this room/site type.'}, 'pricing_source': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'room_type_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'accommodation_total': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review and pay for a paid availability watch when this stay is sold out. Opening it does not create a watch, hold a site, or take payment in chat. Mention it only after free alternatives, and only if the traveller still wants this park. Say paid, not a dollar amount.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link for this stay intent. Opening this URL starts the normal room-page checkout path; it does not create a cart, reserve inventory, or grant transaction authority. When present for a stay the traveller is considering, present the URL prominently as the next step to review, change details, and book. Do not expose raw field names or internal implementation jargon in traveller-facing prose.'}}}, {'type': 'null'}], 'default': None}, 'verdict': {'enum': ['bookable', 'blocked', 'unconfirmed'], 'type': 'string'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'class', 'status'], 'properties': {'code': {'type': 'string', 'description': 'Stable machine-readable constraint code.'}, 'class': {'enum': ['hard_physical', 'hard_policy', 'soft_preference'], 'type': 'string', 'description': 'How the result is acted on by an agent.'}, 'detail': {'type': 'object', 'additionalProperties': True}, 'status': {'enum': ['pass', 'fail', 'unknown'], 'type': 'string'}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Omitted when status is unknown.'}, 'provenance': {'anyOf': [{'enum': ['pms', 'tp_structured', 'feature_flag', 'ai_extracted', 'scraped'], 'type': 'string'}, {'type': 'null'}], 'default': None}, 'recovery_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'presentation': {'anyOf': [{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string'}, 'badges': {'type': 'array', 'items': {'type': 'string'}}, 'caveats': {'type': 'array', 'items': {'type': 'string'}}, 'subtitle': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'highlights': {'type': 'array', 'items': {'type': 'string'}}, 'primary_cta': {'anyOf': [{'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}, {'type': 'null'}], 'default': None}, 'secondary_ctas': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}}, 'suggested_next_tool': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'room_type_ref': {'type': 'string', 'description': 'Public room/site reference accepted by MCP tools.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for this room/site type.'}, 'room_type_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'is_preferred_match': {'type': 'boolean', 'default': False, 'description': 'True when this option best matches a room/site type the traveller explicitly asked for (via preferred_room_type). Lead with this option in traveller-facing answers.'}, 'matched_option_facets': {'type': 'array', 'items': {'enum': ['powered', 'unpowered', 'ensuite', 'drive_through', 'slab', 'tent_only', 'accessible', 'spa', 'pet_friendly', 'family', 'pet_fee_applies', 'no_pet_fee', 'declaration_required'], 'type': 'string', 'description': 'Traveller-facing inventory-option facts at room/site scope.'}, 'description': 'Canonical requested option facets confirmed or inferred on this option.'}}}}, 'verdict': {'enum': ['bookable', 'blocked', 'unconfirmed'], 'type': 'string'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'class', 'status'], 'properties': {'code': {'type': 'string', 'description': 'Stable machine-readable constraint code.'}, 'class': {'enum': ['hard_physical', 'hard_policy', 'soft_preference'], 'type': 'string', 'description': 'How the result is acted on by an agent.'}, 'detail': {'type': 'object', 'additionalProperties': True}, 'status': {'enum': ['pass', 'fail', 'unknown'], 'type': 'string'}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Omitted when status is unknown.'}, 'provenance': {'anyOf': [{'enum': ['pms', 'tp_structured', 'feature_flag', 'ai_extracted', 'scraped'], 'type': 'string'}, {'type': 'null'}], 'default': None}, 'recovery_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'options_page': {'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 5, 'maximum': 25, 'minimum': 1}, 'total': {'type': 'integer', 'default': 0, 'minimum': 0}, 'has_more': {'type': 'boolean', 'default': False}, 'returned': {'type': 'integer', 'default': 0, 'minimum': 0}, 'truncated': {'type': 'boolean', 'default': False}, 'next_cursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'recovery_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'verdict_counts': {'type': 'object', 'additionalProperties': {'type': 'integer'}}, 'candidates_total': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Matching room types before any anonymous broad-assessment evaluation cap.'}, 'candidate_eval_capped': {'type': 'boolean', 'default': False, 'description': 'True when anonymous broad assess evaluated fewer candidates than candidates_total.'}}}, 'presentation': {'anyOf': [{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string'}, 'badges': {'type': 'array', 'items': {'type': 'string'}}, 'caveats': {'type': 'array', 'items': {'type': 'string'}}, 'subtitle': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'highlights': {'type': 'array', 'items': {'type': 'string'}}, 'primary_cta': {'anyOf': [{'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}, {'type': 'null'}], 'default': None}, 'secondary_ctas': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}}, 'suggested_next_tool': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Public property reference accepted by MCP tools.'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for the property.'}}}
输入模式
{'type': 'object', 'properties': {'width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}, 'room_type_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal room/site type ID. Compatibility only; prefer room_type_ref or room_type_url from a previous tool result.'}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': "Public room/site ref returned by search or tp_assess_stay. Example: 'victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': 'Traveller-facing Total Parks room/site URL returned by a previous tool. Accepted as an alias of room_type_ref.'}, 'equipment_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['caravan'], 'description': "Canonical rig type such as caravan, camper, motorhome, or tent. Example: 'caravan'."}, 'equipment_width': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'equipment_length': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'equipment_width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Optional rig width in metres. Canonical name; aliases equipment_width and width_m are also accepted. Example: 2.5.'}, 'equipment_length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Rig length in metres. Canonical name; aliases equipment_length and length_m are also accepted. Example: 7.5.'}}}
输出模式
{'type': 'object', 'required': ['property_ref'], 'properties': {'address': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'room_types': {'type': 'array', 'items': {'type': 'object', 'required': ['room_type_ref', 'is_site', 'dimensions_pending', 'equipment_type_excluded', 'total_sites', 'fits_equipment'], 'properties': {'is_site': {'type': 'boolean'}, 'total_sites': {'type': 'integer'}, 'room_type_ref': {'type': 'string', 'description': 'Public room/site reference accepted by MCP tools.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for this room/site type.'}, 'fits_equipment': {'type': 'boolean'}, 'room_type_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'sites_matching': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'dimensions_pending': {'type': 'boolean'}, 'unavailable_reason': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'physical_fit_status': {'type': 'string', 'default': 'not_evaluated'}, 'compatibility_status': {'type': 'string', 'default': 'not_evaluated'}, 'equipment_type_excluded': {'type': 'boolean'}, 'physical_sites_matching': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'dwelling_compatible_sites': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'type_compatibility_status': {'type': 'string', 'default': 'not_evaluated'}, 'length_compatibility_status': {'type': 'string', 'default': 'not_evaluated'}}}}, 'property_ref': {'type': 'string'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'equipment_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'equipment_width': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None}, 'equipment_length': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None}}}
输入模式
{'type': 'object', 'properties': {'adults': {'type': 'integer', 'default': 2, 'examples': [2], 'description': 'Number of adults in the party. Default 2. Example: 2.'}, 'infants': {'type': 'integer', 'default': 0, 'examples': [0], 'description': 'Number of infants in the party. Default 0.'}, 'width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'check_in': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-03'], 'description': "Stay check-in date (YYYY-MM-DD). Pair with check_out. Example: '2026-10-03'."}, 'children': {'type': 'integer', 'default': 0, 'examples': [0], 'description': 'Number of children in the party, excluding infants. Default 0.'}, 'end_date': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-06'], 'description': "Alias of check_out/end. Exclusive or last date depending on the tool; pair with start/start_date. Example: '2026-10-06'."}, 'length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'check_out': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-06'], 'description': "Stay check-out date (YYYY-MM-DD). Must be after check_in. Example: '2026-10-06'."}, 'start_date': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-03'], 'description': "Alias of check_in/start. Inclusive first date (YYYY-MM-DD). Example: '2026-10-03'."}, 'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}, 'room_type_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal room/site type ID. Compatibility only; prefer room_type_ref or room_type_url from a previous tool result.'}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': "Public room/site ref returned by search or tp_assess_stay. Example: 'victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': 'Traveller-facing Total Parks room/site URL returned by a previous tool. Accepted as an alias of room_type_ref.'}, 'equipment_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['caravan'], 'description': "Canonical rig type such as caravan, camper, motorhome, or tent. Example: 'caravan'."}, 'equipment_width': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Alias of equipment_width_m. Rig width in metres. Example: 2.5.'}, 'equipment_length': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Alias of equipment_length_m. Rig length in metres. Example: 7.5.'}, 'equipment_width_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [2.5], 'description': 'Optional rig width in metres. Canonical name; aliases equipment_width and width_m are also accepted. Example: 2.5.'}, 'accommodation_kind': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['site'], 'description': "Stay-kind filter: 'site' for caravan/camping sites, 'accommodation' for cabins and other roofed stays. Natural words such as 'cabins' or 'powered sites' are also accepted."}, 'equipment_length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'examples': [7.5], 'description': 'Rig length in metres. Canonical name; aliases equipment_length and length_m are also accepted. Example: 7.5.'}}}
输出模式
{'type': 'object', 'required': ['property_ref', 'start_date', 'end_date', 'max_window_days'], 'properties': {'days': {'type': 'array', 'items': {'type': 'object', 'required': ['date', 'available'], 'properties': {'date': {'type': 'string', 'format': 'date'}, 'currency': {'type': 'string', 'default': 'AUD'}, 'max_stay': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'min_stay': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'available': {'type': 'boolean'}, 'base_rate': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'guest_charges': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'indicative_rate': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'remaining_units': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Remaining bookable units for this day from Total Parks live inventory after public availability filters. Scarcity is a signal, not a hold â\x80\x94 complete booking on Total Parks to reserve.'}, 'closed_on_arrival': {'type': 'boolean', 'default': False}, 'closed_on_departure': {'type': 'boolean', 'default': False}, 'min_stay_on_arrival': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}}}, 'description': 'Per-night detail rows. Each entry is one open or closed night with rate, remaining_units, and stay restrictions; the summary already collapses the open nights into ranges.'}, 'summary': {'type': 'object', 'properties': {'currency': {'type': 'string', 'default': 'AUD'}, 'answer_hint': {'type': 'string', 'default': 'If the traveller did not provide a stay length, answer with the open date ranges in available_date_ranges/open_date_range_labels. Each range lists its first and last open night plus a latest_checkout_date, so quote whole open windows rather than converting them into fixed check-in/check-out stays or assuming weekends. For exact stays, ask for the number of nights and use tp_assess_stay or Total Parks checkout after the traveller chooses dates.', 'description': 'Agent-facing rendering guidance for this planning calendar.'}, 'available_days': {'type': 'integer', 'default': 0}, 'restricted_days': {'type': 'integer', 'default': 0}, 'unavailable_days': {'type': 'integer', 'default': 0}, 'available_date_ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start_date', 'end_date', 'nights', 'latest_checkout_date'], 'properties': {'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of consecutive open nights in this range.'}, 'end_date': {'type': 'string', 'format': 'date', 'description': 'Last open night in this run of dates.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'First open night in this run of dates.'}, 'latest_checkout_date': {'type': 'string', 'format': 'date', 'description': 'Day after end_date: the latest check-out a stay covering this whole run could use. Use it to avoid off-by-one errors when a traveller wants to stay through the final open night.'}}}, 'description': 'Contiguous runs of days with live inventory availability.'}, 'low_availability_days': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': 'Available days with cached remaining units at or below the low-availability threshold.'}, 'open_date_range_labels': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Traveller-facing labels for available_date_ranges. Use these to answer flexible date questions when no exact stay length was supplied, instead of inventing fixed check-in/check-out stays.'}, 'cheapest_indicative_rate': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'tightest_remaining_units': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Smallest remaining unit count across available calendar days.'}}, 'description': 'Answer-ready digest. Read this first: open windows live in available_date_ranges/open_date_range_labels with night counts and checkout boundaries, so you rarely need to scan the per-night days array.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'occupancy': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'default': None}, 'provenance': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari'}, 'start_date': {'type': 'string', 'format': 'date'}, 'limitations': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'status', 'detail'], 'properties': {'code': {'enum': ['fact_not_collected', 'planning_tier_only', 'coverage_boundary', 'pre_booking_park_contact_not_supported'], 'type': 'string'}, 'detail': {'type': 'string'}, 'status': {'enum': ['unknown', 'unsupported', 'requires_verification'], 'type': 'string'}, 'recovery_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'presentation': {'anyOf': [{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string'}, 'badges': {'type': 'array', 'items': {'type': 'string'}}, 'caveats': {'type': 'array', 'items': {'type': 'string'}}, 'subtitle': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'highlights': {'type': 'array', 'items': {'type': 'string'}}, 'primary_cta': {'anyOf': [{'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}, {'type': 'null'}], 'default': None}, 'secondary_ctas': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}}, 'suggested_next_tool': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'property_ref': {'type': 'string'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'public_trust': {'type': 'array', 'items': {'type': 'object', 'required': ['fact_group', 'public_source_label', 'scope'], 'properties': {'scope': {'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['property', 'room_type', 'stay', 'rating'], 'type': 'string', 'description': 'Entity or stay window to which the evidence applies.'}, 'label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional traveller-facing scope label.'}}, 'description': 'Public, non-internal scope descriptor.'}, 'detail': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'fact_group': {'enum': ['availability_price', 'room_identity', 'rig_fit', 'pet_policy', 'site_power', 'cancellation_policy', 'listing_management', 'google_rating'], 'type': 'string', 'description': 'Decision-critical claim groups eligible for public provenance.'}, 'conflict_or_stale': {'type': 'boolean', 'default': False}, 'public_source_label': {'enum': ['Managed by park', "From the park's booking system", 'Confirmed by the park', 'Source checked by Total Parks', 'Google Maps'], 'type': 'string', 'description': 'Traveller-facing labels approved by the public trust contract.'}, 'observed_or_confirmed_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}}, 'description': 'One selectively projected source record for a public claim.'}}, 'checkout_note': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.'}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'max_window_days': {'type': 'integer'}, 'equipment_filter': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'default': None}, 'accommodation_kind': {'anyOf': [{'enum': ['site', 'accommodation'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional calendar scope: site for caravan/camping sites or accommodation for cabins, cottages, villas, and other roofed stays.'}, 'unavailable_reason': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'planning_tier_caveat': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.'}, 'equipment_type_excluded': {'type': 'boolean', 'default': False}}}
输入模式
{'type': 'object', 'properties': {'include': {'enum': ['raw', 'summary', 'both'], 'type': 'string', 'default': 'both', 'examples': ['both'], 'description': "Which capability records to return: 'raw' source signals, 'summary' winning values, or 'both' (default)."}, 'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}}}
输出模式
{'type': 'object', 'required': ['property_ref', 'include'], 'properties': {'address': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'include': {'enum': ['raw', 'summary', 'both'], 'type': 'string', 'description': 'Which projection layer(s) the caller wants in the response.'}, 'signals': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'required': ['scope_type', 'value', 'source', 'confidence', 'status'], 'properties': {'value': {'type': 'string'}, 'source': {'type': 'string'}, 'status': {'type': 'string'}, 'confidence': {'type': 'string'}, 'scope_type': {'type': 'string'}, 'observed_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}, 'feature_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'feature_category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'source_record_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}, 'description': 'Public MCP projection of a raw capability signal.'}}, {'type': 'null'}], 'default': None}, 'summaries': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'required': ['scope_type', 'value', 'winning_source', 'winning_confidence'], 'properties': {'value': {'type': 'string'}, 'scope_type': {'type': 'string'}, 'computed_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}, 'feature_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'winning_source': {'type': 'string'}, 'feature_category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'winning_confidence': {'type': 'string'}}, 'description': 'Public MCP projection of a derived capability claim.'}}, {'type': 'null'}], 'default': None}, 'property_ref': {'type': 'string'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'public_trust': {'type': 'array', 'items': {'type': 'object', 'required': ['fact_group', 'public_source_label', 'scope'], 'properties': {'scope': {'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['property', 'room_type', 'stay', 'rating'], 'type': 'string', 'description': 'Entity or stay window to which the evidence applies.'}, 'label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional traveller-facing scope label.'}}, 'description': 'Public, non-internal scope descriptor.'}, 'detail': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'fact_group': {'enum': ['availability_price', 'room_identity', 'rig_fit', 'pet_policy', 'site_power', 'cancellation_policy', 'listing_management', 'google_rating'], 'type': 'string', 'description': 'Decision-critical claim groups eligible for public provenance.'}, 'conflict_or_stale': {'type': 'boolean', 'default': False}, 'public_source_label': {'enum': ['Managed by park', "From the park's booking system", 'Confirmed by the park', 'Source checked by Total Parks', 'Google Maps'], 'type': 'string', 'description': 'Traveller-facing labels approved by the public trust contract.'}, 'observed_or_confirmed_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}}, 'description': 'One selectively projected source record for a public claim.'}}, 'room_type_pet_policies': {'type': 'array', 'items': {'type': 'object', 'required': ['room_type_ref', 'accommodation_kind', 'policy_status'], 'properties': {'pets_allowed': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Raw room-type pet allowance; null means the policy is unknown.'}, 'pet_max_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Maximum pets allowed for this room type, when known.'}, 'policy_status': {'enum': ['allowed', 'not_allowed', 'unknown'], 'type': 'string', 'description': 'Compact room-type pet policy status derived from pets_allowed.'}, 'room_type_ref': {'type': 'string', 'description': 'Public room/site reference accepted by MCP tools.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for this room/site type.'}, 'room_type_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Guest-facing room/site type name, falling back to PMS name.'}, 'pet_booking_mode': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'How pet bookings are handled online, e.g. instant or blocked.'}, 'pet_policy_source': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Machine-readable provenance/source for the room-type pet policy. Prefer pet_policy_source_label in traveller-facing answers.'}, 'accommodation_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Whether the room type is a camping/caravan site or roofed accommodation.'}, 'pet_policy_confidence': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Machine-readable confidence bucket for the room-type pet policy. Prefer pet_policy_confidence_label in traveller-facing answers.'}, 'pet_policy_source_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': "Traveller-facing source wording for the room-type pet policy, for example 'Confirmed by the park'. Inferred and unverified sources intentionally have no public label."}, 'pet_policy_confidence_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing confidence wording for the room-type pet policy.'}}}}}}
输入模式
{'type': 'object', 'properties': {'end': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-04-07'], 'description': "Last date of the stay window to check for pet blockouts (YYYY-MM-DD). Must be after start. Alias: check_out. Example: '2026-04-07'."}, 'start': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-04-03'], 'description': "First date of the stay window to check for pet blockouts (YYYY-MM-DD). Alias: check_in. Example: '2026-04-03'."}, 'check_in': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-03'], 'description': "Stay check-in date (YYYY-MM-DD). Pair with check_out. Example: '2026-10-03'."}, 'check_out': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'examples': ['2026-10-06'], 'description': "Stay check-out date (YYYY-MM-DD). Must be after check_in. Example: '2026-10-06'."}, 'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}}}
输出模式
{'type': 'object', 'required': ['property_ref', 'start', 'end'], 'properties': {'end': {'type': 'string', 'format': 'date'}, 'note': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'start': {'type': 'string', 'format': 'date'}, 'ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end', 'source', 'label'], 'properties': {'end': {'type': 'string', 'format': 'date'}, 'label': {'type': 'string', 'description': 'Display label for UI and booking rejections'}, 'start': {'type': 'string', 'format': 'date'}, 'source': {'enum': ['preset', 'custom'], 'type': 'string'}, 'preset_key': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': "Preset key when source == 'preset', otherwise null"}}, 'description': 'A concrete blocked date range resolved for a specific year.'}}, 'address': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'property_ref': {'type': 'string'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}
输入模式
{'type': 'object', 'properties': {'property_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal property ID. Compatibility only; prefer property_ref or property_url from a previous Total Parks tool result.'}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet'], 'description': "Public property ref from tp_resolve_property or search, formatted as '{state}/{slug}'. Prefer this or property_url over internal IDs. Example: 'victoria/big4-aireys-inlet'."}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet'], 'description': "Traveller-facing Total Parks property URL returned by a previous tool. Accepted as an alias of property_ref. Example: 'https://totalparks.com.au/victoria/big4-aireys-inlet'."}, 'room_type_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Internal room/site type ID. Compatibility only; prefer room_type_ref or room_type_url from a previous tool result.'}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': "Public room/site ref returned by search or tp_assess_stay. Example: 'victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'."}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['https://totalparks.com.au/victoria/big4-aireys-inlet/rooms/cosy-cottage-4-person'], 'description': 'Traveller-facing Total Parks room/site URL returned by a previous tool. Accepted as an alias of room_type_ref.'}}}
输出模式
{'type': 'object', 'required': ['property_ref', 'room_type_ref', 'name', 'accommodation_kind', 'occupancy', 'pet_policy', 'equipment_status'], 'properties': {'name': {'type': 'string'}, 'images': {'type': 'array', 'items': {'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string'}, 'is_primary': {'type': 'boolean', 'default': False}, 'sort_order': {'type': 'integer', 'default': 0}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'features': {'type': 'array', 'items': {'type': 'object', 'required': ['feature_name'], 'properties': {'quantity': {'type': 'integer', 'default': 1}, 'feature_name': {'type': 'string'}, 'feature_category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'occupancy': {'type': 'object', 'properties': {'max_occupancy': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'min_occupancy': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}}}, 'pet_policy': {'type': 'object', 'required': ['policy_status'], 'properties': {'pet_max_size': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pets_allowed': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None}, 'pet_fee_basis': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_max_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'policy_status': {'enum': ['allowed', 'not_allowed', 'unknown'], 'type': 'string'}, 'pet_fee_amount': {'anyOf': [{'type': 'string', 'pattern': '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}, {'type': 'null'}], 'default': None}, 'pet_booking_mode': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_fee_currency': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_restrictions': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_policy_source': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_size_examples': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_fee_review_status': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_policy_confidence': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_policy_source_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_policy_confidence_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'pet_requested_detail_fields': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'limitations': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'status', 'detail'], 'properties': {'code': {'enum': ['fact_not_collected', 'planning_tier_only', 'coverage_boundary', 'pre_booking_park_contact_not_supported'], 'type': 'string'}, 'detail': {'type': 'string'}, 'status': {'enum': ['unknown', 'unsupported', 'requires_verification'], 'type': 'string'}, 'recovery_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}}, 'presentation': {'anyOf': [{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string'}, 'badges': {'type': 'array', 'items': {'type': 'string'}}, 'caveats': {'type': 'array', 'items': {'type': 'string'}}, 'subtitle': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'highlights': {'type': 'array', 'items': {'type': 'string'}}, 'primary_cta': {'anyOf': [{'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}, {'type': 'null'}], 'default': None}, 'secondary_ctas': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}}, 'suggested_next_tool': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'property_ref': {'type': 'string'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'public_trust': {'type': 'array', 'items': {'type': 'object', 'required': ['fact_group', 'public_source_label', 'scope'], 'properties': {'scope': {'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['property', 'room_type', 'stay', 'rating'], 'type': 'string', 'description': 'Entity or stay window to which the evidence applies.'}, 'label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional traveller-facing scope label.'}}, 'description': 'Public, non-internal scope descriptor.'}, 'detail': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'fact_group': {'enum': ['availability_price', 'room_identity', 'rig_fit', 'pet_policy', 'site_power', 'cancellation_policy', 'listing_management', 'google_rating'], 'type': 'string', 'description': 'Decision-critical claim groups eligible for public provenance.'}, 'conflict_or_stale': {'type': 'boolean', 'default': False}, 'public_source_label': {'enum': ['Managed by park', "From the park's booking system", 'Confirmed by the park', 'Source checked by Total Parks', 'Google Maps'], 'type': 'string', 'description': 'Traveller-facing labels approved by the public trust contract.'}, 'observed_or_confirmed_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'default': None}}, 'description': 'One selectively projected source record for a public claim.'}}, 'room_type_ref': {'type': 'string'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'equipment_status': {'type': 'object', 'required': ['is_site'], 'properties': {'is_site': {'type': 'boolean'}, 'has_slab': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None}, 'power_amps': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None}, 'has_ensuite': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None}, 'dimensions_pending': {'type': 'boolean', 'default': False}, 'site_length_summary': {'anyOf': [{'type': 'object', 'properties': {'max_site_length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None}, 'min_site_length_m': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None}, 'has_unlimited_site': {'type': 'boolean', 'default': False}}}, {'type': 'null'}], 'default': None}}}, 'short_description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'accommodation_kind': {'enum': ['site', 'accommodation'], 'type': 'string'}}}
输入模式
{'type': 'object', 'properties': {'title': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['Parks near Lakes Entrance'], 'description': "Optional heading for the rendered card set. Example: 'Parks near Lakes Entrance'."}, 'fallback_limit': {'type': 'integer', 'default': 3, 'maximum': 3, 'minimum': 0, 'examples': [3], 'description': 'Maximum compact fallback park cards in a composite stay shortlist. Zero hides fallbacks.'}, 'include_nearby': {'type': 'boolean', 'default': False, 'examples': [False], 'description': 'When true, include compact nearby fallback park cards in a composite stay shortlist. Default false.'}, 'search_response': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'default': None, 'description': 'Prior tp_search_parks or tp_search_stays JSON payload. Pass the previous tool result unchanged when rendering cards.'}, 'assess_stay_result': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'default': None, 'description': "Prior tp_assess_stay JSON payload. Pass the previous tool result unchanged when rendering the chosen park's room/site cards."}, 'preferred_stay_kind': {'anyOf': [{'enum': ['site', 'accommodation'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['site'], 'description': "Optional stay-kind hint for composite shortlists: 'site' for caravan/camping, 'accommodation' for cabins and other roofed stays."}, 'fallback_property_refs': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'default': None, 'examples': [['victoria/big4-aireys-inlet']], 'description': "Optional public property_ref values to use as compact fallback cards. Example: ['victoria/big4-aireys-inlet']."}}}
输出模式
{'type': 'object', 'properties': {'title': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None}, 'groups': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label'], 'properties': {'key': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'cards': {'type': 'array', 'items': {'type': 'object', 'required': ['card_id', 'source', 'title', 'primary_cta'], 'properties': {'tier': {'anyOf': [{'enum': ['bookable', 'likely', 'discovery'], 'type': 'string'}, {'type': 'null'}], 'default': None}, 'price': {'anyOf': [{'type': 'object', 'required': ['amount_text', 'stay_kind'], 'properties': {'caveat': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'default': None, 'description': 'Optional price recheck caveat to preserve search trust copy.'}, 'suffix': {'type': 'string', 'default': '/night', 'maxLength': 40}, 'qualifier': {'type': 'string', 'default': 'from', 'maxLength': 40}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string'}, 'amount_text': {'type': 'string', 'maxLength': 40, 'minLength': 1, 'description': "Formatted hero price amount, e.g. '$58'."}}}, {'type': 'null'}], 'default': None}, 'title': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Primary card title.'}, 'badges': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'label'], 'properties': {'code': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Stable badge code for host widgets, e.g. instant_book.'}, 'tone': {'enum': ['neutral', 'success', 'warning', 'muted'], 'type': 'string', 'default': 'neutral'}, 'label': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Short traveller-facing badge label.'}}}}, 'rating': {'anyOf': [{'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': "Formatted compact rating label, e.g. '4.7 (128)'."}, 'value': {'type': 'number', 'maximum': 5, 'minimum': 0, 'description': 'Star rating value.'}, 'review_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None}}}, {'type': 'null'}], 'default': None}, 'source': {'enum': ['search_candidate', 'assess_stay_option'], 'type': 'string', 'description': 'Source payload type used to build the card.'}, 'card_id': {'type': 'string', 'minLength': 1, 'description': 'Stable per-card key suitable for widget rendering.'}, 'caveats': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Trust caveats that must remain visible near the card.'}, 'subtitle': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Optional second-line card label.'}, 'image_alt': {'type': 'string', 'default': 'Holiday park', 'maxLength': 200, 'description': 'Fallback alt text for card images.'}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None}, 'image_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Approved public image URLs in display order.'}, 'tier_label': {'anyOf': [{'type': 'string', 'maxLength': 80}, {'type': 'null'}], 'default': None}, 'primary_cta': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}, 'availability': {'anyOf': [{'type': 'object', 'required': ['label', 'tone'], 'properties': {'tone': {'enum': ['available', 'limited', 'unavailable'], 'type': 'string', 'description': 'Presentation tone for the availability pill.'}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Traveller-facing availability phrase.'}}}, {'type': 'null'}], 'default': None}, 'property_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Public property reference accepted by MCP tools.'}, 'room_type_ref': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Public room/site reference accepted by MCP tools.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Compact traveller-facing location label.'}, 'matched_labels': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Short match labels safe to render under or beside the card.'}, 'secondary_ctas': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string'}, 'kind': {'enum': ['primary', 'secondary'], 'type': 'string', 'default': 'primary'}, 'label': {'type': 'string'}, 'tool_hint': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional MCP tool name that should usually precede this CTA.'}}}}}, 'description': 'Host-agnostic card contract for MCP Apps result widgets.'}}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'layout': {'anyOf': [{'enum': ['carousel', 'grid', 'compact'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': "Optional group-specific layout. When omitted, the card list's top-level layout applies."}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}], 'default': None}}}}, 'layout': {'enum': ['carousel', 'grid'], 'type': 'string', 'default': 'carousel', 'description': "How a visual host should arrange the groups. 'carousel' peeks a horizontal scroll row (multi-park search); 'grid' wraps every card into view (single-park stay assessments) so no option is hidden."}, 'caveats': {'type': 'array', 'items': {'type': 'string'}}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'contract_version': {'type': 'string', 'const': 'mcp_cards.v1', 'default': 'mcp_cards.v1'}}}
输入模式
{'type': 'object', 'properties': {'slug': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['big4-aireys-inlet'], 'description': "Exact Total Parks property slug. Pair with state when you already know the listing. Example: 'big4-aireys-inlet'."}, 'limit': {'type': 'integer', 'default': 5, 'examples': [5], 'description': 'Maximum number of property matches to return. Default 5. Example: 3.'}, 'query': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['BIG4 Aireys Inlet'], 'description': "Park name or natural-language lookup text when you do not yet have a public property_ref. Example: 'BIG4 Aireys Inlet'."}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['vic'], 'description': "Australian state or territory code or name used with slug for an exact lookup. Example: 'vic' or 'Victoria'."}}}
输出模式
{'type': 'object', 'properties': {'matches': {'type': 'array', 'items': {'type': 'object', 'required': ['property_ref', 'name', 'channel_state'], 'properties': {'name': {'type': 'string'}, 'slug': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'region': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'suburb': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None}, 'address': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Public park address for traveller-facing disambiguation.'}, 'property_ref': {'type': 'string', 'description': 'Public property reference accepted by MCP tools. Use this, or property_url, for follow-up MCP calls.'}, 'property_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative public booking channel. This is separate from search candidate tier.'}, 'booking_enabled': {'type': 'boolean', 'default': False}}}}}}
输入模式
{'type': 'object', 'properties': {'kinds': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['highlight'], 'description': "Optional catalog kinds to return, such as 'feature' or 'highlight'. Accepts one kind or a list. Omit for all kinds."}, 'limit': {'type': 'integer', 'default': 50, 'examples': [50], 'description': 'Maximum catalog entries to return. Default 50. Example: 20.'}, 'query': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': ['campfire'], 'description': "Optional text to filter the amenity/highlight catalog, such as 'campfire', 'pool', or 'pet'. Omit to list the full catalog page."}}}
输出模式
{'type': 'object', 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'label'], 'properties': {'id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': "Feature ID when kind='feature'; omitted for highlights."}, 'kind': {'enum': ['feature', 'highlight'], 'type': 'string', 'description': 'Whether this option is a structured feature or a curated highlight.'}, 'slug': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': "Highlight slug when kind='highlight'; omitted for features."}, 'label': {'type': 'string', 'description': 'Traveller-facing name for this filter option.'}, 'aliases': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Extra traveller phrases that also resolve to this option.'}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Feature category grouping where available.'}, 'use_in_filter': {'type': 'object', 'description': "Exact search.v1 filter fragment to pass, e.g. {'feature_ids': [15]} or {'highlight_ids': ['campfire-friendly']}.", 'additionalProperties': True}}, 'description': 'One discoverable search filter (a structured feature or curated highlight).\n\n``use_in_filter`` mirrors the exact ``search.v1`` filter shape to merge into a\n``tp_search_parks`` / ``tp_search_stays`` ``filter`` argument, so the caller\nnever has to memorise internal numeric feature IDs.'}}, 'contract_version': {'type': 'string', 'const': 'search_filters.v1', 'default': 'search_filters.v1'}}, 'description': 'Discoverable catalog of structured search filters for the search tools.'}
输入模式
{'type': 'object', 'properties': {'geo': {'anyOf': [{'oneOf': [{'type': 'object', 'required': ['query'], 'properties': {'type': {'type': 'string', 'const': 'place', 'default': 'place'}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Place, region, POI, or park name to resolve server-side.'}, 'radius_km': {'anyOf': [{'type': 'number', 'maximum': 500.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Optional radius around the resolved anchor in kilometres.'}}, 'description': 'Server-resolved place, region, POI, or park-name query.'}, {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Latitude in WGS84.'}, 'lon': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Longitude in WGS84.'}, 'type': {'type': 'string', 'const': 'point', 'default': 'point'}, 'radius_km': {'anyOf': [{'type': 'number', 'maximum': 500.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Optional radius around the point in kilometres.'}}, 'description': 'Pre-resolved point geometry from a trusted client.'}, {'type': 'object', 'required': ['west', 'south', 'east', 'north'], 'properties': {'east': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Eastern longitude bound in WGS84.'}, 'type': {'type': 'string', 'const': 'bbox', 'default': 'bbox'}, 'west': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Western longitude bound in WGS84.'}, 'north': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Northern latitude bound in WGS84.'}, 'south': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Southern latitude bound in WGS84.'}}, 'description': 'Pre-resolved rectangular viewport or region bounds.'}, {'type': 'object', 'required': ['coordinates'], 'properties': {'type': {'type': 'string', 'const': 'polygon', 'default': 'polygon'}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}, 'minItems': 4, 'description': 'Closed polygon ring as `[lon, lat]` coordinate pairs. Corridor geometry is deliberately reserved for Phase C.'}}, 'description': 'Pre-resolved polygon ring in WGS84 `[lon, lat]` coordinates.'}], 'discriminator': {'propertyName': 'type'}}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'type': 'place', 'query': 'Aireys Inlet'}], 'description': 'search.v1 geo gate. Prefer a place object or a place-name string. Do not invent geo.type=\'state\'; use filter.states for a whole Australian state. Example: {"type":"place","query":"Aireys Inlet"}.'}, 'vibe': {'anyOf': [{'type': 'object', 'properties': {'query': {'anyOf': [{'type': 'string', 'maxLength': 500, 'minLength': 1}, {'type': 'null'}], 'default': None, 'description': 'Free-text vibe or inspiration phrase for semantic ranking.'}, 'setting': {'anyOf': [{'enum': ['beachside', 'riverside', 'lakeside', 'bushland', 'mountain', 'rural', 'town_centre', 'city_fringe', 'coastal', 'outback'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Soft setting preference used for ranking, not hard gating.'}, 'category_slug': {'anyOf': [{'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 80, 'minLength': 1}, {'type': 'null'}], 'default': None, 'description': 'Optional editorial vibe/category slug.'}, 'traveller_appeal': {'type': 'array', 'items': {'enum': ['grey_nomads', 'families', 'couples', 'groups', 'fishers', 'hikers', 'pet_owners', 'big_rig_tourers'], 'type': 'string'}, 'description': 'Soft traveller segment preferences used for ranking.'}}, 'description': 'Soft preference signals used to rank within the gated candidate set.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'traveller_appeal': ['families']}], 'description': 'search.v1 soft ranking signals such as vibe.query or traveller_appeal=[\'families\']. Does not hard-gate candidates. Example: {"traveller_appeal":["families"]}.'}, 'filter': {'anyOf': [{'type': 'object', 'properties': {'any_of': {'type': 'array', 'items': {'type': 'object', 'properties': {'feature_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Feature IDs; matching any one satisfies this group.'}, 'highlight_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Highlight IDs; matching any one satisfies this group.'}, 'local_proximity': {'type': 'array', 'items': {'type': 'object', 'required': ['topic', 'max_distance_km'], 'properties': {'topic': {'enum': ['supermarket', 'pharmacy', 'boat_ramp', 'dump_point', 'ev_charging', 'beach', 'brewery'], 'type': 'string', 'description': 'Allowlisted off-site topic: supermarket, pharmacy, boat_ramp, dump_point, ev_charging, beach, or brewery.'}, 'max_distance_km': {'type': 'number', 'description': "Required maximum straight-line distance in kilometres. REST and GUI callers and explicit MCP arguments must provide a bound; the controlled MCP natural-language adapter may fill an audited topic default for clear 'near' or 'close' wording.", 'exclusiveMinimum': 0}}, 'description': 'One confirmed off-site topic required within a straight-line bound.'}, 'description': 'Independent off-site topic/distance alternatives; matching any one satisfies this group.'}}, 'description': 'An OR-group of on-property and/or off-site structured facts.\n\nA candidate satisfies the group when it has *any* of the listed feature IDs\nor highlight IDs (overlap, not contains-all), or satisfies any listed local\nproximity constraint. Groups let a single real-world concept represented in\ndifferent source stores â\x80\x94 e.g. on-site EV charging or a confirmed charger\nnearby â\x80\x94 match without merging those stores.\n\nMultiple groups on a filter are ANDed together; members *within* a group are\nORed.'}, 'description': 'OR-groups: each group is satisfied when a candidate has any listed feature, highlight, or confirmed local-proximity match. Groups are ANDed together; members within a group are ORed.'}, 'states': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Uppercase Australian state names aligned with map geobuf data.'}, 'setting': {'anyOf': [{'enum': ['beachside', 'riverside', 'lakeside', 'bushland', 'mountain', 'rural', 'town_centre', 'city_fringe', 'coastal', 'outback'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Canonical enrichment setting, e.g. beachside or bushland.'}, 'accessible': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Optional accessibility-oriented filter signal.'}, 'region_ids': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 57, 'description': 'Canonical tourism-region IDs to include with exact, OR-within-dimension matching against Property.region (for example, nsw-north-coast). Regions are distinct from state filters.'}, 'feature_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Property feature IDs that candidates must satisfy.'}, 'pet_friendly': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Property-level pet-friendly filter. For dog-friendly or pet-friendly discovery/stay searches, set this true as a search filter and also put the declared travelling pet facts in intent.pet when using tp_search_stays. Phase B hard pet checks use the capability graph and room-type truth before claiming fit.'}, 'highlight_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Curated property highlight IDs that candidates must satisfy. Use stable highlight slugs when the traveller asks for known curated signals such as campfire-friendly, swimming-pool, resort-style-pool, beach-access, or pet-friendly.'}, 'option_facets': {'type': 'array', 'items': {'enum': ['powered', 'unpowered', 'ensuite', 'drive_through', 'slab', 'tent_only', 'accessible', 'spa', 'pet_friendly', 'family', 'pet_fee_applies', 'no_pet_fee', 'declaration_required'], 'type': 'string', 'description': 'Traveller-facing inventory-option facts at room/site scope.'}, 'description': "Canonical room/site option facts requested by the traveller, e.g. powered, ensuite, drive_through, slab, accessible, spa, pet_friendly, family. Search annotates and tiers by scoped room-type evidence rather than treating these as park-level amenity checkboxes. Do not leave requested room/site option words only in vibe.query: copy every explicit option requirement here. For powered-site requests include option_facets=['powered'] and also set intent.equipment.power_required=true when using tp_search_stays."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Optional management or chain IDs to include.'}, 'booking_enabled': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'When true, restricts to parks bookable on Total Parks.'}, 'local_proximity': {'type': 'array', 'items': {'type': 'object', 'required': ['topic', 'max_distance_km'], 'properties': {'topic': {'enum': ['supermarket', 'pharmacy', 'boat_ramp', 'dump_point', 'ev_charging', 'beach', 'brewery'], 'type': 'string', 'description': 'Allowlisted off-site topic: supermarket, pharmacy, boat_ramp, dump_point, ev_charging, beach, or brewery.'}, 'max_distance_km': {'type': 'number', 'description': "Required maximum straight-line distance in kilometres. REST and GUI callers and explicit MCP arguments must provide a bound; the controlled MCP natural-language adapter may fill an audited topic default for clear 'near' or 'close' wording.", 'exclusiveMinimum': 0}}, 'description': 'One confirmed off-site topic required within a straight-line bound.'}, 'description': "Confirmed current off-site topic/distance requirements. Every entry is required (AND semantics). Use this for explicit 'near', 'close', or 'within X km' venue needs, not on-property amenities, coastal vibe, or walking/driving claims."}, 'traveller_appeal': {'type': 'array', 'items': {'enum': ['grey_nomads', 'families', 'couples', 'groups', 'fishers', 'hikers', 'pet_owners', 'big_rig_tourers'], 'type': 'string'}, 'description': 'Traveller segment hints from the enrichment taxonomy.'}, 'min_google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Optional explicit minimum cached Google star rating. Properties with a lower or missing rating do not satisfy this hard filter.'}, 'accommodation_kind': {'anyOf': [{'enum': ['site', 'accommodation'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional stay-kind filter: use site for caravan, campervan, motorhome, fifth-wheeler, tent, camping, powered-site, unpowered-site, ensuite-site, slab-site, and drive-through-site requests; use accommodation for cabins, villas, cottages, glamping, and similar roofed stays.'}}, 'description': 'Authoritative structured filters applied before vibe ranking.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'states': ['TASMANIA'], 'pet_friendly': True}], 'description': 'search.v1 hard filters applied before vibe ranking: states, features, highlights, pet_friendly, option_facets, and local_proximity. Discover names via tp_search_filter_options. Example: {"states":["TASMANIA"],"pet_friendly":true}.'}, 'paging': {'anyOf': [{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of candidates to return.'}, 'cursor': {'anyOf': [{'type': 'string', 'maxLength': 512}, {'type': 'null'}], 'default': None, 'description': 'Opaque cursor returned by a previous search response.'}}, 'description': 'Cursor pagination for search results.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'limit': 20}], 'description': 'search.v1 cursor pagination. Example: {"limit":20}.'}, 'natural_language': {'anyOf': [{'type': 'string', 'maxLength': 500, 'minLength': 1}, {'type': 'null'}], 'default': None, 'examples': ['powered sites near Lakes Entrance with a dump point nearby'], 'description': "Traveller's original search wording. Fill structured geo, filter, vibe, and intent fields when known, and also pass the traveller's phrasing here so Total Parks can recover deterministic aliases, including controlled off-site near/close/within-km local facts, and use it for vibe ranking. Explicit structured distances remain authoritative. Walking or driving distance requires clarification because stored local distances are straight-line only."}}}
输出模式
{'type': 'object', 'required': ['paging'], 'properties': {'facets': {'anyOf': [{'type': 'object', 'properties': {'states': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'setting': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'accessible': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'feature_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'pet_friendly': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'channel_state': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'highlight_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'option_facets': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'management_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'booking_enabled': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'traveller_appeal': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'accommodation_kind': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}}, 'description': 'Filter-lane facet counts for the current search result set.'}, {'type': 'null'}], 'default': None, 'description': 'Filter facet counts for the primary result set.'}, 'paging': {'type': 'object', 'required': ['limit', 'returned'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Page size used for the response.'}, 'total': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Total matching candidates when cheaply known.'}, 'has_more': {'type': 'boolean', 'default': False, 'description': 'Whether another page is available.'}, 'returned': {'type': 'integer', 'minimum': 0, 'description': 'Number of candidates returned.'}, 'next_cursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Opaque cursor for the next page, when has_more is true.'}}, 'description': 'Pagination metadata for primary candidates only.'}, 'warnings': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'message': {'type': 'string', 'maxLength': 500, 'minLength': 1}, 'recovery_hint': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'default': None}}, 'description': 'Non-fatal warning or query-level limitation.'}, 'description': 'Query-level warnings, refusals, or coverage caveats.'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_ref', 'property_url', 'property_id', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned map pins when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned map pins when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review a paid availability watch for this sold-out stay. It does not hold a site, create a watch, or take payment.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link when a specific option is ready for checkout handoff. It does not reserve inventory.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Request-to-Book form for an eligible request-only property. A submitted request is not a confirmed booking.'}}, 'description': 'Optional handoff links for a candidate.'}, {'type': 'null'}], 'default': None, 'description': 'Optional Total Parks handoff URLs.'}, 'planning': {'anyOf': [{'type': 'object', 'required': ['status', 'last_updated'], 'properties': {'status': {'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live inventory availability status from Total Parks ARI.'}, 'provenance': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Total Parks live inventory source (PMS-synced ARI). Search reads this replica rather than issuing per-candidate PMS round-trips.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent source timestamp contributing to this status.'}, 'status_label': {'type': 'string', 'default': '', 'description': 'Traveller-facing availability phrase derived from status. Render this in answers instead of the raw status enum.'}, 'checkout_note': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Traveller/agent-facing note: availability comes from live Total Parks inventory and is confirmed at checkout before payment.'}, 'planning_tier_caveat': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Deprecated alias of checkout_note. Emitted for ChatGPT plugin / MCP compatibility until the next directory release; prefer checkout_note. See docs/features/CHATGPT_PLUGIN.md.'}}, 'description': 'Freshness/provenance wrapper for planning-tier availability facts.'}, {'type': 'null'}], 'default': None, 'description': 'Planning-tier availability envelope when intent was supplied.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'image_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Approved public property image URLs in display order.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for list/map sync and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for grounded result summaries.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight cards and agent summaries.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing room/site URL when the candidate is option-specific.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': "Compact traveller-facing location, e.g. 'Lakes Entrance, VIC'."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Management group IDs for logo lookup on result cards.'}, 'matched_signals': {'type': 'array', 'items': {'type': 'object', 'required': ['lane', 'code'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Stable machine-readable match code.'}, 'lane': {'enum': ['geo', 'filter', 'vibe', 'intent'], 'type': 'string', 'description': 'Search lane that produced this annotation.'}, 'label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Short traveller-facing match label.'}, 'detail': {'type': 'object', 'description': 'Optional structured detail for clients that need it.', 'additionalProperties': True}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Confidence for this annotation when applicable.'}, 'provenance': {'anyOf': [{'type': 'string', 'maxLength': 100}, {'type': 'null'}], 'default': None, 'description': 'Source class for the matched signal when known.'}}, 'description': 'One lane-specific reason a candidate matched the structured query.'}, 'description': 'Lane-specific annotations; not full constraint results.'}, 'indicative_pricing': {'anyOf': [{'type': 'object', 'properties': {'site': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative site stay price when complete cached rates exist.'}, 'accommodation': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative cabin/accommodation stay price when complete cached rates exist.'}}, 'description': 'Separate indicative price summaries for supported stay kinds.'}, {'type': 'null'}], 'default': None, 'description': 'Cache-only indicative pricing split by stay kind. Omitted when search did not run dated/flexible planning, rates are incomplete, or the candidate is discovery-only.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Lightweight search result; deep judgement lives in assess tools.'}, 'description': 'Ranked, tiered primary candidate results.'}, 'map_candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_id', 'property_ref', 'property_url', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned pin geometry when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned pin geometry when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'image_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Single approved cover image URL for map popovers.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for map pins and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for map popovers.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight map popovers.'}, 'headline_price': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}}, 'description': 'Single compact headline price for map marker labels.'}, {'type': 'null'}], 'default': None, 'description': 'Single cache-only headline price for marker labels.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Compact traveller-facing location for map popovers.'}, 'planning_status': {'anyOf': [{'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live Total Parks inventory status from PMS-synced ARI.'}, {'type': 'null'}], 'default': None, 'description': 'Planning status for marker colour, when intent was supplied.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing booking handoff URL when available.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing request form for an eligible request-only property.'}, 'bookable_option_count': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': 'Matching bookable room options for the dated planning request.'}, 'planning_status_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing planning label for marker popovers.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Compact, unpaginated marker state for search map projections.'}, 'description': 'Compact unpaginated marker projection for every primary candidate matching the canonical query. List pagination does not apply to this field.'}, 'contract_version': {'type': 'string', 'const': 'search.v1', 'default': 'search.v1', 'description': 'Stable search contract version.'}, 'nearby_candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_ref', 'property_url', 'property_id', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned map pins when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned map pins when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review a paid availability watch for this sold-out stay. It does not hold a site, create a watch, or take payment.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link when a specific option is ready for checkout handoff. It does not reserve inventory.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Request-to-Book form for an eligible request-only property. A submitted request is not a confirmed booking.'}}, 'description': 'Optional handoff links for a candidate.'}, {'type': 'null'}], 'default': None, 'description': 'Optional Total Parks handoff URLs.'}, 'planning': {'anyOf': [{'type': 'object', 'required': ['status', 'last_updated'], 'properties': {'status': {'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live inventory availability status from Total Parks ARI.'}, 'provenance': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Total Parks live inventory source (PMS-synced ARI). Search reads this replica rather than issuing per-candidate PMS round-trips.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent source timestamp contributing to this status.'}, 'status_label': {'type': 'string', 'default': '', 'description': 'Traveller-facing availability phrase derived from status. Render this in answers instead of the raw status enum.'}, 'checkout_note': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Traveller/agent-facing note: availability comes from live Total Parks inventory and is confirmed at checkout before payment.'}, 'planning_tier_caveat': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Deprecated alias of checkout_note. Emitted for ChatGPT plugin / MCP compatibility until the next directory release; prefer checkout_note. See docs/features/CHATGPT_PLUGIN.md.'}}, 'description': 'Freshness/provenance wrapper for planning-tier availability facts.'}, {'type': 'null'}], 'default': None, 'description': 'Planning-tier availability envelope when intent was supplied.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'image_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Approved public property image URLs in display order.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for list/map sync and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for grounded result summaries.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight cards and agent summaries.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing room/site URL when the candidate is option-specific.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': "Compact traveller-facing location, e.g. 'Lakes Entrance, VIC'."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Management group IDs for logo lookup on result cards.'}, 'matched_signals': {'type': 'array', 'items': {'type': 'object', 'required': ['lane', 'code'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Stable machine-readable match code.'}, 'lane': {'enum': ['geo', 'filter', 'vibe', 'intent'], 'type': 'string', 'description': 'Search lane that produced this annotation.'}, 'label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Short traveller-facing match label.'}, 'detail': {'type': 'object', 'description': 'Optional structured detail for clients that need it.', 'additionalProperties': True}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Confidence for this annotation when applicable.'}, 'provenance': {'anyOf': [{'type': 'string', 'maxLength': 100}, {'type': 'null'}], 'default': None, 'description': 'Source class for the matched signal when known.'}}, 'description': 'One lane-specific reason a candidate matched the structured query.'}, 'description': 'Lane-specific annotations; not full constraint results.'}, 'indicative_pricing': {'anyOf': [{'type': 'object', 'properties': {'site': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative site stay price when complete cached rates exist.'}, 'accommodation': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative cabin/accommodation stay price when complete cached rates exist.'}}, 'description': 'Separate indicative price summaries for supported stay kinds.'}, {'type': 'null'}], 'default': None, 'description': 'Cache-only indicative pricing split by stay kind. Omitted when search did not run dated/flexible planning, rates are incomplete, or the candidate is discovery-only.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Lightweight search result; deep judgement lives in assess tools.'}, 'description': "Ranked, tiered candidates outside the primary search envelope but within the request's nearby radius. Not included in paging totals or facet counts."}}, 'description': 'Versioned response envelope for the unified search primitive.'}
输入模式
{'type': 'object', 'required': ['intent'], 'properties': {'geo': {'anyOf': [{'oneOf': [{'type': 'object', 'required': ['query'], 'properties': {'type': {'type': 'string', 'const': 'place', 'default': 'place'}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Place, region, POI, or park name to resolve server-side.'}, 'radius_km': {'anyOf': [{'type': 'number', 'maximum': 500.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Optional radius around the resolved anchor in kilometres.'}}, 'description': 'Server-resolved place, region, POI, or park-name query.'}, {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Latitude in WGS84.'}, 'lon': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Longitude in WGS84.'}, 'type': {'type': 'string', 'const': 'point', 'default': 'point'}, 'radius_km': {'anyOf': [{'type': 'number', 'maximum': 500.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Optional radius around the point in kilometres.'}}, 'description': 'Pre-resolved point geometry from a trusted client.'}, {'type': 'object', 'required': ['west', 'south', 'east', 'north'], 'properties': {'east': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Eastern longitude bound in WGS84.'}, 'type': {'type': 'string', 'const': 'bbox', 'default': 'bbox'}, 'west': {'type': 'number', 'maximum': 180.0, 'minimum': -180.0, 'description': 'Western longitude bound in WGS84.'}, 'north': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Northern latitude bound in WGS84.'}, 'south': {'type': 'number', 'maximum': 90.0, 'minimum': -90.0, 'description': 'Southern latitude bound in WGS84.'}}, 'description': 'Pre-resolved rectangular viewport or region bounds.'}, {'type': 'object', 'required': ['coordinates'], 'properties': {'type': {'type': 'string', 'const': 'polygon', 'default': 'polygon'}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}, 'minItems': 4, 'description': 'Closed polygon ring as `[lon, lat]` coordinate pairs. Corridor geometry is deliberately reserved for Phase C.'}}, 'description': 'Pre-resolved polygon ring in WGS84 `[lon, lat]` coordinates.'}], 'discriminator': {'propertyName': 'type'}}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'type': 'place', 'query': 'Aireys Inlet'}], 'description': 'search.v1 geo gate. Prefer a place object or a place-name string. Do not invent geo.type=\'state\'; use filter.states for a whole Australian state. Example: {"type":"place","query":"Aireys Inlet"}.'}, 'vibe': {'anyOf': [{'type': 'object', 'properties': {'query': {'anyOf': [{'type': 'string', 'maxLength': 500, 'minLength': 1}, {'type': 'null'}], 'default': None, 'description': 'Free-text vibe or inspiration phrase for semantic ranking.'}, 'setting': {'anyOf': [{'enum': ['beachside', 'riverside', 'lakeside', 'bushland', 'mountain', 'rural', 'town_centre', 'city_fringe', 'coastal', 'outback'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Soft setting preference used for ranking, not hard gating.'}, 'category_slug': {'anyOf': [{'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 80, 'minLength': 1}, {'type': 'null'}], 'default': None, 'description': 'Optional editorial vibe/category slug.'}, 'traveller_appeal': {'type': 'array', 'items': {'enum': ['grey_nomads', 'families', 'couples', 'groups', 'fishers', 'hikers', 'pet_owners', 'big_rig_tourers'], 'type': 'string'}, 'description': 'Soft traveller segment preferences used for ranking.'}}, 'description': 'Soft preference signals used to rank within the gated candidate set.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'traveller_appeal': ['families']}], 'description': 'search.v1 soft ranking signals such as vibe.query or traveller_appeal=[\'families\']. Does not hard-gate candidates. Example: {"traveller_appeal":["families"]}.'}, 'filter': {'anyOf': [{'type': 'object', 'properties': {'any_of': {'type': 'array', 'items': {'type': 'object', 'properties': {'feature_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Feature IDs; matching any one satisfies this group.'}, 'highlight_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Highlight IDs; matching any one satisfies this group.'}, 'local_proximity': {'type': 'array', 'items': {'type': 'object', 'required': ['topic', 'max_distance_km'], 'properties': {'topic': {'enum': ['supermarket', 'pharmacy', 'boat_ramp', 'dump_point', 'ev_charging', 'beach', 'brewery'], 'type': 'string', 'description': 'Allowlisted off-site topic: supermarket, pharmacy, boat_ramp, dump_point, ev_charging, beach, or brewery.'}, 'max_distance_km': {'type': 'number', 'description': "Required maximum straight-line distance in kilometres. REST and GUI callers and explicit MCP arguments must provide a bound; the controlled MCP natural-language adapter may fill an audited topic default for clear 'near' or 'close' wording.", 'exclusiveMinimum': 0}}, 'description': 'One confirmed off-site topic required within a straight-line bound.'}, 'description': 'Independent off-site topic/distance alternatives; matching any one satisfies this group.'}}, 'description': 'An OR-group of on-property and/or off-site structured facts.\n\nA candidate satisfies the group when it has *any* of the listed feature IDs\nor highlight IDs (overlap, not contains-all), or satisfies any listed local\nproximity constraint. Groups let a single real-world concept represented in\ndifferent source stores â\x80\x94 e.g. on-site EV charging or a confirmed charger\nnearby â\x80\x94 match without merging those stores.\n\nMultiple groups on a filter are ANDed together; members *within* a group are\nORed.'}, 'description': 'OR-groups: each group is satisfied when a candidate has any listed feature, highlight, or confirmed local-proximity match. Groups are ANDed together; members within a group are ORed.'}, 'states': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Uppercase Australian state names aligned with map geobuf data.'}, 'setting': {'anyOf': [{'enum': ['beachside', 'riverside', 'lakeside', 'bushland', 'mountain', 'rural', 'town_centre', 'city_fringe', 'coastal', 'outback'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Canonical enrichment setting, e.g. beachside or bushland.'}, 'accessible': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Optional accessibility-oriented filter signal.'}, 'region_ids': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 57, 'description': 'Canonical tourism-region IDs to include with exact, OR-within-dimension matching against Property.region (for example, nsw-north-coast). Regions are distinct from state filters.'}, 'feature_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Property feature IDs that candidates must satisfy.'}, 'pet_friendly': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Property-level pet-friendly filter. For dog-friendly or pet-friendly discovery/stay searches, set this true as a search filter and also put the declared travelling pet facts in intent.pet when using tp_search_stays. Phase B hard pet checks use the capability graph and room-type truth before claiming fit.'}, 'highlight_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Curated property highlight IDs that candidates must satisfy. Use stable highlight slugs when the traveller asks for known curated signals such as campfire-friendly, swimming-pool, resort-style-pool, beach-access, or pet-friendly.'}, 'option_facets': {'type': 'array', 'items': {'enum': ['powered', 'unpowered', 'ensuite', 'drive_through', 'slab', 'tent_only', 'accessible', 'spa', 'pet_friendly', 'family', 'pet_fee_applies', 'no_pet_fee', 'declaration_required'], 'type': 'string', 'description': 'Traveller-facing inventory-option facts at room/site scope.'}, 'description': "Canonical room/site option facts requested by the traveller, e.g. powered, ensuite, drive_through, slab, accessible, spa, pet_friendly, family. Search annotates and tiers by scoped room-type evidence rather than treating these as park-level amenity checkboxes. Do not leave requested room/site option words only in vibe.query: copy every explicit option requirement here. For powered-site requests include option_facets=['powered'] and also set intent.equipment.power_required=true when using tp_search_stays."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Optional management or chain IDs to include.'}, 'booking_enabled': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'When true, restricts to parks bookable on Total Parks.'}, 'local_proximity': {'type': 'array', 'items': {'type': 'object', 'required': ['topic', 'max_distance_km'], 'properties': {'topic': {'enum': ['supermarket', 'pharmacy', 'boat_ramp', 'dump_point', 'ev_charging', 'beach', 'brewery'], 'type': 'string', 'description': 'Allowlisted off-site topic: supermarket, pharmacy, boat_ramp, dump_point, ev_charging, beach, or brewery.'}, 'max_distance_km': {'type': 'number', 'description': "Required maximum straight-line distance in kilometres. REST and GUI callers and explicit MCP arguments must provide a bound; the controlled MCP natural-language adapter may fill an audited topic default for clear 'near' or 'close' wording.", 'exclusiveMinimum': 0}}, 'description': 'One confirmed off-site topic required within a straight-line bound.'}, 'description': "Confirmed current off-site topic/distance requirements. Every entry is required (AND semantics). Use this for explicit 'near', 'close', or 'within X km' venue needs, not on-property amenities, coastal vibe, or walking/driving claims."}, 'traveller_appeal': {'type': 'array', 'items': {'enum': ['grey_nomads', 'families', 'couples', 'groups', 'fishers', 'hikers', 'pet_owners', 'big_rig_tourers'], 'type': 'string'}, 'description': 'Traveller segment hints from the enrichment taxonomy.'}, 'min_google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Optional explicit minimum cached Google star rating. Properties with a lower or missing rating do not satisfy this hard filter.'}, 'accommodation_kind': {'anyOf': [{'enum': ['site', 'accommodation'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional stay-kind filter: use site for caravan, campervan, motorhome, fifth-wheeler, tent, camping, powered-site, unpowered-site, ensuite-site, slab-site, and drive-through-site requests; use accommodation for cabins, villas, cottages, glamping, and similar roofed stays.'}}, 'description': 'Authoritative structured filters applied before vibe ranking.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'states': ['TASMANIA'], 'pet_friendly': True}], 'description': 'search.v1 hard filters applied before vibe ranking: states, features, highlights, pet_friendly, option_facets, and local_proximity. Discover names via tp_search_filter_options. Example: {"states":["TASMANIA"],"pet_friendly":true}.'}, 'intent': {'anyOf': [{'type': 'object', 'properties': {'pet': {'anyOf': [{'type': 'object', 'properties': {'breed': {'anyOf': [{'type': 'string', 'maxLength': 100}, {'type': 'null'}], 'default': None, 'description': 'Guest-supplied breed name or slug when known.'}, 'pet_size': {'anyOf': [{'enum': ['small', 'medium', 'large'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional pet size declaration.'}, 'pet_type': {'anyOf': [{'type': 'string', 'maxLength': 50}, {'type': 'null'}], 'default': None, 'description': 'Primary pet type, e.g. dog.'}, 'pet_count': {'anyOf': [{'type': 'integer', 'maximum': 6, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Number of pets travelling.'}, 'traveling_with_pets': {'type': 'boolean', 'default': False, 'description': 'Whether the traveller is travelling with pets.'}}, 'description': 'Pet intent facts used for planning-tier policy checks.'}, {'type': 'null'}], 'default': None, 'description': 'Pet declaration for pet-friendly stay search. Example: {"traveling_with_pets":true,"pet_type":"dog"}.'}, 'adults': {'type': 'integer', 'default': 2, 'maximum': 20, 'minimum': 1, 'description': 'Number of adults in the party. Example: 2.'}, 'infants': {'type': 'integer', 'default': 0, 'maximum': 10, 'minimum': 0, 'description': 'Number of infants in the party.'}, 'check_in': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'description': 'Desired check-in date. Must be paired with check_out.'}, 'children': {'type': 'integer', 'default': 0, 'maximum': 20, 'minimum': 0, 'description': 'Number of children in the party, excluding infants.'}, 'check_out': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'default': None, 'description': 'Desired check-out date. Must be after check_in.'}, 'equipment': {'anyOf': [{'type': 'object', 'properties': {'type': {'anyOf': [{'enum': ['caravan', 'campervan', 'motorhome', 'camp_trailer', 'roof_top_tent', 'tent', 'swag', 'car_ute', 'fifth_wheeler', 'boat_trailer'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Canonical equipment type, e.g. caravan or motorhome.'}, 'width_m': {'anyOf': [{'type': 'number', 'maximum': 10.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Optional rig width in metres.'}, 'length_m': {'anyOf': [{'type': 'number', 'maximum': 30.0, 'minimum': 1.0}, {'type': 'null'}], 'default': None, 'description': 'Rig length in metres.'}, 'power_required': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'default': None, 'description': 'Whether the traveller requires a powered site.'}}, 'description': 'Backward-compatible wire name for the embedded search rig profile.'}, {'type': 'null'}], 'default': None, 'description': 'Declared rig/equipment for site-fit ranking. Example: {"type":"caravan","length_m":7.5}.'}, 'flexible_window': {'anyOf': [{'oneOf': [{'type': 'object', 'required': ['anchor_date'], 'properties': {'type': {'type': 'string', 'const': 'around_date', 'default': 'around_date'}, 'flex_days': {'type': 'integer', 'default': 3, 'maximum': 31, 'minimum': 0, 'description': "Number of days either side of anchor_date to search. For phrasing like 'around a date' or 'within a few days either side', explicitly set flex_days=3 instead of relying on the default."}, 'max_nights': {'anyOf': [{'type': 'integer', 'maximum': 90, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default.'}, 'min_nights': {'type': 'integer', 'default': 1, 'maximum': 90, 'minimum': 1, 'description': "Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value."}, 'anchor_date': {'type': 'string', 'format': 'date', 'description': 'Preferred check-in date.'}}, 'description': 'Check-in dates within ±N days of an anchor date.'}, {'type': 'object', 'required': ['year', 'month'], 'properties': {'type': {'type': 'string', 'const': 'calendar_month', 'default': 'calendar_month'}, 'year': {'type': 'integer', 'maximum': 2100, 'minimum': 2024, 'description': 'Calendar year of the month to search, e.g. 2026.'}, 'month': {'type': 'integer', 'maximum': 12, 'minimum': 1, 'description': 'Calendar month number from 1 (January) to 12 (December).'}, 'max_nights': {'anyOf': [{'type': 'integer', 'maximum': 90, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default.'}, 'min_nights': {'type': 'integer', 'default': 1, 'maximum': 90, 'minimum': 1, 'description': "Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value."}}, 'description': 'Check-in dates anywhere in one calendar month.'}, {'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'type': {'type': 'string', 'const': 'date_range', 'default': 'date_range'}, 'end_date': {'type': 'string', 'format': 'date', 'description': 'Last acceptable check-in date.'}, 'max_nights': {'anyOf': [{'type': 'integer', 'maximum': 90, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default.'}, 'min_nights': {'type': 'integer', 'default': 1, 'maximum': 90, 'minimum': 1, 'description': "Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value."}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'First acceptable check-in date.'}}, 'description': 'Check-in dates inside an explicit bounded range.'}, {'type': 'object', 'required': ['year', 'season'], 'properties': {'type': {'type': 'string', 'const': 'season', 'default': 'season'}, 'year': {'type': 'integer', 'maximum': 2100, 'minimum': 2024, 'description': 'Season start year; summer spans December of this year through February of the following year.'}, 'season': {'enum': ['summer', 'autumn', 'winter', 'spring'], 'type': 'string'}, 'max_nights': {'anyOf': [{'type': 'integer', 'maximum': 90, 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default.'}, 'min_nights': {'type': 'integer', 'default': 1, 'maximum': 90, 'minimum': 1, 'description': "Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value."}}, 'description': 'Check-in dates inside an Australian tourism season.'}], 'discriminator': {'propertyName': 'type'}}, {'type': 'null'}], 'default': None, 'description': 'Flexible check-in window for planning-tier search. Mutually exclusive with check_in/check_out.'}}, 'description': 'Dates, guests, pets, and rig intent layered over discovery results.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}], 'examples': [{'adults': 2, 'check_in': '2026-10-03', 'check_out': '2026-10-06'}], 'description': 'search.v1 stay intent: check_in/check_out, guests, pets, rig, or flexible_window. Required for tp_search_stays. For month-wide searches use flexible_window instead of probing weekends. Example: {"check_in":"2026-10-03","check_out":"2026-10-06","adults":2}.'}, 'paging': {'anyOf': [{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of candidates to return.'}, 'cursor': {'anyOf': [{'type': 'string', 'maxLength': 512}, {'type': 'null'}], 'default': None, 'description': 'Opaque cursor returned by a previous search response.'}}, 'description': 'Cursor pagination for search results.'}, {'type': 'object', 'additionalProperties': True}, {'type': 'string'}, {'type': 'null'}], 'default': None, 'examples': [{'limit': 20}], 'description': 'search.v1 cursor pagination. Example: {"limit":20}.'}, 'natural_language': {'anyOf': [{'type': 'string', 'maxLength': 500, 'minLength': 1}, {'type': 'null'}], 'default': None, 'examples': ['powered sites near Lakes Entrance with a dump point nearby'], 'description': "Traveller's original search wording. Fill structured geo, filter, vibe, and intent fields when known, and also pass the traveller's phrasing here so Total Parks can recover deterministic aliases, including controlled off-site near/close/within-km local facts, and use it for vibe ranking. Explicit structured distances remain authoritative. Walking or driving distance requires clarification because stored local distances are straight-line only."}}}
输出模式
{'type': 'object', 'required': ['paging'], 'properties': {'facets': {'anyOf': [{'type': 'object', 'properties': {'states': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'setting': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'accessible': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'feature_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'pet_friendly': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'channel_state': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'highlight_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'option_facets': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'management_ids': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'booking_enabled': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'traveller_appeal': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}, 'accommodation_kind': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'count'], 'properties': {'count': {'type': 'integer', 'minimum': 0, 'description': 'Number of current candidates with this value.'}, 'value': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'boolean'}], 'description': 'Filter value represented by this facet.'}}, 'description': 'Count for one search filter value in the current result set.'}}}, 'description': 'Filter-lane facet counts for the current search result set.'}, {'type': 'null'}], 'default': None, 'description': 'Filter facet counts for the primary result set.'}, 'paging': {'type': 'object', 'required': ['limit', 'returned'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Page size used for the response.'}, 'total': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Total matching candidates when cheaply known.'}, 'has_more': {'type': 'boolean', 'default': False, 'description': 'Whether another page is available.'}, 'returned': {'type': 'integer', 'minimum': 0, 'description': 'Number of candidates returned.'}, 'next_cursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Opaque cursor for the next page, when has_more is true.'}}, 'description': 'Pagination metadata for primary candidates only.'}, 'warnings': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'message': {'type': 'string', 'maxLength': 500, 'minLength': 1}, 'recovery_hint': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'default': None}}, 'description': 'Non-fatal warning or query-level limitation.'}, 'description': 'Query-level warnings, refusals, or coverage caveats.'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_ref', 'property_url', 'property_id', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned map pins when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned map pins when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review a paid availability watch for this sold-out stay. It does not hold a site, create a watch, or take payment.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link when a specific option is ready for checkout handoff. It does not reserve inventory.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Request-to-Book form for an eligible request-only property. A submitted request is not a confirmed booking.'}}, 'description': 'Optional handoff links for a candidate.'}, {'type': 'null'}], 'default': None, 'description': 'Optional Total Parks handoff URLs.'}, 'planning': {'anyOf': [{'type': 'object', 'required': ['status', 'last_updated'], 'properties': {'status': {'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live inventory availability status from Total Parks ARI.'}, 'provenance': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Total Parks live inventory source (PMS-synced ARI). Search reads this replica rather than issuing per-candidate PMS round-trips.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent source timestamp contributing to this status.'}, 'status_label': {'type': 'string', 'default': '', 'description': 'Traveller-facing availability phrase derived from status. Render this in answers instead of the raw status enum.'}, 'checkout_note': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Traveller/agent-facing note: availability comes from live Total Parks inventory and is confirmed at checkout before payment.'}, 'planning_tier_caveat': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Deprecated alias of checkout_note. Emitted for ChatGPT plugin / MCP compatibility until the next directory release; prefer checkout_note. See docs/features/CHATGPT_PLUGIN.md.'}}, 'description': 'Freshness/provenance wrapper for planning-tier availability facts.'}, {'type': 'null'}], 'default': None, 'description': 'Planning-tier availability envelope when intent was supplied.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'image_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Approved public property image URLs in display order.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for list/map sync and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for grounded result summaries.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight cards and agent summaries.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing room/site URL when the candidate is option-specific.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': "Compact traveller-facing location, e.g. 'Lakes Entrance, VIC'."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Management group IDs for logo lookup on result cards.'}, 'matched_signals': {'type': 'array', 'items': {'type': 'object', 'required': ['lane', 'code'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Stable machine-readable match code.'}, 'lane': {'enum': ['geo', 'filter', 'vibe', 'intent'], 'type': 'string', 'description': 'Search lane that produced this annotation.'}, 'label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Short traveller-facing match label.'}, 'detail': {'type': 'object', 'description': 'Optional structured detail for clients that need it.', 'additionalProperties': True}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Confidence for this annotation when applicable.'}, 'provenance': {'anyOf': [{'type': 'string', 'maxLength': 100}, {'type': 'null'}], 'default': None, 'description': 'Source class for the matched signal when known.'}}, 'description': 'One lane-specific reason a candidate matched the structured query.'}, 'description': 'Lane-specific annotations; not full constraint results.'}, 'indicative_pricing': {'anyOf': [{'type': 'object', 'properties': {'site': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative site stay price when complete cached rates exist.'}, 'accommodation': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative cabin/accommodation stay price when complete cached rates exist.'}}, 'description': 'Separate indicative price summaries for supported stay kinds.'}, {'type': 'null'}], 'default': None, 'description': 'Cache-only indicative pricing split by stay kind. Omitted when search did not run dated/flexible planning, rates are incomplete, or the candidate is discovery-only.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Lightweight search result; deep judgement lives in assess tools.'}, 'description': 'Ranked, tiered primary candidate results.'}, 'map_candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_id', 'property_ref', 'property_url', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned pin geometry when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned pin geometry when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'image_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Single approved cover image URL for map popovers.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for map pins and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for map popovers.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight map popovers.'}, 'headline_price': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}}, 'description': 'Single compact headline price for map marker labels.'}, {'type': 'null'}], 'default': None, 'description': 'Single cache-only headline price for marker labels.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Compact traveller-facing location for map popovers.'}, 'planning_status': {'anyOf': [{'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live Total Parks inventory status from PMS-synced ARI.'}, {'type': 'null'}], 'default': None, 'description': 'Planning status for marker colour, when intent was supplied.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing booking handoff URL when available.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing request form for an eligible request-only property.'}, 'bookable_option_count': {'type': 'integer', 'default': 0, 'minimum': 0, 'description': 'Matching bookable room options for the dated planning request.'}, 'planning_status_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing planning label for marker popovers.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Compact, unpaginated marker state for search map projections.'}, 'description': 'Compact unpaginated marker projection for every primary candidate matching the canonical query. List pagination does not apply to this field.'}, 'contract_version': {'type': 'string', 'const': 'search.v1', 'default': 'search.v1', 'description': 'Stable search contract version.'}, 'nearby_candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['property_ref', 'property_url', 'property_id', 'tier', 'channel_state', 'confidence'], 'properties': {'lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 latitude for search-owned map pins when known.'}, 'lon': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'default': None, 'description': 'WGS84 longitude for search-owned map pins when known.'}, 'tier': {'enum': ['bookable', 'likely', 'discovery'], 'type': 'string', 'description': 'Outer candidate tier: bookable, likely, or discovery.'}, 'actions': {'anyOf': [{'type': 'object', 'properties': {'start_watch_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks link to review a paid availability watch for this sold-out stay. It does not hold a site, create a watch, or take payment.'}, 'start_booking_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Total Parks booking link when a specific option is ready for checkout handoff. It does not reserve inventory.'}, 'request_to_book_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing Request-to-Book form for an eligible request-only property. A submitted request is not a confirmed booking.'}}, 'description': 'Optional handoff links for a candidate.'}, {'type': 'null'}], 'default': None, 'description': 'Optional Total Parks handoff URLs.'}, 'planning': {'anyOf': [{'type': 'object', 'required': ['status', 'last_updated'], 'properties': {'status': {'enum': ['available', 'limited', 'unavailable', 'unknown'], 'type': 'string', 'description': 'Live inventory availability status from Total Parks ARI.'}, 'provenance': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Total Parks live inventory source (PMS-synced ARI). Search reads this replica rather than issuing per-candidate PMS round-trips.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent source timestamp contributing to this status.'}, 'status_label': {'type': 'string', 'default': '', 'description': 'Traveller-facing availability phrase derived from status. Render this in answers instead of the raw status enum.'}, 'checkout_note': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Traveller/agent-facing note: availability comes from live Total Parks inventory and is confirmed at checkout before payment.'}, 'planning_tier_caveat': {'type': 'string', 'default': 'Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment.', 'description': 'Deprecated alias of checkout_note. Emitted for ChatGPT plugin / MCP compatibility until the next directory release; prefer checkout_note. See docs/features/CHATGPT_PLUGIN.md.'}}, 'description': 'Freshness/provenance wrapper for planning-tier availability facts.'}, {'type': 'null'}], 'default': None, 'description': 'Planning-tier availability envelope when intent was supplied.'}, 'confidence': {'enum': ['confirmed', 'inferred'], 'type': 'string', 'description': 'Orthogonal confidence axis for the candidate tier.'}, 'image_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Approved public property image URLs in display order.'}, 'property_id': {'type': 'integer', 'minimum': 1, 'description': 'Internal property ID for list/map sync and conversion.'}, 'pet_friendly': {'type': 'boolean', 'default': False, 'description': 'True when the property-level pet-friendly feature is set.'}, 'property_ref': {'type': 'string', 'minLength': 1, 'description': 'Public property reference accepted by MCP/search consumers.'}, 'property_url': {'type': 'string', 'minLength': 1, 'description': 'Traveller-facing Total Parks URL for the property.'}, 'channel_state': {'enum': ['live_booking', 'request_only', 'directory_only'], 'type': 'string', 'description': 'Server-authoritative booking channel; separate from candidate tier.'}, 'google_rating': {'anyOf': [{'type': 'number', 'maximum': 5, 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google star rating for grounded result summaries.'}, 'property_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Display name for lightweight cards and agent summaries.'}, 'room_type_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Traveller-facing room/site URL when the candidate is option-specific.'}, 'location_label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': "Compact traveller-facing location, e.g. 'Lakes Entrance, VIC'."}, 'management_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Management group IDs for logo lookup on result cards.'}, 'matched_signals': {'type': 'array', 'items': {'type': 'object', 'required': ['lane', 'code'], 'properties': {'code': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Stable machine-readable match code.'}, 'lane': {'enum': ['geo', 'filter', 'vibe', 'intent'], 'type': 'string', 'description': 'Search lane that produced this annotation.'}, 'label': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'default': None, 'description': 'Short traveller-facing match label.'}, 'detail': {'type': 'object', 'description': 'Optional structured detail for clients that need it.', 'additionalProperties': True}, 'confidence': {'anyOf': [{'enum': ['confirmed', 'inferred'], 'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Confidence for this annotation when applicable.'}, 'provenance': {'anyOf': [{'type': 'string', 'maxLength': 100}, {'type': 'null'}], 'default': None, 'description': 'Source class for the matched signal when known.'}}, 'description': 'One lane-specific reason a candidate matched the structured query.'}, 'description': 'Lane-specific annotations; not full constraint results.'}, 'indicative_pricing': {'anyOf': [{'type': 'object', 'properties': {'site': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative site stay price when complete cached rates exist.'}, 'accommodation': {'anyOf': [{'type': 'object', 'required': ['amount', 'nights', 'stay_kind', 'last_updated', 'recheck_caveat'], 'properties': {'amount': {'type': 'number', 'minimum': 0, 'description': 'Indicative cached stay total.'}, 'nights': {'type': 'integer', 'minimum': 1, 'description': 'Number of sleeping nights priced.'}, 'source': {'type': 'string', 'const': 'tp_cached_ari', 'default': 'tp_cached_ari', 'description': 'Pricing source: Total Parks live inventory (PMS-synced ARI).'}, 'currency': {'type': 'string', 'default': 'AUD', 'maxLength': 3, 'minLength': 3}, 'stay_kind': {'enum': ['site', 'accommodation'], 'type': 'string', 'description': 'Stay-kind lane this indicative price applies to.'}, 'last_updated': {'type': 'string', 'format': 'date-time', 'description': 'Most recent ARI timestamp contributing to the stay check.'}, 'recheck_caveat': {'type': 'string', 'description': 'Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment.'}}, 'description': 'Cache-backed public ARI price summary safe for search result cards.'}, {'type': 'null'}], 'default': None, 'description': 'Indicative cabin/accommodation stay price when complete cached rates exist.'}}, 'description': 'Separate indicative price summaries for supported stay kinds.'}, {'type': 'null'}], 'default': None, 'description': 'Cache-only indicative pricing split by stay kind. Omitted when search did not run dated/flexible planning, rates are incomplete, or the candidate is discovery-only.'}, 'google_user_rating_count': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'default': None, 'description': 'Cached Google review count associated with google_rating.'}}, 'description': 'Lightweight search result; deep judgement lives in assess tools.'}, 'description': "Ranked, tiered candidates outside the primary search envelope but within the request's nearby radius. Not included in paging totals or facet counts."}}, 'description': 'Versioned response envelope for the unified search primitive.'}
近期工具变更
类似的 MCP 服务器
Award Travel Finder
Searches award flights and hotels, tracks bookings and loyalty balances, evaluates points and credit cards, and monitors travel r…
AI 代理人任務中樞
Aggregates Taiwan-focused tools for AI service comparisons, cryptocurrency data, game information, health guidance, and other con…
Good Turn Studio (all tools)
Offers consumer utilities for insurance claim appeals, subscription cancellation, flight fare research, financial recovery resour…
Gover MCP
Searches and manages corporate travel requests, flights, hotels, rental vehicles, passengers, carts, approvals, reservations, and…
DC Member API
Provides access to Dynamite Circle membership data, community profiles, chapters, events, trips, calendars, alerts, follows, agen…
Nomad Stays
Searches and books remote-work accommodations while supporting host listing management, rooms, packages, availability, and hospit…
lilo Vacation Rentals
Supports vacation-rental discovery, availability and direct booking, property operations, short-term-rental compliance, guest and…
mcp-server
Provides immigration, citizenship and residency programme research alongside tax, wealth structuring, banking, visa, treaty and c…