Danish grocery catalog as MCP tools: live offers across all major chains, stores, EAN lookup, stock.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer sa_live_<your-key> — create a free key at https://app.shelfatlas.com
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.
Answer 'where is this product cheapest right now?' in one call: the currently-valid offers for one product (by EAN or product id), cheapest first, with chain slug and name resolved. Combine with get_stores(lat/lng, chain_slug) to find the nearest store carrying the winning chain's offer. Self-serve keys see published campaign offers only — not everyday shelf prices, which are Salling-only and restricted to partner keys.
EAN-13 barcode of the product.
Max offers (1–50). Default: 20.
ShelfAtlas product id (alternative to ean).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Answer 'where is this product cheapest right now?' in one call: the currently-valid offers for one product (by EAN or product id), cheapest first, with chain slug and name resolved. Combine with get_stores(lat/lng, chain_slug) to find the nearest store carrying the winning chain's offer. Self-serve keys see published campaign offers only — not everyday shelf prices, which are Salling-only and restricted to partner keys.
| Argument | Type | Description |
|---|---|---|
| ean | string | EAN-13 barcode of the product. |
| limit | integer | Max offers (1–50). Default: 20. |
| product_id | string | ShelfAtlas product id (alternative to ean). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "EAN-13 barcode of the product."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Max offers (1–50). Default: 20."
},
"product_id": {
"type": "string",
"format": "uuid",
"description": "ShelfAtlas product id (alternative to ean)."
}
},
"additionalProperties": false
}Look up a product in the ShelfAtlas catalog by its EAN barcode.
| Argument | Type | Description |
|---|---|---|
| ean* | string | EAN-13 barcode, e.g. "5700382342773". |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ean"
],
"properties": {
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "EAN-13 barcode, e.g. \"5700382342773\"."
}
},
"additionalProperties": false
}List stores in the ShelfAtlas catalog. Filter by chain slug, or pass lat/lng for a nearest-first geo search (optionally capped by radius_km; geo results are not paginated).
| Argument | Type | Description |
|---|---|---|
| lat | number | Latitude for nearest-first search. |
| lng | number | Longitude for nearest-first search. |
| limit | integer | Max results (1–50). Default: 20. |
| cursor | string | Pagination cursor from previous response (ignored for geo search). |
| radius_km | number | Only stores within this many km (requires lat/lng). |
| chain_slug | string | Chain slug, e.g. "rema". Omit for all chains. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude for nearest-first search."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude for nearest-first search."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Max results (1–50). Default: 20."
},
"cursor": {
"type": "string",
"maxLength": 128,
"description": "Pagination cursor from previous response (ignored for geo search)."
},
"radius_km": {
"type": "number",
"maximum": 500,
"description": "Only stores within this many km (requires lat/lng).",
"exclusiveMinimum": 0
},
"chain_slug": {
"type": "string",
"maxLength": 64,
"description": "Chain slug, e.g. \"rema\". Omit for all chains."
}
},
"additionalProperties": false
}List all retail chains available in the ShelfAtlas catalog.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Search catalog offers (promotions and listed products) from Danish retail chains. Returns ONLY currently-valid offers unless include_expired is set. Filter by chain slug, product id, or EAN. Offers carry chainId — resolve names via list_chains. Self-serve keys see published campaign offers (tilbudsaviser, month-campaigns) only — not everyday shelf prices, which are Salling-only and restricted to partner keys.
| Argument | Type | Description |
|---|---|---|
| ean | string | Filter to offers matched to this EAN-13. |
| limit | integer | Max results (1–50). Default: 20. |
| cursor | string | Pagination cursor from previous response. |
| chain_slug | string | Filter to one chain, e.g. "rema". |
| product_id | string | Filter to offers matched to this product id. |
| include_expired | boolean | Include offers past their validity window. Default: false. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "Filter to offers matched to this EAN-13."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Max results (1–50). Default: 20."
},
"cursor": {
"type": "string",
"maxLength": 128,
"description": "Pagination cursor from previous response."
},
"chain_slug": {
"type": "string",
"maxLength": 64,
"description": "Filter to one chain, e.g. \"rema\"."
},
"product_id": {
"type": "string",
"format": "uuid",
"description": "Filter to offers matched to this product id."
},
"include_expired": {
"type": "boolean",
"description": "Include offers past their validity window. Default: false."
}
},
"additionalProperties": false
}Resolve a product NAME to its ShelfAtlas id and EAN — use this BEFORE calling find_cheapest_offers or search_catalog_offers when you only have a product name (e.g. from a user question) and not an id or barcode. Matches on the canonical product name, case-insensitive, substring match. Returns id, name, ean (null for self-serve keys — every EAN is Salling-sourced and restricted to partner keys), and size (volumeMl/unitCount/quantityUnit) where known.
| Argument | Type | Description |
|---|---|---|
| q* | string | Product name (or part of it) to search for, e.g. "Pepsi Max 50cl". Minimum 2 characters. |
| limit | integer | Max results (1–20). Default: 10. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"description": "Product name (or part of it) to search for, e.g. \"Pepsi Max 50cl\". Minimum 2 characters."
},
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Max results (1–20). Default: 10."
}
},
"additionalProperties": false
}