ru-marketplace-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WB_PROXY | No | Proxy URL for Wildberries requests, overrides standard proxy settings. | |
| OZON_PROXY | No | Proxy URL for Ozon tier-1 requests. | |
| WB_MIN_GAP | No | Minimum gap between Wildberries requests (seconds). | |
| WB_TIMEOUT | No | Timeout for Wildberries HTTP requests (seconds). | |
| AVITO_PROXY | No | Proxy URL for Avito tier-1 requests. | |
| DNS_MIN_GAP | No | Minimum gap between DNS requests (seconds). | |
| DNS_TIMEOUT | No | Timeout for DNS HTTP requests (seconds). | |
| DETMIR_PROXY | No | Proxy URL for Detsky Mir requests. | |
| LAMODA_PROXY | No | Proxy URL for Lamoda requests. | |
| OZON_MIN_GAP | No | Minimum gap between Ozon requests (seconds). | |
| OZON_TIMEOUT | No | Timeout for Ozon HTTP requests (seconds). | |
| TAOBAO_PROXY | No | Proxy URL for Taobao requests. | |
| WB_CACHE_TTL | No | Cache TTL in seconds for Wildberries (0 disables). | |
| YANDEX_PROXY | No | Proxy URL for Yandex Market requests. | |
| AVITO_MIN_GAP | No | Minimum gap between Avito requests (seconds). | |
| AVITO_TIMEOUT | No | Timeout for Avito HTTP requests (seconds). | |
| CHROME_BINARY | No | Path to the Chrome/Chromium binary. | |
| DETMIR_REGION | No | Default region for Detsky Mir (e.g., RU-MOW, RU-SPE). | |
| DNS_CACHE_TTL | No | Cache TTL in seconds for DNS (0 disables). | |
| MCP_HTTP_HOST | No | Host to bind for HTTP transport. | |
| MCP_HTTP_PORT | No | Port to bind for HTTP transport. | |
| MCP_TRANSPORT | No | Transport for the MCP server: 'stdio' (default) or 'http'. | |
| MPSTATS_PROXY | No | Proxy URL for MPStats requests. | |
| CHROME_STEALTH | No | Enable stealth mode for Chrome (e.g., 'true' or 'false'). | |
| LAMODA_MIN_GAP | No | Minimum gap between Lamoda requests (seconds). | |
| LAMODA_TIMEOUT | No | Timeout for Lamoda HTTP requests (seconds). | |
| OZON_CACHE_TTL | No | Cache TTL in seconds for Ozon (0 disables). | |
| TAOBAO_MIN_GAP | No | Minimum gap between Taobao requests (seconds). | |
| TAOBAO_TIMEOUT | No | Timeout for Taobao HTTP requests (seconds). | |
| WB_NET_RETRIES | No | Number of network retries for Wildberries. | |
| YANDEX_MIN_GAP | No | Minimum gap between Yandex Market requests (seconds). | |
| YANDEX_TIMEOUT | No | Timeout for Yandex Market HTTP requests (seconds). | |
| AVITO_CACHE_TTL | No | Cache TTL in seconds for Avito (0 disables). | |
| CHROME_CDP_HOST | No | Host of the Chrome DevTools Protocol endpoint (default: 127.0.0.1). | |
| CHROME_CDP_PORT | No | Port of the Chrome DevTools Protocol endpoint. | |
| CHROME_HEADLESS | No | Run Chrome in headless mode (e.g., 'true' or 'false'). | |
| MPSTATS_MIN_GAP | No | Minimum gap between MPStats requests (seconds). | |
| MPSTATS_MP_AUTH | No | MPStats auth token (JWT) from a paid account. Optional; without it mpstats tools return 'auth_missing'. | |
| MPSTATS_TIMEOUT | No | Timeout for MPStats HTTP requests (seconds). | |
| WB_DEFAULT_DEST | No | Default destination/region for Wildberries. | |
| CITILINK_MIN_GAP | No | Minimum gap between Citilink requests (seconds). | |
| CITILINK_TIMEOUT | No | Timeout for Citilink HTTP requests (seconds). | |
| DETMIR_CACHE_TTL | No | Cache TTL in seconds for Detsky Mir (0 disables). | |
| LAMODA_CACHE_TTL | No | Cache TTL in seconds for Lamoda (0 disables). | |
| OZON_IMPERSONATE | No | TLS impersonation profile for Ozon (e.g., 'chrome'). | |
| TAOBAO_CACHE_TTL | No | Cache TTL in seconds for Taobao (0 disables). | |
| YANDEX_CACHE_TTL | No | Cache TTL in seconds for Yandex Market (0 disables). | |
| AVITO_IMPERSONATE | No | TLS impersonation profile for Avito. | |
| AVITO_LOCATION_ID | No | Default location ID for Avito search. | |
| MPSTATS_CACHE_TTL | No | Cache TTL in seconds for MPStats (0 disables). | |
| WB_MAX_BODY_BYTES | No | Maximum response body size to accept from Wildberries. | |
| CITILINK_CACHE_TTL | No | Cache TTL in seconds for Citilink (0 disables). | |
| MEGAMARKET_MIN_GAP | No | Minimum gap between Megamarket requests (seconds). | |
| MEGAMARKET_TIMEOUT | No | Timeout for Megamarket HTTP requests (seconds). | |
| MEGAMARKET_CACHE_TTL | No | Cache TTL in seconds for Megamarket (0 disables). | |
| COMPARE_SOURCE_TIMEOUT | No | Timeout for each source during price comparison (seconds). | |
| CHROME_SCRAPING_PROFILE | No | Scraping 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
| Capability | Details |
|---|---|
| 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
| Name | Description |
|---|---|
| marketplace_sourcesA | List which connectors this unified server actually mounted. Why this existsConnectors 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 Return FormatMarketplaceSourcesResponse: {mounted, skipped, mounted_count, skipped_count,
server_version}. Error FormatNever raises ToolError: pure introspection of the mounted connectors — a
failed import is recorded in |
| 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 FormatWbCardResponse: {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 FormatToolError: 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 FormatWbRootInfoResponse: {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 FormatOn 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
Return FormatWbReviewsResponse: {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 FormatToolError: 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 Return FormatWbQuestionsResponse: {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 FormatToolError: 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 Return FormatWbSearchResponse: {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 FormatToolError: 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 Return FormatWbSellerResponse: {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 FormatOn 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: The live menu is ~800 KB, so responses are always a bounded slice — start at 'top', then expand the branch you care about. Return FormatWbCategoriesResponse: {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 FormatOn 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 Items come back in the same shape Not every category has a feed. WB marks those with the shard
Return FormatWbCategoryProductsResponse: {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 FormatToolError: 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 FormatOzonCardResponse: {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 FormatRaises 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 Return FormatOzonReviewsResponse: {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 FormatRaises 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
Return FormatOzonSearchResponse: {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 FormatRaises 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 Note Return FormatYandexSearchResponse: {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 FormatOn 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
( Reviews are capped at the ~13 Yandex renders server-side; the remainder load through an API this connector deliberately does not touch. Return FormatYandexCardResponse: {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 FormatOn 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. Return FormatDetmirCardResponse: {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 FormatOn 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 FormatDetmirListResponse: {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 FormatOn 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 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 Return FormatDetmirCategoriesResponse: {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 FormatOn 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 FormatAvitoSearchResponse: {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 FormatToolError: 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 FormatAvitoCardResponse: {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 FormatToolError: 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 FormatAvitoSellerResponse: {status, seller, active_items, tier_used, meta}. Error FormatToolError: 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 FormatTaobaoSearchResponse: {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 FormatToolError: 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 FormatTaobaoCardResponse: {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 FormatToolError: 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 FormatMegamarketSearchResponse: {status, query, tier_used, count, total_count, items[], meta}. price_rub is None when absent — never 0. Error FormatToolError: 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 FormatMegamarketCardResponse: {status, item_id, title, price_rub, old_price_rub, is_available, rating, rating_count, url, tier_used, meta}. Error FormatToolError: 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 FormatLamodaSearchResponse: {status, query, tier_used, count, items[], meta}. Items carry sku, title, brand, price_rub (None when absent — never 0), url. Error FormatToolError: 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 FormatLamodaCardResponse: {status, sku, title, brand, price_rub, old_price_rub, is_available, sizes[], url, tier_used, meta}. Lamoda exposes no ratings. Error FormatToolError: 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 FormatDnsSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0. Error FormatToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles. |
| dns_cardA | Fetch one DNS-Shop product card. Return FormatDnsCardResponse: {status, product_id, title, price_rub, old_price_rub, is_available, url, tier_used, meta}. Error FormatToolError: 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 FormatCitilinkSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0. Error FormatToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles. |
| citilink_cardA | Fetch one Citilink product card. Return FormatCitilinkCardResponse: {status, product_id, title, price_rub, old_price_rub, is_available, url, tier_used, meta}. Error FormatToolError: 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:
Titles are matched loosely: marketplaces name things differently, so scan the results rather than assuming every row is the identical model. Return FormatCompareResponse: {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 FormatOn 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 |
| 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 FormatPlain 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 FormatNever 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 Requires the Return FormatMpStatsItemResponse: {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 FormatToolError: 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 Requires the Return FormatMpStatsWarehousesResponse: {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 FormatToolError: 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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