Skip to main content
Glama
neuratechcompany-ops

Kettu Marketplace Intelligence

Kettu Marketplace Intelligence

CI Python 3.12+ License: MIT MCP

Kettu Marketplace Intelligence — MCP-серверы для российских и китайских маркетплейсов. Цены, наличие, рейтинги, отзывы и реквизиты продавцов с Wildberries, Ozon, Яндекс Маркета, Детского мира, Авито, Taobao, Мегамаркета, Lamoda, DNS и Ситилинка. Плюс сравнение цен по всем источникам одним вызовом.

Только чтение. Ключи API, токены и регистрация не нужны — площадки с жёстким анти-ботом читаются через ваш собственный Chrome.

English version below · Архитектура · Как добавить источник · Про анти-бот


Что внутри

Сервер

Инструментов

Что нужно, чтобы читалось

Что умеет

Wildberries

9

анонимный HTTP

Поиск, карточки, отзывы, вопросы о товаре, реквизиты продавца, каталог и товары категории

Яндекс Маркет

3

анонимный HTTP

Цены разных продавцов, разбивка оценок по звёздам, отзывы

Детский мир

4

анонимный HTTP

Детские товары, наличие в офлайн-магазинах, категории

Ozon

4

ваш Chrome; с домашнего IP часто и без него

Поиск, карточки, отзывы

Авито

4

ваш Chrome + российский домашний IP и запросы вразрядку — иначе блок по IP

Поиск объявлений, карточки, репутация продавца

Taobao

3

ваш Chrome с активным входом в Taobao

Поиск и карточки, цены в юанях

Мегамаркет

3

ваш Chrome с активным входом — анонимной сессии API отдаёт пусто

Поиск и карточки через мобильный API

Lamoda

3

карточки анонимно (GraphQL), поиск — ваш Chrome

Поиск, карточки с размерами

DNS

3

ваш Chrome (Qrator)

Поиск и карточки электроники

Ситилинк

3

ваш Chrome (Qrator)

Поиск и карточки электроники

Сравнение

2

опрашивает всё перечисленное

«Где дешевле?» одним вызовом

Читается анонимно, без браузера: Wildberries, Яндекс Маркет, Детский мир и карточки Lamoda. Остальным нужен ваш залогиненный Chrome (CDP). Taobao и Мегамаркет вдобавок требуют активного входа в саму площадку — без него Taobao упирается в стену логина, а Мегамаркет отдаёт пустой ответ. Авито ещё и блокирует по IP: с датацентрового адреса это глухой отказ, с российского домашнего — работает, если не частить запросами. Запросы к CDP-источникам идут вразрядку: очередь подряд без пауз роняет их (DNS и Taobao в проверке так и деградировали), поэтому коннекторы держат паузу между вызовами сами. Точное состояние из вашей сессии покажет *_selfcheck.

Всего 41 инструмент в 11 серверах на общем рантайме mcp-core. Плюс объединённый marketplace-mcp, который монтирует всё разом — одна запись в конфиге клиента вместо одиннадцати. Он добавляет свой инструмент marketplace_sources (какие коннекторы поднялись, а какие отвалились и почему), так что в нём 42 инструмента: 41 смонтированный плюс этот.

Related MCP server: wildberries-mcp

Быстрый старт

Нужны Python 3.12+ и uv.

git clone https://github.com/neuratechcompany-ops/kettu-marketplace-mcp.git
cd kettu-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp"   # 822 офлайн-теста, сеть не нужна

Проверка живого эндпоинта:

uv run python -c "
import asyncio
from wb_connector.server import wb_selfcheck
print(asyncio.run(wb_selfcheck()).status)   # ждём success
"

Подключение к MCP-клиенту

Каждый сервер — консольная команда, поэтому пути в конфиге не зашиваются.

Windows: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Проще всего подключить одну запись — объединённый сервер монтирует все источники разом, а имена инструментов (wb_search, avito_seller, …) не меняются:

{
  "mcpServers": {
    "marketplace": {
      "command": "uv",
      "args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "marketplace-mcp"]
    }
  }
}

Если нужны отдельные серверы, marketplace-mcp install claude напечатает готовый блок для вставки. Путь к вашему checkout там уже подставлен: заглушку /path/to/kettu-marketplace-mcp править руками не придётся. При установке из wheel вместо путей печатаются консольные команды на PATH. Неизвестное имя клиента (допустимы claude, claude-code, cursor) команда отклоняет с пояснением и кодом возврата 2 — молча подставить блок для Claude она не может. Минимальный вариант вручную:

{
  "mcpServers": {
    "wildberries": {
      "command": "uv",
      "args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "wb-mcp"]
    },
    "ozon": {
      "command": "uv",
      "args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "ozon-mcp"]
    },
    "compare-prices": {
      "command": "uv",
      "args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "compare-mcp"]
    }
  }
}

Путь пишите с прямыми слешами / или двойными обратными \\. Полный список команд — wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, avito-mcp, taobao-mcp, megamarket-mcp, lamoda-mcp, dns-mcp, citilink-mcp, compare-mcp, marketplace-mcp.

claude mcp add wildberries -- uv run --directory /путь/к/kettu-marketplace-mcp wb-mcp
claude mcp add yandex-market -- uv run --directory /путь/к/kettu-marketplace-mcp yandex-mcp
claude mcp add detsky-mir -- uv run --directory /путь/к/kettu-marketplace-mcp detmir-mcp
claude mcp add ozon -- uv run --directory /путь/к/kettu-marketplace-mcp ozon-mcp
claude mcp add compare-prices -- uv run --directory /путь/к/kettu-marketplace-mcp compare-mcp
{
  "mcpServers": {
    "compare-prices": {
      "command": "uv",
      "args": ["run", "--directory", "/путь/к/kettu-marketplace-mcp", "compare-mcp"]
    }
  }
}

Запустите uv run --directory /путь/к/репозиторию <команда>, где команда — одна из wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, compare-mcp. Серверы говорят по JSON-RPC через stdin и stdout, диагностику пишут в stderr.

После подключения перезапустите клиент и попросите агента вызвать wb_selfcheck. Он проверит все семейства эндпоинтов и ответит success, drift_detected или inconclusive.

Инструменты

Wildberries — wb_*

Инструмент

Что делает

wb_search(query, page)

Поиск по тексту, до 100 товаров на страницу с ценами и остатками

wb_card(nm_ids)

Пакетный запрос до 100 известных SKU

wb_root_info(nm_id)

Находит imt_id (нужен для отзывов) и цветовые варианты

wb_reviews(imt_id, limit, sort)

Пул отзывов. Ключ — imt_id, а не nm_id

wb_questions(imt_id, limit, skip, answered_only)

Вопросы покупателей и ответы продавца. Тоже по imt_id

wb_seller(supplier_id)

Юрлицо, ИНН, КПП, ОГРН, юридический адрес

wb_categories(root, max_depth)

Дерево каталога с шардами и запросами самого WB

wb_category_products(shard, query, page, sort, dest)

Товары категории по shard и query из wb_categories

wb_selfcheck()

Канарейка на дрейф формата

wb_seller отвечает на вопрос, который карточка товара скрывает: кто на самом деле продаёт? Возвращает зарегистрированное юрлицо и налоговые номера. Так отличают официальный магазин бренда от перекупщика с похожим названием.

wb_questions закрывает другой пробел. Отзывы говорят, каково владеть товаром; вопросы уточняют, что это вообще за товар — «10 или 16 ампер», «кабель в комплекте?». Ответ продавца часто единственное публичное утверждение об этом. Пул общий для всех вариантов товара, ключ — imt_id из wb_root_info.

wb_category_products замыкает связку с wb_categories: та отдаёт shard и query, это — товары по ним. Формат элементов совпадает с wb_search, поэтому обход категорий и текстовый поиск сравнимы напрямую. Часть крупных разделов WB помечает шардом blackhole — у них нет своей выдачи, и инструмент честно об этом говорит вместо пустого списка.

Яндекс Маркет — yandex_*

Инструмент

Что делает

yandex_search(query, page, limit)

Поиск с обеими ценами, рейтингами, продавцами

yandex_card(product_id, include_reviews)

Карточка целиком: разбивка по звёздам и отзывы

yandex_selfcheck()

Канарейка на дрейф формата

Две цены, всегда. price_rub платит любой покупатель. price_with_plus требует подписку Яндекс Плюс и обычно на 25–30% ниже. Интерфейс Яндекса показывает вторую крупным шрифтом, поэтому назвать её без оговорки — значит пообещать цену, которую человек без подписки не получит.

rating_stars даёт распределение вида {1: 10, 2: 3, 3: 10, 4: 19, 5: 502}. Из него видно, честная ли средняя 4.8 или за ней прячется кучка единиц.

Детский мир — detmir_*

Инструмент

Что делает

detmir_categories(parent, limit, region)

Дерево каталога. Начинать отсюда

detmir_category(alias, limit, offset, region)

Товары категории с настоящим счётчиком

detmir_card(product_id, region)

Цена, рейтинг, наличие онлайн и в магазинах

detmir_selfcheck()

Канарейка на дрейф формата

Регион задаётся на каждый вызов. Цены и особенно наличие в офлайн-магазинах сильно зависят от города: один и тот же товар лежал в 152 магазинах Москвы, 37 Петербурга и 2 Хабаровска. Параметр region перекрывает DETMIR_REGION, так что города можно сравнивать в одной сессии.

Текстового поиска здесь нет, и это намеренно. API Детского мира молча игнорирует любые текстовые фильтры и возвращает весь каталог на 300 тысяч позиций, а сайтовый роут поиска отдаёт 404 с промо-карусселью. Инструмент поиска возвращал бы уверенно неверные товары, поэтому навигация идёт через категории. Подробности в docs/ANTI_BOT.md.

Ozon — ozon_*

Инструмент

Что делает

ozon_search(query)

Поиск по тексту

ozon_card(sku_or_path)

Карточка товара

ozon_reviews(sku_or_path, limit, sort)

Отзывы

ozon_selfcheck()

Канарейка на дрейф формата

Ozon отклоняет датацентровый трафик, поэтому коннектор двухуровневый. Сначала TLS-имперсонация. Если Cloudflare выдаёт челлендж, запрос выполняется внутри вашего залогиненного Chrome через DevTools Protocol. Ничего не хранится: вход выполняете вы сами, в браузере, который контролируете. Настройка описана в docs/CDP_SETUP.md.

С российского домашнего IP первый уровень обычно работает, и браузер не нужен.

Авито — avito_*

Инструмент

Что делает

avito_search(query, page, location_id, category_id)

Поиск объявлений через внутренний js/items API

avito_card(item_id_or_url)

Одно объявление: цена, описание, просмотры, продавец

avito_seller(seller_id_or_url)

Рейтинг продавца, число отзывов, активные объявления

avito_selfcheck()

Канарейка на дрейф формата

Авито — это объявления, а не каталог: пула отзывов на товар нет, репутация продавца и есть сигнал доверия. Бесплатное/обменное объявление приходит с price_rub: null — никогда не 0, чтобы не оказаться «самым дешёвым» в сравнении. С датацентрового IP Авито отвечает 403-файрволом, поэтому коннектор двухуровневый: TLS-имперсонация, дальше ваш Chrome (как у Ozon).

Taobao — taobao_*

Инструмент

Что делает

taobao_search(query, page)

Поиск по каталогу Taobao

taobao_card(item_id_or_url)

Карточка товара

taobao_selfcheck()

Канарейка на дрейф формата

Поиск Taobao — клиентское React-приложение с подписанным mtop API: каждый запрос требует sign, вычисленный из cookie-токена, поэтому анонимного пути нет. Все чтения идут внутри вашего Chrome, где сайт сам подписывает запросы. Цены в юанях (CNY) и не конвертируются: зашитый курс молча устарел бы, так что сравнение с рублёвыми источниками делайте явно.

Эти четыре читаются через ваш Chrome (CDP). Мегамаркет (megamarket_*) — мобильный JSON API из-за ServicePipe, и одного пройденного челленджа мало: анонимной сессии API отдаёт пустой список, нужен активный вход в Мегамаркет. DNS (dns_*) и Ситилинк (citilink_*) — отрисованный DOM из-за Qrator; у всех трёх анонимного пути нет вообще. Lamoda (lamoda_*) наполовину: карточки берутся анонимно через GraphQL, а поиск — через Chrome. Chrome с CDP (scripts/start_chrome_cdp.sh) нужен всем, кроме карточек Lamoda.

Всего через CDP ходят семь источников — эти плюс Ozon и Авито, где Chrome лишь запасной уровень: их tier 1 обычно отвечает, а браузер включается, когда анонимный уровень упёрся в челлендж. Проверка *_selfcheck из вашего браузера скажет, какие эндпоинты подтверждены.

Сравнение цен — compare_*

Инструмент

Что делает

compare_prices(query, per_source_limit, sources)

Все маркетплейсы сразу, с ранжированием

compare_sources()

Какие маркетплейсы доступны в этой установке

compare_prices("кроссовки мужские")

  wildberries      712 ₽   Кроссовки изи дышащие спортивные
  wildberries      814 ₽   Зимние кроссовки теплые с мехом
  yandex_market   2499 ₽   Кеды A-LOW
  yandex_market   3480 ₽   Кеды

  дешевле всего: wildberries 712 ₽, разброс 5858 ₽, complete: true

Маркетплейсы опрашиваются параллельно, и каждый отчитывается сам за себя. Если один заблокирован, сравнение не рушится: complete: false вместе с source_outcomes покажет, что именно вы видите. Подписочные цены в ранжировании не участвуют. Совпадающие предложения по паре (источник, id товара) схлопываются, так что один и тот же товар не занимает два места в ранжировании.

У каждого предложения есть currency (строчный ISO-код, по умолчанию rub) и price_native — цена в этой валюте, как её показывает маркетплейс. Для российских источников она совпадает с price_rub; у Taobao в ней лежит цена в юанях, которую price_rub намеренно оставляет пустой. Раньше юаневую цену забирали и молча выбрасывали, и строка Taobao приходила с пустой ценой без намёка, что цена вообще есть. Теперь юань виден, но в рублёвом ранжировании по-прежнему не участвует: в warnings появляется foreign_currency: … с числом исключённых предложений и причиной. Конвертировать здесь значило бы зашить курс, который молча устареет, — пересчёт за вами.

Навыки для агента

У каждого коннектора — свой навык в skills/, двенадцать штук на двенадцать серверов. Навык это не пересказ README: он объясняет агенту, когда за этот источник вообще браться, чего у источника нет, и каким его ответам нельзя верить без второго взгляда.

Навык

Сервер

skills/wb-connector

wb-mcp

skills/ozon-connector

ozon-mcp

skills/yandex-connector

yandex-mcp

skills/detmir-connector

detmir-mcp

skills/avito-connector

avito-mcp

skills/taobao-connector

taobao-mcp

skills/megamarket-connector

megamarket-mcp

skills/lamoda-connector

lamoda-mcp

skills/dns-connector

dns-mcp

skills/citilink-connector

citilink-mcp

skills/compare-prices

compare-mcp

skills/marketplace

marketplace-mcp

mcp-core — общий рантайм под остальными серверами. Своего навыка у него нет.

Соответствие проверяется тестом (packages/marketplace-connector/tests/test_skills_parity.py): новый коннектор без навыка роняет прогон, как и навык, который называет несуществующий инструмент или забыл существующий. До этого теста навык DNS почти год советовал формат ссылки /product/<24-hex>/ — тот самый шаблон, который чинили как баг.

Скиллы едут в Docker-образ (/app/skills/), но в колёсах их нет: skills/ лежит в корне репозитория. Ставите с PyPI — возьмите навыки из репозитория отдельно.

Настройка

Все параметры задаются переменными окружения с префиксом коннектора. Все необязательные.

Префикс

Основные параметры

WB_

TIMEOUT, MIN_GAP, DEFAULT_DEST, NET_RETRIES, MAX_BODY_BYTES, CACHE_TTL, PROXY

YANDEX_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

DETMIR_

REGION (RU-MOW, RU-SPE и другие), CACHE_TTL, PROXY

OZON_

TIMEOUT, MIN_GAP, IMPERSONATE, CACHE_TTL, PROXY

AVITO_

TIMEOUT, MIN_GAP, IMPERSONATE, CACHE_TTL, PROXY, LOCATION_ID

TAOBAO_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

MEGAMARKET_

TIMEOUT, MIN_GAP, CACHE_TTL

LAMODA_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

DNS_ / CITILINK_

TIMEOUT, MIN_GAP, CACHE_TTL

CHROME_

CDP_HOST, CDP_PORT, SCRAPING_PROFILE, BINARY, HEADLESS, STEALTH

COMPARE_

SOURCE_TIMEOUT

MCP_

TRANSPORT (stdio по умолчанию, либо http), HTTP_HOST, HTTP_PORT

CHROME_CDP_HOST указывает, куда дозвониться CDP-клиенту (по умолчанию 127.0.0.1). Из контейнера ставьте chrome (сайдкар) или host.docker.internal — это открывает tier-2 источники (Ozon, Авито, Taobao, Мегамаркет, Lamoda, DNS, Ситилинк) в Docker без host networking. Подробности в docs/DEPLOYMENT.md.

*_CACHE_TTL=0 выключает кэш. *_PROXY перекрывает стандартные HTTPS_PROXY и ALL_PROXY — свой префикс есть у семи коннекторов: WB_, YANDEX_, DETMIR_, OZON_, AVITO_, TAOBAO_ и LAMODA_. У Мегамаркета, DNS и Ситилинка своего нет: их трафик идёт через ваш Chrome, а его egress — дело настроек браузера. Кэшируются только удачные ответы: запомнить сбой значило бы растянуть секундную помеху на весь TTL.

У Ozon прокси применяется к первому уровню. Второй идёт через ваш собственный Chrome, и его трафик — дело настроек этого браузера.

Секретов в проекте нет вообще. Нечего настраивать, нечему утечь.

Разработка

uv sync --all-packages
uv run pytest -q -m "not live and not cdp"    # 822 офлайн-теста
uv run pytest -q -m "not live"                # то, что гоняет CI
uv run pytest -q -m "not live" --cov          # покрытие, порог 70% в CI
uv run ruff check . && uv run ruff format --check .
uv run mypy                                   # что проверять — в [tool.mypy] files
uv run mypy --platform win32                  # ловит ошибки, видимые только на Windows
uv run python scripts/check_no_print.py       # запись в stdout ломает JSON-RPC
uv run python scripts/check_versions.py       # одна версия во всех 55 местах

Часть тестов прогоняет настоящий JS-экстрактор коннектора по снятой разметке и проверяет результат против цен, которые в тот момент были на странице. Для этого нужен Node с jsdom:

npm install jsdom      # либо NODE_PATH на уже установленный
uv run pytest -q packages/dns-connector/tests/test_search_extractor_dom.py \
              packages/citilink-connector/tests/test_search_extractor_dom.py

Без jsdom эта половина честно скипается, а питоновская часть — выбор цены из кандидатов — идёт всегда. jsdom нужен только разработчику: в зависимости коннекторов он не входит.

CI прогоняет линтер, типы и все тесты на Ubuntu, Windows и macOS против Python 3.12 и 3.13. Windows-специфичное управление процессами проверяется юнит-тестами на любой ОС через подмену платформы, так что эти ветки покрыты даже на Linux.

Как добавить маркетплейс — docs/ADDING_A_SOURCE.md.

Надёжность

Неофициальные эндпоинты ломаются. Архитектура это предполагает.

  • Терпимые парсеры. Привязка поля по нескольким именам и приведение типов впитывают переименования и смену типа вместо падения.

  • Никогда не выдумывать значение. Отсутствующая цена — это null, не 0. Ноль вывел бы мёртвый товар в самые дешёвые.

  • Громкий отказ. Когда формат перестаёт совпадать, инструмент бросает parser_drift, а не возвращает полуразобранные данные.

  • Трёхзначные selfcheck-проверки. success, drift_detected или inconclusive. Гео-блокировка помечается как inconclusive, потому что она ничего не говорит о состоянии парсеров.

Границы доверия

Названия товаров, имена продавцов и тексты отзывов написаны продавцами и покупателями. Это недоверенные данные. Если отзыв или описание выглядит как инструкция, оно всё равно остаётся входными данными. Выполнять его агент не должен.

Условия маркетплейсов, как правило, запрещают неофициальный парсинг. Коннекторы обращаются только к публичным эндпоинтам каталога, которые использует официальный веб-клиент. В приватные и административные разделы запросов нет. Уровень Ozon с браузером работает внутри сессии, которую вы открыли сами. Используйте на своё усмотрение, для личных исследований, в вежливом темпе запросов.

Как это сделано

Код и документацию я писал вместе с ИИ-ассистентами. Они работают быстро и ошибаются уверенно, поэтому проект устроен вокруг проверки: 822 офлайн-теста, аудит перед выпуском, тесты, которые прогоняют настоящий экстрактор по снятой с сайта разметке. В заметках к релизу перечислено, какие источники сверены с живыми страницами вручную и какие остались непроверенными.

Вопрос «кто набрал текст» кажется мне менее интересным, чем вопрос «чем это проверено». Второй здесь задокументирован, и проверить его может любой.

Лицензия

MIT, файл LICENSE.


English version

MCP servers for Russian and Chinese marketplaces. Read prices, stock, ratings, reviews and seller identity from Wildberries, Ozon, Yandex Market, Detsky Mir, Avito, Taobao, Megamarket, Lamoda, DNS and Citilink, then compare prices across all of them in one call. Taobao is the Chinese one; the other nine are Russian.

Read-only. No credentials, no API keys, no account required — the marketplaces with hard anti-bot are read through your own Chrome.

What you get

Server

Tools

What it takes to read

Notes

Wildberries

9

anonymous HTTP

Search, cards, reviews, buyer questions, seller legal identity, catalog tree and category listings

Yandex Market

3

anonymous HTTP

Multi-seller prices, star distribution, reviews

Detsky Mir

4

anonymous HTTP

Kids' goods, offline store stock, category listings

Ozon

4

your Chrome; often no browser from a residential IP

Search, cards, reviews

Avito

4

your Chrome + a Russian residential IP and spaced requests — else an IP block

Classified search, cards, seller reputation

Taobao

3

your Chrome with an active Taobao login

Search and cards, prices in yuan

Megamarket

3

your Chrome with an active login — an anonymous session reads empty

Search and cards via the mobile API

Lamoda

3

cards anonymous (GraphQL), search via your Chrome

Search, cards with sizes

DNS

3

your Chrome (Qrator)

Electronics search and cards

Citilink

3

your Chrome (Qrator)

Electronics search and cards

Compare

2

aggregates the above

"Where is this cheapest?" in one call

Anonymous, no browser: Wildberries, Yandex Market, Detsky Mir and Lamoda cards. The rest need your logged-in Chrome (CDP). Taobao and Megamarket additionally need you signed into the marketplace itself — without it Taobao hits a login wall and Megamarket returns an empty result. Avito also blocks by IP: from a datacenter address it is a flat refusal, from a Russian residential one it works as long as you do not burst requests. Requests to the CDP sources are paced apart — a run of back-to-back calls degrades them (DNS and Taobao both dropped that way in testing), so the connectors hold a gap between calls themselves. Run *_selfcheck from your own session for the current state.

41 tools across 11 stdio MCP servers, sharing one runtime (mcp-core), plus the unified marketplace-mcp that mounts them all under one client entry. It adds its own marketplace_sources tool — which connectors mounted, and which dropped out and why — so it exposes 42 tools: the 41 mounted plus that one. stdio is the default; HTTP transport is opt-in for remote deployment — see docs/DEPLOYMENT.md.

Quickstart

Requires Python 3.12+ and uv.

git clone https://github.com/neuratechcompany-ops/kettu-marketplace-mcp.git
cd kettu-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp"    # 822 offline tests, no network needed

Client configuration mirrors the Russian section above. Each server is a console script (wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, compare-mcp) launched through uv run --directory /path/to/repo <script>. marketplace-mcp install [claude|claude-code|cursor] prints the block with your checkout's real path filled in — no placeholder to hand-edit — or the console-script paths on PATH when installed as a wheel; an unknown client name is rejected.

After connecting, ask your agent to run wb_selfcheck. It probes every endpoint family and reports success, drift_detected, or inconclusive.

The tools

Wildberries — wb_*

Tool

What it does

wb_search(query, page)

Text search, up to 100 products/page with prices and stock

wb_card(nm_ids)

Batch lookup for up to 100 known SKUs

wb_root_info(nm_id)

Resolves imt_id (needed for reviews) plus colour variants

wb_reviews(imt_id, limit, sort)

Review pool, keyed by imt_id, not nm_id

wb_questions(imt_id, limit, skip, answered_only)

Buyer questions with seller answers, also keyed by imt_id

wb_seller(supplier_id)

Registered entity, INN, KPP, OGRN, legal address

wb_categories(root, max_depth)

Catalog tree with WB's own shard/query selectors

wb_category_products(shard, query, page, sort, dest)

Products in a category, using those selectors

wb_selfcheck()

Drift canary

wb_seller answers the question a listing hides: who actually ships this? It returns the registered legal entity and tax ids, which is how you distinguish an official brand store from a reseller trading under a lookalike name.

wb_questions covers a different gap. Reviews describe what owning the product is like; questions clarify what it actually is — "10A or 16A?", "is the cable included?" — and the seller's reply is often the only public statement of that fact. One pool per imt_id, shared across every variant.

wb_category_products closes the loop wb_categories opens: that tool hands back WB's shard and query, and this one fetches the products behind them. Items use the same shape as wb_search, so a category walk and a text search are directly comparable. Several of WB's largest sections carry the shard blackhole and have no feed at all; the tool says so instead of returning an empty list.

Yandex Market — yandex_*

Tool

What it does

yandex_search(query, page, limit)

Search with both prices, ratings, sellers

yandex_card(product_id, include_reviews)

Full detail plus star breakdown and reviews

yandex_selfcheck()

Drift canary

Two prices, always. price_rub is what anyone pays. price_with_plus needs a paid Yandex Plus subscription and runs 25–30% lower. Yandex leads with the subscriber price, so quoting it uncritically misstates the real cost.

rating_stars gives the distribution, for example {1: 10, 2: 3, 3: 10, 4: 19, 5: 502}. That reveals whether a 4.8 average is earned or hides a cluster of complaints.

Detsky Mir — detmir_*

Tool

What it does

detmir_categories(parent, limit, region)

Catalog tree, start here

detmir_category(alias, limit, offset, region)

Products in a category, with real totals

detmir_card(product_id, region)

Price, rating, online and offline store stock

detmir_selfcheck()

Drift canary

Region is per call. Prices and especially offline availability swing by city — one item sat in 152 Moscow stores, 37 in St Petersburg, 2 in Khabarovsk. The region parameter overrides DETMIR_REGION, so one session can compare cities.

There is no text search, deliberately. Detsky Mir's API silently ignores every text filter and returns its entire 300k-item catalog; the website's search route answers 404 and renders a promo carousel. A search tool would return confidently wrong products, so discovery goes through categories instead. See docs/ANTI_BOT.md.

Ozon — ozon_*

Tool

What it does

ozon_search(query)

Text search

ozon_card(sku_or_path)

Product detail

ozon_reviews(sku_or_path, limit, sort)

Reviews

ozon_selfcheck()

Drift canary

Ozon rejects datacenter traffic, so this connector is two-tier: TLS impersonation first, then a fetch inside your own logged-in Chrome over the DevTools Protocol when Cloudflare challenges. Nothing is stored; you log in yourself, in a browser you control. Setup: docs/CDP_SETUP.md.

From a Russian residential IP the first tier usually works and no browser is needed.

Cross-marketplace — compare_*

Tool

What it does

compare_prices(query, per_source_limit, sources)

Every marketplace at once, ranked

compare_sources()

Which marketplaces this install can query

compare_prices("кроссовки мужские")

  wildberries      712 RUB   Кроссовки изи дышащие спортивные
  wildberries      814 RUB   Зимние кроссовки теплые с мехом
  yandex_market   2499 RUB   Кеды A-LOW
  yandex_market   3480 RUB   Кеды

  cheapest: wildberries 712 RUB, spread 5858 RUB, complete: true

Sources are queried concurrently and each reports its own outcome. One marketplace being blocked never sinks the comparison: complete: false plus source_outcomes tells you exactly what you are looking at. Subscription prices never win the ranking. Offers matching on (source, product id) are collapsed, so one listing can no longer take two ranking slots.

Every offer carries currency (lowercase ISO code, default rub) and price_native, the price in that currency as the marketplace quotes it. For Russian sources it mirrors price_rub; for Taobao it holds the yuan price that price_rub deliberately leaves null. That yuan price used to be fetched and silently thrown away, so a Taobao row showed a blank price with no sign a real one existed. Now the yuan is reported but still never ranked against roubles: a foreign_currency: … warning lists how many offers were excluded and why. Converting here would bake in an exchange rate that goes stale silently, so the caller converts if they want to.

Agent skills

Every connector ships its own skill under skills/ — twelve of them for twelve servers. A skill is not a restatement of this README: it tells the agent when to reach for that source at all, what the source does not have, and which of its answers should not be trusted without a second look.

Skill

Server

skills/wb-connector

wb-mcp

skills/ozon-connector

ozon-mcp

skills/yandex-connector

yandex-mcp

skills/detmir-connector

detmir-mcp

skills/avito-connector

avito-mcp

skills/taobao-connector

taobao-mcp

skills/megamarket-connector

megamarket-mcp

skills/lamoda-connector

lamoda-mcp

skills/dns-connector

dns-mcp

skills/citilink-connector

citilink-mcp

skills/compare-prices

compare-mcp

skills/marketplace

marketplace-mcp

mcp-core is the shared runtime rather than a server, so it has no skill.

The mapping is enforced by a test (packages/marketplace-connector/tests/test_skills_parity.py): a new connector without a skill fails the run, and so does a skill that names a tool which does not exist — or omits one that does. Before that test existed, the DNS skill spent months telling operators to pass /product/<24-hex>/, the exact pattern a fix had already removed.

Skills are copied into the Docker image (/app/skills/), but they are not in the wheels: skills/ lives at the repository root rather than inside the packages. Installing from PyPI means fetching the skills from the repo separately.

Configuration

Every setting is an environment variable with a per-connector prefix. All optional.

Prefix

Common knobs

WB_

TIMEOUT, MIN_GAP, DEFAULT_DEST, NET_RETRIES, MAX_BODY_BYTES, CACHE_TTL, PROXY

YANDEX_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

DETMIR_

REGION (RU-MOW, RU-SPE, and others), CACHE_TTL, PROXY

OZON_

TIMEOUT, MIN_GAP, IMPERSONATE, CACHE_TTL, PROXY

AVITO_

TIMEOUT, MIN_GAP, IMPERSONATE, CACHE_TTL, PROXY, LOCATION_ID

TAOBAO_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

MEGAMARKET_

TIMEOUT, MIN_GAP, CACHE_TTL

LAMODA_

TIMEOUT, MIN_GAP, CACHE_TTL, PROXY

DNS_ / CITILINK_

TIMEOUT, MIN_GAP, CACHE_TTL

CHROME_

CDP_HOST, CDP_PORT, SCRAPING_PROFILE, BINARY, HEADLESS, STEALTH

COMPARE_

SOURCE_TIMEOUT

MCP_

TRANSPORT (stdio default, or http), HTTP_HOST, HTTP_PORT

*_CACHE_TTL=0 disables caching. *_PROXY overrides the standard HTTPS_PROXY/ALL_PROXY — seven connectors carry one: WB_, YANDEX_, DETMIR_, OZON_, AVITO_, TAOBAO_ and LAMODA_. Megamarket, DNS and Citilink have none: their traffic goes through your own Chrome, whose egress is that browser's configuration. Only successful reads are cached: remembering a failure would stretch a one-second blip across the whole TTL window.

Ozon's proxy applies to tier 1. Tier 2 runs inside your own Chrome, whose egress is that browser's configuration, not ours.

No secrets exist anywhere in this project. Nothing to configure, nothing to leak.

Development

uv sync --all-packages
uv run pytest -q -m "not live and not cdp"    # 822 offline tests
uv run pytest -q -m "not live"                # what CI runs
uv run pytest -q -m "not live" --cov          # coverage, CI enforces a 70% floor
uv run ruff check . && uv run ruff format --check .
uv run mypy                                   # the tree lives in [tool.mypy] files
uv run mypy --platform win32                  # catches Windows-only type errors
uv run python scripts/check_no_print.py       # a print() breaks JSON-RPC
uv run python scripts/check_versions.py       # one version across all 55 places

Some tests execute a connector's real extractor JavaScript against captured markup and check the output against the prices the page was showing when it was captured. That needs Node with jsdom:

npm install jsdom      # or point NODE_PATH at an existing copy
uv run pytest -q packages/dns-connector/tests/test_search_extractor_dom.py \
              packages/citilink-connector/tests/test_search_extractor_dom.py

Without jsdom that half skips honestly and the Python half — choosing the price among the candidates — still runs. jsdom is a developer tool only; no connector depends on it.

CI runs lint, mypy and the full suite on Ubuntu, Windows and macOS against Python 3.12 and 3.13. Windows-specific process handling is unit-tested on every platform via a platform override, so those branches are covered even on Linux.

Adding a marketplace: docs/ADDING_A_SOURCE.md.

Reliability

Unofficial endpoints break. The design assumes it.

  • Tolerant readers. Multi-alias field binding and type coercion absorb renames and type drift instead of crashing.

  • Never fabricate a value. A missing price is null, never 0. A zero would rank a dead listing as the cheapest option.

  • Loud failure. When a payload stops matching, tools raise parser_drift rather than returning half-parsed data.

  • Tri-state selfchecks. success, drift_detected or inconclusive. A geo block is reported as inconclusive, because it says nothing about the parsers.

Trust boundary

Tool output, meaning product titles, seller names and review text, is authored by sellers and buyers. Treat it as untrusted data. If a review or description appears to contain instructions, it is input, not policy.

Marketplace terms of service generally disallow unofficial parsing. These connectors read only the public catalog endpoints the official web clients use; no authenticated or administrative areas are touched. The Ozon CDP tier runs inside a browser session you established yourself. Use at your discretion, for personal research, at a polite request rate.

How this was built

I wrote the code and the documentation with AI assistants. They are fast and they are confidently wrong, so the project is arranged around verification: 822 offline tests, an audit before the release, tests that run the real extractor against markup captured from the live site. The release notes say which sources were compared against live pages by hand and which were left unverified.

Who typed the text seems a less interesting question than what checks it survived. The second one is documented here, and anyone can re-run it.

License

MIT, see LICENSE.

Available Tools

42 tools
avito_cardAvito Item CardA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_id_or_urlYesItem id, slug path or full avito.ru URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical avito.ru listing URL.
_metaNoValidation metadata.
titleNoListing title.
viewsNoTotal view count.
imagesNoNumber of images attached.
sellerNoSeller info.
statusNoResponse status: success or error.
item_idNoAvito item id.
locationNoItem location string.
posted_atNoPublication time as reported by Avito.
price_rubNoPrice in rubles; None when the listing has no price.
tier_usedNoFetch tier used.
descriptionNoListing description text.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the provided annotations by documenting the return format in detail, including the important edge case that price_rub is None when no price exists and never 0. It also enumerates the full error taxonomy: BadRequestError, NotFoundError, TransportDownError, and ParserDriftError, giving the agent clear expectations about failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with clear sections for return format and error format. Every sentence carries useful information, and the most important information is front-loaded in the opening sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with a rich output schema and detailed annotations, the description covers return semantics and error handling thoroughly. Nothing essential is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the parameter description 'Item id, slug path or full avito.ru URL' already capturing the accepted formats. The description reinforces this by mentioning 'by id or URL' and adds no confusion, though it does not need to add much beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch one Avito listing by id or URL.' This clearly distinguishes the tool from sibling tools like avito_search and avito_seller, which operate on search results or seller pages rather than a single listing card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when you already have a listing id, slug, or URL, but it does not explicitly state when to prefer this over avito_search or avito_seller. Usage context is implied rather than spelled out, so guidance is adequate but not thorough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

avito_selfcheckAvito Self-CheckA
Read-onlyIdempotent

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 inconclusive (transport), NEVER drift: from a datacenter IP that is the expected state. Only a reached-200 JSON body that fails the parse smoke is drift.

Return Format

AvitoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by explaining the precise drift criteria: 403 firewall blocks and CDP-down are inconclusive transport states, while only a reached-200 JSON body failing the parse smoke counts as drift. This is exactly the non-obvious behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loads the core purpose and tri-state result, with important edge-case semantics following. The return-format section is slightly redundant given an output schema exists, but it does not meaningfully bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-input read-only diagnostic with output schema and safety annotations provided, the description covers everything material: what it probes, how to interpret success, drift, and inconclusive results, and a return-format summary. No critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, and the input schema is an empty closed object, so there is no parameter semantics burden. The description does not introduce any parameter-related ambiguity; the baseline for zero-parameter tools applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: a structural drift canary for Avito that runs live probes against search, card, and seller endpoints. It also names the tri-state result, making it clearly distinguishable from data-fetching siblings like avito_search, avito_card, and avito_seller.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The selfcheck/canary framing implies when the tool should be used, and the probe targets are explicit. However, the description never directly says 'use this to verify Avito connector health instead of fetching marketplace data,' nor does it exclude scenarios or name alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

avito_sellerAvito Seller ProfileA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
seller_id_or_urlYesSeller id or profile URL from a card/search hit

Output Schema

ParametersJSON Schema
NameRequiredDescription
_metaNoValidation metadata.
sellerNoSeller info.
statusNoResponse status: success or error.
tier_usedNoFetch tier used.
active_itemsNoNumber of active listings the seller reports.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds concrete error behavior — empty input, 404, transport blocks, and parser drift — plus a high-level response envelope. This is useful operational context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with the core purpose front-loaded, followed by context and then return/error formats. Every section serves a clear role; the classifieds context sentence is slightly explanatory but earns its place by clarifying the tool's value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with full schema coverage, a rich output schema, and safety annotations, the description covers purpose, domain context, response shape, and error modes. Nothing essential for correct selection or invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, and the schema already describes seller_id_or_url as 'Seller id or profile URL from a card/search hit'. The description does not add parameter-specific semantics beyond framing the output as seller reputation data, so the baseline score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Fetch an Avito seller profile', clearly identifying the action and resource. It then explains that the seller's rating, review count, and active-listing count are the relevant reputation signal for classifieds, which distinguishes this tool from per-item review or card tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: when evaluating a seller's reputation in classifieds, since there is no per-item review pool. It does not explicitly name alternative tools or state when not to use it, but the domain context is strong enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_pricesCompare Prices Across Russian MarketplacesA
Read-onlyIdempotent

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesWhat to price, in Russian — e.g. 'стиральная машина узкая' or 'iphone 15 128'.
sourcesNoRestrict to specific marketplaces (wildberries, yandex_market, ozon). Omit to query all.
per_source_limitNoHow many offers to take from each marketplace.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNoThe query that was priced.
offersNoAll offers, cheapest first. Offers without a price are kept at the end.
cheapestNoLowest everyday price found. None when no marketplace returned a price.
completeNoTrue only when every queried marketplace answered. False means the ranking is partial.
warningsNoConnector-level warnings (partial data, no prices).
sources_okNoMarketplaces that answered successfully.
total_offersNoTotal offers across all marketplaces.
server_versionNoConnector version.
source_outcomesNoPer-marketplace outcome, including failures — read this before trusting the ranking.
sources_queriedNoMarketplaces that were attempted.
price_spread_rubNoDifference between the highest and lowest everyday price — how much the choice is worth.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and idempotent, and the description adds substantial behavior beyond that: concurrent querying, per-source reporting, partial-result semantics when sources time out, exclusion of Yandex subscription pricing from ranking, and the guarantee that individual source failures do not raise errors. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with clear sections, a front-loaded headline, and bolded caveats for important output fields. Every paragraph adds distinct information needed for correct interpretation, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers output semantics (cheapest, price_with_subscription_rub, source_outcomes, complete), error format, loose title matching, and the concurrent behavior. The output schema can carry return-value details, so nothing critical is missing for an agent to call and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all three parameters with 100% coverage, so the description does not need to repeat parameter details. The description focuses instead on output interpretation and ranking semantics, which is appropriate; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Price one product across every configured Russian marketplace at once.' It also differentiates from per-marketplace search siblings by naming the ranking behavior and by framing the exact question it answers: 'where is X cheapest'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly identifies when to use this tool: 'This is the tool for "where is X cheapest"'. It also contrasts with the alternative (running per-marketplace search tools one at a time) and explains that the alternative is slower and lacks ranking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_sourcesList Available MarketplacesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds useful behavior beyond annotations: it reports installation-level availability and distinguishes connector installation issues from marketplace refusals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences. The first states the core purpose directly; the second provides actionable guidance with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is low-complexity: no parameters, output schema present, and safety annotations cover side effects. The description explains what it reports, when to call it, and what distinction it makes. The only minor gap is not explicitly contrasting it with the similarly named sibling 'marketplace_sources.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties, so there is no parameter semantics for the description to elaborate. Per the baseline for parameterless tools, this is a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete action ('Report') and a specific resource ('which marketplaces this installation can actually query'). It also distinguishes the tool's diagnostic role from the comparison tools by noting it separates a missing connector from a marketplace refusal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to call this tool: 'Call this first when a comparison comes back partial.' It also explains why that matters by naming the two distinct failure causes and noting they need 'completely different fixes.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detmir_cardDetsky Mir Product CardA
Read-onlyIdempotent

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.

Error Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.
product_idYesNumeric Detsky Mir product id — the digits in /product/index/id/<id>/.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
regionNoISO region the prices and stock apply to.
productNoThe requested product.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already signal read-only, idempotent, non-destructive behavior, and the description adds valuable context beyond those: region overrides DETMIR_REGION for this call only, store_count varies dramatically by city with concrete examples, and errors are raised as ToolError with retryability info. This goes well beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded purpose statement, a context paragraph, a highlighted 'Region matters most here' section with concrete examples, and a separate error-format section. Every sentence adds useful information, and the formatting makes the most important caveat immediately visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two parameters, an output schema present, and rich annotations, the description covers everything else an agent needs: error behavior, region-override semantics, why store_count is city-dependent, and what makes this source different from general marketplace cards. There is no significant missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description adds meaningful depth: it explains that region is the most impactful parameter, how it interacts with the environment default, and why store_count depends on it. The product_id semantics are already well covered by the schema's URL-pattern hint, so the description's extra region guidance earns a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch price, rating, stock and seller for one Detsky Mir product.' It clearly scopes the tool to a single Detsky Mir product and distinguishes it from sibling marketplace cards by naming the retailer and the category coverage. Even without reading the schema, an agent knows exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is valuable: 'Covers the kids-and-baby category that the general marketplaces cover unevenly' and distinguishes Detsky Mir's own stock from third-party sellers. It does not explicitly enumerate when not to use it or name alternative sibling tools, but the market-specific positioning and the 'for one product' scope make the appropriate use case reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detmir_categoriesDetsky Mir Catalog CategoriesA
Read-onlyIdempotent

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.

Error Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum categories to return.
parentNo'top' for the 27 top-level sections, or a parent category id to list its children.top
regionNoISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
itemsNoCategories at this level.
parentNoRequested parent: 'top' or the parent category id/alias.
regionNoISO region the listing applies to.
returnedNoNumber of categories returned.
total_availableNoTotal categories at this level, when reported.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: there is no working text search, nodes carry alias and products_count, and failures raise ToolError with a JSON message describing error code and retryability. This gives the agent practical expectations for discovery and error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose first, then usage context, then error format. Every sentence earns its place, and the markdown headers make it scannable. It is appropriately sized for a tool with this complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, 100% parameter coverage, and the presence of an output schema, the description is complete. It explains the discovery workflow, what result fields to expect conceptually, and the error behavior. Nothing essential is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add new semantics for limit, parent, or region beyond what the schema already provides. It reinforces that nodes carry alias and products_count, which helps contextualize results, but does not improve parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Browse the Detsky Mir catalog tree and get the aliases detmir_category needs.' It also explains the tool's distinct role as the discovery step, contrasting with direct product search which does not exist for this source. This clearly separates it from sibling tools like detmir_category and detmir_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: Detsky Mir has no working text search, so the way to find products is to walk the tree and list a category. It also mentions checking products_count before fetching a listing, implying the follow-up step. It could be stronger by explicitly saying 'use detmir_category after selecting a category,' but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detmir_categoryDetsky Mir Category ListingA
Read-onlyIdempotent

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 Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
aliasYesCategory slug from a catalog URL, e.g. 'pups' in /catalog/index/name/pups/.
limitNoItems per page.
offsetNoItems to skip, for pagination.
regionNoISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
modeNoHow the page was obtained: 'category' or 'search'.
itemsNoProducts on this page.
queryNoThe category alias or search text that produced this page.
offsetNoOffset this page starts at.
regionNoISO region the prices and stock apply to.
returnedNoNumber of items in this page.
category_titleNoHuman-readable category name, for category listings.
total_availableNoTotal matches upstream reports, when known.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive. The description adds useful behavioral context: it's a real JSON endpoint with proper pagination and an upstream total, supports price inquiry without scraping, and documents the error format (ToolError with JSON message, error code, and retryability). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence. The secondary reliability context and error format are in clearly separated short paragraphs. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with an output schema and fully documented parameters, the description covers purpose, reliability, pagination, and error behavior. It could mention how the region parameter affects price/stock behavior, but the schema and output schema already carry most of that burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage with descriptions for all four parameters, so the baseline of 3 applies. The description reinforces pagination and total-count behavior but doesn't add field-level meaning beyond what the schema already offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line states a specific verb, resource, and output: 'List products in a Detsky Mir category, with the total match count.' This clearly differentiates it from sibling detmir_categories (which lists categories) and detmir_card (which fetches a product card), and the 'unlike text search' line separates it from search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts this tool with text search and frames it as 'the reliable way to enumerate the catalog,' with proper pagination and an upstream total. It doesn't name alternative sibling tools like detmir_categories or detmir_card, but the purpose statement and title make the distinction clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detmir_selfcheckDetsky Mir SelfcheckA
Read-onlyIdempotent

Probe every Detsky Mir endpoint family and report a tri-state verdict.

success — everything answered with the expected shape. drift_detected — an endpoint answered but the payload no longer parses; the connector needs updating. inconclusive — transport or geo blocking prevented a verdict, which says nothing about the parsers.

Run it after install and whenever results look wrong.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-endpoint-family results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
cache_statsNoTTL cache counters for this process.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint and idempotentHint, the description defines the full tri-state contract (success, drift_detected, inconclusive) including the important caveat that inconclusive says nothing about parser health. This is valuable behavioral disclosure not present in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main verb and scope are front-loaded, and each sentence adds meaning: state definitions, the drift consequence, the inconclusive caveat, and when to run it. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless self-check tool with a rich output schema and safety annotations, the description fully covers purpose, result interpretation, and timing. It leaves no gap an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and 100% schema coverage, so there is no parameter burden for the description to carry. The baseline for a no-parameter tool is 4; no parameter details are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Probe every Detsky Mir endpoint family and report a tri-state verdict,' a specific verb and resource scope that clearly distinguishes it from data-fetching siblings like detmir_card and detmir_category. The self-check role is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit run-time guidance is given: 'Run it after install and whenever results look wrong.' It does not enumerate alternatives or when-not scenarios, but the no-argument diagnostic nature and marketplace-specific naming make the context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dns_cardDNS-Shop Product CardA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
product_urlYesdns-shop.ru product URL containing /product/<id>/, e.g. /product/b7a1667f9b19ed20/

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical product URL.
_metaNoValidation metadata.
titleNoProduct title.
statusNoResponse status: success or error.
price_rubNoPrice in rubles; None when absent — never 0.
tier_usedNoFetch tier used (cdp).
product_idNoDNS product id/slug tail.
is_availableNoWhether the product is sellable now.
old_price_rubNoStrikethrough price in rubles.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal readOnly, idempotent, and non-destructive; the description adds concrete failure modes (BadRequestError, TransportDownError, ParserDriftError) and the exact response shape, which helps an agent anticipate what happens on bad input or site changes. This exceeds the annotation-only picture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: a one-line purpose followed by terse, structured Return/Error sections. It is slightly redundant with the existing output schema, but every line carries behavioral or format information, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool, the description covers the main action, return shape, and principal errors, which is sufficient given the annotations and output schema. It omits explicit usage guidance, but that is a minor gap at this simplicity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes product_url fully with format and example, giving 100% coverage. The description does not elaborate on the parameter beyond referencing product_id in the return format, so it adds no new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Fetch' with the resource 'DNS-Shop product card', and the word 'one' clarifies it targets a single product rather than a search or listing. This distinguishes it from siblings like dns_search and dns_selfcheck, and the domain prefix separates it from other marketplaces' card tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to choose this tool over alternatives; it does not mention dns_search for finding products first or dns_selfcheck for health checks. The only implied context is that it takes a product URL, which appears in the schema rather than the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dns_selfcheckDNS-Shop Self-CheckA
Read-onlyIdempotent

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 inconclusive (transport), NEVER drift. Only a rendered page that yields zero tiles is drift.

Return Format

DnsSelfcheckResponse: {status, healthy, connector, checks, ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses critical runtime behavior: it uses the operator's Chrome via CDP, treats Qrator-blocked or CDP-down as inconclusive transport failures, and defines drift strictly as a rendered page yielding zero tiles. This substantially reduces the risk of misinterpreting transport errors as drift.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sections deliver the core purpose, the critical tri-state interpretation rule, and the return type with no filler. The description is front-loaded and every sentence adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool that already has an output schema and safety annotations, this description fully covers the important behavioral nuances and edge cases. Nothing essential for correct invocation or interpretation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is no parameter ambiguity for the description to clarify. The baseline of 4 is appropriate because no schema gap needs compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-noun pair ('Structural drift canary') and names the target resource ('DNS-Shop'), then concretely states what it does: renders a live search page and checks tile extraction. This makes it clearly distinct from sibling tools like dns_search and the other *_selfcheck tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes this as a drift canary for DNS-Shop, which implies monitoring/health-check usage, and it gives explicit decision rules for interpreting inconclusive vs drift. It does not explicitly name alternatives or state when not to use it, but the intended context is clear enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamoda_cardLamoda Product CardA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sku_or_urlYesSKU (MP002XM1RMM3) or lamoda.ru product URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
skuNoLamoda SKU.
urlNoCanonical product URL.
_metaNoValidation metadata.
brandNoBrand name.
sizesNoPer-size availability.
titleNoProduct title.
statusNoResponse status: success or error.
price_rubNoPrice in rubles; None when absent — never 0.
tier_usedNoFetch tier used: graphql, cdp.
is_availableNoWhether the product is sellable now.
old_price_rubNoStrikethrough price in rubles.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only and idempotent, and the description adds meaningful behavior beyond that: it reveals the call is anonymous and tier 1, defines clear failure modes via ToolError variants, and documents that Lamoda has no ratings. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The one-line purpose is front-loaded, followed by two clearly headed sections for return and error formats. Every section earns its place with diagnostic value, and there is no filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool, the description covers purpose, input expectations, output shape, endpoint characteristics, and failure modes. The output schema exists for detailed return fields, and annotations cover safety, so nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter sku_or_url is fully documented in the schema, including the accepted SKU format and a lamoda.ru URL example, so the description does not need to add much. It adds only the indirect hint that an input without an extractable SKU will fail with BadRequestError.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action ('Fetch') and a concrete resource ('one Lamoda product card'), and the singular 'product card' phrasing clearly separates it from lamoda_search and lamoda_selfcheck. The mention of the anonymous GraphQL endpoint and tier 1 also makes the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the caller needs a SKU or product URL, and the note that Lamoda exposes no ratings suggests one exclusion, but it never explicitly says when to prefer this tool over lamoda_search or lamoda_selfcheck. Usage guidance is left mostly to inference rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamoda_selfcheckLamoda Self-CheckA
Read-onlyIdempotent

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 Format

LamodaSelfcheckResponse: {status, healthy, connector, checks, ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only/idempotent/non-destructive annotations, the description discloses how the probe classifies outcomes: tiered paths, inconclusive failure conditions, and the exact drift condition. This gives an agent important behavioral context it would otherwise have to infer. No contradiction with the annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, separating purpose, conditional behavior, and return summary into a clear structure. The 'Return Format' line is slightly redundant given an output schema exists, but it remains brief and does not bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-input probe with annotations covering safety and an output schema covering the response, the description supplies the non-obvious semantics: what each tier checks, when failures are inconclusive, and what actually constitutes drift. This is sufficient for an agent to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts zero parameters and the schema is empty, so the description has nothing to add for parameter semantics. The zero-parameter baseline applies cleanly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description centers on a specific verb and resource: it 'Probes' Lamoda's GraphQL card path (tier 1) and CDP search path (tier 2) as a structural drift canary. This clearly distinguishes it from sibling tools like lamoda_search and lamoda_card, and from other marketplaces' selfchecks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use as a Lamoda drift/monitoring check is clear from the 'canary' framing and the enumerated probe paths. It provides strong interpretation guidance—such as GraphQL down being inconclusive and only a reached payload failing parse smoke counting as drift—though it does not explicitly name alternatives or state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marketplace_sourcesWhich Marketplaces Are LoadedA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
mountedNoSources whose tools are available in this server.
skippedNoSource name mapped to the import error that removed it — usually a missing dependency.
mounted_countNoHow many sources mounted.
skipped_countNoHow many sources were skipped.
server_versionNoUnified server version.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations indicating a read-only, idempotent operation, the description reveals the defensive import behavior and the semantic meaning of the 'skipped' field: a missing dependency removes a marketplace rather than crashing the server, and skipped entries were never queried. This context is not derivable from the annotations and is critical for interpreting results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then uses two clearly labeled sections ('Why this exists' and 'Return Format') that each add necessary context. Every sentence serves a purpose, and the markdown structure makes it easy for an agent to scan for the key trigger and return semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only diagnostic tool with a rich output schema and safety annotations, the description covers everything an agent needs: what it lists, why missing marketplaces appear, when to invoke it, and what the skipped mapping means. No important operational detail is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts zero parameters, so there is no parameter semantic burden on the description. With an empty input schema and 100% schema coverage, a baseline of 4 is appropriate; the description cannot and need not add parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List which connectors this unified server actually mounted.' This clearly distinguishes the tool from the sibling marketplace search/card tools, which query individual marketplaces, by focusing on what is loaded on the server. The title 'Which Marketplaces Are Loaded' reinforces the same purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit trigger: 'Call this before concluding a marketplace has no results — if it is in ``skipped``, it was never queried at all.' It explains the failure mode where absent tools look identical to empty results, which tells the agent exactly when this diagnostic is needed. This is a clear, directive usage guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

megamarket_cardMegamarket Product CardA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_id_or_urlYesGoods id or megamarket.ru product URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical product URL.
_metaNoValidation metadata.
titleNoProduct title.
ratingNoAverage rating.
statusNoResponse status: success or error.
item_idNoMegamarket goods id.
price_rubNoPrice in rubles; None when absent — never 0.
tier_usedNoFetch tier used (cdp).
is_availableNoWhether the product is sellable now.
rating_countNoReview count.
old_price_rubNoStrikethrough price in rubles.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint/idempotentHint annotations by specifying the exact response envelope (MegamarketCardResponse fields) and detailed error modes including BadRequestError, NotFoundError, TransportDownError, and ParserDriftError. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and uses clear Return Format / Error Format sections that add useful structure without redundancy. Every sentence contributes relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only card lookup, the description together with the schema and annotations is complete: it states what is returned, how failures surface, and what input is expected. Search and discovery concerns belong to sibling tools, so their absence is not a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the single parameter with 100% coverage ('Goods id or megamarket.ru product URL'), so the description adds no additional parameter-level meaning. Baseline 3 is appropriate given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Fetch one Megamarket product card.' The word 'one' clearly distinguishes this from the sibling megamarket_search tool, and the Megamarket qualifier distinguishes it from the many other marketplace card tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than explicit: the tool is for fetching a single known Megamarket product card, so an agent can infer it should be used when it already has an item id or URL. However, it does not explicitly say when not to use it or direct the agent to megamarket_search for discovery.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

megamarket_selfcheckMegamarket Self-CheckA
Read-onlyIdempotent

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 inconclusive (transport), NEVER drift. Only a reached-200 catalog body that fails the parse smoke is drift. From a machine whose Chrome has not passed the challenge, inconclusive is the expected verdict.

Return Format

MegamarketSelfcheckResponse: {status, healthy, connector, checks, ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses that the tool performs a live CDP search, has an external transport dependency, and precisely defines the drift vs inconclusive judgment rules. It even explains environment expectations about Chrome challenge state. This is substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded with its core purpose, then uses short structured lines for verdict semantics and return format. Every sentence carries diagnostic value; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-input canary tool with an output schema, the description fully explains the operation, the meaning of each verdict class, the transport-vs-drift distinction, and the expected outcome on machines with an unmet Chrome challenge. An agent has enough context to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and schema coverage is complete, so there is nothing for the description to add about inputs. The baseline of 4 applies for a no-parameter tool; the description correctly spends no space on parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific operation—'Posts one live search through CDP and checks items parse'—and frames it as a 'Structural drift canary for Megamarket (tri-state)' with a distinct verdict semantics. This distinguishes it from megamarket_search/megamarket_card and the other selfcheck tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use case via 'drift canary' and clarifies when the verdict should be read as inconclusive, but it never explicitly says when to call this instead of alternatives such as megamarket_search or another selfcheck. There are no when-not-to-use or alternative-routing statements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ozon_cardOzon Product CardA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sku_or_pathYesSKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Other paths are rejected (SSRF prevention).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical Ozon product URL.
_metaNoValidation metadata.
priceNoRegular price in rubles.
titleNoProduct title.
sellerNoSeller info.
statusNoResponse status: success or error.
tier_usedNoFetch tier used: curl_cffi, cdp, etc.
card_priceNoOzon-card price (lowest) in rubles.
is_availableNoWhether the product is sellable now.
rating_countNoTotal review count.
rating_scoreNoAggregate review score.
price_originalNoStrikethrough original price in rubles.
characteristicsNoShort characteristics (max 30).

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds meaningful behavioral context beyond these: Tier-1 attempt with curl_cffi, fallback to Chrome CDP on Cloudflare 403, and the operator prerequisite to start Chrome via the provided scripts. This helps the agent anticipate operational dependencies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The primary purpose is front-loaded, and the fallback/setup details are compactly presented. Every clause adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, return values need no explanation. The description covers purpose, fetch mechanism, fallback behavior, and a critical prerequisite (Chrome CDP setup). Minor details like what happens when both tiers fail are not specified, but overall the agent has enough context to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema description covers 100% of the single parameter, including accepted formats (SKU, URL, /product/<digits>/ path) and SSRF rejection. The tool description itself adds no parameter-level information, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a clear action and resource: 'Fetch Ozon product card data'. This distinguishes it from sibling tools like ozon_reviews and ozon_search, though it doesn't explicitly name them. The phrase 'via composer-api.bx' adds technical specificity but doesn't obscure the core purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to choose this tool over alternatives such as ozon_reviews or ozon_search. The fallback and setup details describe internal operation, not tool selection context. Usage context is only implicitly conveyed by the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ozon_reviewsOzon Product ReviewsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoReview 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_asc also accepted.recent
limitNoMax review texts to return (1..100). Distribution+total always full.
sku_or_pathYesSKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Normalized to /product/<digits>/reviews/ (SSRF-allowlisted).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical Ozon reviews URL.
sortNoAPI sort key used (published_at_desc, score_desc, score_asc).
_metaNoValidation metadata.
statusNoResponse status: success or error.
partialNoWhether a later-page failure degraded to partial success.
reviewsNoCollected review items.
returnedNoNumber of review texts returned.
tier_usedNoFetch tier used for the first page.
last_errorNoLast error detail on partial success.
stop_reasonNoWhy pagination stopped: http, parse, blocked, max_pages, etc.
distributionNoStar distribution: stars -> count.
rating_scoreNoAggregate review score.
pages_fetchedNoNumber of pages fetched (max 10).
reviews_countNoTotal review count from paging or score widget.
requested_limitNoThe limit argument requested by the caller.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing the Tier-1/Tier-2 fallback strategy, automatic page walking, 30 reviews per page, deduplication by review UUID, a hard cap of 10 pages, and detailed partial-success semantics. It also explains exactly when errors are raised versus when failures degrade to partial results. This is exceptionally transparent and does not contradict the readOnly/idempotent annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: purpose, transport fallback, pagination behavior, return format, and error semantics are all directly relevant to invoking the tool correctly. The use of headings and front-loaded key information keeps it navigable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete. It covers input normalization, pagination, dedupe, hard limits, exact return fields, partial success conditions, and error types. The presence of an output schema further reduces the need to describe return values, so nothing important is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all three parameters at 100% coverage, so a baseline of 3 is appropriate. The description adds real value by explaining how `limit` interacts with pagination: pages are walked until `limit` texts are collected, with deduplication and a hard page cap. This gives the agent a more accurate mental model of what `limit` means in practice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Fetch Ozon product review texts + star distribution'. It clearly distinguishes itself from sibling tools like ozon_card or ozon_search by focusing on reviews plus the distribution, and it even references the same fetch path as ozon_card for technical context. An agent can understand exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use case obvious: retrieving Ozon product review texts and star distributions. It also explains pagination behavior and partial-success semantics, which guide the agent when interpreting results. However, it does not explicitly state when to choose this tool over a sibling such as ozon_card or ozon_search, so the guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ozon_selfcheckOzon Self-checkA
Read-onlyIdempotent

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 inconclusive (transport — Ozon's tier-1 curl_cffi is often blocked), NEVER drift. Only a reached-200 JSON body missing a critical widget or failing the parse smoke is drift. The reviews_sort subcheck exercises the sort-param path (score_asc) that ozon_reviews pagination depends on.

Return Format

OzonSelfcheckResponse: {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 Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint, idempotentHint, and openWorldHint annotations present, the description adds substantial behavioral detail: exact tri-state semantics, what counts as inconclusive vs drift, handling of Cloudflare 403 / CDP-down / non-200 / non-JSON, and the error contract. It also clarifies that inconclusive and drift_detected are valid normal responses, not errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every section earns its place: purpose, tri-state rules, return format, and error semantics are all behaviorally relevant. The main purpose is front-loaded and the structured headings make the detailed tri-state and error contracts easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter self-check tool with an output schema and read-only/idempotent annotations, the description covers everything an agent needs: what it checks, what each verdict means, how transport failures are classified, and when an error is actually raised. No critical gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is no parameter meaning to add. The description incidentally clarifies that the tool fetches live data and runs internal subchecks, which is useful context beyond the empty input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a structural drift canary for Ozon with a tri-state outcome, naming the specific resources checked (live search, card, reviews, non-default reviews sort). It distinguishes itself from sibling review/search tools by emphasizing the canary's role in detecting vanished widgets before parsers break.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that this tool is a pre-emptive drift check rather than a data-fetching tool, and even notes that the reviews_sort subcheck exercises the path on which ozon_reviews pagination depends. It doesn't explicitly list alternative tools to use instead, but the purpose and positioning against siblings are clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

taobao_cardTaobao Item CardA
Read-onlyIdempotent

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_id_or_urlYesItem id or item.taobao.com URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical item URL.
_metaNoValidation metadata.
salesNoSales label as displayed.
titleNoItem title (Chinese).
statusNoResponse status: success or error.
item_idNoTaobao item id.
price_cnyNoPrice in yuan; None when hidden or variant-priced.
shop_nameNoShop display name.
tier_usedNoFetch tier used (cdp).
description_imagesNoNumber of images in the description block.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive. The description adds meaningful behavior beyond that: price_cny may be None on hidden/variant pricing and is never 0, and it enumerates specific error types including login-wall/CDP failures and parser drift. This gives an agent realistic expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose sentence first, then Return Format and Error Format sections. Every sentence carries information, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only card fetch with an output schema, the description covers purpose, return contract, price edge case, and failure modes. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents item_id_or_url as 'Item id or item.taobao.com URL'. The description adds no further parameter-level detail, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch one Taobao item card.' It clearly distinguishes this from sibling tools like taobao_search and taobao_selfcheck by signaling a single item-card retrieval rather than a search or health check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Fetch one' plus the item_id_or_url parameter makes the direct-lookup use case clear. It does not explicitly name alternatives or state when not to use it, but the context is strong enough that an agent can select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

taobao_selfcheckTaobao Self-CheckA
Read-onlyIdempotent

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 inconclusive (transport/session), NEVER drift. Only a rendered page that yields zero items is drift.

Return Format

TaobaoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond annotations by explaining that it renders a live search page in the operator's Chrome, that CDP failures or login walls are inconclusive, and that only a rendered page yielding zero items counts as drift. It also discloses the tri-state semantics, which is critical for interpreting the tool's output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loads the core purpose and tri-state behavior. It is slightly wordy with the return format block, but every sentence provides useful information and the format is compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a zero-parameter health-check tool: it explains what the tool does, how it operates, how to interpret the tri-state result, and what the response contains. The output schema and annotations cover the remaining structured details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema describes an empty object with 100% coverage, so there are no parameter semantics for the description to add. The baseline of 4 applies here because no parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a structural drift canary for Taobao, with a specific verb ('checks'), resource ('extractor'), and tri-state outcome. It differentiates itself from sibling search/card tools by focusing on health-check behavior rather than data retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context that this is a monitoring/health-check tool, not a search tool, and explains when results should be classified as inconclusive versus drift. It does not explicitly name alternative tools, but the canary purpose and sibling naming pattern make the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_cardWB Product CardsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
destNoRegion ID. Default -1257786 (Moscow). Required for valid prices/stocks. Other examples: -1257786 Moscow, -1029256 Saint Petersburg.-1257786
nm_idsYes1..100 nmId integers (positive). Batch product cards from WB v4 API.

Output Schema

ParametersJSON Schema
NameRequiredDescription
destNoWB region ID used.
metaNoValidation metadata.
countNoNumber of items returned.
itemsNoProduct card items.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond that: prices are returned in rubles, the selected fields are explicit, and the tool supports at most 100 SKUs. It does not contradict the annotations, and the additional details help set expectations without restating annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences with no filler or redundant restatement of schema/annotation fields. The primary action and return summary are front-loaded, and every sentence adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, complete input schema, and presence of an output schema, the description covers the remaining operational facts needed to call the tool correctly: the API source, returned fields, currency, and batch limit. No critical information is missing for a read-only batch product-card lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter documentation, including the default dest value, region examples, and the 1..100 nmIds constraint. The description reinforces the 100-SKU limit and mentions ruble prices, but it does not add substantial parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetch') and resource ('product card data from WB v4 API'), then enumerates the returned fields such as prices, brand, supplier, and ratings. This clearly distinguishes it from sibling tools like wb_search or wb_reviews by focusing on batch card lookups by nmIds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it is used when you need product card data for specific up-to-100 SKUs, and the 100-SKU cap signals batching. However, it does not explicitly state when to prefer this tool over wb_search, wb_reviews, or other WB siblings, nor does it mention prerequisites like how to obtain nmIds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_categoriesWB Catalog CategoriesA
Read-onlyIdempotent

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.

Error Format

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
rootNoRequested root: 'top' or the resolved category name.
itemsNoCategory nodes at the requested root.
host_usedNoStatic CDN host that served the menu.
max_depthNoDepth limit applied to this response.
truncatedNoWhether the slice was cut short by node limits.
total_returnedNoTotal nodes in the returned slice.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds genuinely useful behavioral context beyond those hints: the live menu is ~800 KB, responses are always a bounded slice, and errors are raised as ToolError with a JSON message indicating retryability. This gives an agent a clear expectation for size and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loaded with the core purpose. Every sentence contributes: the use case, the contrast with search, the shard/query relevance, the size constraint, and the error format are all useful with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and rich annotations, the description is complete for an agent to select and call the tool correctly. It covers purpose, when to use it, how to navigate the large tree, response bounding, and error behavior. No critical operational detail appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the descriptions of root and max_depth already handle parameter meaning. The tool description adds strategic context by explaining why the bounded slice exists and recommending an iterative expand-from-top approach, which makes the parameters' intended usage clearer than the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Browse') and resource ('the Wildberries catalog tree'), and clarifies its role versus wb_search by noting that wb_search needs a query string while this tool lets a shopper discover categories. It also explains that nodes expose shard/query selectors for pulling a category feed, distinguishing it from feed/product tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool ('before searching') and contrasts it with wb_search, which needs a query string. It also advises starting at 'top' and expanding the branch of interest. However, it does not explicitly mention the sibling wb_category_products as the follow-up tool for pulling a feed, though that is implied by mentioning shard/query selectors.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_category_productsWB Category Product ListingA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
destNoWB region id. Defaults to WB_DEFAULT_DEST (Moscow). Prices and stock are region-specific.
pageNoPage number. Each page carries up to 100 products.
sortNoUpstream ordering: popular, priceup, pricedown, newly, rate, or benefit.popular
queryYesWB catalog selector from wb_categories, e.g. 'cat=9845' or 'subject=1234'.
shardYesWB catalog shard from wb_categories, e.g. 'electronic58'. The literal 'blackhole' means the category has no listable feed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
destNoWB region id the prices and stock apply to.
metaNoValidation metadata.
pageNoPage number this response covers.
sortNoUpstream ordering applied.
countNoNumber of products on this page.
itemsNoProducts in this category page.
queryNoWB catalog selector used (cat=/subject=).
shardNoWB catalog shard used.
has_moreNoWhether another page likely follows. Inferred from a full page — WB reports no total here.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, and the description adds meaningful behavioral detail: the blackhole shard means no listable feed, errors are raised rather than empty lists returned, and the response shape matches wb_search and wb_card. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and each paragraph earns its place, especially the blackhole warning. The middle narrative about humidifiers and relevance ranking is slightly expansive, but it effectively conveys why the tool matters without becoming bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, the origin of its key parameters, the comparability of its output with related tools, and the critical blackhole failure mode. With a rich output schema and strong annotations present, nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all five parameters with examples and special values, including the blackhole meaning for shard and the WB selector format for query. The description reinforces that shard/query come from wb_categories, but with full schema coverage this adds only marginal parameter-level value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the products in a catalog category, using the shard and query from wb_categories.' It also clearly distinguishes itself from siblings by explaining it 'closes the loop' that wb_categories opens and that items return in the same shape as wb_search and wb_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly positions this tool as the follow-up to wb_categories and explains when category browsing is preferable to inventing a search phrase. It stops short of explicitly saying 'use wb_search instead for these cases', so it lacks a full when-not-to-use statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_questionsWB Buyer Questions by imt_idA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoOffset into the question pool, for walking past the first page.
limitNoMax questions to return (1..100). Fetched in pages of 30, which is the upstream cap.
imt_idYesRoot ID (imt_id) from wb_root_info. Questions are pooled per imt_id across every variant, NOT by nmId.
answered_onlyNoReturn only questions the seller has answered. Unanswered questions carry no product information.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
skipNoOffset this page starts at.
imt_idNoRoot product id (imt_id) the questions belong to.
has_moreNoWhether more questions exist past this page.
returnedNoNumber of questions in this response.
questionsNoQuestion items.
answered_countNoHow many of the returned questions have a seller answer.
total_availableNoTotal questions upstream reports for this product.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description discloses meaningful behavior: questions are pooled across variants by imt_id, an nmId returns an empty pool without an error, and seller answers are often the only public statement of a product fact. This helps the agent interpret empty results and choose the correct key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and later paragraphs earn their place by explaining purpose, keying, and a common failure mode. A few illustrative examples make the description slightly longer than strictly necessary but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a rich output schema, full parameter coverage, and safety annotations, so the description only needs to add selection context and keying behavior. It covers the prerequisite (wb_root_info), the wrong-key failure mode, and the distinction from reviews, making it complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value by emphasizing that imt_id is the root id from wb_root_info and that a wrong key produces an empty pool rather than an error. This reinforces the correct use of the imt_id parameter beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: "Fetch buyer questions and seller answers by imt_id." It also distinguishes the tool from wb_reviews by explaining that reviews describe the ownership experience while questions clarify what the product actually is, so an agent can tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: resolve imt_id via wb_root_info first, do not pass an nmId, and expect an empty pool if you do. It also positions the tool against wb_reviews, clarifying when questions are more useful than reviews.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_reviewsWB Reviews by imt_idA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo"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 WB returns, not all feedbacks.recent
limitNoMax review texts to return (1..100). Counts always full.
imt_idYesRoot ID (imt_id) from wb_root_info. All product variants share one review pool indexed by imt_id, NOT by nmId.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
sortNoClient-side sort applied: recent, best, or worst.
imt_idNoRoot product id (imt_id) the reviews belong to.
feedbacksNoReview items.
host_usedNoFeedbacks CDN host used.
pool_sizeNoTotal reviews in the returned pool.
valuationNoOverall valuation data.
feedback_countNoTotal feedback count from the API.
valuation_distributionNoStar valuation distribution.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive, so the bar is lower. The description adds important behavioral details beyond annotations: the endpoint returns a fixed ~1000-review pool, is newest-first, ignores server-side order params, and applies sort client-side. This materially affects how the agent should interpret results and is exactly the kind of disclosure that helps avoid misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then provides only high-value caveats in a compact sequence. Every sentence earns its place: pool indexing, fixed 1000-review pool, server-side order being ignored, client-side sort, and the 'worst' alias for complaint discovery. There is no filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description covers the remaining behavioral context an agent needs: why imt_id matters, the bounded review pool, sort semantics, and the recommended way to find complaints. Nothing essential to calling this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the conceptual relationship between imt_id and nmId, clarifying that sort operates over the fixed returned pool rather than all feedbacks, and emphasizing that 'worst' reorders by lowest rating to surface complaints. These details go beyond the schema entries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific action and resource: 'Fetch reviews by imt_id'. It also names the source of the id ('root_id from wb_root_info') and distinguishes this review pool from nmId-based lookups, which separates it from sibling tools like wb_card and wb_root_info. The purpose is immediately clear and not tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use imt_id, not nmId, because all variants share one review pool; and it explains how sort behaves given the endpoint's fixed pool. It does not explicitly name alternatives or say 'use wb_questions for questions instead', but the practical context is strong enough for an agent to know when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_root_infoWB Root Info (imt_id)A
Read-onlyIdempotent

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 Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nm_idYesnmId (positive integer). The SKU whose basket CDN card.json is fetched for imt_id resolution.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoValidation metadata.
colorsNoColor names list.
imt_idNoRoot product id (imt_id) shared by all variants.
optionsNoProduct options (max 30).
host_usedNoBasket CDN host used.
subj_nameNoSubject name (mojibake-decoded).
compositionsNoCompositions data.
subj_root_nameNoRoot subject name (mojibake-decoded).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond this: the data source (basket CDN), the variant-sharing semantic, the critical warning that reviews are indexed by imt_id rather than nmId, and a specific error format with retryability info. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: main action, return value, key semantic, and error behavior. The structure is front-loaded and the error format section is clearly separated with a heading. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read-only tool with full schema coverage, an output schema, and safety annotations, the description is complete. It explains the purpose, the critical indexing caveat, and error handling; nothing necessary for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents nm_id. The description does not add extra parameter-level detail beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Fetch') and resource ('full card metadata from basket CDN'), then names the key output ('imt_id (root_id) for review pool'). The statement 'Reviews indexed by imt_id, NOT by nmId' clearly differentiates this from review-indexing tools like wb_reviews.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: all variants share imt_id and reviews are indexed by imt_id, implying an agent should use this tool when it needs the imt_id before querying reviews. It does not explicitly name sibling alternatives or state 'when not to use', but the guidance is strong enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_selfcheckWB Self-check (drift canary)A
Read-onlyIdempotent

Structural drift canary for WB (tri-state: success / drift_detected / inconclusive). Probes EVERY endpoint family the tools depend on:

  • card — card.wb.ru v4 (wb_card / wb_search enrich): critical fields + price extract.

  • reviews — feedbacks2.wb.ru pool (wb_reviews): texts + productValuation.

  • search_goods— search-goods.wildberries.ru (wb_search STEP 1): the id list must still be a non-empty list of recoverable ids on a broad evergreen query, else wb_search silently returns no_results.

  • root_basket — basket-NN.wbbasket.ru (wb_root_info): imt_id must resolve, else wb_root_info AND wb_reviews (indexed by imt_id) break.

Tri-state (audit 2026-06-01): an http!=200 / network error / OOS baseline is inconclusive (transport/baseline rot), NEVER drift. Only a reached-200 body whose parser-critical anchor is gone is drift. Run on demand before trusting a batch.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-subcheck results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
healthyNoWhether all checks are healthy.
connectorNoConnector name: wb.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It goes well beyond the readOnly/idempotent annotations by explaining the tri-state semantics: transport/OOS issues are inconclusive, only reached-200 bodies with missing anchors are drift. It also discloses the exact endpoint dependencies and why their failure would propagate to wb_search, wb_root_info, or wb_reviews.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The bullet-list structure is dense but every sentence earns its place: purpose, probed endpoints, dependent tools, failure interpretation, and invocation guidance. The most important tri-state result is frontloaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool takes no parameters and annotations already cover safety, the description is fully complete. It explains what is checks, how to interpret outcomes, and when to run it; an output schema can describe the technical return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the empty schema already covers parameter semantics completely. The description reinforces this by showing that the canary runs with no inputs and probes everything by itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: a 'structural drift canary' for WB with a tri-state result. It differentiates this diagnostic from functional WB tools by naming the endpoint families it probes and the dependent tools that would break on drift.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Run on demand before trusting a batch.' It does not explicitly name alternatives or exclusions, such as the other marketplace selfchecks, but the intended trigger scenario is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wb_sellerWB Seller Legal InfoA
Read-onlyIdempotent

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.

Error Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
supplier_idYesWB supplier id (positive integer). Get it from wb_card's supplier_id field.

Output Schema

ParametersJSON Schema
NameRequiredDescription
innNoRussian taxpayer id (INN).
kppNoTax registration reason code (KPP), RU legal entities only.
metaNoValidation metadata.
nameNoShort trading name of the seller.
ogrnNoState registration number (OGRN/OGRNIP).
full_nameNoFull registered legal-entity name.
host_usedNoStatic CDN host that served the record.
trademarkNoRegistered trademark, when the seller declares one.
supplier_idNoWB supplier id (as passed in).
foreign_codesNoNon-RU registration codes when present (unp=BY, bin=KZ, unn=other EAEU).
legal_addressNoRegistered legal address.
taxpayer_codeNoTaxpayer code — INN for RU, national code for EAEU sellers.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the operation as read-only and idempotent, and the description adds meaningful behavioral detail about error handling: it raises a ToolError with a JSON message describing the error code and retryability. It also clarifies what legal-entity data is returned, giving the agent a concrete picture of the call's result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then adds a crisp use-case ('who actually ships this?'), a workflow chaining hint, and a dedicated error-format note. Every sentence contributes information, and the overall length is appropriate for the behavioral detail it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only lookup with an output schema present, the description is complete: it covers when to call, where the parameter comes from, what is returned, and how failures surface. No critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: the supplier_id property already documents the type, positive constraint, and source ('Get it from wb_card's supplier_id field'). The description repeats the chaining hint but adds no new parameter-level meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Look up the registered legal entity behind a WB seller.' It clearly distinguishes the tool from siblings by explaining that it identifies who actually ships the product, using registered name, tax IDs, and legal address, rather than being a card, search, or review tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Chain from wb_card: its supplier_id field feeds straight into this tool.' This tells an agent when in the workflow to invoke it. It does not explicitly list exclusions or alternative tools for the same task, which prevents a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

yandex_cardYandex Market Product CardA
Read-onlyIdempotent

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.

Error Format

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

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYesNumeric Yandex Market product id — take it from yandex_search results.
include_reviewsNoInclude the server-rendered reviews (first ~13).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoCanonical product page URL.
metaNoValidation metadata.
brandNoBrand name.
imageNoPrimary product image URL.
titleNoProduct title.
ratingNoAverage rating, 1..5.
sellerNoSeller of the default offer.
sku_idNoSKU id of the default offer.
reviewsNoServer-rendered reviews (first ~13 only; the rest load over a closed API).
currencyNoCurrency code.
price_rubNoEveryday price in roubles, without a subscription.
product_idNoYandex Market product id.
descriptionNoProduct description.
offers_countNoHow many competing offers exist for this product.
rating_countNoNumber of star ratings.
rating_starsNoRatings per star level, 1..5 — reveals whether a 4.8 hides a cluster of 1-star complaints.
review_countNoNumber of written reviews.
price_with_plusNoPrice requiring a Yandex Plus/Pay subscription.
discount_percentNoDiscount percentage as reported upstream.
price_before_discount_rubNoPre-discount reference price.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds meaningful behavioral detail beyond annotations: reviews are capped at ~13 server-rendered items, the connector deliberately avoids the additional review-loading API, and errors follow a structured ToolError JSON with retryability information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized: main purpose first, then differentiators, then the cap/limitation, then error behavior. The bolded star distribution point and the review-cap paragraph earn their place because they guide correct interpretation of results, and the error format section is compact and valuable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich output schema and clear annotations, the description covers the essential remaining gaps: unique data value, the review count limitation, and error/retry behavior. Nothing critical is missing for an agent to invoke the tool correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description enriches the include_reviews parameter by explaining that reviews arrive with the card 'complete with pros, cons and helpfulness votes' and that the cap is ~13. This adds useful context not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action and resource — 'Fetch full detail for a Yandex Market product' — and enumerates the concrete contents: prices, rating breakdown, reviews. This clearly distinguishes the card tool from search and selfcheck siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use clear: call this when you need detailed product information, star distribution, and reviews in a single request. It does not explicitly name alternatives or state when not to use it, but the context is unambiguous enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

yandex_selfcheckYandex Market SelfcheckA
Read-onlyIdempotent

Probe Yandex Market's search and card pages and report a tri-state verdict.

success — the SSR state parsed as expected. drift_detected — pages load but no longer parse, so the extraction rules need updating. inconclusive — a transport block, geo restriction or captcha prevented a verdict; that says nothing about the parsers.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksNoPer-page-type results.
statusNoOverall verdict: success, drift_detected, or inconclusive.
connectorNoConnector name.
process_idNoOS process id.
tool_countNoNumber of MCP tools registered on the server.
cache_statsNoTTL cache counters for this process.
config_loadedNoWhether settings loaded successfully from env/defaults.
server_versionNoConnector server version.
server_started_atNoServer start timestamp (UTC ISO-8601).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description goes beyond these by explaining the three possible verdicts, clarifying that 'inconclusive' means transport/geo/captcha issues rather than parser failure, and noting that SSR extraction is inherently coupled to front-end drift. This gives the agent useful behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loads the core action, and uses concise bullet-style definitions for each verdict. The final sentence about SSR drift adds meaningful context without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, an output schema available, and annotations covering safety/idempotency, the description fully covers what an agent needs: the tool's purpose, the meaning of each result, and why drift is expected. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so there is no parameter documentation burden. The description reinforces that the tool needs no inputs and focuses on its verdict output. Baseline 4 is appropriate for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Probe Yandex Market's search and card pages' and 'report a tri-state verdict.' It clearly positions the tool as a health-check/probe rather than a data-fetching tool, distinguishing it from yandex_search and yandex_card and from other platform selfchecks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: this tool is for detecting whether SSR extraction rules still parse Yandex Market pages, with verdict meanings explained. It does not explicitly name alternative tools or state when not to use it, but the probe/verdict framing makes the intended use reasonably obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 42 tool updatesv1.2.2
    • First observedavito_card
    • First observedavito_search
    • First observedavito_selfcheck
    • First observedavito_seller
    • First observedcitilink_card
    • First observedcitilink_search
    • First observedcitilink_selfcheck
    • First observedcompare_prices
    • First observedcompare_sources
    • First observeddetmir_card
    • First observeddetmir_categories
    • First observeddetmir_category
    • First observeddetmir_selfcheck
    • First observeddns_card
    • First observeddns_search
    • First observeddns_selfcheck
    • First observedlamoda_card
    • First observedlamoda_search
    • First observedlamoda_selfcheck
    • First observedmarketplace_sources
    • First observedmegamarket_card
    • First observedmegamarket_search
    • First observedmegamarket_selfcheck
    • First observedozon_card
    • First observedozon_reviews
    • First observedozon_search
    • First observedozon_selfcheck
    • First observedtaobao_card
    • First observedtaobao_search
    • First observedtaobao_selfcheck
    • First observedwb_card
    • First observedwb_categories
    • First observedwb_category_products
    • First observedwb_questions
    • First observedwb_reviews
    • First observedwb_root_info
    • First observedwb_search
    • First observedwb_selfcheck
    • First observedwb_seller
    • First observedyandex_card
    • First observedyandex_search
    • First observedyandex_selfcheck

TDQS

A3.9/5.0

Scored across 42 tools

Disambiguation4/5

Most tools are clearly separated by marketplace prefix and action type (search, card, selfcheck), so an agent can generally pick the right one. A few pairs could still cause hesitation, such as wb_card vs wb_root_info (both return card-like data) and detmir_category vs detmir_categories, though the descriptions clarify the distinction.

Naming Consistency4/5

The dominant pattern is marketplace_prefix + action, and it is applied predictably to search/card/selfcheck across nearly every marketplace. There are minor inconsistencies like detmir_category vs detmir_categories for tree-browsing vs product-listing, wb_root_info and wb_category_products using noun phrases, and cross-cutting tools (compare_prices, compare_sources) not following the prefix convention.

Tool Count2/5

At 42 tools, the namespace is large and exceeds the 25+ threshold for a heavy tool surface. The count is systematic because each marketplace gets multiple tools, but it still forces agents to scan a long, repetitive list, especially with nine near-identical selfcheck tools.

Completeness4/5

For a read-only marketplace intelligence server, the core workflow is well covered: every marketplace has search and card retrieval, WB has reviews/questions/categories/seller, Avito has seller profiles, and compare_prices ties it together. Some depth is uneven — Ozon lacks categories and seller lookup, Yandex lacks seller lookup, and several marketplaces lack reviews — but these are workable gaps rather than dead ends.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server that turns Wildberries marketplace into a toolkit for LLM agents, enabling product search, detailed card inspection, price history, reviews, and cross-product comparison.
    -
  • A
    license
    D
    quality
    B
    maintenance
    Enables product search and price comparison across Ozon and Yandex Market via a read-only MCP server, returning normalized data with source URLs.
    6
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server that reads product data from Russian and Chinese marketplaces (Wildberries, Ozon, Yandex Market, Avito, etc.) — prices, availability, ratings, reviews, and seller details — with price comparison across sources. Requires no API keys; some sources use your Chrome session for anti-bot access.
    36
    87
    MIT

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/neuratechcompany-ops/kettu-marketplace-mcp'

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