# kronan-mcp [Health: Active]

**Category:** 🛒 E-Commerce  
**Repository:** https://github.com/sandsower/kronan-mcp  
**GitHub Stars:** 16  
**npm Downloads (last month):** 214  
**Views:** 3  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/kronan-mcp

## Description
MCP server for the Krónan grocery store API (Iceland)

## Tools
Capabilities this server exposes over MCP:

- **get_me** — Get the current authenticated identity (user or customer group)
- **list_categories** — Get the full 3-level category tree
- **get_category_products** — Get paginated product listing for a category (48 per page)
- **get_product** — Get full product details including price, discounts, tags, availability
- **search_products** — Search for products in the smart store selection. Returns products available for home delivery.
- **get_checkout** — Get the active smart checkout (auto-creates if none exists)
- **add_checkout_lines** — Add product lines to the active checkout. Set replace=true to replace all existing lines.
- **list_orders** — List orders, most recent first
- **get_order** — Get full order details including lines with product thumbnails
- **delete_order_lines** — Remove specific lines from an order by their IDs. Service lines and the last remaining line cannot be deleted.
- **set_order_substitution** — Set whether substitution is allowed for specific order lines. Uses a toggle endpoint: fetches current state and only toggles lines that differ. WARNING: Not idempotent due to toggle semantics. Do NOT retry on timeout — check current state first.
- **lower_order_quantity** — Reduce the quantity of specific order lines. Quantity can only be lowered. Set to 0 to remove.
- **list_product_lists** — List saved product lists
- **create_product_list** — Create a new product list
- **get_product_list** — Get a product list with all items including product details and pricing
- **update_product_list** — Update the name or description of a product list
- **delete_product_list** — Permanently delete a product list and all its items
- **clear_product_list** — Remove all items from a product list without deleting the list itself
- **sort_product_list** — Sort items in the product list by store departments
- **update_product_list_item** — Add a product by SKU or update its quantity in a product list. Set quantity to 0 to remove.
- **list_purchase_stats** — List previously purchased products with frequency data, ordered by most recent purchase
- **set_purchase_stat_ignored** — Hide or unhide a product from purchase history
- **get_shopping_note** — Get the shopping note (auto-creates if none exists)
- **add_shopping_note_line** — Add a line to the shopping note. Provide exactly one of text (freeform) or sku (linked product), not both.
- **change_shopping_note_line** — Update the text or quantity of an existing shopping note line
- **reorder_shopping_note_lines** — Reorder shopping note lines by passing their tokens in desired order
- **delete_shopping_note_line** — Remove a line from the shopping note
- **delete_archived_line** — Remove a specific archived shopping note line
- **clear_shopping_note** — Delete all lines from the shopping note (the note itself is preserved)
- **check_store_order_eligibility** — Check if the shopping note contains products that can be ordered from a store
- **list_archived_lines** — List previously completed and archived shopping note lines
- **apply_store_product_order** — Reorder shopping note lines to match the store's aisle layout for efficient in-store shopping
- **set_line_completion** — Mark a shopping note line as completed or uncompleted. Uses a toggle endpoint: fetches current state and only toggles if needed. WARNING: Not idempotent due to toggle semantics. Do NOT retry on timeout — check current state first.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "kronan-mcp": {
    "command": "npx",
    "args": ["-y","kronan-mcp"]
  }
}
```

## Documentation & README

# kronan-mcp

MCP server for the [Krónan](https://kronan.is) grocery store API. Claude can browse products, manage shopping notes, handle checkout, and track orders from Krónan's Snjallverslun (smart store) in Iceland.

## Tools

25 tools over the Model Context Protocol:

| Category | Tools |
|----------|-------|
| Products | `search_products`, `get_product`, `get_category_products`, `list_categories` |
| Checkout | `get_checkout`, `add_checkout_lines` |
| Orders | `list_orders`, `get_order`, `delete_order_lines`, `set_order_substitution`, `lower_order_quantity` |
| Shopping notes | `get_shopping_note`, `add_shopping_note_line`, `change_shopping_note_line`, `reorder_shopping_note_lines`, `delete_shopping_note_line`, `set_line_completion`, `clear_shopping_note`, `check_store_order_eligibility`, `apply_store_product_order`, `list_archived_lines`, `delete_archived_line` |
| Product lists | `list_product_lists`, `create_product_list`, `get_product_list`, `update_product_list`, `delete_product_list`, `clear_product_list`, `sort_product_list`, `update_product_list_item` |
| Purchase stats | `list_purchase_stats`, `set_purchase_stat_ignored` |
| Account | `get_me` |

## Install

```bash
npm install -g kronan-mcp
```

Or run directly with npx (no install needed):

```bash
npx kronan-mcp
```

### Getting a token

Tokens are created in the Krónan Snjallverslun user settings. You need an account with Audkenni (Iceland's electronic ID) login. Go to your user or customer group settings page and create an access token. Tokens are prefixed with `act_`.

## Usage with Claude Code

Add to your project's `.claude/settings.local.json` or global `~/.claude/settings.json`:

```json
{
  "mcpServers": {
    "kronan": {
      "command": "npx",
      "args": ["kronan-mcp"],
      "env": {
        "KRONAN_ACCESS_TOKEN": "act_your_token_here"
      }
    }
  }
}
```

Then ask Claude things like:

- "Search for milk on Krónan"
- "What's in my shopping note?"
- "Add 2x of SKU 02500188 to my checkout"
- "Show my recent orders"

## Architecture

```
src/
├── client.ts   HTTP client wrapping all Krónan API endpoints
├── index.ts    MCP server registering tools via @modelcontextprotocol/sdk
└── types.ts    TypeScript interfaces matching the OpenAPI schema
```

Auth is `Authorization: AccessToken <token>` on every request. Rate limit is 200 requests per 200 seconds per user. The client detects 429 responses and tells the caller to wait.

All prices are integers in ISK (no decimals). 230 means 230 kr.

Errors go through a typed `KronanApiError` with status codes. The token is scrubbed from error messages so it doesn't leak to the LLM. Auth failures and rate limits get their own user-facing messages.

`set_order_substitution` and `set_line_completion` use read-then-toggle patterns. They're not idempotent. Don't retry on timeout without checking current state first.

## API reference

Full OpenAPI schema at `openapi-schema.yaml`.

## Development

```bash
npm install && npm run build   # Build from source
npm run dev                    # Watch mode (recompiles on change)
npm test                       # Run tests
npm run test:watch             # Watch mode tests
```

## Tests

31 tests on the HTTP client: constructor validation, error paths (429, timeouts, JSON parse failures), token scrubbing, toggle method validation, eligibility endpoint edge cases.

```bash
npm test
```

