my-grocery-mcp
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., "@my-grocery-mcpfind the cheapest butter across Migros, Coop, and Aldi"
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.
my-grocery-mcp
Personal MCP server for Swiss grocery product search, price comparison and weekly promotions (Migros, Coop, Aldi, Denner, Lidl, Farmy, Volgshop, Otto's).
Origin and license
Forked from nicktcode/swissgroceries-mcp at v0.7.4, the last release under the MIT License. Later upstream releases use different licenses; no code from them is included here. This project stays under MIT — see LICENSE. The original README is kept as UPSTREAM-README.md for reference on tools and setup.
Not affiliated with any of the retailers. It calls their publicly reachable app/web endpoints; those can change without notice.
Related MCP server: PriceAtlas MCP Server
Changes since the fork
See git log. Highlights:
Migros: promotions with a minimum quantity ("40% Ab 2 Stück") are detected.
Migros:
get_promotionsreads the full weekly list and honoursquery.Migros:
search_productskeeps promotion data.Migros: default region is Zürich (
2), overridable viaMIGROS_REGION.
Run locally
npm install
npm test
npm run buildClaude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"my-grocery": {
"command": "node",
"args": ["/absolute/path/to/my-grocery-mcp/dist/index.js"]
}
}
}Available Tools
7 toolsfind_stockA
Check which stores of a given chain have a specific product in stock. Optionally filter by proximity to GPS coordinates or query a single store by ID. Not all chains support per-store stock queries; unsupported chains return a clear error. Use for "is this product available near Zurich HB?", "which Coop has item X in stock?".
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | Optional location to filter nearby stores. Pass coordinates, a Swiss ZIP, or a free-text address. If omitted, all stores may be queried. | |
| chain | Yes | The chain to query for stock. Only chains with perStoreStock capability are supported. | |
| storeId | No | Query a single specific store by its chain-specific store ID. Takes precedence over `near`. | |
| productId | Yes | Chain-specific product ID to check stock for. Obtain via search_products or get_product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that not all chains support per-store stock queries and that unsupported chains return a clear error. It also mentions that storeId takes precedence over near. With no annotations, the description carries the burden, but it omits details about response format, rate limits, or authentication.
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 description is three sentences with no redundant information. The first sentence states the core purpose, followed by filtering options and a note about chains. It is front-loaded and efficient.
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 lack of an output schema and annotations, the description adequately covers the main purpose, filtering options, and chain limitations. However, it does not describe the output returned (e.g., list of stores with availability), leaving a gap in completeness.
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 input schema already describes each parameter in detail. The description adds a high-level summary but does not provide new semantic information beyond what is in the schema, resulting in a baseline score of 3.
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 'check' and resource 'stores of a given chain have a specific product in stock'. It clearly distinguishes from siblings like find_stores (which finds stores) and get_product (which gets product info) by focusing on stock availability.
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 description provides explicit use cases ('is this product available near Zurich HB?', 'which Coop has item X in stock?') and notes that unsupported chains return a clear error. However, it does not explicitly contrast with sibling tools 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.
find_storesA
Find grocery stores near a location, filtered by chain and search radius. Accepts a Swiss ZIP code, GPS coordinates, or a free-text address as the search center. Returns store name, address, chain, location, and opening hours where available. Use for "find a Migros near me", "which Coop branches are in 8001?", or before checking stock.
| Name | Required | Description | Default |
|---|---|---|---|
| near | Yes | Center of the search radius. Pass either coordinates, a Swiss ZIP, or a free-text address. | |
| chains | No | Limit results to specific chains. Omit to search all configured chains. | |
| radiusKm | No | Search radius in kilometers (1–50). Defaults to 5 km. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains that the tool returns store details including opening hours where available, indicating a read-only operation. However, it does not disclose potential rate limits, authentication needs, or any side effects, which is acceptable for a simple search tool.
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 description is three sentences: first states purpose, second describes inputs, third summarizes outputs and examples. It is front-loaded with key information, no redundant phrases, and every sentence adds value.
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 search tool with 3 parameters and no output schema, the description adequately covers inputs, outputs, and example usage. It mentions return fields (name, address, chain, location, hours). It could have explicitly stated the default radius, but that is detailed in the schema. Overall, it is sufficiently complete for an agent to use effectively.
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?
The input schema has 100% coverage with descriptions for each parameter. The description adds minor context (e.g., prefer zip or lat/lng for speed, geocoding via Nominatim) but mostly restates schema information. The baseline score of 3 is appropriate as the description provides some additional guidance.
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 clearly states the tool finds grocery stores near a location with filters for chain and radius, using specific verbs and resource. It also provides example use cases that distinguish it from siblings like find_stock and get_product.
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 description gives concrete examples of when to use this tool ('find a Migros near me', 'which Coop branches are in 8001?') and hints at its role before checking stock. However, it does not explicitly state when not to use it or provide alternatives for non-store queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productA
Fetch full product details for a specific chain + product ID pair. Returns price, brand, size, unit price, tags, category, image URL, and active promotions. Obtain product IDs from search_products. Useful for drilling into a search result. Use for "get details for this Migros product" or "what is the unit price of this item?".
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chain-specific product identifier, e.g. Migros cumulus ID or Coop product number. Obtain via search_products. | |
| chain | Yes | The grocery chain that owns this product ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It lists the returned fields (price, brand, size, etc.) and states that it fetches details, but does not disclose potential side effects, authentication needs, or rate limits. The behavior is sufficiently clear for a read-only fetch.
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 description is three sentences, front-loaded with the core purpose, and contains no redundant information. Every sentence contributes value.
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 tool has only 2 simple parameters and no output schema, the description fully explains what the tool does, what it returns, and how to get the required inputs. It is complete for its complexity.
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 adds minimal additional meaning: it reiterates the 'chain' parameter as 'the grocery chain' and 'id' as 'chain-specific product identifier', and mentions obtaining via search_products, which is already in 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 clearly states the verb 'Fetch', the resource 'product details', and the specific scope 'for a specific chain + product ID pair'. It distinguishes itself from sibling tools like search_products by explaining what it does differently.
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 description explicitly instructs to obtain product IDs from search_products and provides example use cases like 'get details for this Migros product'. It implies when to use this tool but does not explicitly mention when not to use it or alternatives beyond search_products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_promotionsA
List current promotional deals across configured Swiss grocery chains. Filter by chain, keyword, store ID, or how many days until the promotion expires. Returns promotion name, discount, validity dates, and applicable stores. Use for "what is on sale this week?", "any Migros deals on cheese?", or "promotions ending today".
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional keyword to filter promotions by product name, e.g. "Käse", "wine". | |
| chains | No | Limit to specific chains. Omit to fetch promotions from all configured chains. | |
| storeIds | No | Restrict to promotions valid at these store IDs (chain-specific). Obtain store IDs from find_stores. | |
| endingWithinDays | No | Only return promotions ending within this many days (1–60). Useful for "ending soon" queries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description transparently explains the tool's behavior: it lists promotions, returns specific fields (name, discount, validity dates, stores), and supports filters. It doesn't mention potential limitations like rate limits or authentication, but the read-only nature is clear.
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 description is concise (two sentences) and front-loaded: first sentence states the main function and filters, second lists returns and usage examples. Every sentence is meaningful and directly contributes to understanding.
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?
Despite no output schema, the description adequately covers what the tool returns (name, discount, validity dates, applicable stores). It doesn't mention pagination or result limits, but for a promotional listing query, the essential information is provided.
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?
All 4 parameters have schema descriptions (100% coverage). The description adds value by providing concrete examples (e.g., 'Käse', 'wine' for query) and referencing the helper tool find_stores for store IDs, enriching the schema information.
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 clearly states the tool lists current promotional deals across Swiss grocery chains, with a specific verb and resource. It distinguishes itself from sibling tools like search_products (general product search) and get_product (single product details) by focusing on promotions and filtering options.
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 description provides explicit usage examples (e.g., 'what is on sale this week?', 'any Migros deals on cheese?'), guiding when to use the tool. It does not explicitly state when not to use it, but the context contrasts well with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
Probe each registered chain adapter with a trivial query and report status, latency, and capability flags. Use this when a chain seems missing from results or when debugging adapter problems.
| Name | Required | Description | Default |
|---|---|---|---|
| chains | No | Chains to probe. Default: all configured. | |
| timeoutMs | No | Per-chain timeout in milliseconds. Default 5000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the operation as 'probe with a trivial query' and reports status/latency/capability flags, implying a read-only health check. However, it does not explicitly confirm no side effects, auth requirements, or rate limits. The description is adequate but not rich.
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: first states functionality, second provides usage guidance. No wasted words, front-loaded with key action.
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 simple diagnostic tool with 2 optional params and no output schema, the description covers purpose, trigger, and high-level output. Could be slightly more detailed on output format, but sufficient.
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 parameters documented. The description adds no new meaning beyond the schema, so 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?
The description uses specific verb 'probe' and resources 'chain adapters' and states outputs: status, latency, and capability flags. It also positions it for debugging missing chains, distinguishing it from sibling data tools like search_products or find_stock.
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 use: 'chain seems missing from results' or 'debugging adapter problems'. Does not mention when not to use or contrast with alternatives, but the context with sibling tools makes the purpose distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_shoppingA
Plan a multi-store shopping trip near a location, picking the best products across configured Swiss grocery chains. Items can be generic ("milch", "pasta") or pinned to a specific SKU. Returns a primary plan plus alternatives. Use when the user gives a list of items and asks "where should I shop?" or "what's cheapest?". Strategies: single_store (one chain), split_cart (multi-chain with stop penalty), absolute_cheapest (no penalty).
| Name | Required | Description | Default |
|---|---|---|---|
| near | Yes | Shopper's location — used to find nearby stores. Pass coordinates, ZIP, or address. | |
| items | Yes | The list of items to shop for. At least one item required. | |
| chains | No | Restrict the plan to these chains. Omit to consider all configured chains. | |
| radiusKm | No | Only consider stores within this radius of the provided location (1–50 km). Default 5 km. | |
| strategy | Yes | single_store: buy everything at one chain (minimises trips). split_cart: allow multiple chains but add splitPenaltyChf per extra stop. absolute_cheapest: pick the cheapest source per item regardless of stops. | |
| splitPenaltyChf | No | Cost in CHF added per extra store stop in split_cart strategy. Default 2.00. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It mentions return of 'primary plan plus alternatives' and strategies, but does not elaborate on side effects, rate limits, or error behavior (e.g., no stores found). It is adequate but not detailed.
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?
Four sentences, front-loaded with purpose, no redundant text. Each sentence contributes context: purpose, item types, usage hint, and strategy options.
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?
Covers high-level purpose, item flexibility, and strategies. However, it lacks details on the return format (no output schema) and does not describe what happens when constraints fail (e.g., no matching products). Still, it is largely complete for a planning 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%, so the schema already documents all parameters thoroughly. The description adds little new information beyond strategies, making it a baseline 3.
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 clearly specifies the tool's function: planning a multi-store shopping trip near a location, picking the best products across Swiss grocery chains. It distinguishes itself from siblings like find_stock and find_stores, which handle single-store queries or product lookups.
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 use: 'Use when the user gives a list of items and asks "where should I shop?" or "what's cheapest?"' and outlines three strategies. However, it lacks explicit when-not-to-use guidance compared to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsA
Search for products across configured Swiss grocery chains (Migros, Coop, Aldi, Denner, Lidl) by keyword. Supports optional filters for price, size range, and product tags (organic, vegan, budget, etc.). Returns results grouped by chain with normalised price, unit price, size, and promotion info. Use for "find organic milk under 2 CHF", "compare pasta prices", or "search for gluten-free bread".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results per chain (1–50). Defaults to chain-specific limit. | |
| query | Yes | Search term in any language, e.g. "Milch", "pâtes", "Bier". At least 1 character. | |
| chains | No | Restrict search to specific chains. Omit to search all configured chains in parallel. | |
| offset | No | Skip the first N results per chain. Use with `limit` to paginate. Default 0. | |
| filters | No | Optional product filters applied after search. | |
| storeIds | No | Filter results to products available in these store IDs (chain-specific internal IDs). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral details. It mentions results are grouped by chain and include price, unit price, size, and promotion info, but does not explain pagination (limit/offset defaults), rate limits, or auth requirements. The parallel search across chains is also not 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?
Three sentences: one for main action, one for filters, one for output and examples. Highly concise, front-loaded, and every sentence adds value without redundancy.
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?
The description covers purpose, filters, and output format well, but lacks details on default pagination, result ordering, and treatment of empty results. Given the complexity (nested filters, no output schema), it is mostly complete but has minor gaps.
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. The description adds value by listing output fields (normalized price, unit price, size, promotion info) and providing concrete examples that tie parameters to use cases, which helps the agent understand parameter combinations.
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 clearly states the tool searches for products across specific Swiss grocery chains by keyword, with filters and grouped results. It provides concrete example queries, effectively distinguishing it from siblings like get_product (single product) or find_stock (stock levels).
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 description gives specific use cases (e.g., 'find organic milk under 2 CHF') and implies usage for multi-chain searches. However, it does not explicitly state when to use other tools like get_product or find_stock, leaving some ambiguity for the agent.
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.
7 tool updates
v0.1.0- First observed
find_stock - First observed
find_stores - First observed
get_product - First observed
get_promotions - First observed
health_check - First observed
plan_shopping - First observed
search_products
TDQS
Scored across 7 tools
Each tool targets a distinct resource and action: store discovery, product search, product detail, promotions, per-store stock, adapter diagnostics, and multi-item trip planning. The only mild conceptual overlap (search_products vs plan_shopping) is clearly separated by scope—single-product search versus multi-item itinerary optimization.
All seven tools follow a consistent snake_case verb_noun pattern (find_stores, search_products, get_product, get_promotions, find_stock, plan_shopping), with health_check being the only noun-ish exception but still readable and idiomatic.
Seven tools is well-scoped for a Swiss grocery comparison server, covering discovery, search, detail, promotions, stock, diagnostics, and planning without redundancy. Each tool earns its place in the workflow.
The surface covers the core lifecycle: find stores, search products, inspect details, check promotions and stock, and plan trips, plus a health check for adapter issues. Minor gaps exist—no explicit chain/capability listing beyond health_check, no store-detail-by-ID tool, and no price history—but these are workable around.
Maintenance
Related MCP Connectors
Compare prices across Swiss and European shops — barcode (GTIN) lookup and daily price history.
Live prices, deals & optimal multi-stop shopping routes for German grocery & drug stores.
Pay-per-call Swiss retail price intelligence (22 retailers). $0.01 USDC via x402.
Search Coles, Woolworths and ALDI at once: prices, unit prices, specials, cheapest store per item.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides grocery price and nutritional information search capabilities, allowing AI agents to search for food products, compare prices, and analyze nutritional content across different grocery stores.1-
- AlicenseAqualityDmaintenanceEnables AI assistants to track global food prices, search products by barcode or name, and compare costs across 27 countries. It provides tools for real-time price scraping and data aggregation from major international supermarket chains.84MIT
- FlicenseAqualityAmaintenanceA Model Context Protocol server for real-time Swiss grocery shopping that searches and compares products across 8 major Swiss retailers (Migros, Coop, Aldi, Denner, Lidl, Farmy, Volgshop, Otto’s), normalizes per-unit prices, surfaces promotions, computes optimal multi-store shopping plans, and works with any MCP-compatible client without API keys or accounts.27132 npm37-
- AlicenseAqualityAmaintenanceEnables searching products, comparing prices, and building optimal shopping lists across major Chilean supermarkets, using your local machine to access real-time prices and loyalty deals.14324 npm66MIT