Jinko MCP
Was dieses MCP kann
Searches and books flights and hotels, manages trip carts, discovers destinations, and tracks booking status.
Tools
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'create': {'type': 'object', 'required': ['trip_id'], 'properties': {'trip_id': {'type': 'string', 'description': 'ID of the trip to book. The trip must have items and travelers.'}, 'buyer_contact': {'type': 'object', 'required': ['email'], 'properties': {'email': {'type': 'string', 'format': 'email', 'description': 'Email address for booking confirmations'}, 'phone': {'type': 'string', 'description': 'Phone number in international format: a leading + and the country code, e.g. "+12025550147".'}}, 'description': 'Buyer contact information. If omitted, uses lead traveler contact.', 'additionalProperties': False}}, 'description': 'Initiate booking for a trip. Quotes the trip and returns a Stripe Checkout URL for payment. Mutually exclusive with `status` â\x80\x94 provide exactly one action per call.', 'additionalProperties': False}, 'status': {'type': 'object', 'required': ['booking_id'], 'properties': {'booking_id': {'type': 'string', 'description': 'ID of the booking to check status for.'}}, 'description': 'Check the status of an existing booking. If payment is authorized, triggers fulfillment automatically. Mutually exclusive with `create` â\x80\x94 provide exactly one action per call.', 'additionalProperties': False}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'idempotency_key': {'type': 'string', 'description': 'Idempotency key to prevent duplicate processing'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'hint': {'type': 'string'}, 'trip': {}, 'action': {'type': 'string'}, 'status': {'type': 'string'}, 'booking': {}, 'error_code': {'type': 'string'}, 'quoted_offer': {}, 'error_message': {'type': 'string'}, 'pending_booking': {}, 'checkout_session': {}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['origins', 'trip_type'], 'properties': {'locale': {'type': 'string', 'description': 'User\'s BCP 47 locale inferred from the conversation (e.g. "fr-FR", "en-US", "ja-JP"). Used for formatting dates, numbers, and selecting currency. Infer from the user\'s language and location context.'}, 'origins': {'type': 'array', 'items': {'type': 'string'}, 'minItems': 1, 'description': 'REQUIRED. Array of origin IATA codes (3-letter uppercase), representing either airports or cities where the trip starts. The LLM MUST detect and include all relevant nearby airports or city codes based on the userâ\x80\x99s location. Examples: ["JFK", "LGA", "EWR"] for New York City; ["SFO", "OAK", "SJC"] for the San Francisco Bay Area; ["ORD", "MDW"] for Chicago; or a single city code like ["NYC"].'}, 'sort_by': {'enum': ['lowest', 'recommendation'], 'type': 'string', 'description': 'Sorting preference for search results. Options: "lowest" (cheapest first, default) or "recommendation" (best overall balance of price, duration, and stops).'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code for displaying prices (e.g. "EUR", "USD", "GBP"). Infer from the user\'s country or locale. If the user mentions a specific currency, use that.'}, 'max_price': {'type': 'number', 'description': 'Maximum price PER PERSON: the cap applies to a one-adult fare, in the requested currency. For a whole-party budget, divide it by the number of ADULTS only and treat the result as a loose pre-filter: children and lap infants usually cost less than an adult, so dividing by every traveller would exclude affordable trips. Send a per-person budget as-is. The exact whole-trip budget check is flight_search with max_price.', 'exclusiveMinimum': 0}, 'stay_days': {'type': 'integer', 'maximum': 365, 'minimum': 1, 'description': 'Exact number of days to stay at the destination. Used with a departure date to automatically compute the return date. Example: 7 = one-week trip; 3 = weekend getaway.'}, 'trip_type': {'enum': ['oneway', 'roundtrip'], 'type': 'string', 'description': 'REQUIRED. Type of trip: "oneway" for single-leg flights, or "roundtrip" for return flights.'}, 'cabin_class': {'enum': ['economy', 'premium_economy', 'business', 'first'], 'type': 'string', 'description': 'Preferred cabin class. Options: "economy", "premium_economy", "business", or "first". Filters results accordingly.'}, 'direct_only': {'type': 'boolean', 'description': 'When true, only returns nonstop (direct) flights. Useful for avoiding layovers or minimizing total travel time.'}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'destinations': {'type': 'array', 'items': {'type': 'string'}, 'description': 'OPTIONAL. Array of destination IATA codes (3-letter uppercase), representing either airports or cities. When a city code is provided, the LLM MUST expand it to include all associated airports. Examples: ["LHR", "LGW", "STN", "LTN", "LCY"] for London airports; ["CDG", "ORY"] for Paris; ["TYO"] for all Tokyo airports. You may mix airport and city codes: ["JFK", "LAX", "LON", "PAR"]. When omitted or empty, the system searches globally to discover the best flight deals (destination discovery mode).'}, 'return_dates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of specific return dates for round-trip searches (YYYY-MM-DD). Must be after the corresponding departure dates. Supports multiple options (OR logic). Example: ["2025-12-22", "2025-12-23", "2025-12-24"].'}, 'departure_dates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of specific departure dates in ISO 8601 format (YYYY-MM-DD). Use for searching multiple specific dates with OR logic. Example: ["2025-12-15", "2025-12-16", "2025-12-17"] for flexible date searches. Useful when user wants to check specific dates like weekends.'}, 'stay_days_range': {'type': 'object', 'required': ['min', 'max'], 'properties': {'max': {'type': 'integer', 'maximum': 365, 'description': 'Maximum stay duration in days'}, 'min': {'type': 'integer', 'minimum': 1, 'description': 'Minimum stay duration in days'}}, 'description': 'Range of acceptable trip durations for flexible planning (e.g., â\x80\x9c5 to 10 daysâ\x80\x9d). Cannot be combined with stay_days or explicit return_date. Example: {min: 5, max: 10}.', 'additionalProperties': False}, 'return_date_ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Range end date (YYYY-MM-DD)'}, 'start': {'type': 'string', 'description': 'Range start date (YYYY-MM-DD)'}}, 'additionalProperties': False}, 'description': 'List of return date ranges for flexible round-trip searches. Supports multiple return windows. Example: [{start: "2025-12-22", end: "2025-12-25"}, {start: "2025-12-29", end: "2026-01-02"}].'}, 'departure_date_ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Range end date (YYYY-MM-DD)'}, 'start': {'type': 'string', 'description': 'Range start date (YYYY-MM-DD)'}}, 'additionalProperties': False}, 'description': 'List of departure date ranges for flexible travel discovery. Use when the user mentions periods like â\x80\x9cnext monthâ\x80\x9d or â\x80\x9cspring.â\x80\x9d Supports multiple non-contiguous ranges (OR logic). Example: [{start: "2025-12-10", end: "2025-12-15"}, {start: "2025-12-20", end: "2025-12-25"}].'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'status': {'enum': ['success', 'empty', 'error'], 'type': 'string'}, 'hasMore': {'type': 'boolean'}, 'origins': {}, 'priceRange': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}, 'currency': {'type': 'string'}}, 'additionalProperties': True}, 'searchQuery': {'type': 'object', 'properties': {'locale': {'type': 'string'}, 'origins': {'type': 'array', 'items': {'type': 'string'}}, 'currency': {'type': 'string'}, 'max_price': {'type': 'number'}, 'stay_days': {'type': 'number'}, 'trip_type': {'type': 'string'}, 'cabin_class': {'type': 'string'}, 'direct_only': {'type': 'boolean'}, 'return_dates': {'type': 'array', 'items': {'type': 'string'}}, 'departure_dates': {'type': 'array', 'items': {'type': 'string'}}, 'stay_days_range': {}, 'return_date_ranges': {'type': 'array', 'items': {}}, 'departure_date_ranges': {'type': 'array', 'items': {}}}, 'additionalProperties': True}, 'destinations': {'type': 'array', 'items': {}}, 'totalFlights': {'type': 'number'}, 'emissionsInfo': {'type': 'object', 'properties': {'avg_co2': {'type': 'number'}, 'lowest_co2': {'type': 'number'}}, 'additionalProperties': True}, 'error_message': {'type': 'string'}, 'availableAirlines': {'type': 'array', 'items': {'type': 'string'}}, 'totalDestinations': {'type': 'number'}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['origin', 'destination', 'trip_type'], 'properties': {'locale': {'type': 'string', 'description': 'User\'s BCP 47 locale inferred from the conversation (e.g. "fr-FR", "en-US", "ja-JP"). Used for formatting dates, numbers, and selecting currency. Infer from the user\'s language and location context.'}, 'origin': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': 'REQUIRED: Single origin airport IATA code or IATA City Code. Example for IATA airport code : "JFK" for John F.Kennedy in New York, "LAX" for Los Angeles. Example for IATA city code : "NYC" for New York, "PAR" for Paris.'}, 'sort_by': {'enum': ['lowest', 'recommendation'], 'type': 'string', 'description': 'Sort results by this criteria. Default: lowest (best deals first). Options: lowest (cheapest flights), recommendation (best overall value considering price, duration, and stops).'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code for displaying prices (e.g. "EUR", "USD", "GBP"). Infer from the user\'s country or locale. If the user mentions a specific currency, use that.'}, 'max_price': {'type': 'number', 'description': 'Maximum price PER PERSON: the cap applies to a one-adult fare, in the requested currency. For a whole-party budget, divide it by the number of ADULTS only and treat the result as a loose pre-filter: children and lap infants usually cost less than an adult, so dividing by every traveller would exclude affordable trips. Send a per-person budget as-is. The exact whole-trip budget check is flight_search with max_price.', 'exclusiveMinimum': 0}, 'stay_days': {'type': 'integer', 'maximum': 365, 'minimum': 1, 'description': 'Exact number of days to stay at destination. Used with departure_date to calculate return date automatically. Example: 7 for a week-long trip, 3 for a weekend getaway.'}, 'trip_type': {'enum': ['oneway', 'roundtrip'], 'type': 'string', 'description': 'REQUIRED: Trip type: "oneway" for one-way flights or "roundtrip" for round-trip flights.'}, 'cabin_class': {'enum': ['economy', 'premium_economy', 'business', 'first'], 'type': 'string', 'description': 'Cabin class preference. Options: "economy" (standard economy), "premium_economy" (enhanced economy with more space/amenities), "business" (business class), "first" (first class). When specified, only shows flights in the requested cabin class.'}, 'destination': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': 'REQUIRED: Single origin airport IATA code or IATA City Code. Example for IATA airport code : "LGW" for Gatwick in London, "SFO" for San Francisco. Example for IATA city code : "LHR" for London, "BJS" for Beijing.'}, 'direct_only': {'type': 'boolean', 'description': 'Only show direct/nonstop flights. When true, only flights with no stops are returned. Use for fastest travel or when layovers are not desired.'}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'return_dates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of specific return dates for round-trip flights (YYYY-MM-DD). Use for searching multiple return date options with OR logic. Must be after departure dates. Example: ["2025-12-22", "2025-12-23", "2025-12-24"]'}, 'departure_dates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of specific departure dates in ISO 8601 format (YYYY-MM-DD). Use for searching multiple specific dates with OR logic. Example: ["2025-12-15", "2025-12-16", "2025-12-17"] for flexible date searches. Useful when user wants to check specific dates like weekends.'}, 'stay_days_range': {'type': 'object', 'required': ['min', 'max'], 'properties': {'max': {'type': 'integer', 'maximum': 365, 'description': 'Maximum stay duration in days'}, 'min': {'type': 'integer', 'minimum': 1, 'description': 'Minimum stay duration in days'}}, 'description': 'Flexible stay duration range. Use when user wants flexibility in trip length (e.g., "5 to 10 days"). Cannot be combined with exact stay_days or return_date. Example: {min: 5, max: 10}', 'additionalProperties': False}, 'arrival_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Filter the OUTBOUND leg by local arrival time-of-day. Example: { "latest": "20:00" } to arrive by 8pm. Use when the user says "arrive before dinner", "land by noon", etc.', 'additionalProperties': False}, 'return_date_ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Range end date (YYYY-MM-DD)'}, 'start': {'type': 'string', 'description': 'Range start date (YYYY-MM-DD)'}}, 'additionalProperties': False}, 'description': 'List of return date ranges for flexible round-trip exploration. Use when user wants flexibility on return timing across multiple periods with OR logic. Example: [{start: "2025-12-22", end: "2025-12-25"}, {start: "2025-12-29", end: "2026-01-02"}]'}, 'departure_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Filter the OUTBOUND leg by local departure time-of-day. Example: { "earliest": "08:00", "latest": "12:00" } for a late-morning departure. Use when the user says "morning flight", "leave after 6pm", etc.', 'additionalProperties': False}, 'departure_date_ranges': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'Range end date (YYYY-MM-DD)'}, 'start': {'type': 'string', 'description': 'Range start date (YYYY-MM-DD)'}}, 'additionalProperties': False}, 'description': 'List of departure date ranges for flexible travel exploration. Use when user says "next month", "spring", or wants to discover deals across multiple date periods with OR logic. Example: [{start: "2025-12-10", end: "2025-12-15"}, {start: "2025-12-20", end: "2025-12-25"}] for non-contiguous periods.'}, 'return_arrival_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Round-trip only. Filter the RETURN leg by local arrival time-of-day.', 'additionalProperties': False}, 'return_departure_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Round-trip only. Filter the RETURN leg by local departure time-of-day.', 'additionalProperties': False}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'status': {'enum': ['success', 'empty', 'error'], 'type': 'string'}, 'flights': {'type': 'array', 'items': {}}, 'hasMore': {'type': 'boolean'}, 'priceRange': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}, 'currency': {'type': 'string'}}, 'additionalProperties': True}, 'destination': {'type': 'object', 'properties': {'location': {'type': 'object', 'properties': {'latitude': {'type': 'number'}, 'longitude': {'type': 'number'}}, 'additionalProperties': True}, 'city_name': {'type': 'string'}, 'iata_code': {'type': 'string'}, 'city_main_image': {'type': 'string'}}, 'additionalProperties': True}, 'searchQuery': {'type': 'object', 'properties': {'locale': {'type': 'string'}, 'origins': {'type': 'array', 'items': {'type': 'string'}}, 'currency': {'type': 'string'}, 'max_price': {'type': 'number'}, 'stay_days': {'type': 'number'}, 'trip_type': {'type': 'string'}, 'cabin_class': {'type': 'string'}, 'direct_only': {'type': 'boolean'}, 'return_dates': {'type': 'array', 'items': {'type': 'string'}}, 'departure_dates': {'type': 'array', 'items': {'type': 'string'}}, 'stay_days_range': {}, 'return_date_ranges': {'type': 'array', 'items': {}}, 'departure_date_ranges': {'type': 'array', 'items': {}}}, 'additionalProperties': True}, 'totalFlights': {'type': 'number'}, 'emissionsInfo': {'type': 'object', 'properties': {'avg_co2': {'type': 'number'}, 'lowest_co2': {'type': 'number'}}, 'additionalProperties': True}, 'error_message': {'type': 'string'}, 'availableAirlines': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'locale': {'type': 'string', 'description': 'User\'s BCP 47 locale inferred from the conversation (e.g. "fr-FR", "en-US", "ja-JP"). Used for formatting dates, numbers, and selecting currency.'}, 'search': {'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 300, 'minimum': 1, 'description': 'TOTAL number of flights returned (1â\x80\x93300). Caps the whole result set, not a per-page size; it only trims what comes back, since the providers still bound the real count.'}, 'origin': {'type': 'string', 'pattern': '^[A-Z]{3}$', 'description': 'Origin IATA city code (e.g. PAR, NYC, LON) or airport code (e.g. CDG, JFK, LHR). City codes preferred â\x80\x94 they search all airports in the city. ALWAYS convert place names to codes yourself before calling (Paris â\x86\x92 PAR, Mexico City â\x86\x92 MEX, Miami â\x86\x92 MIA); a name like "Paris" fails validation. Required.'}, 'max_price': {'type': 'number', 'description': "Maximum total price for the whole trip and ALL passengers together, in the requested currency. Send the user's whole-trip budget unchanged, or multiply a per-person budget by the number of passengers.", 'exclusiveMinimum': 0}, 'max_stops': {'type': 'integer', 'maximum': 2, 'minimum': 0, 'description': 'Maximum stops per leg (0-2). 0 = nonstop â\x80\x94 send `max_stops: 0` when the user says "direct only" / "non-stop" / "no layovers"; 1 when the user says "at most one stop".'}, 'trip_type': {'enum': ['oneway', 'roundtrip'], 'type': 'string', 'description': 'Optional. Derived from return_date when omitted.'}, 'multi_fare': {'type': 'boolean', 'description': 'Defaults to TRUE: several branded fares per itinerary (the upsell ladder). Set false for a single fare per itinerary and much smaller responses.'}, 'cabin_class': {'anyOf': [{'enum': ['economy', 'premium_economy', 'business', 'first'], 'type': 'string'}, {'type': 'null'}], 'description': 'Cabin class filter. Use null when the user did not explicitly request a cabin; null or omission lets the provider use economy as its search default without filtering returned fares by cabin. When the user explicitly requests economy, premium economy, business, or first, send that value; results must match it on the longest segment, while shorter segments may use another cabin.'}, 'destination': {'type': 'string', 'pattern': '^[A-Z]{3}$', 'description': 'Destination IATA city code (e.g. MIL, BCN, TYO) or airport code (e.g. MXP, BCN, NRT). City codes preferred. ALWAYS convert place names to codes yourself before calling (Tokyo â\x86\x92 TYO, São Paulo â\x86\x92 SAO); a name like "Tokyo" fails validation. Required.'}, 'direct_only': {'type': 'boolean', 'description': 'DEPRECATED â\x80\x94 send `max_stops: 0` instead. Still accepted: `direct_only: true` is folded into `max_stops: 0` before the search runs and only `max_stops` reaches the platform, so the applied/unapplied filter report always names `max_stops`, never `direct_only`. Setting it beside a non-zero `max_stops` is an error.'}, 'origin_type': {'enum': ['city', 'airport'], 'type': 'string', 'description': 'How to interpret origin: "city" searches all airports in the city; "airport" restricts to that specific airport. OMIT unless the user named a specific airport â\x80\x94 when absent the code is resolved from the airport/city catalogue, which classifies it correctly on its own. Guessing "city" for an airport code (CDG, JFK) misreads the route.'}, 'return_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Single return date (YYYY-MM-DD) for a round trip. Omit for one-way.'}, 'via_airports': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{3}$'}, 'description': 'Restrict connections to these IATA airport codes. Nonstop itineraries still pass. Example: ["CDG","AMS"]. At most 9 airports are honoured per leg (provider limit); a longer list comes back in unapplied_filters. Must not overlap exclude_via_airports.'}, 'aircraft_types': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z0-9]{3}$'}, 'description': 'Restrict every segment to these IATA aircraft equipment codes. Example: ["320","321"]. Use only when the user names equipment; most users do not.'}, 'departure_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Single departure date (YYYY-MM-DD) â\x80\x94 no arrays or ranges. Required.'}, 'changeable_only': {'type': 'boolean', 'description': 'Keep only fares that allow a voluntary change (with or without a fee). Same conservative behavior as refundable_only. Each returned fare echoes the resolved `changeable` flag.'}, 'nearby_airports': {'type': 'boolean', 'description': 'Ask the providers to also search alternate airports around each leg\'s origin and destination. WIDENS the search. Use when the user says "or any nearby airport".'}, 'refundable_only': {'type': 'boolean', 'description': 'Keep only fares that can be cancelled before departure (with or without a fee). Narrowing and conservative: fares whose rules cannot be verified are dropped, so some carriers disappear entirely. Each returned fare echoes the resolved `refundable` flag.'}, 'destination_type': {'enum': ['city', 'airport'], 'type': 'string', 'description': 'How to interpret destination: "city" searches all airports; "airport" restricts to that specific airport. OMIT unless the user named a specific airport â\x80\x94 when absent the code is resolved from the airport/city catalogue.'}, 'exclude_carriers': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z0-9]{2}$'}, 'description': 'IATA 2-letter marketing carrier codes to exclude (blacklist). Example: ["FR","U2"]. ALWAYS convert airline names to codes yourself (Ryanair â\x86\x92 FR, Frontier â\x86\x92 F9); a name like "Ryanair" fails validation. A brand that operates several marketing carriers needs every code listed ("no Wizz Air" â\x86\x92 W6, W9). Use when the user says "no Ryanair", "avoid budget airlines", etc. Must not overlap include_carriers.'}, 'include_carriers': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z0-9]{2}$'}, 'description': 'IATA 2-letter marketing carrier codes to include (whitelist). Example: ["AF","KL"]. ALWAYS convert airline names to codes yourself (Air France â\x86\x92 AF, Delta â\x86\x92 DL); a name like "Delta" fails validation. A brand that operates several marketing carriers needs every code listed (easyJet â\x86\x92 U2, EC, DS). Use when the user says "Air France only", "fly Delta", etc. Must not overlap exclude_carriers. Matching means EVERY segment is marketed by a listed carrier (codeshares count by marketing carrier). If nothing matches, the search is automatically widened to all carriers: include_carriers then comes back in unapplied_filters with the reason, include_carriers_widened is true, and itineraries that contain a segment on a listed carrier come first. Tell the user the carrier had no matching itinerary (or cannot be sold here) and that other carriers are shown.'}, 'arrival_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Filter the OUTBOUND leg by local arrival time-of-day. Example: { "latest": "20:00" }. Use when the user says "arrive before dinner", "land by noon".', 'additionalProperties': False}, 'single_carrier_only': {'type': 'boolean', 'description': 'Keep only itineraries marketed by ONE carrier end to end. Use when the user says "same airline the whole way" or wants to avoid split-carrier connections.'}, 'checked_bag_included': {'type': 'boolean', 'description': 'Keep only fares whose price already includes a checked bag. Use when the user says "with a bag included", "I need to check luggage".'}, 'departure_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Filter the OUTBOUND leg by local departure time-of-day. Example: { "earliest": "08:00", "latest": "12:00" }. Use when the user says "morning flight", "leave after 6pm".', 'additionalProperties': False}, 'exclude_via_airports': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{3}$'}, 'description': 'Ban connections at these IATA airport codes. Example: ["LHR"] when the user says "anything but Heathrow". Lists longer than 9 are still fully enforced. Must not overlap via_airports.'}, 'same_origin_airport_only': {'type': 'boolean', 'description': 'Round trips only: keep itineraries that return to the departure airport.'}, 'origin_alternate_airports': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{3}$'}, 'description': 'ADDITIONAL departure airports searched ALONGSIDE `origin`, e.g. ["EWR","LGA"] with `origin: "JFK"`. WIDENING ONLY â\x80\x94 the anchor in `origin` is always searched. THE ANCHOR RANKS AND TRUNCATES the result set, so put the airport that matters most to the user in `origin`, not in this list: on one measured route, anchor JFK + alternate EWR came back 15 JFK / 35 EWR, while anchor EWR + alternate JFK came back 2 JFK / 48 EWR. TAKES EFFECT ONLY WITH AN AIRPORT ANCHOR â\x80\x94 a city anchor (`origin_type: "city"`, or an `origin` that resolves to a city) already stands for its own airports, so the search still runs and returns results, this list is IGNORED, and it comes back in `unapplied_filters`. Not an error: read `unapplied_filters` and tell the user the list was not applied. On a round trip the whole side is mirrored, so these airports also apply to where the RETURN lands. Applied or not, the report names the SIDE â\x80\x94 `origin` â\x80\x94 never this field. Sabre honours the list; TravelFusion cannot (one station per leg) and reports it unapplied.'}, 'return_arrival_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Round-trip only. Filter the RETURN leg by local arrival time-of-day.', 'additionalProperties': False}, 'max_total_duration_minutes': {'type': 'integer', 'description': 'Cap on EACH leg\'s total elapsed travel time, in minutes (gate to gate, layovers included). Use when the user says "nothing longer than 12 hours" â\x86\x92 720.', 'exclusiveMinimum': 0}, 'connection_time_max_minutes': {'type': 'integer', 'minimum': 0, 'description': 'Maximum layover length, in minutes, for EVERY connection of EVERY leg. Use when the user says "no long layovers" ("under 3 hours" â\x86\x92 180).'}, 'connection_time_min_minutes': {'type': 'integer', 'minimum': 0, 'description': 'Minimum layover length, in minutes, for EVERY connection of EVERY leg. Use when the user wants a comfortable connection ("at least 90 minutes to change planes"). Must not exceed connection_time_max_minutes.'}, 'return_departure_time_range': {'type': 'object', 'properties': {'latest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive latest local time-of-day (HH:MM, 24-hour).'}, 'earliest': {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$', 'description': 'Inclusive earliest local time-of-day (HH:MM, 24-hour).'}}, 'description': 'Round-trip only. Filter the RETURN leg by local departure time-of-day.', 'additionalProperties': False}, 'same_connection_airport_only': {'type': 'boolean', 'description': 'Keep only itineraries whose connections arrive at and depart from the SAME airport (no cross-town airport change).'}, 'same_turnaround_airport_only': {'type': 'boolean', 'description': 'Round trips only: keep itineraries whose return departs from the airport the outbound arrived at.'}, 'destination_alternate_airports': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z]{3}$'}, 'description': 'ADDITIONAL arrival airports searched ALONGSIDE `destination`, e.g. ["EWR","LGA"] with `destination: "JFK"`. WIDENING ONLY â\x80\x94 the anchor in `destination` is always searched. THE ANCHOR RANKS AND TRUNCATES the result set, so put the airport that matters most to the user in `destination`, not in this list: on one measured route, anchor JFK + alternate EWR came back 15 JFK / 35 EWR, while anchor EWR + alternate JFK came back 2 JFK / 48 EWR. TAKES EFFECT ONLY WITH AN AIRPORT ANCHOR â\x80\x94 a city anchor (`destination_type: "city"`, or a `destination` that resolves to a city) already stands for its own airports, so the search still runs and returns results, this list is IGNORED, and it comes back in `unapplied_filters`. Not an error: read `unapplied_filters` and tell the user the list was not applied. On a round trip the whole side is mirrored, so these airports also apply to where the RETURN departs from. Applied or not, the report names the SIDE â\x80\x94 `destination` â\x80\x94 never this field. Sabre honours the list; TravelFusion cannot (one station per leg) and reports it unapplied.'}}, 'description': 'Live search for a committed itinerary with optional filters. Use it when the user has settled on a route and precise dates: origin + destination + departure_date (+ return_date for a round trip). No date ranges and no date arrays. Any date flexibility ("give or take a day", open windows, an ask with no anchor date at all, or a range implying several candidate departure/return pairs) goes to flight_calendar instead.', 'additionalProperties': False}, 'trip_id': {'type': 'string', 'minLength': 1, 'description': 'Existing trip_id to associate this search with. Forward whenever the user is mid-trip-build (you have seen a trip_id in a recent trip(...) tool result and the user has NOT pivoted to a different trip context, e.g. a new origin city or unrelated request). Drop on pivot. Echoed back in the result so the cart widget can append the next selection to the same trip.'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code for displaying prices (e.g. "EUR", "USD", "GBP", "JPY"). ALWAYS set this â\x80\x94 omitting it falls back to USD which is rarely what users actually want. Infer from the strongest signal available: (1) the user\'s explicit ask ("show me prices in pounds"), (2) the conversation language/locale (French â\x86\x92 EUR, Japanese â\x86\x92 JPY, German â\x86\x92 EUR, Spanish/Catalan/Italian/Portuguese â\x86\x92 EUR, English UK â\x86\x92 GBP, English US â\x86\x92 USD), (3) the origin city\'s country (CDG/ORY â\x86\x92 EUR, LHR/LGW â\x86\x92 GBP, NRT/HND â\x86\x92 JPY, JFK/LAX â\x86\x92 USD, etc.). When in doubt between two plausible currencies, prefer the one matching the user\'s likely home country.'}, 'price_check': {'type': 'object', 'required': ['offer_token'], 'properties': {'max_price': {'type': 'number', 'description': 'Not applied in price_check (JIN-245); omit even if the upstream call had this filter set. With offer_token present the BFF re-shops closest-match and ignores it, so the candidate can come back above the cap.', 'exclusiveMinimum': 0}, 'cabin_class': {'enum': ['economy', 'premium_economy', 'business', 'first'], 'type': 'string', 'description': 'Not applied in price_check (JIN-245); omit even if the upstream call had this filter set. With offer_token present the BFF re-shops closest-match and ignores it, so the candidate can come back in a different cabin.'}, 'direct_only': {'type': 'boolean', 'description': 'Not applied in price_check (JIN-245); omit even if the upstream call had this filter set. With offer_token present the BFF re-shops closest-match and ignores it, so the candidate can come back with a stopover.'}, 'offer_token': {'type': 'string', 'minLength': 1, 'description': 'offer_token from flight_calendar or find_destination results. Uniquely identifies a specific flight offer for live pricing.'}, 'exclude_carriers': {'type': 'array', 'items': {'type': 'string', 'maxLength': 2, 'minLength': 2}, 'description': 'IATA 2-letter marketing carrier codes (blacklist). Not applied in price_check (JIN-245); omit even if the upstream call had this filter set.'}, 'include_carriers': {'type': 'array', 'items': {'type': 'string', 'maxLength': 2, 'minLength': 2}, 'description': 'IATA 2-letter marketing carrier codes (whitelist). Not applied in price_check (JIN-245); omit even if the upstream call had this filter set.'}}, 'description': 'Get confirmed live fares for a specific flight offer. Returns fare brands with trip_item_token for booking. The BFF treats offer_token and the filter fields (direct_only, cabin_class, max_price, include_carriers, exclude_carriers) as MUTUALLY EXCLUSIVE: when offer_token is present it performs a "closest-match" re-shop and ignores all five (JIN-245, still open). Omit them here, and do NOT assume the re-shopped candidate still matches what the user picked upstream â\x80\x94 compare the returned offer against their stated preference and say so if it differs. The wider shop filters (max_stops, refundable_only, â\x80¦) belong to `search` only.', 'additionalProperties': False}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'traveler_counts': {'type': 'object', 'properties': {'adults': {'type': 'integer', 'default': 1, 'maximum': 9, 'minimum': 1, 'description': 'Number of adult travelers (12+ years)'}, 'infants': {'type': 'integer', 'default': 0, 'maximum': 4, 'minimum': 0, 'description': "Infant travelers (under 2), traveling on an adult's lap. Seated infants (own seat) are not supported."}, 'children': {'type': 'integer', 'default': 0, 'maximum': 8, 'minimum': 0, 'description': 'Number of child travelers (2-11 years)'}}, 'description': 'Traveler counts. Defaults to 1 adult.', 'additionalProperties': False}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'hint': {'type': 'string'}, 'reason': {'type': 'string', 'const': 'no_matches'}, 'status': {'enum': ['success', 'empty', 'error'], 'type': 'string'}, 'details': {'type': 'array', 'items': {'type': 'object', 'required': ['message'], 'properties': {'path': {'type': 'array', 'items': {'type': 'string'}}, 'message': {'type': 'string'}}, 'additionalProperties': True}}, 'flights': {'type': 'array', 'items': {}}, 'hasMore': {'type': 'boolean'}, 'partial': {}, 'complete': {}, 'error_code': {'type': 'string'}, 'incomplete': {}, 'priceRange': {'type': 'object', 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}, 'currency': {'type': 'string'}}, 'additionalProperties': True}, 'instruction': {'type': 'string'}, 'searchQuery': {'type': 'object', 'properties': {'locale': {'type': 'string'}, 'origins': {'type': 'array', 'items': {'type': 'string'}}, 'currency': {'type': 'string'}, 'max_price': {'type': 'number'}, 'stay_days': {'type': 'number'}, 'trip_type': {'type': 'string'}, 'cabin_class': {'type': 'string'}, 'direct_only': {'type': 'boolean'}, 'return_dates': {'type': 'array', 'items': {'type': 'string'}}, 'departure_dates': {'type': 'array', 'items': {'type': 'string'}}, 'stay_days_range': {}, 'return_date_ranges': {'type': 'array', 'items': {}}, 'departure_date_ranges': {'type': 'array', 'items': {}}}, 'additionalProperties': True}, 'quoted_offer': {}, 'totalFlights': {'type': 'number'}, 'error_message': {'type': 'string'}, 'applied_filters': {'type': 'array', 'items': {'type': 'string'}}, 'partial_failure': {}, 'upstream_status': {}, 'provider_statuses': {}, 'unapplied_filters': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'reason': {'type': 'string'}}, 'additionalProperties': True}}, 'filter_enforcement': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'enforced_by'], 'properties': {'name': {'type': 'string'}, 'note': {'type': 'string'}, 'exhaustive': {'type': 'boolean'}, 'enforced_by': {'type': 'string', 'description': 'provider or post_filter'}}, 'additionalProperties': False}}, 'include_carriers_widened': {'type': 'boolean'}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['hotel_id'], 'properties': {'checkin': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Check-in date (YYYY-MM-DD). Accepted for future cache-key alignment; currently unused by the platform.'}, 'checkout': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Check-out date (YYYY-MM-DD). Accepted for future cache-key alignment; currently unused by the platform.'}, 'hotel_id': {'type': 'string', 'minLength': 1, 'description': 'Hotel ID (from a prior hotel_search offer).'}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'error': {'type': 'string'}, 'status': {'enum': ['success', 'empty', 'error'], 'type': 'string'}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['destination', 'checkin', 'checkout'], 'properties': {'rooms': {'type': 'integer', 'maximum': 8, 'minimum': 1, 'description': 'Shorthand: number of rooms (the platform auto-distributes adults + children). Use when the user named a room count but not the per-room split.'}, 'adults': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Shorthand: total adults across all rooms. Use ONLY when there is no ambiguity (1 or 2 adults = single room). For 3+ adults, or odd splits, ask the user how they want to split rooms and pass occupancies[] instead â\x80\x94 e.g. 4 adults â\x86\x92 [{adults:2},{adults:2}] (double + double) vs a single 4-sleeper is a meaningfully different search. If the user does not clarify, the server defaults to 2-adults-per-room (remainder in the last room), so every 4-adult request becomes two double rooms. Do NOT combine with occupancies[] â\x80\x94 use one or the other.'}, 'checkin': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Check-in date (YYYY-MM-DD).'}, 'filters': {'type': 'object', 'properties': {'offset': {'type': 'integer', 'minimum': 0, 'description': 'Pagination offset â\x80\x94 skip this many hotels at the upstream search (default 0).'}, 'chain_ids': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'description': 'Filter by hotel chain. Each entry is a brand slug (e.g. "accor", "hilton") OR a numeric LiteAPI chain_id. Slugs are expanded to all sub-brands (e.g. "accor" â\x86\x92 Accor, ibis, Novotel, Mercure, Pullman, Sofitel, â\x80¦). Unknown brands are ignored (the search still runs).'}, 'min_rating': {'type': 'number', 'maximum': 10, 'minimum': 0, 'description': 'Minimum guest review rating (0-10 scale).'}, 'max_results': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Maximum number of hotels to return per page (default 50).'}, 'min_reviews': {'type': 'integer', 'minimum': 0, 'description': 'Minimum number of guest reviews.'}, 'facility_ids': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'description': 'Filter by facility IDs (e.g. pool, gym, spa). Applied at platform search time, not post-filtered.'}, 'hotel_type_ids': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'description': 'Filter by hotel type IDs (e.g. boutique, resort).'}, 'max_star_rating': {'type': 'integer', 'maximum': 5, 'minimum': 1, 'description': 'Maximum star rating (1-5). Pair with min_star_rating to bound a range.'}, 'min_star_rating': {'type': 'integer', 'maximum': 5, 'minimum': 1, 'description': 'Minimum star rating (1-5). Pair with max_star_rating to bound a range.'}, 'max_budget_per_night': {'type': 'number', 'description': 'Keep only hotels whose CHEAPEST per-night price (per room, in the request currency) fits this budget; qualifying hotels keep all their rates. The search automatically scans deeper into the catalog when too few hotels fit. Also applies in Mode A (rate lookup). Prefer a larger max_results over offset paging when set.', 'exclusiveMinimum': 0}}, 'description': 'Optional filter overrides applied on top of the tenant default filter set.', 'additionalProperties': False}, 'trip_id': {'type': 'string', 'minLength': 1, 'description': 'Existing trip_id to associate this search with. Used only by the Jinko cart widget. The platform accepts the field for schema consistency but ignores it on surfaces without the widget. Forward whenever the user is mid-trip-build (you have seen a trip_id in a recent trip(...) tool result and the user has NOT pivoted to a different trip context, e.g. a new origin OR destination city or unrelated request). Drop on pivot. Echoed back in the result so the cart widget can append the next selection to the same trip.'}, 'checkout': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Check-out date (YYYY-MM-DD).'}, 'children': {'type': 'array', 'items': {'type': 'integer', 'maximum': 17, 'minimum': 0}, 'maxItems': 8, 'description': 'Shorthand: ages of all children across all rooms. If children are present, prefer occupancies[] so the caller controls which room each child goes in (ages affect pricing and some providers reject invalid age/room combinations).'}, 'currency': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': 'ISO 4217 currency code (e.g. "EUR", "USD", "GBP", "JPY"). ALWAYS set this â\x80\x94 omitting it falls back to USD which is rarely what users actually want. Infer from the strongest signal available: (1) the user\'s explicit ask ("show me prices in pounds"), (2) the conversation language/locale (French â\x86\x92 EUR, Japanese â\x86\x92 JPY, German â\x86\x92 EUR, Spanish/Catalan/Italian/Portuguese â\x86\x92 EUR, English UK â\x86\x92 GBP, English US â\x86\x92 USD), (3) the destination country (Italy/France/Germany â\x86\x92 EUR, UK â\x86\x92 GBP, Japan â\x86\x92 JPY, US â\x86\x92 USD). When in doubt between two plausible currencies, prefer the one matching the user\'s likely home country.'}, 'destination': {'type': 'object', 'properties': {'query': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text destination â\x80\x94 use ONLY for unambiguous cities or well-known POIs (e.g. "Paris", "Times Square"). Provider-side AI search reliably returns 0 results for islands ("Menorca", "Santorini"), regions ("Tuscany", "Provence"), countries, archipelagos, and other non-city geographies. For those: prefer { city_name + country_code } when a primary city is implied (e.g. "Mahón, ES" for Menorca), or { latitude + longitude + radius_km } to cover an area. Max 200 chars.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude for geo-radius search. Pair with longitude.'}, 'place_id': {'type': 'string', 'minLength': 1, 'description': 'Google Places ID or upstream place identifier.'}, 'city_name': {'type': 'string', 'minLength': 1, 'description': 'City name (e.g. "Paris"). Spell it the way an English-language booking site would: "Munich" not "München", "Florence" not "Firenze", "Rome" not "Roma", "Vienna" not "Wien". Keep the local form where that IS the international one ("Regensburg", "Livorno", "Nürnberg", "Lyon"), and never an archaic exonym ("Leghorn", "Ratisbon"). The catalog stores one group per spelling and does not fold translations, so the wrong form usually resolves to a near-empty group instead of failing â\x80\x94 see destination_resolution.catalog_hotel_count. Case, accents and hyphens ARE folded ("Mahon" = "Mahón", "Saint Malo" = "Saint-Malo"), so those need no correction. In Mode B: pair with country_code as the destination. In Mode A (with hotel_name): pair with hotel_name to narrow the fuzzy-lookup scope.'}, 'hotel_ids': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'minItems': 1, 'description': 'Mode A â\x80\x94 re-shop a known set of hotel IDs (skips destination resolution).'}, 'longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude for geo-radius search. Pair with latitude.'}, 'radius_km': {'type': 'number', 'maximum': 50, 'description': 'Geo-radius in km (default 5, max 50). Requires latitude+longitude â\x80\x94 ignored with other destination shapes.', 'exclusiveMinimum': 0}, 'hotel_name': {'type': 'string', 'maxLength': 120, 'minLength': 2, 'description': 'Mode A â\x80\x94 free-text hotel name when the user named a specific property they want to book (e.g. "Hotel Calimala", "The St. Regis Rome", "Hôtel Costes"). Server runs a fuzzy trigram match over the 1.74M-hotel catalog; uses the top hit when its confidence is â\x89¥ 0.7 (auto-pick safe). If no candidate clears that threshold, returns HTTP 422 with error.code = HOTEL_NAME_LOW_CONFIDENCE + top_candidates + suggested_retry â\x80\x94 the agent should confirm a candidate with the user or fall back to the suggested city destination. ALWAYS pair with country_code and city_name when known; lookup precision drops sharply on common names without scope.'}, 'country_code': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'ISO 3166-1 alpha-2 country code (lowercase preferred, e.g. "fr"). Must be paired with city_name OR hotel_name. In Mode B it disambiguates the city; in Mode A it narrows the fuzzy lookup.'}}, 'description': 'Destination â\x80\x94 provide exactly one shape. Two distinct modes:\n\nMODE A (rate lookup â\x80\x94 you know which hotel):\n â\x80¢ { hotel_ids } to re-shop a known set.\n â\x80¢ { hotel_name, country_code?, city_name? } when the user named a specific property. Server resolves via fuzzy lookup; returns 422 HOTEL_NAME_LOW_CONFIDENCE if no candidate scores â\x89¥ 0.7.\n\nMODE B (hotel search â\x80\x94 you\'re exploring):\n â\x80¢ { query } for unambiguous cities/POIs only ("Paris", "Times Square"). Provider AI search returns 0 for islands/regions/countries/archipelagos.\n â\x80¢ { city_name + country_code } for ambiguous city names or when the user named a primary city ("Mahón, ES" for Menorca).\n â\x80¢ { latitude + longitude + radius_km } for islands, regions, neighborhoods â\x80\x94 anywhere { query } returns 0.\n â\x80¢ { place_id } when you already have an upstream Place ID.\n\nIn Mode A, property filters (min_rating / star / facility / chain / hotel_type) and max_results are ignored â\x80\x94 the user already named the property. filters.max_budget_per_night still applies with hotel_ids or hotel_name.', 'additionalProperties': False}, 'occupancies': {'type': 'array', 'items': {'type': 'object', 'required': ['adults'], 'properties': {'adults': {'type': 'integer', 'maximum': 8, 'minimum': 1, 'description': 'Adult travelers in this room (12+).'}, 'children_ages': {'type': 'array', 'items': {'type': 'integer', 'maximum': 17, 'minimum': 0}, 'maxItems': 6, 'description': 'Ages of children in this room (0-17). Required for child pricing.'}}, 'additionalProperties': False}, 'maxItems': 8, 'minItems': 1, 'description': 'One entry per room (structured). PREFERRED whenever the party is larger than 2 adults or has children â\x80\x94 it removes ambiguity about how guests are split across rooms. Example: [{ "adults": 2 }, { "adults": 1, "children_ages": [5] }]. Do NOT combine with the shorthand fields (adults/children/rooms) â\x80\x94 use one or the other.'}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'guest_nationality': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'Guest nationality (ISO 3166-1 alpha-2, uppercase, e.g. "FR"). Affects rate availability + tax handling at search time. Separate from traveler nationality used for booking documents.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'hint': {'type': 'string'}, 'error': {'type': 'string'}, 'hotels': {'type': 'array', 'items': {}}, 'status': {'enum': ['success', 'empty', 'error'], 'type': 'string'}, 'hasMore': {'type': 'boolean'}, 'trip_id': {'type': 'string'}, 'searchQuery': {}, 'totalHotels': {'type': 'number', 'description': 'Number of hotels in THIS response page (after max_results trimming, excluding nearby alternatives) â\x80\x94 NOT the total number of matches. Upstream window info arrives in the BFF pagination block when present.'}, 'error_message': {'type': 'string'}}, 'additionalProperties': True}
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'trip_id': {'type': 'string', 'description': 'ID of an existing trip. If not provided, a new trip will be created.'}, 'add_item': {'type': 'object', 'properties': {'rooms': {'type': 'array', 'items': {'type': 'object', 'required': ['trip_item_token'], 'properties': {'traveler_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional traveler IDs occupying this specific room.'}, 'trip_item_token': {'type': 'string', 'minLength': 1, 'description': 'Hotel rate token (htl_*) from hotel_search for THIS room. All rooms in the array must come from the same hotel and the same stay (same check-in/check-out dates) â\x80\x94 typically one rate per requested occupancy from the same hotel_search response.'}}, 'additionalProperties': False}, 'description': 'MULTI-ROOM HOTEL ONLY: book 2â\x80\x938 rooms of the SAME hotel and SAME stay as ONE booking with ONE reference. One entry per room, each with its own htl_* rate token from hotel_search (e.g. one rate per occupancy). All tokens must belong to the same hotel and identical check-in/check-out dates. Mutually exclusive with trip_item_token; for a single room use trip_item_token instead. Currently supported for HotelBeds-inventory tenants only.'}, 'traveler_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Traveler IDs to associate with the added item'}, 'trip_item_token': {'type': 'string', 'description': 'Token from flight_search fare options. Contains encoded flight/fare information. Mutually exclusive with rooms â\x80\x94 provide exactly one of the two.'}}, 'description': 'Add a flight or hotel to the trip. Use trip_item_token from flight_search (offer__* format) or offer_id from hotel_search (htl_* format). For MULTIPLE ROOMS of the same hotel stay, make ONE add_item call with the rooms array (2â\x80\x938 htl_* tokens, same hotel + dates) â\x80\x94 do NOT add the same hotel as separate items.', 'additionalProperties': False}, 'offer_id': {'type': 'string', 'description': 'Deprecated: offer_id is now encoded into trip_item_token by flight_search. Only needed for legacy tokens without encoded offer_id.'}, 'remove_item': {'type': 'object', 'required': ['item_id'], 'properties': {'item_id': {'type': 'string', 'description': 'ID of the trip item to remove. Get this from trip.trip_items[].id'}}, 'description': 'Remove an item from the trip by its ID.', 'additionalProperties': False}, 'user_intent': {'type': 'string', 'description': 'A concise summary of what the user is trying to accomplish, derived from their message or the\nconversation context that triggered this tool call.\nThis is used to understand the user\'s intent and context to improve the overall user experience.\n\n- For short, self-contained prompts (e.g. "I want new shoes"), copy the user message as-is.\n- For longer conversations or detailed requests, summarize the core goal and any relevant\n context in 1-2 sentences. Focus on intent, constraints, and preferences - not the full\n dialogue.\n\nBefore sending, strip all personally identifiable information (PII), including but not\nlimited to:\n - Names (first, last, usernames, handles)\n - Email addresses\n - Phone numbers\n - Physical addresses (street, city, zip/postal code, country when tied to an individual)\n - Dates of birth or exact ages\n - Government-issued ID numbers (SSN, passport, driver\'s license, etc.)\n - Payment or financial information (card numbers, bank accounts, etc.)\n - IP addresses or device identifiers\n - Account credentials (passwords, tokens, API keys)\n - Health or biometric data\n - Any other information that could identify a specific individual\n\nReplace stripped values with a generic placeholder (e.g. "[name]", "[email]", "[address]").\n\nExamples:\n User: "I want red running shoes under $100"\n -> "I want red running shoes under $100"\n\n User: "Hi, I\'m John Smith, john@example.com, and I\'m looking for flights from Paris to\n Tokyo for 2 adults departing around mid-June, budget around EUR2000 total"\n -> "Looking for flights from Paris to Tokyo for 2 adults, mid-June, budget ~EUR2000"\n\n User: "I need help resetting my password for account ID acct_12345"\n -> "I need help resetting my password for account ID [account_id]"'}, 'payment_type': {'enum': ['checkout', 'intent'], 'type': 'string', 'description': 'Payment flow type: "checkout" for Stripe Checkout (default), "intent" for Payment Intent.'}, 'schedule_quote': {'type': 'boolean', 'description': 'Schedule a fresh quote on the current cart state. Triggers async re-pricing on the BFF; poll trip(get) until trip.quote_status is "completed", "partial", or "failed". Only "completed" covers the whole cart. trip.quoted_total is the quoted sell total; trip.totals includes unquoted search prices, and trip.status is a legacy lifecycle field. After completion, per-item available_ancillaries are populated and select_ancillaries is unlocked. Call this AFTER any traveler/composition change so subsequent steps see fresh prices and options. book(create) will silently re-quote if the cart drifted from the last quote.'}, 'idempotency_key': {'type': 'string', 'description': 'Idempotency key to prevent duplicate processing'}, 'upsert_travelers': {'type': 'object', 'required': ['travelers'], 'properties': {'contact': {'type': 'object', 'required': ['email', 'phone'], 'properties': {'city': {'type': 'string', 'description': 'Billing city. Required by some carriers.'}, 'email': {'type': 'string', 'format': 'email', 'description': 'Email address for booking confirmations'}, 'phone': {'type': 'string', 'description': 'Phone number in international format: a leading + and the country code, e.g. "+12025550147". Spaces, hyphens, dots and parentheses are tolerated and removed. A number without the leading + is rejected with INVALID_PHONE_NUMBER.'}, 'title': {'type': 'string', 'description': 'Title of the person paying (e.g. "mr", "ms", "mx"). Required by some carriers.'}, 'zip_code': {'type': 'string', 'description': 'Billing postal code. Required by some carriers.'}, 'country_code': {'type': 'string', 'description': 'Billing country as an ISO 3166-1 alpha-2 code (e.g. "FR").'}, 'terms_accepted': {'type': 'boolean', 'description': "Whether the traveller accepted the CARRIER's terms and conditions, which are separate from Jinko's. Send true only if they were actually shown and accepted."}, 'street_and_number': {'type': 'string', 'description': 'Billing street and number. Required by some carriers.'}}, 'description': 'Contact for the trip lead (email + phone). Optional while building the cart, but required before booking â\x80\x94 the connectors reject bookings without a contact phone.', 'additionalProperties': False}, 'travelers': {'type': 'array', 'items': {'type': 'object', 'properties': {'contact': {'type': 'object', 'properties': {'email': {'type': 'string', 'format': 'email', 'description': 'Email address'}, 'phone': {'type': 'string', 'description': 'Phone number in international format: a leading + and the country code, e.g. "+12025550147". Spaces, hyphens, dots and parentheses are tolerated and removed. A number without the leading + is rejected with INVALID_PHONE_NUMBER.'}}, 'description': 'Contact information', 'additionalProperties': False}, 'is_lead': {'type': 'boolean', 'description': 'Whether this traveler is the lead/primary contact'}, 'identity': {'type': 'object', 'required': ['first_name', 'last_name', 'passenger_type'], 'properties': {'title': {'type': 'string', 'description': 'Title (Mr, Mrs, Ms, etc.)'}, 'gender': {'enum': ['MALE', 'FEMALE'], 'type': 'string', 'description': 'Gender. Required for flights; optional for hotel-only bookings.'}, 'last_name': {'type': 'string', 'description': 'Last name as on travel documents'}, 'first_name': {'type': 'string', 'description': 'First name as on travel documents'}, 'middle_name': {'type': 'string', 'description': 'Middle name'}, 'nationality': {'type': 'string', 'description': 'Nationality (ISO 3166-1 alpha-2 country code)'}, 'date_of_birth': {'type': 'string', 'description': 'Date of birth (YYYY-MM-DD). Required for flights; optional for hotel-only bookings.'}, 'frequent_flyer': {'type': 'object', 'required': ['airline', 'number'], 'properties': {'number': {'type': 'string'}, 'airline': {'type': 'string'}}, 'description': 'Frequent-flyer / loyalty membership. airline = IATA carrier that issued the membership (e.g. LH); number = membership number.', 'additionalProperties': False}, 'passenger_type': {'enum': ['ADULT', 'CHILD', 'LAP_INFANT', 'SEATED_INFANT'], 'type': 'string', 'description': 'Passenger type based on age. SEATED_INFANT is not currently supported for flights â\x80\x94 bookings with it are rejected; book infants as LAP_INFANT.'}, 'redress_number': {'type': 'string', 'description': 'DHS redress control number (TRIP program). Flights only.'}, 'known_traveler_number': {'type': 'string', 'description': 'US trusted-traveler Known Traveler Number (TSA PreCheck / Global Entry). Flights only; sent to the airline as Secure Flight data so PreCheck prints on the boarding pass.'}, 'redress_issuing_country': {'type': 'string', 'description': 'ISO 3166-1 alpha-2 country that issued the redress number. Defaults to US downstream; ignored without redress_number.'}, 'known_traveler_issuing_country': {'type': 'string', 'description': 'ISO 3166-1 alpha-2 country that issued the Known Traveler Number. Defaults to US downstream; ignored without known_traveler_number.'}}, 'description': 'Traveler identity information. Required if traveler_id is not provided.', 'additionalProperties': False}, 'passport': {'type': 'object', 'required': ['number', 'expiry_date', 'issuing_country'], 'properties': {'type': {'type': 'string', 'description': 'Document type in the CARRIER\'s vocabulary, when the booking requires one (carriers list it in required_customer_details as government_id_type; values are carrier-specific, e.g. "passport_id", "international_passport", "national_id"). Omit unless asked.'}, 'number': {'type': 'string', 'description': 'Passport number'}, 'expiry_date': {'type': 'string', 'description': 'Passport expiration date (YYYY-MM-DD)'}, 'issuing_country': {'type': 'string', 'description': 'Issuing country (ISO 3166-1 alpha-2 code)'}}, 'description': 'Passport information for international travel', 'additionalProperties': False}, 'traveler_id': {'type': 'string', 'description': 'ID of a pre-saved traveler. If provided, fetches traveler details from storage.'}}, 'additionalProperties': False}, 'description': 'List of travelers for the trip. Replaces all existing travelers (idempotent). Required to complete a booking; the first traveler also supplies the booking contact name.'}}, 'description': 'Set travelers on the trip. Replaces all existing travelers (idempotent operation).', 'additionalProperties': False}, 'select_ancillaries': {'type': 'object', 'required': ['item_id', 'selections'], 'properties': {'item_id': {'type': 'string', 'description': 'ID of the trip item to select ancillaries for. Must be a quoted item. Get from trip.trip_items[].id'}, 'selections': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id'], 'properties': {'category': {'type': 'string', 'description': 'Ancillary category (BAGGAGE, SEAT, MEAL, etc.)'}, 'offer_id': {'type': 'string', 'description': 'Ancillary offer_id from available_ancillaries on the trip item'}, 'quantity': {'type': 'integer', 'description': 'Quantity (defaults to 1)'}, 'pax_ref_id': {'type': 'string', 'description': 'Passenger reference ID (for per-pax ancillaries)'}, 'journey_ref_id': {'type': 'string', 'description': 'Journey reference ID (for journey-scoped ancillaries)'}, 'segment_ref_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Segment reference IDs (for segment-scoped ancillaries)'}}, 'additionalProperties': False}, 'description': 'Ancillary selections. Full replacement â\x80\x94 send all desired selections each time. Get offer_ids from trip_item.available_ancillaries[].offer_id'}}, 'description': 'Select ancillaries (bags, seats, meals) for a quoted trip item. Uses full-replacement semantics â\x80\x94 send all desired selections.', 'additionalProperties': False}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'hint': {'type': 'string'}, 'trip': {}, 'status': {'type': 'string'}, 'error_code': {'type': 'string'}, 'trip_item_id': {'type': 'string'}, 'error_message': {'type': 'string'}, 'saved_travelers': {'type': 'array', 'items': {}}, 'actions_performed': {'type': 'array', 'items': {'type': 'string'}}, 'recommended_products': {'type': 'array', 'items': {}}}, 'additionalProperties': True}
Letzte Tool-Änderungen
Ähnliche MCP-Server
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…