Repository navigation
Releases: andredelgado/continente-mcp
Release list
v0.12.1
Fixed
- Signing in again works with Continente's new "Não sou um robô" check, which appears between the email and the password. Only a person can answer it, so the server never ticks it. When a tool needs to sign in and meets the check, it opens a Continente sign-in window on your computer with your email filled in and answers straight away; you tick the box and press "Avançar", and the window signs in, saves the session and closes. One window at a time, closing after 5 minutes. Where no window can be shown (Linux without a display, or
CONTINENTE_SIGN_IN_WINDOW=0), the tool says to runcontinentept-mcp login --show-browser, which now waits for you to tick the box. Before, sign-in timed out on the password step. ThesignIndetails of a sign-in error gain theconfirm_not_a_robotaction and asignInWindowfield. - The weekly site check opens the sign-in page, without signing in, and checks the email step our login relies on and whether the robot check is loaded. It runs signed out, so it could not see this change before.
v0.12.0
Added
preview_cart_changeslines have the product'spromotions, and the text says what a multi-buy or nth-unit offer means for the planned number of units: "Leve 3 Por 1€: 2 more make it 3 for €1.00", or "applies: 3 for €1.00 in the cart" once it does. The line's estimate stays at the shelf price, as the cart applies these offers.npm run sync:server-jsonbrings the repository'sserver.jsonup to the published release (version, extension URL and checksum), and a test checks it names one release throughout. It listed 0.3.0 until now; the MCP Registry itself was always current.
Dependencies
- Playwright 1.64.1. The server downloads the matching Chromium once, the first time it starts after updating.
- undici 7.30.1 (through cheerio), which fixes several security advisories. The server does not use the affected code, but
npm auditflagged it.
v0.11.0
Added
- docs/stability.md says what 1.0 will promise: the tool contract, what counts as a breaking change, the two lists that can grow (error codes and promotion kinds), and how something is deprecated.
get_cartandpreview_cart_changeshavecheckout: the minimum order the cart states (minimumOrder,meetsMinimum), whether the account has EntregaZero, anddeliveryFee, which isfreewhen EntregaZero applies (orders of €50 or more) and otherwiseset_at_checkout, as the fee depends on the day, slot and area chosen at checkout.preview_cart_changesalso givesproductsAfter, the cart's products total once its lines are applied, and judges the minimum order and delivery on it. The text says, for example, "Minimum order: €20.00, reached." and "Delivery: free with your EntregaZero (orders of €50.00 or more).", or how much is still to go. The weekly site check confirms the €50 EntregaZero threshold on Continente's help pages.
Changed
Contract review before 1.0. These change field names and shapes; clients that read structuredContent need updating.
preview_basketis nowpreview_cart_changes(title "Preview cart changes"): it shows whatset_cart_item_quantitywould do to the cart.- Unknown values are always
nullrather than left out:cartItemIdanddispositionon cart-change results, orderrawDate, a quantity'sreason, andunknownQuantityLines(0 when none) on frequently bought products. list_ordershas onefailureslist, each withstage,orderId,orderNumberanderror;scanFailuresis gone.list_frequently_bought_productsno longer returnsnextCursor, which no input could use. When no order detail can be read, its statistics are inresult.scan, inside the result envelope, instead of beside it.observedAtis on every result that reads the website: alsolist_orders,get_order,list_frequently_bought_productsand the cart-change tools.
v0.10.0
Added
- Promotions (#6). Search results,
get_productand cart lines havepromotions, each with the website's label and akind:recommended_price(PVPR),immediate_discount(withpercentOfforamountOffand the struck-throughpreviousPrice),multi_buy(Leve 3 Por 1€as abundleof 3 for €1.00),nth_unit_discount(20% na 2ª un), orotherfor a label not recognised. Product pages and the cart givevalidFromandvalidTo. Cart lines also havelineTotalBeforeDiscountwhen the cart discounts the line, as for a multi-buy. The text output shows each offer beside the price. Built from 1,384 real tiles and a live cart check; card-only offers did not appear signed in or out.
Changed
- The order tools read a settled order's details only once while the server runs. An order dated 14 or more days ago no longer changes, so its product lines are kept in memory for the signed-in account and reused by
list_frequently_bought_products,list_ordersandget_order; a different sign-in clears them. Recent orders and the order list are always read from the website. For a weekly shopper, a repeated frequently-bought scan of 10 orders loads about 3 pages instead of 11.
Fixed
- A product that appears twice in search results, inside a tile for a family of pack sizes and in its own tile, now takes its prices,
recommendedPriceand promotions from its own tile. Family tiles show "Desde" (from) prices and can carry another pack size's badge, which could give the wrong PVPR; a badge is now kept only when the product's own prices agree with it.
v0.9.0
Added
choose_productslets the user pick between candidate products for the choices an assistant should not make alone. All open choices of a request go into one call (at most 10, 2 to 4 candidates each, with a suggestion). Clients that support MCP Apps, such as Claude and ChatGPT desktop, show a picker with photos, pack, price per kg or litre and availability, in the client's own colours and fonts and usable with the keyboard, and send all the choices back as one chat message, after which it folds into a short list of what was chosen; other clients get a numbered text list. It changes nothing.- Search results and
get_productreturnimageUrl, the product photo on the website. - Search results and
get_productreturnunitPrice, the price to compare products by, with itsbasis: per drained kg, the website's own price per kg or litre, or the pack price divided by its net quantity. get_product_labelsreturnsstatus(complete,partial,noneorerror) andmissingper product, and each label hasnetContentandissues.nutrition_basis_mismatchflags nutrients per 100 ml for a product whose net content is in grams, or the other way round; the values are kept as given, not converted.
Fixed
sort: "unit_price"put packs without a website price per kg or litre last, so a 1 l soy drink at €0.79 came after others at €3.32/l. They are now compared on their pack price over the net quantity. The search text says the sort covers the products returned.emphasisedno longer lists two-letter capitals such asUE, and the docs say plainly that it is typography, not an allergen list.
v0.8.0
Added
clear_cartempties the whole cart in one step with the website's own "remove all" action, instead of removing lines one by one, and confirms that no product lines remain. It needsconfirm: true, does not write to an empty cart, and reports an unknown outcome, never retried, when the result cannot be confirmed.
v0.7.1
Changed
- The server runs on the MCP server package (
@modelcontextprotocol/server2.x) instead of the full SDK, which also installed an HTTP server stack this stdio server never used. Installing it now brings 26 packages instead of 113, and the Claude Desktop extension is about 1.6 MB smaller. Tools, prompts and protocol versions are unchanged; task-augmented tool calls are still refused before they run.
v0.7.0
Fixed
-
get_productreported some products as available that could not be bought: the page's structured data said in stock while its add button was disabled. Availability now follows the page's own add button, with the structured data as a fallback. -
A product page the website redirects to its home page was reported as "no longer sold". It may only be hidden from this session: the same product can open signed in and redirect signed out, or not be sold in your area. The
not_foundmessage now says so. -
Some products sold by the piece but priced per kg, such as onions, were shown in the cart with the wrong number of pieces: 4 onions read as 1, so setting them to 4 always ended with an unknown outcome. For these products the cart's JSON does not count pieces; the quantity is now read from the kilograms on the cart page, and stays unknown when that is not a whole number of pieces.
Changed
- Breaking:
search_productskeeps the website's relevance order. Saved favorites are still markedfavorite: true, but only move to the top with the newfavoritesFirst: true, and then only within the returned products.
Added
-
search_productsfilters bycategory,excludeCategoryandbrand, and sorts byunit_price. Results havebrandandcategory(the website's category path), filtered searches read further pages to filllimit, andunknownToFiltercounts products left out only because the results page gave no category or brand for them. -
search_productsandget_productreturndrainedPrice, the price per kg of drained weight, for packs whose label states a drained weight. -
get_product_labels: ingredients, allergens and nutrition for up to 20 products, as the website's copy of each label declares them. It returns the ingredients verbatim, the words they print in capitals, the allergen and "may contain traces" statements, and nutrients per 100 g or ml. Nothing is inferred. -
Cart and
preview_basketlines havestorefrontQuantityfor products sold by the piece but priced by weight: the kilograms in the cart, which are also the estimated weight.get_carttext shows it, as in "4 un (about 1.16 kg)". -
search_products,get_productandpreview_basketreturncatalogView: whether the result is the signed-in or the signed-out catalogue, which can differ in availability and in which products open. -
Search results have
availability, from the results page:availableorunavailablewhen its "Indisponível" badge and add button agree,unknownotherwise. Unavailable results are marked in the text. -
preview_basket: for a list of products and desired totals, what the cart holds now, whatset_cart_item_quantitywould do, what would be refused and why, availability, pack details and the estimated cost. It changes nothing. -
search_productsacceptscursor: passnextCursorback with the same query to continue right after the last product returned. Following cursors never skips or repeats a result. Before, products read beyondlimitwere dropped andnextCursorcould not be used. -
search_products,get_productandget_cartreturnobservedAt, when the website was read. -
Cart lines and totals have
estimated: products sold by the piece but priced by weight are charged by the weight picked, so their line total, and then the cart totals, are estimates.get_carttext says "about" for them. -
search_productsandget_productreturnpackage, the pack label read into numbers:count,each,net(including any free extra),drainedandapproximate. For example,6 x 1 ltis 6 items of 1 l, 6 l in total. A label with an unknown part givesnull. -
get_productreturnspackageTextandminimumText, likesearch_products, and shows the pack size in its text. -
A
not_authenticatederror before any cart write carriessignIn: whether credentials are configured, what to do next, the settings and command involved, and which tools work without signing in.
v0.6.1
Fixed
- The first request after the browser started could fail with "The order history page was not recognised", or a search error, while the website was still setting up its session. A page that does not show what it should is now loaded once more.
- Order dates with abbreviated months, as the website now shows them ("01 Set 26"), are read. They were all
null. get_productreports a product the website no longer sells asnot_found, instead ofinvalid_data.- After an upgrade, the update check no longer reports an older version as the latest one.
v0.6.0
Changed
- Breaking:
get_cartreturnstotalsinstead oftotal:products,bags,deposit,delivery,discountsandgrandTotal, the amount to pay. The oldtotalleft out the bags, so it was less than the amount to pay. - Breaking: cart line prices are
{ amount, per }price tags, like catalogue prices, plus alineTotal. Products sold by the piece but priced by weight were shown as a price "each" when it was the price per kg.
Added
- Cart lines have a
kind,bagfor the shopping bags the website adds by itself andproductfor everything else. search_productsandget_productreturnrecommendedPrice, the recommended retail price (PVPR) the website shows beside the price on many promotions, so assistants can compare it with the selling price. (#4, thanks @Lozano-Miguel)
Fixed
- Products sold by the piece but priced per kilogram (fruit, vegetables, meat, fish, counter cheese and ham) had no sale rules, so they could not be added to the cart. Their maximum is now read in kilograms, like the minimum and step, and converted to whole pieces.
- Cart quantities now have a unit. They were all reported as
unknown; each line's unit now comes from its own sale rules, so a weighted line reads as pieces. A cart change is no longer confirmed by a line that reports another unit.