Skip to main content
Glama
README.md
# ShelfAtlas MCP server

Danish grocery catalog and shelf data as MCP tools. Ask *"where is Pepsi Max
cheapest right now?"* and get live, structured answers: current offers across
every major Danish chain, nearest-store geo search, product name and EAN
lookup, and a purpose-built `find_cheapest_offers` tool. Community shelf-stock
signals are included where approved, with confirmation counts.

- **Endpoint:** `https://api.shelfatlas.com/api/v1/mcp` (Streamable HTTP)
- **Auth:** `Authorization: Bearer sa_live_<your-key>` — create a free key at
  <https://app.shelfatlas.com>
- **Docs:** <https://shelfatlas.com/docs> (tools, quotas, error codes)

## Tools

| Tool | What it answers |
|---|---|
| `search_products` | Resolve a product name to id + EAN before calling other tools |
| `get_product_by_ean` | Look up a product by EAN-13 barcode |
| `find_cheapest_offers` | "Where is this product cheapest right now?" — live offers, cheapest first, chain resolved |
| `search_catalog_offers` | Catalog offers with price and validity window (live-only by default; chain/EAN/product filters) |
| `get_stores` | Paginated store list, or nearest-first geo search |
| `list_chains` | All retail chains (id, slug, name) |

## Claude Desktop

Claude Desktop reaches remote servers through [`mcp-remote`](https://www.npmjs.com/package/mcp-remote):

```json
{
  "mcpServers": {
    "shelfatlas": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.shelfatlas.com/api/v1/mcp"],
      "env": {
        "MCP_REMOTE_HEADER_AUTHORIZATION": "Bearer sa_live_<your-key>"
      }
    }
  }
}
```

Clients with native Streamable HTTP support connect directly to the endpoint
with the `Authorization` header.

## Run locally (stdio)

For clients that only speak stdio, this repository is also a small local
server that serves the hosted tools over stdio (Node.js 20+):

```bash
git clone https://github.com/SlambertDK/shelfatlas-mcp && cd shelfatlas-mcp
npm ci
SHELFATLAS_API_KEY=sa_live_<your-key> node index.js
```

Or with Docker: `docker build -t shelfatlas-mcp .` and
`docker run -i --rm -e SHELFATLAS_API_KEY=sa_live_<your-key> shelfatlas-mcp`.

Listing the tools works without a key; calling them needs `SHELFATLAS_API_KEY`.
`server.json` is the manifest for the official MCP registry.

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct resource: chains, stores, products by EAN, products by name, offers search, and cheapest-offer ranking. The main overlap is between search_catalog_offers and find_cheapest_offers, both returning currently-valid offers; the descriptions differentiate them (general search/filter vs single-product cheapest-first), but an agent could still hesitate.

Naming Consistency4/5

All tools follow a verb_noun snake_case pattern (list_chains, get_stores, search_products, get_product_by_ean). Minor inconsistency in verb choice for the same concept (search_catalog_offers vs find_cheapest_offers), and qualifier suffixes vary (catalog, by_ean), but the set remains predictable.

Tool Count5/5

Six tools is well-scoped for a retail-catalog/offers domain, with each tool earning its place (chain lookup, store lookup, product resolution, offer search, price comparison). No filler tools and no obvious missing slice of the surface.

Completeness4/5

The lifecycle is largely covered: chains → stores (with geo) → products (by name and EAN) → offers → cheapest-offer answer, with the intended search_products-then-find_cheapest_offers flow documented. Minor gaps exist, such as fetching a single offer or store by id and browsing product lists, but agents can work around these via the existing filters.

Maintenance

ActivityMaintained
ResponsivenessNo issues