--- name: marketplace description: Use this skill when the operator wants the full marketplace mount, routing metadata, or client setup. Trigger on "один MCP", "все источники", "marketplace_sources", "настроить marketplace", or "full marketplace". Route price questions such as "где дешевле" and "compare prices" to compare-prices; skip single-source tasks. --- # Unified Marketplace Server One server mounting every installed connector as a namespaced toolset: `wb_*`, `ozon_*`, `yandex_*`, `detmir_*`, `avito_*`, `taobao_*`, `megamarket_*`, `lamoda_*`, `dns_*`, `citilink_*`, `aliexpress_*`, `cian_*`, `mpstats_*` plus `compare_prices` / `compare_sources` and its own `marketplace_sources`. Tool names keep their prefixes, so habits and configs carry over — but the operator wires a single `marketplace` entry instead of fourteen. The server exposes 40 tools: 39 mounted plus `marketplace_sources`. `mpstats_*` is the optional paid source: without `MPSTATS_MP_AUTH` its tools answer `auth_missing` while everything else is unaffected. ## When to use - "Where is X cheapest" — compare_prices fans out across all searchable sources - Client setup: one config entry, not fourteen - Health overview: the CLI's `doctor` runs every selfcheck at once - A source came back empty and you can't tell installed-but-quiet from never-loaded → `marketplace_sources` ## Tools - `marketplace_sources()` — no arguments; returns `{mounted, skipped, mounted_count, skipped_count, capabilities, server_version}`. `capabilities` is static routing metadata per source: access tier, CDP/login requirements, currency, text-search support, and whether the connector is mounted. `skipped` maps a source name to the import error that dropped it, usually a missing dependency. Connectors are imported defensively, so a missing dep removes a marketplace instead of killing the server — but from the client an absent source looks identical to one that found nothing. Call this to tell the two apart: a name in `skipped` was never queried at all. ## Operator CLI - `marketplace-mcp install [client]` — print the exact mcpServers JSON to paste. From a source checkout it prints the real filesystem path of that checkout, so there's no `/path/to/ru-marketplace-mcp` placeholder to hand-edit; installed as a wheel, it prints the console-script paths on PATH instead. `client` must be one of `claude`, `claude-code`, `cursor` — an unknown name is rejected, not answered with a Claude block. - `marketplace-mcp doctor [--status-file path]` — per-source health plus a CDP session probe, with an optional machine-readable JSON snapshot for monitoring. Exit codes are meaningful for cron and CI: `0` everything healthy, `1` a parser drifted (the alarm — someone has to look), `2` nothing drifted but at least one source couldn't be judged (blocked, no CDP, wrong region). "Couldn't check anything" is a `2`, never a `0`. ## Gotchas - Recovery-aware clients should read `source_outcomes.requires_user_action` before scheduling retries. Keep answered sources visible, show the affected marketplace and `challenge_type`, and retry that source after the browser interaction completes. A challenge is not an empty product search. See the compare-prices skill for the retry contract. `handoff_expires_at` confirms that the source retained its tab; repeat the same operation in the same MCP session after browser action and before that expiry. See docs/CDP_SETUP.md for opt-in configuration and supported sources. - A source whose optional deps are missing is simply absent from the set — `marketplace_sources` says which and why. - Set `MARKETPLACE_SOURCES` on the unified server to mount only a comma-separated subset (`wildberries,ozon,compare`); unset or blank keeps every source. The aliases `wb`, `ym`/`yandex`, `detmir`, and `ali` work too. Unknown names fail at startup instead of silently producing a partial server, and deselected sources are reported with a `deselected` reason. - compare_prices ranks on everyday ruble prices; Taobao (CNY) is reported in `price_native` but never ranked against rubles. ## DSH activation In DeepSeek Harness, the default profile exposes only `compare_prices` and `compare_sources` through the cheap compare mount. Per-marketplace tools and `marketplace_sources` require `RU_MARKETPLACE_MCP_FULL=1` and a profile restart; do not call them in the default mode.