AI shopping advisor: finds and compares products with merchant prices from daily feed imports.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compare two to five products side by side: brand, category, price range across merchants, merchant count, and the lowest current offer for each. Use when the user is choosing between named products.
Two to five product ids from previous Edwin tool results.
ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http edwin https://thebutler.network/api/mcp
Compare two to five products side by side: brand, category, price range across merchants, merchant count, and the lowest current offer for each. Use when the user is choosing between named products.
| Argument | Type | Description |
|---|---|---|
| pids* | array | Two to five product ids from previous Edwin tool results. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
{
"type": "object",
"required": [
"pids",
"market"
],
"properties": {
"pids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"minItems": 2,
"description": "Two to five product ids from previous Edwin tool results."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
}
},
"additionalProperties": false
}Find comparable products to a given product in the same market, optionally within a budget or with specific attribute changes. Use when the user asks for alternatives, cheaper equivalents, or "something like X but Y".
| Argument | Type | Description |
|---|---|---|
| pid* | string | Product id exactly as returned by a previous Edwin tool result. Never invent one — call search_products first if you do not have a pid. |
| limit | integer | How many alternatives to return. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
| direction | string | Which way to look: 'cheaper' for lower-priced equivalents, 'better' for higher-priced ones, 'similar' for the same price class. |
| must_have | array | Attribute words the alternative must carry in its name, e.g. ["oled"] for "like this one but OLED". Matched against product title and brand. |
| budget_max | number | Upper price limit in the market currency, if the user states one. |
{
"type": "object",
"required": [
"pid",
"market"
],
"properties": {
"pid": {
"type": "string",
"description": "Product id exactly as returned by a previous Edwin tool result. Never invent one — call search_products first if you do not have a pid."
},
"limit": {
"type": "integer",
"default": 5,
"maximum": 10,
"minimum": 1,
"description": "How many alternatives to return."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
},
"direction": {
"enum": [
"cheaper",
"similar",
"better"
],
"type": "string",
"default": "similar",
"description": "Which way to look: 'cheaper' for lower-priced equivalents, 'better' for higher-priced ones, 'similar' for the same price class."
},
"must_have": {
"type": "array",
"items": {
"type": "string"
},
"description": "Attribute words the alternative must carry in its name, e.g. [\"oled\"] for \"like this one but OLED\". Matched against product title and brand."
},
"budget_max": {
"type": "number",
"description": "Upper price limit in the market currency, if the user states one."
}
},
"additionalProperties": false
}Return the full list of current merchant offers for one product in a market: merchant, price, currency, stock status, source timestamp, match tier, and a purchase link, cheapest first. Use when the user wants to see every merchant for one product — search_products already carries the cheapest one.
| Argument | Type | Description |
|---|---|---|
| pid* | string | Product id exactly as returned by a previous Edwin tool result. Never invent one — call search_products first if you do not have a pid. |
| limit | integer | How many offers to return, cheapest first. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
| include_description | boolean | Also return the merchant feed's product description and, for each listed offer, that merchant's own title and description, as plain text shortened to 1200 characters each. It is merchant copy, not a checked spec sheet. Leave it off unless the user asks what the product is like. |
{
"type": "object",
"required": [
"pid",
"market"
],
"properties": {
"pid": {
"type": "string",
"description": "Product id exactly as returned by a previous Edwin tool result. Never invent one — call search_products first if you do not have a pid."
},
"limit": {
"type": "integer",
"default": 8,
"maximum": 8,
"minimum": 1,
"description": "How many offers to return, cheapest first."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
},
"include_description": {
"type": "boolean",
"default": false,
"description": "Also return the merchant feed's product description and, for each listed offer, that merchant's own title and description, as plain text shortened to 1200 characters each. It is merchant copy, not a checked spec sheet. Leave it off unless the user asks what the product is like."
}
},
"additionalProperties": false
}Edwin's short summary and key features for products from an earlier Edwin result (search_products, recommend_product, find_alternatives, compare_products or get_offers), written from the merchants' product data, not from tests or reviews. Use it when the user asks what a product offers, what is included, or how the products differ.
| Argument | Type | Description |
|---|---|---|
| lang* | string | Language of the summary as a BCP 47 tag, e.g. de-DE, en, pt-BR: the language the user writes in. |
| pids* | array | Product ids from a previous Edwin tool result, at most eight. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
{
"type": "object",
"required": [
"pids",
"market",
"lang"
],
"properties": {
"lang": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}([-_][A-Za-z0-9]{1,8}){0,3}$",
"description": "Language of the summary as a BCP 47 tag, e.g. de-DE, en, pt-BR: the language the user writes in."
},
"pids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 1,
"description": "Product ids from a previous Edwin tool result, at most eight."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
}
},
"additionalProperties": false
}Rank a shortlist or a fresh search and return Edwin's recommended option, chosen on how well each product fits the stated need, its attributes and the stated budget. Affiliate commission does not affect ranking. Use when the user asks which product to buy or which option to pick. Use it for shopping requests about products and their prices at online merchants, whether or not the user names Edwin or theButler.network.
| Argument | Type | Description |
|---|---|---|
| pids | array | The shortlist to choose from — product ids from previous Edwin tool results. Give either pids or query. |
| query | string | Alternative to pids: search first, then recommend from the result. Same rules as search_products.query. Give either pids or query. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
| min_price | number | Lower price limit in the market currency, if the user states one. Only used together with query. |
| budget_max | number | Upper price limit in the market currency, if the user states one. |
| constraints | string | What matters to the user, in their own words, e.g. 'quiet, for a small flat'. Edwin ranks by it but does not search with it: the product type and its attributes belong in query, a price limit in budget_max. |
Find purchasable product matches across merchants in a specified market. Use when the user wants to find or buy something: a need, a category, a budget, a gift idea, the best product of a kind, or the price of a named product. Returns normalized product entities with merchant count, price range and the cheapest current offer per product, each with a link. Each product carries a rang that says whether it matches a name suggested for the request (by you or by Edwin) or is another catalog match. Call get_offers only when the user wants the full merchant list for one product. Queries may be in any language. Use it for shopping requests about products and their prices at online merchants, whether or not the user names Edwin or theButler.network.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many products to return. |
| query* | string | The product the user is looking for: product type plus key attributes (size, colour, use case), e.g. 'oled tv 65 inch'. Keep brand and model names exactly as the user wrote them. Product-type terms in German or English retrieve best; other languages are accepted. |
| fields | array | Restrict the returned product fields to these. `pid`, and on search results `rang` and `grund`, are always included. Leave this out to get the full item including its image — only pass a list if you deliberately want fewer fields. |
| market* | string | ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
| suggested_names | array | Optional. Up to 8 specific, real products you would recommend for this request from your own current knowledge, e.g. {"name":"WH-1000XM6","brand":"Sony","kind":"model"} or {"name":"The Hobbit","kind":"title"}. Edwin checks each one against the catalog in this market and returns the matching catalog offers with purchase links, so every product you recommend can carry a link. Names not found in the catalog are dropped. Leave out anything you are not sure exists. Only used together with query. |
{
"type": "object",
"required": [
"market"
],
"properties": {
"pids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "The shortlist to choose from — product ids from previous Edwin tool results. Give either pids or query."
},
"query": {
"type": "string",
"description": "Alternative to pids: search first, then recommend from the result. Same rules as search_products.query. Give either pids or query."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
},
"min_price": {
"type": "number",
"description": "Lower price limit in the market currency, if the user states one. Only used together with query."
},
"budget_max": {
"type": "number",
"description": "Upper price limit in the market currency, if the user states one."
},
"constraints": {
"type": "string",
"description": "What matters to the user, in their own words, e.g. 'quiet, for a small flat'. Edwin ranks by it but does not search with it: the product type and its attributes belong in query, a price limit in budget_max."
},
"suggested_names": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"model",
"title",
"series",
"brand"
],
"type": "string"
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"brand": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"maxItems": 8,
"description": "Optional. Up to 8 specific, real products you would recommend for this request from your own current knowledge, e.g. {\"name\":\"WH-1000XM6\",\"brand\":\"Sony\",\"kind\":\"model\"} or {\"name\":\"The Hobbit\",\"kind\":\"title\"}. Edwin checks each one against the catalog in this market and returns the matching catalog offers with purchase links, so every product you recommend can carry a link. Names not found in the catalog are dropped. Leave out anything you are not sure exists. Only used together with query."
}
},
"additionalProperties": false
}| min_price |
| number |
| Lower price limit in the market currency, if the user states one. |
| budget_max | number | Upper price limit in the market currency, if the user states one. |
| suggested_names | array | Optional. Up to 8 specific, real products you would recommend for this request from your own current knowledge, e.g. {"name":"WH-1000XM6","brand":"Sony","kind":"model"} or {"name":"The Hobbit","kind":"title"}. Edwin checks each one against the catalog in this market and returns the matching catalog offers with purchase links, so every product you recommend can carry a link. Names not found in the catalog are dropped. Leave out anything you are not sure exists. |
{
"type": "object",
"required": [
"query",
"market"
],
"properties": {
"limit": {
"type": "integer",
"default": 8,
"maximum": 10,
"minimum": 1,
"description": "How many products to return."
},
"query": {
"type": "string",
"description": "The product the user is looking for: product type plus key attributes (size, colour, use case), e.g. 'oled tv 65 inch'. Keep brand and model names exactly as the user wrote them. Product-type terms in German or English retrieve best; other languages are accepted."
},
"fields": {
"type": "array",
"items": {
"enum": [
"pid",
"name",
"brand",
"image_url",
"price",
"price_range",
"merchant_count",
"availability",
"source_imported_at",
"match_tier",
"match_score",
"badge",
"url",
"source_updated_at",
"best_offer"
],
"type": "string"
},
"description": "Restrict the returned product fields to these. `pid`, and on search results `rang` and `grund`, are always included. Leave this out to get the full item including its image — only pass a list if you deliberately want fewer fields."
},
"market": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code of the user's shopping market, e.g. DE, AT, NL, FR, GB, US. Infer from the user's context."
},
"min_price": {
"type": "number",
"description": "Lower price limit in the market currency, if the user states one."
},
"budget_max": {
"type": "number",
"description": "Upper price limit in the market currency, if the user states one."
},
"suggested_names": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"model",
"title",
"series",
"brand"
],
"type": "string"
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"brand": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"maxItems": 8,
"description": "Optional. Up to 8 specific, real products you would recommend for this request from your own current knowledge, e.g. {\"name\":\"WH-1000XM6\",\"brand\":\"Sony\",\"kind\":\"model\"} or {\"name\":\"The Hobbit\",\"kind\":\"title\"}. Edwin checks each one against the catalog in this market and returns the matching catalog offers with purchase links, so every product you recommend can carry a link. Names not found in the catalog are dropped. Leave out anything you are not sure exists."
}
},
"additionalProperties": false
}