handle-mcp
Your AI agent fills the cheapest cart at nemlig.com and BilkaToGo. You pay.
An MCP server: it reads the offers, plans the week on your budget and compares both stores.
It can never order or pay. You do. That code does not exist, and a test fails if it shows up (why).
It counts anonymous usage, and tells you so. No id, no personal data. Off with HANDLE_TELEMETRY=0. Exactly what is sent.
How it works
- Plan. Give your agent a budget. It reads this week's offers on nemlig.com and BilkaToGo, and both stores' recipes, and plans the meals around them.
- Compare. It prices the whole list in both stores: pack sizes, offers, delivery fee and minimum order.
- Fill. It puts the list in the cheapest store's cart, with your login. Only the cart, nothing else.
- Pay. You open nemlig.com or BilkaToGo, check the cart, pick a delivery time and pay.
Taste, budget and meal rules live in your own prompt or skill. The server finds and counts. Build your own skill.
Requirements
- macOS, Linux or Windows (x64). Windows on ARM is not supported yet: a dependency (
cryptography) has no ready-made build for it. - uv. It fetches Python 3.12+ if you do not have it.
- An MCP client, Grok, Claude Code, Claude Desktop or Codex etc.
- An account at nemlig.com or BilkaToGo with home delivery to your address.
Install
uvx handle-mcp@1.5.1 login nemlig
claude mcp add handle -- uvx handle-mcp@1.5.1
Then ask:
- "Plan 5 dinners for 4 within 900 kr, built on this week's offers. Fill the cheapest cart."
- "What is on offer this week? Any free gifts?"
- "Which delivery times are cheapest tomorrow?"
BilkaToGo, Claude Desktop, headless machines and AI agents (handle-mcp login <store> --from-env): setup. nemlig's offers work with no login at all. No terminal? Join the waitlist.
Tools
| Tool | Writes? | What |
|---|---|---|
search_products |
no | Price, price per kg/l, offers |
search_recipes |
no | The store's recipes (nemlig) |
list_recipes |
no | Featured recipes (BilkaToGo: the week's madplan), by tag (nemlig) or by category (BilkaToGo) |
get_recipe |
no | The products to buy for a recipe, for any number of persons |
list_offers |
no | This week's offers and free gifts |
compare_basket |
no | Prices a list in every store, fees included, cheapest first |
get_cart |
no | Cart lines, fees, total, in one store or every store |
set_cart_quantities |
yes | Sets quantities in the cart. Nothing else |
add_recipe_to_cart |
yes | Puts a recipe's products in the cart, after your yes. Nothing else |
get_delivery_info |
no | Chosen time, fees |
list_delivery_slots |
no | Free times, cheapest first |
get_orders / get_order |
no | What you usually buy |
Full arguments and fields: docs/tools.md.
Brugsstatistik
handle-mcp counts, anonymously, how far people get from install to a filled cart, so we can show nemlig.com and BilkaToGo how many carts and kroner it sends them each week. It is on by default and easy to turn off.
What is sent, and nothing else. Every event also has version and date (day only):
| Event | When | Fields |
|---|---|---|
server_started |
the server starts, at most once per machine per day | os (darwin, linux or windows) |
first_tool_call |
the first tool call of the day (a client that only lists the tools sends nothing) | tool (e.g. compare_basket) |
login_ok |
a store answers with your cart, at most once per store per day | store (nemlig or bilka) |
cart_filled |
once per order: after 30 minutes without changes, only when every line went in. Later edits send nothing until the cart is empty again (after checkout) | store, basket_total_dkk (rounded to the nearest 50 kr), item_count |
Never sent: names, addresses, phone, email, logins, product names, order ids or any id for you or your machine. The events go to Umami Cloud over HTTPS. Umami sees your IP address to send the answer back and to guess the country; it does not save the address. Sends run with a 2 second timeout, in the background. A failed send never breaks a tool. The first tool answer on a machine has a telemetry_notice, so your AI tells you about it once. The only file is ~/.config/handle-mcp/telemetry.json: whether the notice was shown, the day each daily event was last sent, and which stores have a counted cart that is not empty yet.
Cart links (url in the cart) carry utm_source=handlemcp&utm_medium=mcp&utm_campaign=cart, so the store sees the visit in its own analytics.
Turn it off with any of:
HANDLE_TELEMETRY=0 # env var
DO_NOT_TRACK=1 # the common opt-out
handle-mcp --no-telemetry # flag
Send the events to your own Umami: HANDLE_TELEMETRY_URL=https://umami.example.com/api/send and HANDLE_TELEMETRY_WEBSITE=<website id>. Why and how: docs/adr/0005.
More
Setup · Skills · Security · Troubleshooting · Testing · Roadmap · Contributing · Credits
Unofficial. Uses the stores' private website APIs, so it can break any day. Not affiliated with nemlig.com or Salling Group.
Metadata
Release files for handle-mcp 1.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| handle_mcp-1.5.1.tar.gz | 289.7 kB | With provenance | Details for handle_mcp-1.5.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| handle_mcp-1.5.1-py3-none-any.whl | Python 3 | none | any | Details for handle_mcp-1.5.1-py3-none-any.whl |
Total release size: 359.7 kB
Release files / handle_mcp-1.5.1.tar.gz
| Download URL | handle_mcp-1.5.1.tar.gz |
|---|---|
| Size | 289.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c8587cf8fc52a06c090a8edf464fc5240919177cba5006e0a78d14152100ba6
|
|
BLAKE2b-256 checksum How to use checksums |
cec662cc52c0860e71e643c4bcc7fc5fbb4727e303d4f2b7bfdb75110806e750
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / handle_mcp-1.5.1-py3-none-any.whl
| Download URL | handle_mcp-1.5.1-py3-none-any.whl |
|---|---|
| Size | 69.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3711ef39ec01eadb14eac34e4ffb56b6dd36feb16cd2c8178cee85fc9c60df66
|
|
BLAKE2b-256 checksum How to use checksums |
a92903c0b25d747b565cbafbba3012b8b74ef1ebf95dfcd06a3428533611a768
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logSecurity for handle-mcp 1.5.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for handle_mcp-1.5.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.