Skip to main content
Glama

WEM Price Compare

Compare several products

compare_products
Read-only

Lays 2 to 5 listings from earlier search results side by side in comparison: each listing's price and currency, and its rating, shipping and features where the retailer source supplies them (many listings carry none). Each item needs the listing's provider and its id as product_id. Listings that cannot be found are left out, and fewer than two found is an error. Prices stay in each listing's own currency.

Input Schema

NameRequiredDescriptionDefault
productsYes2 to 5 listings, each with `provider` and `product_id` as given in a search result.

Output Schema

NameRequiredDescriptionDefault
countYes
linksNoThe prices in this result as lines, cheapest first. Give these to the user when you name a price from this result. Each line opens the retailer page for that price; a retailer URL found elsewhere may be a different listing or price.
comparisonYes
disclosureYesWEM’s affiliate disclosure for this answer, written to be quoted as it is. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. A version from an earlier answer may not fit this one: a row marked `affiliate: false` earns WEM nothing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / comparison / items / properties / url / description
      Previous value: -"WEM tracked link to the retailer page for this offer. WEM never takes payment."New value: +"The page this price was read on. Give this url to the user when you name the price; a different url can be a different listing or price. The full URL; a shortened form is a different link. WEM never takes payment."
    • addedOutput schema / properties / links
      Added value: +{
      +  "description": "The prices in this result as lines, cheapest first. Give these to the user when you name a price from this result. Each line opens the retailer page for that price; a retailer URL found elsewhere may be a different listing or price.",
      +  "items": {
      +    "properties": {
      +      "currency": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "markdown": {
      +        "description": "The same link as `[Retailer — £0.00](url)`, for hosts rendering markdown.",
      +        "type": "string"
      +      },
      +      "price": {
      +        "description": "Null when the row has no figure. The markdown then says where to see the price.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "retailer": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "The page this price was read on. The full URL; a shortened or rewritten form is a different link.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed2 schema fields changed
    • changedOutput schema / properties / comparison / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / comparison / items / properties / provider / description
      Previous value: -"Retailer slug, e.g. \"ebay\", \"currys\"."New value: +"Retailer slug, e.g. \"amazon\", \"currys\"."
  3. Changed1 schema field changed
    • addedOutput schema / properties / comparison / items / properties / shipping / description
      Added value: +"Delivery as the retailer stated it: `free`, or `cost` in the offer currency. Absent or null means not stated: say delivery is shown at the shop, never that it is free. Offers are ordered by item price; add a stated cost before calling one cheaper delivered."
  4. Changed10 schema fields changed
    • changedInput schema / properties / products / description
      Previous value: -"List of products to compare (2-5 items)"New value: +"2 to 5 listings, each with `provider` and `product_id` as given in a search result."
    • changedOutput schema / properties / comparison / items / properties / affiliate / description
      Previous value: -"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. It is still a real offer, and its link is not affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` states whether all, some or none of the links are tracked."
    • changedOutput schema / properties / comparison / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / comparison / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: the note stands in place of a figure."
    • changedOutput schema / properties / comparison / items / properties / priceNote / description
      Previous value: -"Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."New value: +"Present only when `price` is null: the words that stand in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."
    • changedOutput schema / properties / comparison / items / properties / priceQualifier / description
      Previous value: -"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described."New value: +"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. It reads as \"from £X\"; it is not the item's price or the cheapest. Absent means the price is firm for the row as described."
    • changedOutput schema / properties / comparison / items / properties / priceStatus / description
      Previous value: -"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now."New value: +"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Those two read as \"last seen £X on 8 Sep\" or \"price not dated\", come after the current ones, and are not compared. Absent on a row a provider answered just now."
    • changedOutput schema / properties / comparison / items / properties / unitPrice / description
      Previous value: -"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."New value: +"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. Across sizes, value is compared on these, not on the prices: a smaller size is not cheaper because its price is lower. It reads beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."
    • changedOutput schema / properties / comparison / items / properties / url / description
      Previous value: -"WEM tracked link to the retailer. Send the user here — WEM never takes payment."New value: +"WEM tracked link to the retailer page for this offer. WEM never takes payment."
    • changedOutput schema / properties / disclosure / description
      Previous value: -"Disclosure to relay once per answer, verbatim. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. Never substitute the version you saw last time — a row marked `affiliate: false` earns WEM nothing, and saying otherwise misdescribes it to the shopper."New value: +"WEM’s affiliate disclosure for this answer, written to be quoted as it is. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. A version from an earlier answer may not fit this one: a row marked `affiliate: false` earns WEM nothing."
  5. Changed4 schema fields changed
    • changedOutput schema / properties / comparison / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."
    • changedOutput schema / properties / comparison / items / properties / price / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / comparison / items / properties / priceNote
      Added value: +{
      +  "description": "Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / comparison / items / properties / priceStatus
      Added value: +{
      +  "description": "`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now.",
      +  "enum": [
      +    "current",
      +    "stale",
      +    "undated"
      +  ],
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • changedOutput schema / properties / comparison / items / properties / affiliate / description
      Previous value: -"False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."
  7. Changed1 schema field changed
    • addedOutput schema / properties / comparison / items / properties / unitPrice
      Added value: +{
      +  "description": "Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit.",
      +  "properties": {
      +    "amount": {
      +      "type": "number"
      +    },
      +    "currency": {
      +      "description": "ISO 4217 code.",
      +      "type": "string"
      +    },
      +    "per": {
      +      "enum": [
      +        "100ml",
      +        "litre",
      +        "100g",
      +        "kg",
      +        "item"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  8. Changed1 schema field changed
    • changedOutput schema / properties / disclosure / description
      Previous value: -"Affiliate disclosure to relay once per answer. Outbound links are tracked at no extra cost to the buyer."New value: +"Disclosure to relay once per answer, verbatim. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. Never substitute the version you saw last time — a row marked `affiliate: false` earns WEM nothing, and saying otherwise misdescribes it to the shopper."
  9. Changed1 schema field changed
    • addedOutput schema / properties / comparison / items / properties / priceQualifier
      Added value: +{
      +  "description": "Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described.",
      +  "enum": [
      +    "from"
      +  ],
      +  "type": "string"
      +}
  10. Changed2 schema fields changed
    • addedOutput schema / properties / comparison / items / properties / channel
      Added value: +{
      +  "description": "retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers.",
      +  "enum": [
      +    "retailer",
      +    "marketplace"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / comparison / items / properties / shipping / properties / estimate
      Added value: +{
      +  "description": "Delivery window when the feed stated one.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / comparison / items / properties / affiliate
      Added value: +{
      +  "description": "False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path.",
      +  "type": "boolean"
      +}
  12. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "comparison": {
      +      "items": {
      +        "properties": {
      +          "badges": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "brand": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "currency": {
      +            "description": "ISO 4217 code.",
      +            "type": "string"
      +          },
      +          "features": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "image": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "inStock": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "price": {
      +            "description": "Indicative price. The retailer sets the final price at checkout.",
      +            "type": "number"
      +          },
      +          "provider": {
      +            "description": "Retailer slug, e.g. \"ebay\", \"currys\".",
      +            "type": "string"
      +          },
      +          "rating": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "reviewCount": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "seller": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "shipping": {
      +            "properties": {
      +              "cost": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "free": {
      +                "type": "boolean"
      +              }
      +            },
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "WEM tracked link to the retailer. Send the user here — WEM never takes payment.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "count": {
      +      "type": "number"
      +    },
      +    "disclosure": {
      +      "description": "Affiliate disclosure to relay once per answer. Outbound links are tracked at no extra cost to the buyer.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "comparison",
      +    "count",
      +    "disclosure"
      +  ],
      +  "type": "object"
      +}
  13. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and non-destructive, so safety is covered. The description adds valuable context: missing listings are omitted, fewer than two found is an error, and prices remain in original currency. It doesn't describe rate limits or authentication needs, but for a read-only comparison tool that's reasonable.

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?

Two sentences, front-loaded with the core action and scope. Every sentence adds useful information: the first explains what is compared, the second gives the input format and error conditions.

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?

Given the output schema exists, the description needn't explain return values. It covers the essential behavioral traits (omission of missing listings, error on fewer than two, currency handling) and input requirements, making it complete for this tool.

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 schema documents the parameters fully. The description adds meaning by explaining that each item requires the listing's provider and id as product_id, and that these come from earlier search results, which helps the agent construct valid input.

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 (lays side by side) and resource (2-5 listings from earlier search results) and names the output field `comparison`. It clearly distinguishes itself from siblings like search_products or get_product by focusing on side-by-side comparison of existing listings.

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?

Implies usage: listings must come from earlier search results and each needs provider and product_id. However, it doesn't explicitly state when to use this tool versus alternatives like compare_offers or find_lowest_price.

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