ru-marketplace-mcp
This server provides read-only MCP tools to search and inspect products, prices, stock, reviews, ratings, and seller info across major Russian/Chinese marketplaces, compare prices across them in one call, and optionally get paid MPStats sales/stock analytics.
Marketplace search & product cards: Wildberries, Ozon, Yandex Market, Detsky Mir, Avito, Taobao, Megamarket, Lamoda, DNS, Citilink, and AliExpress.
Wildberries deep dive: batch product cards, reviews and buyer Q&A keyed by root product, seller legal details (INN/KPP/OGRN), catalog tree, and category product listings.
Yandex Market: search and full cards with both everyday and Yandex Plus prices, star-distribution breakdown, and reviews.
Detsky Mir: category browsing, category listings, and cards with region-specific prices and offline-store stock counts.
Avito: classifieds search, item cards, and seller reputation profiles.
Chinese marketplaces: Taobao search/cards with yuan prices, AliExpress search/cards with ruble prices, ratings, and order counts.
Other retail sources: Megamarket, Lamoda, DNS, and Citilink search/card lookup (mostly via Chrome/CDP).
Cross-marketplace price comparison:
compare_pricesqueries all sources concurrently and ranks offers by price, with per-source outcomes and warnings;compare_sources/marketplace_sourcesreport which connectors are installed/mounted.MPStats analytics: 30-day per-SKU sales, price, stock, and graph data for Ozon/Wildberries, plus warehouse stock split (FBS/FBO) — requires an optional paid
MPSTATS_MP_AUTHtoken.
Provides tools for searching Taobao products and retrieving product cards with prices in yuan.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ru-marketplace-mcpcompare prices for iPhone 15 across Wildberries and Ozon"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ru-marketplace-mcp
MCP-серверы для российских и китайских маркетплейсов. Цены, наличие, рейтинги, отзывы и реквизиты продавцов с Wildberries, Ozon, Яндекс Маркета, Детского мира, Авито, AliExpress, Taobao, Мегамаркета, Lamoda, DNS и Ситилинка. Плюс сравнение цен по всем источникам одним вызовом.
Только чтение. Ключи API, токены и регистрация не нужны — площадки с жёстким
анти-ботом читаются через ваш собственный Chrome. Одно исключение по желанию:
опциональный MPStats берёт платный токен (MPSTATS_MP_AUTH) — без него всё
остальное работает как прежде.
English version below · Архитектура · Как добавить источник · Про анти-бот
Что внутри
Сервер | Инструментов | Что нужно, чтобы читалось | Что умеет |
Wildberries | 8 | анонимный HTTP | Поиск, карточки, отзывы, вопросы о товаре, реквизиты продавца, каталог и товары категории |
Яндекс Маркет | 2 | анонимный HTTP | Цены разных продавцов, разбивка оценок по звёздам, отзывы |
Детский мир | 3 | анонимный HTTP | Детские товары, наличие в офлайн-магазинах, категории |
Ozon | 3 | ваш Chrome; с домашнего IP часто и без него | Поиск, карточки, отзывы |
Авито | 3 | ваш Chrome + российский домашний IP и запросы вразрядку — иначе блок по IP | Поиск объявлений, карточки, репутация продавца |
Taobao | 2 | ваш Chrome с активным входом в Taobao | Поиск и карточки, цены в юанях |
Мегамаркет | 2 | ваш Chrome с активным входом — анонимной сессии API отдаёт пусто | Поиск и карточки через мобильный API |
Lamoda | 2 | карточки анонимно (GraphQL), поиск — ваш Chrome | Поиск, карточки с размерами |
DNS | 2 | ваш Chrome (Qrator) | Поиск и карточки электроники |
Ситилинк | 2 | ваш Chrome (Qrator) | Поиск и карточки электроники |
AliExpress | 2 | ваш Chrome (x5sec) | Поиск и карточки, цены в рублях |
Сравнение | 2 | опрашивает всё перечисленное | «Где дешевле?» одним вызовом |
MPStats | 2 | платный аккаунт MPStats, cookie | Продажи/остатки/графики за 30 дней по SKU Ozon/WB, остатки по складам (FBS/FBO) |
Читается анонимно, без браузера: Wildberries, Яндекс Маркет, Детский мир и
карточки Lamoda. Остальным нужен ваш залогиненный Chrome (CDP). Taobao и
Мегамаркет вдобавок требуют активного входа в саму площадку — без него Taobao
упирается в стену логина, а Мегамаркет отдаёт пустой ответ. Авито ещё и блокирует
по IP: с датацентрового адреса это глухой отказ, с российского домашнего — работает,
если не частить запросами. Запросы к CDP-источникам идут вразрядку: очередь
подряд без пауз роняет их (DNS и Taobao в проверке так и деградировали), поэтому
коннекторы держат паузу между вызовами сами. Точное состояние из вашей сессии
покажет marketplace-mcp doctor.
MPStats стоит особняком: это единственный платный источник. Без
MPSTATS_MP_AUTH сервер запускается, но инструменты отвечают auth_missing —
поэтому он опционален и подключается по желанию, на остальные двенадцать
серверов он не влияет никак.
Всего 35 инструментов в 13 серверах на общем рантайме mcp-core. Плюс объединённый
marketplace-mcp, который монтирует всё разом — одна запись в конфиге клиента
вместо тринадцати. Он добавляет свой инструмент marketplace_sources (какие коннекторы
поднялись, а какие отвалились и почему), так что в нём 36 инструментов: 35
смонтированных плюс этот.
Related MCP server: wildberries-mcp
Быстрый старт
Нужны Python 3.12+ и uv.
git clone https://github.com/Vladimir-Human/ru-marketplace-mcp.git
cd ru-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 1212 офлайн-тестов, сеть не нужнаПроверка живого эндпоинта:
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:/путь/к/ru-marketplace-mcp", "marketplace-mcp"],
},
},
}Если нужны отдельные серверы, marketplace-mcp install claude напечатает
готовый блок для вставки. Путь к вашему checkout там уже подставлен: заглушку
/path/to/ru-marketplace-mcp править руками не придётся. При установке из wheel
вместо путей печатаются консольные команды на PATH. Неизвестное имя клиента
(допустимы claude, claude-code, cursor, dsh) команда отклоняет с пояснением и
кодом возврата 2 — молча подставить блок для Claude она не может. Минимальный
вариант вручную:
{
"mcpServers": {
"wildberries": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/ru-marketplace-mcp", "wb-mcp"],
},
"ozon": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/ru-marketplace-mcp", "ozon-mcp"],
},
"compare-prices": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/ru-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 /путь/к/ru-marketplace-mcp wb-mcp
claude mcp add yandex-market -- uv run --directory /путь/к/ru-marketplace-mcp yandex-mcp
claude mcp add detsky-mir -- uv run --directory /путь/к/ru-marketplace-mcp detmir-mcp
claude mcp add ozon -- uv run --directory /путь/к/ru-marketplace-mcp ozon-mcp
claude mcp add compare-prices -- uv run --directory /путь/к/ru-marketplace-mcp compare-mcp{
"mcpServers": {
"compare-prices": {
"command": "uv",
"args": ["run", "--directory", "/путь/к/ru-marketplace-mcp", "compare-mcp"],
},
},
}Запустите uv run --directory /путь/к/репозиторию <команда>, где команда — одна из
wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, aliexpress-mcp, compare-mcp. Серверы говорят по
JSON-RPC через stdin и stdout, диагностику пишут в stderr. Опциональный
mpstats-mcp запускается так же, с MPSTATS_MP_AUTH в окружении.
В dsh это не запись mcpServers, а слой профиля. Бандл лежит в подкаталоге
dsh/ и ставится штатным менеджером плагинов (pnpm нужен на PATH):
dsh plugin --profile web add github:Vladimir-Human/ru-marketplace-mcp#path:/dshСразу после установки появляются 14 навыков и ни одного MCP-инструмента: обе
строки MCP выключены, пока не задана переменная RU_MARKETPLACE_MCP_DIR с путём к
клону. Так сделано потому, что смонтированный сервер платится в каждом запросе:
рекомендуемый режим сравнения цен стоит ~0,9 тыс. токенов, полный набор — ~13,6 тыс.
Включение и полный режим описаны в dsh/README.md.
После подключения перезапустите клиент и прогоните marketplace-mcp doctor. Он
запускает канарейку каждого коннектора и отвечает success, drift_detected или
inconclusive.
Инструменты
Канарейки *_selfcheck в этом перечне не значатся намеренно: они не публикуются
по MCP, потому что диагностика оператора стоила бы модели ~7,5 тыс. токенов в
каждом запросе. Запускает их marketplace-mcp doctor — все разом, из командной
строки.
Wildberries — wb_*
Инструмент | Что делает |
| Поиск по тексту, до 100 товаров на страницу с ценами и остатками |
| Пакетный запрос до 100 известных SKU |
| Находит |
| Пул отзывов. Ключ — |
| Вопросы покупателей и ответы продавца. Тоже по |
| Юрлицо, ИНН, КПП, ОГРН, юридический адрес |
| Дерево каталога с шардами и запросами самого WB |
| Товары категории по |
wb_seller отвечает на вопрос, который карточка товара скрывает: кто на самом деле
продаёт? Возвращает зарегистрированное юрлицо и налоговые номера. Так отличают
официальный магазин бренда от перекупщика с похожим названием.
wb_questions закрывает другой пробел. Отзывы говорят, каково владеть товаром;
вопросы уточняют, что это вообще за товар — «10 или 16 ампер», «кабель в комплекте?».
Ответ продавца часто единственное публичное утверждение об этом. Пул общий для всех
вариантов товара, ключ — imt_id из wb_root_info.
wb_category_products замыкает связку с wb_categories: та отдаёт shard и query,
это — товары по ним. Формат элементов совпадает с wb_search, поэтому обход категорий
и текстовый поиск сравнимы напрямую. Часть крупных разделов WB помечает шардом
blackhole — у них нет своей выдачи, и инструмент честно об этом говорит вместо
пустого списка.
Яндекс Маркет — yandex_*
Инструмент | Что делает |
| Поиск с обеими ценами, рейтингами, продавцами |
| Карточка целиком: разбивка по звёздам и отзывы |
Две цены, всегда. price_rub платит любой покупатель. price_with_plus
требует подписку Яндекс Плюс и обычно на 25–30% ниже. Интерфейс Яндекса показывает
вторую крупным шрифтом, поэтому назвать её без оговорки — значит пообещать цену,
которую человек без подписки не получит.
rating_stars даёт распределение вида {1: 10, 2: 3, 3: 10, 4: 19, 5: 502}. Из
него видно, честная ли средняя 4.8 или за ней прячется кучка единиц.
Детский мир — detmir_*
Инструмент | Что делает |
| Дерево каталога. Начинать отсюда |
| Товары категории с настоящим счётчиком |
| Цена, рейтинг, наличие онлайн и в магазинах |
Регион задаётся на каждый вызов. Цены и особенно наличие в офлайн-магазинах
сильно зависят от города: один и тот же товар лежал в 152 магазинах Москвы, 37
Петербурга и 2 Хабаровска. Параметр region перекрывает DETMIR_REGION, так что
города можно сравнивать в одной сессии.
Текстового поиска здесь нет, и это намеренно. API Детского мира молча игнорирует любые текстовые фильтры и возвращает весь каталог на 300 тысяч позиций, а сайтовый роут поиска отдаёт 404 с промо-карусселью. Инструмент поиска возвращал бы уверенно неверные товары, поэтому навигация идёт через категории. Подробности в docs/ANTI_BOT.md.
Ozon — ozon_*
Инструмент | Что делает |
| Поиск по тексту |
| Карточка товара |
| Отзывы |
Ozon отклоняет датацентровый трафик, поэтому коннектор двухуровневый. Сначала TLS-имперсонация. Если Cloudflare выдаёт челлендж, запрос выполняется внутри вашего залогиненного Chrome через DevTools Protocol. Ничего не хранится: вход выполняете вы сами, в браузере, который контролируете. Настройка описана в docs/CDP_SETUP.md.
С российского домашнего IP первый уровень обычно работает, и браузер не нужен.
Отзывы на Ozon общие для всей карточки-семейства, и соседи по пулу — часто другой
товар другого бренда. У карточки масляного радиатора Huter 1500 Вт (SKU 5264146973,
рейтинг 4.8 из 356 отзывов) среди 100 вытянутых отзывов не оказалось ни одного о
самом Huter: 38 про Ресанту 2000 Вт, 34 про Ресанту 1500 Вт, 5 про Eurolux и так
далее — всего 12 товаров в пуле. Поэтому каждый отзыв несёт item_id — SKU того
товара, о котором он написан, а ответ дополнительно отдаёт requested_item_id,
own_reviews (сколько отзывов действительно об этом SKU) и pool_variants
(SKU → название всех товаров пула). rating_score и distribution считаются по
пулу, а не по товару: прежде чем делать вывод, отзывы нужно отфильтровать по
item_id, а при own_reviews: 0 — честно сказать, что своих отзывов у товара нет.
Авито — avito_*
Инструмент | Что делает |
| Поиск объявлений через внутренний |
| Одно объявление: цена, описание, просмотры, продавец |
| Рейтинг продавца, число отзывов, активные объявления |
Авито — это объявления, а не каталог: пула отзывов на товар нет, репутация
продавца и есть сигнал доверия. Бесплатное/обменное объявление приходит с
price_rub: null — никогда не 0, чтобы не оказаться «самым дешёвым» в
сравнении. С датацентрового IP Авито отвечает 403-файрволом, поэтому коннектор
двухуровневый: TLS-имперсонация, дальше ваш Chrome (как у Ozon).
Taobao — taobao_*
Инструмент | Что делает |
| Поиск по каталогу Taobao |
| Карточка товара |
Поиск Taobao — клиентское React-приложение с подписанным mtop API: каждый запрос
требует sign, вычисленный из cookie-токена, поэтому анонимного пути нет.
Все чтения идут внутри вашего Chrome, где сайт сам подписывает запросы. Цены в
юанях (CNY) и не конвертируются: зашитый курс молча устарел бы, так что
сравнение с рублёвыми источниками делайте явно.
Мегамаркет, Lamoda, DNS, Ситилинк
Эти четыре читаются через ваш 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 ходят восемь источников — эти плюс Taobao, AliExpress, Ozon и
Авито, где Chrome лишь
запасной уровень: их tier 1 обычно отвечает, а браузер включается, когда анонимный
уровень упёрся в челлендж. marketplace-mcp doctor из вашего браузера скажет, какие
эндпоинты подтверждены.
AliExpress — aliexpress_*
Инструмент | Что делает |
| Поиск: до 48 карточек с ценами в рублях |
| Карточка: цена, рейтинг, число заказов |
Читается через ваш Chrome (CDP): x5sec ставит капчу анонимным клиентам, поэтому
коннектор садится на страницу поиска (её не челленджат) и открывает карточку
новой вкладкой из неё. Цены в рублях и участвуют в compare_prices. Карточка с
названием, но без цены — известное состояние: под нагрузкой x5sec перестаёт
отдавать ценовой модуль, коннектор пишет price_missing, а не выдумывает число.
Цена «N ₽ с купоном» в price_rub не публикуется: там обычная цена, про купон
коннектор честно предупреждает отдельно. Тексты отзывов не отдаются: только
рейтинг и число заказов. Как и у остальных CDP-источников, зелёный
aliexpress_selfcheck доказывает, что транспорт ответил, — не то, что цена
верна.
Сравнение цен — compare_*
Инструмент | Что делает |
| Все маркетплейсы сразу, с ранжированием |
| Какие маркетплейсы доступны в этой установке |
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: … с числом исключённых предложений и
причиной. Конвертировать здесь значило бы зашить курс, который молча устареет, —
пересчёт за вами.
MPStats — mpstats_*
Аналитика продаж и остатков по SKU Ozon и Wildberries через плагин MPStats.
В отличие от всех остальных коннекторов, этот опционален и требует платный
аккаунт MPStats: авторизация — одна cookie mp_auth (JWT из залогиненной
сессии плагина на mpstats.io), задаётся переменной MPSTATS_MP_AUTH. Без неё
инструменты возвращают auth_missing, а сервер запускается как обычно — ни на
что другое это не влияет.
Инструмент | Что делает |
| Аналитика за 30 дней по до 100 SKU: заказы, цена, остатки, графики по дням, продавец/бренд |
| Остатки по складам: FBS (склад продавца) и FBO (склад маркетплейса), |
place — ozon или wildberries. Графики длиной 30, от старых к новым:
последняя ненулевая ячейка — текущая цена или остаток. Цена и остаток при
сплошь нулевом графике ведут себя намеренно по-разному: цена становится None
(ложный 0 выиграл бы любое сравнение «где дешевле»), а остаток — 0, потому
что «нулевой остаток» это осмысленное показание, а не отсутствие данных. Пустой
график даёт None в обоих случаях. Ноль в отдельной ячейке — «нет данных за тот
день», а не «значение было нулевым», поэтому сумму за окно считайте по графику. Отсутствие
токена и транспортные сбои selfcheck отчитывает как inconclusive, не drift:
гоняться за дрейфом схемы, которого не было, не нужно. Токен — секрет платного
аккаунта с квотой: не логируйте и не коммитьте его.
Навыки для агента
У каждого коннектора — свой навык в skills/: четырнадцать штук, по одному
на источник плюс общий marketplace. Навык это не пересказ README: он объясняет агенту, когда за этот
источник вообще браться, чего у источника нет, и каким его ответам нельзя верить
без второго взгляда.
Навык | Сервер |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mcp-core — общий рантайм под остальными серверами. Своего навыка у него нет.
Соответствие проверяется тестом
(packages/marketplace-connector/tests/test_skills_parity.py): новый коннектор
без навыка роняет прогон, как и навык, который называет несуществующий
инструмент или забыл существующий. До этого теста навык DNS почти год советовал
формат ссылки /product/<24-hex>/ — тот самый шаблон, который чинили как баг.
Скиллы едут в Docker-образ (/app/skills/), но в колёсах их нет: skills/
лежит в корне репозитория. Ставите с PyPI — возьмите навыки
из репозитория отдельно.
Настройка
Все параметры задаются переменными окружения с префиксом коннектора. Все необязательные.
Префикс | Основные параметры |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_, LAMODA_ и MPSTATS_. У Taobao своего нет намеренно: поиск там
подписан и ходит через собственный клиент. У Мегамаркета, DNS и Ситилинка тоже нет:
их трафик идёт через ваш Chrome, а его egress — дело настроек браузера. Кэшируются
только удачные ответы: запомнить сбой значило бы растянуть секундную помеху на весь
TTL.
У Ozon прокси применяется к первому уровню. Второй идёт через ваш собственный Chrome, и его трафик — дело настроек этого браузера.
Секрет один, и тот опциональный. Всем серверам, кроме MPStats, ничего не нужно:
нечего настраивать, нечему утечь. У MPStats есть MPSTATS_MP_AUTH — JWT платного
аккаунта, и потому его место только в env клиентской записи: в коде и коммитах его
нет и быть не должно.
Разработка
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 1212 офлайн-тестов
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 # одна версия во всех 77 местахЧасть тестов прогоняет настоящий 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 с браузером работает внутри сессии, которую вы открыли сами. Используйте на своё усмотрение, для личных исследований, в вежливом темпе запросов. Пауза между вызовами к площадкам с анти-ботом — это часть конструкции, а не случайное торможение: её не нужно убирать ради скорости. Данные инструментов не предназначены для перепродажи или массового сбора.
Как это сделано
Код и документацию я писал вместе с ИИ-ассистентами. Они работают быстро и ошибаются уверенно, поэтому проект устроен вокруг проверки: 1212 офлайн-тестов, аудит перед выпуском, тесты, которые прогоняют настоящий экстрактор по снятой с сайта разметке. В заметках к релизу перечислено, какие источники сверены с живыми страницами вручную и какие остались непроверенными.
Вопрос «кто набрал текст» кажется мне менее интересным, чем вопрос «чем это проверено». Второй здесь задокументирован, и проверить его может любой.
Спасибо
@Xpos587 — коннектор MPStats (PR #5): разбор API плагина, структура парсеров и первая рабочая версия.
Лицензия
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, AliExpress, Taobao, Megamarket, Lamoda, DNS and Citilink, then compare prices across all of them in one call. Taobao and AliExpress are the Chinese ones; 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. One optional exception: MPStats
takes a paid account token (MPSTATS_MP_AUTH) if you want its analytics; without
it every other server is unaffected.
What you get
Server | Tools | What it takes to read | Notes |
Wildberries | 8 | anonymous HTTP | Search, cards, reviews, buyer questions, seller legal identity, catalog tree and category listings |
Yandex Market | 2 | anonymous HTTP | Multi-seller prices, star distribution, reviews |
Detsky Mir | 3 | anonymous HTTP | Kids' goods, offline store stock, category listings |
Ozon | 3 | your Chrome; often no browser from a residential IP | Search, cards, reviews |
Avito | 3 | your Chrome + a Russian residential IP and spaced requests — else an IP block | Classified search, cards, seller reputation |
Taobao | 2 | your Chrome with an active Taobao login | Search and cards, prices in yuan |
Megamarket | 2 | your Chrome with an active login — an anonymous session reads empty | Search and cards via the mobile API |
Lamoda | 2 | cards anonymous (GraphQL), search via your Chrome | Search, cards with sizes |
DNS | 2 | your Chrome (Qrator) | Electronics search and cards |
Citilink | 2 | your Chrome (Qrator) | Electronics search and cards |
AliExpress | 2 | your Chrome (x5sec) | Search and cards, ruble prices |
Compare | 2 | aggregates the above | "Where is this cheapest?" in one call |
MPStats | 2 | paid MPStats account, | 30-day sales/stock graphs per Ozon/WB SKU, warehouse split (FBS/FBO) |
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 marketplace-mcp doctor
from your own session for the current state.
MPStats stands apart as the only paid source: without MPSTATS_MP_AUTH the
server boots but its tools answer auth_missing. It is therefore optional —
plug it in if you have an account; the other thirteen servers never notice.
35 tools across 13 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 36 tools: the 35 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/Vladimir-Human/ru-marketplace-mcp.git
cd ru-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 1212 offline tests, no network neededClient configuration mirrors the Russian section above. Each server is a console
script (wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, aliexpress-mcp, compare-mcp) launched
through uv run --directory /path/to/repo <script>. The optional mpstats-mcp
runs the same way with MPSTATS_MP_AUTH in the entry's env (paid MPStats
account; without it the tools return auth_missing). marketplace-mcp install [claude|claude-code|cursor|dsh] 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. The dsh target prints a
cordis.patch.yml row instead of mcpServers JSON — see dsh/README.md.
DeepSeek Harness (dsh) installs as a plugin bundle rather than an mcpServers
entry, from the dsh/ subdirectory (pnpm must be on PATH):
dsh plugin --profile web add github:Vladimir-Human/ru-marketplace-mcp#path:/dshThat gives you 14 skills immediately and no MCP tools: both MCP rows stay
disabled until RU_MARKETPLACE_MCP_DIR points at a clone. A mounted server is paid
on every request — ~0.9k tokens for the recommended price-comparison mode, ~13.6k for
the full set — so opting in is left to you. dsh/README.md covers
enabling it and the full mode.
After connecting, run marketplace-mcp doctor. It runs every connector's canary and
reports success, drift_detected, or inconclusive for each.
The tools
The *_selfcheck canaries are deliberately absent from these tables: they are not
published over MCP, because operator diagnostics would cost the model ~7.5k tokens
on every request. marketplace-mcp doctor runs them all from the command line.
Wildberries — wb_*
Tool | What it does |
| Text search, up to 100 products/page with prices and stock |
| Batch lookup for up to 100 known SKUs |
| Resolves |
| Review pool, keyed by |
| Buyer questions with seller answers, also keyed by |
| Registered entity, INN, KPP, OGRN, legal address |
| Catalog tree with WB's own shard/query selectors |
| Products in a category, using those selectors |
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 |
| Search with both prices, ratings, sellers |
| Full detail plus star breakdown and reviews |
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 |
| Catalog tree, start here |
| Products in a category, with real totals |
| Price, rating, online and offline store stock |
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 |
| Text search |
| Product detail |
| Reviews |
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.
Ozon pools reviews per card family, and the neighbours are often a different
product from a different brand. A live card for a 1500 W Huter oil heater (SKU
5264146973, rated 4.8 across 356 reviews) returned 100 reviews of which zero were
about the Huter: 38 about a 2000 W Resanta, 34 about a 1500 W Resanta, 5 about a
Eurolux — 12 products in that pool. So every review carries item_id, the SKU it is
actually about, and the response adds requested_item_id, own_reviews (how many
returned reviews really are about that SKU) and pool_variants (SKU → name for the
whole pool). rating_score and distribution are pool-wide, not per product: filter
by item_id before concluding anything, and when own_reviews is 0, say plainly
that the product has no reviews of its own.
AliExpress — aliexpress_*
Tool | What it does |
| Search: up to 48 tiles with ruble prices |
| Card: title, price, rating, order count |
Read through your Chrome (CDP): x5sec challenges anonymous clients, so the
connector lands on a search page (never challenged) and opens the card in a new
tab from it. Prices are rubles and rank in compare_prices. A card with a title
but no price is a known state — under load x5sec stops serving the price module
and the connector reports price_missing rather than inventing a number. A
"with coupon" price never lands in price_rub: the regular price does, and the
coupon is reported as a warning. Review texts are not exposed; rating and order
counts are. As with every CDP source, a green aliexpress_selfcheck proves the
transport answered — not that a given price is right.
Avito — avito_*
Tool | What it does |
| Classified search through the internal |
| One listing: price, description, views, seller |
| Seller rating, review count, active listings |
Avito is classifieds, not a catalog: there is no per-product review pool, the
seller's reputation IS the trust signal. A free/swap listing arrives with
price_rub: null — never 0, so it cannot win "cheapest". From a datacenter
IP Avito answers a 403 firewall, hence the two-tier transport: TLS impersonation
first, then your Chrome, exactly like Ozon.
Taobao — taobao_*
Tool | What it does |
| Catalog search |
| Product card |
Taobao search is a signed-mtop React app: every request needs a sign derived
from a cookie token, so there is no anonymous path. All reads run inside your
Chrome, where the site signs its own requests. Prices stay in yuan (CNY) and
are never converted — a baked-in rate quietly goes stale, so compare ruble and
yuan listings explicitly.
Megamarket, Lamoda, DNS, Citilink
These four read through your Chrome (CDP). Megamarket (megamarket_*) goes
through the mobile JSON API behind ServicePipe and needs an active login — an
anonymous session reads empty. DNS (dns_*) and Citilink (citilink_*) render
DOM behind Qrator with no anonymous path at all. Lamoda (lamoda_*) is split:
cards over anonymous GraphQL, search through Chrome. All of them need Chrome
with CDP (scripts/start_chrome_cdp.sh), except Lamoda cards. Eight sources
run through CDP in total: these plus Taobao, AliExpress, Ozon and Avito, where
Chrome is only the fallback tier when the anonymous one is challenged.
Cross-marketplace — compare_*
Tool | What it does |
| Every marketplace at once, ranked |
| 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: trueSources 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.
MPStats — mpstats_*
Sales and stock analytics per Ozon or Wildberries SKU via the MPStats browser
plugin. Unlike every other connector, this one is optional and needs a paid
MPStats account: auth is a single mp_auth cookie (JWT from a logged-in plugin
session at mpstats.io), set via the MPSTATS_MP_AUTH env var. Without it the tools
return auth_missing while the server boots normally — nothing else is affected.
Tool | What it does |
| 30-day analytics for up to 100 SKUs: orders, price, stock, per-day graphs, seller/brand |
| Warehouse split: FBS (seller's warehouse) vs FBO (marketplace warehouse), |
place is ozon or wildberries. Graphs are length 30, oldest first: the last
non-zero cell is the current price or stock. The two differ on purpose when the
whole graph is zero: price becomes None (a false 0 would win any "cheapest"
comparison), while stock becomes 0, because "none in stock" is a real reading
rather than an absence of data. An empty graph yields None for both. A zero
cell means "no data for that day", not "the value was zero", so sum the graph for
a window total. A missing token or a transport failure reports
as inconclusive, not drift — no chasing a schema drift that never happened.
The token is a secret on a paid, quota-billed account: never log or commit it.
Agent skills
Every connector ships its own skill under skills/ — fourteen of them — one per source plus a shared
marketplace overview. 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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*_CACHE_TTL=0 disables caching. *_PROXY overrides the standard
HTTPS_PROXY/ALL_PROXY — seven connectors carry one: WB_, YANDEX_, DETMIR_,
OZON_, AVITO_, LAMODA_ and MPSTATS_. Taobao has none by design and
Megamarket, DNS and Citilink none either:
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.
Containers. CHROME_CDP_HOST points the CDP client at Chrome (default
127.0.0.1; use chrome or host.docker.internal inside Docker). That single
variable is what opens the tier-2 sources — Ozon, Avito, Taobao, Megamarket,
Lamoda, DNS, Citilink and AliExpress — from a container without host networking.
See docs/DEPLOYMENT.md.
One secret, and it is optional. Every server except MPStats needs nothing:
nothing to configure, nothing to leak. MPStats alone has MPSTATS_MP_AUTH, the JWT
of a paid account — it belongs only in the client entry's env, never in code or
commits.
Development
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 1212 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 77 placesSome 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.pyWithout 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, never0. A zero would rank a dead listing as the cheapest option.Loud failure. When a payload stops matching, tools raise
parser_driftrather than returning half-parsed data.Tri-state selfchecks.
success,drift_detectedorinconclusive. 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; the backoff between calls to anti-bot sources is deliberate and should not be removed for speed. Tool output is not meant for redistribution or bulk harvesting.
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: 1212 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.
Thanks
@Xpos587 for the MPStats connector (PR #5): the plugin API work, the parser structure and the first working version.
License
MIT, see LICENSE.
Available Tools
36 toolsaliexpress_cardAliExpress Product CardARead-onlyIdempotent
Fetch one AliExpress product card, rendered in the operator's Chrome.
Review TEXTS are deliberately not exposed: they require navigating the review tab, which x5sec challenges; this tool returns the rating and the order count instead.
Return Format
AliCardResponse: {status, item_id, title, price_rub, old_price_rub, rating, orders_count, url, tier_used, meta}.
Error Format
ToolError: BadRequestError when no item id can be extracted; TransportDownError on x5sec challenges or CDP failures; ParserDriftError when a rendered card has neither title nor price.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id_or_url | Yes | AliExpress item id (9-16 digits) or aliexpress.ru item URL, e.g. /item/1005010003103368.html |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| title | No | |
| rating | No | |
| status | No | |
| item_id | No | |
| price_rub | No | |
| tier_used | No | |
| orders_count | No | |
| old_price_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only, idempotent, and non-destructive behavior. The description adds critical operational context: it renders in the operator's Chrome, may face x5sec challenges (causing TransportDownError), and lists specific error types (BadRequestError, ParserDriftError). This goes well beyond annotations and helps agents anticipate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for return and error formats. It balances necessary caveats (review text limitation) and technical details without being excessively verbose. Each sentence contributes to operational clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that interacts with an external site and may encounter challenges, the description covers all essential aspects: purpose, limitations, error handling, and return structure. The output schema exists, so not explaining return fields in detail is acceptable; the description adds extra value beyond structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed description of the item_id_or_url parameter including format and example. The description does not add extra semantics beyond what the schema already provides, but given the high coverage, this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch one AliExpress product card', specifying the verb, resource, and platform, which distinguishes it from sibling card tools for other marketplaces. It also explicitly mentions that review texts are not exposed, clarifying the scope beyond a generic product fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by explaining that review texts are deliberately not returned due to x5sec challenges, implying this tool is for basic product info rather than reviews. While it doesn't name alternative tools, the context is clear enough to differentiate from review-focused siblings like wb_reviews or ozon_reviews.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aliexpress_searchAliExpress SearchARead-onlyIdempotent
Search AliExpress, rendered in the operator's Chrome.
Return Format
AliSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0.
Error Format
ToolError: TransportDownError on x5sec challenges or CDP failures (with the manual-check hint inline); ParserDriftError when a rendered page yields zero product tiles.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'умные часы' |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly annotation by specifying return format (AliSearchResponse) and error conditions (TransportDownError, ParserDriftError), adding useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and well-structured with clear sections for return and error formats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers return and error formats adequately for a simple search tool, though it does not elaborate on the 'rendered in the operator's Chrome' context or any additional configuration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the 'query' parameter with an example, and the tool description does not add extra semantic details about it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool searches AliExpress, which distinguishes it from other marketplace search tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly mention when to use this tool versus alternatives, but the name and context imply it is for AliExpress searches. Lacks explicit guidance on choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_cardAvito Item CardARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id_or_url | Yes | Item id, slug path or full avito.ru URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| title | No | |
| views | No | |
| images | No | |
| seller | No | |
| status | No | |
| item_id | No | |
| location | No | |
| posted_at | No | |
| price_rub | No | |
| tier_used | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations (readOnlyHint, idempotentHint) by detailing the exact error format and conditions (BadRequestError, NotFoundError, TransportDownError, ParserDriftError). It also clarifies an important behavioral nuance: price_rub is None when the ad has no price, never 0. This adds valuable context for handling tool 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, with a one-sentence summary followed by clearly labeled 'Return Format' and 'Error Format' sections. Every detail earns its place, giving the agent precise information without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter fetch tool, the description covers all essential aspects: what it does, the exact structure of the response, and all expected error types. The annotations and output schema fill in the remaining details, making this description complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the single parameter item_id_or_url with a clear description ('Item id, slug path or full avito.ru URL'), so the schema carries the heavy lifting. The tool description's 'by id or URL' adds no extra meaning beyond the schema; the return-format details are about output, not parameters. Thus, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Fetch one Avito listing') and its input scope ('by id or URL'). This distinguishes it from sibling tools like avito_search (which searches multiple listings) and avito_seller (which fetches seller data), making the purpose explicit and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is for retrieving a single, specific listing when an id or URL is available. It doesn't explicitly name alternatives or state when not to use it, but the intent is unambiguous enough to guide an agent without additional exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_searchAvito SearchARead-onlyIdempotent
Search Avito listings via the internal js/items API.
Return Format
AvitoSearchResponse: {status, query, page, location_id, tier_used, count, total_count, items[], meta}. Items carry item_id, title, price_rub (None when the ad has no price — never 0), url, location, seller fields.
Error Format
ToolError: BadRequestError on malformed arguments; TransportDownError on firewall blocks (with the captcha/proxy guidance inline); ParserDriftError when a reached-200 body no longer parses as the expected envelope.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page (1-based) | |
| query | Yes | Search text, e.g. 'thinkpad x1 carbon' | |
| category_id | No | Optional Avito category id to narrow the search | |
| location_id | No | Avito location id; default AVITO_LOCATION_ID (637640 = Moscow) |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No | |
| location_id | No | |
| total_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Builds on read-only/idempotent annotations by detailing the return envelope (e.g., 'tier_used', 'total_count') and item fields, notably 'price_rub (None when the ad has no price — never 0)' to prevent misinterpretation. The error format section discloses specific failure modes (BadRequestError, TransportDownError with captcha/proxy guidance, ParserDriftError), which is valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-line purpose followed by clearly labeled Return Format and Error Format sections, making it scannable. It is slightly verbose due to the return format detail, but each section carries meaningful information, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a detailed schema, safety annotations, and an output schema, the description still adds critical context about error handling and data semantics (e.g., price None vs 0). It does not mention pagination behavior beyond the page parameter, but the schema already constrains that, so overall the tool is well-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage with clear descriptions, including defaults and examples. The tool description adds no extra semantic detail for parameters beyond what is in the schema, so it does not go beyond the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search Avito listings via the internal js/items API,' which clearly states the verb, resource, and scope. This distinguishes it from sibling tools like avito_card and avito_seller, and from other marketplace search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for searching Avito listings but does not explicitly state when to use this tool versus alternatives like avito_card for details or avito_seller for seller info. There is no exclusion or reference to sibling tools, leaving the choice to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_sellerAvito Seller ProfileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| seller_id_or_url | Yes | Seller id or profile URL from a card/search hit |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| seller | No | |
| status | No | |
| tier_used | No | |
| active_items | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and open-world. The description adds valuable behavioral context beyond these: specific error conditions (empty input, 404, transport blocks, parser drift) and the return envelope structure. This goes beyond what annotations provide, giving an agent clarity on failure modes and output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with clear sections for purpose, return format, and error format. Every sentence contributes meaningful information without fluff. It is slightly longer than the bare minimum but justified by the niche context and error details, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter, read-only, output schema present), the description is complete. It covers the purpose, the data content (rating, review count, active listings), the return envelope, and all error cases. The presence of an output schema reduces the need to describe return values in detail, and the description still adds contextual clarity about why this data matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter seller_id_or_url is already fully documented in the input schema with 'Seller id or profile URL from a card/search hit' (100% coverage). The description does not add any additional meaning about the parameter beyond what the schema provides, so it hits the baseline of 3 for adequate schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch an Avito seller profile' and explains what the profile contains (rating, review count, active-listing count). It distinguishes this from per-item review tools by noting that classifieds have no per-item review pool, making the seller profile the definitive reputation signal. This separates it from avito_card and avito_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance: it explains that in classifieds, the seller's reputation is what buyers check, implying this tool should be used when evaluating a seller's trustworthiness rather than item reviews. However, it does not explicitly name alternative tools or state 'use this when you need seller reputation, not item details,' which would make the guidance more prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citilink_cardCitilink Product CardARead-onlyIdempotent
Fetch one Citilink product card.
Return Format
CitilinkCardResponse: {status, product_id, title, price_rub, old_price_rub, is_available, url, tier_used, meta}.
Error Format
ToolError: BadRequestError when the URL carries no product id; TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered card has neither title nor price.
| Name | Required | Description | Default |
|---|---|---|---|
| product_url | Yes | citilink.ru product URL containing /product/<slug>/, e.g. /product/noutbuk-lenovo-2169270/ |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| title | No | |
| status | No | |
| price_rub | No | |
| tier_used | No | |
| product_id | No | |
| is_available | No | |
| old_price_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by detailing the return format (CitilinkCardResponse) and specific error conditions (BadRequestError, TransportDownError, ParserDriftError). This adds significant behavioral context that annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for return and error formats. It is slightly verbose but each sentence earns its place by providing necessary operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description appropriately focuses on error cases and operational details. It covers all relevant failure modes and return contract, making it complete for a single-parameter fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage of the single parameter with a clear description and example. The tool description adds no additional parameter semantics, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch one Citilink product card' with a specific verb and resource. It distinguishes itself from siblings like citilink_search by specifying 'one' card fetch, implying a single product URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching a single product card, but it does not explicitly state when to use this tool versus alternatives like citilink_search. No direct exclusions or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citilink_searchCitilink SearchARead-onlyIdempotent
Search Citilink, rendered in the operator's Chrome.
Return Format
CitilinkSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0.
Error Format
ToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'ноутбук lenovo' |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond annotations: it notes the search is rendered in the operator's Chrome, defines the return format (including price_rub None never 0), and specifies error types (TransportDownError on CDP/Qrator failures, ParserDriftError on zero product tiles). This is rich context that annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and uses clearly labeled sections for return and error formats. Every sentence adds meaningful information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter search tool, the description covers the core action, rendering context, return shape, and failure modes. The full output schema also exists, so the description is sufficiently complete without needing to list every response field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the single query parameter with min/max length and an example. The description adds no additional parameter-level semantics, only return/error context. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Search Citilink'. The title and schema example ('ноутбук lenovo') confirm it is for product search, clearly distinguishing it from sibling tools like citilink_card. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for searching Citilink and states it is rendered in the operator's Chrome, but it never explicitly says when to prefer this tool over alternatives like citilink_card or compare_prices. No exclusions or alternative tool references are provided, so guidance is only implied.
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 MarketplacesARead-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:
cheapestis chosen on everyday prices. Yandex Market's subscriber price appears asprice_with_subscription_ruband is deliberately excluded from ranking, since it requires a paid Yandex Plus subscription.source_outcomesshows which marketplaces answered. A blocked or timed-out source means the comparison is partial, not that the product is absent there —completetells you which case you are in.
Titles are matched loosely: marketplaces name things differently, so scan the results rather than assuming every row is the identical model.
Return Format
CompareResponse: {query, sources_queried, sources_ok, complete, total_offers, cheapest, price_spread_rub, offers, source_outcomes, warnings, server_version}. offers is ranked by everyday price_rub — cheapest first, offers without a rouble price after the ranked ones. warnings carries validation/completeness warnings.
Error Format
On validation failure, raises ToolError with a JSON message describing the
error code and whether it is retryable. Individual source failures do NOT
raise — they are reported in source_outcomes.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to price, in Russian — e.g. 'стиральная машина узкая' or 'iphone 15 128'. | |
| sources | No | Restrict to specific marketplaces (wildberries, yandex_market, ozon). Omit to query all. | |
| per_source_limit | No | How many offers to take from each marketplace. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | No | |
| offers | No | |
| cheapest | No | |
| complete | No | |
| warnings | No | |
| sources_ok | No | |
| total_offers | No | |
| server_version | No | |
| source_outcomes | No | |
| sources_queried | No | |
| price_spread_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, but the description adds substantial context beyond that: cheapest excludes Yandex subscription price, source_outcomes indicates partial results, titles are matched loosely, and individual source failures do not raise errors. This is exactly the kind of behavior an agent needs to interpret output correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: clear purpose, explicit usage guidance, two important output caveats, a note on matching behavior, and structured return/error format. It is front-loaded with the essential purpose and uses formatting (sections, em-dashes) to make scanning easy. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters, complex behavior (concurrent queries, partial failures, subscription prices), and a rich output schema, this description covers all necessary aspects: what it does, when to use it, how to interpret results, what the return structure looks like, and how errors are handled. It is complete enough for an agent to invoke and use the results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters with descriptions, so the baseline is 3. The description adds some relevant context about loose title matching and 'in Russian' for the query parameter, but it does not significantly extend the schema's parameter explanations. It meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Price one product across every configured Russian marketplace at once.' It clearly distinguishes itself from per-marketplace search tools by emphasizing the concurrent comparison and ranking, so an agent immediately knows what this tool uniquely does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'This is the tool for "where is X cheapest"' and contrasts it with the slower alternative of running per-marketplace search tools one at a time. It also implicitly tells the agent when NOT to use it (when you need a single marketplace's detailed results, use those sibling tools).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_sourcesList Available MarketplacesARead-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.
Return Format
Plain object: {installed, searchable, not_installed, notes, source_timeout_s, server_version, server_started_at, process_id}. notes explains per-source access quirks (CDP-only sources, currencies, missing text search).
Error Format
Never raises ToolError: pure introspection of which connector packages are installed — nothing here touches the network.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc., but the description adds substantial behavioral context beyond that: it never raises ToolError, performs pure introspection, touches no network, and documents the return format including server metadata and per-source notes. This gives the agent a full picture of what the tool does and what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headings for purpose, return format, and error format. Every sentence provides useful information — no filler. The use of bullet-like examples and plain object field listing keeps it compact while being fully informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, an output schema, and a clear diagnostic role, the description is complete. It explains return format, error behavior, and usage context. There are no missing pieces that would leave an agent uncertain about invocation or interpretation of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to clarify. Per the baseline, a 0-parameter tool with full schema coverage earns a 4; the description adds value by explaining the return structure, which compensates for the lack of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Report which marketplaces this installation can actually query' — a specific verb and resource that clearly states the tool's function. It also distinguishes this from sibling marketplace tools by framing it as a diagnostic first call for partial comparison results, which uniquely positions it among the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Call this first when a comparison comes back partial' and explains the key distinction between 'connector isn't installed' and 'marketplace refused us', which require different fixes. This directly answers when and why to use this tool versus alternatives.
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 CardARead-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.
Return Format
DetmirCardResponse: {product, region, meta}. product carries product_id, title, article, brand, price_rub (None when absent — never 0), old_price_rub, discount_percent, rating, review_count, questions_count, availability, available_online, available_offline, store_count, is_marketplace, vendor, url, picture.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| region | No | ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION. | |
| product_id | Yes | Numeric Detsky Mir product id — the digits in /product/index/id/<id>/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| region | No | |
| product | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish read-only and idempotent behavior, so the description correctly focuses on additional behavioral traits: region override semantics ('overrides DETMIR_REGION for this call only'), store_count's dependence on city, and the price_rub representation (None, never 0). It also discloses the error format, going beyond annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with front-loaded purpose, bolded sections for return and error formats, and each sentence provides distinct information. Despite length, nothing seems superfluous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has rich annotations, a complete input schema, and an output schema. The description additionally explains the most important operational nuance (region-dependent store_count) and error behavior, making the tool fully invokable without further research.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full descriptions for both parameters (product_id with URL example, region with default). The description adds behavioral context about how region affects store_count and the session-level override, which helps the agent choose values, but does not add new syntactic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch price, rating, stock and seller for one Detsky Mir product,' a specific verb+resource that clearly distinguishes this from sibling card tools for other marketplaces. It further differentiates by noting its coverage of the kids-and-baby category and its ability to distinguish Detsky Mir's own stock from marketplace sellers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this is for querying Detsky Mir product details, and contrasts with general marketplaces ('covers the kids-and-baby category that the general marketplaces cover unevenly'). However, it does not explicitly name alternative tools or provide exclusion criteria, so it falls short of full usage guidance.
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 CategoriesARead-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.
Return Format
DetmirCategoriesResponse: {parent, returned, total_available, items, region, meta}. Items carry category_id, alias, title, full_name, level, products_count, parent_id, url; alias is what detmir_category needs to list a category.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum categories to return. | |
| parent | No | 'top' for the 27 top-level sections, or a parent category id to list its children. | top |
| region | No | ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| items | No | |
| parent | No | |
| region | No | |
| returned | No | |
| total_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds value by explaining that each node carries products_count to assess inventory before fetching, and by disclosing the error format including retryability. It does not add rate limits or other potential side effects, but the existing disclosures are solid and no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with headers for overview, return format, and error format. It is informative without being bloated; each section serves a purpose. The module docstring reference is slightly tangential but useful context. Overall, it is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's role in the workflow, why it exists (no text search), what the return format looks like, and how errors are surfaced. Since an output schema is present, it need not explain each field; the description provides enough context for an agent to select and invoke the tool correctly in most situations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all three parameters (limit, parent, region) with descriptive comments, so schema coverage is 100%. The description does not add new semantic information about these parameters beyond what the schema already provides. It does contextualize the returned alias for detmir_category, but that is about output, not parameter meaning. Thus baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+outcome: 'Browse the Detsky Mir catalog tree and get the aliases detmir_category needs.' It clearly distinguishes from the sibling detmir_category by positioning this as the discovery step, and mentions the catalog tree and aliases, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: 'This is the discovery step' and explains that Detsky Mir has no working text search, so walking the tree is the way to find products. It even names the dependent sibling (detmir_category) and how the output feeds into it. It does not explicitly state when not to use the tool, but the context is strong enough that an agent can infer appropriate usage.
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 ListingARead-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.
Return Format
DetmirListResponse: {query, mode, total_available, category_title, returned, offset, items, region, meta}. Items carry the same product shape as detmir_card. An empty page is NOT an error — it is reported via meta.warnings.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | Yes | Category slug from a catalog URL, e.g. 'pups' in /catalog/index/name/pups/. | |
| limit | No | Items per page. | |
| offset | No | Items to skip, for pagination. | |
| region | No | ISO region code for prices and offline stock, e.g. 'RU-MOW' or 'RU-SPE'. Defaults to DETMIR_REGION. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| mode | No | |
| items | No | |
| query | No | |
| offset | No | |
| region | No | |
| returned | No | |
| category_title | No | |
| total_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context beyond these: it is a 'real JSON endpoint with proper pagination and an upstream total', empty pages are reported via meta.warnings, and error format includes retryable indication. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement, a 'why' paragraph, and dedicated Return Format / Error Format sections. Every sentence adds value; it is detailed without being bloated. It is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with pagination, region handling, and error reporting, the description covers all essentials: return format with key fields, relationship to detmir_card, empty-page behavior, and error format with retryable indicator. An output schema exists, so the description does not need to enumerate every field, but it provides enough context for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for all four parameters, so the schema already documents each parameter. The description adds only minor context (e.g., alias example 'pups', region default to DETMIR_REGION) but does not significantly enhance parameter meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List products in a Detsky Mir category, with the total match count' — a specific verb+resource+scope. It further distinguishes itself from text search by calling itself 'the reliable way to enumerate the catalog', separating it from sibling tools like detmir_categories (category listing) and detmir_card (product details).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'This is the reliable way to enumerate the catalog' and contrasts with text search. It also clarifies pagination behavior and that an empty page is not an error, guiding the caller on how to interpret results.
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 CardARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_url | Yes | dns-shop.ru product URL containing /product/<id>/, e.g. /product/b7a1667f9b19ed20/ |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| title | No | |
| status | No | |
| price_rub | No | |
| tier_used | No | |
| product_id | No | |
| is_available | No | |
| old_price_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds specific error behaviors (BadRequestError, TransportDownError, ParserDriftError) and a condition for parser drift, providing 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections and no wasted words. The Return Format section may duplicate what the output schema already provides, but it is brief and doesn't bloat the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a scraping tool with potential failures, the description covers purpose, input requirements, return format, and all relevant error modes. Since an output schema exists, the return format section is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents product_url with an example and full coverage. The description adds semantic value by explaining that a BadRequestError occurs when the URL carries no product id, reinforcing the expected URL structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch one DNS-Shop product card', which clearly states a specific verb and resource. This distinguishes it from sibling tools like dns_search (search) and other marketplace card tools, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is used when you need a single product card by URL, and the input requirement for a product URL provides context. However, it does not explicitly mention alternatives or when-not-to-use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dns_searchDNS-Shop SearchARead-onlyIdempotent
Search DNS-Shop, rendered in the operator's Chrome.
Return Format
DnsSearchResponse: {status, query, tier_used, count, items[], meta}. price_rub is None when absent — never 0.
Error Format
ToolError: TransportDownError on CDP/Qrator failures; ParserDriftError when a rendered page yields zero product tiles.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'ноутбук lenovo' |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds valuable context beyond annotations, including the rendering environment, return format (price_rub is None not 0), and specific error conditions (TransportDownError, ParserDriftError). This is useful operational detail without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, opening with a clear purpose then using labeled sections for return and error formats. Each line adds meaningful information, avoiding fluff. Slightly verbose due to formatting details but appropriate for the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter search tool, the description is highly complete. It covers purpose, return structure, and failure modes, and is backed by strong annotations and schema coverage. The tool is fully specified for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with a description and example for 'query'. The tool description does not add further parameter-level detail, so the baseline of 3 is appropriate; the schema carries the semantic burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search DNS-Shop' with a specific verb and resource, making it distinct from sibling tools that target other marketplaces. It also adds context about being rendered in the operator's Chrome, further clarifying the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives like ozon_search or wb_search. The description does not mention exclusions or selection criteria, leaving the agent to infer that it should be used for DNS-Shop searches based solely on the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lamoda_cardLamoda Product CardARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sku_or_url | Yes | SKU (MP002XM1RMM3) or lamoda.ru product URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| sku | No | |
| url | No | |
| _meta | No | |
| brand | No | |
| sizes | No | |
| title | No | |
| status | No | |
| price_rub | No | |
| tier_used | No | |
| is_available | No | |
| old_price_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds value by revealing the anonymous endpoint (no auth needed), the tier 1 designation, that Lamoda exposes no ratings, and enumerating specific error types, which helps agents anticipate failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with Return Format and Error Format sections, using concise bullet-like notation. It includes essential details without extensive prose, though the return field listing may be somewhat redundant if an output schema is available.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single simple parameter and strong annotations, the description covers the essential behavior, return shape, and error cases. It is complete enough for an agent to invoke the tool correctly, though it leaves terms like 'tier_used' and 'meta' unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the single parameter with an example format. The description's error format mentions 'when no SKU can be extracted', which reinforces that the input must contain a SKU, but adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch one Lamoda product card via the anonymous GraphQL endpoint (tier 1)', providing a specific verb and resource. It clarifies it fetches a single card, distinguishing it from search tools like lamoda_search, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state explicit when-to-use vs alternatives. The context of requiring a SKU or URL is implied by the parameter, and the 'one product card' phrasing suggests not for searching, but this is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lamoda_searchLamoda SearchARead-onlyIdempotent
Search Lamoda, rendered in the operator's Chrome (discovery is blocked tier 1).
Return Format
LamodaSearchResponse: {status, query, tier_used, count, items[], meta}. Items carry sku, title, brand, price_rub (None when absent — never 0), url.
Error Format
ToolError: TransportDownError on CDP/nav failures; ParserDriftError when a rendered page yields zero SKUs, which means the tile shape moved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'кроссовки nike' |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructiveness, so the safety profile is covered. The description adds valuable context: the tool renders in the operator's Chrome, mentions tier-1 discovery blocking, and explains error semantics (ParserDriftError on zero SKUs, price_rub never 0 when absent). This goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for return and error formats, and every sentence provides useful information. It is slightly verbose for a one-parameter search tool, but the added detail on errors and return fields earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter search tool with a full output schema and strong annotations, the description covers the key behavioral aspects: rendering environment, tier status, response shape, and failure modes. It does not mention pagination or rate limits, but these are not critical given the tool's simplicity and the schema presence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single 'query' parameter, including an example. The description does not add any new parameter semantics beyond what the schema gives, so it lands at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool 'Search Lamoda' with a specific verb and resource, and the return format makes its role as a marketplace search tool clear. It is implicitly distinguished from sibling tools like lamoda_card by name and output shape, but it does not explicitly call out the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the name ('Lamoda Search') and the fact that sibling tools cover other marketplaces, but the description provides no explicit guidance on when to choose this tool over alternatives, nor does it mention a complementary tool like lamoda_card for item details.
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 LoadedARead-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.
Error Format
Never raises ToolError: pure introspection of the mounted connectors — a
failed import is recorded in skipped instead of being raised.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mounted | No | |
| skipped | No | |
| mounted_count | No | |
| skipped_count | No | |
| server_version | No |
TDQS
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 adds significant behavioral context beyond these: defensive importing behavior, that failed imports are recorded in ``skipped`` rather than raised, and that it never raises ToolError. This explains the observable behavior and error semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is longer than average, it is well-structured with clear sections ("Why this exists", "Return Format", "Error Format") and every paragraph adds value. The length is justified by the need to explain the invisible failure mode and the return format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and the presence of an output schema, the description fully covers the tool's purpose, usage context, return semantics, and error behavior. It addresses the complex diagnostic case where a missing source looks like an empty one, which is essential for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the baseline for this dimension is 4. The description appropriately focuses on the return format and error behavior, adding meaning beyond the parameterless schema. No parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb+resource: "List which connectors this unified server actually mounted." It distinguishes itself from sibling tools by explaining the diagnostic purpose: distinguishing missing marketplaces from empty ones, which is unique among the available tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: "Call this before concluding a marketplace has no results — if it is in ``skipped``, it was never queried at all." This tells the agent exactly when to invoke this tool versus assuming a marketplace is empty, effectively differentiating it from comparison tools like compare_sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
megamarket_cardMegamarket Product CardARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id_or_url | Yes | Goods id or megamarket.ru product URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| title | No | |
| rating | No | |
| status | No | |
| item_id | No | |
| price_rub | No | |
| tier_used | No | |
| is_available | No | |
| rating_count | No | |
| old_price_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description goes further by specifying the exact return fields and error types (BadRequestError, NotFoundError, TransportDownError, ParserDriftError), which provides concrete behavioral expectations 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose. The return format and error format sections are clearly structured and add necessary value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-fetch tool, the description is complete. It specifies the output schema, error behavior, and is supplemented by strong annotations. An agent can correctly invoke the tool and interpret results without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter ('Goods id or megamarket.ru product URL'). The description adds no additional parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: 'Fetch one Megamarket product card.' It uses a specific verb ('Fetch') and resource ('Megamarket product card'), and the word 'one' distinguishes it from search tools. The marketplace name distinguishes it from other card tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description does not mention that 'megamarket_search' should be used for discovery or that an item ID/URL is required. The input schema carries this information, but the description itself omits usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
megamarket_searchMegamarket SearchARead-onlyIdempotent
Search the Megamarket catalog via the mobile API, inside the operator's Chrome.
Return Format
MegamarketSearchResponse: {status, query, tier_used, count, total_count, items[], meta}. price_rub is None when absent — never 0.
Error Format
ToolError: TransportDownError on ServicePipe refusals (with the fix inline); ParserDriftError when a reached-200 body no longer parses.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'стиральная машина' |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No | |
| total_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides substantial behavioral context beyond the annotations: it details the exact return format (MegamarketSearchResponse with fields status, query, tier_used, count, total_count, items, meta), explains the price_rub behavior (None when absent, never 0), and documents error formats (TransportDownError, ParserDriftError). This goes beyond the read-only and idempotent hints from annotations, offering valuable transparency about operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headings for the main purpose, return format, and error format. It is appropriately sized, front-loaded with the core description, and every sentence provides useful information without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter), and the description covers the purpose, return structure, and error cases. Given the annotations and output schema presence, the description is complete for an agent to invoke the tool and interpret results. It even specifies the execution environment (inside the operator's Chrome) which may be relevant for the agent's decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully covers the single parameter 'query' with a description and length constraints, so the schema coverage is 100%. The tool description does not add additional meaning to the parameter beyond what is already in the schema, which places it at the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search the Megamarket catalog via the mobile API' using a specific verb ('Search') and resource ('Megamarket catalog'). It distinguishes itself from sibling tools like megamarket_card and other marketplace searches by explicitly naming Magamarket as the target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for when to use this tool: when searching the Megamarket catalog. However, it does not explicitly exclude alternatives or recommend other tools for different scenarios (e.g., using megamarket_card for detailed product info). No explicit when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mpstats_itemMPStats Item AnalyticsARead-onlyIdempotent
Fetch per-SKU 30-day sales analytics from MPStats (Ozon or Wildberries).
Returns, per SKU: seller/brand identity, current stock and price, a rolling
orders-per-day average, aggregated totals over the window, and four
per-day graphs (orders, prices, stock count, rubric positions). Graphs are
length days (default 30), oldest-first; a zero cell means "no data for
that day", not "the value was zero".
Requires the MPSTATS_MP_AUTH env var (a paid MPStats account JWT cookie).
Without it the tool returns an auth_missing error.
Return Format
MpStatsItemResponse: {place, days, count, items, meta}. Each item carries sku, place, seller, seller_id, brand, stock_now, price_avg_rub, orders_per_day, days_on_stocks, totals {orders, sum, sum_prev} and four per-day graphs (orders, prices, count, rubrics), oldest-first. Missing values are None, never 0; a zero graph cell means "no data for that day".
Error Format
ToolError: BadRequestError on malformed skus or place; AuthMissingError when MPSTATS_MP_AUTH is missing or rejected; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and HTML blocks; ParserDriftError on a non-JSON or mis-shaped body; NotFoundError when no requested SKU has analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| skus | Yes | 1..100 SKU integers (positive). Per-SKU 30-day sales/price/stock analytics from MPStats. | |
| place | Yes | Marketplace: 'ozon' or 'wildberries'. Determines which MPStats dataset the SKUs resolve against. | |
| oz_fbs | No | Ozon FBS (Fulfilled-by-Seller) mode. Ozon-specific; harmless for wildberries. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| meta | No | |
| count | No | |
| items | No | |
| place | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description extensively discloses behavior beyond the annotations: rolling averages, per-day graph semantics, zero-cell meaning, auth failure modes, and a full error taxonomy. It also clarifies missing values are None, never 0, which is a subtle but crucial behavioral detail. No contradictions with the read-only/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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (overview, return format, error format) and every sentence carries meaningful information. It is length-appropriate for the tool's complexity and front-loads the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool's moderate complexity, the description covers the full usage context: what the tool returns, the exact structure, all error cases, and prerequisites. The output schema and annotations are supplemented effectively, leaving little room for agent confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% coverage with detailed parameter descriptions, so the baseline is 3. The tool description adds useful context about what the data represents (e.g., 'per-SKU', '30-day') but does not add significant new meaning beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, actionable verb ('Fetch') and identifies both the resource (MPStats) and scope (per-SKU 30-day sales analytics, Ozon or Wildberries). It clearly distinguishes this from sibling tools via the per-SKU granularity and explicit marketplace focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes when to use the tool: for per-SKU analytics on MPStats data. It also gives a key prerequisite (MPSTATS_MP_AUTH env var). However, it does not explicitly state when NOT to use this tool or name an alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mpstats_warehousesMPStats Warehouse StockARead-onlyIdempotent
Fetch per-SKU warehouse stock split from MPStats (Ozon or Wildberries).
Returns, per SKU: FBS (seller warehouse) stock count, total FBO (marketplace
warehouse) stock count, the raw per-warehouse FBO entries when MPStats
populates them, and the upstream last_update timestamp.
Requires the MPSTATS_MP_AUTH env var (a paid MPStats account JWT cookie).
Without it the tool returns an auth_missing error.
Return Format
MpStatsWarehousesResponse: {place, days, count, items, meta}. Each item carries sku and stocks {fbs, fbo, fbo_warehouses, last_update}. Missing stock counts are None, never 0.
Error Format
ToolError: BadRequestError on malformed skus or place; AuthMissingError when MPSTATS_MP_AUTH is missing or rejected; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and HTML blocks; ParserDriftError on a non-JSON or mis-shaped body; NotFoundError when no requested SKU has stock data.
| Name | Required | Description | Default |
|---|---|---|---|
| skus | Yes | 1..100 SKU integers (positive). Per-SKU warehouse stock split from MPStats. | |
| place | Yes | Marketplace: 'ozon' or 'wildberries'. Determines which MPStats dataset the SKUs resolve against. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| meta | No | |
| count | No | |
| items | No | |
| place | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral context: auth requirements, specific error types (BadRequestError, AuthMissingError, RateLimitedError, etc.), and data semantics like "Missing stock counts are None, never 0." 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for return format and error format. It is appropriately detailed without redundancy. Every sentence adds helpful information, from the auth requirement to the behavior of missing data (None, never 0). The use of formatting (code highlights, headings) enhances readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description thoroughly explains the return structure and also enumerates all relevant error scenarios. It covers prerequisites (paid MPStats account), parameter scope, and edge cases. For a tool with two parameters and a moderate complexity, this is complete and self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with descriptions for both skus and place. The tool description adds a bit of context, such as "place determines which MPStats dataset the SKUs resolve against," but this is also present in the schema. The description does not significantly enrich parameter understanding beyond the schema's existing coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 per-SKU warehouse stock split from MPStats (Ozon or Wildberries)." It clearly distinguishes this tool from siblings by focusing on warehouse stock split, a niche capability. The return fields (FBS, FBO, etc.) further solidify a distinct purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly communicates when to use this tool by stating what it returns and the required environment variable (MPSTATS_MP_AUTH). It does not explicitly name alternatives or exclusions, but the context of fetching per-SKU stock split from MPStats is clear. The presence of sibling tools like mpstats_item suggests different use cases, but that contrast is not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_cardOzon Product CardARead-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.
Return Format
OzonCardResponse: {status, price, card_price, price_original, is_available, rating_score, rating_count, title, seller, characteristics, url, tier_used, meta} on success. Fields are None when the page does not carry them.
Error Format
Raises ToolError on validation (BadRequestError), transport/block (TransportDownError — including the catch-all for unexpected internal errors), or parser drift (ParserDriftError). No-results is NOT an error — an empty widgetStates payload returns a healthy response with null fields.
| Name | Required | Description | Default |
|---|---|---|---|
| sku_or_path | Yes | SKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Other paths are rejected (SSRF prevention). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| price | No | |
| title | No | |
| seller | No | |
| status | No | |
| tier_used | No | |
| card_price | No | |
| is_available | No | |
| rating_count | No | |
| rating_score | No | |
| price_original | No | |
| characteristics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by detailing the tiered fetch mechanism, Chrome CDP prerequisite, return format fields, error taxonomy, and no-result handling. This is rich behavioral context that helps an agent anticipate side effects and operational requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear first sentence and dedicated sections for return format and error format. Every section earns its place without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, transport strategy, prerequisites, return schema, error taxonomy, and no-result semantics. For a single-parameter read-only tool with existing annotations, this description is fully sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already documents the single parameter at 100% coverage, including accepted forms (SKU, URL, path) and SSRF prevention. Description adds no parameter-level details, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with 'Fetch Ozon product card data via composer-api.bx', a specific verb+resource statement. It clearly distinguishes the tool from sibling tools like ozon_search and ozon_reviews by focusing on product card retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use: fetching product card data, with explicit fallback behavior from Tier-1 to Tier-2 on Cloudflare 403. Does not explicitly name alternative tools or when-not-to-use, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_reviewsOzon Product ReviewsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Review 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 |
| limit | No | Max review texts to return (1..100). Distribution+total always full. | |
| sku_or_path | Yes | SKU integer-as-string, full Ozon URL, or /product/<digits>/ path. Normalized to /product/<digits>/reviews/ (SSRF-allowlisted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| sort | No | |
| _meta | No | |
| status | No | |
| partial | No | |
| reviews | No | |
| returned | No | |
| tier_used | No | |
| last_error | No | |
| stop_reason | No | |
| distribution | No | |
| rating_score | No | |
| pages_fetched | No | |
| reviews_count | No | |
| requested_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description goes far beyond by detailing the tier-1/tier-2 fallback, 30-per-page walking, hard 10-page cap, dedup by uuid, and nuanced partial-success/error handling. This is exemplary disclosure of behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (introduction, behavior, return format, error format). Every sentence carries useful information—no filler. While longer than a one-liner, the density and organization keep it efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with pagination, partial failures, and multiple error modes, the description is remarkably complete. It covers the success return shape, partial-success semantics, and the exact conditions for each error type. Combined with a rich output schema and annotations, an agent has everything needed to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 how 'limit' interacts with automatic page walking (30/page until limit collected) and the hard cap, which is not fully captured in the schema alone. This pushes it to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 Ozon product review texts + star distribution'. It clearly distinguishes this tool from sibling tools by focusing on reviews (vs. search, card, etc.) and even references the sibling ozon_card for implementation context. This is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state 'use this when X, use Y when Z', but it provides clear context about the return format, pagination behavior, and partial-success semantics, which helps an agent understand when this tool is appropriate. It lacks explicit exclusions or alternatives, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_searchOzon Catalog SearchARead-onlyIdempotent
Search Ozon catalog. Tier-1 curl_cffi → Tier-2 CDP fallback.
Returns sku/title/price/rating per item. Schema parses Nov 2026
tileGridDesktop-* widgets with mainState atom structure.
Return Format
OzonSearchResponse: {status, query, page, tier_used, count, items, meta} on success. Zero matching items is NOT an error — it returns a healthy response with count=0 and empty items.
Error Format
Raises ToolError on validation (BadRequestError), transport/block (TransportDownError), or parser drift (ParserDriftError).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page (1..10). | |
| query | Yes | Russian search text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnly, idempotent, and non-destructive behavior, the description adds valuable context: the tiered transport (curl_cffi to CDP), the specific widget parsing, the healthy response with zero items, and the raised error types. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into clear sections (Return Format, Error Format) and is front-loaded with the core purpose. A few sentences could be tightened, but the details are useful and not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the return format (OzonSearchResponse), the error model (ToolError subclasses), and the zero-match behavior, making it self-sufficient. Output schema exists, but the description adds operational context that is not redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters (query and page) with descriptions, so schema coverage is 100%. The description adds no additional parameter semantics beyond the schema; it mentions page and query only implicitly. Baseline 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search Ozon catalog,' a specific verb+resource pair that clearly distinguishes this tool from sibling tools like ozon_card or wb_search. It further specifies the return fields (sku/title/price/rating) and the search tier architecture, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and description, but there is no explicit guidance on when to prefer this tool over alternatives (e.g., ozon_card for detailed product info). It does mention fallback behavior as a technical detail, but not usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taobao_cardTaobao Item CardARead-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. When the description-image count drifts to a non-number, description_images degrades to 0 and meta.warnings names the drift — the card itself still answers.
Error Format
ToolError: BadRequestError when no id can be extracted; NotFoundError when the item page reports itself gone; TransportDownError on login walls and CDP failures; ParserDriftError when a rendered card has neither title nor price.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id_or_url | Yes | Item id or item.taobao.com URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| _meta | No | |
| sales | No | |
| title | No | |
| status | No | |
| item_id | No | |
| price_cny | No | |
| shop_name | No | |
| tier_used | No | |
| description_images | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, etc.), the description adds concrete behavioral details: price_cny is None when hidden or variant-based, description_images degrades to 0 with a meta warning, and specific error types for different failure modes. This is rich, non-obvious context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with Return Format and Error Format sections. It is longer than the bare minimum but each section adds necessary detail without excessive verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers return format, edge-case behavior, and error handling. Given the output schema exists and the tool is a simple fetch-only operation, it is sufficiently complete. It does not discuss prerequisites like URL formatting, but the schema covers parameter constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter item_id_or_url is fully documented in the schema (100% coverage). The description adds no additional parameter semantics, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch one Taobao item card,' using a specific verb (fetch) and resource (one Taobao item card). It clearly distinguishes itself from sibling tools like taobao_search and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrasing 'one Taobao item card' makes clear it is for retrieving a single item's card, not searching. However, it does not explicitly state when to prefer this over taobao_search or other card tools, so it stops short of full explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taobao_searchTaobao SearchARead-onlyIdempotent
Search Taobao listings, rendered in the operator's Chrome.
Return Format
TaobaoSearchResponse: {status, query, page, tier_used, count, items[], meta}. Items carry item_id (string), title, price_cny (None when hidden — never 0), shop_name, sales label, url.
Error Format
ToolError: TransportDownError when Chrome/CDP is unreachable or the page lands on a login wall (log into taobao.com in the scraping profile, then retry); ParserDriftError when a rendered page yields zero items, which means the DOM shape moved.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page (1-based) | |
| query | Yes | Search text, Chinese or English, e.g. '手机' or 'headphones' |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| _meta | No | |
| count | No | |
| items | No | |
| query | No | |
| status | No | |
| tier_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing dependency on Chrome/CDP, login wall behavior, and the significant 'price_cny None when hidden — never 0' output nuance. Also details error conditions (TransportDownError, ParserDriftError) that are not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and concise. The core purpose is stated in the opening sentence, followed by organized return format and error format sections. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having a full output schema and strong annotations, the description adds crucial operational context: Chrome rendering dependency, login requirements, error conditions, and output quirks. This makes the tool safe and correctly invocable even with the schema and annotations present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters, so the description need not add parameter-level detail. The return format section adds output context but does not enhance parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search Taobao listings' with the distinctive detail that it is 'rendered in the operator's Chrome.' This distinguishes it from sibling tools like taobao_card and other marketplace searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use (searching Taobao, requires operator's Chrome, login wall handling) but does not explicitly mention alternatives or when-not-to-use. The error section implies prerequisites (log into taobao.com) and retry guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_cardWB Product CardsARead-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.
Return Format
WbCardResponse: {dest, count, items, meta}. Items carry nm_id, name, brand, supplier, supplier_id, supplier_rating, review_rating, feedbacks, total_quantity, in_stock, price_rub, price_original_rub. price_rub is None when the SKU has no sellable price — never 0. Unknown SKUs are NOT an error — they simply do not appear in items.
Error Format
ToolError: BadRequestError on malformed nm_ids; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses, Cloudflare HTML pages and unexpected internal errors; ParserDriftError on a non-JSON or mis-shaped body.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | No | Region ID. Default -1257786 (Moscow). Required for valid prices/stocks. Other examples: -1257786 Moscow, -1029256 Saint Petersburg. | -1257786 |
| nm_ids | Yes | 1..100 nmId integers (positive). Batch product cards from WB v4 API. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dest | No | |
| meta | No | |
| count | No | |
| items | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral details beyond the readOnly/idempotent annotations: price_rub is None (never 0), unknown SKUs are silently omitted, and error classes are mapped to specific conditions (rate limit, transport, parser drift). This goes well beyond the annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose sentence and structured into Return/Error sections, making it scannable. It is slightly repetitive in listing fields (brand, supplier, ratings appear both in the intro and in the return format) but remains efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return format, edge cases (unknown SKUs, None price), and all error classes, while annotations cover safety. The 100-SKU limit and dest behavior are captured in the schema. No critical information is missing for a batch-read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage, documenting dest (with default and examples) and nm_ids (with count/type constraints). The description only restates 'up to 100 SKUs' and adds no new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch product card data from WB v4 API,' clearly stating the action and resource. It enumerates the returned fields (prices, brand, supplier, ratings, etc.) and the 100-SKU limit, which distinguishes it from sibling tools like wb_reviews or wb_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives such as wb_search or wb_reviews. It only states functionality and limits, leaving the agent to infer appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_categoriesWB Catalog CategoriesARead-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.
Return Format
WbCategoriesResponse: {root, max_depth, total_returned, truncated, items, host_used, meta}. Nodes carry id, name, url, shard, query, depth, children_count, children; shard+query are the selectors wb_category_products needs to list a category feed.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | 'top' for the top-level sections, or a category name / URL path / id to expand (e.g. 'Электроника', '/catalog/elektronika', '8126'). | top |
| max_depth | No | How many levels below the root to include. 1 = direct children only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| root | No | |
| items | No | |
| host_used | No | |
| max_depth | No | |
| truncated | No | |
| total_returned | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: responses are bounded slices of an ~800 KB menu, and it documents the error format. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loaded with the primary purpose, and every sentence earns its place. It is concise (~150 words) yet informative, with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description still adds value by clarifying the node fields (id, name, url, shard, query, depth, children_count, children) and the relationship to wb_category_products. It also covers return format and error behavior, making it complete for a catalog browsing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptive parameter definitions, so the baseline is 3. The description adds context about starting at 'top' and expanding branches, but this largely overlaps with the schema's parameter descriptions rather than providing new semantic depth.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Browse' with the resource 'Wildberries catalog tree', clearly stating what the tool does. It explicitly distinguishes itself from siblings by contrasting with wb_search and mentioning wb_category_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('Use this to discover what exists before searching') and names an alternative (wb_search) that requires a query string. It also gives a navigation pattern ('start at top, then expand') and implies the role of wb_category_products.
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 ListingARead-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.
Return Format
WbCategoryProductsResponse: {shard, query, page, sort, dest, count, has_more, items, meta}, with items in the same shape as wb_card. has_more is inferred from a full page — WB reports no total here.
Error Format
ToolError: BadRequestError on malformed selectors or the unlistable 'blackhole' shard; NotFoundError on a 404 (stale shard/query pair); RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses, Cloudflare HTML pages and unexpected internal errors; ParserDriftError on a non-JSON or mis-shaped body.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | No | WB region id. Defaults to WB_DEFAULT_DEST (Moscow). Prices and stock are region-specific. | |
| page | No | Page number. Each page carries up to 100 products. | |
| sort | No | Upstream ordering: popular, priceup, pricedown, newly, rate, or benefit. | popular |
| query | Yes | WB catalog selector from wb_categories, e.g. 'cat=9845' or 'subject=1234'. | |
| shard | Yes | WB catalog shard from wb_categories, e.g. 'electronic58'. The literal 'blackhole' means the category has no listable feed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dest | No | |
| meta | No | |
| page | No | |
| sort | No | |
| count | No | |
| items | No | |
| query | No | |
| shard | No | |
| has_more | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring readOnly, idempotent, and non-destructive hints, the description adds substantial behavioral context: the return shape matches wb_card, has_more is inferred from a full page rather than a reported total, blackhole shards raise errors instead of empty lists, and a complete error taxonomy is provided (BadRequest, NotFound, RateLimited, TransportDown, ParserDrift). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections for purpose, caveats, return format, and error format. The opening sentence is a crisp summary, and subsequent paragraphs add necessary context about the blackhole limitation and error behavior. It is not overly terse for the complexity involved, though some sentences could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a moderately complex relationship to a sibling tool and several failure modes, the description is remarkably complete. It explains the integration with wb_categories, the blackhole exception, the exact return shape, and all anticipated error types. Even with an output schema present, the description independently lists the response fields, ensuring the agent fully understands what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all parameters with detailed descriptions, so the baseline is 3. The description adds contextual meaning by explaining that shard and query are handed back by wb_categories, that 'blackhole' is a special unlistable value, and that prices/stock are region-specific via dest. This extra provenance and edge-case info justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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' and immediately references the shard/query selectors from wb_categories. It also distinguishes itself from sibling tools by noting the items come back in the same shape as wb_search and wb_card, making its role in the category-vs-search workflow clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool: after wb_categories provides shard and query selectors, for category-based browsing without inventing search phrases. It also warns that not every category has a feed and blackhole shards raise an explicit error. However, it does not explicitly name alternative tools like wb_search for text-based scenarios, so it falls slightly short of a 5.
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_idARead-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.
Return Format
WbQuestionsResponse: {imt_id, total_available, returned, skip, answered_count, has_more, questions, meta}. Question items carry question_id, text, date, user, answered, answer_text, answer_date, nm_id. An empty pool is NOT an error — it means nobody has asked yet.
Error Format
ToolError: BadRequestError on a bad limit or skip; RateLimitedError on HTTP 429; TransportDownError on network failures, non-200 responses and unexpected internal errors; ParserDriftError when a 200 body loses the count key or the questions shape.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Offset into the question pool, for walking past the first page. | |
| limit | No | Max questions to return (1..100). Fetched in pages of 30, which is the upstream cap. | |
| imt_id | Yes | Root ID (imt_id) from wb_root_info. Questions are pooled per imt_id across every variant, NOT by nmId. | |
| answered_only | No | Return only questions the seller has answered. Unanswered questions carry no product information. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| skip | No | |
| imt_id | No | |
| has_more | No | |
| returned | No | |
| questions | No | |
| answered_count | No | |
| total_available | No |
TDQS
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 substantial behavioral details beyond those: an empty pool is not an error, pagination happens in pages of 30 (upstream cap), and a full error format section covers BadRequestError, RateLimitedError, TransportDownError, and ParserDriftError. It also explains the pooling behavior across variants and the nmId empty-pool consequence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured with sections for main purpose, context, return format, and error format. It is front-loaded with the essential purpose and keying detail. No sentence is redundant; each adds value, but the error format section could arguably be summarized since the output schema exists. Still, it is appropriately scoped for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (imt_id vs nmId, shared pool, pagination, empty pools, error cases), the description covers all necessary context: return format, error format, parameter semantics, and behavioral expectations. The output schema handles return structure details, and the description compensates for the schema's lack of runtime behavior. An agent can confidently invoke this tool correctly without additional lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: imt_id is the root ID from wb_root_info and must not be an nmId; limit is 'Fetched in pages of 30'; answered_only is framed as a filter for product-relevant questions ('Unanswered questions carry no product information'). These clarifications help the agent select and construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource: 'Fetch buyer questions and seller answers by imt_id (root_id from wb_root_info).' It explicitly distinguishes this tool from wb_reviews: 'Reviews describe the experience of owning the product; questions clarify what it actually is.' The scoping to imt_id and the relationship to wb_root_info further solidify its unique role among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use context: buyers ask about listing omissions, and seller answers are often the only public statement. It names an alternative (wb_reviews) and contrasts them. It also gives a clear prerequisite: 'resolve the root id via wb_root_info first' because passing an nmId returns an empty pool. The answered_only parameter guidance ('Unanswered questions carry no product information') tells the user when to use it.
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_idARead-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.
Return Format
WbReviewsResponse: {imt_id, sort, pool_size, feedback_count, valuation, valuation_distribution, feedbacks, host_used, meta}. Review items carry rating, text, pros, cons, user, date. An empty pool is NOT an error — it returns a healthy response with zero feedbacks.
Error Format
ToolError: BadRequestError on a bad limit or sort; ParserDriftError when a 200 body has no feedbacks list; TransportDownError when every review host fails and on unexpected internal errors.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | "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 |
| limit | No | Max review texts to return (1..100). Counts always full. | |
| imt_id | Yes | Root ID (imt_id) from wb_root_info. All product variants share one review pool indexed by imt_id, NOT by nmId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| sort | No | |
| imt_id | No | |
| feedbacks | No | |
| host_used | No | |
| pool_size | No | |
| valuation | No | |
| feedback_count | No | |
| valuation_distribution | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description reveals important non-obvious behaviors: the fixed ~1000-review pool, that server-side order params are ignored (verified Nov 2026), and that sort is applied client-side. It also discloses that an empty pool is not an error and details error types (BadRequestError, ParserDriftError, TransportDownError). This is substantial added behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for main description, return format, and error format. It is dense but every sentence provides useful information: the pool limitation, the sort caveat, the empty-pool behavior, and error handling. It stays within reasonable length and is front-loaded with the core purpose, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to exhaustively list return fields, but it still summarizes the key fields and covers critical edge cases (empty pool not an error). It also explains error semantics and the source of the required id. For a tool with these annotations and schema richness, the description is fully complete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the 'why' behind sort behavior: the endpoint ignores server-side order params, making the client-side reordering meaningful. It also reinforces the imt_id vs nmId distinction for the required parameter. This deepens understanding beyond the schema descriptions, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear imperative 'Fetch reviews by imt_id', specifying the resource (reviews), the identifier (imt_id), and explicitly distinguishes from siblings by noting 'All product variants share one review pool, indexed by imt_id NOT nmId.' This disambiguates from wb_card and wb_root_info that use nmId, giving strong purpose clarity with a specific verb+resource+scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: it tells users to obtain imt_id from wb_root_info, warns against using nmId, and explains the 'worst' sort for surfacing complaints. However, it does not explicitly name alternative tools (e.g., wb_questions) or state when-not-to-use conditions, stopping short of full exclusionary guidance. The prerequisite and sort usage are clear, so it earns a 4.
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)ARead-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.
Return Format
WbRootInfoResponse: {imt_id, subj_name, subj_root_name, colors, compositions, options, host_used, meta}. imt_id is the root product id shared by every variant — wb_reviews is indexed by it, not by nmId.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| nm_id | Yes | nmId (positive integer). The SKU whose basket CDN card.json is fetched for imt_id resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| colors | No | |
| imt_id | No | |
| options | No | |
| host_used | No | |
| subj_name | No | |
| compositions | No | |
| subj_root_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds useful behavioral context: error format (ToolError with JSON message and retryable flag), validation/transport failure handling, and details about the response structure. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and uses clear section headers (Return Format, Error Format), but it repeats the imt_id concept multiple times: 'Returns imt_id', 'All variants of one product share imt_id', and 'imt_id is the root product id shared by every variant'. This redundancy could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description is complete: it explains the return format (WbRootInfoResponse fields), error format, the relationship to wb_reviews, and the purpose of imt_id. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage, describing nm_id as 'nmId (positive integer). The SKU whose basket CDN card.json is fetched for imt_id resolution.' The description does not add additional parameter semantics beyond this, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch full card metadata from basket CDN') and the specific resource/outcome ('Returns imt_id (root_id) for review pool'). It distinguishes from sibling tools by explicitly noting that reviews are indexed by imt_id, not nmId, and referencing wb_reviews.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is provided: the description explains that reviews are indexed by imt_id rather than nmId, implying this tool should be used to resolve imt_id before querying wb_reviews. However, it does not explicitly name alternative tools or provide when-not-to-use exclusions, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_searchWB Catalog SearchARead-onlyIdempotent
Search WB catalog by text query.
Uses the lightweight search-goods.wildberries.ru/search endpoint which
returns just product IDs (no PoW protection, very high rate limit). Then
enriches via wb_card for full details.
Return Format
WbSearchResponse: {query, page, page_size, total_ids, count, items, meta}, with items in the same shape as wb_card. Zero matches — or a page past the end — returns WbNoResultsResponse {status: "no_results", query, page, total_ids} instead. That is NOT an error.
Error Format
ToolError: BadRequestError on a page outside 1..20; RateLimitedError on HTTP 429 from the v9 search endpoint; TransportDownError on unexpected internal errors. Plain transport failures of both search paths degrade to a no_results response rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | No | Region ID. Default -1257786 (Moscow). Required for valid prices/stocks. | -1257786 |
| page | No | Page number 1..20 (each page returns ~30 IDs from the long list). | |
| query | Yes | Russian text search query for the WB catalog. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds significant context beyond that: it explains the two-stage process (ID search then enrichment), error semantics (BadRequestError, RateLimitedError, TransportDownError), and that transport failures degrade to no_results. This is substantial behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with headers for purpose, return format, and error format. Each sentence earns its place, and it is front-loaded with a one-sentence summary. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This search tool has a two-step implementation, pagination, and distinct response/error types. The description covers purpose, implementation details, return format (including the no-results case), and error behavior. It is complete for the tool's complexity, especially with output schema and annotations present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter (dest, page, query) already has a clear description in the schema. The tool description does not add new parameter semantics, so baseline 3 is appropriate given that the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search WB catalog by text query' with a specific verb and resource, and distinguishes itself from siblings like wb_card (product detail) and wb_category_products (category navigation). The mention of using a lightweight endpoint and enriching via wb_card reinforces its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context for text searching the WB catalog, including pagination behavior and no-results handling. However, it does not explicitly name alternatives or state when not to use the tool, unlike the calibration example that names search_calls_extensive.
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 InfoARead-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.
Return Format
WbSellerResponse: {supplier_id, name, full_name, trademark, inn, kpp, ogrn, legal_address, taxpayer_code, foreign_codes, host_used, meta}. foreign_codes carries non-RU registration codes (unp/bin/unn) for EAEU sellers.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| supplier_id | Yes | WB supplier id (positive integer). Get it from wb_card's supplier_id field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| inn | No | |
| kpp | No | |
| meta | No | |
| name | No | |
| ogrn | No | |
| full_name | No | |
| host_used | No | |
| trademark | No | |
| supplier_id | No | |
| foreign_codes | No | |
| legal_address | No | |
| taxpayer_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by detailing the return format (WbSellerResponse fields, foreign_codes for EAEU sellers) and error behavior (ToolError with retryable flag). This provides rich context about what the tool returns and how failures are surfaced, which is not inferred from readOnlyHint or idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a clear main sentence, a brief rationale, the chain instruction, and then dedicated sections for return and error formats. Each element adds value, and the information is front-loaded with the core purpose. No redundant or irrelevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter), the description is fully complete. It covers the entire workflow: when to use it (chain from wb_card), what the returned data includes, and how errors are reported. The existing annotations and output schema cover safety and structure, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a full description for supplier_id: 'WB supplier id (positive integer). Get it from wb_card's supplier_id field.' The description's chaining note essentially repeats this, adding no new semantic meaning beyond emphasizing the source. With 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up the registered legal entity behind a WB seller.' It uses a specific verb ('look up') and resource, and distinguishes itself from siblings by focusing on the legal entity rather than product/category/search data. The examples of distinguishing official stores from resellers further clarify the unique value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: 'Chain from wb_card: its supplier_id field feeds straight into this tool.' This explains when to use it (after wb_card) and what it's for (identifying the legal entity behind a seller). However, it does not explicitly state when NOT to use it or compare it to alternatives like wb_root_info, so it falls short of a 5.
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 CardARead-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.
Return Format
YandexCardResponse: {product_id, sku_id, title, brand, seller, description, image, price_rub, price_with_plus, price_before_discount_rub, discount_percent, currency, offers_count, rating, rating_count, review_count, rating_stars, reviews, url, meta}. price_rub is None when the page has no usable price — never 0. Review items carry author, rating, date, pros, cons, comment, votes_up, votes_down, photos.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Numeric Yandex Market product id — take it from yandex_search results. | |
| include_reviews | No | Include the server-rendered reviews (first ~13). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| meta | No | |
| brand | No | |
| image | No | |
| title | No | |
| rating | No | |
| seller | No | |
| sku_id | No | |
| reviews | No | |
| currency | No | |
| price_rub | No | |
| product_id | No | |
| description | No | |
| offers_count | No | |
| rating_count | No | |
| rating_stars | No | |
| review_count | No | |
| price_with_plus | No | |
| discount_percent | No | |
| price_before_discount_rub | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses valuable behavioral traits: reviews are capped at ~13 server-side, the remainder load via an API deliberately not touched, price_rub is None when unavailable (never 0), and errors raise ToolError with retryability info. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (Return Format, Error Format) and front-loaded purpose. The uniqueness pitch adds a bit of promotional framing and the return field list is lengthy, but each section provides practical value; could be tightened slightly without losing essential details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, unique value, limitations (review cap), null semantics, error handling, and return format. Combined with rich annotations and an output schema, the agent has all necessary context 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described. The description enriches include_reviews semantics by explaining the ~13 review cap and that the remaining reviews are deliberately not loaded via a secondary API, clarifying what the parameter actually controls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch full detail for a Yandex Market product: prices, rating breakdown, reviews' – a clear verb+resource+scope. It distinguishes from siblings by highlighting unique data (star distribution, reviews included in one request) and notes these are 'hard to get anywhere else,' making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use (full detail, reviews, star distribution) and implies integration with yandex_search via the product_id parameter description ('take it from yandex_search results'). Does not explicitly name alternatives or exclusions, but the platform-specific name and sibling context make the intended use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_searchYandex Market SearchARead-onlyIdempotent
Search Yandex Market and return products with both prices, ratings and sellers.
Yandex Market aggregates many sellers per product, which makes it the best single source for "what does this cost right now" across the Russian market — including goods Wildberries and Ozon do not carry.
Each result reports price_rub (what anyone pays) and price_with_plus
(requires a Yandex Plus subscription, typically 25-30% lower). Prefer
price_rub when quoting a price to a person.
Note rating_count counts star ratings, not written reviews; the written
count is available per product via yandex_card.
Return Format
YandexSearchResponse: {query, page, page_count, total_available, has_next_page, returned, items, meta}. Items carry product_id, sku_id, title, brand, seller, price_rub (everyday — None when absent, never 0), price_with_plus, price_old_rub, currency, rating, rating_count, in_stock, is_express, url, image. Zero results is NOT an error — it is reported via meta.warnings.
Error Format
On validation or transport/parse failure, raises ToolError with a JSON message describing the error code and whether it is retryable.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. | |
| limit | No | Maximum products to return from the page. | |
| query | Yes | Free-text search query in Russian, e.g. 'iphone 15' or 'стиральная машина узкая'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| page | No | |
| items | No | |
| query | No | |
| returned | No | |
| page_count | No | |
| has_next_page | No | |
| total_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring readOnly/openWorld/idempotent behavior, the description richly discloses real behavioral traits: price_with_plus requires a Yandex Plus subscription, rating_count counts star ratings not reviews, zero results is not an error, and errors are JSON ToolError messages with retryability. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then uses clear sections for return format and error format. Every paragraph contributes meaningful operational details, and the length is justified by the complexity of pricing and result semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with output schema, this description is exceptionally complete: it covers price types, subscription caveats, rating semantics, pagination fields, zero-result behavior, and error handling. An agent has all the context needed to invoke and interpret results without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the baseline is 3. The description adds some context around result pricing semantics but does not materially extend parameter-level meaning beyond the schema's query/page/limit documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Search Yandex Market and return products with both prices, ratings and sellers'), clearly distinguishing it from sibling search tools like ozon_search and wb_search. The scope is unambiguous and the tool's role in the marketplace family is evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames Yandex Market as the best source for current pricing across the Russian market, including items Wildberries/Ozon do not carry, which guides selection vs alternatives. It also advises preferring price_rub when quoting to a person and directs users to yandex_card for written review counts, providing concrete when-to-use guidance.
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.
2 tool updates
v1.6.0- Added
aliexpress_card - Added
aliexpress_search
34 tool updates
v1.5.1- First observed
avito_card - First observed
avito_search - First observed
avito_seller - First observed
citilink_card - First observed
citilink_search - First observed
compare_prices - First observed
compare_sources - First observed
detmir_card - First observed
detmir_categories - First observed
detmir_category - First observed
dns_card - First observed
dns_search - First observed
lamoda_card - First observed
lamoda_search - First observed
marketplace_sources - First observed
megamarket_card - First observed
megamarket_search - First observed
mpstats_item - First observed
mpstats_warehouses - First observed
ozon_card - First observed
ozon_reviews - First observed
ozon_search - First observed
taobao_card - First observed
taobao_search - First observed
wb_card - First observed
wb_categories - First observed
wb_category_products - First observed
wb_questions - First observed
wb_reviews - First observed
wb_root_info - First observed
wb_search - First observed
wb_seller - First observed
yandex_card - First observed
yandex_search
TDQS
Most tools are clearly source-specific (e.g., ozon_search vs wb_search), but several pairs are easy to confuse: detmir_category vs detmir_categories (list products vs browse tree) and marketplace_sources vs compare_sources (both report source availability). wb_root_info and wb_card also overlap in fetching product metadata. The detailed descriptions rescue most ambiguity, but an agent could mis-select under time pressure.
The dominant pattern is {source}_{operation} (search, card, seller, categories), with clear prefixes like wb_, ozon_, yandex_. Minor deviations include detmir_category vs detmir_categories (singular/plural confusion) and wb_root_info (a noun phrase not matching the verb-like pattern). Overall, the naming is predictable and readable.
34 tools is above the 25 threshold, but the multi-marketplace scope justifies many symmetric search/card pairs. The toolkit feels intentionally comprehensive rather than bloated, yet the sheer number could overwhelm an agent, especially with near-duplicate patterns across nine sources. It is borderline between 'too many' and 'well-scoped for a broad domain'.
For a read-only marketplace data server, the surface is remarkably complete: search, card details, reviews (WB/Ozon/Yandex), seller reputation (Avito), category browsing (WB/Detmir), analytics (MPStats), and cross-marketplace price comparison. The only gaps are niche (e.g., Ozon categories, Taobao seller) and do not create dead ends for common queries.
Maintenance
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
MCP server for ua_e_commerce_price_tracker_mcp
Google Shopping products, prices, sellers, and deals as structured data via a hosted MCP server.
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
MCP server for IT hardware parts research: normalize PNs, search listings, get subs/comps.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server for retrieving Wildberries product reviews and formatting them as JSON for LLM analysis.1-
- FlicenseNot gradedqualityCmaintenanceMCP server that turns Wildberries marketplace into a toolkit for LLM agents, enabling product search, detailed card inspection, price history, reviews, and cross-product comparison.-
- AlicenseDqualityBmaintenanceEnables product search and price comparison across Ozon and Yandex Market via a read-only MCP server, returning normalized data with source URLs.6MIT
- AlicenseAqualityCmaintenanceEnables querying and comparing prices, availability, ratings, reviews, and seller details from major Russian and Chinese marketplaces (Wildberries, Ozon, Yandex Market, and others) without requiring API keys, via a unified MCP interface.424MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Vladimir-Human/ru-marketplace-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server