Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
WB_PROXYNoProxy URL for Wildberries requests, overrides standard proxy settings.
OZON_PROXYNoProxy URL for Ozon tier-1 requests.
WB_MIN_GAPNoMinimum gap between Wildberries requests (seconds).
WB_TIMEOUTNoTimeout for Wildberries HTTP requests (seconds).
AVITO_PROXYNoProxy URL for Avito tier-1 requests.
DNS_MIN_GAPNoMinimum gap between DNS requests (seconds).
DNS_TIMEOUTNoTimeout for DNS HTTP requests (seconds).
DETMIR_PROXYNoProxy URL for Detsky Mir requests.
LAMODA_PROXYNoProxy URL for Lamoda requests.
OZON_MIN_GAPNoMinimum gap between Ozon requests (seconds).
OZON_TIMEOUTNoTimeout for Ozon HTTP requests (seconds).
TAOBAO_PROXYNoProxy URL for Taobao requests.
WB_CACHE_TTLNoCache TTL in seconds for Wildberries (0 disables).
YANDEX_PROXYNoProxy URL for Yandex Market requests.
AVITO_MIN_GAPNoMinimum gap between Avito requests (seconds).
AVITO_TIMEOUTNoTimeout for Avito HTTP requests (seconds).
CHROME_BINARYNoPath to the Chrome/Chromium binary.
DETMIR_REGIONNoDefault region for Detsky Mir (e.g., RU-MOW, RU-SPE).
DNS_CACHE_TTLNoCache TTL in seconds for DNS (0 disables).
MCP_HTTP_HOSTNoHost to bind for HTTP transport.
MCP_HTTP_PORTNoPort to bind for HTTP transport.
MCP_TRANSPORTNoTransport for the MCP server: 'stdio' (default) or 'http'.
MPSTATS_PROXYNoProxy URL for MPStats requests.
CHROME_STEALTHNoEnable stealth mode for Chrome (e.g., 'true' or 'false').
LAMODA_MIN_GAPNoMinimum gap between Lamoda requests (seconds).
LAMODA_TIMEOUTNoTimeout for Lamoda HTTP requests (seconds).
OZON_CACHE_TTLNoCache TTL in seconds for Ozon (0 disables).
TAOBAO_MIN_GAPNoMinimum gap between Taobao requests (seconds).
TAOBAO_TIMEOUTNoTimeout for Taobao HTTP requests (seconds).
WB_NET_RETRIESNoNumber of network retries for Wildberries.
YANDEX_MIN_GAPNoMinimum gap between Yandex Market requests (seconds).
YANDEX_TIMEOUTNoTimeout for Yandex Market HTTP requests (seconds).
AVITO_CACHE_TTLNoCache TTL in seconds for Avito (0 disables).
CHROME_CDP_HOSTNoHost of the Chrome DevTools Protocol endpoint (default: 127.0.0.1).
CHROME_CDP_PORTNoPort of the Chrome DevTools Protocol endpoint.
CHROME_HEADLESSNoRun Chrome in headless mode (e.g., 'true' or 'false').
MPSTATS_MIN_GAPNoMinimum gap between MPStats requests (seconds).
MPSTATS_MP_AUTHNoMPStats auth token (JWT) from a paid account. Optional; without it mpstats tools return 'auth_missing'.
MPSTATS_TIMEOUTNoTimeout for MPStats HTTP requests (seconds).
WB_DEFAULT_DESTNoDefault destination/region for Wildberries.
CITILINK_MIN_GAPNoMinimum gap between Citilink requests (seconds).
CITILINK_TIMEOUTNoTimeout for Citilink HTTP requests (seconds).
DETMIR_CACHE_TTLNoCache TTL in seconds for Detsky Mir (0 disables).
LAMODA_CACHE_TTLNoCache TTL in seconds for Lamoda (0 disables).
OZON_IMPERSONATENoTLS impersonation profile for Ozon (e.g., 'chrome').
TAOBAO_CACHE_TTLNoCache TTL in seconds for Taobao (0 disables).
YANDEX_CACHE_TTLNoCache TTL in seconds for Yandex Market (0 disables).
AVITO_IMPERSONATENoTLS impersonation profile for Avito.
AVITO_LOCATION_IDNoDefault location ID for Avito search.
MPSTATS_CACHE_TTLNoCache TTL in seconds for MPStats (0 disables).
WB_MAX_BODY_BYTESNoMaximum response body size to accept from Wildberries.
CITILINK_CACHE_TTLNoCache TTL in seconds for Citilink (0 disables).
MEGAMARKET_MIN_GAPNoMinimum gap between Megamarket requests (seconds).
MEGAMARKET_TIMEOUTNoTimeout for Megamarket HTTP requests (seconds).
MEGAMARKET_CACHE_TTLNoCache TTL in seconds for Megamarket (0 disables).
COMPARE_SOURCE_TIMEOUTNoTimeout for each source during price comparison (seconds).
CHROME_SCRAPING_PROFILENoScraping profile name for Chrome.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
marketplace_sourcesA

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

Return Format

MarketplaceSourcesResponse: {mounted, skipped, mounted_count, skipped_count, server_version}. skipped maps source name to the import error that removed it, which is usually a missing optional dependency.

Error Format

Never raises ToolError: pure introspection of the mounted connectors — a failed import is recorded in skipped instead of being raised.

wb_cardA

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.

Return Format

WbCardResponse: {dest, count, items, meta}. Items carry nm_id, name, brand, supplier, supplier_id, supplier_rating, review_rating, feedbacks, total_quantity, in_stock, price_rub, price_original_rub. price_rub is None when the SKU has no sellable price — never 0. Unknown SKUs are NOT an error — they simply do not appear in items.

Error Format

ToolError: BadRequestError on malformed nm_ids; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses, Cloudflare HTML pages and unexpected internal errors; ParserDriftError on a non-JSON or mis-shaped body.

wb_root_infoA

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.

Return Format

WbRootInfoResponse: {imt_id, subj_name, subj_root_name, colors, compositions, options, host_used, meta}. imt_id is the root product id shared by every variant — wb_reviews is indexed by it, not by nmId.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

wb_reviewsA

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 Nov 2026), so sort is applied CLIENT-SIDE over that pool. To surface complaints, "worst" reorders the returned pool by lowest rating first.

Return Format

WbReviewsResponse: {imt_id, sort, pool_size, feedback_count, valuation, valuation_distribution, feedbacks, host_used, meta}. Review items carry rating, text, pros, cons, user, date. An empty pool is NOT an error — it returns a healthy response with zero feedbacks.

Error Format

ToolError: BadRequestError on a bad limit or sort; ParserDriftError when a 200 body has no feedbacks list; TransportDownError when every review host fails and on unexpected internal errors.

wb_questionsA

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.

Return Format

WbQuestionsResponse: {imt_id, total_available, returned, skip, answered_count, has_more, questions, meta}. Question items carry question_id, text, date, user, answered, answer_text, answer_date, nm_id. An empty pool is NOT an error — it means nobody has asked yet.

Error Format

ToolError: BadRequestError on a bad limit or skip; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and unexpected internal errors; ParserDriftError when a 200 body loses the count key or the questions shape.

wb_searchA

Search WB catalog by text query.

Uses the lightweight search-goods.wildberries.ru/search endpoint which returns just product IDs (no PoW protection, very high rate limit). Then enriches via wb_card for full details.

Return Format

WbSearchResponse: {query, page, page_size, total_ids, count, items, meta}, with items in the same shape as wb_card. Zero matches — or a page past the end — returns WbNoResultsResponse {status: "no_results", query, page, total_ids} instead. That is NOT an error.

Error Format

ToolError: BadRequestError on a page outside 1..20; RateLimitedError on HTTP 429 from the v9 search endpoint; TransportDownError on unexpected internal errors. Plain transport failures of both search paths degrade to a no_results response rather than an error.

wb_sellerA

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.

Return Format

WbSellerResponse: {supplier_id, name, full_name, trademark, inn, kpp, ogrn, legal_address, taxpayer_code, foreign_codes, host_used, meta}. foreign_codes carries non-RU registration codes (unp/bin/unn) for EAEU sellers.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

wb_categoriesA

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.

Return Format

WbCategoriesResponse: {root, max_depth, total_returned, truncated, items, host_used, meta}. Nodes carry id, name, url, shard, query, depth, children_count, children; shard+query are the selectors wb_category_products needs to list a category feed.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

wb_category_productsA

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.

Return Format

WbCategoryProductsResponse: {shard, query, page, sort, dest, count, has_more, items, meta}, with items in the same shape as wb_card. has_more is inferred from a full page — WB reports no total here.

Error Format

ToolError: BadRequestError on malformed selectors or the unlistable 'blackhole' shard; NotFoundError on a 404 (stale shard/query pair); RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses, Cloudflare HTML pages and unexpected internal errors; ParserDriftError on a non-JSON or mis-shaped body.

ozon_cardA

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.

Return Format

OzonCardResponse: {status, price, card_price, price_original, is_available, rating_score, rating_count, title, seller, characteristics, url, tier_used, meta} on success. Fields are None when the page does not carry them.

Error Format

Raises ToolError on validation (BadRequestError), transport/block (TransportDownError — including the catch-all for unexpected internal errors), or parser drift (ParserDriftError). No-results is NOT an error — an empty widgetStates payload returns a healthy response with null fields.

ozon_reviewsA

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.

Return Format

OzonReviewsResponse: {status, sort, rating_score, reviews_count, distribution, returned, partial, stop_reason, last_error, requested_limit, reviews, meta} on success. A later-page failure with reviews already collected is a PARTIAL SUCCESS (partial=True, stop_reason set), NOT an error.

Error Format

Raises ToolError on validation (BadRequestError), transport/block (TransportDownError), or parser drift (ParserDriftError) — but ONLY when no reviews have been collected yet. Once at least one page yielded reviews, a later-page failure degrades to a partial-success return.

ozon_searchA

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.

Return Format

OzonSearchResponse: {status, query, page, tier_used, count, items, meta} on success. Zero matching items is NOT an error — it returns a healthy response with count=0 and empty items.

Error Format

Raises ToolError on validation (BadRequestError), transport/block (TransportDownError), or parser drift (ParserDriftError).

yandex_searchA

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) and price_with_plus (requires a Yandex Plus subscription, typically 25-30% lower). Prefer price_rub when quoting a price to a person.

Note rating_count counts star ratings, not written reviews; the written count is available per product via yandex_card.

Return Format

YandexSearchResponse: {query, page, page_count, total_available, has_next_page, returned, items, meta}. Items carry product_id, sku_id, title, brand, seller, price_rub (everyday — None when absent, never 0), price_with_plus, price_old_rub, currency, rating, rating_count, in_stock, is_express, url, image. Zero results is NOT an error — it is reported via meta.warnings.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

yandex_cardA

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.

Return Format

YandexCardResponse: {product_id, sku_id, title, brand, seller, description, image, price_rub, price_with_plus, price_before_discount_rub, discount_percent, currency, offers_count, rating, rating_count, review_count, rating_stars, reviews, url, meta}. price_rub is None when the page has no usable price — never 0. Review items carry author, rating, date, pros, cons, comment, votes_up, votes_down, photos.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

detmir_cardA

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.

Return Format

DetmirCardResponse: {product, region, meta}. product carries product_id, title, article, brand, price_rub (None when absent — never 0), old_price_rub, discount_percent, rating, review_count, questions_count, availability, available_online, available_offline, store_count, is_marketplace, vendor, url, picture.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

detmir_categoryA

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.

Return Format

DetmirListResponse: {query, mode, total_available, category_title, returned, offset, items, region, meta}. Items carry the same product shape as detmir_card. An empty page is NOT an error — it is reported via meta.warnings.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

detmir_categoriesA

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.

Return Format

DetmirCategoriesResponse: {parent, returned, total_available, items, region, meta}. Items carry category_id, alias, title, full_name, level, products_count, parent_id, url; alias is what detmir_category needs to list a category.

Error Format

On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.

avito_searchA

Search Avito listings via the internal js/items API.

Return Format

AvitoSearchResponse: {status, query, page, location_id, tier_used, count, total_count, items[], meta}. Items carry item_id, title, price_rub (None when the ad has no price — never 0), url, location, seller fields.

Error Format

ToolError: BadRequestError on malformed arguments; TransportDownError on firewall blocks (with the captcha/proxy guidance inline); ParserDriftError when a reached-200 body no longer parses as the expected envelope.

avito_cardA

Fetch one Avito listing by id or URL.

Return Format

AvitoCardResponse: {status, item_id, title, price_rub, description, location, posted_at, views, images, seller, url, tier_used, meta}. price_rub is None when the ad has no price — never 0.

Error Format

ToolError: BadRequestError when no id can be extracted; NotFoundError on a 404 (deleted or never existed); TransportDownError on blocks; ParserDriftError when the envelope changed.

avito_sellerA

Fetch an Avito seller profile — reputation is the review signal here.

Classifieds have no per-item review pool; the seller's rating, review count and active-listing count are what a buyer checks.

Return Format

AvitoSellerResponse: {status, seller, active_items, tier_used, meta}.

Error Format

ToolError: BadRequestError on empty input; NotFoundError on 404; TransportDownError on blocks; ParserDriftError on envelope drift.

taobao_searchA

Search Taobao listings, rendered in the operator's Chrome.

Return Format

TaobaoSearchResponse: {status, query, page, tier_used, count, items[], meta}. Items carry item_id (string), title, price_cny (None when hidden — never 0), shop_name, sales label, url.

Error Format

ToolError: TransportDownError when Chrome/CDP is unreachable or the page lands on a login wall (log into taobao.com in the scraping profile, then retry); ParserDriftError when a rendered page yields zero items, which means the DOM shape moved.

taobao_cardA

Fetch one Taobao item card.

Return Format

TaobaoCardResponse: {status, item_id, title, price_cny, shop_name, sales, description_images, url, tier_used, meta}. price_cny is None when the page hides it or prices by variant — never 0. When the description-image count drifts to a non-number, description_images degrades to 0 and meta.warnings names the drift — the card itself still answers.

Error Format

ToolError: BadRequestError when no id can be extracted; NotFoundError when the item page reports itself gone; TransportDownError on login walls and CDP failures; ParserDriftError when a rendered card has neither title nor price.

megamarket_searchA

Search the Megamarket catalog via the mobile API, inside the operator's Chrome.

Return Format

MegamarketSearchResponse: {status, query, tier_used, count, total_count, items[], meta}. price_rub is None when absent — never 0.

Error Format

ToolError: TransportDownError on ServicePipe refusals (with the fix inline); ParserDriftError when a reached-200 body no longer parses.

megamarket_cardA

Fetch one Megamarket product card.

Return Format

MegamarketCardResponse: {status, item_id, title, price_rub, old_price_rub, is_available, rating, rating_count, url, tier_used, meta}.

Error Format

ToolError: BadRequestError on unparseable input; NotFoundError on a missing goods id; TransportDownError on ServicePipe refusals; ParserDriftError on envelope drift.

lamoda_searchA

Search Lamoda, rendered in the operator's Chrome (discovery is blocked tier 1).

Return Format

LamodaSearchResponse: {status, query, tier_used, count, items[], meta}. Items carry sku, title, brand, price_rub (None when absent — never 0), url.

Error Format

ToolError: TransportDownError on CDP/nav failures; ParserDriftError when a rendered page yields zero SKUs, which means the tile shape moved.

lamoda_cardA

Fetch one Lamoda product card via the anonymous GraphQL endpoint (tier 1).

Return Format

LamodaCardResponse: {status, sku, title, brand, price_rub, old_price_rub, is_available, sizes[], url, tier_used, meta}. Lamoda exposes no ratings.

Error Format

ToolError: BadRequestError when no SKU can be extracted; NotFoundError when the SKU has no product; TransportDownError on HTTP failures; ParserDriftError when the GraphQL envelope changed.

dns_searchA

Search DNS-Shop, rendered in the operator's Chrome.

Return Format

DnsSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0.

Error Format

ToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles.

dns_cardA

Fetch one DNS-Shop product card.

Return Format

DnsCardResponse: {status, product_id, title, price_rub, old_price_rub, is_available, url, tier_used, meta}.

Error Format

ToolError: BadRequestError when the URL carries no product id; TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered card has neither title nor price.

citilink_searchA

Search Citilink, rendered in the operator's Chrome.

Return Format

CitilinkSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0.

Error Format

ToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles.

citilink_cardA

Fetch one Citilink product card.

Return Format

CitilinkCardResponse: {status, product_id, title, price_rub, old_price_rub, is_available, url, tier_used, meta}.

Error Format

ToolError: BadRequestError when the URL carries no product id; TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered card has neither title nor price.

compare_pricesA

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.

Return Format

CompareResponse: {query, sources_queried, sources_ok, complete, total_offers, cheapest, price_spread_rub, offers, source_outcomes, warnings, server_version}. offers is ranked by everyday price_rub — cheapest first, offers without a rouble price after the ranked ones. warnings carries validation/completeness warnings.

Error Format

On validation failure, raises ToolError with a JSON message describing the error code and whether it is retryable. Individual source failures do NOT raise — they are reported in source_outcomes.

compare_sourcesA

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.

Return Format

Plain object: {installed, searchable, not_installed, notes, source_timeout_s, server_version, server_started_at, process_id}. notes explains per-source access quirks (CDP-only sources, currencies, missing text search).

Error Format

Never raises ToolError: pure introspection of which connector packages are installed — nothing here touches the network.

mpstats_itemA

Fetch per-SKU 30-day sales analytics from MPStats (Ozon or Wildberries).

Returns, per SKU: seller/brand identity, current stock and price, a rolling orders-per-day average, aggregated totals over the window, and four per-day graphs (orders, prices, stock count, rubric positions). Graphs are length days (default 30), oldest-first; a zero cell means "no data for that day", not "the value was zero".

Requires the MPSTATS_MP_AUTH env var (a paid MPStats account JWT cookie). Without it the tool returns an auth_missing error.

Return Format

MpStatsItemResponse: {place, days, count, items, meta}. Each item carries sku, place, seller, seller_id, brand, stock_now, price_avg_rub, orders_per_day, days_on_stocks, totals {orders, sum, sum_prev} and four per-day graphs (orders, prices, count, rubrics), oldest-first. Missing values are None, never 0; a zero graph cell means "no data for that day".

Error Format

ToolError: BadRequestError on malformed skus or place; AuthMissingError when MPSTATS_MP_AUTH is missing or rejected; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and HTML blocks; ParserDriftError on a non-JSON or mis-shaped body; NotFoundError when no requested SKU has analytics.

mpstats_warehousesA

Fetch per-SKU warehouse stock split from MPStats (Ozon or Wildberries).

Returns, per SKU: FBS (seller warehouse) stock count, total FBO (marketplace warehouse) stock count, the raw per-warehouse FBO entries when MPStats populates them, and the upstream last_update timestamp.

Requires the MPSTATS_MP_AUTH env var (a paid MPStats account JWT cookie). Without it the tool returns an auth_missing error.

Return Format

MpStatsWarehousesResponse: {place, days, count, items, meta}. Each item carries sku and stocks {fbs, fbo, fbo_warehouses, last_update}. Missing stock counts are None, never 0.

Error Format

ToolError: BadRequestError on malformed skus or place; AuthMissingError when MPSTATS_MP_AUTH is missing or rejected; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and HTML blocks; ParserDriftError on a non-JSON or mis-shaped body; NotFoundError when no requested SKU has stock data.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Vladimir-Human/ru-marketplace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server