ScentVerdict
Server Details
Fragrance catalogue with verdicts, similarity scores, scent profiles, drydowns and local prices.
- Status
- Healthy
- Uptime
- 99.8% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose and the descriptions explicitly cross-reference each other to prevent misselection (e.g., compare vs find_similar, get_fragrance vs get_scent_profile, recommend vs find_similar). The boundaries between head-to-head comparison, similarity search, and unanchored recommendation are well-drawn.
All six tools follow a consistent snake_case verb_noun pattern: compare_fragrances, find_similar_fragrances, get_fragrance, get_scent_profile, recommend_fragrances, search_fragrances. No mixing of conventions or vague verbs.
Six tools is well-scoped for a fragrance recommendation service, with each tool earning its place by covering a distinct user intent (resolve, look up, profile, compare, find similar, recommend). No redundancy or filler.
The surface covers the core read-only lifecycle: name resolution, single lookup, development profile, pairwise comparison, similarity alternatives, and constraint-based recommendation. Minor gaps exist (no browse/list-all or user-review access), but agents can work around these for the stated purpose.
Available Tools
6 toolscompare_fragrancesCompare Two FragrancesARead-onlyIdempotentInspect
Compare exactly two fragrances side by side using ScentVerdict's own note data: which notes they share, which differ, both verdicts, and both prices for the user's country. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| slugA | Yes | Slug of the first fragrance. | |
| slugB | Yes | Slug of the second fragrance. | |
| country | No | The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB. |
Output Schema
| Name | Required | Description |
|---|---|---|
| a | Yes | The first fragrance. |
| b | Yes | The second fragrance. |
| error | Yes | Set when the comparison could not be completed. |
| market | No | The country the prices in this result are for, its currency, and how it was chosen. |
| onlyInA | Yes | Notes only in the first. |
| onlyInB | Yes | Notes only in the second. |
| notFound | Yes | Set when either fragrance is not in the catalogue. |
| sharedNotes | Yes | Notes present in both. |
| comparisonUrl | Yes | Canonical URL of the comparison page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds useful context beyond them: the comparison uses ScentVerdict's own note data and prices are scoped to the user's country. It doesn't disclose failure modes (e.g., what happens with an unknown slug), so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool returns and followed by when-to-use and the sibling alternative. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no further explanation, and the description still briefly summarizes them. With annotations covering safety and full schema coverage, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so slugA, slugB and country are already fully documented in the schema. The description reinforces the country-scoped pricing and the 'exactly two' cardinality but adds no syntax or format detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (exactly two fragrances) and enumerates the outputs: shared notes, differing notes, both verdicts, both prices. An agent can distinguish this from find_similar_fragrances without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger scenarios (user choosing between two named fragrances, asking which is better, how two differ) and names the alternative sibling find_similar_fragrances with the condition that selects it (wanting alternatives to one fragrance rather than a head-to-head).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_similar_fragrancesFind Similar FragrancesARead-onlyIdempotentInspect
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. Each match carries its bottle price for the user's country, in the shop's own currency. Use recommend_fragrances instead when the user names no fragrance to anchor on.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results. Default 5, maximum 10. | |
| country | No | The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB. | |
| direction | No | How to steer results away from the anchor. Defaults to the closest overall match. | Similar |
| anchorSlug | Yes | Slug of the fragrance to anchor on. Use search_fragrances first if you do not have one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| market | No | The country the prices in this result are for, its currency, and how it was chosen. |
| reason | Yes | Why the result set is empty. Null when results were found. |
| results | Yes | Ranked matches, closest first. May be empty. |
| notFound | No | Set when the anchor fragrance is not in the catalogue. |
| direction | Yes | How results were steered away from the anchor. |
| anchorSlug | Yes | The fragrance the results were derived from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real behavioral context beyond that: each match carries a per-pair similarity score computed by ScentVerdict, the Cheaper direction ranks curated pairings first and then sub-anchor-price results, and prices are returned in the shop's own currency for the user's country.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is longer than most definitions, but front-loaded with purpose followed by usage, behavior and the exclusion rule. Most sentences earn their place; the closing price-currency sentence and the curated-pairings sentence add detail that could be tightened but is genuinely useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, full schema coverage and an output schema that covers return values, the description supplies everything else an agent needs: when to call it, how `direction` behaves, what impacts price output, and which sibling to use instead. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3. The description goes further by explaining the semantics of `direction` (how results are steered away from the anchor, with concrete directions like cheaper/fresher/longer lasting) and what `country` affects (pricing in the shop's currency), adding meaning beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find fragrances similar to one the user already knows') and explicitly differentiates itself from the sibling recommend_fragrances. An agent can tell it apart from search_fragrances and recommend_fragrances without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use scenarios (cheaper alternative, budget version, gift for someone whose fragrance is known) and names the exclusion condition: use recommend_fragrances when the user names no anchor. This is explicit routing rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fragranceLook Up a FragranceARead-onlyIdempotentInspect
Look up one fragrance in ScentVerdict's catalogue: its notes, ScentVerdict's own verdict, concentration, launch year, and the lowest current price for a full-size bottle for the user's country, in the shop's own currency. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The fragrance slug, for example bleu-de-chanel. Use search_fragrances if you do not have one. | |
| country | No | The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | Yes | Set when the lookup could not be completed. Explain this rather than guessing. |
| market | No | The country the prices in this result are for, its currency, and how it was chosen. |
| notFound | Yes | Set when the fragrance is not in the catalogue. Carries suggestions. |
| fragrance | Yes | The fragrance. Null when not found or on error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context: the price is the lowest current price for a full-size bottle, tied to the user's country and expressed in the shop's own currency, which is not derivable from annotations or schema. It omits things like rate limits or auth requirements, so it is not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and returned fields, then routes to alternatives in two tight sentences. Every sentence carries distinct information: what it returns, when to use it, and which sibling to prefer in edge cases. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description still summarizes the payload. Given two well-documented parameters, a clear read-only annotation profile, and explicit sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful semantics beyond the schema: it clarifies that the returned price corresponds to the user's country and is denominated in the shop's own currency, reinforcing why 'country' matters. It does not add format detail for 'slug' beyond the schema's example, so it stops short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up one fragrance in ScentVerdict's catalogue') and enumerates exactly what is returned: notes, verdict, concentration, launch year, and lowest country-specific price. This makes it instantly distinguishable from siblings like get_scent_profile and search_fragrances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ('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') and names two alternative tools with the conditions that select them ('use search_fragrances first if the name is partial'; 'use get_scent_profile instead when the question is about how it develops over the wear'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scent_profileScent Profile and DrydownARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The fragrance slug. Use search_fragrances if you do not have one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Canonical page URL, carrying the scent wheel and drydown timeline. |
| name | Yes | Fragrance name. |
| slug | Yes | Stable identifier. |
| error | Yes | Set when the profile could not be read. |
| phases | Yes | Notes grouped by phase: top, heart, base. |
| notFound | Yes | Set when the fragrance is not in the catalogue. |
| longestLastingNoteHours | Yes | Hours the longest-lasting note persists. Null when unknown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable context beyond that: the per-note hours are data held by ScentVerdict rather than a general impression, and they are estimates. This caveat helps the agent set expectations about data provenance and reliability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines the tool's behavior, the second gives usage triggers, and the third both qualifies the data and redirects to an alternative. There is no fluff or redundancy, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, a clear output schema, and comprehensive annotations, the description covers all needed behavioral caveats (estimates, data source) and usage routing. The agent can invoke the tool correctly without further clarification. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the only parameter, slug, is already documented with 'Use search_fragrances if you do not have one.' The description does not add parameter detail beyond the schema, so the baseline of 3 applies. There is no gap for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: '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.' It clearly differentiates from get_fragrance by naming what that sibling covers instead. This leaves no ambiguity about the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: '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.' It also provides an explicit alternative: 'Use get_fragrance instead for the verdict, price and general description.' This fully covers routing between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_fragrancesRecommend FragrancesARead-onlyIdempotentInspect
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 bottle prices for the user's country, so the constraints are filtered rather than approximated. Each priced row carries its price in the shop's own currency, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results. Default 5, maximum 10. | |
| season | No | Season the fragrance is for. | |
| country | No | The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB. | |
| occasion | No | Occasion the fragrance is for. | |
| budgetMax | No | Maximum price for a full-size bottle, in the currency of the user's country (USD for US, EUR for DE, GBP for GB). Only prices in that currency are filtered. | |
| intensity | No | How strong the fragrance should be. | |
| noteLoved | No | A single note the user likes, for example vanilla. | |
| longevityMin | No | Minimum staying power. | |
| genderPresentation | No | Who the fragrance presents as. |
Output Schema
| Name | Required | Description |
|---|---|---|
| caveat | Yes | Caveat about how the constraints were applied. Null when there is nothing to qualify. |
| market | No | The country the prices in this result are for, its currency, and how it was chosen. |
| results | Yes | Matching fragrances. May be empty when the constraints are too narrow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety needs no repeating. The description adds real mechanism not present in structured fields: season/occasion/intensity are scored numerically in ScentVerdict, budget is applied against current country-specific bottle prices, and constraints are filtered rather than approximated. It stops short of describing ranking or pagination behaviour.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly: purpose first, then when to use, then mechanics, then the sibling redirect. All sentences carry information, though the price-per-millilitre and retailer-size detail slightly duplicates what the output schema would return.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-required tool with an output schema present, the description covers the routing decision, the optionality of all constraints, and how the pricing/season filtering actually works. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by stressing that every constraint is optional and that as many as the user provided should be passed, and by clarifying that the budget is matched against live bottle prices in the user's own currency rather than a converted figure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (recommend) and resource (fragrances) plus the exact inputs it matches on: season, occasion, budget, strength, staying power and notes. It explicitly distinguishes itself from find_similar_fragrances, so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the triggering condition plainly ('when the user wants a suggestion but names no fragrance to work from'), gives concrete examples (winter, office, under a budget), and names the alternative tool with the condition that selects it ('use find_similar_fragrances instead when they name a fragrance to anchor on').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_fragrancesSearch Fragrances by NameARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results. Default 8, maximum 20. | |
| query | Yes | Name or partial name to look up. Minimum 2 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses key behaviors: results carry concentration and launch year so variants can be distinguished, multiple matches are possible due to shared names, and the agent should offer the user a choice when several match. It also warns about the consequence of guessing the wrong variant, giving the agent critical behavioral context the annotations do 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long, yet every sentence carries operational weight: purpose, when to call, why ambiguity matters, what results contain, and the alternative. It is front-loaded with the core directive and uses the rest to justify the usage without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and rich schema/annotations, the description is complete: it explains preconditions, expected results, how to handle multiple matches, and when to delegate to a sibling tool. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3, but the description enriches the 'query' parameter by clarifying it accepts partial or misspelled names and that ambiguity is expected. This adds meaning beyond the schema's 'Name or partial name to look up', though it does not add anything significant about the 'limit' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Resolve a fragrance name to catalogue entries', a specific verb and resource that clearly states the tool's purpose. It also distinguishes itself from get_fragrance by explicitly explaining when each should be used, leaving no ambiguity about what this tool does relative to its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this FIRST whenever a name is partial, misspelled, or could mean more than one product'. It also provides an exclusion: 'Use get_fragrance instead when you already hold an exact slug', which directly addresses the alternative tool and the condition that selects it.
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.
4 tool updates
- Changed
compare_fragrances12 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": null, + "description": "The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / a / properties / priceAdded value: +{ + "description": "Cheapest full-size bottle for the user's country, in the shop's own currency. Excludes samples and decants. Null when we hold no bottle price a shop will sell to that country.", + "properties": { + "amount": { + "description": "The bottle price, in Currency. This is the shop's own price, never a conversion.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 currency code of Amount, for example GBP, USD or EUR. The shop's own currency.", + "type": "string" + }, + "estimate": { + "description": "Rough value of Amount in the user's currency, at a published reference rate. Present only when Currency differs from the user's currency and a recent rate exists. For orientation only: never use it to rank, compare or filter prices.", + "properties": { + "amount": { + "description": "The price converted to Currency, in whole units. Approximate.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 code of the user's currency.", + "type": "string" + }, + "rateDate": { + "description": "Date of the reference rate used, as YYYY-MM-DD. The European Central Bank's rate, or Frankfurter's for a currency the ECB does not publish.", + "type": "string" + } + }, + "required": [ + "amount", + "currency", + "rateDate" + ], + "type": [ + "object", + "null" + ] + }, + "excludesTax": { + "description": "True when the shop quotes this price before sales tax, as US shops do. Say so when you quote it.", + "type": "boolean" + }, + "fromAbroad": { + "description": "True when no shop in the user's own customs area sells a bottle, so this is the cheapest bottle from a shop in another country that delivers to them.", + "type": "boolean" + }, + "importChargesMayApply": { + "description": "True when the user may have to pay import charges on top of Amount. Say 'import charges may apply' when you quote it.", + "type": "boolean" + }, + "pricePerMl": { + "description": "Amount divided by SizeMl, in Currency. USE THIS to compare value between fragrances priced in the same currency, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.", + "type": [ + "number", + "null" + ] + }, + "shipsFrom": { + "description": "ISO 3166-1 alpha-2 country the shop sells from, for example GB or US.", + "type": "string" + }, + "sizeMl": { + "description": "Bottle size in millilitres that Amount applies to. 0 means the shop did not state a size.", + "type": "number" + } + }, + "required": [ + "amount", + "currency", + "sizeMl", + "pricePerMl", + "excludesTax", + "fromAbroad", + "shipsFrom", + "importChargesMayApply", + "estimate" + ], + "type": [ + "object", + "null" + ] +} - removed
Output schema / properties / a / properties / priceFromGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / a / properties / pricePerMlGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / a / properties / priceSizeMlRemoved value: -{ - "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.", - "type": [ - "number", - "null" - ] -} - changed
Output schema / properties / a / requiredPrevious value: -[ - "slug", - "name", - "brand", - "brandSlug", - "concentration", - "yearLaunched", - "verdictBadge", - "verdict", - "keyNotes", - "priceFromGbp", - "priceSizeMl", - "pricePerMlGbp", - "imageUrl", - "scentArtUrl", - "url" -]New value: +[ + "slug", + "name", + "brand", + "brandSlug", + "concentration", + "yearLaunched", + "verdictBadge", + "verdict", + "keyNotes", + "price", + "imageUrl", + "scentArtUrl", + "url" +] - added
Output schema / properties / b / properties / priceAdded value: +{ + "$ref": "#/properties/a/properties/price", + "description": "Cheapest full-size bottle for the user's country, in the shop's own currency. Excludes samples and decants. Null when we hold no bottle price a shop will sell to that country." +} - removed
Output schema / properties / b / properties / priceFromGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / b / properties / pricePerMlGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / b / properties / priceSizeMlRemoved value: -{ - "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.", - "type": [ - "number", - "null" - ] -} - changed
Output schema / properties / b / requiredPrevious value: -[ - "slug", - "name", - "brand", - "brandSlug", - "concentration", - "yearLaunched", - "verdictBadge", - "verdict", - "keyNotes", - "priceFromGbp", - "priceSizeMl", - "pricePerMlGbp", - "imageUrl", - "scentArtUrl", - "url" -]New value: +[ + "slug", + "name", + "brand", + "brandSlug", + "concentration", + "yearLaunched", + "verdictBadge", + "verdict", + "keyNotes", + "price", + "imageUrl", + "scentArtUrl", + "url" +] - added
Output schema / properties / marketAdded value: +{ + "default": null, + "description": "The country the prices in this result are for, its currency, and how it was chosen.", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country the prices are for, for example GB, US or DE.", + "type": "string" + }, + "countryName": { + "description": "The country's name in English.", + "type": "string" + }, + "currency": { + "description": "ISO 4217 code of that country's currency. Budgets are read in this currency.", + "type": "string" + }, + "source": { + "description": "How the country was chosen: 'argument' (the country you passed), 'clientHint' (the client's location hint), or 'default' (GB, used when neither was given - ask the user for their country if it matters).", + "type": "string" + } + }, + "required": [ + "country", + "countryName", + "currency", + "source" + ], + "type": [ + "object", + "null" + ] +}
- Changed
find_similar_fragrances7 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": null, + "description": "The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / marketAdded value: +{ + "default": null, + "description": "The country the prices in this result are for, its currency, and how it was chosen.", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country the prices are for, for example GB, US or DE.", + "type": "string" + }, + "countryName": { + "description": "The country's name in English.", + "type": "string" + }, + "currency": { + "description": "ISO 4217 code of that country's currency. Budgets are read in this currency.", + "type": "string" + }, + "source": { + "description": "How the country was chosen: 'argument' (the country you passed), 'clientHint' (the client's location hint), or 'default' (GB, used when neither was given - ask the user for their country if it matters).", + "type": "string" + } + }, + "required": [ + "country", + "countryName", + "currency", + "source" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / results / items / properties / fragrance / properties / priceAdded value: +{ + "description": "Cheapest full-size bottle for the user's country, in the shop's own currency. Excludes samples and decants. Null when we hold no bottle price a shop will sell to that country.", + "properties": { + "amount": { + "description": "The bottle price, in Currency. This is the shop's own price, never a conversion.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 currency code of Amount, for example GBP, USD or EUR. The shop's own currency.", + "type": "string" + }, + "estimate": { + "description": "Rough value of Amount in the user's currency, at a published reference rate. Present only when Currency differs from the user's currency and a recent rate exists. For orientation only: never use it to rank, compare or filter prices.", + "properties": { + "amount": { + "description": "The price converted to Currency, in whole units. Approximate.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 code of the user's currency.", + "type": "string" + }, + "rateDate": { + "description": "Date of the reference rate used, as YYYY-MM-DD. The European Central Bank's rate, or Frankfurter's for a currency the ECB does not publish.", + "type": "string" + } + }, + "required": [ + "amount", + "currency", + "rateDate" + ], + "type": [ + "object", + "null" + ] + }, + "excludesTax": { + "description": "True when the shop quotes this price before sales tax, as US shops do. Say so when you quote it.", + "type": "boolean" + }, + "fromAbroad": { + "description": "True when no shop in the user's own customs area sells a bottle, so this is the cheapest bottle from a shop in another country that delivers to them.", + "type": "boolean" + }, + "importChargesMayApply": { + "description": "True when the user may have to pay import charges on top of Amount. Say 'import charges may apply' when you quote it.", + "type": "boolean" + }, + "pricePerMl": { + "description": "Amount divided by SizeMl, in Currency. USE THIS to compare value between fragrances priced in the same currency, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.", + "type": [ + "number", + "null" + ] + }, + "shipsFrom": { + "description": "ISO 3166-1 alpha-2 country the shop sells from, for example GB or US.", + "type": "string" + }, + "sizeMl": { + "description": "Bottle size in millilitres that Amount applies to. 0 means the shop did not state a size.", + "type": "number" + } + }, + "required": [ + "amount", + "currency", + "sizeMl", + "pricePerMl", + "excludesTax", + "fromAbroad", + "shipsFrom", + "importChargesMayApply", + "estimate" + ], + "type": [ + "object", + "null" + ] +} - removed
Output schema / properties / results / items / properties / fragrance / properties / priceFromGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / results / items / properties / fragrance / properties / pricePerMlGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / results / items / properties / fragrance / properties / priceSizeMlRemoved value: -{ - "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.", - "type": [ - "number", - "null" - ] -} - changed
Output schema / properties / results / items / properties / fragrance / requiredPrevious value: -[ - "slug", - "name", - "brand", - "brandSlug", - "concentration", - "yearLaunched", - "verdictBadge", - "verdict", - "keyNotes", - "priceFromGbp", - "priceSizeMl", - "pricePerMlGbp", - "imageUrl", - "scentArtUrl", - "url" -]New value: +[ + "slug", + "name", + "brand", + "brandSlug", + "concentration", + "yearLaunched", + "verdictBadge", + "verdict", + "keyNotes", + "price", + "imageUrl", + "scentArtUrl", + "url" +]
- Changed
get_fragrance7 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": null, + "description": "The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / fragrance / properties / priceAdded value: +{ + "description": "Cheapest full-size bottle for the user's country, in the shop's own currency. Excludes samples and decants. Null when we hold no bottle price a shop will sell to that country.", + "properties": { + "amount": { + "description": "The bottle price, in Currency. This is the shop's own price, never a conversion.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 currency code of Amount, for example GBP, USD or EUR. The shop's own currency.", + "type": "string" + }, + "estimate": { + "description": "Rough value of Amount in the user's currency, at a published reference rate. Present only when Currency differs from the user's currency and a recent rate exists. For orientation only: never use it to rank, compare or filter prices.", + "properties": { + "amount": { + "description": "The price converted to Currency, in whole units. Approximate.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 code of the user's currency.", + "type": "string" + }, + "rateDate": { + "description": "Date of the reference rate used, as YYYY-MM-DD. The European Central Bank's rate, or Frankfurter's for a currency the ECB does not publish.", + "type": "string" + } + }, + "required": [ + "amount", + "currency", + "rateDate" + ], + "type": [ + "object", + "null" + ] + }, + "excludesTax": { + "description": "True when the shop quotes this price before sales tax, as US shops do. Say so when you quote it.", + "type": "boolean" + }, + "fromAbroad": { + "description": "True when no shop in the user's own customs area sells a bottle, so this is the cheapest bottle from a shop in another country that delivers to them.", + "type": "boolean" + }, + "importChargesMayApply": { + "description": "True when the user may have to pay import charges on top of Amount. Say 'import charges may apply' when you quote it.", + "type": "boolean" + }, + "pricePerMl": { + "description": "Amount divided by SizeMl, in Currency. USE THIS to compare value between fragrances priced in the same currency, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.", + "type": [ + "number", + "null" + ] + }, + "shipsFrom": { + "description": "ISO 3166-1 alpha-2 country the shop sells from, for example GB or US.", + "type": "string" + }, + "sizeMl": { + "description": "Bottle size in millilitres that Amount applies to. 0 means the shop did not state a size.", + "type": "number" + } + }, + "required": [ + "amount", + "currency", + "sizeMl", + "pricePerMl", + "excludesTax", + "fromAbroad", + "shipsFrom", + "importChargesMayApply", + "estimate" + ], + "type": [ + "object", + "null" + ] +} - removed
Output schema / properties / fragrance / properties / priceFromGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / fragrance / properties / pricePerMlGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / fragrance / properties / priceSizeMlRemoved value: -{ - "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.", - "type": [ - "number", - "null" - ] -} - changed
Output schema / properties / fragrance / requiredPrevious value: -[ - "slug", - "name", - "brand", - "brandSlug", - "concentration", - "yearLaunched", - "verdictBadge", - "verdict", - "keyNotes", - "priceFromGbp", - "priceSizeMl", - "pricePerMlGbp", - "imageUrl", - "scentArtUrl", - "url" -]New value: +[ + "slug", + "name", + "brand", + "brandSlug", + "concentration", + "yearLaunched", + "verdictBadge", + "verdict", + "keyNotes", + "price", + "imageUrl", + "scentArtUrl", + "url" +] - added
Output schema / properties / marketAdded value: +{ + "default": null, + "description": "The country the prices in this result are for, its currency, and how it was chosen.", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country the prices are for, for example GB, US or DE.", + "type": "string" + }, + "countryName": { + "description": "The country's name in English.", + "type": "string" + }, + "currency": { + "description": "ISO 4217 code of that country's currency. Budgets are read in this currency.", + "type": "string" + }, + "source": { + "description": "How the country was chosen: 'argument' (the country you passed), 'clientHint' (the client's location hint), or 'default' (GB, used when neither was given - ask the user for their country if it matters).", + "type": "string" + } + }, + "required": [ + "country", + "countryName", + "currency", + "source" + ], + "type": [ + "object", + "null" + ] +}
- Changed
recommend_fragrances9 fields changed- added
Input schema / properties / budgetMaxAdded value: +{ + "default": null, + "description": "Maximum price for a full-size bottle, in the currency of the user's country (USD for US, EUR for DE, GBP for GB). Only prices in that currency are filtered.", + "type": [ + "number", + "null" + ] +} - removed
Input schema / properties / budgetMaxGbpRemoved value: -{ - "default": null, - "description": "Maximum price in GBP for a full-size bottle.", - "type": [ - "number", - "null" - ] -} - added
Input schema / properties / countryAdded value: +{ + "default": null, + "description": "The user's country as an ISO 3166-1 alpha-2 code, for example US, DE or GB. Prices are for this country, in the shop's own currency. Pass it whenever you know where the user is. When omitted, the client's location hint is used if it sent one, otherwise GB.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / marketAdded value: +{ + "default": null, + "description": "The country the prices in this result are for, its currency, and how it was chosen.", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country the prices are for, for example GB, US or DE.", + "type": "string" + }, + "countryName": { + "description": "The country's name in English.", + "type": "string" + }, + "currency": { + "description": "ISO 4217 code of that country's currency. Budgets are read in this currency.", + "type": "string" + }, + "source": { + "description": "How the country was chosen: 'argument' (the country you passed), 'clientHint' (the client's location hint), or 'default' (GB, used when neither was given - ask the user for their country if it matters).", + "type": "string" + } + }, + "required": [ + "country", + "countryName", + "currency", + "source" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / results / items / properties / priceAdded value: +{ + "description": "Cheapest full-size bottle for the user's country, in the shop's own currency. Excludes samples and decants. Null when we hold no bottle price a shop will sell to that country.", + "properties": { + "amount": { + "description": "The bottle price, in Currency. This is the shop's own price, never a conversion.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 currency code of Amount, for example GBP, USD or EUR. The shop's own currency.", + "type": "string" + }, + "estimate": { + "description": "Rough value of Amount in the user's currency, at a published reference rate. Present only when Currency differs from the user's currency and a recent rate exists. For orientation only: never use it to rank, compare or filter prices.", + "properties": { + "amount": { + "description": "The price converted to Currency, in whole units. Approximate.", + "type": "number" + }, + "currency": { + "description": "ISO 4217 code of the user's currency.", + "type": "string" + }, + "rateDate": { + "description": "Date of the reference rate used, as YYYY-MM-DD. The European Central Bank's rate, or Frankfurter's for a currency the ECB does not publish.", + "type": "string" + } + }, + "required": [ + "amount", + "currency", + "rateDate" + ], + "type": [ + "object", + "null" + ] + }, + "excludesTax": { + "description": "True when the shop quotes this price before sales tax, as US shops do. Say so when you quote it.", + "type": "boolean" + }, + "fromAbroad": { + "description": "True when no shop in the user's own customs area sells a bottle, so this is the cheapest bottle from a shop in another country that delivers to them.", + "type": "boolean" + }, + "importChargesMayApply": { + "description": "True when the user may have to pay import charges on top of Amount. Say 'import charges may apply' when you quote it.", + "type": "boolean" + }, + "pricePerMl": { + "description": "Amount divided by SizeMl, in Currency. USE THIS to compare value between fragrances priced in the same currency, never the bottle price - a small bottle can look cheap while costing far more per millilitre. Null when the size is unknown.", + "type": [ + "number", + "null" + ] + }, + "shipsFrom": { + "description": "ISO 3166-1 alpha-2 country the shop sells from, for example GB or US.", + "type": "string" + }, + "sizeMl": { + "description": "Bottle size in millilitres that Amount applies to. 0 means the shop did not state a size.", + "type": "number" + } + }, + "required": [ + "amount", + "currency", + "sizeMl", + "pricePerMl", + "excludesTax", + "fromAbroad", + "shipsFrom", + "importChargesMayApply", + "estimate" + ], + "type": [ + "object", + "null" + ] +} - removed
Output schema / properties / results / items / properties / priceFromGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / results / items / properties / pricePerMlGbpRemoved value: -{ - "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.", - "type": [ - "number", - "null" - ] -} - removed
Output schema / properties / results / items / properties / priceSizeMlRemoved value: -{ - "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.", - "type": [ - "number", - "null" - ] -} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "slug", - "name", - "brand", - "brandSlug", - "concentration", - "yearLaunched", - "verdictBadge", - "verdict", - "keyNotes", - "priceFromGbp", - "priceSizeMl", - "pricePerMlGbp", - "imageUrl", - "scentArtUrl", - "url" -]New value: +[ + "slug", + "name", + "brand", + "brandSlug", + "concentration", + "yearLaunched", + "verdictBadge", + "verdict", + "keyNotes", + "price", + "imageUrl", + "scentArtUrl", + "url" +]
6 tool updates
- First observed
compare_fragrances - First observed
find_similar_fragrances - First observed
get_fragrance - First observed
get_scent_profile - First observed
recommend_fragrances - First observed
search_fragrances
Related MCP Connectors
Fragrance encyclopedia: note pyramids, accords, perfumers and dupes (parfica.com).
Search the Perfume Picks fragrance database: 13,000+ scents with notes, dupes, and wear data.
Fragrance & perfume MCP: search fragrances, notes, accords, brands, perfumers, reviews & charts.
Mechanic-grade used-car listing verdicts: risk score, failure points, repair costs, fair price.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceProvides cited product-review verdicts synthesised from real user voices across multiple platforms, enabling AI agents to query live opinions with ratings, pros/cons, and confidence tiers.-
- FlicenseNot gradedqualityBmaintenanceEnables users to compare and get recommendations across multiple supermarket products, combining curated specifications with realtime price and review lookups.-
- FlicenseNot gradedqualityBmaintenanceEnables searching and comparing product prices across major Indian quick-commerce and e-commerce platforms, ranking results by landed price, returning product links, storing price history, and providing 15–30 day price direction forecasts with best-buy recommendations.-
- AlicenseAqualityCmaintenanceProvides current, human-verified pricing for 100+ AI tools and calculates AI product margins (MRR after costs). Fetches live price index and runs locally.240 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.