Skip to main content
Glama

verychic_search_offers

Read-onlyIdempotent

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.
    

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching offers to return (default 20), applied after filtering and sorting. No pagination.
themeNoKeep 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.
countryNoExact 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_byNoSort 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_latNoLatitude of a search center for proximity search, in decimal degrees. Must be given together with near_lng. Omit for no geo search.
near_lngNoLongitude of a search center for proximity search, in decimal degrees. Must be given together with near_lat. Omit for no geo search.
max_priceNoInclusive upper bound on the offer price, in EUR. Offers with no price are excluded when this is set. Omit for no price cap.
min_starsNoKeep 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_kmNoKeep only offers within this many kilometers of the near_lat/near_lng center. Requires near_lat and near_lng. Omit for no radius.
destinationNoSubstring 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_discountNoKeep 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_includedNoFilter on whether flights are part of the offer: true keeps flight-bearing offers, false keeps hotel-only offers. Omit to not filter.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedOutput schema / $defs / OfferOut / properties / opinion_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Opinion Count"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating_food
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating Food"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating_location
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating Location"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating_public_area
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating Public Area"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating_room
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating Room"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating_service
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating Service"
      +}
    • changedOutput schema / $defs / OfferOut / required
      Previous value: -[
      -  "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",
      -  "distance_km",
      -  "offer_url"
      -]New value: +[
      +  "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"
      +]
  2. Changed2 schema fields changed
    • changedInput schema / properties / country / description
      Previous value: -"Exact country name, case-insensitive, as spelled in the (French) catalogue, e.g. 'France', 'Italie', 'Grece'. Omit to not filter by country."New value: +"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."
    • changedInput schema / properties / destination / description
      Previous value: -"Case-insensitive substring matched against each offer's destination AND name (e.g. 'paris', 'maldives', 'crete'). Omit to not filter by destination."New value: +"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."
  3. Changed17 schema fields changed
    • addedInput schema / properties / flights_included
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Filter on whether flights are part of the offer: true keeps flight-bearing offers, false keeps hotel-only offers. Omit to not filter.",
      +  "title": "Flights Included"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum number of matching offers to return (default 20), applied after filtering. No pagination."New value: +"Maximum number of matching offers to return (default 20), applied after filtering and sorting. No pagination."
    • addedInput schema / properties / min_discount
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "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.",
      +  "title": "Min Discount"
      +}
    • addedInput schema / properties / min_stars
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "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.",
      +  "title": "Min Stars"
      +}
    • addedInput schema / properties / near_lat
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Latitude of a search center for proximity search, in decimal degrees. Must be given together with near_lng. Omit for no geo search.",
      +  "title": "Near Lat"
      +}
    • addedInput schema / properties / near_lng
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Longitude of a search center for proximity search, in decimal degrees. Must be given together with near_lat. Omit for no geo search.",
      +  "title": "Near Lng"
      +}
    • addedInput schema / properties / radius_km
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "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.",
      +  "title": "Radius Km"
      +}
    • addedInput schema / properties / sort_by
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "discount",
      +        "price",
      +        "rating",
      +        "stars",
      +        "distance"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "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.",
      +  "title": "Sort By"
      +}
    • addedInput schema / properties / theme
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "adults_only",
      +        "city_break",
      +        "cruise",
      +        "island",
      +        "last_minute",
      +        "luxury",
      +        "mountain",
      +        "nature",
      +        "pool",
      +        "romantic",
      +        "rooftop",
      +        "spa",
      +        "sun",
      +        "villa"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "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.",
      +  "title": "Theme"
      +}
    • addedOutput schema / $defs / OfferOut / properties / distance_km
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Distance Km"
      +}
    • addedOutput schema / $defs / OfferOut / properties / flights_included
      Added value: +{
      +  "title": "Flights Included",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / OfferOut / properties / price_label
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Price Label"
      +}
    • addedOutput schema / $defs / OfferOut / properties / price_with_flights
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Price With Flights"
      +}
    • addedOutput schema / $defs / OfferOut / properties / rating
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Rating"
      +}
    • addedOutput schema / $defs / OfferOut / properties / stars
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Stars"
      +}
    • addedOutput schema / $defs / OfferOut / properties / themes
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Themes",
      +  "type": "array"
      +}
    • changedOutput schema / $defs / OfferOut / required
      Previous value: -[
      -  "source",
      -  "external_id",
      -  "name",
      -  "destination",
      -  "country",
      -  "price",
      -  "currency",
      -  "short_desc",
      -  "discount",
      -  "url_name",
      -  "sales_mode",
      -  "offer_end_date",
      -  "latitude",
      -  "longitude",
      -  "image",
      -  "advantages",
      -  "offer_url"
      -]New value: +[
      +  "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",
      +  "distance_km",
      +  "offer_url"
      +]
  4. Changed4 schema fields changed
    • addedOutput schema / $defs
      Added value: +{
      +  "OfferOut": {
      +    "properties": {
      +      "advantages": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Advantages",
      +        "type": "array"
      +      },
      +      "country": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Country"
      +      },
      +      "currency": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Currency"
      +      },
      +      "destination": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Destination"
      +      },
      +      "discount": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Discount"
      +      },
      +      "external_id": {
      +        "title": "External Id",
      +        "type": "integer"
      +      },
      +      "image": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Image"
      +      },
      +      "latitude": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Latitude"
      +      },
      +      "longitude": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Longitude"
      +      },
      +      "name": {
      +        "title": "Name",
      +        "type": "string"
      +      },
      +      "offer_end_date": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Offer End Date"
      +      },
      +      "offer_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Offer Url"
      +      },
      +      "price": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Price"
      +      },
      +      "sales_mode": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Sales Mode"
      +      },
      +      "short_desc": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Short Desc"
      +      },
      +      "source": {
      +        "title": "Source",
      +        "type": "string"
      +      },
      +      "url_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "title": "Url Name"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "external_id",
      +      "name",
      +      "destination",
      +      "country",
      +      "price",
      +      "currency",
      +      "short_desc",
      +      "discount",
      +      "url_name",
      +      "sales_mode",
      +      "offer_end_date",
      +      "latitude",
      +      "longitude",
      +      "image",
      +      "advantages",
      +      "offer_url"
      +    ],
      +    "title": "OfferOut",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties / result / items / $ref
      Added value: +"#/$defs/OfferOut"
    • removedOutput schema / properties / result / items / additionalProperties
      Removed value: -true
    • removedOutput schema / properties / result / items / type
      Removed value: -"object"
  5. Changed4 schema fields changed
    • addedInput schema / properties / country / description
      Added value: +"Exact country name, case-insensitive, as spelled in the (French) catalogue, e.g. 'France', 'Italie', 'Grece'. Omit to not filter by country."
    • addedInput schema / properties / destination / description
      Added value: +"Case-insensitive substring matched against each offer's destination AND name (e.g. 'paris', 'maldives', 'crete'). Omit to not filter by destination."
    • addedInput schema / properties / limit / description
      Added value: +"Maximum number of matching offers to return (default 20), applied after filtering. No pagination."
    • addedInput schema / properties / max_price / description
      Added value: +"Inclusive upper bound on the offer price, in EUR. Offers with no price are excluded when this is set. Omit for no price cap."
  6. First observed

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description goes well beyond these: it discloses anonymous access, a rate limit of ~1 request/second, client-side filtering over the live catalogue, case/accent-insensitive matching, no pagination, first-limit semantics, and the meaning of an empty result. This is rich behavioral context that annotations alone would not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but its length is proportionate to 12 optional parameters and subtle matching semantics. It is well structured with clear sections: purpose, when to use, behaviour, return semantics, and proximity. Key decision-relevant facts are front-loaded, and there is no filler or repeated schema boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description adds important interpretive context: price_label must be read before comparing prices, opinion_count should be checked before trusting a rating, the live catalogue has no reviews so grades are null here, and verychic_offer_details provides real review data. It also covers rate limiting, empty-result meaning, and proximity behavior. Nothing an agent needs to call or interpret the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial semantic value beyond the schema: destination is a substring matched on both destination and name, country is exact, max_price/min_discount/min_stars are numeric bounds with null-exclusion behavior, near_lat/near_lng must be passed together, sort_by missing values go last, and limit is applied after filtering and sorting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('search and filter') and resource ('current VeryChic offers'), and enumerates the filter dimensions (destination, country, price, discount, stars, flights, theme, proximity) plus sorting. It explicitly differentiates from the sibling by pointing to verychic_offer_details for inspecting one specific offer in depth.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is an explicit 'When to use' block that tells the agent this tool is for broad/filtered searches when the user has rough criteria, and that verychic_offer_details is for deep inspection of a single offer. It also states the no-filter case: calling with no filters browses the full catalogue.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.