Serveur MCP

ScentVerdict

com.scentverdict/fragrances
Commerce et retail Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Provides UK fragrance catalogue search, comparisons, recommendations, scent profiles, verdicts, and current bottle pricing.

compare_fragrances
Compare Two Fragrances
Compare exactly two fragrances side by side using ScentVerdict's own note data: which notes they share, which differ, and both verdicts. Use this whenever the user is choosing between two named fragrances, or asks which of two is better, or how two differ. Use find_similar_fragrances instead when they want alternatives to one fragrance rather than a head to head.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['slugA', 'slugB'], 'properties': {'slugA': {'type': 'string', 'description': 'Slug of the first fragrance.'}, 'slugB': {'type': 'string', 'description': 'Slug of the second fragrance.'}}}
Schéma de sortie
{'type': 'object', 'required': ['a', 'b', 'sharedNotes', 'onlyInA', 'onlyInB', 'comparisonUrl', 'notFound', 'error'], 'properties': {'a': {'type': ['object', 'null'], 'required': ['slug', 'name', 'brand', 'brandSlug', 'concentration', 'yearLaunched', 'verdictBadge', 'verdict', 'keyNotes', 'priceFromGbp', 'priceSizeMl', 'pricePerMlGbp', 'imageUrl', 'scentArtUrl', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL, carrying the interactive scent wheel, drydown timeline and full descriptor profile.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'verdict': {'type': ['string', 'null'], 'description': 'The full ScentVerdict editorial verdict. Null when this row came from a source that carries no verdict.'}, 'imageUrl': {'type': ['string', 'null'], 'description': 'Bottle image URL. Null when we hold no image.'}, 'keyNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The most characteristic notes. May be empty.'}, 'brandSlug': {'type': 'string', 'description': 'Brand slug.'}, 'priceSizeMl': {'type': ['number', 'null'], 'description': 'Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.'}, 'scentArtUrl': {'type': ['string', 'null'], 'description': "ScentArt visual URL, generated from this fragrance's own composition. Null when not yet rendered."}, 'priceFromGbp': {'type': ['number', 'null'], 'description': 'Lowest UK price we hold for a full-size bottle, in GBP. Excludes samples and decants. Null when we hold no full-size price.'}, 'verdictBadge': {'type': ['string', 'null'], 'description': 'Editorial classification: Favourite, Statement or Acquired. Null when not yet classified.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt, Edp or Parfum. Null when unknown.'}, 'pricePerMlGbp': {'type': ['number', 'null'], 'description': 'PriceFromGbp divided by PriceSizeMl. USE THIS to compare value between fragrances, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.'}}, 'description': 'The first fragrance.'}, 'b': {'type': ['object', 'null'], 'required': ['slug', 'name', 'brand', 'brandSlug', 'concentration', 'yearLaunched', 'verdictBadge', 'verdict', 'keyNotes', 'priceFromGbp', 'priceSizeMl', 'pricePerMlGbp', 'imageUrl', 'scentArtUrl', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL, carrying the interactive scent wheel, drydown timeline and full descriptor profile.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'verdict': {'type': ['string', 'null'], 'description': 'The full ScentVerdict editorial verdict. Null when this row came from a source that carries no verdict.'}, 'imageUrl': {'type': ['string', 'null'], 'description': 'Bottle image URL. Null when we hold no image.'}, 'keyNotes': {'$ref': '#/properties/a/properties/keyNotes', 'items': {}, 'description': 'The most characteristic notes. May be empty.'}, 'brandSlug': {'type': 'string', 'description': 'Brand slug.'}, 'priceSizeMl': {'type': ['number', 'null'], 'description': 'Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.'}, 'scentArtUrl': {'type': ['string', 'null'], 'description': "ScentArt visual URL, generated from this fragrance's own composition. Null when not yet rendered."}, 'priceFromGbp': {'type': ['number', 'null'], 'description': 'Lowest UK price we hold for a full-size bottle, in GBP. Excludes samples and decants. Null when we hold no full-size price.'}, 'verdictBadge': {'type': ['string', 'null'], 'description': 'Editorial classification: Favourite, Statement or Acquired. Null when not yet classified.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt, Edp or Parfum. Null when unknown.'}, 'pricePerMlGbp': {'type': ['number', 'null'], 'description': 'PriceFromGbp divided by PriceSizeMl. USE THIS to compare value between fragrances, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.'}}, 'description': 'The second fragrance.'}, 'error': {'type': ['string', 'null'], 'description': 'Set when the comparison could not be completed.'}, 'onlyInA': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Notes only in the first.'}, 'onlyInB': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Notes only in the second.'}, 'notFound': {'type': ['object', 'null'], 'required': ['notFound', 'query', 'suggestions'], 'properties': {'query': {'type': 'string', 'description': 'What was asked for.'}, 'notFound': {'type': 'boolean', 'description': 'Always true. The requested fragrance is not in the catalogue.'}, 'suggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'concentration', 'yearLaunched', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt or Edp. Null when unknown.'}}}, 'description': 'Close catalogue entries the user may have meant. May be empty. Never treat these as the answer without confirming.'}}, 'description': 'Set when either fragrance is not in the catalogue.'}, 'sharedNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Notes present in both.'}, 'comparisonUrl': {'type': ['string', 'null'], 'description': 'Canonical URL of the comparison page.'}}}
find_similar_fragrances
Find Similar Fragrances
Find fragrances similar to one the user already knows, optionally steered in a direction such as cheaper, fresher, longer lasting or less sweet. Use this whenever the user names a fragrance and wants something like it: a cheaper alternative, a budget version, something that smells similar, or a gift for someone whose current fragrance they know ('he wears X, what else would suit him'). Each match carries a similarity score computed by ScentVerdict for that specific pair. The cheaper direction lists pairings ScentVerdict has curated first, then similar fragrances priced below the anchor where we hold its price. Use recommend_fragrances instead when the user names no fragrance to anchor on.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['anchorSlug'], 'properties': {'limit': {'type': 'integer', 'default': 5, 'description': 'Maximum results. Default 5, maximum 10.'}, 'direction': {'enum': ['Similar', 'Cheaper', 'Fresher', 'LongerLasting', 'MoreIntense', 'LessSweet'], 'type': 'string', 'default': 'Similar', 'description': 'How to steer results away from the anchor. Defaults to the closest overall match.'}, 'anchorSlug': {'type': 'string', 'description': 'Slug of the fragrance to anchor on. Use search_fragrances first if you do not have one.'}}}
Schéma de sortie
{'type': 'object', 'required': ['anchorSlug', 'direction', 'results', 'reason'], 'properties': {'reason': {'type': ['string', 'null'], 'description': 'Why the result set is empty. Null when results were found.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['fragrance', 'similarityScore', 'whySimilar', 'keyDifference', 'sharedNotes'], 'properties': {'fragrance': {'type': 'object', 'required': ['slug', 'name', 'brand', 'brandSlug', 'concentration', 'yearLaunched', 'verdictBadge', 'verdict', 'keyNotes', 'priceFromGbp', 'priceSizeMl', 'pricePerMlGbp', 'imageUrl', 'scentArtUrl', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL, carrying the interactive scent wheel, drydown timeline and full descriptor profile.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'verdict': {'type': ['string', 'null'], 'description': 'The full ScentVerdict editorial verdict. Null when this row came from a source that carries no verdict.'}, 'imageUrl': {'type': ['string', 'null'], 'description': 'Bottle image URL. Null when we hold no image.'}, 'keyNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The most characteristic notes. May be empty.'}, 'brandSlug': {'type': 'string', 'description': 'Brand slug.'}, 'priceSizeMl': {'type': ['number', 'null'], 'description': 'Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.'}, 'scentArtUrl': {'type': ['string', 'null'], 'description': "ScentArt visual URL, generated from this fragrance's own composition. Null when not yet rendered."}, 'priceFromGbp': {'type': ['number', 'null'], 'description': 'Lowest UK price we hold for a full-size bottle, in GBP. Excludes samples and decants. Null when we hold no full-size price.'}, 'verdictBadge': {'type': ['string', 'null'], 'description': 'Editorial classification: Favourite, Statement or Acquired. Null when not yet classified.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt, Edp or Parfum. Null when unknown.'}, 'pricePerMlGbp': {'type': ['number', 'null'], 'description': 'PriceFromGbp divided by PriceSizeMl. USE THIS to compare value between fragrances, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.'}}, 'description': 'The matched fragrance.'}, 'whySimilar': {'type': ['string', 'null'], 'description': 'What the two have in common. Null when we hold no written comparison.'}, 'sharedNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Notes present in both. May be empty.'}, 'keyDifference': {'type': ['string', 'null'], 'description': 'How the two differ. Null when we hold no written comparison.'}, 'similarityScore': {'type': ['integer', 'null'], 'description': 'Similarity score out of 100. Null when the source carries no score.'}}}, 'description': 'Ranked matches, closest first. May be empty.'}, 'notFound': {'type': ['object', 'null'], 'default': None, 'required': ['notFound', 'query', 'suggestions'], 'properties': {'query': {'type': 'string', 'description': 'What was asked for.'}, 'notFound': {'type': 'boolean', 'description': 'Always true. The requested fragrance is not in the catalogue.'}, 'suggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'concentration', 'yearLaunched', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt or Edp. Null when unknown.'}}}, 'description': 'Close catalogue entries the user may have meant. May be empty. Never treat these as the answer without confirming.'}}, 'description': 'Set when the anchor fragrance is not in the catalogue.'}, 'direction': {'type': 'string', 'description': 'How results were steered away from the anchor.'}, 'anchorSlug': {'type': 'string', 'description': 'The fragrance the results were derived from.'}}}
get_fragrance
Look Up a Fragrance
Look up one fragrance in ScentVerdict's catalogue: its notes, ScentVerdict's own verdict, concentration, launch year, and the lowest current UK price for a full-size bottle. Use this whenever the user names a fragrance and asks what it is, what it smells like, what is in it, what it costs, or whether it is any good. Use search_fragrances first if the name is partial or could mean several variants. Use get_scent_profile instead when the question is about how it develops over the wear.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The fragrance slug, for example bleu-de-chanel. Use search_fragrances if you do not have one.'}}}
Schéma de sortie
{'type': 'object', 'required': ['fragrance', 'notFound', 'error'], 'properties': {'error': {'type': ['string', 'null'], 'description': 'Set when the lookup could not be completed. Explain this rather than guessing.'}, 'notFound': {'type': ['object', 'null'], 'required': ['notFound', 'query', 'suggestions'], 'properties': {'query': {'type': 'string', 'description': 'What was asked for.'}, 'notFound': {'type': 'boolean', 'description': 'Always true. The requested fragrance is not in the catalogue.'}, 'suggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'concentration', 'yearLaunched', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt or Edp. Null when unknown.'}}}, 'description': 'Close catalogue entries the user may have meant. May be empty. Never treat these as the answer without confirming.'}}, 'description': 'Set when the fragrance is not in the catalogue. Carries suggestions.'}, 'fragrance': {'type': ['object', 'null'], 'required': ['slug', 'name', 'brand', 'brandSlug', 'concentration', 'yearLaunched', 'verdictBadge', 'verdict', 'keyNotes', 'priceFromGbp', 'priceSizeMl', 'pricePerMlGbp', 'imageUrl', 'scentArtUrl', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL, carrying the interactive scent wheel, drydown timeline and full descriptor profile.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'verdict': {'type': ['string', 'null'], 'description': 'The full ScentVerdict editorial verdict. Null when this row came from a source that carries no verdict.'}, 'imageUrl': {'type': ['string', 'null'], 'description': 'Bottle image URL. Null when we hold no image.'}, 'keyNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The most characteristic notes. May be empty.'}, 'brandSlug': {'type': 'string', 'description': 'Brand slug.'}, 'priceSizeMl': {'type': ['number', 'null'], 'description': 'Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.'}, 'scentArtUrl': {'type': ['string', 'null'], 'description': "ScentArt visual URL, generated from this fragrance's own composition. Null when not yet rendered."}, 'priceFromGbp': {'type': ['number', 'null'], 'description': 'Lowest UK price we hold for a full-size bottle, in GBP. Excludes samples and decants. Null when we hold no full-size price.'}, 'verdictBadge': {'type': ['string', 'null'], 'description': 'Editorial classification: Favourite, Statement or Acquired. Null when not yet classified.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt, Edp or Parfum. Null when unknown.'}, 'pricePerMlGbp': {'type': ['number', 'null'], 'description': 'PriceFromGbp divided by PriceSizeMl. USE THIS to compare value between fragrances, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.'}}, 'description': 'The fragrance. Null when not found or on error.'}}}
get_scent_profile
Scent Profile and Drydown
Get how a fragrance develops over the wear: opening, heart and base phases, the notes in each, and how many hours each note persists on skin. Use this when the user asks how something evolves, how long it lasts, how it changes through the day, or what the drydown is like. The per-note hours are values held by ScentVerdict against each note rather than a general impression of the fragrance, and they are estimates. Use get_fragrance instead for the verdict, price and general description.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The fragrance slug. Use search_fragrances if you do not have one.'}}}
Schéma de sortie
{'type': 'object', 'required': ['name', 'slug', 'phases', 'longestLastingNoteHours', 'url', 'notFound', 'error'], 'properties': {'url': {'type': ['string', 'null'], 'description': 'Canonical page URL, carrying the scent wheel and drydown timeline.'}, 'name': {'type': ['string', 'null'], 'description': 'Fragrance name.'}, 'slug': {'type': ['string', 'null'], 'description': 'Stable identifier.'}, 'error': {'type': ['string', 'null'], 'description': 'Set when the profile could not be read.'}, 'phases': {'type': 'array', 'items': {'type': 'object', 'required': ['phase', 'notes'], 'properties': {'notes': {'type': 'array', 'items': {'type': 'object', 'required': ['note', 'slug', 'family', 'substantivityHours', 'volatilityClass'], 'properties': {'note': {'type': 'string', 'description': 'Note name.'}, 'slug': {'type': 'string', 'description': 'Note slug.'}, 'family': {'type': ['string', 'null'], 'description': 'Olfactory family. Null when unclassified.'}, 'volatilityClass': {'type': ['string', 'null'], 'description': 'Intrinsic volatility class. Null when unknown.'}, 'substantivityHours': {'type': ['number', 'null'], 'description': 'Expected hours on skin. Null when unknown.'}}}, 'description': 'Notes in this phase, heaviest first.'}, 'phase': {'type': 'string', 'description': 'Phase name: top, heart, base, or unspecified.'}}}, 'description': 'Notes grouped by phase: top, heart, base.'}, 'notFound': {'type': ['object', 'null'], 'required': ['notFound', 'query', 'suggestions'], 'properties': {'query': {'type': 'string', 'description': 'What was asked for.'}, 'notFound': {'type': 'boolean', 'description': 'Always true. The requested fragrance is not in the catalogue.'}, 'suggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'concentration', 'yearLaunched', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt or Edp. Null when unknown.'}}}, 'description': 'Close catalogue entries the user may have meant. May be empty. Never treat these as the answer without confirming.'}}, 'description': 'Set when the fragrance is not in the catalogue.'}, 'longestLastingNoteHours': {'type': ['number', 'null'], 'description': 'Hours the longest-lasting note persists. Null when unknown.'}}}
recommend_fragrances
Recommend Fragrances
Recommend fragrances matching what the user describes: season, occasion, budget, strength, staying power and notes they like. Use this when the user wants a suggestion but names no fragrance to work from - for example something for winter, for the office, or under a budget. Season, occasion and intensity are scored numerically per fragrance in ScentVerdict, and the budget is applied against current UK bottle prices we hold, so the constraints are filtered rather than approximated. Each priced row carries its price, and the bottle size and price per millilitre wherever the retailer published a size. Pass as many of the constraints as the user gave; all are optional. Use find_similar_fragrances instead when they name a fragrance to anchor on.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 5, 'description': 'Maximum results. Default 5, maximum 10.'}, 'season': {'enum': ['Spring', 'Summer', 'Autumn', 'Winter', None], 'type': ['string', 'null'], 'default': None, 'description': 'Season the fragrance is for.'}, 'occasion': {'enum': ['Office', 'Date', 'Casual', 'Formal', 'Sport', None], 'type': ['string', 'null'], 'default': None, 'description': 'Occasion the fragrance is for.'}, 'intensity': {'enum': ['Sheer', 'Light', 'Moderate', 'Strong', 'Potent', None], 'type': ['string', 'null'], 'default': None, 'description': 'How strong the fragrance should be.'}, 'noteLoved': {'type': ['string', 'null'], 'default': None, 'description': 'A single note the user likes, for example vanilla.'}, 'budgetMaxGbp': {'type': ['number', 'null'], 'default': None, 'description': 'Maximum price in GBP for a full-size bottle.'}, 'longevityMin': {'enum': ['Fleeting', 'Short', 'Moderate', 'Long', 'Beast', None], 'type': ['string', 'null'], 'default': None, 'description': 'Minimum staying power.'}, 'genderPresentation': {'enum': ['Masculine', 'Feminine', 'Unisex', None], 'type': ['string', 'null'], 'default': None, 'description': 'Who the fragrance presents as.'}}}
Schéma de sortie
{'type': 'object', 'required': ['results', 'caveat'], 'properties': {'caveat': {'type': ['string', 'null'], 'description': 'Caveat about how the constraints were applied. Null when there is nothing to qualify.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'brandSlug', 'concentration', 'yearLaunched', 'verdictBadge', 'verdict', 'keyNotes', 'priceFromGbp', 'priceSizeMl', 'pricePerMlGbp', 'imageUrl', 'scentArtUrl', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL, carrying the interactive scent wheel, drydown timeline and full descriptor profile.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'verdict': {'type': ['string', 'null'], 'description': 'The full ScentVerdict editorial verdict. Null when this row came from a source that carries no verdict.'}, 'imageUrl': {'type': ['string', 'null'], 'description': 'Bottle image URL. Null when we hold no image.'}, 'keyNotes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The most characteristic notes. May be empty.'}, 'brandSlug': {'type': 'string', 'description': 'Brand slug.'}, 'priceSizeMl': {'type': ['number', 'null'], 'description': 'Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.'}, 'scentArtUrl': {'type': ['string', 'null'], 'description': "ScentArt visual URL, generated from this fragrance's own composition. Null when not yet rendered."}, 'priceFromGbp': {'type': ['number', 'null'], 'description': 'Lowest UK price we hold for a full-size bottle, in GBP. Excludes samples and decants. Null when we hold no full-size price.'}, 'verdictBadge': {'type': ['string', 'null'], 'description': 'Editorial classification: Favourite, Statement or Acquired. Null when not yet classified.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt, Edp or Parfum. Null when unknown.'}, 'pricePerMlGbp': {'type': ['number', 'null'], 'description': 'PriceFromGbp divided by PriceSizeMl. USE THIS to compare value between fragrances, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.'}}}, 'description': 'Matching fragrances. May be empty when the constraints are too narrow.'}}}
search_fragrances
Search Fragrances by Name
Resolve a fragrance name to catalogue entries. Call this FIRST whenever a name is partial, misspelled, or could mean more than one product, then pass the returned slug to another tool. Many fragrances share a name across concentrations and launch years, and flankers hide behind qualifiers, so guessing the variant silently produces the wrong answer for the rest of the conversation. Results carry concentration and launch year precisely so you can tell them apart, and you should offer the user the choice when several match. Use get_fragrance instead when you already hold an exact slug.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 8, 'description': 'Maximum results. Default 8, maximum 20.'}, 'query': {'type': 'string', 'description': 'Name or partial name to look up. Minimum 2 characters.'}}}
Schéma de sortie
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'brand', 'concentration', 'yearLaunched', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL.'}, 'name': {'type': 'string', 'description': 'Fragrance name without the brand.'}, 'slug': {'type': 'string', 'description': 'Stable identifier. Pass this to other tools.'}, 'brand': {'type': 'string', 'description': 'Brand name.'}, 'yearLaunched': {'type': ['integer', 'null'], 'description': 'Year first launched. Null when unknown.'}, 'concentration': {'type': ['string', 'null'], 'description': 'Concentration, for example Edt or Edp. Null when unknown.'}}}}}}
Modifié
get_fragrance
25 September 2026 02:49
Modifié
recommend_fragrances
25 September 2026 02:49
Modifié
compare_fragrances
25 September 2026 02:49
Modifié
find_similar_fragrances
25 September 2026 02:49
Ajouté
get_fragrance
23 September 2026 02:40
Ajouté
recommend_fragrances
23 September 2026 02:40
Ajouté
compare_fragrances
23 September 2026 02:40
Ajouté
find_similar_fragrances
23 September 2026 02:40
Ajouté
search_fragrances
23 September 2026 02:40
Ajouté
get_scent_profile
23 September 2026 02:40