Skip to main content
Glama

Where is a product cheapest

compare_prices
Read-onlyIdempotent

Find where a product is cheapest right now. Matches the same product at Aldi, Tesco, SuperValu, Dunnes Stores and Lidl and returns each store's current price side by side, with unit prices, offers and member prices (Tesco Clubcard, SuperValu Real Rewards, Lidl Plus). To list the products most stores stock, leave out query and set min_stores, e.g. min_stores=5 for every product matched at all five. Free: no BasketWatch account needed.

Args:
    query: the product, e.g. "heinz ketchup" or "kerrygold butter 454g".
        Optional when min_stores is given.
    limit: how many matched products to return (default 5, max 50).
    min_stores: only products matched at at least this many stores, 2 to
        5, with or without query.

Returns {"as_of", "query", "matches": [{"product", "pack", "prices":
{store: {name, price, unit_price, unit_basis, offer_text, was_price,
offer_ends, clubcard_price, url}}, "cheapest_store"}]}. A store missing from "prices" did not have that product in its online range today and may still sell it in store: say "not found online", not that the store lacks it. offer_ends is the last day an
offer applies (Irish time): say when an offer ends, as online orders are
priced for the delivery or collection day.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "compare_prices"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNo
queryNo
min_storesNo

Output Schema

NameRequiredDescriptionDefault
as_ofNoPrice date, YYYY-MM-DD
queryNo
matchesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / $defs / ComparedProduct / properties / prices / description
      Previous value: -"Keyed by store (aldi, tesco, supervalu, dunnes, lidl); a store missing here does not stock this product"New value: +"Keyed by store (aldi, tesco, supervalu, dunnes, lidl); a store missing here did not have this product in its online range today (it may still sell it in store)"
  2. Changed1 schema field changed
    • addedOutput schema / $defs / StorePrice / properties / offer_ends
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Last day the offer applies, YYYY-MM-DD, Irish time, where the retailer states it",
      +  "title": "Offer Ends"
      +}
  3. Changed1 schema field changed
    • changedOutput schema / $defs / StorePrice / properties / clubcard_price / description
      Previous value: -"Tesco Clubcard price, Tesco only"New value: +"Member price where one applies: Tesco Clubcard, SuperValu Real Rewards or Lidl Plus"
  4. Changed5 schema fields changed
    • addedInput schema / properties / min_stores
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Min Stores"
      +}
    • addedInput schema / properties / query / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / query / default
      Added value: +null
    • removedInput schema / properties / query / type
      Removed value: -"string"
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
  5. Changed1 schema field changed
    • changedOutput schema / $defs / ComparedProduct / properties / prices / description
      Previous value: -"Keyed by store (aldi, tesco, supervalu, dunnes); a store missing here does not stock this product"New value: +"Keyed by store (aldi, tesco, supervalu, dunnes, lidl); a store missing here does not stock this product"
  6. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Goes well past the annotations (readOnly/idempotent/openWorld) by disclosing that data reflects each store's online range today, that a missing store means "not found online" rather than out of stock, that offer_ends is Irish time and matters because orders are priced for the delivery/collection day, and that member/clubcard pricing is included. These are exactly the caveats an agent needs to avoid producing a wrong answer.

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?

The core purpose and the min_stores alternate mode are front-loaded, and the args block is tight. The Returns prose is long and mixes genuine caveats with somewhat sprawling phrasing, which makes it slightly heavier than needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even with an output schema present, the description usefully names the return keys and the store-price fields and explains the ambiguity in missing stores. Nearly complete for a 3-param read-only tool; the remaining gap is the missing differentiation from the compare_price_across_stores sibling.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full load and does: query is explained with example values and its optionality when min_stores is set, limit is given a default and a max of 50, and min_stores is bounded 2–5 with its filtering semantics spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: find the cheapest store for a given product, matching it across five named retailers and returning prices side by side. The scope and per-store coverage are clear. It loses a point because the sibling set contains compare_price_across_stores, an apparently near-identical tool that the description never distinguishes itself from.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit alternate mode with the condition that selects it ("To list the products most stores stock, leave out query and set min_stores=5") and states the free/no-account condition. It does not, however, say when an agent should pick this over the similar compare_price_across_stores sibling.

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