Skip to main content
Glama

Recommend Fragrances

recommend_fragrances
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results. Default 5, maximum 10.
seasonNoSeason the fragrance is for.
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.
occasionNoOccasion the fragrance is for.
budgetMaxNoMaximum 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.
intensityNoHow strong the fragrance should be.
noteLovedNoA single note the user likes, for example vanilla.
longevityMinNoMinimum staying power.
genderPresentationNoWho the fragrance presents as.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
caveatYesCaveat about how the constraints were applied. Null when there is nothing to qualify.
marketNoThe country the prices in this result are for, its currency, and how it was chosen.
resultsYesMatching fragrances. May be empty when the constraints are too narrow.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • addedInput schema / properties / budgetMax
      Added 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"
      +  ]
      +}
    • removedInput schema / properties / budgetMaxGbp
      Removed value: -{
      -  "default": null,
      -  "description": "Maximum price in GBP for a full-size bottle.",
      -  "type": [
      -    "number",
      -    "null"
      -  ]
      -}
    • 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 / 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"
      +  ]
      +}
    • addedOutput schema / properties / results / items / 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 / results / items / 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 / results / items / 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 / results / items / 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 / results / items / 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"
      +]
  2. First observed

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources