Skip to main content
Glama

VeryChic MCP

Find, filter, and price VeryChic hotel deals from any MCP client

Browse current flash-sale offers, filter them by destination, country, price, discount, stars, flights, theme, or proximity (and sort the results), then read an offer's availability and prices by date. Read-only, anonymous, no account needed.

PyPI version License: MIT Release Python MCP Smithery Glama score Available on CodeGuilds

Open the live landing page

Install in Cursor Install in VS Code


Read-only and anonymous. This server only searches and reads offers — it never books, never logs in, and uses no credentials. A conservative rate limit (≥ 1 s between requests) is built into the client. See the disclaimer for terms of use.

Demo

Adding the hosted VeryChic MCP server to Claude Desktop as a custom connector, then asking for Spain deals under €600:

Adding VeryChic MCP to Claude Desktop as a custom connector

Watch it as MP4

Related MCP server: MAQAMI Travel

Quick start

Add the server to your MCP client config. With uv installed, there is nothing to clone or install:

{
  "mcpServers": {
    "verychic": {
      "command": "uvx",
      "args": ["verychic-mcp"]
    }
  }
}

This runs the server over stdio, which is what Claude Desktop and Claude Code use. You can also run it directly:

uvx verychic-mcp          # stdio (default)
uvx verychic-mcp --help   # all options

The same command/args pair works in every stdio client; only the wrapping config differs. These configs are for local clients (stdio). For cloud clients like claude.ai or Cowork, which connect over HTTPS instead, see Use from Claude.ai or Cowork.

claude mcp add verychic -- uvx verychic-mcp
{
  "mcpServers": {
    "verychic": {
      "command": "uvx",
      "args": ["verychic-mcp"]
    }
  }
}
{
  "servers": {
    "verychic": {
      "command": "uvx",
      "args": ["verychic-mcp"]
    }
  }
}
{
  "mcpServers": {
    "verychic": {
      "command": "uvx",
      "args": ["verychic-mcp"]
    }
  }
}

Tools

Tool

What it returns

verychic_search_offers

Offers filtered by destination, country, max_price, min_discount, min_stars, flights_included, theme, or proximity (near_lat/near_lng/radius_km), with optional sort_by.

verychic_offer_details

One offer's content (advantages, gallery) plus its availability and prices by date.

Every call is read-only and anonymous, with a conservative rate limit built into the client.

verychic_search_offers

Returns the offers matching every filter you pass (filters are combined with AND).

Parameter

Type

Required

Description

destination

string

no

Substring matched against the offer's destination or name, ignoring case and accents (crete finds Crète).

country

string

no

Exact country match, ignoring case and accents ("Espagne", "Grece" finds Grèce).

max_price

number

no

Keep only offers priced at or below this value (EUR).

min_discount

number

no

Keep only offers with at least this discount percentage (e.g. 40).

min_stars

integer

no

Keep only offers with at least this hotel star rating (1–5).

flights_included

boolean

no

true keeps flight-bearing offers, false keeps hotel-only offers.

theme

string (enum)

no

Keep only offers matching a 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.

near_lat / near_lng

number

no

Latitude/longitude of a search center (decimal degrees), given together, to compute each offer's distance_km.

radius_km

number

no

Keep only offers within this many km of near_lat/near_lng (requires both).

sort_by

string (enum)

no

Order results: discount, price, rating, stars, or distance (nearest first, requires a center).

limit

integer

no

Max number of offers to return. Defaults to 20.

verychic_offer_details

Returns one offer's full content plus, for hotels, its day-by-day availability and prices.

Parameter

Type

Required

Description

source

string

yes

ORCHESTRA for a hotel, ORCHESTRA_TO for a tour-operator package.

external_id

integer

yes

The offer's id, as returned by verychic_search_offers.

months

array of strings

no

Months to look up availability for, each written MM/YYYY (e.g. ["01/2027", "02/2027"]). Defaults to roughly the next 5 months.


Examples

Ask your assistant things like:

  • "Browse the current VeryChic deals."

  • "Search VeryChic offers in Spain under 600 euros."

  • "Find 5-star spa hotels with at least 40% off, cheapest first."

  • "Show VeryChic offers within 300 km of Paris (48.8566, 2.3522), nearest first."

  • "Get the details and dated prices for the ORCHESTRA hotel offer 44983."

  • "What does that hotel cost in February and March 2027?" The assistant passes months: ["02/2027", "03/2027"] to look beyond the default window.

  • "Which month is cheapest for this hotel?" availabilities_by_month answers it directly — one row per month with stock, so a wide months window stays cheap to read.

  • "Get the details for the ORCHESTRA_TO package offer 301375." Tour-operator packages bundle flights with the hotel, so they do not expose day-by-day prices the way a single hotel does. The tool still returns the offer content and advantages, and sets availabilities_supported: false so an empty availabilities reads as "not supported for this offer type", not "no dates available".

Offers carry a source (ORCHESTRA for a hotel, ORCHESTRA_TO for a package) and an external_id. Both come back from verychic_search_offers, so the assistant can pass them to verychic_offer_details on its own.

A verychic_search_offers result is a list of offer objects (one shown here, trimmed):

{
  "source": "ORCHESTRA",
  "external_id": 36509,
  "name": "Sofitel New York ****",
  "destination": "New York, États-Unis",
  "country": "États-Unis",
  "price": 182,
  "currency": "EUR",
  "discount": 57.0,
  "sales_mode": "FLASH",
  "offer_end_date": "2026-06-24T23:55+0200",
  "image": "https://.../sofitel-new-york.jpg",
  "advantages": ["Petit-déjeuner inclus", "VeryFlexible : réservez en toute sérénité !"],
  "offer_url": "https://www.verychic.fr/p/36509/etats-unis-new-york-hotel-sofitel-new-york"
}

verychic_offer_details adds gallery, included_added_values, a cheapest_price, the guest review grades, a per-month price rollup, and the day-by-day availabilities for a hotel:

{
  "offer": {
    "source": "ORCHESTRA", "external_id": 44983, "name": "Hotel Kaktus Playa *****",
    "rating": 8.5, "opinion_count": 67,
    "rating_location": 8.1, "rating_room": 9.2, "rating_service": 8.9,
    "rating_food": 9.1, "rating_public_area": 9.1,
    "...": "..."
  },
  "cheapest_price": 169,
  "availabilities_supported": true,
  "availabilities_by_month": [
    { "month": "06/2026", "min_price": 169, "currency": "EUR", "dates_available": 5 }
  ],
  "availabilities": [
    { "date": "20/06/2026", "price": 169, "currency": "EUR", "nights": 1, "days": 2 },
    { "date": "21/06/2026", "price": 169, "currency": "EUR", "nights": 1, "days": 2 }
  ]
}

Use from Claude.ai or Cowork

Unlike the local clients in Quick start, cloud clients such as claude.ai and Cowork only connect to remote MCP servers over HTTPS, not to a local process. To use VeryChic MCP there, host it yourself in streamable-http mode (verychic-mcp --transport streamable-http, behind HTTPS) and add it as a custom connector, pasting your deployment URL with the /mcp path.

A public instance is deployed for convenience at https://verychic-mcp.fly.dev/mcp. Add it as a custom connector in claude.ai/Cowork, or wire it into a local client that speaks remote MCP:

{
  "mcpServers": {
    "verychic": {
      "url": "https://verychic-mcp.fly.dev/mcp"
    }
  }
}

It is best-effort and may be paused or rate-limited at any time — for anything beyond a quick try, run your own instance with the uvx command above or host the streamable-http mode.

Listing in Anthropic's official connector directory (next to Booking or Tripadvisor) is out of scope. That directory is reserved for partner integrations that pass a review this kind of tool would not.


How it works

The VeryChic web app talks to a public JSON API under https://api.verychic.com/verychic-endpoints/v1 (plus search.verychic.com). This server replays those same calls with a browser-like TLS fingerprint (curl_cffi), parses the responses into typed objects, and exposes them as MCP tools. Everything works without logging in. The one volatile request parameter, channelVersion, is read from the live site at startup and falls back to a known value if that read fails.


Development

git clone https://github.com/jordantete/verychic-mcp.git && cd verychic-mcp
pip install -e ".[dev]"
pytest                  # offline tests, run against recorded fixtures
pytest -m network       # optional smoke test against the live API, low volume
ruff check verychic_mcp tests

Releases are tag-driven. Pushing a vX.Y.Z tag runs the tests, builds the package, and publishes it to PyPI through GitHub Actions with trusted publishing, so no token is stored anywhere.


Disclaimer

VeryChic MCP is not affiliated with, endorsed by, or connected to VeryChic or VeryChic SAS. It is an independent community tool for personal use that reads VeryChic's public web API the same way a browser does. You are responsible for complying with VeryChic's terms of sale, notably Article 9 on intellectual property and the database producer's sui generis right. Use it at your own risk, for personal and low-volume browsing only. Do not use it for bulk extraction or redistribution of VeryChic's data.

License

MIT. See LICENSE.

Available Tools

2 tools
verychic_offer_detailsA
Read-onlyIdempotent
Inspect

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.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoMonths 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.
sourceYesThe 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_idYesThe offer's numeric `external_id`, copied from a `verychic_search_offers` result. Identifies the offer together with `source`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
offerYes
galleryYes
advantagesYes
availabilitiesYes
cheapest_priceYes
included_added_valuesYes
availabilities_by_monthYes
availabilities_supportedYes
non_included_added_valuesYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that the call is read-only and anonymous, rate-limited to about 1 request per second, returns EUR prices and French text, defaults to a roughly 5-month availability window, and handles the tour-operator case where empty `availabilities` means 'not supported', not 'sold out'. These are specific and important behavioral details.

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 well-structured into purpose, when-to-use, behavior, return shape, and an efficiency hint. Although it is fairly long, every section adds operational value and the key purpose is front-loaded.

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?

It covers prerequisites, request constraints, rate limits, units, language, the special-case behavior for tour-operator packages, the full return object shape, and a recommendation for efficiently answering 'which month is cheapest'. An agent has everything needed to call this tool correctly.

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

Parameters3/5

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

The input schema already documents all three parameters with descriptions, examples, and the tour-operator caveat, so schema coverage is 100%. The description reinforces that `source` and `external_id` come from a search result and clarifies the `months` default, but it does not add substantial meaning beyond what the schema already provides.

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 description opens with 'Get full details plus per-date availability and prices for one specific VeryChic offer', which names the verb, resource, and scope precisely. It clearly distinguishes this from the sibling `verychic_search_offers` by emphasizing this tool inspects one already-found offer rather than searching.

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' section: use it after `verychic_search_offers` returns an offer, and pass that offer's `source` and `external_id`. It also states that the identifiers must be obtained from a search result first and that this tool does not search, giving clear routing and prerequisites.

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

verychic_search_offersA
Read-onlyIdempotent
Inspect

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.
    
ParametersJSON 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

ParametersJSON Schema
NameRequiredDescription
resultYes

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.4.0
    • Changedverychic_offer_details11 fields changed
      • addedInput schema / properties / months
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "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.",
        +  "title": "Months"
        +}
      • addedOutput schema / $defs / MonthPriceOut
        Added value: +{
        +  "properties": {
        +    "currency": {
        +      "title": "Currency",
        +      "type": "string"
        +    },
        +    "dates_available": {
        +      "title": "Dates Available",
        +      "type": "integer"
        +    },
        +    "min_price": {
        +      "title": "Min Price",
        +      "type": "integer"
        +    },
        +    "month": {
        +      "title": "Month",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "month",
        +    "min_price",
        +    "currency",
        +    "dates_available"
        +  ],
        +  "title": "MonthPriceOut",
        +  "type": "object"
        +}
      • 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"
        +]
      • addedOutput schema / properties / availabilities_by_month
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/MonthPriceOut"
        +  },
        +  "title": "Availabilities By Month",
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "offer",
        -  "advantages",
        -  "included_added_values",
        -  "non_included_added_values",
        -  "gallery",
        -  "availabilities",
        -  "availabilities_supported",
        -  "cheapest_price"
        -]New value: +[
        +  "offer",
        +  "advantages",
        +  "included_added_values",
        +  "non_included_added_values",
        +  "gallery",
        +  "availabilities",
        +  "availabilities_by_month",
        +  "availabilities_supported",
        +  "cheapest_price"
        +]
    • Changedverychic_search_offers7 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. 3 tool updatesv0.2.1
    • Removedverychic_list_deals
    • Changedverychic_offer_details3 fields changed
      • addedInput schema / properties / external_id / description
        Added value: +"The offer's numeric `external_id`, copied from a `verychic_search_offers` result. Identifies the offer together with `source`."
      • addedInput schema / properties / source / description
        Added value: +"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."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "AvailabilityOut": {
        +      "properties": {
        +        "currency": {
        +          "title": "Currency",
        +          "type": "string"
        +        },
        +        "date": {
        +          "title": "Date",
        +          "type": "string"
        +        },
        +        "days": {
        +          "anyOf": [
        +            {
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Days"
        +        },
        +        "departure_city_code": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Departure City Code"
        +        },
        +        "nights": {
        +          "anyOf": [
        +            {
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Nights"
        +        },
        +        "price": {
        +          "anyOf": [
        +            {
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Price"
        +        }
        +      },
        +      "required": [
        +        "date",
        +        "price",
        +        "currency",
        +        "nights",
        +        "days",
        +        "departure_city_code"
        +      ],
        +      "title": "AvailabilityOut",
        +      "type": "object"
        +    },
        +    "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"
        +        },
        +        "distance_km": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Distance Km"
        +        },
        +        "external_id": {
        +          "title": "External Id",
        +          "type": "integer"
        +        },
        +        "flights_included": {
        +          "title": "Flights Included",
        +          "type": "boolean"
        +        },
        +        "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"
        +        },
        +        "price_label": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Price Label"
        +        },
        +        "price_with_flights": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Price With Flights"
        +        },
        +        "rating": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Rating"
        +        },
        +        "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"
        +        },
        +        "stars": {
        +          "anyOf": [
        +            {
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "title": "Stars"
        +        },
        +        "themes": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "title": "Themes",
        +          "type": "array"
        +        },
        +        "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",
        +        "themes",
        +        "stars",
        +        "price_label",
        +        "price_with_flights",
        +        "flights_included",
        +        "rating",
        +        "distance_km",
        +        "offer_url"
        +      ],
        +      "title": "OfferOut",
        +      "type": "object"
        +    }
        +  },
        +  "properties": {
        +    "advantages": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Advantages",
        +      "type": "array"
        +    },
        +    "availabilities": {
        +      "items": {
        +        "$ref": "#/$defs/AvailabilityOut"
        +      },
        +      "title": "Availabilities",
        +      "type": "array"
        +    },
        +    "availabilities_supported": {
        +      "title": "Availabilities Supported",
        +      "type": "boolean"
        +    },
        +    "cheapest_price": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Cheapest Price"
        +    },
        +    "gallery": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Gallery",
        +      "type": "array"
        +    },
        +    "included_added_values": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Included Added Values",
        +      "type": "array"
        +    },
        +    "non_included_added_values": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Non Included Added Values",
        +      "type": "array"
        +    },
        +    "offer": {
        +      "$ref": "#/$defs/OfferOut"
        +    }
        +  },
        +  "required": [
        +    "offer",
        +    "advantages",
        +    "included_added_values",
        +    "non_included_added_values",
        +    "gallery",
        +    "availabilities",
        +    "availabilities_supported",
        +    "cheapest_price"
        +  ],
        +  "title": "OfferDetailsOut",
        +  "type": "object"
        +}
    • Changedverychic_search_offers16 fields changed
      • addedInput schema / properties / country / description
        Added 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."
      • addedInput schema / properties / destination / description
        Added 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."
      • 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"
        +}
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching offers to return (default 20), applied after filtering and sorting. 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."
      • 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
        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"
        +      },
        +      "distance_km": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Distance Km"
        +      },
        +      "external_id": {
        +        "title": "External Id",
        +        "type": "integer"
        +      },
        +      "flights_included": {
        +        "title": "Flights Included",
        +        "type": "boolean"
        +      },
        +      "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"
        +      },
        +      "price_label": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Price Label"
        +      },
        +      "price_with_flights": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Price With Flights"
        +      },
        +      "rating": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Rating"
        +      },
        +      "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"
        +      },
        +      "stars": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Stars"
        +      },
        +      "themes": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Themes",
        +        "type": "array"
        +      },
        +      "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",
        +      "themes",
        +      "stars",
        +      "price_label",
        +      "price_with_flights",
        +      "flights_included",
        +      "rating",
        +      "distance_km",
        +      "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"
  3. 3 tool updatesv0.1.3
    • First observedverychic_list_deals
    • First observedverychic_offer_details
    • First observedverychic_search_offers

TDQS

A4.7/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct roles: one searches and filters the catalogue, the other retrieves detailed availability for a specific offer. Their descriptions explicitly cross-reference each other and there is no functional overlap.

Naming Consistency4/5

Both tools share the 'verychic_' prefix, but the pattern deviates slightly: 'search_offers' follows verb-object while 'offer_details' follows object-descriptor. Still, both names are readable and predictable.

Tool Count4/5

Two tools is minimal, but it matches the narrow read-only scope of browsing and inspecting offers. Each tool is substantial and covers a distinct part of the workflow, so neither feels superfluous or missing.

Completeness5/5

The tool surface covers the complete user journey for a read-only travel-offer catalog: broad search with rich filtering and sorting, then detailed inspection with availability and pricing. No obvious gaps or dead ends exist.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers