fr-grocery-mcp
Integrates with E.Leclerc Drive online grocery shopping through the user's logged-in browser session: search products with prices, unit prices and promotions, read product pages (ingredients, allergens, origin), view and modify the cart (add, set quantity, remove), read order conditions and dated delivery slots, find and select a drive store, and compare carts across retailers to pick the cheapest.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fr-grocery-mcpfind ingredients for bolognese for 4, fill both carts, compare totals"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fr-grocery-mcp
An MCP server that gives an agent domain-level access to the online grocery services ("drive") of French retailers: E.Leclerc Drive and Super U (coursesu.com) today, others through a new adapter. Search products, read their composition, manage the cart, read slots and minimum order amounts, compare carts. Nothing else.
The reasoning (recipes, ingredients, quantities for N people, product choice, price/promotion trade-offs) belongs to the agent. For example:
Order what I need to cook spaghetti bolognese and a four-cheese pizza for 4, at the cheapest of Leclerc and Super U.
The agent builds the list, searches each ingredient at each retailer, fills the carts, then compares them. The order is never placed: slot booking and payment are left to the user, on the site.
This project is not affiliated with, endorsed by or supported by E.Leclerc, Système U or any retailer. It drivesyour own logged-in browser session, at a human pace, for personal use. Retailer sites change without notice and their terms of use apply: use it at your own risk.
Tools
Every retailer tool takes store (leclerc, superu: an enum generated from the configuration).
Tool | Effect | Annotations |
| plugged-in retailers and capabilities; with | read-only |
| products: | read-only |
| product page: | read-only |
| lines ( | read-only |
| store, booked slot, slot attached to the cart, dated next slots (ISO | read-only |
| adds to the quantity already present | |
| sets the quantity (0 = removal) | idempotent |
| removes the product | destructive, idempotent |
| stores around a postcode or town (if the retailer supports it) | read-only |
| selects and remembers the active store | idempotent |
| each retailer's cart: total, lines, minimum and missing amount, next slots; sorted from cheapest to most expensive | read-only |
Every change reads the cart back and returns confirmed: true if the site holds the targeted quantity.
Results are typed (outputSchema + structuredContent) and the server sends instructions describing the flow to
the agent. A cap of 50 units per product guards against unit mistakes.
Errors (isError, error field): ValidationError (fix the call), NotSupportedError (the retailer does not
support it), SessionExpiredError (log in again in Chrome), SiteBlockedError (anti-bot: stop),
TransientError (retried automatically, then reported).
Product labels, promotion texts and search terms stay in French, as on the sites.
Capabilities per retailer
Capability | E.Leclerc Drive | Super U |
Search, cart, promotions | yes (immediate, multibuy, Ticket) | yes (immediate, multibuy, Carte U) |
Product page | ingredients, allergens, origin | ingredients, origin |
Store selection from the agent |
| no: on the site |
Minimum order | not exposed when logged out | yes |
Slots | next slot, cart date | next slots, booked slot |
Related MCP server: Rohlik MCP Server
Requirements
Node ≥ 26 (runs TypeScript natively: no build step). With mise:
mise install --lockedinstalls the version recorded inmise.lock.A Chrome started with
--remote-debugging-port=9222and logged in to the sites (mise run chromestarts a dedicated profile in~/.fr-grocery-mcp/chrome). One tab per site is found, or opened, by its domain.
Requests go through the browser session, one at a time and spaced out: the server replays what the site does on a click (see docs/retailers/). No protection is bypassed: an anti-bot block stops the server, it is never retried.
Configuration
FR_GROCERY_CONFIG points to a JSON file. Without a file, only Super U is plugged in.
{
"chrome": { "port": 9222, "timeoutMs": 30000 },
"stores": [
{
"retailer": "leclerc",
"store": {
"storeId": "123456",
"retrievalPointId": "123456",
"host": "fd7-courses.leclercdrive.fr",
"name": "My Leclerc Drive"
}
},
{ "retailer": "superu", "minIntervalMs": 300 }
]
}The order of the retailers is the order of preference. minIntervalMs sets the spacing between requests (default:
1000 ms for Leclerc, 300 ms for Super U). Your Leclerc store's values can be found with find_stores /
set_store: the store picked with set_store is remembered in $FR_GROCERY_STATE_DIR/leclerc-store.json
(default ~/.fr-grocery-mcp) and takes precedence over the configuration. FR_GROCERY_CHROME_PORT overrides the port of
the file. The Super U store is chosen on coursesu.com.
Usage
Claude Code (.mcp.json):
{
"mcpServers": {
"fr-grocery-mcp": {
"command": "node",
"args": ["/path/to/fr-grocery-mcp/src/main.ts"],
"env": { "FR_GROCERY_CONFIG": "/path/to/fr-grocery-mcp.json" }
}
}
}Manual inspection: npm run inspect (MCP Inspector).
Development
npm ci
npm run check # typecheck + lint + tests with coverage thresholds
mise run lint # the git hook's ruleset on the whole repository (what CI runs)
npm test # unit, adapter contract, integration (no access to the sites)
npm run doctor # real sites, read-only: session, search, product page, cart per retailer
npm run test:live # real sites: changes then removes an item that is not in the cart
LIVE_STORES=leclerc npm run test:live
npm run fixtures -- leclerc # captures a retailer's reference pages again
npm run format # BiomeArchitecture and technical choices: docs/architecture.md. Adding a retailer: docs/adding-a-retailer.md.
Contributing
Issues and pull requests are welcome: see CONTRIBUTING.md for the setup, the code rules and what
npm run check must show before a pull request. main is protected and CI must be green.
Security
Please report vulnerabilities privately through the repository's Security tab, never in a public issue: see SECURITY.md.
License
MIT. The E.Leclerc Drive adapter builds on knowledge from mcp-leclerc-drive (MIT): see NOTICE.
Available Tools
11 toolsadd_to_cartAdd to cartA
Adds units of a product on top of those already present, then reads the cart back to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) | |
| quantity | No | sale units to add | |
| product_id | Yes | retailer product identifier (id field of search_products) |
Output Schema
| Name | Required | Description |
|---|---|---|
| line | Yes | |
| store | Yes | |
| confirmed | Yes | true if the cart read back holds the targeted quantity |
| product_id | Yes | |
| cart_total_eur | Yes | |
| expected_quantity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation, open-world behavior, and non-idempotency. The description adds useful context beyond them by clarifying that quantities accumulate and that the cart is read back afterward to confirm the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single focused sentence with no filler. The key accumulation behavior is front-loaded and immediately followed by the read-back confirmation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values, and annotations cover the safety profile. It clearly describes the mutation and read-back behavior, though it could have explicitly contrasted with set_quantity for fuller guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter schemas already document product_id, store, and quantity. The description reinforces the quantity increment concept but adds no syntax, constraints, or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb and resource: it adds units of a product to the cart. The phrase 'on top of those already present' clearly establishes increment semantics, which meaningfully distinguishes it from the sibling tool set_quantity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The increment behavior implies when to use this tool rather than set_quantity, but the description never names that alternative or states explicit when-not conditions. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_cartsCompare cartsARead-only
Reads each retailer's cart: total, lines, minimum order and missing amount, next slots. Sorted from cheapest to most expensive.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | targeted fulfilment mode | drive |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| stores | Yes | |
| cheapest | Yes | retailer with the cheapest non-empty cart |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: it reports the sorting order (cheapest to most expensive) and highlights derived values like 'missing amount' that the agent can rely on for comparison reasoning. It does not mention failure modes when a retailer cart is empty or unreachable, which is a gap for an open-world read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first front-loads what is read and what fields come back, the second gives the ordering guarantee. Nothing is repeated from the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't enumerate return values, and annotations cover the read-only/open-world profile. What's missing is scope framing — which retailers are included, and what happens when a cart is missing or a retailer has no slots — which matters for an open-world comparison tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'mode' parameter is documented with an enum (drive/delivery) and a description, so the schema carries the semantics. The description never mentions fulfilment mode, so it adds nothing about how drive vs delivery changes which carts are read or what slots are returned — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('reads') and a clearly scoped resource ('each retailer's cart'), which implicitly distinguishes it from the singular get_cart sibling by emphasizing cross-retailer aggregation. It also enumerates the fields read (total, lines, minimum order, missing amount, next slots). It stops short of naming the sibling it contrasts with, so the differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use statement or alternative is named. The plural 'each retailer's cart' and the sorting hint imply the tool is for cross-retailer comparison rather than inspecting one cart, but the agent must infer that get_cart is the single-retailer alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_storesFind a storeBRead-only
The retailer's stores around a postcode or town, nearest first (if the retailer supports it, see list_stores).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | postcode or town, e.g. "75011" | |
| store | Yes | retailer (see list_stores) |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| store | Yes | |
| locations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds one genuinely useful behavioral fact — results are ordered nearest first — but says nothing about search radius, result limits, or behavior when no store matches the query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler, and the key scoping information (around a postcode/town, nearest first) is front-loaded. The trailing parenthetical is a little ambiguous in what it is qualifying, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two required params, full schema coverage, an output schema, and read-only annotations, the description covers the essentials. It is still thin on the operational details an agent would want — search radius, result count, and how to react to the 'retailer doesn't support nearest-first' case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with 'query' documented as a postcode or town with an example and 'store' as an enum pointing to list_stores. The description adds nothing beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (stores) and the scoping (around a postcode or town, nearest first), which distinguishes it from the sibling list_stores. It is a noun phrase with no explicit verb, but an agent can still tell it is a proximity lookup rather than a full listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(if the retailer supports it, see list_stores)' points at an alternative, but only obliquely — it does not say when to prefer find_stores over list_stores, or what to do if nearest-first ordering is unsupported. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cartRead the cartARead-only
Reads the retailer's actual cart: lines (id, label, quantity, line total, unit price) and total.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) |
Output Schema
| Name | Required | Description |
|---|---|---|
| lines | Yes | |
| store | Yes | |
| total_eur | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-dependency profile are covered. The description adds the returned content (line fields and total), but that overlaps with the output schema, and it says nothing about empty-cart behavior, auth/store-selection requirements, or failures on a live retailer call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and object, with the field list kept compact. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, one-parameter tool with an output schema and annotations covering safety and open-world access, the description is close to sufficient. The only real gaps are edge-case behavior (empty cart, unselected store), which are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with an enum and 100% schema description coverage pointing to list_stores, so the schema carries the meaning fully. The description adds nothing about the store parameter, which is the correct baseline-3 outcome when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Reads') and resource ('cart') and qualifies it as 'the retailer's actual cart', which signals live retailer state rather than a derived view. It does not explicitly distinguish itself from the closest sibling, compare_carts, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word 'actual' hints this fetches the live cart as opposed to the comparative view in compare_carts, and the surrounding siblings (add_to_cart, set_quantity, remove_from_cart) are obviously mutations. No explicit when-to-use, prerequisites, or named alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_conditionsOrder conditionsARead-only
Reads, for one retailer or all of them (store omitted), the selected store, the booked slot, the next pickup and delivery slots (structured dates) and the minimum order. Books nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | retailer; omitted = all of them, one after the other |
Output Schema
| Name | Required | Description |
|---|---|---|
| stores | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it confirms no booking occurs and explains that omitting 'store' causes retrieval for all retailers 'one after the other', which is a useful operational detail not obvious from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence that begins with the verb and quickly enumerates the returned data. It is efficient and contains no filler, though the parenthetical '(structured dates)' is slightly awkward and the sentence is dense enough that a bit more structural separation would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and read-only annotations, the description covers the essential scope: what is returned, that store can be omitted to cover all retailers sequentially, and that no booking side effect occurs. It does not need to explain return values further, though it could briefly mention whether authentication or store preselection is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one optional parameter and 100% schema description coverage, the schema already fully documents the 'store' enum and the omitted-equals-all behavior. The description restates the same omitted-store behavior but adds no further syntax or semantic detail, so it meets the baseline for high schema coverage rather than exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reads') and resource ('order conditions'), then enumerates exactly what is returned: selected store, booked slot, next pickup and delivery slots, and minimum order. This clearly distinguishes it from sibling tools like get_cart, set_store, and add_to_cart, which deal with cart contents and store selection rather than informational order conditions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read-only informational nature and the closing 'Books nothing', which signals it should be used to inspect conditions rather than perform a booking. However, no alternatives are named and there is no explicit when-to-use/when-not guidance relative to siblings such as set_store or get_cart, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productProduct detailsARead-only
Reads a product page: ingredient list (allergens in capitals, possible traces), allergen statement if the site provides it, and origin. Ingredients are null for a raw product (fruit, fresh meat).
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) | |
| product_id | Yes | retailer product identifier (id field of search_products) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| store | Yes | |
| origin | Yes | origin declared on the product page, if any |
| allergens | Yes | separate allergen statement, if the site provides it |
| ingredients | Yes | ingredient list as displayed (allergens in capitals); null for a raw product |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior, and the description adds genuinely useful data semantics: allergens rendered in capitals, possible traces, and that ingredients are null for raw products (fruit, fresh meat). That nullability caveat prevents a misread of the response, though error/not-found behavior is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and then the return content, with the null caveat last as a qualifier. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be explained, and the description still adds semantics the schema can't convey. Slightly short on edge cases — what happens if the product isn't carried by the store or if the page fails to parse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters documented and one enum ('superu'), so the schema carries the load. The description adds no parameter-level detail beyond what the schema already says (store and product_id sourcing).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reads a product page') and then enumerates exactly what is returned: ingredient list, allergen statement, origin. This distinguishes it from list/search siblings by making it clearly a single-product detail fetch, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent infers it is the detail follow-up after search_products (the schema, not the description, points at search_products for product_id). The description offers no when-to-use/when-not-to-use statement or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storesAvailable retailersARead-only
Lists the plugged-in retailers and their capabilities (product page, store selection, minimum order, booked slot). With check: true, also checks that each session responds and shows the active store.
| Name | Required | Description | Default |
|---|---|---|---|
| check | No | query each site (read-only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| stores | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds useful behavior: check: true actually queries each site and verifies session response and active store. It does not discuss latency, rate limits, or failure behavior, but it adds meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the main purpose and followed by the conditional check behavior. Every clause contributes useful information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a low-complexity, one-parameter read-only listing tool, the description is nearly complete, though a brief differentiation from find_stores would remove residual ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes check as querying each site read-only. The description adds that check: true checks session responsiveness and active store, giving the parameter more operational meaning than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it lists plugged-in retailers and names their capabilities such as product page, store selection, minimum order, and booked slot. This clearly separates it from sibling tools like find_stores, get_product, or cart operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use: inspect configured retailers and their capabilities. It also explains the conditional use of check: true to verify session responsiveness and active store, though it does not explicitly contrast with find_stores or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_cartRemove from cartADestructiveIdempotent
Removes a product from the cart entirely, then reads the cart back.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) | |
| product_id | Yes | retailer product identifier (id field of search_products) |
Output Schema
| Name | Required | Description |
|---|---|---|
| line | Yes | |
| store | Yes | |
| confirmed | Yes | true if the cart read back holds the targeted quantity |
| product_id | Yes | |
| cart_total_eur | Yes | |
| expected_quantity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds one useful behavioral fact — that it reads the cart back, revealing the post-mutation state — but says nothing about failure modes or what happens if the product isn't in the cart.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action front-loaded and the read-back behavior appended. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, annotations covering destructiveness and idempotency, and complete parameter documentation, the description supplies what is missing: the fact that the response reflects the updated cart. Slightly more on error/no-op cases would be ideal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both product_id and store documented and store enum-constrained, so the schema carries the burden. The description contributes no additional parameter meaning, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Removes') plus resource ('a product from the cart') and a scoping word ('entirely') that implicitly distinguishes it from set_quantity. It does not name a sibling explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'entirely' implies this is the tool for full removal rather than quantity adjustment, but no alternative is named and no when-not condition is stated. Usage is only inferable from the wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch productsARead-only
Searches the retailer's catalogue. For each product: id, label (brand and size included), price, price per kg/l/piece, availability, typed promotions (immediate, multibuy, loyalty) and best net offer.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | maximum number of products | |
| query | Yes | short search term (in French), e.g. "spaghetti", "boeuf haché 5%" | |
| store | Yes | retailer (see list_stores) |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| store | Yes | |
| total | Yes | products reported by the site, across all pages |
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and scope are covered. The description adds the shape of results (prices, availability, typed promotions), but since an output schema exists this is partly redundant and it says nothing about ordering, paging, or handling of unavailable products beyond the limit parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and then the result fields; nothing is padded. The field list edges toward restating the output schema but remains compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter coverage, and annotations, the definition supplies enough to call the tool correctly. The only real gap is guidance on choosing it over get_product, which would push it higher.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with query examples in French, the store enum pointing to list_stores, and limit bounded. The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Searches') and resource ('the retailer's catalogue'), and enumerates returned fields, making the purpose unambiguous. It does not explicitly distinguish itself from the sibling get_product, which is a single-product lookup, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'Searches'; there is no explicit statement of when to use this versus get_product or other siblings, nor any exclusions. The reader can infer it is for discovery rather than retrieving one known product, but nothing guides that choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_quantitySet a quantityAIdempotent
Sets a product's quantity in the cart (replaces the current one; 0 removes the product), then reads the cart back.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) | |
| quantity | Yes | desired final quantity | |
| product_id | Yes | retailer product identifier (id field of search_products) |
Output Schema
| Name | Required | Description |
|---|---|---|
| line | Yes | |
| store | Yes | |
| confirmed | Yes | true if the cart read back holds the targeted quantity |
| product_id | Yes | |
| cart_total_eur | Yes | |
| expected_quantity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare mutation, idempotency and open-world access), the description discloses that the current value is overwritten, that quantity 0 deletes the line item, and that the cart is read back afterward. That is meaningful side-effect context the schema does not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with parenthetical detail and no filler. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and full parameter descriptions, the description only needs to convey mutation semantics and side effects, which it does. It is complete for the call, though it omits the quantity upper bound (50) and the fact that store is constrained to a single retailer value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description earns an extra point by explaining the special value 0 for quantity, which the schema only implies via minimum: 0 and 'desired final quantity'. Nothing is added for product_id or store, but they are already well documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sets a product's quantity in the cart') and adds the key distinction that it replaces rather than increments. It implicitly separates itself from add_to_cart/remove_from_cart through the replace and 0-removes semantics, but never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The replace semantics and '0 removes the product' hint at when this is preferable to add_to_cart or remove_from_cart, but the description never states the alternative or the condition that selects it. An agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_storeSelect the storeAIdempotent
Selects the retailer's active store among the find_stores results and remembers it. The site session must be on this store: on "session expired", open it on the site.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | retailer (see list_stores) | |
| store_id | Yes | id field of find_stores |
Output Schema
| Name | Required | Description |
|---|---|---|
| store | Yes | |
| selected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety/idempotency profile (readOnlyHint=false, idempotentHint=true, openWorldHint=true), so the bar is lower; the description still adds real value by disclosing that the selection is persisted and that a valid site session is required. The 'session expired -> open it on the site' clause hints at an out-of-band recovery step but is terse about what the agent must actually do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the action and persistence are front-loaded, and the prerequisite follows. Nothing is redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the key prerequisite and failure mode for a stateful selection. It could say more about what happens when a store is already set or when the store_id is not in find_stores results, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so the baseline of 3 applies. The description only reaffirms that the id originates from find_stores and doesn't add format or validation detail beyond the enum and id field already declared.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Selects the retailer's active store') plus the side effect ('remembers it'), and anchors the input to 'find_stores results', which cleanly separates it from the sibling find_stores (search) and list_stores (enumerate).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear this is used with a store taken from find_stores output and states a prerequisite ('site session must be on this store') plus a recovery path for the 'session expired' case. It stops short of naming explicit when-not conditions or the alternative to use if the store is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
add_to_cart - First observed
compare_carts - First observed
find_stores - First observed
get_cart - First observed
get_order_conditions - First observed
get_product - First observed
list_stores - First observed
remove_from_cart - First observed
search_products - First observed
set_quantity - First observed
set_store
TDQS
Scored across 11 tools
Most tools have clearly distinct purposes (cart mutation vs. reading vs. product lookup), but list_stores (retailers) and find_stores (physical locations) are easy to conflate by name alone, and store/slot/minimum-order data is duplicated across list_stores, get_order_conditions, and compare_carts. The descriptions do resolve these overlaps, so misselection is unlikely but possible.
Every tool is snake_case, verb-first, and noun-scoped (list_stores, search_products, get_cart, add_to_cart, set_quantity, remove_from_cart, compare_carts). Verb choices vary appropriately with the action rather than being forced into one pattern.
11 tools sit in the ideal range and each maps to a real step in a grocery workflow: discover retailer, pick store, search/browse products, manage cart lines, read conditions, compare baskets. No tool looks redundant or filler.
The surface covers discovery, product inspection, full cart CRUD (add/set/remove/read), conditions, and cross-retailer comparison, which is coherent for a browsing/assembly server. The notable gap is order placement/checkout and any slot booking, plus no session/login tool despite the 'session expired' note — manageable but a dead end if an agent is expected to complete a purchase.
Maintenance
Related MCP Connectors
Turn any shopping list into a ready-to-checkout grocery cart across 26 European supermarkets.
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Search direct grocery storefronts and create product-link pickup handoffs.
Product search for agents: price, merchant, rating and checkout links across online stores.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search the catalog, manage a cart and usual orders, find delivery slots, and handle favorites, shopping lists, past orders, and item remarks through the store's API, with login and payment left to the user on the website.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, and access account, order, delivery, and discount information across multiple European online grocery platforms.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, retrieve account, order, delivery, and premium information, and get personalized meal suggestions and discounted items across multiple European grocery delivery platforms.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, view orders and delivery information, and get personalized meal and deal suggestions across multiple European grocery delivery services.MIT