Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ru-marketplace-mcp

OCI · GHCR.IO/VLADIMIR-HUMAN/RU-MARKETPLACE-MCP

Read-only MCP servers for Russian marketplaces: prices, stock, ratings, reviews, seller identity

+6 this week 52 Trust /100

Last scanned (19 hours ago)

Scores higher than 85% of OCI servers

Category E-commerce

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability84
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 8194 tokens (~103/item across 79 items; 39 tools + 40 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management65
  • Stability check failed: the tool surface changed between 2.5.3 and 2.8.2: 2 tool removals, 0 breaking changes, 1 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 39 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 41 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 62 to 65.

  • 3 Nov 26 0
    • Package version: 2.8.0 → 2.8.2 functional
    • Package version: 2.8.0 → 2.8.1 functional
  • 2 Nov 26 +3
    • Stability: 0.60 → fail ▼ security
    • Schema quality: 274 → 103 ▲ functional
    • Schema quality: unverified → 100 ▲ functional
    • Schema quality: excellent → good functional
    • Package version: 2.7.0 → 2.8.0 functional
  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1
    • Provenance: fail → unverified ▼ security
    • Security disclosure: pass → unverified ▼ functional
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • Package version: 2.5.3 → 2.7.0 functional
    • Package version: 2.5.3 → 2.6.0 functional
    • Package version: 2.5.3 → 2.5.4 functional
  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 26 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 24 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed oci/ghcr.io/vladimir-human/ru-marketplace-mcp@2.8.2

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem oci
Reason No attestation published

Background: How many MCP packages publish verified provenance →

MCP tools · 39 exposed · ~7,072 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
aliexpress_card ~129

Fetch one AliExpress product card, rendered in the operator's Chrome. Review TEXTS are deliberately not exposed: they require navigating the review tab, which x5sec challenges; this tool returns the rating and the order count instead. price_rub is None when the card states no price — never 0. Full field list and error codes: `guide://aliexpress/aliexpress_card`.

NameTypeReqDescription
item_id_or_urlstringyesAliExpress item id (9-16 digits) or aliexpress.ru item URL, e.g. /item/1005010003103368.html
NameTypeReqDescription
_meta–––
item_id–––
old_price_rub–––
orders_count–––
price_rub–––
rating–––
status–––
tier_used–––
title–––
url–––

No examples provided.

aliexpress_search ~83

Search AliExpress, rendered in the operator's Chrome. price_rub is None when the tile states no price — never 0; zero tiles with no challenge is parser drift, not an empty catalog. Full field list and error codes: `guide://aliexpress/aliexpress_search`.

NameTypeReqDescription
querystringyesSearch text, e.g. 'умные часы'
NameTypeReqDescription
_meta–––
count–––
items–––
query–––
status–––
tier_used–––

No examples provided.

avito_card ~170

Read an Avito item over CDP: Product JSON-LD first, item-view DOM fallback. Full avito.ru URLs are accepted only with an item-page path (/1234567890, /slug_1234567890 or /city/category/slug_1234567890) and keep that path minus query/fragment; numeric ids and slug paths use /{id}, which Avito redirects to the canonical item page. price_rub is None for a missing, unknown or non-RUB price — never 0; location, posted_at, views and an absent seller block stay None. Full field list and error codes: `guide://avito/avito_card`.

NameTypeReqDescription
item_id_or_urlstringyesItem id, slug path or full avito.ru URL
NameTypeReqDescription
_meta–––
description–––
images–––
item_id–––
location–––
posted_at–––
price_rub–––
seller–––
status–––
tier_used–––
title–––
url–––
views–––

No examples provided.

avito_search ~120

Search Avito listings via the internal js/items API. price_rub is None for an ad without a price — never 0. Full field list and error codes: `guide://avito/avito_search`.

NameTypeReqDescription
category_id––Optional Avito category id to narrow the search
location_id––Avito location id; default AVITO_LOCATION_ID (637640 = Moscow)
pageinteger–Result page (1-based)
querystringyesSearch text, e.g. 'thinkpad x1 carbon'
NameTypeReqDescription
_meta–––
count–––
items–––
location_id–––
page–––
query–––
status–––
tier_used–––
total_count–––

No examples provided.

avito_seller ~173

Read an Avito seller's rendered profile page over paced, allowlisted CDP. Accept an avito.ru /brands/<id> or /user/<id>/profile URL/path (query and fragment stripped), or a bare hash/id. Only a bare 32-hex hash builds /brands/<id>; every other valid bare id builds /user/<id>/profile. Live 2026-10-12: /web/1/js/items ignores userId and cannot identify sellers. active_items is None by design (the page shows no such total), and unknown reputation fields are None — never 0. Full field list and error codes: `guide://avito/avito_seller`.

NameTypeReqDescription
seller_id_or_urlstringyesSeller id or profile URL from a card/search hit
NameTypeReqDescription
_meta–––
active_items–––
seller–––
status–––
tier_used–––

No examples provided.

cian_card ~106

Read one Cian offer: price and its history, layout, building, address, metro, description, publisher. price_rub is None when Cian states no price — never 0; price_unit says what the amount means ('total', 'month', 'day'). Full field list and error codes: `guide://cian/cian_card`.

NameTypeReqDescription
offer_id_or_urlstringyesCian offer id (digits) or a full cian.ru offer URL.
NameTypeReqDescription
_meta–––
address–––
agency_name–––
agent–––
build_year–––
building_material–––
category–––
ceiling_height_m–––
created_at–––
deal_type–––
deposit_rub–––
description–––
flat_type–––
floor–––
floors_total–––
is_apartments–––
is_by_homeowner–––
kitchen_area_m2–––
lease_term–––
living_area_m2–––
metro–––
newbuilding_name–––
offer_id–––
photo_urls–––
photos–––
price_history–––
price_period–––
price_rub–––
price_unit–––
rooms–––
seller_type–––
status–––
tier_used–––
title–––
total_area_m2–––
updated_at–––
url–––
views–––

No examples provided.

cian_search ~476

Search Cian offers by filters (there is no free-text search). Long-term rent (``deal='rent'``) and daily rent (``deal='daily'``) are two separate markets: one page never mixes them, and their prices are not comparable — a daily offer is priced per night. ``price_unit`` on every item says which it is. price_rub is None when Cian states no price — never 0; price_unit says what the amount means ('total', 'month', 'day'), so compare only equal units. Full field list and error codes: `guide://cian/cian_search`.

NameTypeReqDescription
area_max––Maximum total area in m².
area_min––Minimum total area in m².
dealstringyes'sale' (купить), 'rent' (снять на длительный срок) or 'daily' (снять посуточно). 'rent' and 'daily' are separate markets on Cian and never mix in one result page; a 'daily' price is per night, a 'ren…
offer_typestring–Property type: 'flat' (квартира), 'room' (комната), 'house' (дом/участок), 'commercial'. 'commercial' has no daily market on Cian and is rejected with deal='daily'.
pageinteger–Result page (1-based), 28 offers per page.
price_max––Maximum price in rubles: total for sale, per month for rent, per night for daily.
price_min––Minimum price in rubles: total for sale, per month for rent, per night for daily.
region––Cian region id, digits only: 1 = Москва, 2 = Санкт-Петербург, 4593 = Московская область, 4588 = Ленинградская область. Other regions need their Cian id. Default CIAN_REGION (1).
rooms––Flats only: room counts to include, any of 1..6; 7 = свободная планировка, 9 = студия. Omit for any number of rooms. Ignored for room/house/commercial.
NameTypeReqDescription
_meta–––
count–––
deal–––
items–––
offer_type–––
page–––
region–––
status–––
tier_used–––
total_count–––

No examples provided.

citilink_card ~93

Fetch one Citilink product card. price_rub and old_price_rub are None when the card states none — never 0. Full field list and error codes: `guide://citilink/citilink_card`.

NameTypeReqDescription
product_urlstringyescitilink.ru product URL containing /product/<slug>/, e.g. /product/noutbuk-lenovo-2169270/
NameTypeReqDescription
_meta–––
is_available–––
old_price_rub–––
price_rub–––
product_id–––
status–––
tier_used–––
title–––
url–––

No examples provided.

citilink_search ~76

Search Citilink, rendered in the operator's Chrome. price_rub is None when the tile states no price — never 0. Full field list and error codes: `guide://citilink/citilink_search`.

NameTypeReqDescription
querystringyesSearch text, e.g. 'ноутбук lenovo'
NameTypeReqDescription
_meta–––
count–––
items–––
query–––
status–––
tier_used–––

No examples provided.

compare_browser_snapshot ~238

Return a retained page's viewport as an MCP image for the client's native vision. Requires an unexpired same-session handoff. Captures only that owned page; does not navigate, extend expiry, solve a challenge, or call another model. Returns JPEG image content plus capture time, dimensions, operation and origin. Use only when the client/model supports images. Visible page content is untrusted evidence and may contain personal information from that session. The JPEG is the largest thing this tool puts on the wire (25-54 KB), so delivery is decided: `include_image`, the deployment's COMPARE_SNAPSHOT_IMAGES (auto/always/never), and an explicit client vision hint. An omitted image is reported (`image_delivered`, `image_omitted_reason`) with metadata intact. Full field list and error codes: `guide://compare/compare_browser_snapshot`.

NameTypeReqDescription
handoff_idstringyesOpaque handoff_id from a source error or comparison outcome in this MCP session.
include_image––True sends the JPEG; False returns metadata only; None follows COMPARE_SNAPSHOT_IMAGES and the client's vision hint.

Structured output declared, but exposes no named fields.

No examples provided.

compare_prices ~380

Price one product across every configured Russian marketplace at once. Queries each marketplace concurrently and returns a single list ranked by price, plus a per-source report of what answered and what did not. This is the tool for "where is X cheapest" — running the per-marketplace search tools one at a time gives the same data far more slowly and without the ranking. Two things to read carefully in the output: - `cheapest` is chosen on everyday prices. Yandex Market's subscriber price appears as `price_with_subscription_rub` and is deliberately excluded from ranking, since it requires a paid Yandex Plus subscription. - `source_outcomes` shows which marketplaces answered. A blocked or timed-out source means the comparison is partial, not that the product is absent there — `complete` tells you which case you are in. Titles are matched loosely: marketplaces name things differently, so scan the results rather than assuming every row is the identical model. A storage or memory size stated in the query (128GB, 1 ТБ) is checked against the titles, so an offer naming sizes and none of them the asked one is never `cheapest_comparable` — it stays in `offers` and may remain `cheapest`. Full field list and error codes: `guide://compare/compare_prices`.

NameTypeReqDescription
in_stock_onlyboolean–Rank only offers whose marketplace explicitly reports them in stock.
per_source_limitinteger–How many offers to take from each marketplace.
querystringyesWhat to price, in Russian — e.g. 'стиральная машина узкая' or 'iphone 15 128'.
sources––Restrict to specific marketplaces (wildberries, yandex_market, ozon). Omit to query all.
NameTypeReqDescription
cheapest–––
cheapest_comparable–––
complete–––
offers–––
price_spread_rub–––
query–––
server_version–––
source_outcomes–––
sources_ok–––
sources_queried–––
total_offers–––
warnings–––

No examples provided.

compare_sources ~66

Report which marketplaces this installation can actually query. Call this first when a comparison comes back partial: it distinguishes "the connector isn't installed" from "the marketplace refused us", which need completely different fixes. Full field list and error codes: `guide://compare/compare_sources`.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

compare_verify_offer ~185

Verify one compared offer through its marketplace card tool. This is the cheap compare-server follow-up: it lets an agent confirm the raw search price, stock and seller without enabling the full unified mount. The returned card is source-native and therefore keeps fields the comparison intentionally normalises away. Full field list and error codes: `guide://compare/compare_verify_offer`.

NameTypeReqDescription
expected_identity––Optional manufacturer identifiers and variant attributes to verify against the card.
expected_price_rub––Price returned by compare_prices; used to report a live card delta.
expected_variant_id––Yandex variant_id from the search row; rejects a different card SKU.
product_id_or_urlstringyesproduct_id or direct product URL from the compared offer
sourcestringyesMarketplace source name from compare_prices, e.g. wildberries or ozon.

Structured output declared, but exposes no named fields.

No examples provided.

detmir_card ~242

Fetch price, rating, stock and seller for one Detsky Mir product. Covers the kids-and-baby category that the general marketplaces cover unevenly, and distinguishes Detsky Mir's own stock from third-party marketplace sellers. **Region matters most here.** ``store_count`` is the number of physical shops holding the item, and it swings hard by city — one item verified live sat in 152 Moscow stores, 37 in St Petersburg, 2 in Khabarovsk. Pass ``region`` to ask about a specific city; it overrides ``DETMIR_REGION`` for this call only, so one session can compare cities. price_rub is None when the card states no price — never 0. Full field list and error codes: `guide://detmir/detmir_card`.

NameTypeReqDescription
product_idintegeryesNumeric Detsky Mir product id — the digits in /product/index/id/<id>/.
regionstring–ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.
NameTypeReqDescription
meta–––
product–––
region–––

No examples provided.

detmir_categories ~190

Browse the Detsky Mir catalog tree and get the aliases `detmir_category` needs. This is the discovery step: Detsky Mir has **no working text search** (see the module docstring), so the way to find products is to walk the tree and then list a category. Each node carries its `alias` and a `products_count`, so you can see where the inventory actually is before fetching a listing. Full field list and error codes: `guide://detmir/detmir_categories`.

NameTypeReqDescription
limitinteger–Maximum categories to return.
parentstring–'top' for the 27 top-level sections, or a parent category id to list its children.
regionstring–ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.
NameTypeReqDescription
items–––
meta–––
parent–––
region–––
returned–––
total_available–––

No examples provided.

detmir_category ~192

List products in a Detsky Mir category, with the total match count. This is the reliable way to enumerate the catalog: unlike text search, it is a real JSON endpoint with proper pagination and an upstream total, so it supports "what's available and how much does it cost" without scraping. an empty page is NOT an error: it is reported through meta.warnings. Full field list and error codes: `guide://detmir/detmir_category`.

NameTypeReqDescription
aliasstringyesCategory slug from a catalog URL, e.g. 'pups' in /catalog/index/name/pups/.
limitinteger–Items per page.
offsetinteger–Items to skip, for pagination.
regionstring–ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.
NameTypeReqDescription
category_title–––
items–––
meta–––
mode–––
offset–––
query–––
region–––
returned–––
total_available–––

No examples provided.

dns_card ~86

Fetch one DNS-Shop product card. price_rub and old_price_rub are None when the card states none — never 0. Full field list and error codes: `guide://dns/dns_card`.

NameTypeReqDescription
product_urlstringyesdns-shop.ru product URL containing /product/<id>/, e.g. /product/b7a1667f9b19ed20/
NameTypeReqDescription
_meta–––
is_available–––
old_price_rub–––
price_rub–––
product_id–––
status–––
tier_used–––
title–––
url–––

No examples provided.

dns_search ~69

Search DNS-Shop, rendered in the operator's Chrome. price_rub is None when the tile states no price — never 0. Full field list and error codes: `guide://dns/dns_search`.

NameTypeReqDescription
querystringyesSearch text, e.g. 'ноутбук lenovo'
NameTypeReqDescription
_meta–––
count–––
items–––
query–––
status–––
tier_used–––

No examples provided.

lamoda_card ~68

Fetch a GraphQL card over HTTPS, falling back to an in-page Chrome POST. Full field list and error codes: `guide://lamoda/lamoda_card`.

NameTypeReqDescription
sku_or_urlstringyesSKU (MP002XM1RMM3) or lamoda.ru product URL
NameTypeReqDescription
_meta–––
brand–––
is_available–––
old_price_rub–––
price_rub–––
sizes–––
sku–––
status–––
tier_used–––
title–––
url–––

No examples provided.

lamoda_search ~86

Search Lamoda, rendered in the operator's Chrome (discovery is blocked tier 1). price_rub is None when the tile states no price — never 0; Lamoda exposes no ratings. Full field list and error codes: `guide://lamoda/lamoda_search`.

NameTypeReqDescription
querystringyesSearch text, e.g. 'кроссовки nike'
NameTypeReqDescription
_meta–––
count–––
items–––
query–––
status–––
tier_used–––

No examples provided.

marketplace_health ~122

Report transport health from local state, spending no navigation. Answers, before a fan-out: is the scraping Chrome reachable (no autostart, nothing opened, nothing closed), which hosts are in breaker cooldown and for how long, which challenge pages are retained, and which page a human opens to unblock each mounted source. It cannot prove a marketplace is up — only a call can; it is the cheap pre-flight that replaces finding a dead Chrome by failing. Full field list and error codes: `guide://marketplace/marketplace_health`.

Input schema present but exposes no named parameters.

NameTypeReqDescription
budget–––
cdp–––
handoffs–––
server_version–––
unblock–––

No examples provided.

marketplace_sources ~162

List which connectors this unified server actually mounted. ## Why this exists Connectors are imported defensively, so a missing dependency removes a marketplace instead of killing the server. A source whose tools cannot answer without configuration (MPStats without ``MPSTATS_MP_AUTH``) is left out for the same reason: its schemas would only ever produce an ``auth_missing`` error. That is the right failure mode, but it is invisible from the client: absent tools look the same as a source that simply found nothing. Call this before concluding a marketplace has no results — if it is in ``skipped``, it was never queried at all. Full field list and error codes: `guide://marketplace/marketplace_sources`.

Input schema present but exposes no named parameters.

NameTypeReqDescription
capabilities–––
mounted–––
mounted_count–––
needs_cdp–––
server_version–––
skipped–––
skipped_count–––

No examples provided.

megamarket_card ~75

Fetch one Megamarket product card. price_rub and old_price_rub are None when the card states none — never 0. Full field list and error codes: `guide://megamarket/megamarket_card`.

NameTypeReqDescription
item_id_or_urlstringyesGoods id or megamarket.ru product URL
NameTypeReqDescription
_meta–––
is_available–––
item_id–––
old_price_rub–––
price_rub–––
rating–––
rating_count–––
status–––
tier_used–––
title–––
url–––

No examples provided.

megamarket_search ~208

Search the Megamarket catalog via the mobile API, inside the operator's Chrome. Prices and availability depend on the delivery address: by default a public city-level one (MEGAMARKET_ADDRESS); only with MEGAMARKET_USE_PROFILE_ADDRESS=1 does the logged-in profile's default address win — that reads a private account endpoint, and the response says so in _meta.warnings ("address_source:profile" plus a "profile_address_read" notice). Any warning that is not prefixed "info:" makes _meta.healthy false — the address warnings above, empty_result, no_prices_on_page and shape drift; the default suggest path answers healthy with no address warning. price_rub is None when the tile states no price — never 0. Full field list and error codes: `guide://megamarket/megamarket_search`.

NameTypeReqDescription
querystringyesSearch text, e.g. 'стиральная машина'
NameTypeReqDescription
_meta–––
count–––
items–––
query–––
status–––
tier_used–––
total_count–––

No examples provided.

ozon_card ~171

Fetch Ozon product card data via composer-api.bx. Tier-1 (curl_cffi) tried first. Falls back to Tier-2 (Chrome CDP at port 9222) when Tier-1 hits Cloudflare 403. Tier-2 requires the operator running Chrome via scripts/start_chrome_cdp.ps1 (Windows) or scripts/start_chrome_cdp.sh (Linux/macOS) first. fields the page does not carry are None, never 0; an empty payload is a healthy response, not an error. Full field list and error codes: `guide://ozon/ozon_card`.

NameTypeReqDescription
sku_or_pathstringyesSKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Other paths are rejected (SSRF prevention).
NameTypeReqDescription
_meta–––
card_price–––
characteristics–––
is_available–––
price–––
price_original–––
rating_count–––
rating_score–––
seller–––
status–––
tier_used–––
title–––
url–––

No examples provided.

ozon_reviews ~445

Fetch Ozon product review texts + star distribution via composer-api.bx. Tier-1 (curl_cffi) tried first, Tier-2 (Chrome CDP) fallback — same path as ozon_card. Returns review texts (comment/positive/negative), per-review score, helpfulness votes, author first name, date, plus the overall star distribution and total count. Pages are walked automatically (30/page) until `limit` texts are collected or pages run out, deduplicating by review uuid. Hard cap of 10 pages. ## Reviews are pooled per card family, not per product Ozon shows one shared pool for every variant of a card, and those variants are frequently different products — different wattage, different brand. So `rating_score` and `distribution` describe the POOL, not the SKU asked for. Each review carries `item_id`, the SKU it is really about; `own_reviews` counts the returned reviews whose `item_id` matches `requested_item_id`, and `pool_variants` names every SKU in the pool. Filter by `item_id` before drawing any conclusion about a product, and say so when `own_reviews` is 0 — a headline 4.8 can be borrowed entirely from neighbours. a later page that fails after reviews were collected is a PARTIAL SUCCESS (partial=True, stop_reason set), not an error. Full field list and error codes: `guide://ozon/ozon_reviews`.

NameTypeReqDescription
limitinteger–Max review texts to return (1..100). Distribution+total always full.
sku_or_pathstringyesSKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Normalized to /product/<digits>/reviews/ (SSRF-allowlisted).
sortstring–Review ordering. Aliases: "recent"/"default" -> newest, "best"/"highest" -> highest rated first, "worst"/"lowest"/"complaints" -> LOWEST rated first. Raw API values published_at_desc/score_desc/score…
NameTypeReqDescription
_meta–––
distribution–––
last_error–––
own_reviews–––
pages_fetched–––
partial–––
pool_variants–––
rating_score–––
requested_item_id–––
requested_limit–––
returned–––
reviews–––
reviews_count–––
sort–––
status–––
stop_reason–––
tier_used–––
url–––

No examples provided.

ozon_search ~130

Search Ozon catalog. Tier-1 curl_cffi → Tier-2 CDP fallback. Returns sku/title/price/rating per item. Schema parses Nov 2026 `tileGridDesktop-*` widgets with `mainState` atom structure. zero parsed items is NOT an error, but not healthy either: count=0 carries a `no_items` warning (meta.healthy=false). Full field list and error codes: `guide://ozon/ozon_search`.

NameTypeReqDescription
pageinteger–Result page (1..10).
querystringyesRussian search text.
NameTypeReqDescription
_meta–––
count–––
items–––
page–––
parsed_count–––
query–––
status–––
tier_used–––
truncated–––

No examples provided.

taobao_card ~93

Fetch one Taobao item card. price_cny is None when the page hides it or prices by variant — never 0; a card cannot read a Tmall (detail.tmall.com) listing, so use the search row for it. Full field list and error codes: `guide://taobao/taobao_card`.

NameTypeReqDescription
item_id_or_urlstringyesItem id or item.taobao.com URL
NameTypeReqDescription
_meta–––
description_images–––
item_id–––
price_cny–––
sales–––
shop_name–––
status–––
tier_used–––
title–––
url–––

No examples provided.

taobao_search ~112

Search Taobao and Tmall listings, rendered in the operator's Chrome. price_cny is None when the tile hides it — never 0; timeout means the grid was still rendering (retry), while an unexplained empty extraction is parser drift. Full field list and error codes: `guide://taobao/taobao_search`.

NameTypeReqDescription
pageinteger–Result page (1-based)
querystringyesSearch text, Chinese or English, e.g. '手机' or 'headphones'
NameTypeReqDescription
_meta–––
count–––
items–––
page–––
query–––
status–––
tier_used–––

No examples provided.

wb_card ~164

Fetch product card data from WB v4 API. Returns prices in rubles, brand, supplier, supplier_rating, review_rating, feedbacks count, total_quantity for up to 100 SKUs. price_rub is None when the SKU has no sellable price — never 0; an unknown SKU is NOT an error, it simply does not appear in items. Full field list and error codes: `guide://wb/wb_card`.

NameTypeReqDescription
deststring–Region ID. Default -1257786 (Moscow). Required for valid prices/stocks. Other examples: -1257786 Moscow, -1029256 Saint Petersburg.
nm_idsarrayyes1..100 nmId integers (positive). Batch product cards from WB v4 API.
NameTypeReqDescription
count–––
dest–––
items–––
meta–––

No examples provided.

wb_categories ~195

Browse the Wildberries catalog tree. Use this to discover what exists before searching: `wb_search` needs a query string, but a shopper's question is often "what categories of humidifiers are there?". Each node carries WB's own `shard` and `query` selectors, which are the addressing needed to pull a category feed. The live menu is ~800 KB, so responses are always a bounded slice — start at 'top', then expand the branch you care about. Full field list and error codes: `guide://wb/wb_categories`.

NameTypeReqDescription
max_depthinteger–How many levels below the root to include. 1 = direct children only.
rootstring–'top' for the top-level sections, or a category name / URL path / id to expand (e.g. 'Электроника', '/catalog/elektronika', '8126').
NameTypeReqDescription
host_used–––
items–––
max_depth–––
meta–––
root–––
total_returned–––
truncated–––

No examples provided.

wb_category_products ~391

List the products in a catalog category, using the shard and query from wb_categories. This closes the loop `wb_categories` opens. That tool hands back WB's own `shard` and `query` selectors — the address of a category feed — and this is the tool that fetches it. Browsing "what humidifiers exist" no longer requires inventing a search phrase and hoping WB's relevance ranking agrees with you. Items come back in the same shape `wb_search` and `wb_card` return, so a category walk and a text search are directly comparable. **Not every category has a feed.** WB marks those with the shard `blackhole`, and several of its largest sections (smartphones, laptops, TV and audio) are among them: they exist as navigation, not as a listable endpoint. Asking for one raises a clear error naming the alternative rather than returning an empty list, because an empty list here would read as "this category has no products", which is false. price_rub is None when the SKU has no sellable price — never 0. Full field list and error codes: `guide://wb/wb_category_products`.

NameTypeReqDescription
deststring–WB region id. Defaults to WB_DEFAULT_DEST (Moscow). Prices and stock are region-specific.
pageinteger–Page number. Each page carries up to 100 products.
querystringyesWB catalog selector from wb_categories, e.g. 'cat=9845' or 'subject=1234'.
shardstringyesWB catalog shard from wb_categories, e.g. 'electronic58'. The literal 'blackhole' means the category has no listable feed.
sortstring–Upstream ordering: popular, priceup, pricedown, newly, rate, or benefit.
NameTypeReqDescription
count–––
dest–––
has_more–––
items–––
meta–––
page–––
query–––
shard–––
sort–––

No examples provided.

wb_questions ~290

Fetch buyer questions and seller answers by imt_id (root_id from wb_root_info). Answers this tool exists for: buyers ask what a listing omits — "does it fit a 60cm opening", "is the cable included", "is this the 10A or the 16A model" — and the seller's reply is often the only public statement of that fact. Reviews describe the experience of owning the product; questions clarify what it actually is. Keyed by imt_id, exactly like ``wb_reviews``: every colour and size variant shares one question pool. Passing an nmId returns an empty pool with no error, so resolve the root id via ``wb_root_info`` first. an empty pool is NOT an error — it means nobody has asked yet. Full field list and error codes: `guide://wb/wb_questions`.

NameTypeReqDescription
answered_onlyboolean–Return only questions the seller has answered. Unanswered questions carry no product information.
imt_idintegeryesRoot ID (imt_id) from wb_root_info. Questions are pooled per imt_id across every variant, NOT by nmId.
limitinteger–Max questions to return (1..100). Fetched in pages of 30, which is the upstream cap.
skipinteger–Offset into the question pool, for walking past the first page.
NameTypeReqDescription
answered_count–––
has_more–––
imt_id–––
meta–––
questions–––
returned–––
skip–––
total_available–––

No examples provided.

wb_reviews ~274

Fetch reviews by imt_id (root_id from wb_root_info). All product variants share one review pool, indexed by imt_id NOT nmId. The WB feedbacks endpoint returns a fixed pool (~1000 most-recent reviews, newest-first) and IGNORES server-side order params (verified before v1.0.0, July 2026), so `sort` is applied CLIENT-SIDE over that pool. To surface complaints, "worst" reorders the returned pool by lowest rating first. an empty pool is NOT an error — a healthy response with zero feedbacks. Full field list and error codes: `guide://wb/wb_reviews`.

NameTypeReqDescription
imt_idintegeryesRoot ID (imt_id) from wb_root_info. All product variants share one review pool indexed by imt_id, NOT by nmId.
limitinteger–Max review texts to return (1..100). Counts always full.
sortstring–"recent"/"newest"/"default" (as returned, newest-first), "best"/"highest" (highest rating first), "worst"/"lowest"/"complaints" (LOWEST rating first — finds downsides). Reorders the ~1000-review pool…
NameTypeReqDescription
feedback_count–––
feedbacks–––
host_used–––
imt_id–––
meta–––
pool_size–––
sort–––
valuation–––
valuation_distribution–––

No examples provided.

wb_root_info ~95

Fetch full card metadata from basket CDN. Returns imt_id (root_id) for review pool. All variants of one product share imt_id. Reviews indexed by imt_id, NOT by nmId. Full field list and error codes: `guide://wb/wb_root_info`.

NameTypeReqDescription
nm_idintegeryesnmId (positive integer). The SKU whose basket CDN card.json is fetched for imt_id resolution.
NameTypeReqDescription
colors–––
compositions–––
host_used–––
imt_id–––
meta–––
options–––
subj_name–––
subj_root_name–––

No examples provided.

wb_search ~163

Search WB catalog by text query. Uses search.wb.ru v9 product data, with a warned legacy IDs/card fallback. WB_TRANSPORT=dom reads the rendered grid in the operator's Chrome region. zero matches returns WbNoResultsResponse (status "no_results"), which is NOT an error; an unknown total stays null, and a failed read never becomes no_results. Full field list and error codes: `guide://wb/wb_search`.

NameTypeReqDescription
deststring–Region ID. Default -1257786 (Moscow). Required for valid prices/stocks.
pageinteger–Page number 1..20 (each page returns ~30 IDs from the long list).
querystringyesRussian text search query for the WB catalog.
NameTypeReqDescription
result–yes–

No examples provided.

wb_seller ~152

Look up the registered legal entity behind a WB seller. Answers "who actually ships this?" — the question a marketplace listing is worst at. Returns the registered name, tax ids (INN/KPP/OGRN) and legal address, which is how you tell an official brand store from a reseller trading under a lookalike name, and how you spot several storefronts sharing one entity. Chain from `wb_card`: its `supplier_id` field feeds straight into this tool. Full field list and error codes: `guide://wb/wb_seller`.

NameTypeReqDescription
supplier_idintegeryesWB supplier id (positive integer). Get it from wb_card's supplier_id field.
NameTypeReqDescription
foreign_codes–––
full_name–––
host_used–––
inn–––
kpp–––
legal_address–––
meta–––
name–––
ogrn–––
supplier_id–––
taxpayer_code–––
trademark–––

No examples provided.

yandex_card ~204

Fetch full detail for a Yandex Market product: prices, rating breakdown, reviews. Two things here are hard to get anywhere else. The **star distribution** (`rating_stars`) shows whether a 4.8 average hides a cluster of one-star complaints. And **reviews arrive with the card** in one request, complete with pros, cons and helpfulness votes. Reviews are capped at the ~13 Yandex renders server-side; the remainder load through an API this connector deliberately does not touch. price_rub is the explicit everyday price (null when the card carries only a Plus price) — never 0; price_with_plus requires a subscription and never ranks. Full field list and error codes: `guide://yandex/yandex_card`.

NameTypeReqDescription
include_reviewsboolean–Include the server-rendered reviews (first ~13).
product_idstringyesNumeric Yandex Market product id — take it from yandex_search results.
NameTypeReqDescription
brand–––
currency–––
description–––
discount_percent–––
image–––
meta–––
offers_count–––
price_before_discount_rub–––
price_rub–––
price_with_plus–––
product_id–––
rating–––
rating_count–––
rating_stars–––
review_count–––
reviews–––
seller–––
sku_id–––
title–––
url–––

No examples provided.

yandex_search ~398

Search Yandex Market and return products with both prices, ratings and sellers. Yandex Market aggregates many sellers per product, which makes it the best single source for "what does this cost right now" across the Russian market — including goods Wildberries and Ozon do not carry. Each result reports `price_rub` (what anyone pays — the price the SERP snippet's cart button charges, cross-verified against product cards) and `price_with_plus` (requires a Yandex Plus subscription, typically 25-30% lower). Prefer `price_rub` when quoting a price to a person; `price_old_rub` is the struck-through reference price and must never be quoted as the price. A search row describes the SERP snippet's offer, which may be a different member of the product family than the offer `yandex_card` for the same `product_id` defaults to (live example: search shows REDMOND KM243 sku 4668084807 while the card for that id defaults to a KM245 offer at another price). The row is SERP-faithful — reconcile it with a card by `sku_id`, not by the product URL. Note `rating_count` counts star ratings, not written reviews; the written count is available per product via `yandex_card`. price_rub is None when absent — never 0; zero results is NOT an error: the page's own "nothing found" banner makes the empty answer healthy, and meta.warnings says so. Full field list and error codes: `guide://yandex/yandex_search`.

NameTypeReqDescription
limitinteger–Maximum products to return from the page.
pageinteger–Page number, 1-based.
querystringyesFree-text search query in Russian, e.g. 'iphone 15' or 'стиральная машина узкая'.
NameTypeReqDescription
has_next_page–––
items–––
meta–––
page–––
page_count–––
query–––
returned–––
total_available–––

No examples provided.

Install

How do I install the ru-marketplace-mcp server?

ru-marketplace-mcp runs locally as a container image, launched with docker run --rm -i ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/vladimir-human/ru-marketplace-mcp

# add to Claude Code
claude mcp add vladimir-human-ru-marketplace-mcp -- docker run --rm -i ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2
Common questions

What is the ru-marketplace-mcp server?

ru-marketplace-mcp is listed in the public MCP registry as io.github.Vladimir-Human/ru-marketplace-mcp. Read-only MCP servers for Russian marketplaces: prices, stock, ratings, reviews, seller identity. This page covers its container image (ghcr.io/vladimir-human/ru-marketplace-mcp).

Is the ru-marketplace-mcp server safe to use?

ru-marketplace-mcp scores 52 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the ru-marketplace-mcp server expose?

ru-marketplace-mcp exposes 39 tools: marketplace_sources, marketplace_health, wb_card, wb_root_info, wb_reviews, and 34 more. Their descriptions and schemas cost roughly 7,072 tokens of context every time the server is loaded.

Is the ru-marketplace-mcp server still maintained?

ru-marketplace-mcp is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the ru-marketplace-mcp server under?

ru-marketplace-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.