Kettu Marketplace Intelligence
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WB_PROXY | No | Proxy for Wildberries | |
| OZON_PROXY | No | Proxy for Ozon | |
| WB_MIN_GAP | No | Minimum gap between requests for Wildberries | |
| WB_TIMEOUT | No | Timeout for Wildberries connector | |
| AVITO_PROXY | No | Proxy for Avito | |
| DNS_MIN_GAP | No | Minimum gap between requests for DNS | |
| DNS_TIMEOUT | No | Timeout for DNS connector | |
| DETMIR_PROXY | No | Proxy for Detsky Mir | |
| LAMODA_PROXY | No | Proxy for Lamoda | |
| OZON_MIN_GAP | No | Minimum gap between requests for Ozon | |
| OZON_TIMEOUT | No | Timeout for Ozon connector | |
| TAOBAO_PROXY | No | Proxy for Taobao | |
| WB_CACHE_TTL | No | Cache TTL for Wildberries (0 disables cache) | |
| YANDEX_PROXY | No | Proxy for Yandex Market | |
| AVITO_MIN_GAP | No | Minimum gap between requests for Avito | |
| AVITO_TIMEOUT | No | Timeout for Avito connector | |
| CHROME_BINARY | No | Chrome binary path | |
| DETMIR_REGION | No | Region for Detsky Mir (e.g., RU-MOW, RU-SPE) | |
| DNS_CACHE_TTL | No | Cache TTL for DNS | |
| MCP_HTTP_HOST | No | MCP HTTP host | |
| MCP_HTTP_PORT | No | MCP HTTP port | |
| MCP_TRANSPORT | No | MCP transport (stdio or http) | |
| CHROME_STEALTH | No | Chrome stealth mode | |
| LAMODA_MIN_GAP | No | Minimum gap between requests for Lamoda | |
| LAMODA_TIMEOUT | No | Timeout for Lamoda connector | |
| OZON_CACHE_TTL | No | Cache TTL for Ozon | |
| TAOBAO_MIN_GAP | No | Minimum gap between requests for Taobao | |
| TAOBAO_TIMEOUT | No | Timeout for Taobao connector | |
| WB_NET_RETRIES | No | Network retries for Wildberries | |
| YANDEX_MIN_GAP | No | Minimum gap between requests for Yandex Market | |
| YANDEX_TIMEOUT | No | Timeout for Yandex Market connector | |
| AVITO_CACHE_TTL | No | Cache TTL for Avito | |
| CHROME_CDP_HOST | No | Chrome CDP host | |
| CHROME_CDP_PORT | No | Chrome CDP port | |
| CHROME_HEADLESS | No | Chrome headless mode | |
| WB_DEFAULT_DEST | No | Default destination for Wildberries | |
| CITILINK_MIN_GAP | No | Minimum gap between requests for Citilink | |
| CITILINK_TIMEOUT | No | Timeout for Citilink connector | |
| DETMIR_CACHE_TTL | No | Cache TTL for Detsky Mir | |
| LAMODA_CACHE_TTL | No | Cache TTL for Lamoda | |
| OZON_IMPERSONATE | No | Impersonation setting for Ozon | |
| TAOBAO_CACHE_TTL | No | Cache TTL for Taobao | |
| YANDEX_CACHE_TTL | No | Cache TTL for Yandex Market | |
| AVITO_IMPERSONATE | No | Impersonation setting for Avito | |
| AVITO_LOCATION_ID | No | Location ID for Avito | |
| WB_MAX_BODY_BYTES | No | Maximum body bytes for Wildberries | |
| CITILINK_CACHE_TTL | No | Cache TTL for Citilink | |
| MEGAMARKET_MIN_GAP | No | Minimum gap between requests for Megamarket | |
| MEGAMARKET_TIMEOUT | No | Timeout for Megamarket connector | |
| MEGAMARKET_CACHE_TTL | No | Cache TTL for Megamarket | |
| COMPARE_SOURCE_TIMEOUT | No | Timeout for compare connector | |
| CHROME_SCRAPING_PROFILE | No | Chrome scraping profile |
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}. |
| 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. |
| 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. 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
|
| 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_searchA | Search WB catalog by text query. Uses the lightweight |
| 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 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. 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
|
| wb_selfcheckA | Structural drift canary for WB (tri-state: success / drift_detected / inconclusive). Probes EVERY endpoint family the tools depend on:
Tri-state (audit 2026-06-01): an http!=200 / network error / OOS baseline is
|
| 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. |
| 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). |
| ozon_selfcheckA | Structural drift canary for Ozon (tri-state: success / drift_detected / inconclusive). Fetches live search/card/reviews + a non-default reviews sort and compares the widget-prefix SHAPE against the critical set, plus a parse smoke. Detects "a widget we depend on vanished" BEFORE it silently breaks a parser. Tri-state (audit 2026-06-01): a Cloudflare 403 / CDP-down / non-200 / non-JSON
body is Return FormatOzonSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id} — tri-state per subcheck (healthy/drift/inconclusive). Inconclusive and drift_detected are NOT errors; they are valid canary verdicts returned as a normal response. Error FormatRaises ToolError (TransportDownError) ONLY on an unexpected internal bug that prevents the canary from producing any verdict. Transport/block/parse failures of individual sub-checks map to inconclusive entries, not errors. |
| 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 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. Error FormatOn validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable. |
| yandex_selfcheckA | Probe Yandex Market's search and card pages and report a tri-state verdict.
This matters more here than for a JSON API: SSR extraction is inherently coupled to Yandex's front-end, so drift is a question of when. |
| 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. 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. 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 Error FormatOn validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable. |
| detmir_selfcheckA | Probe every Detsky Mir endpoint family and report a tri-state verdict.
Run it after install and whenever results look wrong. |
| 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. |
| avito_selfcheckA | Structural drift canary for Avito (tri-state: success / drift_detected / inconclusive). Runs live probes against search, card and seller endpoints. A 403 firewall block or CDP-down is Return FormatAvitoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}. |
| 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. 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. |
| taobao_selfcheckA | Structural drift canary for Taobao (tri-state). Renders one live search page in the operator's Chrome and checks the extractor still finds items. CDP down or a login wall is Return FormatTaobaoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}. |
| 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. |
| megamarket_selfcheckA | Structural drift canary for Megamarket (tri-state). Posts one live search through CDP and checks items parse. A ServicePipe code-7 refusal or CDP-down is Return FormatMegamarketSelfcheckResponse: {status, healthy, connector, checks, ...}. |
| 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. |
| lamoda_selfcheckA | Structural drift canary for Lamoda (tri-state). Probes the GraphQL card path (tier 1) and the CDP search path (tier 2). GraphQL down is inconclusive for the card check; CDP down / a redirect loop is inconclusive for the search check. Only a reached payload that fails its parse smoke is drift. Return FormatLamodaSelfcheckResponse: {status, healthy, connector, checks, ...}. |
| 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. |
| dns_selfcheckA | Structural drift canary for DNS-Shop (tri-state). Renders one live search page in the operator's Chrome and checks tiles extract. Qrator-blocked or CDP-down is Return FormatDnsSelfcheckResponse: {status, healthy, connector, checks, ...}. |
| 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. |
| citilink_selfcheckA | Structural drift canary for Citilink (tri-state). Renders one live search page in the operator's Chrome and checks tiles extract. Qrator-blocked or CDP-down is Return FormatCitilinkSelfcheckResponse: {status, healthy, connector, checks, ...}. |
| 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. 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. |
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/neuratechcompany-ops/kettu-marketplace-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server