saveon-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., "@saveon-mcpwhat's on sale for dinner this week?"
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.
saveon-mcp
An MCP server that gives Claude live prices and stock from one Save-On-Foods store: 9th & Jasper, 10180 109 Street NW, downtown Edmonton. Ask what is on sale this week, search for an ingredient, or have Claude plan dinners from the flyer. It reads the same public storefront API that saveonfoods.com uses, so prices match the website.
It covers one store at a time and is read only. It does not place orders, sign in to More Rewards, or show personalised offers.
What you get
Five tools and one prompt.
search_productssearches the catalogue with live prices and returns the match count plus a slim product list. Parameters:query,category_id,on_sale_only,sort(relevance,price,price desc),limit,skip. Fields per product: sku, name, price, unit price, on sale, sale end date, availability, category.product_detailsreturns one product by sku: regular and sale price, ingredients with the allergen statement, nutrition facts per serving, country of origin flags and an image URL. Fresh meat and produce usually carry no ingredients or nutrition.price_checkprices a whole shopping list in one call. For each item it returns the best match (preferring an on-sale hit), the cheapest match, and an estimated total.find_storeslists Save-On-Foods locations in a city with the store id, address, hours, phone and pickup or delivery availability.list_categoriesreturns the department tree (Meat & Seafood, Fruits & Vegetables, Pantry, and so on) with the ids you pass tosearch_products.meal_ideasis a prompt that walks Claude through pulling deals per department and proposing priced dinners.
Questions it answers well:
What is on sale for dinner this week?
Find the cheapest tofu.
Everything on sale in Meat & Seafood, cheapest first.
Plan three dinners under $20 each from the flyer.
Price this list: ground beef, taco kit, shredded cheese, sour cream.
Does the Tex Mex cheese contain anything besides milk?
Related MCP server: Kroger MCP Server
Setup
You need Python 3.13 or newer and uv.
git clone https://github.com/d3v0psdan/saveonfoods-mcp.git
cd saveonfoods-mcp
uv sync
uv run python check.py # hits the live API; prints "ok: ..." when the mapping still worksRegister it with Claude Code so every project can use it:
claude mcp add -s user saveon-foods -- uv --directory /path/to/saveon-mcp run server.pyFor Claude Desktop, add this to claude_desktop_config.json:
{
"mcpServers": {
"saveon-foods": {
"command": "uv",
"args": ["--directory", "/path/to/saveon-mcp", "run", "server.py"]
}
}
}Restart the client. The tools show up as saveon-foods.
Using a different store
The store is set by the SAVEON_STORE_ID environment variable and defaults to 6613 (9th & Jasper). Any Save-On-Foods location works. To find a store number, list the stores and look at retailerStoreId:
curl -H "X-Site-Host: https://www.saveonfoods.com" \
"https://storefrontgateway.saveonfoods.com/api/stores?take=300"Then pass it at registration:
claude mcp add -s user -e SAVEON_STORE_ID=6609 saveon-foods -- uv --directory /path/to/saveon-mcp run server.pyHow it works
The website talks to storefrontgateway.saveonfoods.com. The only header the gateway requires is X-Site-Host: https://www.saveonfoods.com. No login, no API key.
The site's own search endpoint, /api/stores/{id}/search, sits behind a Cloudflare challenge and returns 403 to anything that is not a browser. The per-category endpoint, /api/stores/{id}/categories/{categoryId}/search, is open and accepts the same q, sort, skip, take and fpromotions parameters. The server sends every query to that endpoint rooted at the Grocery department (id 30372), which covers the whole store.
fpromotions=True limits results to promoted items. Sale prices are temporary price reductions that run Thursday to Wednesday, and the server reads the end date from the active entry in tprPrice. The promotion index lags a little and returns a few items with no active markdown, so the server drops those when on_sale_only is set. The API caps page size at 100.
Responses are cut down to eight fields per product so a 50 item result stays small enough to reason over.
Files
server.pyis the whole server: HTTP client, five tools, one prompt.check.pyis the smallest check that fails if the API or the field mapping breaks. Run it after any change.pyproject.tomlanduv.lockpin the dependencies:mcpandhttpx.
Known gaps
Search results show the current price only. Call
product_detailsfor the regular price of a sale item.price_checkruns one search per item, so a 20 item list takes a few seconds.The gateway is unofficial. If Save-On-Foods changes it,
check.pyis the first thing that will fail.
License
MIT.
Available Tools
5 toolsfind_storesB
Save-On-Foods locations in a city with the store id to use as SAVEON_STORE_ID, address, hours, phone and whether pickup or delivery is offered.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Edmonton |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the descriptive payload (id, address, hours, phone, pickup/delivery) and implies a read-only lookup, but never states that it is non-mutating, whether auth is required, or how results are scoped/paginated.
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 compact sentence that front-loads the resource and then lists outputs; no filler. It reads slightly as a run-on list, but every clause carries information.
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 return-field enumeration is partly redundant, and for a simple one-parameter read tool the definition is close to sufficient. Still missing the default-city behavior and any routing guidance to sibling tools.
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 0% and the single 'city' parameter has a default of 'Edmonton' that the description never mentions. 'in a city' only vaguely gestures at the filter and gives no format or behavior for omitting the argument.
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 names the specific resource (Save-On-Foods store locations) and enumerates the returned fields, so an agent can distinguish it from search_products, list_categories, price_check, and product_details. It lacks an explicit verb like 'find/list', but the intent is unambiguous.
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?
There is no statement of when to use this tool versus its siblings, e.g. when a store lookup is needed before price_check. The passing mention of 'SAVEON_STORE_ID' hints at a downstream workflow but never spells it out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesA
List departments under parent_id (default: top-level Grocery departments such as Meat & Seafood, Fruits & Vegetables, Deli & Ready Made Meals). Use the returned ids as category_id in search_products. depth 2 includes sub-departments.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| parent_id | No | 30372 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the default listing behavior (top-level Grocery departments) and the depth semantics, but says nothing about result limits, pagination, or any auth/permission requirements. For a benign read operation the disclosure 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?
Three tight sentences, front-loaded with what the tool lists and what the defaults are, then the downstream usage hint. Every sentence earns its place with 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 values needn't be described. Purpose, both parameters, and downstream usage are covered for a simple two-arg read tool, though richer detail on result size/pagination would fully round it out.
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 0%, so the description must compensate and largely does: parent_id's default meaning (top-level parent, id 30372) is stated, and depth's effect (2 includes sub-departments, implying 1 is direct children only) is explained. That covers both parameters, though exact accepted depth values are left implicit.
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 (List) and resource (departments/categories) and pins down scope: departments under parent_id, defaulting to top-level Grocery departments with concrete examples. It also distinguishes itself from siblings by explaining its role as a feeder for search_products' category_id.
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 clear context: use returned ids as category_id in search_products, and depth 2 to reach sub-departments. It does not state when this tool should NOT be used or name a specific alternative for other category lookups, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_checkA
Price a shopping list in one call. For each item returns the best match (first
relevance hit, or the first on-sale hit when prefer_sale is set) and the cheapest
available match, plus an estimated total of the best matches. Items with no match
are listed under missing.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| prefer_sale | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does substantial work: it discloses the matching algorithm (first relevance hit, or first on-sale hit when prefer_sale is set), that a cheapest-available match is also computed, that a total is estimated, and that unmatched items land under `missing`. It still omits permissions, rate limits, and failure behavior.
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 tight sentences, front-loaded with the core action, then return semantics, then the edge case (`missing`). 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?
With no output schema and no annotations, the description must describe return values, and it does — best match, cheapest match, estimated total, and missing items. Combined with the two-parameter schema, an agent has enough to call it, though parameter formats and error handling remain unaddressed.
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 0%, so the description must compensate. It explains prefer_sale's effect on matching, but only partly: the schema default is true while the text says 'when prefer_sale is set,' leaving the default ambiguous. The `items` parameter is never characterized as an array of free-text queries, so an agent gets no format 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 opens with a specific verb and resource: 'Price a shopping list in one call,' and goes on to enumerate exactly what the tool computes. It is clearly distinguishable from search_products or product_details by its batch/pricing framing, though it never names a sibling 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: the 'in one call' phrasing and 'shopping list' framing suggest this is the batch alternative to per-item searches, and the prefer_sale mention hints at a sale-oriented use case. There is no explicit when-to-use statement, no when-not-to-use, and no named alternative such as search_products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_detailsA
Full detail for one product by sku (from search_products): regular and sale price, ingredients with allergen statement, nutrition facts per serving, country attributes and image URL. Fresh meat and produce usually carry no ingredients or nutrition.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses a data-quality trait — that fresh meat and produce usually carry no ingredients or nutrition — which prevents the agent from treating empty fields as an error. However, it says nothing about auth requirements, error behavior on unknown skus, or rate limits.
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 verb+resource and the sku source, followed by the return-fields list and a caveat. Every clause carries information — the field enumeration is justified because there is no output schema — though the middle sentence is dense.
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?
In the absence of both an output schema and annotations, the description compensates by enumerating the return payload and flagging the common case of missing ingredients/nutrition data. Auth, error semantics, and sku format remain unstated, which is acceptable for a read-only detail lookup but leaves small 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 0% and the single sku parameter is undocumented in the schema, so the description must compensate; it does by stating the parameter is a sku and where to obtain it (search_products). It does not specify format (e.g., plain string, numeric pattern) or case sensitivity, which would be the last piece of value-add.
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 gives a specific retrieval verb and resource ("full detail for one product by sku") and distinguishes itself from the sibling search_products by naming it as the origin of the sku. It also enumerates the exact payload (price, ingredients/allergens, nutrition, country attributes, image URL), so the agent knows what it gets versus a search result.
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?
"(from search_products)" establishes the expected workflow and prerequisite: the sku comes from a prior search, not from free invention. It lacks an explicit when-not-to-use statement (e.g., versus price_check for a lightweight lookup), but the context and the data caveat make intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsA
Search what the store stocks right now, with live prices.
query: free text ("chicken thighs", "tofu"); empty lists the whole category.
category_id: a department id from list_categories; defaults to all of Grocery.
on_sale_only: only items with a current promotion (this week's deals).
Returns the API's total match count plus up to limit (max 100) slimmed products; page with skip.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| sort | No | relevance | |
| limit | No | ||
| query | No | ||
| category_id | No | 30372 | |
| on_sale_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: it returns the API's total match count plus up to limit (max 100) "slimmed" products and supports paging with skip. It hints that results are partial (slimmed) rather than full details, which matters for choosing product_details. It omits auth/permission needs and only implies a read-only nature.
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 the one-line purpose, then documents parameters, then the return shape and pagination in a tight block. Every line earns its place; the format is slightly listy but wastes no words.
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 no annotations and no output schema, the description covers the essential calling knowledge: filter semantics, the limit cap, and the paginated response shape. Gaps remain around sort and the read-only/no-auth assumptions, but nothing critical to invoking it correctly 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 0%, so the description must compensate, and it documents query, category_id, on_sale_only, plus limit (max 100) and skip for paging. Only sort is left unexplained, though its enum values are largely self-describing. This is strong compensation for a zero-coverage 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 ("Search what the store stocks") and adds a distinguishing trait ("with live prices"), which separates it from siblings like product_details and price_check. It stops short of explicitly naming which sibling to prefer for a single-product lookup, so it is clear but not maximally differentiated.
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 context on how to use the filters, including a useful cross-reference that category_id comes "from list_categories". However, it never states when to choose this tool over price_check or product_details, nor any exclusion conditions, so usage is implied rather than explicit.
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.
5 tool updates
v0.1.0- First observed
find_stores - First observed
list_categories - First observed
price_check - First observed
product_details - First observed
search_products
TDQS
Scored across 5 tools
Each tool has a distinct primary purpose: search vs. browse categories vs. batch price a list vs. find stores vs. fetch full product detail. The only mild overlap is search_products and price_check, which both return products with prices, but the descriptions clearly separate single-query search from list-wide pricing.
Four tools follow a verb_noun pattern (search_products, list_categories, price_check, find_stores) while product_details breaks the pattern by being noun-first. The deviation is minor and the intent stays obvious.
Five tools is well within the healthy range and each earns its place, covering the natural shopping workflow of browse, search, price, locate store, and inspect detail. Nothing feels redundant or padded.
The surface covers discovery (search, categories), evaluation (details, price_check) and logistics (find_stores) with no dead ends for a read-only grocery helper. Gaps are minor, such as no per-store stock or cart/order capability, which agents can work around.
Maintenance
Related MCP Connectors
Canadian grocery flyer deals and recipes by item, store, postal code, cuisine, or diet. No auth.
Grocery meal planning, budgets, and flyer deals for Canadian households. Auth required.
Brie connects your assistant to saved recipes, household meal plans and shared grocery lists. Search your recipe library, import recipe links or text, and save a higher-protein or vegetarian adaptation as a named recipe version while preserving the original source. Prepare dinners around your household's preferences, review the proposal, then save the plan and rebuild its groceries. Start with a Brie account on the web and activate your personal Plus or Pro plan, or an eligible trial. Existing subscribers use their current account. Plus starts at $4.99 USD/month, with a seven-day trial for eligible new subscribers; current pricing and renewal terms appear before payment. Household membership alone does not include personal assistant access. Household operations require OAuth and your permission for the selected household. Public discovery exposes tool descriptions only. Eight recipe and grocery tools are available by default; add X-Brie-Capabilities: planning-preview for the thirteen-tool catalog including reviewed meal planning. No private nutrition logs, grocery purchases or billing access. Website: https://withbrie.app Setup: https://withbrie.app/agents Create your account: https://app.withbrie.app/signup?intent=assistant OpenClaw installation: https://clawhub.ai/brie/plugins/brie-openclaw
Your recipes, family meal plan and shopping list from Foodie, in ChatGPT, Claude and Codex.
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-
- FlicenseNot gradedqualityDmaintenanceIntegrates Kroger's public API with Claude to allow adding meal plan grocery lists directly to your Kroger cart via natural language.-
- FlicenseAqualityDmaintenanceEnables logging and analyzing grocery purchases, tracking prices, spending patterns, and purchase history through natural language with Claude Desktop.5-
- FlicenseNot gradedqualityDmaintenanceEnables shopping at Tiv Taam grocery store through Claude, including recipe parsing and cart population.-