Skip to main content
Glama

goldapple-mcp

English · Русский

An MCP server that gives LLM agents live, honestly-labelled data from Gold Apple (Золотое яблоко), the Russian beauty retailer: search with real pages, sorting and price windows; category listings; product cards with every size/shade and both of the site's prices; line ratings and reviews; delivery options to your city.

Buyer side, anonymous: searches the public storefront, no Gold Apple account needed. Nothing here can order, pay or touch a cart.

Why

Gold Apple's storefront shows a price that most visitors will not get without signing in, and its API changes the meaning of its price fields between endpoints. A naive scraper returns wrong numbers without noticing. This server is built around not doing that:

Pitfall of the site

What this server does

The JSON API rejects plain HTTP clients (GroupIB/F.A.C.C.T. anti-bot); copied cookies work only briefly, and one unsigned request gets the whole session rejected (HTTP 403)

Keeps one headless Chromium on goldapple.ru and sends every call as an XMLHttpRequest from inside the page, which the site's own anti-bot SDK signs. Never fetch, never self-made signatures. A 403 triggers one page reload and one new request, then a clear error

The big price on the product page is the signed-in price ("со скидкой при авторизации"); search tiles show it as "от N ₽" with no caption at all

Two labelled prices everywhere: price_guest_rub and price_signed_in_rub with its kind (discount promo or loyalty club price)

actual/old change meaning: in tiles actual is the signed-in price; on the card with bestLoyalty actual is the guest price and old is the lower loyalty price

Prices are built only from the unambiguous regular/discount/loyalty; page_shows reproduces the page (big / crossed-out / caption), checked against rendered pages

"от N ₽" on a tile is the price of the listed size or shade, not the cheapest one

listed_size/listed_shade, price_is_for_listed_variant; get_product lists every variant with its prices

Price sorting and the price filter work on the guest price

The window is documented as a guest-price window; below_price_window marks signed-in prices under it

Search reports at most 2000 results and serves 84 pages

total_found_capped with a note to slice by price windows

A category's price filter has its own id; a wrong id is silently ignored

The id is taken from the site's own filter list; if most guest prices fall outside the window the answer carries a warning

Some queries ("помада") are redirected to a category page; an empty search shows unrelated recommendations

Redirects are followed and labelled redirected_to_category; recommendations are never returned as results

Rating and star split cover the whole product line (all sizes/shades); a product without reviews gets rating 0

scope: "line", the variant's own review count next to it; no reviews → value: null with a note

Per-store stock answers 403 even to the site's own "Наличие в магазинах" panel

Not requested (a 403 can block the session); store_stock says so. in_stock is the online-order flag

The site starts in Moscow; the SEO title says "цена в Москве" whatever the city

The city is sent explicitly with every request and checked where the site echoes it; page HTML/SEO is never used

Delivery depends on an address zone

City-centre zones are used only for the city this IP is in; otherwise the answer says no zone was set

Promo codes ("ЧЕК"), bonus points, "бьютисы", "Долями" instalments

Reported as conditions/perks, never subtracted from a price

400 and 403 come with the same nginx error page

Classified by status only: 400 is never retried

Every answer carries fetched_at (UTC) and the city it was computed for, with where the city came from and how it was confirmed.

Related MCP server: wildberries-mcp

Tools

Tool

What it returns

search_products(query, page, sort, price_min, price_max, city, limit)

24 items per page; sort popular / price_asc / price_desc / rating / newest; total_found, total_found_capped, has_more, price_range_guest_rub. Per item: id, URL, brand, name, type, listed size/shade and variant counts, guest and signed-in price with kind and percent, below_price_window, line rating and review count, in_stock, labels, promo code

browse_category(category, page, sort, price_min, price_max, city, limit)

A category page (URL, path or id) with the same fields; up to 24 items per page, not capped at 2000

get_product(product, city, include_delivery, include_description)

Every variant with both prices, page_shows, stock, bonuses, "Долями" payment; line rating with star split and the variant's review count; delivery options, dates and costs; characteristics; brand country, country of origin, EAEU documents, manufacturer (INN/OGRN when present); category; optional description, usage and ingredients

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

20 per page (the site serves the first 400); scope variant or line; sort helpful / newest / best / worst. Date, stars, size/shade bought, pros, cons, comment, photo count, likes; line rating on page 1. Authors are never returned

compare_products(products, city)

Up to 10 items side by side: variant, both prices, stock, line rating, cheapest delivery

list_cities()

The 22 cities of the site's city picker (name and FIAS ids)

product is an item id (the number at the start of a product URL) or the URL; the id of a size or shade selects that variant.

Requirements

Measured on 2026-09-25 (Linux, Playwright 1.63, Chromium 153 headless shell):

Python

≥ 3.10, with uv (or pip)

Browser

Playwright's Chromium headless shell, downloaded automatically on first run: 116 MiB download, 266 MB on disk in ~/.cache/ms-playwright (shared with other Playwright tools). It runs for as long as the server is used and is closed after 10 minutes without calls

Memory

0.75–0.84 GB PSS for the whole process tree (Python + Playwright driver + Chromium) while the browser is open; ≈60 MB after it is closed. With GOLDAPPLE_LEAN=0: 1.16–1.35 GB

Start

The first call of a session opens the browser and passes the anti-bot check: 2.7–4.2 s (11 starts measured; a saved profile barely helps). The very first run also downloads Chromium (≈30 s here)

Speed

The site answers in 0.07–1.3 s (once 3.3 s); the server spaces calls 2 s apart. search_products ≈2.4 s (≈4.6 s with a new price window), get_product ≈5–6 s, get_reviews ≈2.3 s, compare_products ≈6 s per item

Display

Not needed (headless). Docker is not needed

System libraries

Present on desktop Linux, macOS, Windows. On a minimal Debian/Ubuntu server, once as root: uvx --from playwright playwright install --with-deps --only-shell chromium

Network

A Russian IP without VPN: the anti-bot rejects many foreign, VPN and datacenter addresses. Or set GOLDAPPLE_PROXY

Tested on

Linux (CachyOS; Playwright uses its Ubuntu build there). macOS and Windows are supported by Playwright but untested

Install

Claude Code:

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

Any MCP client (claude_desktop_config.json, .mcp.json, …):

{
  "mcpServers": {
    "goldapple": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/SZhukovWork/goldapple-mcp", "goldapple-mcp"]
    }
  }
}

From a checkout: uv venv && uv pip install -e . && .venv/bin/goldapple-mcp.

Configuration (environment variables)

Variable

Default

Meaning

GOLDAPPLE_CITY

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

Default city: a name from list_cities (e.g. Екатеринбург, case-insensitive, е = ё) or its FIAS id. search_products, browse_category, get_product and compare_products also take city

GOLDAPPLE_MIN_INTERVAL

2.0

Seconds between requests to the site (minimum 0.5). Keep it: the anti-bot scores bursts

GOLDAPPLE_PROXY

—

Proxy for the browser, e.g. http://user:pass@host:3128

GOLDAPPLE_CACHE_DIR

~/.cache/goldapple-mcp

Browser profile (anti-bot cookies — treat it as a secret; directory 0700, files 0600), city list, IP location

GOLDAPPLE_LEAN

1

0 loads images, fonts and third-party scripts too (≈0.5 GB more memory; not needed for the check)

GOLDAPPLE_HEADLESS

1

0 shows the browser window (debugging; downloads full Chromium if missing)

GOLDAPPLE_IDLE_TIMEOUT

600

Seconds without calls before the browser is closed

What the numbers mean

  • price_guest_rub — the price without signing in.

  • price_signed_in_rub — the price the site displays big with the caption "…при авторизации": it applies after signing in to a Gold Apple account. signed_in_price_kind: discount (a promo, "со скидкой –N% при авторизации") or loyalty (the Лаймовый клуб price, "со скидкой при авторизации"). Whether every account gets exactly this price (club levels) was not verified. Absent when there is no such price.

  • page_shows — the product page as a person sees it: big_rub, crossed_rub, caption.

  • bonuses (bonus points, "бьютисы"), dolyame_4_payments_rub (one of four "Долями" payments of the guest price) and promocode are perks and conditions, not discounts.

  • Search tiles: the price is for listed_size/listed_shade (price_is_for_listed_variant); other variants can be cheaper or dearer.

  • rating_line / rating.value — the rating of the whole product line (all sizes/shades), as on the site; this_variant_reviews / variant_reviews — how many of the reviews are about this variant. No reviews → null, never 0.

  • in_stock — the site's online-order flag; stock in a particular store is not available.

  • Delivery — options, dates and costs to the city for this one item; cost_is_minimum = the site says "от"; free_if is a condition on the order total. city.delivery_zones says whether a delivery zone was used.

  • city.confirmed_by — whether the site echoed the city (delivery answers do) or the city was only sent (search, cards do not echo it).

Limitations

  • Unofficial: relies on the storefront's internal API, which Gold Apple can change at any time. Parsers are isolated in parse.py and covered by tests on recorded answers.

  • The anti-bot can start rejecting the headless browser; the server then reports "blocked" instead of guessing. Waiting helps after bursts; foreign, VPN and datacenter IPs are rejected outright.

  • Per-store stock ("Наличие в магазинах"), personal prices and club levels, the final price with a promo code, price history, the seller (partner goods cannot be told apart), barcodes and Q&A are not available.

  • Only the 22 cities of the site's city picker are supported; delivery zones (express, on-click delivery) only for the city this computer's IP is in.

  • Prices were identical in Yekaterinburg and Moscow on the products checked; that prices never depend on the city is not proven.

  • Search is capped by the site at 2000 results; reviews at the first 400.

Roadmap

  • Optional account mode (your personal prices and club level) and cart — later.

  • Checkout, payment and address changes are out of scope.

Development

uv venv && uv pip install -e '.[dev]'
.venv/bin/pytest            # offline tests on recorded answers
.venv/bin/pytest -m live    # end-to-end over MCP stdio against live goldapple.ru (~25 requests)

Disclaimer

Not affiliated with Gold Apple. The server uses the storefront's internal, undocumented API; the site's operators state that they block external requests to it. Intended for personal price research at a human rate of requests — respect Gold Apple's terms of use.

License: MIT.

Available Tools

6 tools
browse_categoryA
Read-onlyIdempotent

List a goldapple.ru category page with the site's sorting and guest-price window.

Items have the same fields as search_products. Unlike search, a category is not capped at 2000 results; has_more is the site's own "next page" flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity from list_cities (e.g. 'Екатеринбург', 'Москва') or its FIAS id. Default: GOLDAPPLE_CITY or Екатеринбург
pageNoListing page, up to 24 items per page (`page_size` = how many the site returned); continue while `has_more`
sortNoOrder of results, the site's options. Price sorting uses the GUEST pricepopular
limitNoReturn at most this many items of the page
categoryYesCategory page URL or path (e.g. https://goldapple.ru/uhod/uhod-za-telom/dlja-ruk) or a category id (get_product returns both)
price_maxNoUpper bound of the GUEST price, rubles
price_minNoLower bound of the GUEST price, rubles

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the absence of a 2000-result cap and the fact that `has_more` is the site's own next-page flag rather than a computed one.

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?

Three tight sentences, front-loaded with the purpose, followed by return-field parity and pagination semantics. Every sentence carries distinct information and nothing is repeated from the schema.

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?

With an output schema present, the description needn't enumerate return values, and cross-referencing search_products for item fields plus explaining `has_more` covers the key operational questions. Minor gaps remain, such as explicit guidance on how deeply to page through results.

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 coverage is 100%, so many parameters are already documented; the baseline would be 3. The description adds meaning the schema does not: price filtering and price sorting operate on the GUEST price window, which is a non-obvious semantic distinction for price_min/price_max/sort.

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?

States a specific verb+resource ('List a goldapple.ru category page') and immediately scopes it with sorting and the guest-price window. It also distinguishes itself from the sibling search_products by noting the difference in result capping, so an agent can route without opening either 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?

'Unlike search, a category is not capped at 2000 results' gives a clear condition that selects this tool over search_products, and 'Items have the same fields as search_products' sets expectations. There is no explicit when-not-to-use statement, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_productsA
Read-onlyIdempotent

Side by side for up to 10 items: variant, both prices, stock, line rating, cheapest delivery.

The site has no batch endpoint, so each item costs three calls (~6 s); items that fail are listed with the reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity from list_cities (e.g. 'Екатеринбург', 'Москва') or its FIAS id. Default: GOLDAPPLE_CITY or Екатеринбург
productsYesItem ids or goldapple.ru product URLs (each id is one size/shade)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful non-annotation context: no batch endpoint, ~3 calls (~6 s) per item, and that failed items are returned with a reason rather than aborting the whole comparison.

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 tight sentences: the return contract first, then the cost/failure behavior. No filler, and the most decision-relevant facts are front-loaded.

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?

An output schema exists, so return shape need not be spelled out, yet the description still gives the fields and the partial-failure contract. Combined with the latency disclosure, this is nearly complete; only the when-to-use-vs-siblings angle is absent.

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%, so both parameters (city, products) are already documented, including the city default and FIAS-id format. The description restates the 10-item cap already enforced by maxItems, adding no new semantics beyond the schema.

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?

States a specific verb+resource (compare products side by side) and enumerates exactly what is returned: variant, both prices, stock, line rating, cheapest delivery. This clearly distinguishes it from get_product (single item) and search_products (discovery).

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?

The 'up to 10 items' cap and the cost note imply a bounded, deliberate use case, but the description never states when to prefer this over calling get_product repeatedly, nor any exclusions. Usage is implied through the cost/latency remark rather than explicit routing guidance.

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 product card for one item id, live for the city.

Returns every variant (size/shade) with its guest and signed-in price, page_shows (what the product page shows: big price, crossed-out price, caption), stock flag, bonus points (not a discount) and the 'Долями' payment (4 payments of the guest price; not a discount). Also: the line rating with star split and this variant's review count, delivery options for the selected variant, characteristics, brand country, country of origin, EAEU conformity documents, manufacturer (with INN/OGRN when the card has them), category (id + URL for browse_category). seller is always null (not exposed) and store_stock is unavailable — see their notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity from list_cities (e.g. 'Екатеринбург', 'Москва') or its FIAS id. Default: GOLDAPPLE_CITY or Екатеринбург
productYesGold Apple item id (the number at the start of the product URL, e.g. 13290100050) or a full goldapple.ru product URL. The id of a size/shade selects that variant.
include_deliveryNoDelivery options, dates and costs to the city
include_descriptionNoAlso the description, usage and full ingredient list (long)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description goes beyond that with genuinely useful behavioral disclosures: seller is always null and store_stock is unavailable, and that bonus points and the 'Долями' payments are explicitly not discounts. It does not cover latency or payload size, but the semantic caveats are the valuable part here.

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?

Front-loaded with the one-line purpose, then a dense but information-bearing enumeration of the card contents. Every clause carries distinct field semantics; the parenthetical asides are compact rather than padded, though the paragraph runs long without structural breaks.

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?

An output schema exists, so the description is not obligated to explain return values, yet it does describe them anyway and flags the fields that are systematically null or unavailable. For an open-world, four-parameter read tool with full schema coverage, nothing essential 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%, so every parameter is already documented (city source and default, id-or-URL for product, the two include_* flags). The description restates the variant-selection behavior of the product id but adds no new syntax or constraints beyond the schema, so the baseline 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 opening line states a specific resource and scope: a full product card for one item id, resolved live for a city. An agent can immediately tell this apart from search_products (bulk discovery) and compare_products (multi-item), and the enumerated return contents reinforce exactly what the tool produces.

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?

Usage is only implied: 'for one item id' plus the note that a size/shade id selects a variant hints at when to reach for this tool rather than search_products. There is no explicit when-to-use, when-not-to-use, or named alternative to route the agent.

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, the size/shade bought, pros, cons, comment, photo count, likes.

Page 1 also returns the line rating and star split (always for all sizes/shades — the site has no per-variant rating) and how many reviews this variant has. Authors' names are never returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoReview page, 20 per page; the site serves only the first 400 reviews (page ≤ 20)
sortNo'worst' surfaces complaints firsthelpful
limitNoReturn at most this many reviews of the page
scopeNo'variant' = reviews of this size/shade only; 'line' = all sizes/shades of the productvariant
productYesGold Apple item id (the number at the start of the product URL, e.g. 13290100050) or a full goldapple.ru product URL. The id of a size/shade selects that variant.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and open-world behavior, yet the description adds real operational context beyond them: authors' names are never returned, ratings are always for the whole line (the site has no per-variant rating), page-1-only payloads, and the first-sentence field inventory. It stops short of 5 only because error/empty behavior is unmentioned.

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?

Front-loaded with the returned fields and kept to a short paragraph; every clause (page-1 extras, no per-variant rating, no author names) earns its place. The opening field list is dense but functional rather than padded.

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?

With an output schema present, the description needn't explain return values, yet it usefully clarifies the page-1 extras and the variant/line rating caveat. Agent needs are met for calling it, with only minor gaps (pagination/empty-result behavior) remaining.

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?

With 100% schema description coverage, the schema already documents every parameter, so the baseline is 3. The description earns a bump by tying the 'page' parameter to concrete return semantics ('Page 1 also returns the line rating and star split... how many reviews this variant has'), adding meaning the schema does not carry.

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 makes clear this retrieves buyer reviews for a product and enumerates exactly what comes back (date, stars, size/shade, pros, cons, comment, photo count, likes). It is unambiguous as a review-fetch tool, though it never explicitly names which sibling it contrasts with (get_product, compare_products), so it lands just below a 5.

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?

Usage is implied rather than stated: use this to read reviews for an item found via search_products/get_product. It explains page-1 extras and the variant-vs-line scope, which is useful call-shaping context, but there is no explicit 'when to use this vs X' guidance and no stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_citiesA
Read-onlyIdempotent

The cities goldapple.ru offers in its city picker (name, FIAS city id, region id).

Any of them can be passed as city; others are not supported.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the shape of the returned records and the validity constraint on the resulting values, which is useful, but it says nothing about caching, result size, or staleness of the city list.

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 short sentences, front-loaded with what the tool returns and followed by the actionable constraint on using those values. Every clause earns its place with no filler.

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?

With an output schema present, the description need not enumerate return values, and it correctly covers purpose plus the downstream usage rule. It is nearly complete for a simple zero-parameter lookup; only exhaustiveness/pagination behavior of the list is left unstated.

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?

The tool takes zero parameters, so the schema baseline is 4. The description still contributes by explaining how a value drawn from this list should be used as the `city` argument in other calls, adding cross-tool meaning rather than repeating schema content.

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?

States the resource (the set of cities offered in goldapple.ru's city picker) and the fields returned (name, FIAS city id, region id), so an agent knows exactly what this lookup yields. It does not need heavy sibling differentiation since no sibling deals with cities, but the verb is implied rather than explicit.

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?

'Any of them can be passed as `city`; others are not supported' gives real usage context – the output feeds the `city` parameter elsewhere and constrains valid values. However, it never states when to call this tool (e.g., before a filtered search) versus simply proceeding, so usage is implied rather than prescribed.

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 goldapple.ru like the site does: real pages, sorting and a guest-price window.

Per item: item id, URL, brand, name, product type, the size/shade the tile lists (its price is for that variant — price_is_for_listed_variant), counts of sizes/shades, price_guest_rub, price_signed_in_rub with its kind and percent, below_price_window, line rating and review count, the online in_stock flag, labels, promo code (a condition, not subtracted). total_found_capped = the site's 2000-result ceiling was hit. When the site turns the query into a category page, the category listing is returned and redirected_to_category says so. Confirm finalists with get_product.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity from list_cities (e.g. 'Екатеринбург', 'Москва') or its FIAS id. Default: GOLDAPPLE_CITY or Екатеринбург
pageNoResult page, 24 items per page (the site's search stops at 2000 results, i.e. page 84)
sortNoOrder of results, the site's options. Price sorting uses the GUEST pricepopular
limitNoReturn at most this many items of the page
queryYesSearch phrase, as typed on the site (Russian works best)
price_maxNoUpper bound of the GUEST price, rubles
price_minNoLower bound of the GUEST price, rubles

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds substantial semantics beyond them: prices are for the listed variant, guest vs signed-in price kinds, `below_price_window`, the 2000-result ceiling, the category-redirect case, and the caveat that promo codes are a condition rather than a subtraction. This is exactly the behavioral context an agent cannot get from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the one-line purpose, then a compact per-item field list and behavioral caveats. Dense but every clause carries information; the return-field enumeration is somewhat verbose given an output schema exists, which keeps it from a 5.

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?

An output schema exists, so fully documenting return fields is not strictly required, yet the description includes it plus the redirect and result-cap edge cases, making the definition self-sufficient for correct invocation. The only gap is the absence of guidance against the other browsing/search siblings.

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%, so every parameter (city, page, sort, limit, query, price bounds) is already documented, including the 24-per-page cap and the guest-price basis for sort and price filters. The description largely restates these semantics rather than adding new parameter-level detail, so the baseline 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 opens with a specific verb and resource ('Search goldapple.ru like the site does'), then scopes it to real pages, sorting, and a guest-price window. It differentiates from siblings by naming get_product as the confirmation step and by explaining the category-page redirect behaviour that separates it from browse_category.

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 for use (replicate the site's search, guest vs signed-in pricing) and explicitly names the follow-up tool: 'Confirm finalists with get_product.' It does not, however, state when NOT to use it versus browse_category or compare_products, so it falls short of a full when/when-not statement.

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. 6 tool updatesv0.1.0
    • First observedbrowse_category
    • First observedcompare_products
    • First observedget_product
    • First observedget_reviews
    • First observedlist_cities
    • First observedsearch_products

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: search_products (query-based), browse_category (category paging), get_product (single card), get_reviews, compare_products (multi-item), list_cities. The search/browse pair is the closest overlap, but descriptions explicitly call out their different behaviors (2000-cap vs has_more, query vs category).

Naming Consistency5/5

All six tools follow a consistent snake_case verb_noun pattern (compare_products, list_cities, search_products, browse_category, get_product, get_reviews) with plain, predictable verbs. No style mixing.

Tool Count5/5

Six read-only tools is well-scoped for a product-discovery surface, covering the discovery-to-detail path without redundancy. Nothing feels padded or missing at this size.

Completeness4/5

The read-only lifecycle is largely covered: discover (search/browse), detail (get_product), reviews, cross-item comparison, and city scoping. Cart/checkout and delivery-cost calculation are absent, but that's plausibly out of scope, leaving only minor gaps.

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.
    2
    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