grocery-deals-mcp
Provides access to Lidl's weekly circulars, enabling deal searches, price checks, and shopping plan creation for Lidl stores near a given ZIP code.
Provides access to Target's weekly circulars, enabling deal searches, price checks, and shopping plan creation for Target stores near a given ZIP code.
Provides access to Walmart's weekly circulars, enabling deal searches, price checks, and shopping plan creation for Walmart stores near a given ZIP code.
Click on "Install 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., "@grocery-deals-mcpWhere can I get the cheapest chicken this week near 10001?"
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.
grocery-deals-mcp
An MCP server that tells an AI assistant what's actually on sale at grocery stores near any US ZIP code this week.
It reads the weekly circulars that supermarkets publish — the same ads that used to arrive in the newspaper — and turns them into something an agent can query: "what protein is cheap this week?", "where should I buy this list?", "is $1.99/lb a good price for chicken, or should I wait?"
Typical coverage for a suburban ZIP is 15–25 grocery chains and several thousand advertised items, including Aldi, Costco, Food Lion, Giant, Harris Teeter, H Mart, Lidl, Publix, Safeway, Sprouts, Target, Walmart, Wegmans and Weis, depending on what operates in your area.
Why it's fast
Every query tool reads a local SQLite index and never touches the network.
Only refresh_deals goes out to fetch circulars (10–20 seconds), and it
self-heals — the first query of the week builds the index, and every call after
that returns in milliseconds until the circulars turn over.
Related MCP server: TilbudsTrolden
Tools
Tool | What it does |
| Which stores near a ZIP have an active ad, and how many deals each is running |
| Find a product across every local store's ad, cheapest first |
| Dump one store's entire weekly ad |
| Turn a shopping list into a per-store trip plan, capped at N stores |
| Judge a price against the history this server accumulates |
| Force an index rebuild mid-week |
| Exact SKU-level regular/promo prices (optional, see below) |
| Look up a Kroger-banner store ID (optional) |
Setup
Requires Python 3.10+ and uv.
git clone https://github.com/tx-smitht/grocery-deals-mcp.git
cd grocery-deals-mcp && uv syncVerify it starts:
uv run grocery-deals-mcpIt will sit silently waiting for MCP traffic on stdin — that's correct. Ctrl-C to exit.
Setting your location
The agent passes the ZIP code. Every location-aware tool takes a
zip_code argument, so you can just say "what's on sale near 12345?" and it
works with no configuration at all. Nothing about any location is stored in
this repository.
If you'd rather not repeat your ZIP every conversation, set GROCERY_ZIP in
your client config (below) and the argument becomes optional. Note that this
writes your ZIP into a local config file — keep that file out of version
control. .mcp.json and .env are already in .gitignore.
All configuration
Every setting is an environment variable, all optional:
Variable | Default | Purpose |
| (none) | Default ZIP, so tools don't need the argument |
| (all) | Comma-separated allowlist, e.g. |
|
| How long the index stays fresh |
|
| Where the cache and price history live |
| (none) | Enables |
| (none) | Default Kroger-banner store |
To change what counts as a grocery store, edit GROCERY_CATEGORY in
src/grocery_deals_mcp/config.py — Flipp
also tags circulars as Pharmacy, Pets, Home & Garden, Electronics and
others, so the same code will happily index those instead.
Connecting it
Claude Code
One command, from anywhere:
claude mcp add grocery-deals -- uv run --directory /absolute/path/to/grocery-deals-mcp grocery-deals-mcpWith a default ZIP baked in:
claude mcp add grocery-deals --env GROCERY_ZIP=12345 -- uv run --directory /absolute/path/to/grocery-deals-mcp grocery-deals-mcpThen /mcp inside Claude Code to confirm it connected.
Claude Desktop
Edit claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"grocery-deals": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/grocery-deals-mcp", "grocery-deals-mcp"],
"env": { "GROCERY_ZIP": "12345" }
}
}
}Restart Claude Desktop. Drop the env block to pass ZIPs per-question instead.
Codex CLI
Add to ~/.codex/config.toml:
[mcp_servers.grocery-deals]
command = "uv"
args = ["run", "--directory", "/absolute/path/to/grocery-deals-mcp", "grocery-deals-mcp"]
env = { GROCERY_ZIP = "12345" }Anything else
It's a standard stdio MCP server. Any client that speaks MCP can run
uv run --directory <path> grocery-deals-mcp.
A copyable starting point is in
.mcp.json.example.
Optional: exact Kroger-banner pricing
The circular tells you "Boneless Chicken Breast $1.99/lb". Kroger's official API tells you the exact SKU, size, regular price and promo price at one specific store. It covers every Kroger banner — Kroger, Harris Teeter, Ralphs, Fred Meyer, King Soopers, QFC, Smith's, Fry's.
Register a free app at developer.kroger.com and request the Products API
Set
KROGER_CLIENT_IDandKROGER_CLIENT_SECRETAsk the agent to run
kroger_find_stores, then setKROGER_LOCATION_IDto the store you use (or passlocation_idper call)
kroger_find_stores accepts everyday chain names — "Harris Teeter" works, and
so does Kroger's internal code for it (HART). Matching happens client-side
because Kroger's own filter.chain takes undocumented codes and answers an
unrecognized one with an empty list rather than an error.
Free tier allows 10,000 calls/day. Everything else in this server works without it.
How it works, and what that implies
Circular data comes from Flipp's backend — the service behind the weekly-ad app used by most large US grocers. These endpoints are undocumented and unofficial. They require no key and are the same calls Flipp's own web app makes, but there is no API contract behind them: they can change shape or disappear without notice, and this project isn't affiliated with or endorsed by Flipp or any retailer.
Accordingly, the server caches aggressively and fetches rarely — one refresh per ZIP per 12 hours by default, six concurrent requests at most. Please don't lower those defaults to hammer someone else's servers.
Some real limits worth knowing:
Trader Joe's will never appear. They don't run weekly sales or publish a circular. That's a fact about Trader Joe's, not a gap in the data.
Prices are what the ad claims. Loyalty-card qualifiers (
MVP,with card), digital-coupon requirements and quantity limits are captured when the ad states them, but the ad is the source of truth, not the register.Flyer dumps lack units. A store's full circular gives names and prices;
search_dealsfalls back to Flipp's search index, which addsLB/EAunits and loyalty qualifiers, when a term is thin locally.A ZIP's feed can include chains that aren't local. Flipp's radius is generous. Use
GROCERY_STORESto pin it down to stores you'd actually drive to.
Privacy
Nothing leaves your machine except circular requests to Flipp (a ZIP code and search terms) and, if you enable it, product lookups to Kroger.
The SQLite database records your ZIP and accumulated price history. It lives in
data/ and is gitignored. So is .env and .mcp.json — if you set a default
ZIP, that's where it should go.
License
MIT
Available Tools
8 toolskroger_find_storesA
Find nearby Kroger-banner store IDs, needed once to use kroger_search.
Args: zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set. chain: optional banner filter, e.g. "Harris Teeter", "Kroger", "Ralphs". Matched against store name and chain code, so the everyday spelling works.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | ||
| zip_code | No |
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 burden. The verb 'Find' implies read-only, and the description clarifies it returns store IDs, but it doesn't explicitly state side-effect-free behavior, output shape, or edge cases. Adequate for a simple lookup.
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 succinct and front-loaded: a one-sentence purpose followed by an Args section. The example and matching note are useful without being verbose.
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 find tool with two optional parameters, the description covers purpose, prerequisite, and parameter details. An output schema exists, so return values don't need description. Minor gap: does not define 'nearby' radius or result ordering, but not essential.
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 no descriptions for the two parameters, but the description fully compensates. It explains zip_code format and optionality, and chain filtering with examples and matching semantics ('Matched against store name and chain code'), adding significant value.
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?
Clearly states 'Find nearby Kroger-banner store IDs' with a specific verb and resource. It also explicitly positions the tool as a prerequisite for kroger_search, distinguishing it from sibling tools like list_stores.
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 provides when-to-use guidance: 'needed once to use kroger_search'. It also explains parameter optionality and the chain filter. It doesn't explicitly mention alternatives or when not to use it, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kroger_searchA
Exact SKU-level prices (regular and promo) from a Kroger-banner store via Kroger's official API — Kroger, Harris Teeter, Ralphs, Fred Meyer, King Soopers, QFC, Smith's. More precise than the circular. Requires Kroger API credentials; without them the other tools still work.
Args: query: product term, e.g. "greek yogurt". location_id: store ID from kroger_find_stores. Optional if KROGER_LOCATION_ID is set. limit: max products (default 15).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| location_id | No |
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 must disclose behavior. It does so by stating the credential requirement, the official API source, and the banner store coverage. It does not mention failure modes or rate limits, but it covers the key auth prerequisite and precision claim.
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 front-loaded with the core purpose in the first sentence and uses a clear Args block for parameter details. The list of banners is useful but somewhat lengthy. Overall, it is concise and well-structured.
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 output schema covers return values, so the description focuses on inputs, auth, and comparison to the circular. It lacks explicit differentiation from price_check or search_deals, but the credential note and 'more precise than the circular' cover common alternatives. For a search/pricing tool, this is reasonably 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?
The input schema has no per-parameter descriptions (0% coverage), so the description fully compensates by explaining each parameter: query with example, location_id as store ID from kroger_find_stores with optionality based on an environment variable, and limit with default. This adds complete semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Exact SKU-level prices (regular and promo) from a Kroger-banner store via Kroger's official API' and lists specific banners. It distinguishes itself from store_circular by claiming higher precision and from other tools through the credential requirement.
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 explicitly notes that 'Requires Kroger API credentials; without them the other tools still work,' signalling when to use this tool. It also says 'More precise than the circular,' providing a direct comparison to store_circular. However, it does not explicitly mention alternatives like price_check or search_deals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storesA
List grocery stores near a ZIP code that have an active weekly ad, with how many deals each is running. Start here.
Args: zip_code: 5-digit US ZIP code, e.g. "12345". Optional if the server has a GROCERY_ZIP default configured.
| Name | Required | Description | Default |
|---|---|---|---|
| zip_code | No |
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 burden of behavioral disclosure. It explains the core behavior (listing stores near ZIP with active ads and deal counts) and the optional ZIP behavior, but does not mention potential error conditions, pagination, or rate limits. This is adequate for a simple read-only tool but lacks richer behavioral context.
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 and well-structured: a clear one-sentence purpose statement, a 'Start here' usage hint, and a compact Args section. Every part earns its place without redundant detail or excessive 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?
For a simple single-parameter tool with an output schema present, the description covers the essentials: what the tool does, the input format, and optional behavior. It does not explain return-value details, but the output schema fills that gap. Minor missing context includes what happens if no ZIP is provided and no default is configured, but this is a small omission for the tool's low 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?
The schema only provides a title and default for zip_code, with no description. The tool description fully compensates by specifying it as a 5-digit US ZIP code, giving an example, and clarifying it is optional when a server default exists. This adds significant semantic value beyond the schema, making the parameter's meaning and usage unambiguous.
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's function: 'List grocery stores near a ZIP code that have an active weekly ad, with how many deals each is running.' This is a specific verb+resource+scope and differentiates itself from siblings like search_deals or store_circular by focusing on store-level results with deal counts. The addition of 'Start here' further positions its role.
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?
'Start here' explicitly signals when this tool should be used as an entry point, giving clear context. However, it does not explicitly mention when not to use it or name alternative tools for other scenarios, so it stops short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_checkA
Judge whether a current price is actually good, using the price history this server accumulates. Gets more useful the longer it has been running.
Args: item: the product to evaluate, e.g. "boneless chicken breast". zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| zip_code | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It reveals that the tool relies on locally accumulated price history and that its value grows over time. It implies a read-only action with no side effects. While it doesn't detail the output format or how 'good' is computed, the mention of data source and temporal dependency adds meaningful context beyond a simple 'check price'.
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 and well-structured. The first sentence front-loads the purpose, followed by a brief limitation note and a clear parameter list. Every sentence earns its place—no filler words or redundant phrases.
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's low complexity (two params, no annotations) and the presence of an output schema, the description is remarkably complete. It covers what the tool does, how it works (history accumulation), parameter semantics, and even a practical consideration (usefulness over time). There is no missing critical information for an agent to invoke it 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?
Schema description coverage is 0%, so the description fully compensates. It explains both parameters: 'item' with an example ('boneless chicken breast') and 'zip_code' with format ('5-digit US ZIP code') and optionality condition (optional if GROCERY_ZIP is set). This adds critical meaning beyond the bare schema, which only provides types and a default.
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's verb and resource: 'Judge whether a current price is actually good, using the price history this server accumulates.' This specific purpose distinguishes it from sibling tools like search_deals or store_circular, which are about finding deals, not evaluating a price's quality.
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 clear context for when to use the tool: when you have a current price and want to assess it against historical data. It doesn't explicitly name alternatives or exclusions, but the uniqueness of the use case (price judgment vs. searching deals) makes the usage implied. The note about accumulating history also hints at when it may be less useful (recently started server).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_dealsA
Force a rebuild of the deal index from Flipp. Takes 10-20 seconds. Only needed mid-week; the index otherwise refreshes itself.
Args: zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set.
| Name | Required | Description | Default |
|---|---|---|---|
| zip_code | No |
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 transparency burden. It discloses the time cost (10-20 seconds) and the forced rebuild nature, which implies a mutating operation. However, it does not mention potential side effects, authorization needs, or impact on concurrent operations.
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 compact—three sentences plus a one-line parameter note. Every sentence adds value, with the main purpose and timing front-loaded.
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 single-parameter tool with an output schema, the description covers purpose, timing, usage guidance, and parameter semantics. It lacks only deeper runtime implications such as whether the rebuild blocks other operations or requires specific credentials, but these are not essential for basic invocation.
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 provides only a property name and default, with 0% description coverage. The description's Args section compensates by specifying '5-digit US ZIP code' and noting it is 'Optional if GROCERY_ZIP is set', giving format and conditional requirement.
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?
Description clearly states 'Force a rebuild of the deal index from Flipp' with a specific verb and resource, distinguishing it from siblings like search_deals which query the index.
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?
'Only needed mid-week; the index otherwise refreshes itself' provides explicit when-to-use and when-not-to-use guidance. It implies the alternative of waiting for automatic refresh, though doesn't name a specific sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_dealsA
Search this week's ads across every local grocery store for a product.
Args: query: what you're looking for, e.g. "chicken breast", "greek yogurt". zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set. stores: optional store names to restrict to, e.g. ["Aldi", "Costco"]. max_price: only return items at or below this price. limit: max results (default 25).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| stores | No | ||
| zip_code | No | ||
| max_price | No |
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 burden of disclosing behavior. It reveals that the search covers this week's ads across all local stores and that zip_code is optional if GROCERY_ZIP is set. It does not describe error conditions, result sorting, or whether any side effects occur, but for a read-only search tool, this level of transparency is acceptable.
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 opens with a one-sentence summary and then uses a structured Args list. It is concise, with no filler, 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?
Given the tool's complexity (5 params) and the presence of an output schema, the description provides sufficient context for correct invocation: it specifies what is searched, the optional filters, and the default limit. It could be improved by noting any restrictions on query format or behavior when no results are found, but these are not critical.
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 schema has no descriptions (0% coverage), so the description's Args section fully compensates by explaining each parameter with examples, including the optionality of zip_code, the list format for stores, and the default for limit. This is exemplary parameter documentation.
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 action ('Search this week's ads') and the scope ('across every local grocery store') for a product. This distinguishes it from sibling tools like price_check or store_circular, which likely target specific stores or pricing.
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 clear context: this is for searching products in weekly grocery ads. It implies a general product search, but does not explicitly mention when to use alternative sibling tools like price_check or kroger_search. Since it explains the tool's role, it merits a 4, though explicit exclusions would be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shopping_planA
Turn a shopping list into a trip plan: which store to buy each item at.
Args: items: things you want to buy, e.g. ["chicken thighs", "blueberries"]. zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set. max_stores: how many stores you're willing to visit (default 2).
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| zip_code | No | ||
| max_stores | No |
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 burden of behavior disclosure, and it adds useful context beyond the schema: zip_code is optional if GROCERY_ZIP is set, max_stores defaults to 2, and items are demonstrated with a concrete example. It does not describe failure modes or network dependencies, but it clearly describes the core behavior for a non-destructive planning 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 a single front-loaded sentence stating the tool's purpose, followed by a compact Args block. No filler or redundant information; every sentence provides value, making it highly 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 tool's moderate complexity, the presence of an output schema, and no annotations, the description covers all necessary aspects: what it does, required/optional inputs, defaults, and an example. There is no significant missing context for an agent to select and invoke it 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?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. Each parameter is explained: items with an example, zip_code with format and optionality, and max_stores with its meaning and default. This adds meaning well beyond the raw 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 starts with a specific verb phrase 'Turn a shopping list into a trip plan' and clearly identifies the resource and output: which store to buy each item at. This differentiates it from sibling tools like list_stores or price_check, which focus on individual store data or pricing rather than multi-store planning.
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 makes the intended context explicit: you use this when you have a shopping list and need to know where to buy each item. It does not explicitly name alternatives or state when not to use it, but the 'trip plan' framing and parameter examples provide clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_circularA
Show everything in one store's current weekly ad.
Args: store: store name, e.g. "Giant Food", "Aldi", "Costco". zip_code: 5-digit US ZIP code. Optional if GROCERY_ZIP is set. limit: max items to return (default 150).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| store | Yes | ||
| zip_code | No |
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 burden of disclosing behavioral traits. It explains that zip_code is optional if GROCERY_ZIP is set and that limit has a default, which adds useful behavioral context. However, it does not explicitly state read-only semantics, potential errors, or what happens if the store is not found. These are relatively minor for a read-only 'show' tool, but the description is not exhaustive.
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 two sentences plus a compact Args block. The purpose is front-loaded, and every sentence provides useful information. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description is largely complete. It covers the tool's function and all parameter semantics. It does not discuss error cases, but that is not strictly necessary when an output schema exists. It could be improved by mentioning the relationship to sibling tools, but that is not critical.
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 schema has 0% description coverage, so the description must compensate. It fully documents all three parameters: store with examples, zip_code with format and conditional need, and limit with default. This adds meaningful guidance beyond the schema, though it could include more detail on accepted formats or edge cases.
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's function: showing everything in one store's current weekly ad. It specifies the resource (store's weekly ad) and the scope (one store), which differentiates it from sibling tools like search_deals that likely search across stores. It could be more explicit about how it relates to siblings, but the purpose is clear and specific.
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 implies the use case—when you want a full weekly ad for a specific store. It does not explicitly mention alternatives or when not to use it, but the purpose is clear enough that an agent can infer when to invoke it. There is no explicit exclusion or comparison to sibling tools like search_deals or price_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but there is overlap between list_stores and kroger_find_stores (both find stores) and between search_deals and kroger_search (both search for products, though against different data sources). Descriptions clarify the differences well enough.
Naming style is mixed: list_stores, search_deals, price_check, and refresh_deals follow verb_noun, while store_circular and shopping_plan are noun phrases, and kroger_search/kroger_find_stores add a brand prefix. All use snake_case, but the inconsistent verb/prefix usage is noticeable.
Eight tools is well-scoped for a grocery deals server. Each tool serves a clear purpose within the domain, and none feel redundant or excessive.
The set covers the core lifecycle: discover stores, search deals, view circulars, plan shopping, check price history, and refresh data. The Kroger-specific tools add precision. Minor gaps exist (e.g., no store details or deal detail endpoint), but agents can accomplish primary workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server aggregating developer infrastructure deals, free tiers, and startup programs
Hosted MCP server exposing US hospital procedure cost data to AI assistants
An MCP server that provides congressional transcripts
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceA 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.711528AGPL 3.0
- AlicenseAqualityAmaintenanceAn MCP server for Nordic grocery shopping that finds deals across supermarkets in Denmark, Norway, Sweden, and Finland, plans weekly dinners around cheap ingredients, and generates shopping lists grouped by store.1827MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for grocery shopping at Kroger-owned stores, enabling product search, store finder, cart management, and more through AI assistants.29MIT
- AlicenseAqualityCmaintenanceMCP server that queries Norwegian grocery store flyers (kundeaviser) to help AI agents plan cheap meals based on current offers.7MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tx-smitht/grocery-deals-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server