SuperMCP
Server Details
Israeli online supermarket pricing: compare grocery prices and delivered shopping baskets.
- Status
- Healthy
- Uptime
- 100.0% over 75 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Server Listing
- super-mcp
TDQS
Scored across 8 tools
Each tool has a fairly distinct role, and the descriptions go to unusual lengths to draw boundaries (e.g. list_delivery_options vs optimize_delivery, search_products vs suggest_similar_products). However, split_order overlaps heavily with optimize_delivery's splitOrder field, and get_delivery_terms overlaps with list_delivery_options on fee/terms data, so a couple of pairs can still be confused.
All eight names follow a consistent snake_case verb_noun pattern: get_*, list_*, search_*, optimize_*, split_*, suggest_*. No mixed conventions or stray casing.
Eight tools is well within the ideal 3-15 range and each maps to a clear step in the delivery-pricing workflow (discover stores, search products, price a basket, split orders, correct mismatches).
The surface covers the core lifecycle: store discovery, product lookup, promotions, basket pricing, split ordering, and mismatch correction, with handoffUrl handling checkout. Minor gaps remain (no explicit category/brand browsing or store lookup by name outside address-based listing), but agents can work around them.
Available Tools
8 toolsget_delivery_termsGet one storefront's delivery termsARead-onlyInspect
The full published terms for a single online storefront: every fee band over basket size, the minimum order, the service area, and where each figure came from. Use to explain a deliveryFee an optimize_delivery plan reported, or to answer 'what do I need to spend for free delivery?'. Take the slug from a plan's serviceSlug. catalogSize and catalogVisibility are reported here only when already known: this tool answers from published terms and never waits on the item count. A null in either means one of two things, and they are not interchangeable: we hold no priced store for this storefront, OR the count has not been taken yet. Call list_delivery_options for a count you can rely on being present; never read a null here as an empty shop.
| Name | Required | Description | Default |
|---|---|---|---|
| service_slug | Yes | Storefront slug, e.g. 'shufersal-online' — from a plan's serviceSlug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish it as a read-only, non-destructive, open-world lookup, but the description adds real behavior: it answers from published terms and never waits on the item count, and it explains that a null catalogSize/catalogVisibility has two non-interchangeable meanings. That null-handling contract is the kind of detail annotations cannot convey. It stops short of describing pagination or freshness/latency of the published terms.
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?
Front-loaded with the purpose, then usage, then the caveat about nulls; every sentence carries information. It is somewhat dense and the null discussion runs long, but nothing is 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?
No output schema exists, so the description carries the return-value burden and does so: it names the returned fields, their provenance, and the semantics of null catalog fields. An agent has enough to call and interpret the result correctly.
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 100% schema coverage and a single required parameter, the schema already documents service_slug including the 'shufersal-online' example. The description's 'take the slug from a plan's serviceSlug' restates the schema rather than adding new syntax or constraints, 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 and resource ('the full published terms for a single online storefront') and enumerates the payload (fee bands, minimum order, service area, provenance), which cleanly separates it from list_delivery_options and optimize_delivery.
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?
Gives two concrete use cases (explaining a deliveryFee from an optimize_delivery plan, answering the free-delivery threshold question), names the alternative for counts (list_delivery_options), and warns against the wrong inference from a null.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet productARead-onlyInspect
Fetch full detail for one canonical product by product_id (UUID) or GTIN barcode, including every per-chain listing (chain-specific item code, display name, and package size). Use after search_products to confirm identity, or directly when the GTIN is already known. Each listing carries orderable: false means no delivery or pickup storefront prices it, so it cannot be bought through this API. A listing is catalogue identity, not availability: never present an orderable: false chain as somewhere the shopper can buy. When every listing is orderable: false the product is not purchasable right now, whatever its chains suggest.
| Name | Required | Description | Default |
|---|---|---|---|
| gtin | No | GTIN/barcode, used only if product_id is omitted. | |
| product_id | No | Canonical product UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/open-world safety profile; the description goes well beyond that by decoding the `orderable` flag, warning that a listing is catalogue identity rather than availability, and forbidding presenting an `orderable: false` chain as purchasable. Since no output schema exists, this is the only place that semantics is disclosed.
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?
Front-loads purpose and the routing rule before the longer `orderable` explanation, and every sentence carries real meaning. Slightly long, and the final aggregate sentence partially overlaps the earlier warning, but nothing is 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?
With no output schema and zero required parameters, the description supplies exactly what is missing: the shape of the response (per-chain listings with item code, name, package size) and the interpretation of the `orderable` flag. An agent can call and correctly use the result without further context.
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 documents the UUID format and the precedence rule ('used only if product_id is omitted'). The description restates the same keys and formats without adding new syntax or constraints, so the 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?
Names a specific verb and resource ('Fetch full detail for one canonical product') and identifies both lookup keys (product_id UUID or GTIN barcode). It also lists the returned content (per-chain listing with item code, display name, package size), which separates it cleanly from search_products.
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?
Explicitly states when to call it: 'after search_products to confirm identity, or directly when the GTIN is already known.' The sibling tool search_products is named and the condition selecting this tool over it is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_promotionsGet promotionsARead-onlyInspect
List promotions (e.g. '2 for 30₪', club-member price, second-unit discount), optionally filtered by store_id or product_id, and by active=true to only return promotions currently running. Use this to explain why an optimize_delivery line price is lower than list_price.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English (also accepts CBS locality codes). Restricts to promotions at stores in that city plus chain-wide promotions of chains present there. | |
| limit | No | Max promotions to return, ordered by soonest end date. Defaults to 50, max 200. | |
| active | No | If true, only currently-active promotions. Defaults to true. | |
| store_id | No | Filter to promotions at this store. | |
| product_id | No | Filter to promotions covering this canonical product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds the semantic point that promotions explain discounted line prices, but says nothing about result ordering, pagination, or data freshness beyond what the schema already states.
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 with the resource and filters front-loaded; the parenthetical examples earn their space by clarifying promotion kinds. Slight redundancy with schema-documented filters keeps it just below a perfect score.
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?
No output schema exists, so the description bears some burden for return semantics; the parenthetical promotion examples and the list_price linkage give an agent enough to interpret results. It could still say more about the shape of returned promotions, but combined with full schema coverage and read-only annotations it is adequately complete.
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 parameters are well documented there (city semantics including chain-wide promotions, limit defaults/max, active default). The description merely restates store_id, product_id and active, adding no syntax or interaction detail 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 and resource ('List promotions') and immediately grounds it with concrete examples of promotion types ('2 for 30₪', club-member price, second-unit discount). The cross-reference to optimize_delivery line price vs. list_price lets an agent place this tool relative to a sibling without opening any schema.
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?
Gives a clear trigger scenario: use it to explain why an optimize_delivery line price is below list_price, and names the sibling involved. It stops short of stating when NOT to use it or naming alternative lookup paths (e.g. get_product), so it is strong context without full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_delivery_optionsList storefronts that deliver hereARead-onlyInspect
Which Israeli online supermarkets deliver to an address, with each one's delivery fee, minimum order, free-delivery threshold and whether it offers click-and-collect — without pricing a basket. Use for 'who delivers to me?'. For 'what will my shopping cost delivered?', use optimize_delivery instead. Every entry carries deliveryTerms.confidence and verifiedAt; quote a fee only when it is verified or reported, and say the fee is unknown otherwise. Every entry also carries catalogSize (priced items we hold) and catalogVisibility. catalogVisibility 'partial_index' means WE cannot see the whole shop: that storefront's prices are read off a website that cannot be paged, so catalogSize is the part we indexed and says nothing about how much the retailer stocks. 'full_catalogue' means the count is the retailer's complete published price file. Never recommend a storefront on its delivery fee alone: one where we hold a few hundred items cannot fill a normal basket, so price the basket with optimize_delivery before naming a winner. An entry carrying notesRef instead of notes shares its terms with other storefronts: read the text from sharedNotes[notesRef]. Marketplace terms are written once per chain and held per venue, so they would otherwise repeat verbatim on every branch.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English. Enough for chains that publish a settlement list, not enough for a storefront whose area is a polygon or a depot radius. | |
| near | No | 'lat,lng' string, e.g. '32.078,34.774'. Do not combine with address. | |
| chain | No | Filter to one chain, by its name as it appears in chainName (שופרסל) or by its legal barcode id. A value matching neither returns no options, which is not the same answer as nobody delivering here: omit it to see every storefront. | |
| address | No | Delivery address in Israel, free text, e.g. 'מנדלסון 1, תל אביב'. Preferred: some storefronts publish a service area that only a street address can be tested against. | |
| include_unavailable | No | Also return storefronts that do NOT serve this address, each with a reason. Useful for explaining why a well-known chain is missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, openWorld), but the description adds substantial behavior the annotations do not: confidence/verifiedAt gating on quoted fees, the meaning of catalogVisibility 'partial_index' vs 'full_catalogue', notesRef/sharedNotes indirection, and the chain-level deduplication of venue terms. This is exactly the extra context the low annotation bar rewards.
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 routing rule and the fee-confidence caveat are front-loaded ahead of the data-model explanation, which is good ordering. The description is dense and long, but nearly every sentence carries a distinct operational instruction rather than 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?
There is no output schema, so the description must carry return-value semantics — and it does, documenting confidence, verifiedAt, catalogSize, catalogVisibility, notes/notesRef and sharedNotes. Combined with the safety annotations, an agent has everything needed to call and interpret this 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 description coverage is 100% and each parameter already explains its own tradeoffs (city limitation for polygon areas, 'do not combine with address', chain filter returning no options). The description adds nothing parameter-specific, 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?
States a specific verb+resource ('Which Israeli online supermarkets deliver to an address') and enumerates exactly what each entry carries (fee, minimum order, free-delivery threshold, click-and-collect), while explicitly noting it does NOT price a basket. It is cleanly distinguishable from optimize_delivery, which is named directly.
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?
Gives an explicit trigger phrase ('who delivers to me?') and an explicit routing rule for the sibling: 'For what will my shopping cost delivered?, use optimize_delivery instead.' It goes further by warning never to recommend on fee alone and directing the agent to price the basket with optimize_delivery first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_deliveryPrice a shopping list for deliveryARead-onlyInspect
Price a whole shopping list at every Israeli online supermarket that delivers to an address, and rank them on what the order actually costs: items + delivery fee + service fee. Takes the full list in one call; pricing lines separately loses the per-order fees. This is SuperMCP's shopping-list tool for online supermarket delivery. The answer depends mostly on the shopper's destination, and a city is enough: of the 531 towns whose coverage we hold, 386 are served by exactly one chain. A call with a destination is also much cheaper, comparing the handful of storefronts that reach one town instead of every storefront in the country. Without a destination it returns status=needs_destination: the same list priced at every storefront in the country, carrying only what an address does not decide — each storefront's shelf prices, its own delivery fee and its minimum order. None of them was tested against a service area, so that reply names no cheapest, carries no handoffUrl and is not a recommendation; it is a price range, and who delivers to this shopper is still unknown. Send {continuation, city} or {continuation, address} to get the storefronts that actually reach them. The headline figure is deliveredTotal, not the item subtotal: a ₪35.90 delivery fee outweighs most price differences between chains. But the ranking uses deliveredComparableTotal, not deliveredTotal: totalScope is priced_lines_only, so a storefront that stocks four of your twelve items reports a small deliveredTotal precisely because it cannot fill the basket. Check pricedLines against requestedLines and say when the coverage is partial. A gap has two possible reasons and catalogVisibility says which. 'full_catalogue' means catalogSize is the retailer's complete published price file, so a line it did not price is a line it does not stock. 'partial_index' means we cannot see the whole shop, because its prices are read off a website that cannot be paged, so the gap may be ours and the shop may well carry the missing items. Both fields are null when the count has not loaded yet, which is not an empty shop. Read deliveryTerms.confidence before quoting: 'verified' was read from the retailer's own binding terms, 'reported' from a cited secondary source, 'unknown' means no fee is established and the ranking used an assumption (assumedDeliveryFee) that must not be repeated as a price. Anything other than verified or reported withholds the whole quotable tariff page, not just the fee: deliveryFee, freeDeliveryThreshold and nextFeeBreak all come back null together, because all three are read off the page we just declined to stand behind. Never fill one of them in from get_delivery_terms and quote it beside a fee this plan refused to give. minimumOrder is gated differently on purpose, lapsing only once the figure is past its 90-day recheck, so its presence is not evidence the fee beside it can be quoted. deliveryFeeIsFloor=true means the fee is a published lower bound, so quote it as 'from ₪X' and treat deliveredTotal as a minimum. meetsMinimum=false means the order cannot be placed as it stands; report amountToMinimum, the top-up needed. Those plans are still listed, after the orderable ones, so present them as options that need topping up rather than hiding them. Of several branches of one marketplace chain that all sit under their minimum, the one listed is the cheapest that is also nearest to its minimum, so the top-up you report is the smallest on offer there. Rank on cheapestDelivered only if the shopper will happily order twice: it prices missing lines at a market reference. bestSingleOrder is the fullest basket obtainable in one order. Both, and bestVerifiedTerms, carry totals only: find the storefront in plans by serviceSlug for its priced lines. When nextFeeBreak.worthTopUp is true, spending a little more makes the order cheaper overall — say so. A line carrying cheaperAlternative can be met for less at the same shop: it names the product, how many packs, what the line would cost instead, and the saving, promotions included. Every one is cheaper per 100g/ml/piece as well as per line, so it is a genuine saving rather than a smaller pack, and the saving can be quoted as it stands. It is a different product, so it is the shopper's choice and is never substituted on its own. Pin one by calling again with its productId. splitOrder, when it is not null, is the same list bought from two shops instead of one, with each leg's items, fees and its own handoffUrl. reason='cheaper' means it saves money after both delivery fees; reason='more_of_the_list' means no one shop stocks everything and the second order fills the gap at extra cost, which saving reports as a negative. null means one order is the right answer here. If the shopper says a priced line is wrong, call suggest_similar_products with their Hebrew words and the rejected product_id, then call this tool again with that product_id on the line. Storefronts that cannot serve this basket come back in unavailableStores with a reason. By default only the actionable ones are listed: below_minimum_order, and price_feed_stale for a chain that delivers here but has published no prices for over a fortnight, which is therefore not in plans at all and must not be presented as an option. A plan flagged priceFeedStale is a milder case, over a week old: still worth comparing, but quote it as what the shop last published on priceFeedAsOf. If no storefront inside the fortnight can take the order, the abandoned ones come back in plans rather than leaving the shopper with nothing, and notes says so. unavailableStoresOmitted counts the rest, all ruled out on the address alone. A plan may carry venues: branches of one marketplace chain that priced this basket identically, collapsed into one row. Any slug in it works with get_delivery_terms. venuesOmitted counts further branches of that chain left out because each costs more and fills no line this row is missing. None of their figures are here and this row's are not theirs, so never quote a price for them; list_delivery_options names them all. By default only the recommended storefronts carry a lines breakdown; every other plan reports its totals and pricedLines with lines: []. That is not a gap — re-call with response_detail=standard only if you must compare the same item's price across chains. When the shopper settles on a storefront, give them that plan's handoffUrl: it opens the whole basket as one Hebrew page, every line with its price and its own product link. Hand over that one link rather than the per-line link fields, which leave the shopper opening a tab per item. Say that the page shows the prices this answer was built on.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English. Enough for chains that publish a settlement list, not enough for a storefront whose area is a polygon or a depot radius. | |
| near | No | 'lat,lng' string, e.g. '32.078,34.774'. Do not combine with address. | |
| items | No | The shopping list. Required unless resuming with a continuation. | |
| intent | No | The shopper's own framing of this shop, in their own words, e.g. 'ברביקיו ל-12 אנשים'. Not a summary of the item list — pass what THEY said the shop was for. Shown on the handoff page next to what was priced. Optional; omit rather than inventing one. | |
| address | No | Delivery address in Israel, free text, e.g. 'מנדלסון 1, תל אביב'. Preferred: some storefronts publish a service area that only a street address can be tested against. | |
| answers | No | One answer per question from the needs_confirmation reply. | |
| slot_type | No | Only two slots exist here: standard (default) is delivery to the door, pickup is click-and-collect, which is cheaper at the chains that offer it but means the shopper travels. Anything else is rejected. | |
| preference | No | cheapest takes the lowest delivered total outright; balanced (default) prefers a storefront whose delivery terms we verified when the money is close. | |
| memberships | No | Membership or card the shopper holds that unlocks a cheaper rate, e.g. ['credit_card'] for a Rami Levy card. Without it the public rate is quoted. | |
| continuation | No | Opaque token from a needs_confirmation, preview or needs_destination reply. The shopping list travels inside it, so send it with answers, or with the city or address that answers needs_destination, and nothing else. | |
| include_club | No | Apply loyalty-club item prices. Default true; they are flagged clubOnly. | |
| include_coupon | No | Apply coupon item prices. Default true; they are flagged couponOnly. | |
| resolution_mode | No | fast (default) makes best-effort product choices and reports them in assumptions, each carrying a kind: generic_default (the line named no particular product, so the everyday one is the answer) needs no warning, substitution (the line named a product and got another) does. strict asks before choosing, but only where WE are unsure, so it prices a confidently-wrong line without stopping. preview stops for YOU: it returns status=preview with items and assumptions and prices nothing, then send its continuation on its own to price the same list without resolving it twice. Worth it on a long or unusual list, where pricing every storefront is the expensive half and a wrong pick otherwise costs a second full call. | |
| response_detail | No | summary (default) returns the line-by-line breakdown only for the storefronts the recommendations name; it folds marketplace venues that priced this basket identically into one plan carrying venues, drops the branches of a chain that cost more and fill no line a kept branch fills, counting them in venuesOmitted, and replaces the out-of-area storefronts with a count. standard adds the lines for every storefront, every venue and the full unavailable list: ask for it only when comparing the same item across chains. debug adds resolution internals. | |
| max_split_stores | No | How many storefronts the returned splitOrder may spread the list over. Default 2. A third adds a third delivery fee, so it only wins when it reaches items the other two do not stock. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the read-only/open-world profile; the description discloses far more — the needs_destination status and why it is not a recommendation, the confidence gating that nulls deliveryFee/freeDeliveryThreshold/nextFeeBreak together, priceFeedStale and price_feed_stale semantics, default lines:[] behavior, and the rule that venue rows must never be quoted. This is exactly the beyond-annotations context the dimension rewards.
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?
Front-loaded correctly, but it runs to roughly a thousand words of undifferentiated prose with no headings or grouping — return-shape detail, fee-gating rules, split-order logic and handoff advice all in one block. Much of it is valuable, but the size imposes a real context cost and many sentences do not earn their place at this length.
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 15 parameters, no output schema and no required fields, the description carries the whole burden and does: it documents deliveredTotal vs deliveredComparableTotal, plans vs unavailableStores, venues/venuesOmitted, splitOrder reasons, and the handoffUrl handover. An agent has what it needs to call and to interpret the reply.
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 3 is the floor, but the description adds interaction semantics the schema cannot express: continuation travels with answers or with the city/address 'and nothing else', response_detail controls which plans carry a lines breakdown, and resolution_mode's preview is a two-call protocol. Individual field meanings are left to 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?
Opens with a specific verb and resource — price a whole shopping list at every Israeli online supermarket that delivers to an address, ranked on items + delivery fee + service fee. It also positions itself against siblings by naming list_delivery_options, get_delivery_terms and suggest_similar_products in the flow of guidance, so an agent can tell what this tool owns versus what they own.
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?
Explicit routing conditions throughout: pass the full list in one call rather than pricing lines separately; send {continuation, city} or {continuation, address} to resume; use response_detail=standard only when comparing the same item across chains; use preview on long or unusual lists; never backfill a withheld fee from get_delivery_terms; call suggest_similar_products then re-call this tool when a line is rejected. Alternatives and exclusions are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch productsARead-onlyInspect
Search the canonical product catalog by free text (Hebrew or English), brand, category, or exact GTIN, and answer 'how much is X' for a SINGLE item. Also matches chain listing names. Send city or address and every hit comes back priced: fromPrice is the lowest it goes for at any storefront delivering there, so quote it as 'from ₪X across N storefronts' (pricedAtStorefronts) and never as one national price — there is no such thing here. pricedAtStorefronts=1 is one shop's price, not a market rate. normalizedUnitPrice is that same money per 100g/100ml/piece: compare on it, NOT on fromPrice, because a smaller pack is cheaper to buy and usually dearer per gram. Results come back cheapest per unit first. fromPrice is the ordinary price, never a loyalty-club or coupon rate. Without a location nothing can be priced and the price fields are absent. For a whole shopping list call optimize_delivery ONCE with query items — never price lines one by one here, and never add these prices up: they come from different storefronts and each carries its own delivery fee. After optimize_delivery priced the wrong product, call suggest_similar_products with the shopper's Hebrew words and the rejected product_id, then call optimize_delivery again with that product_id. Returns canonical products (not per-chain detail); call get_product for listings.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English (also accepts CBS locality codes). Aliases resolve to one place — e.g. 'הרצליה', 'Herzliya', and '6400' are the same filter. May be combined with location as a disambiguation hint. | |
| gtin | No | Exact GTIN/barcode to look up. | |
| near | No | 'lat,lng' string, e.g. '32.078,34.774', to find stores near a point. | |
| brand | No | Filter by brand name, partial match. | |
| limit | No | Max results, default 20. | |
| query | No | Free text search, Hebrew or English, e.g. 'חלב תנובה' or 'olive oil'. | |
| category | No | Filter by internal category slug (l1 or l2), e.g. 'dairy'. | |
| location | No | Free-text neighborhood or address in Israel, e.g. 'נווה עמל, הרצליה'. Resolved to coordinates via cached Nominatim. Do not combine with near. | |
| store_id | No | Optional store UUID to prefer locally stocked products. | |
| radius_km | No | Search radius in km around the resolved point. Defaults to 10km when near or location is set. Ignored without a point. | |
| in_stock_only | No | When location is set, return only products with a local price. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/non-destructive; the description adds substantial behavior the annotations cannot carry — pricing only exists when a location is supplied (otherwise price fields are absent), fromPrice is a per-storefront floor rather than a national rate, pricedAtStorefronts=1 is a single shop, fromPrice excludes loyalty/coupon rates, and results are sorted cheapest per unit. These are exactly the non-obvious traits that would cause misquoting or double-counting.
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?
Purpose and the pricing caveat are front-loaded, and nearly every sentence carries decision-relevant content. It is nonetheless a dense paragraph that restates the 'not one national price' warning in several forms and could be trimmed without losing meaning, so it falls short of a 5.
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 no output schema, the description must carry the return contract and does: canonical products rather than per-chain detail, on what basis hits are ordered, which price fields appear and when, and how to interpret fromPrice versus normalizedUnitPrice. Nothing an agent needs to call this correctly or interpret the response is missing.
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 the baseline is 3; the description earns an extra point by explaining the cross-parameter consequence the schema does not state — supplying city or address causes every hit to return price fields, and their absence is explained by 'without a location nothing can be priced'. It does not elaborate radius_km, store_id, limit, or the near/location exclusion beyond what the schema already says.
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 (search the canonical product catalog) plus the exact matching modes (free text Hebrew/English, brand, category, exact GTIN) and explicitly distinguishes itself from get_product ('Returns canonical products (not per-chain detail); call get_product for listings'). An agent can separate it from every sibling without opening another schema.
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?
Gives explicit when-to-use, when-not-to-use, and named alternatives: use optimize_delivery ONCE for a whole shopping list rather than pricing lines here, and use suggest_similar_products with the shopper's Hebrew words plus the rejected product_id after a mismatch, then re-call optimize_delivery. Failure-recovery routing is spelled out, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_orderSplit one shopping list across two or three shopsARead-onlyInspect
Answer 'can I save by ordering from more than one shop?' for a whole list. Returns which items to buy where, each leg's own subtotal, delivery fee and service fee, the combined delivered total, and what it saves against buying everything in one order. Every fee is a published one: a leg whose delivery fee we could not verify is never put in a split, because a split is a recommendation to pay a SECOND fee and it may not rest on a number we would refuse to quote for one order. reason='cheaper' means one order could buy this list and two buy it for materially less. reason='more_of_the_list' means no single storefront stocks everything, so the second order fills the gap: it costs MORE, saving is negative, and that is the honest answer rather than a hidden one. Say which of the two it is. Each leg carries its own handoffUrl, one page per order. Give the shopper both. Every leg meets its own storefront's minimum order, so both legs are placeable as they stand. Returns splitOrder: null when one order is the right answer, which is the usual case — report that plainly and point at the single-order recommendation instead of retrying. optimize_delivery already returns the same splitOrder field, so call this one only when the shopper asks about splitting specifically, or to raise max_stores to 3.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English. Enough for chains that publish a settlement list, not enough for a storefront whose area is a polygon or a depot radius. | |
| near | No | 'lat,lng' string, e.g. '32.078,34.774'. Do not combine with address. | |
| items | Yes | The shopping list, same shape as optimize_delivery. | |
| intent | No | The shopper's own framing of this shop, in their own words, e.g. 'ברביקיו ל-12 אנשים'. Not a summary of the item list. Shown on each leg's handoff page next to what was priced. Optional; omit rather than inventing one. | |
| address | No | Delivery address in Israel, free text, e.g. 'מנדלסון 1, תל אביב'. Preferred: some storefronts publish a service area that only a street address can be tested against. | |
| slot_type | No | standard (default) or pickup. | |
| max_stores | No | How many storefronts to spread the list over. Default 2. A third adds a third delivery fee, so it only wins when it reaches items the other two do not stock. | |
| memberships | No | Memberships the shopper holds, e.g. ['credit_card', 'wolt_plus']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/openWorld annotations: it discloses the fee-verification policy (a leg with unverified delivery fee is never offered), the two reason values and their cost semantics, that 'more_of_the_list' yields a negative saving, that each leg gets its own handoffUrl, and that every leg independently meets its storefront minimum. This is real behavioral context an agent cannot get from structured fields.
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?
Front-loaded with the shopper question it answers, then behavior, then routing. It is dense and occasionally repetitive ('Say which of the two it is', 'Give the shopper both'), but nearly every sentence carries constraint or routing information, so length is mostly earned.
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 no output schema, the description carries the return-value burden and does: it enumerates the returned constituents, the handoff URLs, the reason discriminator, and the null case. Nothing an agent needs to interpret or act on a result is missing.
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 the baseline is 3, but the description adds meaning for max_stores by explaining that a third store introduces a third delivery fee and only wins when it reaches items the other two lack. It also frames items as 'the same shape as optimize_delivery', which helps reuse.
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 question it answers ('can I save by ordering from more than one shop?' for a whole list) plus the concrete outputs (which items where, per-leg subtotal, fees, combined total, savings). It explicitly names the sibling it overlaps with, optimize_delivery, so an agent can separate the two without opening schemas.
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?
Gives an explicit when-to-call rule: 'call this one only when the shopper asks about splitting specifically, or to raise max_stores to 3', and notes optimize_delivery already returns splitOrder. It also tells the agent what to do when splitOrder is null — report plainly and point at the single-order recommendation, do not retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_similar_productsSuggest similar productsARead-onlyInspect
After optimize_delivery priced the wrong product, use this to show other things the shopper might have meant. Send their words in HEBREW (original line or the correction) and the rejected product_id so that SKU is dropped. Example: priced נקניקיות פרגיות, shopper said thigh cuts → query='פרגיות' or 'שוקיים', product_id=. Then call optimize_delivery again with the same list, that line pinned to the chosen product_id. Also answers 'is there a cheaper one?': every suggestion carries fromPrice, the lowest it goes for at any storefront delivering to this address, and normalizedUnitPrice, the same money per 100g/100ml/piece. Compare on normalizedUnitPrice, NOT on fromPrice: a smaller pack is cheaper to buy and usually dearer per gram, so a saving claimed on fromPrice alone is wrong whenever the pack sizes differ. Results come back cheapest per unit first, and rejected carries the same fields so the swap is directly comparable. fromPrice is a floor across storefronts, so quote it as 'from ₪X'; pricedAtStorefronts=1 means it is one shop's price rather than a market rate. Send city or address, or no price can be reported at all. Do not use this for a first-pass shopping list — call optimize_delivery once with every line.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name in Hebrew or English (also accepts CBS locality codes). Aliases resolve to one place — e.g. 'הרצליה', 'Herzliya', and '6400' are the same filter. May be combined with location as a disambiguation hint. | |
| near | No | 'lat,lng' string, e.g. '32.078,34.774', to find stores near a point. | |
| limit | No | Max neighbours to return. Default 8. | |
| query | No | What they meant, in Hebrew. Prefer the correction ('שוקיים') or the original line ('פרגיות'). A Latin brand name matches nothing. Required unless product_id is set. | |
| location | No | Free-text neighborhood or address in Israel, e.g. 'נווה עמל, הרצליה'. Resolved to coordinates via cached Nominatim. Do not combine with near. | |
| radius_km | No | Search radius in km around the resolved point. Defaults to 10km when near or location is set. Ignored without a point. | |
| product_id | No | The product_id optimize_delivery priced that the shopper rejected. Excluded from results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only safety profile, so the description goes further with real operational detail: city/address is required or no price can be reported, fromPrice is a storefront floor to be quoted as 'from ₪X', pricedAtStorefronts=1 signals a single-shop price, and results are sorted cheapest per unit. This is substantial context beyond what readOnlyHint/openWorldHint provide.
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?
Purpose and trigger are front-loaded, and nearly every sentence carries information, but the pricing digression (fromPrice vs normalizedUnitPrice economics) is dense and the when-not guidance sits last rather than beside the purpose. Slightly longer than strictly needed.
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?
There is no output schema, and the description compensates by describing the returned fields (fromPrice, normalizedUnitPrice, rejected, pricedAtStorefronts) and their sort order, plus the required geographic input for pricing. For a 7-param workflow tool with no output schema, an agent has everything needed.
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 baseline is 3; the description adds meaning the schema doesn't, e.g. that query should be Hebrew and that product_id is dropped from results, plus the concrete 'נקניקיות פרגיות → query=פרגיות' mapping. It doesn't explain near/location/radius_km interactions, which are left to 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?
States a specific verb+resource and ties it to a concrete trigger ('After optimize_delivery priced the wrong product, use this to show other things the shopper might have meant'), and explicitly separates itself from the sibling by scope. An agent can identify this tool without opening the schema.
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?
Gives explicit when-to-use, a worked recovery workflow (re-call optimize_delivery with the line pinned), an alternative use case ('is there a cheaper one?'), and an explicit when-not: 'Do not use this for a first-pass shopping list — call optimize_delivery once with every line.' Both the alternative and the exclusion are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Related MCP Connectors
Israeli supermarket prices, cheapest stores, baskets and your list. Sign in or free API key.
Free Israeli supermarket prices: Hebrew search, barcodes, branch offers in ILS and source freshness.
Prices in 31 Israeli supermarket chains by barcode. Free search; API key or x402 pay-per-call.
Product catalogues, prices and stock from online stores and supermarkets.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables cross-store price comparison and recipe-driven cart automation for Israeli grocery stores Shufersal and Tiv Taam, with an extensible architecture for additional stores.14-
- FlicenseNot gradedqualityDmaintenanceEnables searching for groceries and automatically adding items to cart through various grocery vendor APIs like Rami Levy and Keshet.3-
- FlicenseNot gradedqualityBmaintenanceEnables users to compare and get recommendations across multiple supermarket products, combining curated specifications with realtime price and review lookups.-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to build and edit a Shufersal online grocery cart from a text list, a past order, or a saved list — searching products, adding items by code, setting quantities, removing items, viewing line prices and totals, and picking a delivery window. It never checks out or pays, leaving final review and payment to the user in the Shufersal app or website.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.