Skip to main content
Glama

delhaize-mcp

An unofficial Model Context Protocol server that lets an AI assistant fetch your own Delhaize (Belgium) till receipts and this week's promotions, using its own headless browser, without driving your everyday browser and without ever seeing your password.

Unofficial and not affiliated with or endorsed by Delhaize. It reads only your own account, at your request, the way you would read it yourself. Check that your use fits Delhaize's terms of use, keep the request rate low, and do not use it to collect other people's data.

What it does

Tool

What it does

Writes

delhaize_auth_status

Is the saved login still valid?

nothing

delhaize_list_receipts

Lists recent receipts and flags which are not in your record yet

nothing

delhaize_fetch_new_receipts

Saves the image of each new receipt

data/receipts_inbox/

delhaize_backfill_images

Saves the missing photos of receipts already in your record

data/receipts_backfill/

delhaize_fetch_promotions

Saves the raw pages of the weekly promotions listing

data/promos_inbox/<date>/

It never transcribes items, never edits your record, and never handles your password. It only puts files on disk. Reading the images and recording them is left to you or your assistant, ideally with a check that each receipt's lines sum to its printed total.

Receipts are identified by (date, store, total), so nothing is fetched twice.

Related MCP server: Jumbo MCP Server

Requirements

  • Python 3.10+

  • A Delhaize account with receipts linked to your loyalty card

Install

pip install delhaize-mcp
python3 -m playwright install chromium

This gives you two commands: delhaize-mcp (the MCP server) and delhaize-receipts (the same actions from the command line).

Set up

  1. Log in once. A browser window opens, and you sign in yourself:

    delhaize-receipts login

    The session is saved in ~/.delhaize-mcp/profile (or set DELHAIZE_PROFILE). Later runs reuse it headlessly. If it lapses, run login again. That folder holds your session cookies: never commit or share it.

  2. Choose a data folder (optional). By default everything is written to ~/.delhaize-mcp/data. Set DELHAIZE_DATA_DIR to use another folder. Your record of receipts is receipts_all.json in that folder, a JSON list such as:

    [{"date": "2026-08-11", "store": "Delhaize Centre", "total": 11.11, "image": "photos/2026-08-11.jpeg"}]

    image is optional. A receipt without an existing image is what backfill looks for.

  3. Connect it to your assistant.

    Claude Code:

    claude mcp add delhaize-receipts -- delhaize-mcp

    Claude Desktop (claude_desktop_config.json):

    {
      "mcpServers": {
        "delhaize-receipts": {
          "command": "delhaize-mcp",
          "env": {"DELHAIZE_DATA_DIR": "/path/to/your/data"}
        }
      }
    }

    If the app cannot find delhaize-mcp, use its full path (which delhaize-mcp shows it).

Command line

The same actions work without an assistant:

delhaize-receipts status
delhaize-receipts list     --months 1   # this month and last
delhaize-receipts fetch    --months 1
delhaize-receipts backfill --months 3
delhaize-receipts promos

How it works

Delhaize renders each receipt as an image inside a client-side app, so the server lets the real page render in a headless Chromium (Playwright) and reads the finished page, exactly as a person would. All parsing rules (French dates, euro amounts, de-duplication, file naming) live in src/delhaize_mcp/core.py, which has no browser dependency and is fully unit-tested.

Tests

No browser or network needed:

python3 tests/test_core.py
python3 tests/test_server.py

Privacy

  • Nothing leaves your machine except the normal page requests to delhaize.be.

  • No password is read or stored. The login is a browser profile you create yourself.

  • Your login and data live in ~/.delhaize-mcp, outside the code, so they never end up in a repository.

Limitations

  • Built against the French-language Belgian site (delhaize.be/fr). Page changes on Delhaize's side can break it; the parsers are deliberately forgiving, and the tools report what they missed rather than failing silently.

  • The promotions capture saves raw page data only; interpreting it is up to you.

Licence

MIT. See LICENSE.

Available Tools

5 tools
delhaize_auth_statusA

Check whether the saved Delhaize browser profile is still logged in.

Returns {logged_in: bool, message: str}. If logged_in is false, the user must run delhaize-receipts login once to refresh the session; this server cannot and must not perform the login itself.

Inputs: no named parameters.

delhaize_backfill_imagesA

Save the missing PHOTOS of Delhaize receipts that are already in the record but have no image. A receipt lacks a photo when its record has no existing image path and no matching file is already in receipts_backfill/.

Not read only: it writes image files into receipts_backfill/. It never edits receipts_all.json and never uses receipts_inbox, so nothing is ingested twice. Each file is named ' ' so it pairs with its receipt.

Returns {missing, found, saved:[...], missed:[...], not_in_window:[...], next_step}.

Inputs: months_back.

delhaize_fetch_new_receiptsA

Save the images of any NEW Delhaize receipts (this month and the previous months_back months) into receipts_inbox, ready for the existing pipeline.

Not read only: it writes image files into receipts_inbox. It is non destructive: it never overwrites, never deletes, and never edits receipts_all.json. A receipt already present in receipts_all.json is skipped.

After it runs, the images can be read (by the assistant or any OCR) and recorded in receipts_all.json by your own process; checking that the lines sum to the printed total before recording is strongly recommended.

Returns {new_count, saved:[{date, store, total, path}], missed:[...], next_step}.

Inputs: months_back.

delhaize_fetch_promotionsA

Read this week's public Delhaize promotions listing (store context from the saved profile) and save each page's raw data into promos_inbox//.

Not read only: it writes JSON files into promos_inbox. It never edits anything else and never judges products; parsing the capture is left to your own code.

Returns {pages, tiles, api_bodies, out_dir, stopped, next_step}.

Inputs: max_pages.

delhaize_list_receiptsA

List Delhaize receipts for the current month and the previous months_back months, flagging which are not yet in receipts_all.json.

Read only: opens nothing and writes nothing. Use this to preview before fetching. months_back=1 (the default) covers this month and last, which is enough to catch a month boundary.

Returns {count, new_count, receipts:[{date, store, total, points, savings, is_new}]}.

Inputs: months_back.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 5 tools

    Disambiguation4/5

    Each tool targets a distinct action in the receipts lifecycle, but delhaize_fetch_new_receipts and delhaize_backfill_images both 'fetch receipt images' and could be confused at first glance; the descriptions do clarify (new receipts vs. missing photos for existing records).

    Naming Consistency4/5

    All tools share the delhaize_ prefix in consistent snake_case, mostly following a verb_noun pattern (list_receipts, fetch_new_receipts, backfill_images, fetch_promotions). delhaize_auth_status is a minor deviation using a noun-style status name rather than an action verb.

    Tool Count5/5

    Five tools is well-scoped for a focused receipts/promotions workflow, with each tool earning its place (auth check, preview, two distinct fetch operations, promotions fetch). No redundant or filler tools.

    Completeness4/5

    The surface covers the key read/write lifecycle: connectivity check, listing, fetching new receipts, backfilling missing images, and capturing promotions. There is no tool to view/search the existing receipts_all.json corpus or to record entries, though the design intentionally offloads recording to the assistant.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to access content from authenticated web pages by opening a real browser for manual login and session capture. It saves browser profiles locally so users only need to log in once per service for future automated access.
      4
      161 npm
      36
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to securely access a personal Dutch supermarket account, including digital receipts with itemized prices, discounts and VAT, loyalty points balance, and active shopping lists, plus search for nearby stores and products in the grocery catalog.
      20
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Lets AI assistants browse the Continente.pt catalogue, compare prices and sale rules, review favorites and past orders, and safely build a cart while leaving checkout and payment on the website. It runs locally over stdio so credentials and cookies stay on the user's machine.
      15
      491 npm
      50
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables AI assistants to search grocery products, manage shopping carts, and retrieve account, order, delivery, and discount information across multiple European online grocery platforms.
      MIT