Skip to main content
Glama
SZhukovWork

podrygka-mcp

by SZhukovWork

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"

rating_line is labelled as such; get_product computes the variant's own rating from its own reviews and says "no own reviews" instead of borrowing the line's

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 (group_variants); every variant is listed with its own price and stock

From 09:00 to 12:00 Moscow time the site shows a −5 % morning discount to everyone, and it is gone at 12:00

discount_kind: morning_5pct, price_after_morning_window_rub and a morning_window block in every answer

«Выгодная цена», «Выгодная пара» 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 requires_loyalty_card and the rule it rests on, marked "cart not checked"

«Выгодная пара» and «1+1=3» discounts are applied only in the cart

price_effect says the shown price does not include them

Delivery cost appears only at checkout

cost_rub: null with the reason, never 0

Without showAll=true the delivery endpoint drops the pickup-point (ПВЗ) option the product page shows

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, reviews_line: 0

The price in a physical store can differ from the online price (the site says so)

Stated in price_note next to every price

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

search_products(query, page, sort, price_min, price_max, brand, category, in_store, promo_only, city, group_variants, limit)

20 tiles per page (fixed by the site); sort popular / rating / price_asc / price_desc; total_found, total_pages, has_more. Filters: price window, brand (name or brand_code), category (name or category_code), a store (in_store, ids from list_stores), price promotions only. Per item: online price, pre-discount price, discount_kind, promotions with their card rules, price per 100 ml/g, line rating and review count, number of variants and their price range, online stock, stock and stores in the region, delivery terms for the city, URL

get_product(article, city, include_variants, include_stores, include_description)

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 cost_rub: null, ratings — shown_on_site (line), line (computed from stars) and variant (its own reviews) — and characteristics (country, tone, texture, composition, usage, package dimensions and weight)

get_reviews(article, scope, page, limit, sort)

scope=variant (this article's own reviews) or line; sort=newest or helpful; up to 50 per page. Date, stars, text, pros, cons, verified, likes/dislikes, photo count, time of use; star split and average for the scope; the line rating the site shows. No author data

get_store_availability(article, city)

Units in each store of the city (address, level, hours, coordinates), stores elsewhere in the region, the online warehouse separately

list_stores(city)

Stores of the region with ids for in_store, addresses and how many catalog items each has in stock

compare_products(articles, city)

Up to 20 articles side by side in two requests; articles the site does not return are listed with a reason

find_city(query)

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 (requests)

Docker, display

Not needed

Disk

≈33 MB for the environment (mcp, requests and their dependencies); ≈0.1 MB of cache in ~/.cache/podrygka-mcp

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 uvx from a local checkout, including the build)

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. PODRYGKA_PROXY sets a proxy

Install

Claude Code:

claude mcp add podrygka -- uvx --from git+https://github.com/SZhukovWork/podrygka-mcp podrygka-mcp

Any 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

PODRYGKA_CITY

Екатеринбург

Default city for stock and delivery (any tool also takes city). Use the name from find_city; add , <region> for same-named towns

PODRYGKA_MIN_INTERVAL

1.5

Seconds between requests to podrygka.ru. Keep it: the shop has no published limits and the IP is yours

PODRYGKA_PROXY

—

Proxy URL, e.g. http://user:pass@host:3128

PODRYGKA_CACHE_DIR

~/.cache/podrygka-mcp

Guest token, review-widget key, city, category and store lists (files 0600, directory 0700)

PODRYGKA_TIMEOUT

25

HTTP timeout, seconds

PODRYGKA_LOG

INFO

DEBUG logs every request (path, status, time) to stderr; tokens and keys are never logged

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 becomes price_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: true for «Выгодная цена», «Выгодная пара», «1+1=3» and the morning discount, false for 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_line in search and rating.shown_on_site in the card are the line's (rounded to 0.1, as on the site). rating.line is the same from the star split; rating.variant is computed from the article's own reviews (computed: true).

  • Stock — online_qty is the single online warehouse of the chain; stores_qty_in_region and shops_in_region cover every store of the region; stores.in_city lists this city's stores. level is the site's own label.

  • Delivery — when is the site's wording ("сегодня", "завтра", "2 - 3 дня"); cost_rub is always null (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 in parse.py and 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 the line scope 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 with get_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.txt disallows /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 tools
compare_productsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург
articlesYesArticles to compare

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_cityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesCity name or its beginning, e.g. «Березовский» or «Каменск»

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_productA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург
articleYespodrygka.ru article (артикул), the number in the product URL, e.g. 242804
include_storesNoStock per store of the city and the region
include_variantsNoList every shade/variant of the line with its own price and stock
include_descriptionNoAdd the product description text

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_reviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage of reviews
sortNoNewest first, or most helpful firstnewest
limitNoReviews per page
scopeNo'variant' = only this article's own reviews; 'line' = all shades/variants of the linevariant
articleYespodrygka.ru article (артикул), the number in the product URL, e.g. 242804

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_availabilityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург
articleYespodrygka.ru article (артикул), the number in the product URL, e.g. 242804

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_storesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_productsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as the shop knows it (add ', <region>' for same-named towns). Default: env PODRYGKA_CITY or Екатеринбург
pageNoResult page; the site gives 20 tiles per page
sortNoOrder of results, as on the site; price sorts use the online pricepopular
brandNoBrand name (e.g. KENSUKO) or brand_code from results (brand_kensuko)
limitNoReturn at most this many items of the page
queryYesSearch phrase as typed on the site (Russian works best)
categoryNoCategory name (e.g. «Шампуни») or category_code from results
in_storeNoOnly products in stock in this store: store id from list_stores (store_28158)
price_maxNoUpper bound of the online price, rubles
price_minNoLower bound of the online price, rubles
promo_onlyNoOnly products in a price promotion (Выгодная цена, SALE, Выгодная пара, 1+1=3)
group_variantsNoMerge tiles of one product line (shades of one lipstick) into one item

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.0
    • First observedcompare_products
    • First observedfind_city
    • First observedget_product
    • First observedget_reviews
    • First observedget_store_availability
    • First observedlist_stores
    • First observedsearch_products

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    4
    MIT