dutch-supermarkets-mcp

dutch-supermarkets-mcp

MCP server for Dutch supermarkets and drugstores, enabling product search, price comparison, promotions, shopping lists, meal planning, price alerts, and budget tracking via natural language.

Category
访问服务器

README

Dutch Supermarkets MCP

TypeScript MCP server for Dutch supermarket and drugstore prices, promotions, shopping lists, meal planning, price alerts, routes, and budgets.

MCP tools

Tool Purpose
search_products Search supermarket and drugstore products
compare_prices Compare the cheapest matching product per store
optimize_shopping_list Split a list across the cheapest stores
list_supermarkets List stores and product counts
list_drugstores List drugstores and active promotion counts
list_promotions Search current promotions by store/category
search_recipes Search recipes by text, category, diet, or duration
plan_meals Generate a meal plan and priced shopping list
get_price_history Show recent price ranges
create_price_alert Create a price or promotion alert
check_price_alerts Check active alerts against current data
save_shopping_list Save a shopping list
load_shopping_list Re-price a saved list
list_shopping_lists List saved shopping lists
get_purchase_advice Recommend buying now or waiting
find_stores Find nearby stored locations
plan_store_route Group cheapest products into store stops
set_budget Set the current weekly budget
check_budget Price a list against a budget
get_saving_tips Find promotion savings

Tool names, input fields, descriptions, and responses are English. Dutch terms are retained only in synchronized source values and matching keywords required by Dutch retailer data sources.

Docker quick start

cp .env.example .env
# Replace DB_PASSWORD and HTTP_AUTH_TOKEN with random values.
docker compose up -d --build

The stack contains:

  • db: PostgreSQL 16 with docker/init.sql
  • mcp-server: authenticated Streamable HTTP at http://localhost:8000/mcp
  • scheduler: initial sync followed by 12-hour product/promotion/recipe syncs

The MCP and scheduler initialize the PostgreSQL schema themselves from the schema bundled in the image. A deployment consuming the published image does not need to clone this repository or mount docker/init.sql.

GitHub Container Registry deployment

Every push to main publishes two image tags through .github/workflows/publish-container.yml:

ghcr.io/thijserven/dutch-supermarkets-mcp:latest
ghcr.io/thijserven/dutch-supermarkets-mcp:<full-commit-sha>
services:
  dutch-supermarkets-db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: dutch_supermarkets
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DUTCH_SUPERMARKETS_DB_PASSWORD}
    volumes:
      - dutch-supermarkets-data:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres -d dutch_supermarkets']
      interval: 5s
      timeout: 5s
      retries: 10

  dutch-supermarkets-mcp:
    image: ghcr.io/thijserven/dutch-supermarkets-mcp:<full-commit-sha>
    restart: unless-stopped
    depends_on:
      dutch-supermarkets-db:
        condition: service_healthy
    environment: &dutch-supermarkets-env
      DB_HOST: dutch-supermarkets-db
      DB_PORT: 5432
      DB_NAME: dutch_supermarkets
      DB_USER: postgres
      DB_PASSWORD: ${DUTCH_SUPERMARKETS_DB_PASSWORD}
      ENABLE_HTTP_SERVER: 'true'
      HTTP_HOST: '0.0.0.0'
      HTTP_PORT: 8000
      HTTP_AUTH_TOKEN: ${DUTCH_SUPERMARKETS_MCP_AUTH_TOKEN}

  dutch-supermarkets-scheduler:
    image: ghcr.io/thijserven/dutch-supermarkets-mcp:<full-commit-sha>
    restart: unless-stopped
    depends_on:
      dutch-supermarkets-mcp:
        condition: service_healthy
    environment:
      <<: *dutch-supermarkets-env
      SYNC_INTERVAL_MS: 43200000
    command: ['bin/scheduler.js']
    healthcheck:
      disable: true

volumes:
  dutch-supermarkets-data:

Check health:

curl http://localhost:8000/health

Connect an MCP client using either header:

Authorization: Bearer <HTTP_AUTH_TOKEN>
x-mcp-token: <HTTP_AUTH_TOKEN>

Example Hermes MCP configuration:

mcp_servers:
  dutch_supermarkets:
    url: http://mcp-server:8000/mcp
    headers:
      Authorization: Bearer ${HTTP_AUTH_TOKEN}

Local stdio setup

Requirements: Node.js 20+ and a reachable PostgreSQL database initialized with docker/init.sql.

npm ci
npm run build
DB_HOST=127.0.0.1 DB_PORT=5432 DB_PASSWORD=... node bin/mcp-server.js

ENABLE_HTTP_SERVER defaults to false, so the CLI uses stdio. An MCP client configuration can invoke it directly:

{
  "mcpServers": {
    "dutch-supermarkets": {
      "command": "node",
      "args": ["/absolute/path/to/dutch-supermarkets-mcp/bin/mcp-server.js"],
      "env": {
        "DB_HOST": "127.0.0.1",
        "DB_PORT": "5432",
        "DB_NAME": "dutch_supermarkets",
        "DB_USER": "postgres",
        "DB_PASSWORD": "..."
      }
    }
  }
}

Configuration

Variable Default Description
DB_HOST 127.0.0.1 PostgreSQL host
DB_PORT 5432 PostgreSQL port
DB_NAME dutch_supermarkets Database name
DB_USER postgres Database user
DB_PASSWORD empty Database password
ENABLE_HTTP_SERVER false Use Streamable HTTP instead of stdio
HTTP_HOST 0.0.0.0 HTTP bind host
HTTP_PORT 8000 HTTP bind port
HTTP_AUTH_TOKEN unset Optional HTTP bearer/custom-header token
HTTP_AUTH_HEADER_NAME x-mcp-token Custom token header

For exposed or shared HTTP deployments, always set HTTP_AUTH_TOKEN and place the server behind TLS. The Docker Compose stack requires the token.

Data synchronization

npm run sync -- prices
npm run sync -- promotions
npm run sync -- recipes
npm run sync -- all

Sources:

  • Product prices: checkjebon.nl/data/supermarkets.json
  • Promotions: public Folderz category pages
  • Recipes: bundled Dutch recipes plus TheMealDB

These are third-party sources and can change or rate-limit requests. The sync commands fail visibly on source/database errors; existing database data remains available to the MCP server.

Development

npm test
npm run lint
npm run typecheck
npm run build

The test suite covers tool parity, Zod validation, parameterized SQL behavior, transport authentication, MCP protocol calls, geographic calculations, and promotion parsing.

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选