MCP App Store
by KeenEthics

Overview

bluerails helps users find hotels in Germany, Austria and Switzerland by place, radius, country and hotel classification. For specified dates and guests, it retrieves available room offers, whole-stay totals, average nightly prices, and cancellation terms and photos where supplied. Users can compare offers against a nightly budget and follow booking links to complete reservations on external booking sites; dates and guest details are included where supported. When rates cannot be retrieved, the app reports prices as unknown and provides a booking link where one is available. Confirmed unavailability is distinguished from failed rate lookups. Hotel and room results are displayed inline in the conversation.

Tools

hotel_reserve

ChatGPT
Book a hotel room. Works for ANY offer list_hotels gave you an offerId for — there is no separate check to make first, so pass the offer the guest chose. Pass that offer’s offerId exactly as you were given it — it names the hotel, room, rate, stay and price, which is why none of those are separate arguments. It expires after 30 minutes; if it has expired or the hotel has raised the price since, nothing is booked — get a fresh one by calling list_hotels with that same offerId, which re-prices just that room rather than showing the guest the whole property again. TWO OUTCOMES, and the reply tells you which. confirmationNumber means the room is booked: give the guest the number and tell them they pay the hotel at the desk — nothing has been charged. paymentUrl means the room is NOT held yet: give the guest that link to pay, their card is HELD rather than charged, and the booking is placed once they have paid. Set acceptedTerms only after the guest has agreed to book this rate. Show them that rate’s cancellation terms where list_hotels gave any; where its cancelTerms was null we hold none, so say so and that the hotel’s own terms apply, then set it once they agree on that basis — a blank is NOT a reason to refuse the booking. Ask the guest for their own phone number and billing address — the hotel puts them on the reservation and uses them to reach the guest. Never invent them. If a call comes back ambiguous, do NOT call again — a reservation may already exist.

list_hotels

ChatGPT
Search DACH hotel properties, and price them for a stay in the same call. ASK BEFORE YOU SEARCH. Four things are required and this tool answers nothing without them: checkIn, checkOut, adults and maxPricePerNight. "Hotels in Berlin for a couple" is not yet a search — it names a place and a party and nothing else, so ask which nights they want, who is coming — adults AND any children, by age — and roughly what they want to spend, in ONE message, and search once they answer. Never fill these in for them: dates you chose are not their dates, and a budget read off "cheap" or off a star rating hides the very hotels they could have afforded. A call missing any of them comes back with no rows and a hint naming what is still to be asked. PLACES. Pass city with any DACH place name to get properties around it, nearest first, each with distanceKm — despite the name it takes a place of any size, so a village or resort ("Silvaplana", "Wals", "Zell am See") works as well as a city. radius is a value with its unit — {"value": 10, "unit": "mi"} — so you never have to convert; it defaults to 20 km and may not exceed 100 km. Prefer city over query for place-based searches: it understands ~105,000 places and returns neighbouring towns, whereas query only matches words in a name or description. An unresolvable place name returns placeNotRecognised — that means the NAME was not understood, not that the place has no hotels. When a radius returns nothing you get nearestBeyondRadiusKm so you can widen deliberately rather than guess. A STAY. checkIn, checkOut and adults are required, and when you ask how many adults, ASK WHETHER ANY CHILDREN ARE COMING TOO and send their ages in childrenAges — ages, not a count. A child left out is priced as though they are not coming, so the guest can book a room that will not sleep them. The moment the guest mentions a child, put it in childrenAges even if you do not yet know the age — send null for that entry: THE SEARCH IS THEN REFUSED until you replace it with the real age, which is what stops a family being quoted as a couple. With those, the answer comes back in TWO groups. priced holds the hotels we read real rates for: every room and rate plan with its own eurPrice for the WHOLE stay, its cancelTerms where we hold any and null where we do not, its photos where we have them, a bookingUrl carrying the guest's dates WHERE THIS ENDPOINT PUBLISHES ONE — read that field's own description rather than assuming it is there, because an endpoint that can book the room for you publishes no link for it — and stayTotalEur / pricePerNightEur for the cheapest offer. They come back in a deliberate order that is NOT nearest first and NOT cheapest first — show them in the order you are given. Show all the rooms you are handed, not just the cheapest. unpriced holds everything else: hotels that do not publish rates anywhere we can read, that did not answer us, or that were past the read ceiling. Those are the same thing to you — NONE of them carries a booking link of any kind. What a row carries instead is websiteUrl, the property's own site, or an EMPTY websiteUrl when we hold no site either and there is nothing to open at all. WHEN YOU RECOMMEND A HOTEL, RECOMMEND A PRICED ONE. We hold no rate for anything in unpriced, so you cannot say what it costs and it may be well over what the guest wants to spend; naming one as your suggestion answers their budget with a number nobody has. Bring one up only as "I could not get a rate for X, here is their website". Offer that site as the property's website and NEVER as a way to book or check rates, since we do not know it sells rooms online — and where it is empty, say we have nowhere to send them rather than going looking for a page of your own. AN EMPTY priced IS NOT "SOLD OUT", AND CHECK aboveBudget BEFORE CALLING IT UNREADABLE. With a maxPricePerNight, an empty priced means every hotel we priced costs more than that, and those hotels are in aboveBudget with real prices — quote them. Only when aboveBudget is em…

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

App Stats

2

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily