pickyourmatch
Find exact, directly bookable hotel rooms and apartments with live availability and prices.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"stays": {
"url": "https://pym-mcp.gauvendi.workers.dev/mcp"
}
}
}Remote endpoints
https://pym-mcp.gauvendi.workers.dev/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
π’search_stays(query, city, adults, children, children_ages, ...)
Search accommodation at participating properties β hotel rooms, apartments and holiday homes. Search criteria: destination (a town, a landmark or venue, or coordinates, with a radius), travel dates, the party (adults, children and their ages, pets), a maximum nightly price, free cancellation, unit features (view, balcony, terrace, quiet location, floor, workspace, sauna, kitchen, accessibility), the name of a unit or property, the response language and the number of results. Each result is one specific unit, described with its floor, view and beds, and guaranteed at booking β what the product states is what the guest is assigned. Without dates the results carry from-prices; with check_in and check_out they are the units available for those dates, with the price for the stay and a link to the property's booking page. All parameters are optional; query may state the same criteria as free text. Each result carries match_score, matched_features and not_confirmed_features.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Optional: the same search criteria as free text, in any language β for example \"apartment in Schladming for 2 adults and a dog, 16β19 August, with sauna\". Destination, dates (a month alone gets a proposed window), party, budget and features are read from it; explicit parameters override."
},
"city": {
"type": "string",
"description": "The destination to search in β the town or city where the guest wants to stay, e.g. Schladming (umlaut-tolerant)."
},
"adults": {
"type": "integer",
"description": "Number of adults. Combined with children it filters to units that actually fit the whole party (occupancy), and is passed to the booking link."
},
"children": {
"type": "integer",
"description": "Number of children. Filters to units whose child capacity fits, and is passed to the booking link."
},
"children_ages": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Ages of the children (0-17), if known, e.g. [16]. Child prices and capacity depend on age."
},
"pets": {
"type": "integer",
"description": "Number of pets/dogs. Filters to units that allow at least this many pets, and is passed to the booking link."
},
"dogs": {
"type": "integer",
"description": "Alias for pets."
},
"sleeps": {
"type": "integer",
"description": "Minimum total guests the unit must sleep (use adults+children instead when you know the split)."
},
"max_price": {
"type": "number",
"description": "Maximum nightly price. Dated quotes above this appear only as labeled alternatives when exact matches are insufficient."
},
"free_cancellation": {
"type": "boolean",
"description": "The guest wants to be able to cancel for free. With dates, each card quotes the refundable rate and its price; a unit with no refundable rate on those dates is shown only as a labelled alternative."
},
"features": {
"type": "array",
"items": {
"type": "string"
},
"description": "Required features (matched against localized feature names), e.g. [\"Sauna\", \"Balkon\"]. Also what a property sells as a bookable extra: \"Airport transfer\", \"Parking\", \"Baby cot\", \"Late check-out\" β a card then carries the extra with its price in wish_note."
},
"check_in": {
"type": "string",
"description": "Arrival date YYYY-MM-DD. With check_in and check_out, results are the units available for those dates, with the nightly price for that stay and a booking link with the dates filled in."
},
"check_out": {
"type": "string",
"description": "Departure date YYYY-MM-DD (must be after check_in, max 30 nights)."
},
"near": {
"type": "string",
"description": "A landmark, venue, trade fair, station or address to stay close to (\"Messe Frankfurt\", \"Allianz Arena\", \"Frankfurt airport\"). The server geocodes it and returns results nearest first, each with approx_km. Combine freely with dates, party, price and features."
},
"radius_km": {
"type": "number",
"description": "Maximum straight-line distance for near (or lat/lng), default 30, max 200. If nothing lies within, the nearest options are returned with their distances."
},
"radius_miles": {
"type": "number",
"description": "The same radius in miles, for guests who think in miles; results then also carry approx_mi."
},
"lat": {
"type": "number",
"description": "Latitude of the place to search around (a landmark or venue) β an alternative to near."
},
"lng": {
"type": "number",
"description": "Longitude of the place to search around (a landmark or venue) β an alternative to near."
},
"cursor": {
"type": "integer",
"description": "Dated searches live-check up to 20 properties per call. When the response carries next_cursor, repeat the SAME search with cursor=next_cursor to check the remaining properties β a page without next_cursor has covered everything. Never conclude \"sold out\" from a page whose coverage.complete is false."
},
"lang": {
"type": "string",
"enum": [
"en",
"de",
"fr",
"es",
"it",
"nl",
"ar"
],
"description": "Language for names/features/links (default en)"
},
"name": {
"type": "string",
"description": "A specific unit or property the guest named (\"Villa Albatros No. 1\", \"Kaiser Karl\", \"City Hotel Meckenheim\"). Use it when the guest asks for a unit or property by name β it matches unit and property names directly, so a named unit is found even when it is not free for the requested dates. A named unit is never filtered out by availability: it comes back with its status and a link to the property's own calendar."
},
"limit": {
"type": "integer",
"description": "Max results (default 10, max 30)"
}
}
}π’list_destinations(adults, children, pets, dogs, check_in, ...)
List all destinations served by pickyourmatch with unit counts, dog-friendly counts and a photo β USE THIS to inspire a guest who has not decided where to travel yet. ALWAYS pass the party (adults/children/pets) and dates (check_in/check_out) already known from the conversation β they stay visible above the results and keep the search context.
Input Schema
{
"type": "object",
"properties": {
"adults": {
"type": "integer",
"description": "Adults already mentioned in the conversation β always pass along."
},
"children": {
"type": "integer",
"description": "Children already mentioned β always pass along."
},
"pets": {
"type": "integer",
"description": "Pets/dogs already mentioned β always pass along; destinations are then ranked by dog-friendly units."
},
"dogs": {
"type": "integer",
"description": "Alias for pets."
},
"check_in": {
"type": "string",
"description": "Arrival YYYY-MM-DD if already known β always pass along."
},
"check_out": {
"type": "string",
"description": "Departure YYYY-MM-DD if already known β always pass along."
},
"lang": {
"type": "string",
"enum": [
"en",
"de",
"fr",
"es",
"it",
"nl",
"ar"
]
}
}
}π’list_packages(city, theme, adults, children, pets, ...)
Theme-driven, AFTER the units: when the brief carries a package theme (romantic, wellness, dog, culinary) or the guest asks for deals, call this AFTER search_stays in the same turn - the packages appear as their own section BELOW the unit results and enrich the selection. Never call it first, never instead of the unit search. List themed holiday packages (promotional bundles) across properties β dog holidays, romance, wellness, culinary β each with included extras (e.g. dinner, treatments) and a direct booking link. Use for emotional/experience queries like "romantic getaway package" or "dog holiday with meals included".
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Filter by destination city (umlaut-tolerant)"
},
"theme": {
"type": "string",
"enum": [
"dog",
"romance",
"wellness",
"family",
"ski",
"culinary"
],
"description": "Filter by package theme"
},
"adults": {
"type": "integer",
"description": "Adults known from the conversation β always pass along (kept visible above results)."
},
"children": {
"type": "integer",
"description": "Children known from the conversation β always pass along."
},
"pets": {
"type": "integer",
"description": "Pets/dogs known from the conversation β always pass along."
},
"dogs": {
"type": "integer",
"description": "Alias for pets."
},
"check_in": {
"type": "string",
"description": "Arrival YYYY-MM-DD if known β always pass along."
},
"check_out": {
"type": "string",
"description": "Departure YYYY-MM-DD if known β always pass along."
},
"lang": {
"type": "string",
"enum": [
"en",
"de",
"fr",
"es",
"it",
"nl",
"ar"
]
}
}
}π’list_events(city, query, from, to, limit)
List upcoming events (concerts, festivals, trade fairs, sports, conferences) near pickyourmatch properties β each with a "where to stay" page whose booking links open the propertyβs own calendar with the event dates preselected. USE THIS whenever a guest asks for accommodation during/for a specific event or asks what is happening at a destination β e.g. "where should I stay for the Frankfurt Book Fair?", "hotel for Oktoberfest that allows my dog", "apartment for the ski race in Schladming". Combine with search_stays to add room features: event + exact room + direct booking in one answer.
Input Schema
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Filter by destination city (umlaut-tolerant)"
},
"query": {
"type": "string",
"description": "Match against the event name, e.g. \"Oktoberfest\""
},
"from": {
"type": "string",
"description": "Only events ending on/after this date YYYY-MM-DD"
},
"to": {
"type": "string",
"description": "Only events starting on/before this date YYYY-MM-DD"
},
"limit": {
"type": "integer",
"description": "Max results (default 20, max 50)"
}
}
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"description": "Number of events matching the filters (before limit)"
},
"lang": {
"type": "string",
"description": "Language of the response"
},
"city": {
"type": "string",
"description": "Echo of the city filter, if given"
},
"query": {
"type": "string",
"description": "Echo of the name query, if given"
},
"guidance": {
"type": "string",
"description": "How to present the results / what to do when empty"
},
"events": {
"type": "array",
"description": "Upcoming events, soonest first",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Event name"
},
"start": {
"type": "string",
"description": "Start date YYYY-MM-DD"
},
"end": {
"type": "string",
"description": "End date YYYY-MM-DD"
},
"location": {
"type": "string",
"description": "Venue or locality of the event"
},
"city": {
"type": "string",
"description": "Destination city of the nearby property"
},
"property": {
"type": "string",
"description": "Nearby pickyourmatch property name"
},
"stays_url": {
"type": "string",
"description": "Where-to-stay guide page: suited units with booking links that have the event dates preselected"
}
},
"required": [
"name",
"start",
"city",
"property",
"stays_url"
]
}
}
},
"required": [
"total",
"events",
"guidance"
]
}Community
Evidence