lastminute.com MCP server — tools & history
lastminute.com MCP server: observed blocked status, tool schemas, linked apps and version history.
lastminute.com
Endpoint: https://mcp.lastminute.com/mcp
Observed status: blocked. Checked: 2026-10-11T06:21:26+00:00.
Linked apps
- lastminute.com
Search, compare and book flights, dynamic packages (flight + hotel) and hotels across global airlines and hotel suppliers.
Observed tools
- change_flight — Change the flight for an existing hotel selection. This tool updates the flight associated with your hotel booking after viewing alternatives. ⚠️ IMPORTANT: - Must be used AFTER get_alternative_flights to see available options - Requires both pricing_id and the new_transport_id from the alternatives list - This will update the total package price based on the new flight selection Example use cases: - "Change to flight option 2" - "Select the morning flight instead" - "Update to the cheaper flight option" Args: pricing_id: The pricing ID from select_hotel_options response new_transport_id: The transport ID of the selected alternative flight (from get_alternative_flights response) Returns: Dictionary confirming the flight change with updated package details
- generate_booking_link — Generate a direct booking URL for the selected hotel room option. After change_flight, rate_id values change but the internalIdRoom stays the same. This tool automatically maps old rate_id to new rate_id based on internalIdRoom only. Args: pricing_id: The pricing ID from select_hotel_options response (NOT search_id) rate_id: The rate ID of the selected room option (from select_hotel_options response) Returns: Dictionary containing the booking URL and summary details
- get_alternative_flights — Get alternative flight options for an existing hotel selection. Input parameters: - pricing_id (string, REQUIRED): pricing ID returned by select_hotel_options. Behavior: - Can ONLY be used AFTER select_hotel_options. - Returns a list of alternative flights with their details and prices. - On success, alternative flight options are also stored in session for later use by change_flight. - Don't touch the order of the proposed flights, return them as received from the backend.
- resolve_destination_id — Resolve a city name to its internal destination ID using the lastminute.com hints API. This tool is useful when you need to map a free-text city name to a structured destination identifier before performing a hotel or package search. Supported languages: IT, EN, ES, FR, DE, PL, SE, DK, NO, FI. Any unsupported language falls back to English (en-GB). Args: lang: 2-letter language code (e.g. "en", "it", "fr"). Case-insensitive. city_name: The city name to resolve (e.g. "London", "Roma", "Paris"). Returns: On exact match: { "success": true, "id": "<destination_id>", "name": "<matched city name>", "country": "<country name>", "country_code": "<ISO2 code>" } On no exact match (returns all City-type suggestions): { "success": false, "message": "No exact match found. Suggestions returned.", "suggestions": [ { "id": "...", "name": "...", "country": "...", "country_code": "...", }, ... ] } On API error: { "success": false, "error": "<error description>" }
- search_flight_and_hotel_package — 🛫🏨 Search for COMBINED flight AND hotel vacation packages. This tool searches for all-inclusive vacation packages that include: - ✈️ Round-trip flights (outbound and return) - 🏨 Hotel accommodation for the entire stay - 💰 Package pricing (flight + hotel combined) ⚠️ IMPORTANT: This is for PACKAGE deals, NOT separate flight/hotel bookings. Is important to use the correct language in the destination field and keep the original language used in the request made in the user chat. Example use cases: - "Find me flight and hotel packages from Rome to Madrid" - "I need a vacation package with flights and hotel from FCO to Barcelona" - "Search flight+hotel deals from Milan to Paris for 3 nights" ═══════════════════════════════════════════════════════════════════════════ HARD CONSTRAINTS ═══════════════════════════════════════════════════════════════════════════ 1. Dates: - start_date MUST be today or later (YYYY-MM-DD) - If user provides past date, ask for valid date BEFORE calling 2. IATA Codes (CRITICAL): - origin and destination MUST be 3-letter IATA codes, NOT city names - NEVER pass city names like "New York", "Geneva", "Milan" - use IATA codes instead - Both CITY codes and AIRPORT codes are accepted: * City codes: NYC, GVA, ZRH, DUB, BRU, VIE, MIL, LON, PAR, BSL * Airport codes: JFK, MXP, FCO, LHR (automatically converted to city codes) - Examples: MXP or MIL for Milan, JFK or NYC for New York, FCO or ROM for Rome Args: origin: IATA code only - 3 letters. Use city code (MIL, NYC, LON) or airport code (MXP, JFK, LHR). NEVER use city names like "Milan" or "New York". destination: IATA code only - 3 letters. Use city code (BCN, PMI) or airport code. NEVER use city names like "Barcelona" or "Palma". date_from: Check-in date (YYYY-MM-DD). Check this field MUST be today or later. date_to: Check-out date (YYYY-MM-DD). Check this field MUST be today or later. adults: Number of adult travelers. If you want different rooms, set number_adult_room1;number_adult_room2 (default: 2) ⚠️ IMPORTANT: ch_ages: Ages of child travelers. If you want different rooms, set number_chages_room1;number_chages_room2 (default: ""). If there are two rooms and one is empty the result can be ";number,number" or "number,number;". The user MUST specify ages for each child. lang: Language code (default: "en") sort: Sort order for results. Use this when user asks for cheapest, best rated, closest to center, etc. Valid values: - "recommended" (default): Multi-factor relevance (price, rating, internal score) - "price": Price ascending (cheapest first) - use when user wants "cheapest" or "lowest price" - "stars": Hotel star rating descending (5-star first) - use for "best hotels" or "luxury" - "review_score": Highest review score - use for "best reviewed" or "most popular" - "distance": Closest to city center first - use for "central" or "close to center" max_results: Maximum number of results to return (default: 5, max: 20) accommodation_type: Filter by accommodation type (optional). CSV of IDs 1-14: 1=Hotels, 2=Resorts, 3=Apartments, 4=Hostels, 5=Motels, 6=Country Houses, 7=Guest Houses, 8=B&B, 9=Villas, 10=Boats & Cruises, 11=Campsites, 12=Riads, 13=Ryokans, 14=Aparthotels. Example: "1,2" for Hotels and Resorts accommodation_facilities: Filter by facilities/amenities (optional). CSV of IDs 0-60. All values are valid. Common examples: 0=Free Wi-Fi, 3=Parking, 4=Pool, 6=Spa, 7=Adults Only, 9=Seafront, 13=Fitness Center, 25=Golf, 46=Indoor Pool, 49=Sauna, 56=Bar, 58=Restaurant. Example: "0,4,6" for Free Wi-Fi, Pool, and Spa price: Optional price filter for one-way price per person, as string. Supported formats: - "300" => max price 300 (in the selected currency) - "200,400" => price range between 200 and 400 Use only digits and a comma, do NOT include currency symbols. If you invert the order ("400,200"), the backend will normalize it to "200,400". hotel_stars: Optional filter for hotel star rating, as comma-separated integers. Allowed values: 1,2,3,4,5. Examples: - "4" => only 4-star hotels - "3,4" => 3 or 4 stars - "3,4,5" => 3, 4 or 5 stars Returns: Dictionary containing search results with flight+hotel packages ═══════════════════════════════════════════════════════════════════════════ MANDATORY OUTPUT FORMAT ═══════════════════════════════════════════════════════════════════════════ You MUST present results as a Markdown table with EXACTLY these columns: | # | Photo | Hotel | Stars | Rating | Total Price | Distance from Centre | Amenities | Column mapping from response JSON: - # → index - Photo → [🖼️](hotel.main_image) (clickable link) - Hotel → hotel.name - Stars → hotel.stars - Rating → hotel.rating - Total Price → price_total + currency - Distance from Centre → hotel.distance_km - Amenities → hotel.amenities (max 3, comma-separated) CRITICAL: - You MUST use table format. Do NOT list hotels as bullet points or paragraphs. - You MUST display ALL hotels returned in the response. Do NOT truncate or show only a subset. - STRICTLY PRESERVE the order of results using the "index" field (1, 2, 3...) - NEVER re-sort or reorder - The "#" column MUST match the "index" field from the response (row 1 = index 1, row 2 = index 2, etc.) - "Photo" column must contain clickable link: [🖼️](hotel.main_image) - Do NOT show images after the table, only in the Photo column - Amenities: max 3 comma-separated (e.g. "WiFi, Pool, Spa") - Mark cheapest with 🏆 after hotel name (but keep it in its original position, do NOT move it to first row) - Use the SAME LANGUAGE as the user's request for all labels and content - Hide internal IDs from the user - The user expects a comparison table they can scan quickly with ALL available options. Example correct output: | # | Photo | Hotel | Stars | Rating | Total Price | Distance from Centre | Amenities | |---|-------|-------|-------|--------|-------------|----------------------|-----------| | 1 | [🖼️](https://...) | Grand Hotel 🏆 | ⭐⭐⭐⭐ | 8.5 | EUR 450.00 | 0.5 km | WiFi, Pool, Spa | | 2 | [🖼️](https://...) | Beach Resort | ⭐⭐⭐⭐⭐ | 9.1 | EUR 680.00 | 1.2 km | WiFi, Pool, Bar |
- search_flights — Search for flights and return available options. Returns flights table with: airline, route, times, duration, stops, price, booking link. ═══════════════════════════════════════════════════════════════════════════ SEARCH MODES (mutually exclusive) ═══════════════════════════════════════════════════════════════════════════ 1. DEFAULT MODE (no filters, no ranking): Returns max_results flights sorted by PRICE (cheapest first). Use for: "find flights", "cheapest flights" 2. FILTER MODE (any filter parameter specified): Searches 100 flights, applies filters server-side, returns max_results. Filters: time ranges, price limits, airports, stops, airlines, duration. Results sorted by PRICE after filtering. Use for: "morning flights", "under 200 EUR", "direct only", "from MXP" 3. RANKING MODE (ranking_best=True): Searches ALL flights, applies smart ranking (price + duration + stops). Returns top max_results by overall value. Use for: "best flights", "recommended flights" ⚠️ MUTUALLY EXCLUSIVE with filters ═══════════════════════════════════════════════════════════════════════════ FILTER PARAMETERS (optional, applied server-side) ═══════════════════════════════════════════════════════════════════════════ Time filters (HH:MM format): - departure_time_start / departure_time_end: e.g., "06:00" to "12:00" for morning - arrival_time_start / arrival_time_end: e.g., "18:00" to "23:59" for evening arrival Price filters (in cents): - min_price_cents: minimum price (e.g., 5000 = 50 EUR) - max_price_cents: maximum price (e.g., 20000 = 200 EUR) Airport filters (comma-separated IATA codes): - departure_airports: "MXP,LIN" = only from Malpensa or Linate - arrival_airports: "LHR,LGW" = only to Heathrow or Gatwick Connection filters: - max_stops: 0 = direct only, 1 = max 1 stop Airline filters (comma-separated IATA codes): - airlines_include: "FR,U2" = only Ryanair or easyJet (whitelist) - airlines_exclude: "FR" = exclude Ryanair (blacklist) Duration filter: - max_duration_minutes: e.g., 180 = max 3 hours Examples: - Morning direct flights under 150 EUR: departure_time_start="06:00", departure_time_end="12:00", max_stops=0, max_price_cents=15000 - Flights from Malpensa only, max 2 hours: departure_airports="MXP", max_duration_minutes=120 ═══════════════════════════════════════════════════════════════════════════ HARD CONSTRAINTS ═══════════════════════════════════════════════════════════════════════════ 1. Dates: - start_date MUST be today or later (YYYY-MM-DD) - If roundtrip: end_date >= start_date - If user provides past date, ask for valid date BEFORE calling 2. Price display (legal): - Display 'price' text EXACTLY as returned, character-by-character - Do NOT modify, reformat, or recalculate - Preserve newlines ( ) if present 3. Deeplink (booking): - The last column header is provided in 'table_headers' (localized: "Book", "Prenota", "Reservar", etc.) - Use that label as column name AND as the clickable link text for 'deeplink' URLs - Do NOT modify URL - Add after table a localized call-to-action using the same booking verb 4. Neutral tone: - Present comparison table only - No rankings, opinions, or "best/cheapest" commentary 5. Ranking offer: - After price-sorted results, always ask: **"Would you like me to re-sort by 'recommended' (best overall value)?"** - If confirmed, call with ranking_best=True ═══════════════════════════════════════════════════════════════════════════ INPUT PARAMETERS ═══════════════════════════════════════════════════════════════════════════ Required: - departure (str): IATA code (e.g., "MIL", "MXP") - arrival (str): IATA code (e.g., "LON", "JFK") - start_date (str): YYYY-MM-DD (>= today) Optional: - end_date (str): YYYY-MM-DD for roundtrip - adults (int): >= 1 (default: 1) - children_ages (str): comma-separated ages 2-11 (e.g., "3,8") - infants_ages (str): comma-separated ages 0-1 (e.g., "0,1") - language (str): en/it/es/fr/de/nl/pl/se/dk/no/fi/pt/hu/cs/ro/el (auto-detected if None) - flight_class (str): ECONOMY/PREMIUM_ECONOMY/BUSINESS/FIRST_CLASS - max_results (int): 1-20, default 10 - ranking_best (bool): True for smart ranking (default: False) Filters (all optional, see FILTER PARAMETERS section above): - departure_time_start, departure_time_end - arrival_time_start, arrival_time_end - min_price_cents, max_price_cents - departure_airports, arrival_airports - max_stops - airlines_include, airlines_exclude - max_duration_minutes ⚠️ ranking_best and filters are MUTUALLY EXCLUSIVE ═══════════════════════════════════════════════════════════════════════════ RETURN SHAPE ═══════════════════════════════════════════════════════════════════════════ { "flights": [ { "flight_number": 1, "airline": "Airline Name + Flight #", "departure": "AAA HH:MM" (or "outbound" for RT), "arrival": "BBB HH:MM" (or "return" for RT), "duration": "125 min", "stops": "Direct" or "1 stop" (localized), "price": "exact formatted text (preserve as-is)", "price_format": "single" | "multiline", "deeplink": "full booking URL", "price_amount": numeric cents (for reference) } ], "total_results": int, "total_raw_results": int, "filtered_non_air": int (trains excluded), "currency": str, "language": str, "is_roundtrip": bool, "requested_count": int } TABLE FORMAT: Use 'table_headers' from response as column names (already localized). The last column is the booking link (e.g. "Book", "Prenota", "Reservar", "Réserver", "Buchen"). Render each deeplink as [localized_label](url). Display ALL flights in the response.
- search_only_hotel — Search for hotel-only stays (no flights included). ⚠️ IMPORTANT: This is for hotel-only searches. Flight bookings are not included. ═══════════════════════════════════════════════════════════════════════════ MANDATORY PRE-STEP: DESTINATION RESOLUTION ═══════════════════════════════════════════════════════════════════════════ Before calling this tool, you MUST silently call resolve_destination_id to resolve the city name to its internal numeric ID. Do NOT inform the user about this step. Workflow: 1. User provides a city name (e.g. "London", "Madrid") 2. Silently call resolve_destination_id(lang=<lang>, city_name=<city>) 3a. If success=true → use the returned "id" (e.g. "141660") as the destination field for this tool. 3b. If success=false → show the user the "suggestions" list (name + country) and ask them to clarify which city they mean. Do NOT call this tool yet. The destination field accepts: - A numeric ID string from resolve_destination_id (e.g. "141660") ← preferred - A 3-letter IATA code as fallback (e.g. "MAD", "LON") when the user explicitly provides one and no resolution is needed. ═══════════════════════════════════════════════════════════════════════════ HARD CONSTRAINTS ═══════════════════════════════════════════════════════════════════════════ 1. Dates: - start_date MUST be today or later (YYYY-MM-DD) - If user provides past date, ask for valid date BEFORE calling 2. Destination (CRITICAL): - Always prefer the numeric ID from resolve_destination_id - If using IATA fallback: must be 3-letter code (MAD, PAR, MIL, LON) - NEVER pass raw city names like "Madrid" or "Paris" directly Example use cases: - "Find me a hotel in Madrid for 3 nights" → resolve "Madrid" first → use id - "Search hotel in London" → resolve "London" first → use id Args: destination: Numeric destination ID from resolve_destination_id (e.g. "141660"), or 3-letter IATA code (e.g. "MAD") as fallback. date_from: Check-in date (YYYY-MM-DD). Check this field MUST be today or later. date_to: Check-out date (YYYY-MM-DD). Check this field MUST be today or later. adults: Number of adult travelers. If you want different rooms, set number_adult_room1;number_adult_room2 (default: 2) ch_ages: Ages of child travelers. If you want different rooms, set number_chages_room1;number_chages_room2 (default: ""). If there are two rooms and one is empty the result can be ";number,number" or "number,number;". The user MUST specify ages for each child. lang: Language code (default: "en") sort: Sort order for results. Use this when user asks for cheapest, best rated, closest to center, etc. Valid values: - "recommended" (default): Multi-factor relevance (price, rating, internal score) - "price": Price ascending (cheapest first) - use when user wants "cheapest" or "lowest price" - "stars": Hotel star rating descending (5-star first) - use for "best hotels" or "luxury" - "review_score": Highest review score - use for "best reviewed" or "most popular" - "distance": Closest to city center first - use for "central" or "close to center" max_results: Maximum number of results to return (default: 5, max: 20) accommodation_type: Filter by accommodation type (optional). CSV of IDs 1-14: 1=Hotels, 2=Resorts, 3=Apartments, 4=Hostels, 5=Motels, 6=Country Houses, 7=Guest Houses, 8=B&B, 9=Villas, 10=Boats & Cruises, 11=Campsites, 12=Riads, 13=Ryokans, 14=Aparthotels. Example: "1,2" for Hotels and Resorts accommodation_facilities: Filter by facilities/amenities (optional). CSV of IDs 0-60. Examples: 0=Free Wi-Fi, 4=Pool, 6=Spa, 7=Adults Only, 9=Seafront, 25=Golf, 46=Indoor Pool, 56=Bar, 58=Restaurant. Example: "0,4,6" for Free Wi-Fi, Pool, and Spa price: Optional price filter for one-way price per person, as string. Supported formats: - "300" => max price 300 (in the selected currency) - "200,400" => price range between 200 and 400 Use only digits and a comma, do NOT include currency symbols. If you invert the order ("400,200"), the backend will normalize it to "200,400". hotel_stars: Optional filter for hotel star rating, as comma-separated integers. Allowed values: 1,2,3,4,5. Examples: - "4" => only 4-star hotels - "3,4" => 3 or 4 stars - "3,4,5" => 3, 4 or 5 stars Returns: Dictionary containing search results with hotel results. ═══════════════════════════════════════════════════════════════════════════ MANDATORY OUTPUT FORMAT ═══════════════════════════════════════════════════════════════════════════ You MUST present results as a Markdown table with EXACTLY these columns: | # | Photo | Hotel | Stars | Rating | Total Price | Distance from Centre | Amenities | Column mapping from response JSON: - # → index - Photo → [🖼️](hotel.main_image) (clickable link) - Hotel → hotel.name - Stars → hotel.stars - Rating → hotel.rating - Total Price → price_total + currency - Distance from Centre → hotel.distance_km - Amenities → hotel.amenities (max 3, comma-separated) CRITICAL: - You MUST use table format. Do NOT list hotels as bullet points or paragraphs. - You MUST display ALL hotels returned in the response. Do NOT truncate or show only a subset. - STRICTLY PRESERVE the order of results using the "index" field (1, 2, 3...) - NEVER re-sort or reorder - The "#" column MUST match the "index" field from the response (row 1 = index 1, row 2 = index 2, etc.) - "Photo" column must contain clickable link: [🖼️](hotel.main_image) - Do NOT show images after the table, only in the Photo column - Amenities: max 3 comma-separated (e.g. "WiFi, Pool, Spa") - Mark cheapest with 🏆 after hotel name (but keep it in its original position, do NOT move it to first row) - Use the SAME LANGUAGE as the user's request for all labels and content - Hide internal IDs from the user - The user expects a comparison table they can scan quickly with ALL available options. Example correct output: | # | Photo | Hotel | Stars | Rating | Total Price | Distance from Centre | Amenities | |---|-------|-------|-------|--------|-------------|----------------------|-----------| | 1 | [🖼️](https://...) | Grand Hotel 🏆 | ⭐⭐⭐⭐ | 8.5 | EUR 450.00 | 0.5 km | WiFi, Pool, Spa | | 2 | [🖼️](https://...) | Beach Resort | ⭐⭐⭐⭐⭐ | 9.1 | EUR 680.00 | 1.2 km | WiFi, Pool, Bar |
- select_hotel_options — Get detailed options for a specific hotel after initial search. This tool automatically uses the same number of adults, children, currency, and business profile from the original search to ensure consistency. Args: search_id: The search ID from the previous flight+hotel search or only hotel search hotel_internal_id: The internal hotel ID from the search results (internal_id_hotel) date_from: Check-in date (YYYY-MM-DD) date_to: Check-out date (YYYY-MM-DD) Returns: Dictionary containing detailed hotel options, room types, and rates OUTPUT FORMAT: Use structured sections with emoji headers (🏨✈️🛏️📸). 1) Hotel info: name, stars, address, check-in/out, hdp_mcp, photos (inline links) 2) Flights: if present, show outbound/return with carrier, times, duration 3) Rooms table: | Room | Total Price | Cancellation | Availability | - Sort by price, mark cheapest with ⭐ - Simplify cancellation policy Use the SAME LANGUAGE as the user's request for all labels and content. Hide internal IDs (rate_id kept for booking but not shown in the display).
Data as of 2026-10-09T19:06:04+00:00.
OpenApps records store listings and observed changes. Store ranks are not download counts; launch dates may be derived or use the first observation. Coverage gaps are shown in the interactive catalog.
REST API specification · Guide for AI clients · Manage API keys and MCP connections