Serveur MCP

VeryChic Hotel Deals

io.github.jordantete/verychic-mcp
Voyage et hôtellerie Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Searches VeryChic hotel offers and retrieves offer details, availability, and prices.

verychic_offer_details
Get full details plus per-date availability and prices for one specific VeryChic offer. When to use: after `verychic_search_offers` returned an offer you want to inspect — pass that offer's `source` and `external_id` here. You must obtain those two identifiers from a search result first; this tool does not search. Behaviour: read-only and anonymous; rate-limited to about 1 request per second; prices in EUR, text in French. Availability is looked up for roughly the next 5 months unless `months` names the window to query. For tour-operator packages (`source` = 'ORCHESTRA_TO') VeryChic exposes no date-availability endpoint: `availabilities` is then empty and `availabilities_supported` is false — meaning "not supported", NOT "sold out". Returns an object with: `offer` (same fields as a search result, plus `offer_url`), `advantages`, `included_added_values`, `non_included_added_values`, `gallery` (image URLs), `availabilities` (one entry per check-in date with `date`, `price`, `currency`, `nights`, `days`, `departure_city_code`), `availabilities_by_month` (one row per month with stock — `month` as 'MM/YYYY', `min_price`, `currency` and `dates_available` — in chronological order), `availabilities_supported` (bool), and `cheapest_price` (lowest available price, or null when none). To answer "which month is cheapest", read `availabilities_by_month` rather than scanning `availabilities`: it carries the same answer in a fraction of the size, and it stays small when `months` asks for a wide window.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'verychic_offer_detailsArguments', 'required': ['source', 'external_id'], 'properties': {'months': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Months', 'default': None, 'description': "Months to look up check-in availability for, each written 'MM/YYYY' (e.g. ['01/2027', '02/2027']). Use it to look further ahead than the default window, or to target a season. Omit for roughly the next 5 months. Has no effect on tour-operator packages, which expose no date availability."}, 'source': {'type': 'string', 'title': 'Source', 'description': "The offer's source type, copied verbatim from the `source` field of a `verychic_search_offers` result. One of 'ORCHESTRA' (a single hotel) or 'ORCHESTRA_TO' (a tour-operator package). Packages have no per-date availability."}, 'external_id': {'type': 'integer', 'title': 'External Id', 'description': "The offer's numeric `external_id`, copied from a `verychic_search_offers` result. Identifies the offer together with `source`."}}}
Schéma de sortie
{'type': 'object', '$defs': {'OfferOut': {'type': 'object', 'title': 'OfferOut', 'required': ['source', 'external_id', 'name', 'destination', 'country', 'price', 'currency', 'short_desc', 'discount', 'url_name', 'sales_mode', 'offer_end_date', 'latitude', 'longitude', 'image', 'advantages', 'themes', 'stars', 'price_label', 'price_with_flights', 'flights_included', 'rating', 'opinion_count', 'rating_location', 'rating_public_area', 'rating_room', 'rating_service', 'rating_food', 'distance_km', 'offer_url'], 'properties': {'name': {'type': 'string', 'title': 'Name'}, 'image': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Image'}, 'price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Price'}, 'stars': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Stars'}, 'rating': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating'}, 'source': {'type': 'string', 'title': 'Source'}, 'themes': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Themes'}, 'country': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Country'}, 'currency': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Currency'}, 'discount': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Discount'}, 'latitude': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Latitude'}, 'url_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Url Name'}, 'longitude': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Longitude'}, 'offer_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer Url'}, 'advantages': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Advantages'}, 'sales_mode': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Sales Mode'}, 'short_desc': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Short Desc'}, 'destination': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Destination'}, 'distance_km': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Distance Km'}, 'external_id': {'type': 'integer', 'title': 'External Id'}, 'price_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Price Label'}, 'rating_food': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Food'}, 'rating_room': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Room'}, 'opinion_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Opinion Count'}, 'offer_end_date': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer End Date'}, 'rating_service': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Service'}, 'rating_location': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Location'}, 'flights_included': {'type': 'boolean', 'title': 'Flights Included'}, 'price_with_flights': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Price With Flights'}, 'rating_public_area': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Public Area'}}}, 'MonthPriceOut': {'type': 'object', 'title': 'MonthPriceOut', 'required': ['month', 'min_price', 'currency', 'dates_available'], 'properties': {'month': {'type': 'string', 'title': 'Month'}, 'currency': {'type': 'string', 'title': 'Currency'}, 'min_price': {'type': 'integer', 'title': 'Min Price'}, 'dates_available': {'type': 'integer', 'title': 'Dates Available'}}}, 'AvailabilityOut': {'type': 'object', 'title': 'AvailabilityOut', 'required': ['date', 'price', 'currency', 'nights', 'days', 'departure_city_code'], 'properties': {'date': {'type': 'string', 'title': 'Date'}, 'days': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Days'}, 'price': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Price'}, 'nights': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Nights'}, 'currency': {'type': 'string', 'title': 'Currency'}, 'departure_city_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Departure City Code'}}}}, 'title': 'OfferDetailsOut', 'required': ['offer', 'advantages', 'included_added_values', 'non_included_added_values', 'gallery', 'availabilities', 'availabilities_by_month', 'availabilities_supported', 'cheapest_price'], 'properties': {'offer': {'$ref': '#/$defs/OfferOut'}, 'gallery': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Gallery'}, 'advantages': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Advantages'}, 'availabilities': {'type': 'array', 'items': {'$ref': '#/$defs/AvailabilityOut'}, 'title': 'Availabilities'}, 'cheapest_price': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Cheapest Price'}, 'included_added_values': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Included Added Values'}, 'availabilities_by_month': {'type': 'array', 'items': {'$ref': '#/$defs/MonthPriceOut'}, 'title': 'Availabilities By Month'}, 'availabilities_supported': {'type': 'boolean', 'title': 'Availabilities Supported'}, 'non_included_added_values': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Non Included Added Values'}}}
verychic_search_offers
Search and filter the current VeryChic offers by destination, country, price, discount, stars, flights, theme, or proximity — with optional sorting. When to use: when you already know roughly what the user wants — a place, a country, a budget, a minimum discount or star rating, flights vs hotel-only, a theme (e.g. pool, spa, romantic, last_minute), or hotels near a point (near_lat/near_lng, with an optional radius_km). To inspect one specific offer in depth use `verychic_offer_details`. All filters are optional and combine with AND; call it with no filter to browse the full current catalogue in catalogue order. Behaviour: read-only and anonymous; rate-limited to about 1 request per second. Filtering is done client-side over the live catalogue: `destination` is a substring (matched on destination or name), `country` is an exact match — both ignore case and accents, so 'grece' matches the catalogue's 'Grèce' — `max_price`/`min_discount`/`min_stars` are numeric bounds, `flights_included` toggles flight-bearing vs hotel-only, and `theme` matches a curated label decoded from the catalogue's thematics tags. Use `sort_by` to order results (`discount`, `price`, `rating`, `stars`, or `distance`). Prices are in EUR and text is in French; there is no pagination. Returns the first `limit` matches after filtering and sorting. "Current" means live offers at call time; the catalogue changes over time. Returns a list of offer objects (same `source` + `external_id` pair for use with `verychic_offer_details`). Each offer also carries `discount` (percent off, may be null), `stars` (1-5, may be null), `price_label` (human-readable price unit, e.g. "à partir de par pers. pour 3 nuits" vs "par chambre" — read this before comparing prices), `price_with_flights` (EUR, null when not applicable), `flights_included` (bool), `rating` (overall guest grade out of 10), `opinion_count` (how many reviews that grade rests on — check it before trusting a rating), the per-topic grades `rating_location`, `rating_room`, `rating_service`, `rating_food` and `rating_public_area` (out of 10, null when unrated), and `themes` (curated theme labels decoded from the catalogue's thematics tags, e.g. ["pool", "luxury"]). The catalogue carries no reviews, so every grade is null and `opinion_count` is 0 here; call `verychic_offer_details` on an offer to get its real review data. An empty list means no offer matched the filters. Proximity search: pass `near_lat` and `near_lng` (decimal degrees, together) to compute each offer's `distance_km` from that point; add `radius_km` to keep only offers within that distance, and/or `sort_by="distance"` for nearest-first. `distance_km` is null when no center is given.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'verychic_search_offersArguments', 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 20, 'description': 'Maximum number of matching offers to return (default 20), applied after filtering and sorting. No pagination.'}, 'theme': {'anyOf': [{'enum': ['adults_only', 'city_break', 'cruise', 'island', 'last_minute', 'luxury', 'mountain', 'nature', 'pool', 'romantic', 'rooftop', 'spa', 'sun', 'villa'], 'type': 'string'}, {'type': 'null'}], 'title': 'Theme', 'default': None, 'description': "Keep only offers matching this curated theme, decoded from the catalogue's thematics tags. One of: adults_only, city_break, cruise, island, last_minute, luxury, mountain, nature, pool, romantic, rooftop, spa, sun, villa. Omit to not filter by theme."}, 'country': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Country', 'default': None, 'description': "Exact country name as spelled in the (French) catalogue, matched ignoring case and accents, e.g. 'France', 'Italie', 'Grece' (finds 'Grèce'). Omit to not filter by country."}, 'sort_by': {'anyOf': [{'enum': ['discount', 'price', 'rating', 'stars', 'distance'], 'type': 'string'}, {'type': 'null'}], 'title': 'Sort By', 'default': None, 'description': "Sort the results: 'discount' (biggest discount first), 'price' (cheapest first), 'rating' (best-rated first), 'stars' (most stars first), 'distance' (nearest first, requires near_lat/near_lng). Offers missing the sort value are placed last. Omit to keep catalogue order."}, 'near_lat': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Near Lat', 'default': None, 'description': 'Latitude of a search center for proximity search, in decimal degrees. Must be given together with near_lng. Omit for no geo search.'}, 'near_lng': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Near Lng', 'default': None, 'description': 'Longitude of a search center for proximity search, in decimal degrees. Must be given together with near_lat. Omit for no geo search.'}, 'max_price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Max Price', 'default': None, 'description': 'Inclusive upper bound on the offer price, in EUR. Offers with no price are excluded when this is set. Omit for no price cap.'}, 'min_stars': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Min Stars', 'default': None, 'description': 'Keep only offers with at least this hotel star rating (1-5), parsed from the offer name. Offers with no detectable rating are excluded. Omit to not filter by stars.'}, 'radius_km': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Radius Km', 'default': None, 'description': 'Keep only offers within this many kilometers of the near_lat/near_lng center. Requires near_lat and near_lng. Omit for no radius.'}, 'destination': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Destination', 'default': None, 'description': "Substring matched against each offer's destination AND name, ignoring case and accents (e.g. 'paris', 'maldives', 'crete' finds 'Crète'). Omit to not filter by destination."}, 'min_discount': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Min Discount', 'default': None, 'description': "Keep only offers whose discount percentage is at least this value (e.g. 40 for '40% off or more'). Offers with no discount are excluded. Omit for no discount filter."}, 'flights_included': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Flights Included', 'default': None, 'description': 'Filter on whether flights are part of the offer: true keeps flight-bearing offers, false keeps hotel-only offers. Omit to not filter.'}}}
Schéma de sortie
{'type': 'object', '$defs': {'OfferOut': {'type': 'object', 'title': 'OfferOut', 'required': ['source', 'external_id', 'name', 'destination', 'country', 'price', 'currency', 'short_desc', 'discount', 'url_name', 'sales_mode', 'offer_end_date', 'latitude', 'longitude', 'image', 'advantages', 'themes', 'stars', 'price_label', 'price_with_flights', 'flights_included', 'rating', 'opinion_count', 'rating_location', 'rating_public_area', 'rating_room', 'rating_service', 'rating_food', 'distance_km', 'offer_url'], 'properties': {'name': {'type': 'string', 'title': 'Name'}, 'image': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Image'}, 'price': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Price'}, 'stars': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Stars'}, 'rating': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating'}, 'source': {'type': 'string', 'title': 'Source'}, 'themes': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Themes'}, 'country': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Country'}, 'currency': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Currency'}, 'discount': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Discount'}, 'latitude': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Latitude'}, 'url_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Url Name'}, 'longitude': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Longitude'}, 'offer_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer Url'}, 'advantages': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Advantages'}, 'sales_mode': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Sales Mode'}, 'short_desc': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Short Desc'}, 'destination': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Destination'}, 'distance_km': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Distance Km'}, 'external_id': {'type': 'integer', 'title': 'External Id'}, 'price_label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Price Label'}, 'rating_food': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Food'}, 'rating_room': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Room'}, 'opinion_count': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Opinion Count'}, 'offer_end_date': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer End Date'}, 'rating_service': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Service'}, 'rating_location': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Location'}, 'flights_included': {'type': 'boolean', 'title': 'Flights Included'}, 'price_with_flights': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Price With Flights'}, 'rating_public_area': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Rating Public Area'}}}}, 'title': 'verychic_search_offersOutput', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'$ref': '#/$defs/OfferOut'}, 'title': 'Result'}}}
Modifié
verychic_offer_details
23 September 2026 02:43
Modifié
verychic_search_offers
23 September 2026 02:43
Ajouté
verychic_offer_details
17 September 2026 12:42
Ajouté
verychic_search_offers
17 September 2026 12:42