market-screening
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., "@market-screeningFind the cheapest basket for milk, eggs, bread, and butter across my stores"
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.
market-screening
MCP server that helps an LLM answer "where should I buy my grocery list?" across Russian retail chains. You give the assistant a shopping list; it searches the products in the stores you shop at, matches comparable items (by price per kg / l), and computes the cheapest plan: everything in one store, or split across 2–3 stores.
Status: early prototype.
Chain | Status | Source | Notes |
Magnit | ✅ | website JSON API | per-store prices, stock, promos, card-only badges |
VkusVill | ✅ | server-rendered search page | default-region (Moscow) prices, no per-store stock |
Dixy | ❌ | — | listing endpoint behind WAF (403) |
Pyaterochka, Perekrestok, Lenta | ❌ | — | JS anti-bot challenge |
How it works
Tool | What it does |
| Stores from your |
| Products with price, promo/old price, price per kg/l, stock, card-only badges |
| Exact totals: best single store vs best split, saving |
The LLM does the fuzzy part (which "молоко" in each store is comparable); the server does the arithmetic, so totals are not hallucinated.
Data comes from the same public JSON endpoints the chains' websites use, without login. Results are cached for 15 minutes to keep the load on the sites minimal.
Related MCP server: PriceAtlas MCP Server
Setup
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
cp config.example.toml config.toml # put your store codes thereFinding your Magnit store code: open magnit.ru, pick your store, then
DevTools → Network → goods/search → Payload → storeCode.
Claude Code
claude mcp add market-screening -e MARKET_SCREENING_CONFIG=$PWD/config.toml -- $PWD/.venv/bin/market-screeningClaude Desktop / other MCP clients
{
"mcpServers": {
"market-screening": {
"command": "/path/to/market-screening/.venv/bin/market-screening",
"env": { "MARKET_SCREENING_CONFIG": "/path/to/market-screening/config.toml" }
}
}
}Network note
Chains often block foreign IPs. If you use a VPN, route the chains' domains directly
(split tunneling), e.g. for v2rayA RoutingA — place these above any geosite: rules:
domain(domain:magnit.ru, domain:dixy.ru, domain:vkusvill.ru)->directAdding a chain
Create src/market_screening/adapters/<chain>.py with an Adapter subclass that
implements _search(store, query, limit) -> list[Product], register it in
adapters/__init__.py, and add a parsing test with a small fixture in tests/.
Disclaimer
Unofficial project, not affiliated with any retailer. Endpoints are undocumented and may change. Intended for personal use; respect the sites' terms and keep request volume low.
License
MIT
Available Tools
3 toolslist_storesC
Stores configured by the user (chain, store code, name). Use the key field elsewhere.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden and largely drops it: it does not state that this is a read-only operation, whether the full set of configured stores is returned or paginated, or what happens when none exist. Only the mention of descriptive fields gives any behavioral hint, and that mostly duplicates the output schema.
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 very short clauses with no wasted words, and the resource identity is front-loaded. The trailing pointer about the `key` field is terse to the point of being cryptic, but the overall size is appropriate for a trivial no-arg lookup.
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-value explanation is not required, and a zero-parameter tool is inherently simple. However, with no annotations the description should have stated the read-only nature and whether the list is complete or paginated; those omissions leave a modest but real gap.
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 tool takes zero parameters, so there is nothing for the description to disambiguate beyond the schema. The note about the `key` field usefully tells the agent how to consume results elsewhere, which adds a small amount of semantic 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?
The description names the resource ('Stores configured by the user') and its identifying fields (chain, store code, name), but never states an explicit verb such as 'list' or 'returns'. An agent can infer enumeration from the tool name, but the description itself is a noun phrase rather than a clear action statement.
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 only guidance is 'Use the `key` field elsewhere', which hints at cross-referencing results but never says when to call this tool or what it replaces. No alternatives or exclusions are given, and the listed siblings (search_products, optimize_basket) are not addressed, leaving the agent to infer that this is a prerequisite lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_basketA
Compute the cheapest way to buy the basket.
basket: [{"item": "молоко", "quantity": 2, "offers": {"magnit:123456": 89.99, "dixy:123": 92.5}}]
offers: price in rubles per one unit of quantity, for the product you matched in each store; omit a store if it has no suitable product. max_stores: how many different stores the user is willing to visit. extra_store_cost: rubles the user is willing to pay to avoid each extra store visit.
| Name | Required | Description | Default |
|---|---|---|---|
| basket | Yes | ||
| max_stores | No | ||
| extra_store_cost | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully explains offers as per-unit prices for matched products and says to omit a store with no suitable product, and explains the extra_store_cost tradeoff, but it does not state whether the operation has side effects or what the result looks like.
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 and front-loads the purpose before giving the basket example and parameter meanings. It earns most of its words, though the example formatting is somewhat 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?
It covers the input shape and optimization semantics well for a tool with no annotations and limited schema descriptions. However, with no output schema, the description should say what kind of result the optimizer returns, and it does not.
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 does so substantially: the basket example clarifies item, quantity, and offers, and it explicitly defines max_stores and extra_store_cost in user-facing terms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: compute the cheapest purchase plan for a basket. It is clearly different from list_stores and search_products, though it does not explicitly name or contrast those siblings.
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 optimization purpose implies when to use it, but there is no explicit guidance on when to choose it versus search_products or list_stores, nor any prerequisite or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsA
Search a product in the configured stores.
query: what to look for, in Russian, e.g. "молоко 2.5%", "куриное филе". stores: optional list of store keys from list_stores (default: all). Returns per store a list of products: price in rubles, old_price if on promo, unit_price per kg / l / pcs (compare by this), stock, badges, url. Search is fuzzy: results can include unrelated items (e.g. oat drink for "молоко").
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| stores | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does well: it discloses fuzzy matching that can return unrelated items, and describes returned fields such as price in rubles, old_price during promo, unit_price for comparison, stock, badges, and url. It omits limit behavior, rate limits, and any auth/permission 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 front-loaded with purpose, then labeled parameter notes, return shape, and the important fuzzy-search caveat. It is dense but efficient, with no filler sentences.
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 output schema and no annotations, it supplies substantial context: query language, store scoping, return fields, and fuzzy behavior. It is not fully complete because limit semantics and any pagination or permission behavior are absent.
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 query semantics (Russian, examples) and stores semantics (optional store keys from list_stores, default all), but it does not document the limit parameter at all, leaving one of three parameters unexplained.
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 ('Search') and resource ('product') with scope ('configured stores'). It references list_stores only as the source of store keys, and does not explicitly contrast itself with optimize_basket or any other alternative.
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 useful usage context: query should be in Russian with examples, and stores is optional with default all, sourced from list_stores. However, it does not say when to use this tool versus optimize_basket, nor give any when-not-to-use guidance.
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.
3 tool updates
v0.1.0- First observed
list_stores - First observed
optimize_basket - First observed
search_products
TDQS
Scored across 3 tools
Each tool occupies a distinct stage of a clear pipeline: list_stores enumerates configured stores, search_products finds items with prices, optimize_basket computes the cheapest multi-store purchase. There is no overlap in purpose or output, so an agent cannot plausibly misselect.
All three names follow the same snake_case verb_noun convention (list_stores, search_products, optimize_basket), with the verb accurately signaling the operation (list vs. search vs. optimize).
Three tools map cleanly onto the domain's three steps (enumerate stores, search products, optimize basket), so no tool is filler. It sits at the lean end of appropriate: there is no direct product-lookup or price-refresh tool, which would round the set out.
The end-to-end flow (stores -> products -> cheapest basket) is covered and the schemas are explicit about how data passes between tools. The gap is that prices/offers must be hand-carried from search_products into optimize_basket, and there is no key-based product or price lookup to refresh an item without a new fuzzy search.
Maintenance
Related MCP Connectors
Live prices, deals & optimal multi-stop shopping routes for German grocery & drug stores.
RU merchant catalog for AI agents: live price, stock, choices and controlled checkout. Not x402.
Where to buy a whole grocery list today: local prices, per-unit and cross-store comparison.
Turn any shopping list into a ready-to-checkout grocery cart across 26 European supermarkets.
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
- FlicenseBqualityDmaintenanceProvides MCP tools for searching and comparing products on Wildberries (and Ozon planned), including product search, detailed card retrieval, and review fetching, normalized for LLM consumption.32-
- AlicenseCqualityDmaintenanceEnables AI assistants and MCP clients to search Pyaterochka stores, browse categories, find products with filters for price, brand, and promotions, and retrieve product details, store hours, and promotion conditions through the exposed MCP tools.1210MIT