podrygka-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., "@podrygka-mcpFind discounted lipsticks available in Moscow 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.
podrygka-mcp
English · Русский
An MCP server that gives LLM agents live, honestly-labelled data from podrygka.ru, the online shop of the «Подружка» cosmetics chain: catalog search with the site's filters, product cards with every discount explained, stock in each store of your city, delivery terms, and reviews with the variant's own rating kept apart from the product line's.
Buyer side, anonymous: no account, login or cart. The server reads the same JSON API the site's pages use, with plain HTTP — no browser.
Why this server
The shop's data is easy to fetch and easy to misread. Everything below was found by checking the API against the pages a person sees:
Pitfall on podrygka.ru | What this server does |
The catalog API answers for Moscow unless a region is sent; the store-stock endpoint takes the region from cookies and silently falls back to Moscow | Resolves your city through the shop's own city directory, sends the region with every request, checks store answers against the region's store list and refuses foreign ones |
"Available in 12 stores" counts the whole region (Yekaterinburg + Pervouralsk), not the city | Stores of the city and of the rest of the region are listed separately, with units, the site's level (мало/средне/много) and opening hours |
The rating and review count in the catalog belong to the whole product line: all 20 shades of a lipstick show "4.1 · 92" |
|
The review widget's own counter is higher than the published reviews (117 vs 104) | Counts come from the published feed |
Shades and volumes are separate articles with different prices and stock (801–951 ₽ within one lipstick line); one line can take several search tiles | Tiles of one line are merged ( |
From 09:00 to 12:00 Moscow time the site shows a −5 % morning discount to everyone, and it is gone at 12:00 |
|
«Выгодная цена», «Выгодная пара» and «1+1=3» are card-holder promotions by the chain's rules, yet the site shows their prices to anonymous visitors | Each promotion carries |
«Выгодная пара» and «1+1=3» discounts are applied only in the cart |
|
Delivery cost appears only at checkout |
|
Without | Asks the way the product page does |
An unknown store id in the filter is silently ignored — the "filtered" search returns everything | Store ids are checked against the region's store list; brand, category and promotion filters are verified on the results |
The review provider (Aplaut) returns buyers' e-mails and phone numbers | Reviews pass through an allow-list: stars, text, pros, cons, date, verified, likes, photo count, time of use; covered by a test with fake personal data |
A rating of 0 means "no reviews", not zero stars | No rating field then, |
The price in a physical store can differ from the online price (the site says so) | Stated in |
Every answer carries fetched_at (UTC), the city it was computed for (as the
shop's directory names it, and where the choice came from), price_scope and
morning_window.
Related MCP server: wildberries-mcp
Tools
Tool | What it returns |
| 20 tiles per page (fixed by the site); sort |
| Everything above for one article plus: instalment split, every variant (shade/volume) with its own price, stock and delivery terms, stock per store (city vs rest of the region), delivery options with |
|
|
| Units in each store of the city (address, level, hours, coordinates), stores elsewhere in the region, the online warehouse separately |
| Stores of the region with ids for |
| Up to 20 articles side by side in two requests; articles the site does not return are listed with a reason |
| Cities in the shop's directory with their regions; tells how to name same-named towns ( |
Requirements
Measured on Linux (CachyOS), Python 3.12, from a residential IP in Russia:
Python | ≥ 3.10, with uv (or pip) |
Browser | Not needed: plain HTTP ( |
Docker, display | Not needed |
Disk | ≈33 MB for the environment ( |
Memory | ≈73 MB RSS after start, ≈82 MB after a search and a product card |
Start | The server is ready in ≈0.4 s (≈1.6 s via |
Latency | Requests to the shop are spaced 1.5 s apart, so time is mostly pauses: first search with an empty cache ≈7 s (city lookup, guest token, results, delivery terms), next searches ≈4 s, a full product card ≈6–8 s. Each HTTP call itself takes 0.1–0.8 s |
Network | Works from a Russian residential IP. Foreign, VPN and datacenter IPs were not tested; the shop sits behind the NGENIX CDN, which can block them. |
Install
Claude Code:
claude mcp add podrygka -- uvx --from git+https://github.com/SZhukovWork/podrygka-mcp podrygka-mcpAny MCP client (claude_desktop_config.json, .mcp.json, …):
{
"mcpServers": {
"podrygka": {
"command": "uvx",
"args": ["--from", "git+https://github.com/SZhukovWork/podrygka-mcp", "podrygka-mcp"]
}
}
}From a checkout: uv venv && uv pip install -e . && .venv/bin/podrygka-mcp.
Configuration (environment variables)
Variable | Default | Meaning |
|
| Default city for stock and delivery (any tool also takes |
|
| Seconds between requests to podrygka.ru. Keep it: the shop has no published limits and the IP is yours |
| — | Proxy URL, e.g. |
|
| Guest token, review-widget key, city, category and store lists (files |
|
| HTTP timeout, seconds |
|
|
|
What the numbers mean
price_online_rub— the big price on the product page for a visitor who is not signed in. It was the same for Moscow and the Sverdlovsk region on all 184 positions compared; the price in a physical store may differ.price_before_discount_rub— the crossed-out price.discount_kind—promo: a chain promotion («Выгодная цена», SALE);morning_5pct: the morning −5 % (only between 09:00 and 12:00 MSK, then the price becomesprice_after_morning_window_rub);unknown: a discount without a promotion shield that the server cannot attribute;none.requires_loyalty_card— what the chain's rules say:truefor «Выгодная цена», «Выгодная пара», «1+1=3» and the morning discount,falsefor SALE,"unknown"for gifts. The site shows these prices to anonymous visitors; what the cart charges a guest was not checked.Personal card discount (3–15 %) is not included and cannot be computed without logging in; by the rules it does not stack with promotions and does not apply to CATRICE, ESSENCE, GILLETTE.
Ratings —
rating_line/reviews_linein search andrating.shown_on_sitein the card are the line's (rounded to 0.1, as on the site).rating.lineis the same from the star split;rating.variantis computed from the article's own reviews (computed: true).Stock —
online_qtyis the single online warehouse of the chain;stores_qty_in_regionandshops_in_regioncover every store of the region;stores.in_citylists this city's stores.levelis the site's own label.Delivery —
whenis the site's wording ("сегодня", "завтра", "2 - 3 дня");cost_rubis alwaysnull(known only at checkout). When the site promises pickup "today" but no store of the region has the item, the option carries a note.unit_price— price per 100 ml / 100 g / 1 pc, only when the pack size appears exactly once in the product name.
Limitations
Unofficial: relies on the site's internal API (
/api/v3, JSON-RPC/api/v2) and on the Aplaut review widget, which can change at any time. The site is mid-migration (Bitrix → Next.js); parsers are isolated inparse.pyand covered by tests on recorded answers.Anonymous only: no personal card price, promo codes, bonuses or cart totals. «Выгодная пара», «1+1=3» and gifts are computed in the cart and are not priced here.
The morning window's end (12:00 MSK) was observed; its start (09:00) comes from the chain's rules. Whether a guest's cart honours the morning price or «Выгодная цена» was not checked.
The shop's own review API (
/api/v3/content/reviews) answers 500 at the moment; reviews come from Aplaut. The server tries the shop's API first (once per hour) with a parser written from the site's JavaScript, not from a real answer. In thelinescope a review is not tied to a shade.The store list (
list_stores) has no opening hours and not every address names its town; hours come withget_store_availability.No price history, barcodes (EAN) or manufacturer codes: the site has none.
Only Moscow and the Sverdlovsk region were checked in detail.
The catalog API does not echo the region it answered for. The server sends the region with every call and cross-checks what can be checked: the city name from the shop's directory, the towns of the stores in stock answers against the region's store list, and the card's store count against the stores listed.
robots.txtdisallows/api/v3. Use the server for personal price research at a human pace.
Roadmap
Later: optional account mode (off by default): log in once to see your personal card price and exact delivery cost.
Later: cart on top of the account mode.
Checkout, payment and changing the delivery address are deliberately out of scope.
Development
uv venv && uv pip install -e '.[dev]'
.venv/bin/pytest # offline tests on recorded answers (no network)
.venv/bin/pytest -m live # end-to-end over MCP stdio against live podrygka.ru (~25 requests, ~40 s)Layout: client.py (request policy: pacing, guest token, one retry, sanity
checks, caches), parse.py (pure functions over the shop's JSON: prices,
promotions, ratings, stock, stores, reviews), server.py (tools).
Fixtures in tests/fixtures/ are recorded answers, trimmed; review authors are
removed.
Disclaimer
Not affiliated with «Подружка» or Aplaut. The server uses undocumented internal endpoints of the shop's website; it is intended for personal use at a human request rate. Respect the shop's terms of use.
License: MIT.
Available Tools
7 toolscompare_productsARead-onlyIdempotent
Up to 20 articles side by side in one request: price and discount kind, promotions with card rules, price per unit, line rating, variants, online and region stock, delivery terms.
Articles the site does not return are listed with a reason.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург | |
| articles | Yes | Articles to compare |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it discloses what happens when articles are not returned ('listed with a reason'), and enumerates the data fields delivered. This gives the agent a realistic expectation of response completeness without needing to inspect 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 sentences, zero filler. The first sentence front-loads the tool's capability and key output fields; the second adds an important edge-case behavior. Every word contributes to an agent's 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?
Given the tool's moderate complexity (2 params, 1 required, output schema present), the description is complete. It states the upper bound (20), the data returned, and the fallback behavior for missing articles. The output schema covers return structure, and the city parameter is documented in the schema. There are no critical gaps that would prevent correct 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?
Schema description coverage is 100%, with both 'articles' and 'city' already described in the schema. The description mostly reiterates the maxItems=20 constraint and provides a list of returned fields, but does not add new meaning about parameter formats, city syntax, or article identifier types. Baseline 3 is appropriate because the schema carries the semantic burden.
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 clear verb-resource structure: 'Up to 20 articles side by side in one request' immediately identifies a batch comparison tool. It lists specific output dimensions (price, discounts, promotions, stock, delivery), which distinguishes it from siblings like get_product (single product) and search_products (search). The resource and scope are 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?
The description implies when to use it: when you need multiple articles compared in one request, with up to 20. It does not explicitly name alternatives or state when not to use it, but the context is clear enough for an agent to select it over get_product for batch comparison tasks. Minor gap: no explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_cityARead-onlyIdempotent
Cities in the shop's directory matching a name, with their region.
Use the exact name (plus ', ' when several towns share it) as city in other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | City name or its beginning, e.g. «Березовский» or «Каменск» |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering safety. The description adds behavioral nuance beyond annotations: it discloses the disambiguation rule for duplicate town names (appending ', <region>') and that results are intended for use as the `city` parameter elsewhere. This is meaningful added context, though it doesn't discuss pagination or result volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the purpose, the second provides the essential usage follow-up. The most important information is front-loaded, and every sentence earns its place.
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 lookup tool with rich annotations, an output schema, and no competing city-related siblings, the description covers everything needed: what it does, how to call it (via schema), and how to consume the result. No critical operational or usage detail 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 description coverage is 100%; the `query` parameter is fully documented in the schema ('City name or its beginning, e.g. «Березовский» or «Каменск»'). The tool description does not add significant semantic detail about the parameter beyond what the schema already states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: finding cities in the shop's directory by name and returning their region. It clearly distinguishes this from all siblings, which deal with products, reviews, stores, and comparisons, not city 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?
The second sentence explicitly instructs how to use the result: 'Use the exact name (plus ', <region>' when several towns share it) as `city` in other tools.' This tells the agent when and how to apply the tool's output, making the call context concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productARead-onlyIdempotent
Full live card of one article.
Online price with the kind of discount and the promotions' card rules, price per unit, online stock and store stock (city stores separate from the rest of the region), delivery terms for the city (cost only at checkout), ratings — the line rating shown on the site next to the variant's own rating computed from its own reviews — every variant with its price and stock, characteristics (country, tone, composition, usage, package dimensions and weight).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург | |
| article | Yes | podrygka.ru article (артикул), the number in the product URL, e.g. 242804 | |
| include_stores | No | Stock per store of the city and the region | |
| include_variants | No | List every shade/variant of the line with its own price and stock | |
| include_description | No | Add the product description text |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only/idempotent annotations by disclosing concrete behavioral details: delivery cost is only available at checkout, store stock separates city stores from the region, and ratings distinguish line-level rating from variant rating computed from its own reviews. It also notes promotion card rules and that every variant is returned with its own price and stock.
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 one-sentence overview 'Full live card of one article' is front-loaded, and the following detailed sentence is dense but relevant. It could be more scannable if split into bullets, but no clause is wasted.
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 annotations covering the safety profile and an output schema present, the description supplies the remaining context an agent needs: exact data categories, a stock-location nuance, a delivery-cost caveat, and a rating computation distinction. No critical operational detail appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter descriptions already explain city, article, include_stores, include_variants, and include_description clearly. The description adds useful output context but does not materially improve an agent's understanding of how to populate the parameters beyond what the schema already provides.
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 opening phrase 'Full live card of one article' clearly states the resource (one article) and the result (a complete live card). It doesn't explicitly contrast overlapping siblings like get_reviews or get_store_availability, but the one-article scope is enough to separate it from search_products and 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?
The description establishes clear context: use this tool when you need a detailed live card for a specific article, including price, stock, delivery, ratings, and characteristics. It doesn't list exclusions or directly recommend alternative tools, but the intended use case is explicit enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewsARead-onlyIdempotent
Buyer reviews: date, stars, text, pros, cons, 'verified' flag, likes, photo count, time of use.
Also the star split and the average computed from it for the chosen scope, next to the line rating the site shows. Reviews in the 'line' scope are not tied to a shade. Author names, e-mails, phones and order numbers are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page of reviews | |
| sort | No | Newest first, or most helpful first | newest |
| limit | No | Reviews per page | |
| scope | No | 'variant' = only this article's own reviews; 'line' = all shades/variants of the line | variant |
| article | Yes | podrygka.ru article (артикул), the number in the product URL, e.g. 242804 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds valuable behavioral details: line-scope reviews are not tied to a shade, the star split and average are computed for the chosen scope, and author names, e-mails, phones, and order numbers are never returned. These are meaningful privacy and aggregation behaviors beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, starting immediately with the returned fields, then adding aggregate behavior, scope nuance, and privacy guarantees. Every sentence contributes useful information with 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?
For a read-only review-fetching tool, the description covers the returned data, aggregate statistics, scope semantics, and privacy exclusions. Pagination, sorting, limits, and required article are documented in the schema, and an output schema exists, so nothing critical is left unexplained.
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 five parameters. The description adds beyond this by explaining the line-scope behavior ('not tied to a shade') and how the star split/average relates to the chosen scope, which enriches the meaning of the 'scope' parameter.
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 identifies the tool as a buyer-reviews retriever and enumerates the exact fields returned (date, stars, text, pros, cons, verified flag, likes, photo count, time of use). It also distinguishes the tool from siblings by mentioning the variant/line scope, making it obvious this is the review-specific tool among product search, store, and comparison tools.
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 for when to use the tool: fetching reviews for a chosen article, with a selectable scope of 'variant' or 'line'. It does not explicitly name sibling alternatives or state when not to use it, but the context is strong enough that an agent can infer the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_availabilityARead-onlyIdempotent
Where one article can be picked up today: stock in each store of the city, the rest of the region, and online.
Per store: address, units, the site's level (мало/средне/много), opening hours, coordinates. The online warehouse is reported separately. Store prices may differ from the online price.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург | |
| article | Yes | podrygka.ru article (артикул), the number in the product URL, e.g. 242804 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds two non-obvious behaviors: the online warehouse is returned separately, and store prices may differ from the online price. That is useful context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loads the core purpose, and every sentence adds information: output scope, returned per-store fields, and online/price caveats. There is no fluff.
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 read-only lookup with two parameters, an output schema, and strong annotations, the description covers all behavioral context needed: scope (city/region/online), per-store data presence, separate online warehouse, and price discrepancy. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the article format and city default. The description does not add new parameter-level details; its references to 'one article' and geographic scope are helpful but already implied by the schema and annotations.
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 leads with a concrete task, 'Where one article can be picked up today,' then defines the result: stock per store, region, and online. This clearly separates it from sibling tools like get_product (product info) and list_stores (store info without 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?
It gives clear context: use this to answer where a single article is available today, including local stores, regional stores, and online. It does not explicitly name alternatives or exclusion conditions, but the scope is obvious enough that an agent will not confuse it with the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storesARead-onlyIdempotent
Stores of the chain in the city's region with their ids (for search in_store) and addresses.
products_in_stock is how many catalog items the site counts in stock in that store.
Stores are grouped by what the address says: this city, another town of the region, or
no town in the address.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful context beyond that: grouping by address interpretation (this city, another town, no town) and the meaning of products_in_stock as the site's catalog count rather than physical inventory.
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 compact sentences with no filler. The first sentence states the output and purpose, the second defines an important field, and the third explains grouping. Appropriate length for the tool's simplicity.
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 low-complexity, read-only list call with one optional parameter and an output schema, the description covers scope, field semantics, and grouping behavior. It could be slightly more explicit about when to use this tool over siblings, but nothing needed to invoke 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?
The input schema already fully documents the single optional city parameter, including the default and the region-suffix formatting hint. The description adds no additional parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('stores of the chain'), the scope ('in the city's region'), and the purpose ('ids for search in_store'). It is more than a restatement of the name, though it is phrased as a noun phrase rather than an explicit verb like 'List'.
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 an implicit usage context ('for search in_store') and explains how stores are grouped, but it does not explicitly say when to prefer this tool over siblings like get_store_availability or search_products, nor does it 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.
search_productsARead-onlyIdempotent
Search the podrygka.ru catalog like the site: pages of 20, sorting, price window and filters.
Per item: online price with the kind of discount it contains and the promotions with
their card rules, price per 100 ml/g when the pack size is in the name, line rating and
review count (shared by all shades), number of variants and their price range, online
stock, stock and number of stores in the region, delivery terms for the city.
total_found counts tiles (one line can take several); has_more tells whether another
page exists. Confirm finalists with get_product.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург | |
| page | No | Result page; the site gives 20 tiles per page | |
| sort | No | Order of results, as on the site; price sorts use the online price | popular |
| brand | No | Brand name (e.g. KENSUKO) or brand_code from results (brand_kensuko) | |
| limit | No | Return at most this many items of the page | |
| query | Yes | Search phrase as typed on the site (Russian works best) | |
| category | No | Category name (e.g. «Шампуни») or category_code from results | |
| in_store | No | Only products in stock in this store: store id from list_stores (store_28158) | |
| price_max | No | Upper bound of the online price, rubles | |
| price_min | No | Lower bound of the online price, rubles | |
| promo_only | No | Only products in a price promotion (Выгодная цена, SALE, Выгодная пара, 1+1=3) | |
| group_variants | No | Merge tiles of one product line (shades of one lipstick) into one item |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and idempotentHint already present, the description adds substantial behavioral detail beyond the annotations: pagination at 20 tiles per page, grouping of variants, semantics of total_found counting tiles rather than items, and has_more meaning another page exists. It also discloses the per-item fields returned and the recommendation to confirm finalists with get_product. This is rich, honest behavioral disclosure.
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 a clear purpose and then organized into a scannable list of return values, followed by pagination semantics and tool routing. It is longer than minimal, but each sentence carries information; however, some of the per-item return details may be redundant with the existing output schema, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters with full schema coverage, a detailed output schema, and rich annotations, the description adds the missing contextual glue: how pages and tiles work, what total_found and has_more mean, that variants are merged, and that get_product should be used for finalist confirmation. This is complete enough for an agent to call the tool correctly without further documentation.
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 already covers 100% of parameters with individual descriptions, so the baseline is 3. The description does not significantly add parameter-specific semantics; it refers generically to sorting, price window, and filters, which map to sort, price_min, price_max, profit_only, and other schema fields, but without new meaning. The output-focused details (total_found, has_more, per-item fields) are behavioral rather than parameter semantics, so the description earns the baseline but not more.
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: 'Search the podrygka.ru catalog like the site' and immediately scopes the function to catalog search with pagination, sorting, price window, and filters. It also names a sibling tool, get_product, as the follow-up for finalizing results, which distinguishes it from other tool operations. This makes the purpose unmistakable even without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it behaves like the site's search, returns tiles with detailed product info, and explicitly says 'Confirm finalists with get_product,' which routes the agent to the right follow-up. It does not enumerate when to avoid this tool in favor of compare_products or list_stores, but the primary search role and the get_product handoff are clearly conveyed.
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
compare_products - First observed
find_city - First observed
get_product - First observed
get_reviews - First observed
get_store_availability - First observed
list_stores - First observed
search_products
TDQS
Scored across 7 tools
Each tool targets a clearly distinct concern: searching, city lookup, product details, reviews, per-store availability, store listings, and side-by-side comparison. Even the overlapping search/compare/detail tools are cleanly separated by cardinality and purpose.
All tool names follow a consistent snake_case verb_noun pattern: search_products, find_city, get_product, get_reviews, get_store_availability, list_stores, compare_products. The verbs and nouns are descriptive and predictable.
Seven tools is well-scoped for a read-only retail catalog information server. Each tool earns its place and the count is neither thin nor bloated.
The toolkit covers the full read-only product information workflow: finding the city, searching the catalog, getting full product details, reading reviews, checking store availability, listing stores, and comparing products. No significant workflow dead ends are apparent for the stated domain.
Maintenance
Related MCP Connectors
Web search, page reading and structured extraction for AI agents, with strong RU coverage
RU merchant catalog for AI agents: live price, stock, choices and controlled checkout. Not x402.
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Agent-native product catalog: 300M+ products, 150,000+ stores, deliver_to ranking.
Related MCP Servers
- FlicenseBqualityCmaintenanceProvides 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-
- AlicenseAqualityBmaintenanceEnables LLM agents to query live Wildberries marketplace data — product search with pages, sorting, price filters, per-article ratings and reviews, weekly price history, and seller legal details — with honest, sanity-checked answers and automatic anti-bot handling.5MIT
- AlicenseAqualityCmaintenanceEnables LLM agents to retrieve live, accurately-labelled product data from Ozon's public storefront, including search with pagination and sorting, all price variants, delivery dates, seller legal details, variants, and SKU-specific ratings and reviews, all without an Ozon account.4MIT
- AlicenseAqualityCmaintenanceEnables LLM agents to access live aliexpress.ru storefront data, including variant-specific ruble prices, order-accurate coupons, delivery quotes to Russian cities, seller info, and paginated buyer reviews with filters.4MIT