shelfatlas-catalog
Danish grocery catalog as MCP tools: live offers across all major chains, stores, EAN lookup, stock.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"shelfatlas-catalog": {
"url": "https://api.shelfatlas.com/api/v1/mcp"
}
}
}Remote endpoints
https://api.shelfatlas.com/api/v1/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢list_chains
List all retail chains available in the ShelfAtlas catalog.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_stores(chain_slug, lat, lng, radius_km, limit, ...)
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).
Input Schema
{
"type": "object",
"properties": {
"chain_slug": {
"type": "string",
"maxLength": 64,
"description": "Chain slug, e.g. \"rema\". Omit for all chains."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude for nearest-first search."
},
"lng": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude for nearest-first search."
},
"radius_km": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 500,
"description": "Only stores within this many km (requires lat/lng)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Max results (1–50). Default: 20."
},
"cursor": {
"type": "string",
"maxLength": 128,
"description": "Pagination cursor from previous response (ignored for geo search)."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢search_catalog_offers(chain_slug, ean, product_id, include_expired, limit, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"chain_slug": {
"type": "string",
"maxLength": 64,
"description": "Filter to one chain, e.g. \"rema\"."
},
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "Filter to offers matched to this EAN-13."
},
"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."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Max results (1–50). Default: 20."
},
"cursor": {
"type": "string",
"maxLength": 128,
"description": "Pagination cursor from previous response."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢find_cheapest_offers(ean, product_id, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "EAN-13 barcode of the product."
},
"product_id": {
"type": "string",
"format": "uuid",
"description": "ShelfAtlas product id (alternative to ean)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Max offers (1–50). Default: 20."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_product_by_ean(ean)
Look up a product in the ShelfAtlas catalog by its EAN barcode.
Input Schema
{
"type": "object",
"properties": {
"ean": {
"type": "string",
"pattern": "^\\d{13}$",
"description": "EAN-13 barcode, e.g. \"5700382342773\"."
}
},
"required": [
"ean"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢search_products(q, limit)
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.
Input Schema
{
"type": "object",
"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",
"minimum": 1,
"maximum": 20,
"description": "Max results (1–20). Default: 10."
}
},
"required": [
"q"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence