Skip to main content
Glama

Compare Two Fragrances

compare_fragrances
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugAYesSlug of the first fragrance.
slugBYesSlug of the second fragrance.
countryNoThe 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

TableJSON Schema
NameRequiredDescriptionDefault
aYesThe first fragrance.
bYesThe second fragrance.
errorYesSet when the comparison could not be completed.
marketNoThe country the prices in this result are for, its currency, and how it was chosen.
onlyInAYesNotes only in the first.
onlyInBYesNotes only in the second.
notFoundYesSet when either fragrance is not in the catalogue.
sharedNotesYesNotes present in both.
comparisonUrlYesCanonical URL of the comparison page.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • addedInput schema / properties / country
      Added 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"
      +  ]
      +}
    • addedOutput schema / properties / a / properties / price
      Added 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"
      +  ]
      +}
    • removedOutput schema / properties / a / properties / priceFromGbp
      Removed 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"
      -  ]
      -}
    • removedOutput schema / properties / a / properties / pricePerMlGbp
      Removed 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"
      -  ]
      -}
    • removedOutput schema / properties / a / properties / priceSizeMl
      Removed value: -{
      -  "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.",
      -  "type": [
      -    "number",
      -    "null"
      -  ]
      -}
    • changedOutput schema / properties / a / required
      Previous 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"
      +]
    • addedOutput schema / properties / b / properties / price
      Added 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."
      +}
    • removedOutput schema / properties / b / properties / priceFromGbp
      Removed 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"
      -  ]
      -}
    • removedOutput schema / properties / b / properties / pricePerMlGbp
      Removed 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"
      -  ]
      -}
    • removedOutput schema / properties / b / properties / priceSizeMl
      Removed value: -{
      -  "description": "Bottle size in millilitres that PriceFromGbp applies to. 0 means the retailer did not state a size.",
      -  "type": [
      -    "number",
      -    "null"
      -  ]
      -}
    • changedOutput schema / properties / b / required
      Previous 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"
      +]
    • addedOutput schema / properties / market
      Added 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"
      +  ]
      +}
  2. First observed

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources