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

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

- Trust score: 52/100 (low)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- oci · `ghcr.io/vladimir-human/ru-marketplace-mcp`: 52/100 (this document), [markdown](https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp.md), [page](https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/vladimir-human/ru-marketplace-mcp`
- Version: `2.8.2`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Supply Chain Security**: 0/100
  - 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.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 65/100
  - Stability check failed: the tool surface changed between 2.5.3 and 2.8.2: 2 tool removals, 0 breaking changes, 1 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 39 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 41 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

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

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

### Claude

```bash
claude mcp add vladimir-human-ru-marketplace-mcp -- docker run --rm -i ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2
```

### Cursor

```json
{
  "mcpServers": {
    "vladimir-human-ru-marketplace-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "vladimir-human-ru-marketplace-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add vladimir-human-ru-marketplace-mcp -- docker run --rm -i ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vladimir-human-ru-marketplace-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  vladimir-human-ru-marketplace-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"]
```

### Netclaw

```json
{
  "McpServers": {
    "vladimir-human-ru-marketplace-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "vladimir-human-ru-marketplace-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/vladimir-human/ru-marketplace-mcp:2.8.2"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 52, +1)

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

### 2026-11-03 (score 51, 0)

- [functional] Package version: 2.8.0 → 2.8.2
- [functional] Package version: 2.8.0 → 2.8.1

### 2026-11-02 (score 51, +3)

- [security regression] Stability: 0.60 → fail
- [functional improvement] Schema quality: 274 → 103
- [functional improvement] Schema quality: unverified → 100
- [functional] Schema quality: excellent → good
- [functional] Package version: 2.7.0 → 2.8.0

### 2026-11-01 (score 48, +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.

### 2026-10-30 (score 47, +1)

- [security regression] Provenance: fail → unverified
- [functional regression] 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

### 2026-10-28 (score 46, +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.

### 2026-10-26 (score 45, +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.

### 2026-10-24 (score 44, +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.

## MCP tools (39)

### `marketplace_sources` (~162 tokens)

Which Marketplaces Are Loaded

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

Output parameters:

- `capabilities`
- `mounted`
- `mounted_count`
- `needs_cdp`
- `server_version`
- `skipped`
- `skipped_count`

### `marketplace_health` (~122 tokens)

Transport Health Before a Fan-Out

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

Output parameters:

- `budget`
- `cdp`
- `handoffs`
- `server_version`
- `unblock`

### `wb_card` (~164 tokens)

WB Product Cards

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

Input parameters:

- `dest` (string): Region ID. Default -1257786 (Moscow). Required for valid prices/stocks. Other examples: -1257786 Moscow, -1029256 Saint Petersburg.
- `nm_ids` (array, required): 1..100 nmId integers (positive). Batch product cards from WB v4 API.

Output parameters:

- `count`
- `dest`
- `items`
- `meta`

### `wb_root_info` (~95 tokens)

WB Root Info (imt_id)

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

Input parameters:

- `nm_id` (integer, required): nmId (positive integer). The SKU whose basket CDN card.json is fetched for imt_id resolution.

Output parameters:

- `colors`
- `compositions`
- `host_used`
- `imt_id`
- `meta`
- `options`
- `subj_name`
- `subj_root_name`

### `wb_reviews` (~274 tokens)

WB Reviews by imt_id

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

Input parameters:

- `imt_id` (integer, required): Root ID (imt_id) from wb_root_info. All product variants share one review pool indexed by imt_id, NOT by nmId.
- `limit` (integer): Max review texts to return (1..100). Counts always full.
- `sort` (string): "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…

Output parameters:

- `feedback_count`
- `feedbacks`
- `host_used`
- `imt_id`
- `meta`
- `pool_size`
- `sort`
- `valuation`
- `valuation_distribution`

### `wb_questions` (~290 tokens)

WB Buyer Questions by imt_id

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

Input parameters:

- `answered_only` (boolean): Return only questions the seller has answered. Unanswered questions carry no product information.
- `imt_id` (integer, required): Root ID (imt_id) from wb_root_info. Questions are pooled per imt_id across every variant, NOT by nmId.
- `limit` (integer): Max questions to return (1..100). Fetched in pages of 30, which is the upstream cap.
- `skip` (integer): Offset into the question pool, for walking past the first page.

Output parameters:

- `answered_count`
- `has_more`
- `imt_id`
- `meta`
- `questions`
- `returned`
- `skip`
- `total_available`

### `wb_search` (~163 tokens)

WB Catalog Search

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

Input parameters:

- `dest` (string): Region ID. Default -1257786 (Moscow). Required for valid prices/stocks.
- `page` (integer): Page number 1..20 (each page returns ~30 IDs from the long list).
- `query` (string, required): Russian text search query for the WB catalog.

Output parameters:

- `result`

### `wb_seller` (~152 tokens)

WB Seller Legal Info

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

Input parameters:

- `supplier_id` (integer, required): WB supplier id (positive integer). Get it from wb_card's supplier_id field.

Output parameters:

- `foreign_codes`
- `full_name`
- `host_used`
- `inn`
- `kpp`
- `legal_address`
- `meta`
- `name`
- `ogrn`
- `supplier_id`
- `taxpayer_code`
- `trademark`

### `wb_categories` (~195 tokens)

WB Catalog Categories

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

Input parameters:

- `max_depth` (integer): How many levels below the root to include. 1 = direct children only.
- `root` (string): 'top' for the top-level sections, or a category name / URL path / id to expand (e.g. 'Электроника', '/catalog/elektronika', '8126').

Output parameters:

- `host_used`
- `items`
- `max_depth`
- `meta`
- `root`
- `total_returned`
- `truncated`

### `wb_category_products` (~391 tokens)

WB Category Product Listing

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

Input parameters:

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

Output parameters:

- `count`
- `dest`
- `has_more`
- `items`
- `meta`
- `page`
- `query`
- `shard`
- `sort`

### `ozon_card` (~171 tokens)

Ozon Product Card

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

Input parameters:

- `sku_or_path` (string, required): SKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Other paths are rejected (SSRF prevention).

Output parameters:

- `_meta`
- `card_price`
- `characteristics`
- `is_available`
- `price`
- `price_original`
- `rating_count`
- `rating_score`
- `seller`
- `status`
- `tier_used`
- `title`
- `url`

### `ozon_reviews` (~445 tokens)

Ozon Product Reviews

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

Input parameters:

- `limit` (integer): Max review texts to return (1..100). Distribution+total always full.
- `sku_or_path` (string, required): SKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Normalized to /product/<digits>/reviews/ (SSRF-allowlisted).
- `sort` (string): 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…

Output parameters:

- `_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`

### `ozon_search` (~130 tokens)

Ozon Catalog Search

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

Input parameters:

- `page` (integer): Result page (1..10).
- `query` (string, required): Russian search text.

Output parameters:

- `_meta`
- `count`
- `items`
- `page`
- `parsed_count`
- `query`
- `status`
- `tier_used`
- `truncated`

### `yandex_search` (~398 tokens)

Yandex Market Search

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

Input parameters:

- `limit` (integer): Maximum products to return from the page.
- `page` (integer): Page number, 1-based.
- `query` (string, required): Free-text search query in Russian, e.g. 'iphone 15' or 'стиральная машина узкая'.

Output parameters:

- `has_next_page`
- `items`
- `meta`
- `page`
- `page_count`
- `query`
- `returned`
- `total_available`

### `yandex_card` (~204 tokens)

Yandex Market Product Card

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

Input parameters:

- `include_reviews` (boolean): Include the server-rendered reviews (first ~13).
- `product_id` (string, required): Numeric Yandex Market product id — take it from yandex_search results.

Output parameters:

- `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`

### `detmir_card` (~242 tokens)

Detsky Mir Product Card

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

Input parameters:

- `product_id` (integer, required): Numeric Detsky Mir product id — the digits in /product/index/id/<id>/.
- `region` (string): ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.

Output parameters:

- `meta`
- `product`
- `region`

### `detmir_category` (~192 tokens)

Detsky Mir Category Listing

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

Input parameters:

- `alias` (string, required): Category slug from a catalog URL, e.g. 'pups' in /catalog/index/name/pups/.
- `limit` (integer): Items per page.
- `offset` (integer): Items to skip, for pagination.
- `region` (string): ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.

Output parameters:

- `category_title`
- `items`
- `meta`
- `mode`
- `offset`
- `query`
- `region`
- `returned`
- `total_available`

### `detmir_categories` (~190 tokens)

Detsky Mir Catalog Categories

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

Input parameters:

- `limit` (integer): Maximum categories to return.
- `parent` (string): 'top' for the 27 top-level sections, or a parent category id to list its children.
- `region` (string): ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.

Output parameters:

- `items`
- `meta`
- `parent`
- `region`
- `returned`
- `total_available`

### `avito_search` (~120 tokens)

Avito Search

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

Input parameters:

- `category_id`: Optional Avito category id to narrow the search
- `location_id`: Avito location id; default AVITO_LOCATION_ID (637640 = Moscow)
- `page` (integer): Result page (1-based)
- `query` (string, required): Search text, e.g. 'thinkpad x1 carbon'

Output parameters:

- `_meta`
- `count`
- `items`
- `location_id`
- `page`
- `query`
- `status`
- `tier_used`
- `total_count`

### `avito_card` (~170 tokens)

Avito Item Card

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

Input parameters:

- `item_id_or_url` (string, required): Item id, slug path or full avito.ru URL

Output parameters:

- `_meta`
- `description`
- `images`
- `item_id`
- `location`
- `posted_at`
- `price_rub`
- `seller`
- `status`
- `tier_used`
- `title`
- `url`
- `views`

### `avito_seller` (~173 tokens)

Avito Seller Profile

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

Input parameters:

- `seller_id_or_url` (string, required): Seller id or profile URL from a card/search hit

Output parameters:

- `_meta`
- `active_items`
- `seller`
- `status`
- `tier_used`

### `taobao_search` (~112 tokens)

Taobao Search

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

Input parameters:

- `page` (integer): Result page (1-based)
- `query` (string, required): Search text, Chinese or English, e.g. '手机' or 'headphones'

Output parameters:

- `_meta`
- `count`
- `items`
- `page`
- `query`
- `status`
- `tier_used`

### `taobao_card` (~93 tokens)

Taobao Item Card

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

Input parameters:

- `item_id_or_url` (string, required): Item id or item.taobao.com URL

Output parameters:

- `_meta`
- `description_images`
- `item_id`
- `price_cny`
- `sales`
- `shop_name`
- `status`
- `tier_used`
- `title`
- `url`

### `megamarket_search` (~208 tokens)

Megamarket Search

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

Input parameters:

- `query` (string, required): Search text, e.g. 'стиральная машина'

Output parameters:

- `_meta`
- `count`
- `items`
- `query`
- `status`
- `tier_used`
- `total_count`

### `megamarket_card` (~75 tokens)

Megamarket Product Card

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

Input parameters:

- `item_id_or_url` (string, required): Goods id or megamarket.ru product URL

Output parameters:

- `_meta`
- `is_available`
- `item_id`
- `old_price_rub`
- `price_rub`
- `rating`
- `rating_count`
- `status`
- `tier_used`
- `title`
- `url`

### `lamoda_search` (~86 tokens)

Lamoda Search

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

Input parameters:

- `query` (string, required): Search text, e.g. 'кроссовки nike'

Output parameters:

- `_meta`
- `count`
- `items`
- `query`
- `status`
- `tier_used`

### `lamoda_card` (~68 tokens)

Lamoda Product Card

Fetch a GraphQL card over HTTPS, falling back to an in-page Chrome POST.

Full field list and error codes: `guide://lamoda/lamoda_card`.

Input parameters:

- `sku_or_url` (string, required): SKU (MP002XM1RMM3) or lamoda.ru product URL

Output parameters:

- `_meta`
- `brand`
- `is_available`
- `old_price_rub`
- `price_rub`
- `sizes`
- `sku`
- `status`
- `tier_used`
- `title`
- `url`

### `dns_search` (~69 tokens)

DNS-Shop Search

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

Input parameters:

- `query` (string, required): Search text, e.g. 'ноутбук lenovo'

Output parameters:

- `_meta`
- `count`
- `items`
- `query`
- `status`
- `tier_used`

### `dns_card` (~86 tokens)

DNS-Shop Product Card

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

Input parameters:

- `product_url` (string, required): dns-shop.ru product URL containing /product/<id>/, e.g. /product/b7a1667f9b19ed20/

Output parameters:

- `_meta`
- `is_available`
- `old_price_rub`
- `price_rub`
- `product_id`
- `status`
- `tier_used`
- `title`
- `url`

### `citilink_search` (~76 tokens)

Citilink Search

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

Input parameters:

- `query` (string, required): Search text, e.g. 'ноутбук lenovo'

Output parameters:

- `_meta`
- `count`
- `items`
- `query`
- `status`
- `tier_used`

### `citilink_card` (~93 tokens)

Citilink Product Card

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

Input parameters:

- `product_url` (string, required): citilink.ru product URL containing /product/<slug>/, e.g. /product/noutbuk-lenovo-2169270/

Output parameters:

- `_meta`
- `is_available`
- `old_price_rub`
- `price_rub`
- `product_id`
- `status`
- `tier_used`
- `title`
- `url`

### `aliexpress_search` (~83 tokens)

AliExpress Search

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

Input parameters:

- `query` (string, required): Search text, e.g. 'умные часы'

Output parameters:

- `_meta`
- `count`
- `items`
- `query`
- `status`
- `tier_used`

### `aliexpress_card` (~129 tokens)

AliExpress Product Card

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

Input parameters:

- `item_id_or_url` (string, required): AliExpress item id (9-16 digits) or aliexpress.ru item URL, e.g. /item/1005010003103368.html

Output parameters:

- `_meta`
- `item_id`
- `old_price_rub`
- `orders_count`
- `price_rub`
- `rating`
- `status`
- `tier_used`
- `title`
- `url`

### `cian_search` (~476 tokens)

Cian Real-Estate Search

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

Input parameters:

- `area_max`: Maximum total area in m².
- `area_min`: Minimum total area in m².
- `deal` (string, required): '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_type` (string): Property type: 'flat' (квартира), 'room' (комната), 'house' (дом/участок), 'commercial'. 'commercial' has no daily market on Cian and is rejected with deal='daily'.
- `page` (integer): 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.

Output parameters:

- `_meta`
- `count`
- `deal`
- `items`
- `offer_type`
- `page`
- `region`
- `status`
- `tier_used`
- `total_count`

### `cian_card` (~106 tokens)

Cian Offer Card

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

Input parameters:

- `offer_id_or_url` (string, required): Cian offer id (digits) or a full cian.ru offer URL.

Output parameters:

- `_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`

### `compare_prices` (~380 tokens)

Compare Prices Across Russian Marketplaces

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

Input parameters:

- `in_stock_only` (boolean): Rank only offers whose marketplace explicitly reports them in stock.
- `per_source_limit` (integer): How many offers to take from each marketplace.
- `query` (string, required): What to price, in Russian — e.g. 'стиральная машина узкая' or 'iphone 15 128'.
- `sources`: Restrict to specific marketplaces (wildberries, yandex_market, ozon). Omit to query all.

Output parameters:

- `cheapest`
- `cheapest_comparable`
- `complete`
- `offers`
- `price_spread_rub`
- `query`
- `server_version`
- `source_outcomes`
- `sources_ok`
- `sources_queried`
- `total_offers`
- `warnings`

### `compare_verify_offer` (~185 tokens)

Verify Compared Offer

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

Input parameters:

- `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_url` (string, required): product_id or direct product URL from the compared offer
- `source` (string, required): Marketplace source name from compare_prices, e.g. wildberries or ozon.

### `compare_sources` (~66 tokens)

List Available Marketplaces

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

### `compare_browser_snapshot` (~238 tokens)

View a Retained Marketplace Page

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

Input parameters:

- `handoff_id` (string, required): Opaque 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.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp#diagnostics

## Score history

- 2026-11-04: 52
- 2026-11-03: 51
- 2026-11-02: 51
- 2026-11-01: 48
- 2026-10-31: 47
- 2026-10-30: 47
- 2026-10-29: 46
- 2026-10-28: 46
- 2026-10-27: 45
- 2026-10-26: 45
- 2026-10-25: 44
- 2026-10-24: 44
- 2026-10-23: 43
- 2026-10-22: 43
- 2026-10-21: 42
- 2026-10-20: 42
- 2026-10-19: 42
- 2026-10-18: 41
- 2026-10-17: 41
- 2026-10-16: 39
- 2026-10-15: 39
- 2026-10-14: 39
- 2026-10-13: 10
- 2026-10-12: 10

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

## Links

- GitHub Container Registry: https://ghcr.io/vladimir-human/ru-marketplace-mcp
- Repository: https://github.com/Vladimir-Human/ru-marketplace-mcp
- Changelog RSS feed: https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp.json
- HTML version of this page: https://verifymcp.io/servers/vladimir-human-ru-marketplace-mcp/ghcr-io-vladimir-human-ru-marketplace-mcp
