
SuperMCP
Collects supermarket prices from ten Israeli chains so an assistant can compare a real shopping list
6.7Mprice rows in the latest measured dataset
The problem
Israeli law requires every large grocery chain to publish its full price list. The data is public and it is free. It is also unusable: raw XML dumps on ten different portals, each with its own quirks, no shared product identity across chains, and no way to ask it a question. Consumer price-comparison sites read it for humans. Nothing reads it for software.
So every developer who wants an AI assistant to answer "where is this basket cheapest" has to clean up the same feeds again, and most simply skip the idea.
What I built
SuperMCP pulls those feeds into one clean product catalogue that websites and AI assistants can search directly. It currently holds ten chains, 898 branches, 122,575 products, 249,106 chain listings, 6.7 million prices and 1.07 million promotions.
The main call is optimize_basket. You hand it a shopping list in free Hebrew text and a location, and it returns a plan: the best single store, the cheapest complete store, the nearest one, and a multi-store split, with a line breakdown for each.
The bug that shaped the product
The first version ranked stores by what they charged. That is wrong, and the way it is wrong is invisible.
A store only prices the items it stocks. Rank on that total and the store missing the most expensive thing in your basket looks cheapest. A real Herzliya basket recommended a shop at 92.86 shekels over one at 171.42, purely because it did not carry a 71.60 tuna line.
Every plan now also carries a comparableTotal: the same basket priced at every store, using each store's own price where it has one and the median market price where it does not. Imputed lines are counted and reported, and ranking charges a surcharge when a store leaves lines unpriced, because finishing the list somewhere else is a second trip. Lines also carry a normalised price per 100g, 100ml or piece, so a small pack cannot win on shelf price alone.
Conditional prices
The feeds carry about 54,000 active coupon promotions and only around 250 of them are marked as loyalty-card prices. Everything else was being applied silently. One real case priced a 5.90 shekel cottage cheese at 1 shekel under a clipped-coupon promotion, which wins any cheapest-store comparison and then surprises the shopper at the till.
Club-only and coupon-only lines are now flagged on every plan and can be switched off entirely. On a real Herzliya basket, turning them off changes both the winning store and the price.
Built for a model, not a browser
The response is sized for an agent's context window. The default detail level keeps the full line breakdown for one plan, drops per-line diagnostics, and caps that plan at 25 lines while still reporting the true count. Measured: 12 items is about 12KB, 30 items about 26KB, 50 items about 32KB.
Search matches both exact words and similar products, so different wording can still find the right item. Product matches are prepared ahead of time and repeated searches are saved, which keeps lookups fast.
Distances are labelled rather than faked. Each store says whether its distance is exact, from a branch address, or approximate, from the city centre. Removing approximate locations would lose about 45 per cent of the catalogue, including entire discount chains, so they stay in with a clear margin for uncertainty.
Open source
Apache-2.0, and it can run entirely on your own servers. The repository contains no path into any hosted environment: production hostnames and secrets live in the hosting environment only. The data documentation is deliberately blunt about the one thing that is not settled, which is whether an API built over mandated public data can be commercially redistributed.



