Kettu Marketplace Intelligence
Provides tools for searching and retrieving product cards from Taobao, including prices in yuan, using a Chrome browser session.
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., "@Kettu Marketplace Intelligencecompare prices for iPhone 15 on 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.
Kettu Marketplace Intelligence
Kettu Marketplace Intelligence — MCP-серверы для российских и китайских маркетплейсов. Цены, наличие, рейтинги, отзывы и реквизиты продавцов с Wildberries, Ozon, Яндекс Маркета, Детского мира, Авито, Taobao, Мегамаркета, Lamoda, DNS и Ситилинка. Плюс сравнение цен по всем источникам одним вызовом.
Только чтение. Ключи API, токены и регистрация не нужны — площадки с жёстким анти-ботом читаются через ваш собственный Chrome.
English version below · Архитектура · Как добавить источник · Про анти-бот
Что внутри
Сервер | Инструментов | Что нужно, чтобы читалось | Что умеет |
Wildberries | 9 | анонимный HTTP | Поиск, карточки, отзывы, вопросы о товаре, реквизиты продавца, каталог и товары категории |
Яндекс Маркет | 3 | анонимный HTTP | Цены разных продавцов, разбивка оценок по звёздам, отзывы |
Детский мир | 4 | анонимный HTTP | Детские товары, наличие в офлайн-магазинах, категории |
Ozon | 4 | ваш Chrome; с домашнего IP часто и без него | Поиск, карточки, отзывы |
Авито | 4 | ваш Chrome + российский домашний IP и запросы вразрядку — иначе блок по IP | Поиск объявлений, карточки, репутация продавца |
Taobao | 3 | ваш Chrome с активным входом в Taobao | Поиск и карточки, цены в юанях |
Мегамаркет | 3 | ваш Chrome с активным входом — анонимной сессии API отдаёт пусто | Поиск и карточки через мобильный API |
Lamoda | 3 | карточки анонимно (GraphQL), поиск — ваш Chrome | Поиск, карточки с размерами |
DNS | 3 | ваш Chrome (Qrator) | Поиск и карточки электроники |
Ситилинк | 3 | ваш Chrome (Qrator) | Поиск и карточки электроники |
Сравнение | 2 | опрашивает всё перечисленное | «Где дешевле?» одним вызовом |
Читается анонимно, без браузера: Wildberries, Яндекс Маркет, Детский мир и
карточки Lamoda. Остальным нужен ваш залогиненный Chrome (CDP). Taobao и
Мегамаркет вдобавок требуют активного входа в саму площадку — без него Taobao
упирается в стену логина, а Мегамаркет отдаёт пустой ответ. Авито ещё и блокирует
по IP: с датацентрового адреса это глухой отказ, с российского домашнего — работает,
если не частить запросами. Запросы к CDP-источникам идут вразрядку: очередь
подряд без пауз роняет их (DNS и Taobao в проверке так и деградировали), поэтому
коннекторы держат паузу между вызовами сами. Точное состояние из вашей сессии
покажет *_selfcheck.
Всего 41 инструмент в 11 серверах на общем рантайме mcp-core. Плюс объединённый
marketplace-mcp, который монтирует всё разом — одна запись в конфиге клиента
вместо одиннадцати. Он добавляет свой инструмент marketplace_sources (какие коннекторы
поднялись, а какие отвалились и почему), так что в нём 42 инструмента: 41
смонтированный плюс этот.
Related MCP server: wildberries-mcp
Быстрый старт
Нужны Python 3.12+ и uv.
git clone https://github.com/neuratechcompany-ops/kettu-marketplace-mcp.git
cd kettu-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 822 офлайн-теста, сеть не нужнаПроверка живого эндпоинта:
uv run python -c "
import asyncio
from wb_connector.server import wb_selfcheck
print(asyncio.run(wb_selfcheck()).status) # ждём success
"Подключение к MCP-клиенту
Каждый сервер — консольная команда, поэтому пути в конфиге не зашиваются.
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Проще всего подключить одну запись — объединённый сервер монтирует все
источники разом, а имена инструментов (wb_search, avito_seller, …) не
меняются:
{
"mcpServers": {
"marketplace": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "marketplace-mcp"]
}
}
}Если нужны отдельные серверы, marketplace-mcp install claude напечатает
готовый блок для вставки. Путь к вашему checkout там уже подставлен: заглушку
/path/to/kettu-marketplace-mcp править руками не придётся. При установке из wheel
вместо путей печатаются консольные команды на PATH. Неизвестное имя клиента
(допустимы claude, claude-code, cursor) команда отклоняет с пояснением и
кодом возврата 2 — молча подставить блок для Claude она не может. Минимальный
вариант вручную:
{
"mcpServers": {
"wildberries": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "wb-mcp"]
},
"ozon": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "ozon-mcp"]
},
"compare-prices": {
"command": "uv",
"args": ["run", "--directory", "C:/путь/к/kettu-marketplace-mcp", "compare-mcp"]
}
}
}Путь пишите с прямыми слешами / или двойными обратными \\. Полный список
команд — wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, avito-mcp,
taobao-mcp, megamarket-mcp, lamoda-mcp, dns-mcp, citilink-mcp,
compare-mcp, marketplace-mcp.
claude mcp add wildberries -- uv run --directory /путь/к/kettu-marketplace-mcp wb-mcp
claude mcp add yandex-market -- uv run --directory /путь/к/kettu-marketplace-mcp yandex-mcp
claude mcp add detsky-mir -- uv run --directory /путь/к/kettu-marketplace-mcp detmir-mcp
claude mcp add ozon -- uv run --directory /путь/к/kettu-marketplace-mcp ozon-mcp
claude mcp add compare-prices -- uv run --directory /путь/к/kettu-marketplace-mcp compare-mcp{
"mcpServers": {
"compare-prices": {
"command": "uv",
"args": ["run", "--directory", "/путь/к/kettu-marketplace-mcp", "compare-mcp"]
}
}
}Запустите uv run --directory /путь/к/репозиторию <команда>, где команда — одна из
wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, compare-mcp. Серверы говорят по
JSON-RPC через stdin и stdout, диагностику пишут в stderr.
После подключения перезапустите клиент и попросите агента вызвать wb_selfcheck. Он
проверит все семейства эндпоинтов и ответит success, drift_detected или
inconclusive.
Инструменты
Wildberries — wb_*
Инструмент | Что делает |
| Поиск по тексту, до 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 первый уровень обычно работает, и браузер не нужен.
Авито — 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 ходят семь источников — эти плюс Ozon и Авито, где Chrome лишь
запасной уровень: их tier 1 обычно отвечает, а браузер включается, когда анонимный
уровень упёрся в челлендж. Проверка *_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: … с числом исключённых предложений и
причиной. Конвертировать здесь значило бы зашить курс, который молча устареет, —
пересчёт за вами.
Навыки для агента
У каждого коннектора — свой навык в skills/, двенадцать штук на двенадцать
серверов. Навык это не пересказ 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_, TAOBAO_ и LAMODA_. У Мегамаркета, DNS и Ситилинка своего нет:
их трафик идёт через ваш Chrome, а его egress — дело настроек браузера. Кэшируются
только удачные ответы: запомнить сбой значило бы растянуть секундную помеху на весь
TTL.
У Ozon прокси применяется к первому уровню. Второй идёт через ваш собственный Chrome, и его трафик — дело настроек этого браузера.
Секретов в проекте нет вообще. Нечего настраивать, нечему утечь.
Разработка
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 822 офлайн-теста
uv run pytest -q -m "not live" # то, что гоняет CI
uv run pytest -q -m "not live" --cov # покрытие, порог 70% в CI
uv run ruff check . && uv run ruff format --check .
uv run mypy # что проверять — в [tool.mypy] files
uv run mypy --platform win32 # ловит ошибки, видимые только на Windows
uv run python scripts/check_no_print.py # запись в stdout ломает JSON-RPC
uv run python scripts/check_versions.py # одна версия во всех 55 местахЧасть тестов прогоняет настоящий JS-экстрактор коннектора по снятой разметке и проверяет результат против цен, которые в тот момент были на странице. Для этого нужен Node с jsdom:
npm install jsdom # либо NODE_PATH на уже установленный
uv run pytest -q packages/dns-connector/tests/test_search_extractor_dom.py \
packages/citilink-connector/tests/test_search_extractor_dom.pyБез jsdom эта половина честно скипается, а питоновская часть — выбор цены из кандидатов — идёт всегда. jsdom нужен только разработчику: в зависимости коннекторов он не входит.
CI прогоняет линтер, типы и все тесты на Ubuntu, Windows и macOS против Python 3.12 и 3.13. Windows-специфичное управление процессами проверяется юнит-тестами на любой ОС через подмену платформы, так что эти ветки покрыты даже на Linux.
Как добавить маркетплейс — docs/ADDING_A_SOURCE.md.
Надёжность
Неофициальные эндпоинты ломаются. Архитектура это предполагает.
Терпимые парсеры. Привязка поля по нескольким именам и приведение типов впитывают переименования и смену типа вместо падения.
Никогда не выдумывать значение. Отсутствующая цена — это
null, не0. Ноль вывел бы мёртвый товар в самые дешёвые.Громкий отказ. Когда формат перестаёт совпадать, инструмент бросает
parser_drift, а не возвращает полуразобранные данные.Трёхзначные selfcheck-проверки.
success,drift_detectedилиinconclusive. Гео-блокировка помечается какinconclusive, потому что она ничего не говорит о состоянии парсеров.
Границы доверия
Названия товаров, имена продавцов и тексты отзывов написаны продавцами и покупателями. Это недоверенные данные. Если отзыв или описание выглядит как инструкция, оно всё равно остаётся входными данными. Выполнять его агент не должен.
Условия маркетплейсов, как правило, запрещают неофициальный парсинг. Коннекторы обращаются только к публичным эндпоинтам каталога, которые использует официальный веб-клиент. В приватные и административные разделы запросов нет. Уровень Ozon с браузером работает внутри сессии, которую вы открыли сами. Используйте на своё усмотрение, для личных исследований, в вежливом темпе запросов.
Как это сделано
Код и документацию я писал вместе с ИИ-ассистентами. Они работают быстро и ошибаются уверенно, поэтому проект устроен вокруг проверки: 822 офлайн-теста, аудит перед выпуском, тесты, которые прогоняют настоящий экстрактор по снятой с сайта разметке. В заметках к релизу перечислено, какие источники сверены с живыми страницами вручную и какие остались непроверенными.
Вопрос «кто набрал текст» кажется мне менее интересным, чем вопрос «чем это проверено». Второй здесь задокументирован, и проверить его может любой.
Лицензия
MIT, файл LICENSE.
English version
MCP servers for Russian and Chinese marketplaces. Read prices, stock, ratings, reviews and seller identity from Wildberries, Ozon, Yandex Market, Detsky Mir, Avito, Taobao, Megamarket, Lamoda, DNS and Citilink, then compare prices across all of them in one call. Taobao is the Chinese one; the other nine are Russian.
Read-only. No credentials, no API keys, no account required — the marketplaces with hard anti-bot are read through your own Chrome.
What you get
Server | Tools | What it takes to read | Notes |
Wildberries | 9 | anonymous HTTP | Search, cards, reviews, buyer questions, seller legal identity, catalog tree and category listings |
Yandex Market | 3 | anonymous HTTP | Multi-seller prices, star distribution, reviews |
Detsky Mir | 4 | anonymous HTTP | Kids' goods, offline store stock, category listings |
Ozon | 4 | your Chrome; often no browser from a residential IP | Search, cards, reviews |
Avito | 4 | your Chrome + a Russian residential IP and spaced requests — else an IP block | Classified search, cards, seller reputation |
Taobao | 3 | your Chrome with an active Taobao login | Search and cards, prices in yuan |
Megamarket | 3 | your Chrome with an active login — an anonymous session reads empty | Search and cards via the mobile API |
Lamoda | 3 | cards anonymous (GraphQL), search via your Chrome | Search, cards with sizes |
DNS | 3 | your Chrome (Qrator) | Electronics search and cards |
Citilink | 3 | your Chrome (Qrator) | Electronics search and cards |
Compare | 2 | aggregates the above | "Where is this cheapest?" in one call |
Anonymous, no browser: Wildberries, Yandex Market, Detsky Mir and Lamoda cards.
The rest need your logged-in Chrome (CDP). Taobao and Megamarket additionally need
you signed into the marketplace itself — without it Taobao hits a login wall and
Megamarket returns an empty result. Avito also blocks by IP: from a datacenter
address it is a flat refusal, from a Russian residential one it works as long as
you do not burst requests. Requests to the CDP sources are paced apart — a run of
back-to-back calls degrades them (DNS and Taobao both dropped that way in testing),
so the connectors hold a gap between calls themselves. Run *_selfcheck from your
own session for the current state.
41 tools across 11 stdio MCP servers, sharing one runtime (mcp-core), plus the
unified marketplace-mcp that mounts them all under one client entry. It adds its
own marketplace_sources tool — which connectors mounted, and which dropped out and
why — so it exposes 42 tools: the 41 mounted plus that one. stdio is the default;
HTTP transport is opt-in for remote deployment — see
docs/DEPLOYMENT.md.
Quickstart
Requires Python 3.12+ and uv.
git clone https://github.com/neuratechcompany-ops/kettu-marketplace-mcp.git
cd kettu-marketplace-mcp
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 822 offline tests, no network neededClient configuration mirrors the Russian section above. Each server is a console
script (wb-mcp, ozon-mcp, yandex-mcp, detmir-mcp, compare-mcp) launched
through uv run --directory /path/to/repo <script>. marketplace-mcp install [claude|claude-code|cursor] prints the block with your checkout's real path filled
in — no placeholder to hand-edit — or the console-script paths on PATH when installed
as a wheel; an unknown client name is rejected.
After connecting, ask your agent to run wb_selfcheck. It probes every endpoint
family and reports success, drift_detected, or inconclusive.
The tools
Wildberries — wb_*
Tool | What it does |
| 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 |
| Drift canary |
wb_seller answers the question a listing hides: who actually ships this? It returns
the registered legal entity and tax ids, which is how you distinguish an official
brand store from a reseller trading under a lookalike name.
wb_questions covers a different gap. Reviews describe what owning the product is
like; questions clarify what it actually is — "10A or 16A?", "is the cable
included?" — and the seller's reply is often the only public statement of that fact.
One pool per imt_id, shared across every variant.
wb_category_products closes the loop wb_categories opens: that tool hands back
WB's shard and query, and this one fetches the products behind them. Items use
the same shape as wb_search, so a category walk and a text search are directly
comparable. Several of WB's largest sections carry the shard blackhole and have no
feed at all; the tool says so instead of returning an empty list.
Yandex Market — yandex_*
Tool | What it does |
| Search with both prices, ratings, sellers |
| Full detail plus star breakdown and reviews |
| Drift canary |
Two prices, always. price_rub is what anyone pays. price_with_plus needs a
paid Yandex Plus subscription and runs 25–30% lower. Yandex leads with the subscriber
price, so quoting it uncritically misstates the real cost.
rating_stars gives the distribution, for example {1: 10, 2: 3, 3: 10, 4: 19, 5: 502}.
That reveals whether a 4.8 average is earned or hides a cluster of complaints.
Detsky Mir — detmir_*
Tool | What it does |
| Catalog tree, start here |
| Products in a category, with real totals |
| Price, rating, online and offline store stock |
| Drift canary |
Region is per call. Prices and especially offline availability swing by city —
one item sat in 152 Moscow stores, 37 in St Petersburg, 2 in Khabarovsk. The
region parameter overrides DETMIR_REGION, so one session can compare cities.
There is no text search, deliberately. Detsky Mir's API silently ignores every text filter and returns its entire 300k-item catalog; the website's search route answers 404 and renders a promo carousel. A search tool would return confidently wrong products, so discovery goes through categories instead. See docs/ANTI_BOT.md.
Ozon — ozon_*
Tool | What it does |
| Text search |
| Product detail |
| Reviews |
| Drift canary |
Ozon rejects datacenter traffic, so this connector is two-tier: TLS impersonation first, then a fetch inside your own logged-in Chrome over the DevTools Protocol when Cloudflare challenges. Nothing is stored; you log in yourself, in a browser you control. Setup: docs/CDP_SETUP.md.
From a Russian residential IP the first tier usually works and no browser is needed.
Cross-marketplace — compare_*
Tool | What it does |
| 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.
Agent skills
Every connector ships its own skill under skills/ — twelve of them for twelve
servers. A skill is not a restatement of this README: it tells the agent when to
reach for that source at all, what the source does not have, and which of its
answers should not be trusted without a second look.
Skill | Server |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_, TAOBAO_ and LAMODA_. Megamarket, DNS and Citilink have none:
their traffic goes through your own Chrome, whose egress is that browser's
configuration. Only successful reads are cached: remembering a failure would stretch
a one-second blip across the whole TTL window.
Ozon's proxy applies to tier 1. Tier 2 runs inside your own Chrome, whose egress is that browser's configuration, not ours.
No secrets exist anywhere in this project. Nothing to configure, nothing to leak.
Development
uv sync --all-packages
uv run pytest -q -m "not live and not cdp" # 822 offline tests
uv run pytest -q -m "not live" # what CI runs
uv run pytest -q -m "not live" --cov # coverage, CI enforces a 70% floor
uv run ruff check . && uv run ruff format --check .
uv run mypy # the tree lives in [tool.mypy] files
uv run mypy --platform win32 # catches Windows-only type errors
uv run python scripts/check_no_print.py # a print() breaks JSON-RPC
uv run python scripts/check_versions.py # one version across all 55 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.
How this was built
I wrote the code and the documentation with AI assistants. They are fast and they are confidently wrong, so the project is arranged around verification: 822 offline tests, an audit before the release, tests that run the real extractor against markup captured from the live site. The release notes say which sources were compared against live pages by hand and which were left unverified.
Who typed the text seems a less interesting question than what checks it survived. The second one is documented here, and anyone can re-run it.
License
MIT, see LICENSE.
Available Tools
42 toolsavito_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 | Canonical avito.ru listing URL. |
| _meta | No | Validation metadata. |
| title | No | Listing title. |
| views | No | Total view count. |
| images | No | Number of images attached. |
| seller | No | Seller info. |
| status | No | Response status: success or error. |
| item_id | No | Avito item id. |
| location | No | Item location string. |
| posted_at | No | Publication time as reported by Avito. |
| price_rub | No | Price in rubles; None when the listing has no price. |
| tier_used | No | Fetch tier used. |
| description | No | Listing description text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the provided annotations by documenting the return format in detail, including the important edge case that price_rub is None when no price exists and never 0. It also enumerates the full error taxonomy: BadRequestError, NotFoundError, TransportDownError, and ParserDriftError, giving the agent clear expectations about failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections for return format and error format. Every sentence carries useful information, and the most important information is front-loaded in the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with a rich output schema and detailed annotations, the description covers return semantics and error handling thoroughly. Nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the parameter description 'Item id, slug path or full avito.ru URL' already capturing the accepted formats. The description reinforces this by mentioning 'by id or URL' and adds no confusion, though it does not need to add much beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch one Avito listing by id or URL.' This clearly distinguishes the tool from sibling tools like avito_search and avito_seller, which operate on search results or seller pages rather than a single listing card.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when you already have a listing id, slug, or URL, but it does not explicitly state when to prefer this over avito_search or avito_seller. Usage context is implied rather than spelled out, so guidance is adequate but not thorough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_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 | Result page number. |
| _meta | No | Validation metadata. |
| count | No | Number of items returned on this page. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used: curl_cffi, cdp, cache. |
| location_id | No | Avito location id the search ran against. |
| total_count | No | Total matches Avito reports for the query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by revealing the internal endpoint, the exact response envelope, and the failure modes including firewall blocks, captcha/proxy guidance, and parser drift. This gives the agent useful operational behavior not derivable from annotations or the input schema.
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: a one-sentence purpose, followed by clearly labeled Return Format and Error Format sections. Every section earns its place, and the most important operational details are front-loaded.
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 annotations, full input schema, and presence of an output schema, the description covers the essential extra context: return field semantics, error conditions, and the internal-API caveat. The only notable gap is explicit alternative-tool guidance, but that is a usage-guideline concern, not a completeness failure.
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 schema fully documents query, page, category_id, and location_id. The description adds no additional parameter-level meaning, but because the schema already describes defaults, ranges, and nullability, 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 opens with a specific verb and resource: 'Search Avito listings via the internal js/items API.' This clearly differentiates it from sibling card, seller, and selfcheck tools, and the name/title reinforce the same function without ambiguity.
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 usage context is implied by the description: it is the tool for searching Avito listings, as opposed to avito_card or avito_seller. However, it never explicitly states when to prefer this tool over alternatives, when not to use it, or what would be better for retrieving a single listing or seller details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_selfcheckAvito Self-CheckARead-onlyIdempotent
Structural drift canary for Avito (tri-state: success / drift_detected / inconclusive). Runs live probes against search, card and seller endpoints.
A 403 firewall block or CDP-down is inconclusive (transport), NEVER
drift: from a datacenter IP that is the expected state. Only a reached-200
JSON body that fails the parse smoke is drift.
Return Format
AvitoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the precise drift criteria: 403 firewall blocks and CDP-down are inconclusive transport states, while only a reached-200 JSON body failing the parse smoke counts as drift. This is exactly the non-obvious behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loads the core purpose and tri-state result, with important edge-case semantics following. The return-format section is slightly redundant given an output schema exists, but it does not meaningfully bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-input read-only diagnostic with output schema and safety annotations provided, the description covers everything material: what it probes, how to interpret success, drift, and inconclusive results, and a return-format summary. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the input schema is an empty closed object, so there is no parameter semantics burden. The description does not introduce any parameter-related ambiguity; the baseline for zero-parameter tools applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: a structural drift canary for Avito that runs live probes against search, card, and seller endpoints. It also names the tri-state result, making it clearly distinguishable from data-fetching siblings like avito_search, avito_card, and avito_seller.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The selfcheck/canary framing implies when the tool should be used, and the probe targets are explicit. However, the description never directly says 'use this to verify Avito connector health instead of fetching marketplace data,' nor does it exclude scenarios or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avito_sellerAvito Seller 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 | Validation metadata. |
| seller | No | Seller info. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used. |
| active_items | No | Number of active listings the seller reports. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds concrete error behavior — empty input, 404, transport blocks, and parser drift — plus a high-level response envelope. This is useful operational context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with the core purpose front-loaded, followed by context and then return/error formats. Every section serves a clear role; the classifieds context sentence is slightly explanatory but earns its place by clarifying the tool's value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with full schema coverage, a rich output schema, and safety annotations, the description covers purpose, domain context, response shape, and error modes. Nothing essential for correct selection or invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, and the schema already describes seller_id_or_url as 'Seller id or profile URL from a card/search hit'. The description does not add parameter-specific semantics beyond framing the output as seller reputation data, so the baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch an Avito seller profile', clearly identifying the action and resource. It then explains that the seller's rating, review count, and active-listing count are the relevant reputation signal for classifieds, which distinguishes this tool from per-item review or card tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when evaluating a seller's reputation in classifieds, since there is no per-item review pool. It does not explicitly name alternative tools or state when not to use it, but the domain context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 | Canonical product URL. |
| _meta | No | Validation metadata. |
| title | No | Product title. |
| status | No | Response status: success or error. |
| price_rub | No | Price in rubles; None when absent — never 0. |
| tier_used | No | Fetch tier used (cdp). |
| product_id | No | DNS product id/slug tail. |
| is_available | No | Whether the product is sellable now. |
| old_price_rub | No | Strikethrough price in rubles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, openWorld, and non-destructive behavior, so the bar is lower. The description adds valuable context by documenting the exact return fields and three meaningful error modes: missing product id, transport/CDP/Qrator failures, and parser drift. This goes beyond what annotations alone 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 and well-structured: a one-line purpose, a return format section, and an error format section. Every section earns its place, and the most important usage information is front-loaded.
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, read-only fetch tool, the description is complete: it states what is returned, what can go wrong, and what input is expected. The presence of output schema details in the description also removes ambiguity about the response shape.
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% because product_url is fully documented with format and example. The tool description adds no new parameter-level meaning, 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 a specific verb-resource pairing: 'Fetch one Citilink product card.' The word 'one' and the resource type distinguish it clearly from sibling tools like citilink_search and the various self-check tools. An agent can immediately tell what this tool is for.
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 intended use is implied by 'Fetch one Citilink product card' and the requirement of a product_url, but the description does not explicitly state when to prefer this tool over citilink_search or other card tools. There is no direct alternative guidance or exclusion criteria.
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 | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used (cdp). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses that the search runs in the operator's Chrome via CDP, that price_rub can be None but never 0, and that failures map to TransportDownError or ParserDriftError on zero product tiles. This gives an agent concrete expectations about execution context, edge cases, and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with clear 'Return Format' and 'Error Format' sections, and each sentence adds operational value. It front-loads the core purpose before the technical 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?
Given the single parameter, strong annotations, output schema, and the included return/error format notes, the description covers everything an agent needs to invoke the tool and interpret its results. No critical gaps remain for a search 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 single query parameter is already fully described in the schema with an example ('ноутбук lenovo'), and schema coverage is 100%. The tool description adds no additional meaning about the query parameter, 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?
States the action 'Search' and the resource 'Citilink' directly, and the sibling list shows citilink_card/citilink_selfcheck, so the search-vs-detail distinction is clear. The return format with 'items[]' and 'product tiles' reinforces that this is a product-listing search, not a card lookup.
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 its usage by naming the platform and action, but it never explicitly states when to choose it over citilink_card/citilink_selfcheck or other marketplace searches. No alternatives or exclusions are provided; usage must be inferred from the tool name and sibling naming convention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citilink_selfcheckCitilink Self-CheckARead-onlyIdempotent
Structural drift canary for Citilink (tri-state). Renders one live search page in the operator's Chrome and checks tiles extract.
Qrator-blocked or CDP-down is inconclusive (transport), NEVER drift.
Only a rendered page that yields zero tiles is drift.
Return Format
CitilinkSelfcheckResponse: {status, healthy, connector, checks, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the tri-state result semantics and the critical distinction between transport-level inconclusive results and true drift. It also discloses that the tool opens a live page in the operator's Chrome and depends on CDP, which is valuable behavioral context not visible in the schema.
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 front-loaded with the core purpose, followed by essential interpretation rules and return format. Every section earns its place, and the formatting makes the key distinctions 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?
For a zero-parameter health-check tool, the description covers purpose, execution environment, result interpretation, and return format. The presence of an output schema further reduces the need to explain return fields, so the description is sufficiently complete.
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 and the schema coverage is effectively 100%, so there are no parameter semantics to explain. The description reasonably emphasizes what the tool does rather than adding parameter details, which is appropriate here.
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 identifies the tool as a structural drift canary for Citilink, with the specific action of rendering one live search page and checking whether tiles extract. This makes its function distinct from sibling search/card tools and from other marketplaces' self-checks.
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 operational context: use this as a canary for Citilink drift detection, and interpret transport failures like Qrator blocks or CDP-down as inconclusive rather than drift. It does not explicitly name alternatives or exclusions, but the self-check purpose is stated directly.
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.
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 | The query that was priced. |
| offers | No | All offers, cheapest first. Offers without a price are kept at the end. |
| cheapest | No | Lowest everyday price found. None when no marketplace returned a price. |
| complete | No | True only when every queried marketplace answered. False means the ranking is partial. |
| warnings | No | Connector-level warnings (partial data, no prices). |
| sources_ok | No | Marketplaces that answered successfully. |
| total_offers | No | Total offers across all marketplaces. |
| server_version | No | Connector version. |
| source_outcomes | No | Per-marketplace outcome, including failures — read this before trusting the ranking. |
| sources_queried | No | Marketplaces that were attempted. |
| price_spread_rub | No | Difference between the highest and lowest everyday price — how much the choice is worth. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, and the description adds substantial behavior beyond that: concurrent querying, per-source reporting, partial-result semantics when sources time out, exclusion of Yandex subscription pricing from ranking, and the guarantee that individual source failures do not raise errors. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections, a front-loaded headline, and bolded caveats for important output fields. Every paragraph adds distinct information needed for correct interpretation, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers output semantics (cheapest, price_with_subscription_rub, source_outcomes, complete), error format, loose title matching, and the concurrent behavior. The output schema can carry return-value details, so nothing critical is missing for an agent to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with 100% coverage, so the description does not need to repeat parameter details. The description focuses instead on output interpretation and ranking semantics, which is appropriate; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Price one product across every configured Russian marketplace at once.' It also differentiates from per-marketplace search siblings by naming the ranking behavior and by framing the exact question it answers: 'where is X cheapest'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly identifies when to use this tool: 'This is the tool for "where is X cheapest"'. It also contrasts with the alternative (running per-marketplace search tools one at a time) and explains that the alternative is slower and lacks ranking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_sourcesList Available 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.
| 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 establish read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds useful behavior beyond annotations: it reports installation-level availability and distinguishes connector installation issues from marketplace refusals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences. The first states the core purpose directly; the second provides actionable guidance with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity: no parameters, output schema present, and safety annotations cover side effects. The description explains what it reports, when to call it, and what distinction it makes. The only minor gap is not explicitly contrasting it with the similarly named sibling 'marketplace_sources.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there is no parameter semantics for the description to elaborate. Per the baseline for parameterless tools, this is a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete action ('Report') and a specific resource ('which marketplaces this installation can actually query'). It also distinguishes the tool's diagnostic role from the comparison tools by noting it separates a missing connector from a marketplace refusal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to call this tool: 'Call this first when a comparison comes back partial.' It also explains why that matters by naming the two distinct failure causes and noting they need 'completely different fixes.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detmir_cardDetsky Mir Product 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.
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 | Validation metadata. |
| region | No | ISO region the prices and stock apply to. |
| product | No | The requested product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal read-only, idempotent, non-destructive behavior, and the description adds valuable context beyond those: region overrides DETMIR_REGION for this call only, store_count varies dramatically by city with concrete examples, and errors are raised as ToolError with retryability info. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a front-loaded purpose statement, a context paragraph, a highlighted 'Region matters most here' section with concrete examples, and a separate error-format section. Every sentence adds useful information, and the formatting makes the most important caveat immediately visible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, an output schema present, and rich annotations, the description covers everything else an agent needs: error behavior, region-override semantics, why store_count is city-dependent, and what makes this source different from general marketplace cards. There is no significant missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds meaningful depth: it explains that region is the most impactful parameter, how it interacts with the environment default, and why store_count depends on it. The product_id semantics are already well covered by the schema's URL-pattern hint, so the description's extra region guidance earns a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch price, rating, stock and seller for one Detsky Mir product.' It clearly scopes the tool to a single Detsky Mir product and distinguishes it from sibling marketplace cards by naming the retailer and the category coverage. Even without reading the schema, an agent knows exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is valuable: 'Covers the kids-and-baby category that the general marketplaces cover unevenly' and distinguishes Detsky Mir's own stock from third-party sellers. It does not explicitly enumerate when not to use it or name alternative sibling tools, but the market-specific positioning and the 'for one product' scope make the appropriate use case reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detmir_categoriesDetsky Mir Catalog 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.
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 | Validation metadata. |
| items | No | Categories at this level. |
| parent | No | Requested parent: 'top' or the parent category id/alias. |
| region | No | ISO region the listing applies to. |
| returned | No | Number of categories returned. |
| total_available | No | Total categories at this level, when reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: there is no working text search, nodes carry alias and products_count, and failures raise ToolError with a JSON message describing error code and retryability. This gives the agent practical expectations for discovery and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose first, then usage context, then error format. Every sentence earns its place, and the markdown headers make it scannable. It is appropriately sized for a tool with this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, 100% parameter coverage, and the presence of an output schema, the description is complete. It explains the discovery workflow, what result fields to expect conceptually, and the error behavior. Nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add new semantics for limit, parent, or region beyond what the schema already provides. It reinforces that nodes carry alias and products_count, which helps contextualize results, but does not improve parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Browse the Detsky Mir catalog tree and get the aliases detmir_category needs.' It also explains the tool's distinct role as the discovery step, contrasting with direct product search which does not exist for this source. This clearly separates it from sibling tools like detmir_category and detmir_card.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: Detsky Mir has no working text search, so the way to find products is to walk the tree and list a category. It also mentions checking products_count before fetching a listing, implying the follow-up step. It could be stronger by explicitly saying 'use detmir_category after selecting a category,' but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detmir_categoryDetsky Mir Category 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.
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 | Validation metadata. |
| mode | No | How the page was obtained: 'category' or 'search'. |
| items | No | Products on this page. |
| query | No | The category alias or search text that produced this page. |
| offset | No | Offset this page starts at. |
| region | No | ISO region the prices and stock apply to. |
| returned | No | Number of items in this page. |
| category_title | No | Human-readable category name, for category listings. |
| total_available | No | Total matches upstream reports, when known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive. The description adds useful behavioral context: it's a real JSON endpoint with proper pagination and an upstream total, supports price inquiry without scraping, and documents the error format (ToolError with JSON message, error code, and retryability). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence. The secondary reliability context and error format are in clearly separated short paragraphs. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with an output schema and fully documented parameters, the description covers purpose, reliability, pagination, and error behavior. It could mention how the region parameter affects price/stock behavior, but the schema and output schema already carry most of that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for all four parameters, so the baseline of 3 applies. The description reinforces pagination and total-count behavior but doesn't add field-level meaning beyond what the schema already offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb, resource, and output: 'List products in a Detsky Mir category, with the total match count.' This clearly differentiates it from sibling detmir_categories (which lists categories) and detmir_card (which fetches a product card), and the 'unlike text search' line separates it from search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts this tool with text search and frames it as 'the reliable way to enumerate the catalog,' with proper pagination and an upstream total. It doesn't name alternative sibling tools like detmir_categories or detmir_card, but the purpose statement and title make the distinction clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detmir_selfcheckDetsky Mir SelfcheckARead-onlyIdempotent
Probe every Detsky Mir endpoint family and report a tri-state verdict.
success — everything answered with the expected shape.
drift_detected — an endpoint answered but the payload no longer parses;
the connector needs updating. inconclusive — transport or geo blocking
prevented a verdict, which says nothing about the parsers.
Run it after install and whenever results look wrong.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-endpoint-family results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| cache_stats | No | TTL cache counters for this process. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint and idempotentHint, the description defines the full tri-state contract (success, drift_detected, inconclusive) including the important caveat that inconclusive says nothing about parser health. This is valuable behavioral disclosure not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main verb and scope are front-loaded, and each sentence adds meaning: state definitions, the drift consequence, the inconclusive caveat, and when to run it. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless self-check tool with a rich output schema and safety annotations, the description fully covers purpose, result interpretation, and timing. It leaves no gap an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so there is no parameter burden for the description to carry. The baseline for a no-parameter tool is 4; no parameter details are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with 'Probe every Detsky Mir endpoint family and report a tri-state verdict,' a specific verb and resource scope that clearly distinguishes it from data-fetching siblings like detmir_card and detmir_category. The self-check role is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit run-time guidance is given: 'Run it after install and whenever results look wrong.' It does not enumerate alternatives or when-not scenarios, but the no-argument diagnostic nature and marketplace-specific naming make the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dns_cardDNS-Shop Product 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 | Canonical product URL. |
| _meta | No | Validation metadata. |
| title | No | Product title. |
| status | No | Response status: success or error. |
| price_rub | No | Price in rubles; None when absent — never 0. |
| tier_used | No | Fetch tier used (cdp). |
| product_id | No | DNS product id/slug tail. |
| is_available | No | Whether the product is sellable now. |
| old_price_rub | No | Strikethrough price in rubles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly, idempotent, and non-destructive; the description adds concrete failure modes (BadRequestError, TransportDownError, ParserDriftError) and the exact response shape, which helps an agent anticipate what happens on bad input or site changes. This exceeds the annotation-only picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: a one-line purpose followed by terse, structured Return/Error sections. It is slightly redundant with the existing output schema, but every line carries behavioral or format information, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool, the description covers the main action, return shape, and principal errors, which is sufficient given the annotations and output schema. It omits explicit usage guidance, but that is a minor gap at this simplicity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes product_url fully with format and example, giving 100% coverage. The description does not elaborate on the parameter beyond referencing product_id in the return format, so it adds no new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Fetch' with the resource 'DNS-Shop product card', and the word 'one' clarifies it targets a single product rather than a search or listing. This distinguishes it from siblings like dns_search and dns_selfcheck, and the domain prefix separates it from other marketplaces' card tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to choose this tool over alternatives; it does not mention dns_search for finding products first or dns_selfcheck for health checks. The only implied context is that it takes a product URL, which appears in the schema rather than the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dns_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 | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used (cdp). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety, but the description adds valuable behavior: it is rendered in the operator's Chrome, price_rub is None never 0, and specific error conditions (TransportDownError, ParserDriftError) are disclosed. This gives the agent realistic expectations beyond the structured 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 compact and well-organized with clear Return Format and Error Format sections. Every sentence contributes useful information, and there is no filler or repetition of the title.
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 one-parameter search tool, the description covers the return shape, key data nuances, and failure modes. It is slightly incomplete only in that it omits any usage guidance relative to siblings, but the core calling context is well covered.
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%, and the schema already documents 'query' with an example. The description adds no further parameter-level detail, so the baseline of 3 applies without needing the description to compensate.
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 immediately states 'Search DNS-Shop', giving a specific verb and resource. The title and tool name reinforce this, and the resource is clearly distinct from sibling tools like dns_card or other marketplace searches, even without explicit contrast.
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 no guidance on when to use dns_search versus alternatives such as dns_card or compare_prices. There is no mention of what types of queries are appropriate or when to prefer another tool, leaving the agent to infer usage solely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dns_selfcheckDNS-Shop Self-CheckARead-onlyIdempotent
Structural drift canary for DNS-Shop (tri-state). Renders one live search page in the operator's Chrome and checks tiles extract.
Qrator-blocked or CDP-down is inconclusive (transport), NEVER drift.
Only a rendered page that yields zero tiles is drift.
Return Format
DnsSelfcheckResponse: {status, healthy, connector, checks, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses critical runtime behavior: it uses the operator's Chrome via CDP, treats Qrator-blocked or CDP-down as inconclusive transport failures, and defines drift strictly as a rendered page yielding zero tiles. This substantially reduces the risk of misinterpreting transport errors as drift.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sections deliver the core purpose, the critical tri-state interpretation rule, and the return type with no filler. The description is front-loaded and every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool that already has an output schema and safety annotations, this description fully covers the important behavioral nuances and edge cases. Nothing essential for correct invocation or interpretation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is no parameter ambiguity for the description to clarify. The baseline of 4 is appropriate because no schema gap needs compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-noun pair ('Structural drift canary') and names the target resource ('DNS-Shop'), then concretely states what it does: renders a live search page and checks tile extraction. This makes it clearly distinct from sibling tools like dns_search and the other *_selfcheck tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes this as a drift canary for DNS-Shop, which implies monitoring/health-check usage, and it gives explicit decision rules for interpreting inconclusive vs drift. It does not explicitly name alternatives or state when not to use it, but the intended context is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lamoda_cardLamoda Product 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 | Lamoda SKU. |
| url | No | Canonical product URL. |
| _meta | No | Validation metadata. |
| brand | No | Brand name. |
| sizes | No | Per-size availability. |
| title | No | Product title. |
| status | No | Response status: success or error. |
| price_rub | No | Price in rubles; None when absent — never 0. |
| tier_used | No | Fetch tier used: graphql, cdp. |
| is_available | No | Whether the product is sellable now. |
| old_price_rub | No | Strikethrough price in rubles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds meaningful behavior beyond that: it reveals the call is anonymous and tier 1, defines clear failure modes via ToolError variants, and documents that Lamoda has no ratings. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-line purpose is front-loaded, followed by two clearly headed sections for return and error formats. Every section earns its place with diagnostic value, and there is no filler or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool, the description covers purpose, input expectations, output shape, endpoint characteristics, and failure modes. The output schema exists for detailed return fields, and annotations cover safety, so nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter sku_or_url is fully documented in the schema, including the accepted SKU format and a lamoda.ru URL example, so the description does not need to add much. It adds only the indirect hint that an input without an extractable SKU will fail with BadRequestError.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Fetch') and a concrete resource ('one Lamoda product card'), and the singular 'product card' phrasing clearly separates it from lamoda_search and lamoda_selfcheck. The mention of the anonymous GraphQL endpoint and tier 1 also makes the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the caller needs a SKU or product URL, and the note that Lamoda exposes no ratings suggests one exclusion, but it never explicitly says when to prefer this tool over lamoda_search or lamoda_selfcheck. Usage guidance is left mostly to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lamoda_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 | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used (cdp). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the additional behavioral detail is valuable: rendering in the operator's Chrome, TransportDownError on CDP/nav failures, ParserDriftError on zero SKUs, and the price_rub semantics. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose, then short Return Format and Error Format sections. Every sentence carries useful 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 with an output schema and strong annotations, the description covers the response shape and the key failure modes. It is sufficient for invocation, though the missing usage guidance is a gap captured in the usage dimension.
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 documents the only parameter, query, including length constraints and an example. The description adds no additional parameter-level semantics, so the baseline of 3 for high schema coverage 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 opens with 'Search Lamoda', a specific verb and resource, and the title/name reinforce the same scope. It does not explicitly differentiate from sibling search tools like wb_search or ozon_search, nor from lamoda_card, but the intended operation is 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?
There is no guidance on when to use lamoda_search versus lamoda_card, lamoda_selfcheck, or the other marketplace search tools. The phrase 'discovery is blocked tier 1' hints at a constraint but does not explain when this tool should be selected over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lamoda_selfcheckLamoda Self-CheckARead-onlyIdempotent
Structural drift canary for Lamoda (tri-state). Probes the GraphQL card path (tier 1) and the CDP search path (tier 2).
GraphQL down is inconclusive for the card check; CDP down / a redirect loop is inconclusive for the search check. Only a reached payload that fails its parse smoke is drift.
Return Format
LamodaSelfcheckResponse: {status, healthy, connector, checks, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent/non-destructive annotations, the description discloses how the probe classifies outcomes: tiered paths, inconclusive failure conditions, and the exact drift condition. This gives an agent important behavioral context it would otherwise have to infer. No contradiction with the annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, separating purpose, conditional behavior, and return summary into a clear structure. The 'Return Format' line is slightly redundant given an output schema exists, but it remains brief and does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-input probe with annotations covering safety and an output schema covering the response, the description supplies the non-obvious semantics: what each tier checks, when failures are inconclusive, and what actually constitutes drift. This is sufficient for an agent to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters and the schema is empty, so the description has nothing to add for parameter semantics. The zero-parameter baseline applies cleanly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description centers on a specific verb and resource: it 'Probes' Lamoda's GraphQL card path (tier 1) and CDP search path (tier 2) as a structural drift canary. This clearly distinguishes it from sibling tools like lamoda_search and lamoda_card, and from other marketplaces' selfchecks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use as a Lamoda drift/monitoring check is clear from the 'canary' framing and the enumerated probe paths. It provides strong interpretation guidance—such as GraphQL down being inconclusive and only a reached payload failing parse smoke counting as drift—though it does not explicitly name alternatives or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marketplace_sourcesWhich Marketplaces Are 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mounted | No | Sources whose tools are available in this server. |
| skipped | No | Source name mapped to the import error that removed it — usually a missing dependency. |
| mounted_count | No | How many sources mounted. |
| skipped_count | No | How many sources were skipped. |
| server_version | No | Unified server version. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations indicating a read-only, idempotent operation, the description reveals the defensive import behavior and the semantic meaning of the 'skipped' field: a missing dependency removes a marketplace rather than crashing the server, and skipped entries were never queried. This context is not derivable from the annotations and is critical for interpreting results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then uses two clearly labeled sections ('Why this exists' and 'Return Format') that each add necessary context. Every sentence serves a purpose, and the markdown structure makes it easy for an agent to scan for the key trigger and return semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only diagnostic tool with a rich output schema and safety annotations, the description covers everything an agent needs: what it lists, why missing marketplaces appear, when to invoke it, and what the skipped mapping means. No important operational detail is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so there is no parameter semantic burden on the description. With an empty input schema and 100% schema coverage, a baseline of 4 is appropriate; the description cannot and need not add parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List which connectors this unified server actually mounted.' This clearly distinguishes the tool from the sibling marketplace search/card tools, which query individual marketplaces, by focusing on what is loaded on the server. The title 'Which Marketplaces Are Loaded' reinforces the same purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this before concluding a marketplace has no results — if it is in ``skipped``, it was never queried at all.' It explains the failure mode where absent tools look identical to empty results, which tells the agent exactly when this diagnostic is needed. This is a clear, directive usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
megamarket_cardMegamarket Product 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 | Canonical product URL. |
| _meta | No | Validation metadata. |
| title | No | Product title. |
| rating | No | Average rating. |
| status | No | Response status: success or error. |
| item_id | No | Megamarket goods id. |
| price_rub | No | Price in rubles; None when absent — never 0. |
| tier_used | No | Fetch tier used (cdp). |
| is_available | No | Whether the product is sellable now. |
| rating_count | No | Review count. |
| old_price_rub | No | Strikethrough price in rubles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/idempotentHint annotations by specifying the exact response envelope (MegamarketCardResponse fields) and detailed error modes including BadRequestError, NotFoundError, TransportDownError, and ParserDriftError. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and uses clear Return Format / Error Format sections that add useful structure without redundancy. Every sentence contributes relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only card lookup, the description together with the schema and annotations is complete: it states what is returned, how failures surface, and what input is expected. Search and discovery concerns belong to sibling tools, so their absence is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single parameter with 100% coverage ('Goods id or megamarket.ru product URL'), so the description adds no additional parameter-level meaning. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Fetch one Megamarket product card.' The word 'one' clearly distinguishes this from the sibling megamarket_search tool, and the Megamarket qualifier distinguishes it from the many other marketplace card tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied rather than explicit: the tool is for fetching a single known Megamarket product card, so an agent can infer it should be used when it already has an item id or URL. However, it does not explicitly say when not to use it or direct the agent to megamarket_search for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
megamarket_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 | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used (cdp). |
| total_count | No | Total matches reported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description goes beyond them by documenting return-format quirks ('price_rub is None when absent — never 0') and specific failure modes (TransportDownError, ParserDriftError), which is genuinely useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose, followed by clearly labeled Return Format and Error Format sections. Every line earns its place, and the most important information is front-loaded.
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 with an output schema and rich annotations, the description is complete enough. It explains the response shape, critical edge cases, and failure modes without unnecessary elaboration.
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 covers the only parameter, query, with a description and an example. The tool description adds no additional parameter-level meaning, 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 a specific verb and resource: 'Search the Megamarket catalog via the mobile API.' It also gives environmental context ('inside the operator's Chrome') and the tool name clearly distinguishes it from sibling card and selfcheck tools like megamarket_card and megamarket_selfcheck.
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 usage is implied by the verb 'Search' and the catalog target, but there is no explicit when-to-use guidance, exclusions, or mention of alternative search tools such as yandex_search or wb_search. It meets the minimum viability bar but leaves selection reasoning to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
megamarket_selfcheckMegamarket Self-CheckARead-onlyIdempotent
Structural drift canary for Megamarket (tri-state). Posts one live search through CDP and checks items parse.
A ServicePipe code-7 refusal or CDP-down is inconclusive (transport),
NEVER drift. Only a reached-200 catalog body that fails the parse smoke is
drift. From a machine whose Chrome has not passed the challenge,
inconclusive is the expected verdict.
Return Format
MegamarketSelfcheckResponse: {status, healthy, connector, checks, ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that the tool performs a live CDP search, has an external transport dependency, and precisely defines the drift vs inconclusive judgment rules. It even explains environment expectations about Chrome challenge state. This is substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with its core purpose, then uses short structured lines for verdict semantics and return format. Every sentence carries diagnostic value; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-input canary tool with an output schema, the description fully explains the operation, the meaning of each verdict class, the transport-vs-drift distinction, and the expected outcome on machines with an unmet Chrome challenge. An agent has enough context to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is complete, so there is nothing for the description to add about inputs. The baseline of 4 applies for a no-parameter tool; the description correctly spends no space on parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific operation—'Posts one live search through CDP and checks items parse'—and frames it as a 'Structural drift canary for Megamarket (tri-state)' with a distinct verdict semantics. This distinguishes it from megamarket_search/megamarket_card and the other selfcheck tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use case via 'drift canary' and clarifies when the verdict should be read as inconclusive, but it never explicitly says when to call this instead of alternatives such as megamarket_search or another selfcheck. There are no when-not-to-use or alternative-routing statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_cardOzon Product 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.
| 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 | Canonical Ozon product URL. |
| _meta | No | Validation metadata. |
| price | No | Regular price in rubles. |
| title | No | Product title. |
| seller | No | Seller info. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used: curl_cffi, cdp, etc. |
| card_price | No | Ozon-card price (lowest) in rubles. |
| is_available | No | Whether the product is sellable now. |
| rating_count | No | Total review count. |
| rating_score | No | Aggregate review score. |
| price_original | No | Strikethrough original price in rubles. |
| characteristics | No | Short characteristics (max 30). |
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 meaningful behavioral context beyond these: Tier-1 attempt with curl_cffi, fallback to Chrome CDP on Cloudflare 403, and the operator prerequisite to start Chrome via the provided scripts. This helps the agent anticipate operational dependencies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose is front-loaded, and the fallback/setup details are compactly presented. Every clause adds necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values need no explanation. The description covers purpose, fetch mechanism, fallback behavior, and a critical prerequisite (Chrome CDP setup). Minor details like what happens when both tiers fail are not specified, but overall the agent has enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema description covers 100% of the single parameter, including accepted formats (SKU, URL, /product/<digits>/ path) and SSRF rejection. The tool description itself adds no parameter-level information, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a clear action and resource: 'Fetch Ozon product card data'. This distinguishes it from sibling tools like ozon_reviews and ozon_search, though it doesn't explicitly name them. The phrase 'via composer-api.bx' adds technical specificity but doesn't obscure the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to choose this tool over alternatives such as ozon_reviews or ozon_search. The fallback and setup details describe internal operation, not tool selection context. Usage context is only implicitly conveyed by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_reviewsOzon Product 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 | Canonical Ozon reviews URL. |
| sort | No | API sort key used (published_at_desc, score_desc, score_asc). |
| _meta | No | Validation metadata. |
| status | No | Response status: success or error. |
| partial | No | Whether a later-page failure degraded to partial success. |
| reviews | No | Collected review items. |
| returned | No | Number of review texts returned. |
| tier_used | No | Fetch tier used for the first page. |
| last_error | No | Last error detail on partial success. |
| stop_reason | No | Why pagination stopped: http, parse, blocked, max_pages, etc. |
| distribution | No | Star distribution: stars -> count. |
| rating_score | No | Aggregate review score. |
| pages_fetched | No | Number of pages fetched (max 10). |
| reviews_count | No | Total review count from paging or score widget. |
| requested_limit | No | The limit argument requested by the caller. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing the Tier-1/Tier-2 fallback strategy, automatic page walking, 30 reviews per page, deduplication by review UUID, a hard cap of 10 pages, and detailed partial-success semantics. It also explains exactly when errors are raised versus when failures degrade to partial results. This is exceptionally transparent and does not contradict the readOnly/idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose, transport fallback, pagination behavior, return format, and error semantics are all directly relevant to invoking the tool correctly. The use of headings and front-loaded key information keeps it navigable despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is remarkably complete. It covers input normalization, pagination, dedupe, hard limits, exact return fields, partial success conditions, and error types. The presence of an output schema further reduces the need to describe return values, so nothing important is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all three parameters at 100% coverage, so a baseline of 3 is appropriate. The description adds real value by explaining how `limit` interacts with pagination: pages are walked until `limit` texts are collected, with deduplication and a hard page cap. This gives the agent a more accurate mental model of what `limit` means in practice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Fetch Ozon product review texts + star distribution'. It clearly distinguishes itself from sibling tools like ozon_card or ozon_search by focusing on reviews plus the distribution, and it even references the same fetch path as ozon_card for technical context. An agent can understand exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use case obvious: retrieving Ozon product review texts and star distributions. It also explains pagination behavior and partial-success semantics, which guide the agent when interpreting results. However, it does not explicitly state when to choose this tool over a sibling such as ozon_card or ozon_search, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_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 | Search page number. |
| _meta | No | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Search result items (max 30). |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint), the description discloses meaningful behavior: the curl_cffi-to-CDP fallback, that zero matching items is a healthy response rather than an error, and the specific error taxonomy (BadRequestError, TransportDownError, ParserDriftError). No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
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 front-loads the core purpose before implementation details. The parser-widget detail is somewhat niche for an agent, but it is contextually relevant to explaining parser drift behavior.
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?
Combined with the input schema, annotations, and output schema, the description fully covers what the agent needs: input requirements, output shape on success, zero-result behavior, error behavior, and the fallback execution tier. There are no significant gaps for invoking 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?
Schema description coverage is 100%, so both parameters (query and page) are already documented in the input schema. The description adds no additional parameter-level semantics, such as query formatting guidance or page-specific behavior, but it does not need to because the schema carries the 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 opening sentence 'Search Ozon catalog' names a specific verb and resource, and the description further distinguishes this from sibling tools like ozon_card and ozon_reviews by stating it returns sku/title/price/rating per item. The tool's role as the Ozon search entry point 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 clearly implies the tool is for searching Ozon's catalog, and it documents the tiered execution path. However, it never explicitly states when to prefer this tool over alternatives such as ozon_card or wb_search, nor does it mention any exclusions or edge cases where another tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ozon_selfcheckOzon Self-checkARead-onlyIdempotent
Structural drift canary for Ozon (tri-state: success / drift_detected / inconclusive). Fetches live search/card/reviews + a non-default reviews sort and compares the widget-prefix SHAPE against the critical set, plus a parse smoke. Detects "a widget we depend on vanished" BEFORE it silently breaks a parser.
Tri-state (audit 2026-06-01): a Cloudflare 403 / CDP-down / non-200 / non-JSON
body is inconclusive (transport — Ozon's tier-1 curl_cffi is often blocked),
NEVER drift. Only a reached-200 JSON body missing a critical widget or failing
the parse smoke is drift. The reviews_sort subcheck exercises the
sort-param path (score_asc) that ozon_reviews pagination depends on.
Return Format
OzonSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id} — tri-state per subcheck (healthy/drift/inconclusive). Inconclusive and drift_detected are NOT errors; they are valid canary verdicts returned as a normal response.
Error Format
Raises ToolError (TransportDownError) ONLY on an unexpected internal bug that prevents the canary from producing any verdict. Transport/block/parse failures of individual sub-checks map to inconclusive entries, not errors.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint, idempotentHint, and openWorldHint annotations present, the description adds substantial behavioral detail: exact tri-state semantics, what counts as inconclusive vs drift, handling of Cloudflare 403 / CDP-down / non-200 / non-JSON, and the error contract. It also clarifies that inconclusive and drift_detected are valid normal responses, not errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section earns its place: purpose, tri-state rules, return format, and error semantics are all behaviorally relevant. The main purpose is front-loaded and the structured headings make the detailed tri-state and error contracts easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter self-check tool with an output schema and read-only/idempotent annotations, the description covers everything an agent needs: what it checks, what each verdict means, how transport failures are classified, and when an error is actually raised. No critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is no parameter meaning to add. The description incidentally clarifies that the tool fetches live data and runs internal subchecks, which is useful context beyond the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a structural drift canary for Ozon with a tri-state outcome, naming the specific resources checked (live search, card, reviews, non-default reviews sort). It distinguishes itself from sibling review/search tools by emphasizing the canary's role in detecting vanished widgets before parsers break.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that this tool is a pre-emptive drift check rather than a data-fetching tool, and even notes that the reviews_sort subcheck exercises the path on which ozon_reviews pagination depends. It doesn't explicitly list alternative tools to use instead, but the purpose and positioning against siblings are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taobao_cardTaobao Item 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.
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 | Canonical item URL. |
| _meta | No | Validation metadata. |
| sales | No | Sales label as displayed. |
| title | No | Item title (Chinese). |
| status | No | Response status: success or error. |
| item_id | No | Taobao item id. |
| price_cny | No | Price in yuan; None when hidden or variant-priced. |
| shop_name | No | Shop display name. |
| tier_used | No | Fetch tier used (cdp). |
| description_images | No | Number of images in the description block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive. The description adds meaningful behavior beyond that: price_cny may be None on hidden/variant pricing and is never 0, and it enumerates specific error types including login-wall/CDP failures and parser drift. This gives an agent realistic expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: purpose sentence first, then Return Format and Error Format sections. Every sentence carries information, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only card fetch with an output schema, the description covers purpose, return contract, price edge case, and failure modes. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents item_id_or_url as 'Item id or item.taobao.com URL'. The description adds no further parameter-level detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch one Taobao item card.' It clearly distinguishes this from sibling tools like taobao_search and taobao_selfcheck by signaling a single item-card retrieval rather than a search or health check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Fetch one' plus the item_id_or_url parameter makes the direct-lookup use case clear. It does not explicitly name alternatives or state when not to use it, but the context is strong enough that an agent can select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taobao_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 | Result page number. |
| _meta | No | Validation metadata. |
| count | No | Number of items returned on this page. |
| items | No | Search result items. |
| query | No | Search query text. |
| status | No | Response status: success or error. |
| tier_used | No | Fetch tier used (cdp). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses meaningful runtime behavior: the tool depends on Chrome/CDP, can hit a login wall requiring authentication in the scraping profile, and can fail with ParserDriftError when the DOM changes. These failure modes are valuable context for an agent deciding whether to invoke and how to react.
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 concise summary followed by clearly separated Return Format and Error Format sections. It avoids fluff, though the Return Format section is somewhat redundant given that an output schema exists.
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 two-parameter search tool, the description is complete: it states the resource, the browser rendering dependency, authentication prerequisite, output item shape, and the two key error modes. Combined with the rich annotations and full schema coverage, an agent has everything needed to invoke and troubleshoot this 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 description coverage is 100%: query is documented with examples and length constraints, and page is documented with range and default. The description adds little to parameter semantics beyond the high-level 'search Taobao listings' statement, 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 a specific verb and resource: 'Search Taobao listings'. It also clarifies the execution context ('rendered in the operator's Chrome'), which distinguishes this from simple API-style searches and from sibling tools like taobao_card or taobao_selfcheck by function and marketplace.
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 the main use case—keyword search over Taobao listings—and gives operational context via the 'rendered in the operator's Chrome' note and the login-wall retry instruction. However, it never explicitly states when to prefer taobao_search over sibling tools like taobao_card, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taobao_selfcheckTaobao Self-CheckARead-onlyIdempotent
Structural drift canary for Taobao (tri-state). Renders one live search page in the operator's Chrome and checks the extractor still finds items.
CDP down or a login wall is inconclusive (transport/session), NEVER
drift. Only a rendered page that yields zero items is drift.
Return Format
TaobaoSelfcheckResponse: {status, healthy, connector, checks, server_version, server_started_at, process_id}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations by explaining that it renders a live search page in the operator's Chrome, that CDP failures or login walls are inconclusive, and that only a rendered page yielding zero items counts as drift. It also discloses the tri-state semantics, which is critical for interpreting the tool's output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loads the core purpose and tri-state behavior. It is slightly wordy with the return format block, but every sentence provides useful information and the format is compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a zero-parameter health-check tool: it explains what the tool does, how it operates, how to interpret the tri-state result, and what the response contains. The output schema and annotations cover the remaining structured details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema describes an empty object with 100% coverage, so there are no parameter semantics for the description to add. The baseline of 4 applies here because no parameter documentation burden exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a structural drift canary for Taobao, with a specific verb ('checks'), resource ('extractor'), and tri-state outcome. It differentiates itself from sibling search/card tools by focusing on health-check behavior rather than data retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this is a monitoring/health-check tool, not a search tool, and explains when results should be classified as inconclusive versus drift. It does not explicitly name alternative tools, but the canary purpose and sibling naming pattern make the intended usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_cardWB Product 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.
| 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 | WB region ID used. |
| meta | No | Validation metadata. |
| count | No | Number of items returned. |
| items | No | Product card items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond that: prices are returned in rubles, the selected fields are explicit, and the tool supports at most 100 SKUs. It does not contradict the annotations, and the additional details help set expectations without restating annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences with no filler or redundant restatement of schema/annotation fields. The primary action and return summary are front-loaded, and every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, complete input schema, and presence of an output schema, the description covers the remaining operational facts needed to call the tool correctly: the API source, returned fields, currency, and batch limit. No critical information is missing for a read-only batch product-card lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter documentation, including the default dest value, region examples, and the 1..100 nmIds constraint. The description reinforces the 100-SKU limit and mentions ruble prices, but it does not add substantial parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('product card data from WB v4 API'), then enumerates the returned fields such as prices, brand, supplier, and ratings. This clearly distinguishes it from sibling tools like wb_search or wb_reviews by focusing on batch card lookups by nmIds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is used when you need product card data for specific up-to-100 SKUs, and the 100-SKU cap signals batching. However, it does not explicitly state when to prefer this tool over wb_search, wb_reviews, or other WB siblings, nor does it mention prerequisites like how to obtain nmIds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_categoriesWB Catalog 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.
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 | Validation metadata. |
| root | No | Requested root: 'top' or the resolved category name. |
| items | No | Category nodes at the requested root. |
| host_used | No | Static CDN host that served the menu. |
| max_depth | No | Depth limit applied to this response. |
| truncated | No | Whether the slice was cut short by node limits. |
| total_returned | No | Total nodes in the returned slice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds genuinely useful behavioral context beyond those hints: the live menu is ~800 KB, responses are always a bounded slice, and errors are raised as ToolError with a JSON message indicating retryability. This gives an agent a clear expectation for size and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with the core purpose. Every sentence contributes: the use case, the contrast with search, the shard/query relevance, the size constraint, and the error format are all useful with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and rich annotations, the description is complete for an agent to select and call the tool correctly. It covers purpose, when to use it, how to navigate the large tree, response bounding, and error behavior. No critical operational detail appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the descriptions of root and max_depth already handle parameter meaning. The tool description adds strategic context by explaining why the bounded slice exists and recommending an iterative expand-from-top approach, which makes the parameters' intended usage clearer than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Browse') and resource ('the Wildberries catalog tree'), and clarifies its role versus wb_search by noting that wb_search needs a query string while this tool lets a shopper discover categories. It also explains that nodes expose shard/query selectors for pulling a category feed, distinguishing it from feed/product tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('before searching') and contrasts it with wb_search, which needs a query string. It also advises starting at 'top' and expanding the branch of interest. However, it does not explicitly mention the sibling wb_category_products as the follow-up tool for pulling a feed, though that is implied by mentioning shard/query selectors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_category_productsWB Category Product 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.
| 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 | WB region id the prices and stock apply to. |
| meta | No | Validation metadata. |
| page | No | Page number this response covers. |
| sort | No | Upstream ordering applied. |
| count | No | Number of products on this page. |
| items | No | Products in this category page. |
| query | No | WB catalog selector used (cat=/subject=). |
| shard | No | WB catalog shard used. |
| has_more | No | Whether another page likely follows. Inferred from a full page — WB reports no total here. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, and the description adds meaningful behavioral detail: the blackhole shard means no listable feed, errors are raised rather than empty lists returned, and the response shape matches wb_search and wb_card. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and each paragraph earns its place, especially the blackhole warning. The middle narrative about humidifiers and relevance ranking is slightly expansive, but it effectively conveys why the tool matters without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, the origin of its key parameters, the comparability of its output with related tools, and the critical blackhole failure mode. With a rich output schema and strong annotations present, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all five parameters with examples and special values, including the blackhole meaning for shard and the WB selector format for query. The description reinforces that shard/query come from wb_categories, but with full schema coverage this adds only marginal parameter-level value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the products in a catalog category, using the shard and query from wb_categories.' It also clearly distinguishes itself from siblings by explaining it 'closes the loop' that wb_categories opens and that items return in the same shape as wb_search and wb_card.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly positions this tool as the follow-up to wb_categories and explains when category browsing is preferable to inventing a search phrase. It stops short of explicitly saying 'use wb_search instead for these cases', so it lacks a full when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_questionsWB Buyer Questions by imt_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.
| 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 | Validation metadata. |
| skip | No | Offset this page starts at. |
| imt_id | No | Root product id (imt_id) the questions belong to. |
| has_more | No | Whether more questions exist past this page. |
| returned | No | Number of questions in this response. |
| questions | No | Question items. |
| answered_count | No | How many of the returned questions have a seller answer. |
| total_available | No | Total questions upstream reports for this product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description discloses meaningful behavior: questions are pooled across variants by imt_id, an nmId returns an empty pool without an error, and seller answers are often the only public statement of a product fact. This helps the agent interpret empty results and choose the correct key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, and later paragraphs earn their place by explaining purpose, keying, and a common failure mode. A few illustrative examples make the description slightly longer than strictly necessary but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich output schema, full parameter coverage, and safety annotations, so the description only needs to add selection context and keying behavior. It covers the prerequisite (wb_root_info), the wrong-key failure mode, and the distinction from reviews, making it complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by emphasizing that imt_id is the root id from wb_root_info and that a wrong key produces an empty pool rather than an error. This reinforces the correct use of the imt_id parameter beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: "Fetch buyer questions and seller answers by imt_id." It also distinguishes the tool from wb_reviews by explaining that reviews describe the ownership experience while questions clarify what the product actually is, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: resolve imt_id via wb_root_info first, do not pass an nmId, and expect an empty pool if you do. It also positions the tool against wb_reviews, clarifying when questions are more useful than reviews.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_reviewsWB Reviews by imt_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.
| 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 | Validation metadata. |
| sort | No | Client-side sort applied: recent, best, or worst. |
| imt_id | No | Root product id (imt_id) the reviews belong to. |
| feedbacks | No | Review items. |
| host_used | No | Feedbacks CDN host used. |
| pool_size | No | Total reviews in the returned pool. |
| valuation | No | Overall valuation data. |
| feedback_count | No | Total feedback count from the API. |
| valuation_distribution | No | Star valuation distribution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, so the bar is lower. The description adds important behavioral details beyond annotations: the endpoint returns a fixed ~1000-review pool, is newest-first, ignores server-side order params, and applies sort client-side. This materially affects how the agent should interpret results and is exactly the kind of disclosure that helps avoid misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then provides only high-value caveats in a compact sequence. Every sentence earns its place: pool indexing, fixed 1000-review pool, server-side order being ignored, client-side sort, and the 'worst' alias for complaint discovery. There is no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description covers the remaining behavioral context an agent needs: why imt_id matters, the bounded review pool, sort semantics, and the recommended way to find complaints. Nothing essential to calling this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the conceptual relationship between imt_id and nmId, clarifying that sort operates over the fixed returned pool rather than all feedbacks, and emphasizing that 'worst' reorders by lowest rating to surface complaints. These details go beyond the schema entries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action and resource: 'Fetch reviews by imt_id'. It also names the source of the id ('root_id from wb_root_info') and distinguishes this review pool from nmId-based lookups, which separates it from sibling tools like wb_card and wb_root_info. The purpose is immediately clear and not tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use imt_id, not nmId, because all variants share one review pool; and it explains how sort behaves given the endpoint's fixed pool. It does not explicitly name alternatives or say 'use wb_questions for questions instead', but the practical context is strong enough for an agent to know when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_root_infoWB Root Info (imt_id)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.
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 | Validation metadata. |
| colors | No | Color names list. |
| imt_id | No | Root product id (imt_id) shared by all variants. |
| options | No | Product options (max 30). |
| host_used | No | Basket CDN host used. |
| subj_name | No | Subject name (mojibake-decoded). |
| compositions | No | Compositions data. |
| subj_root_name | No | Root subject name (mojibake-decoded). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond this: the data source (basket CDN), the variant-sharing semantic, the critical warning that reviews are indexed by imt_id rather than nmId, and a specific error format with retryability info. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: main action, return value, key semantic, and error behavior. The structure is front-loaded and the error format section is clearly separated with a heading. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with full schema coverage, an output schema, and safety annotations, the description is complete. It explains the purpose, the critical indexing caveat, and error handling; nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents nm_id. The description does not add extra parameter-level detail beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('full card metadata from basket CDN'), then names the key output ('imt_id (root_id) for review pool'). The statement 'Reviews indexed by imt_id, NOT by nmId' clearly differentiates this from review-indexing tools like wb_reviews.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: all variants share imt_id and reviews are indexed by imt_id, implying an agent should use this tool when it needs the imt_id before querying reviews. It does not explicitly name sibling alternatives or state 'when not to use', but the guidance is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_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.
| 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 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses concrete behavior beyond the safety annotations: the exact endpoint used, that the raw results are just product IDs, that there is no PoW protection, that rate limits are high, and that results are enriched through wb_card. This gives the agent a realistic mental model of the call before invoking it.
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?
Two sentences, front-loaded with the core purpose and followed by high-value endpoint/behavior details. No filler or repetition of schema 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?
For a read-only, idempotent search tool with a full output schema and complete parameter docs, this description covers the essential missing context: endpoint identity, response shape before enrichment, and rate-limit behavior. Nothing needed for a correct call is omitted.
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 all three parameters already carry their own documentation. The description adds no new parameter-level detail beyond reinforcing that the query is a text query, so the baseline score 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 opening sentence names a specific action and resource ('Search WB catalog by text query'), so an agent immediately knows what the tool does. The mention of the dedicated search endpoint and the subsequent wb_card enrichment clearly differentiates it from catalog-browsing and card-only sibling 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 gives useful context (lightweight endpoint, very high rate limit, returns IDs then enriches) that implies when it would be a convenient search tool, but it never explicitly states when to prefer wb_search over nearby alternatives such as wb_category_products or wb_card. Usage guidance is therefore implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_selfcheckWB Self-check (drift canary)ARead-onlyIdempotent
Structural drift canary for WB (tri-state: success / drift_detected / inconclusive). Probes EVERY endpoint family the tools depend on:
card — card.wb.ru v4 (wb_card / wb_search enrich): critical fields + price extract.
reviews — feedbacks2.wb.ru pool (wb_reviews): texts + productValuation.
search_goods— search-goods.wildberries.ru (wb_search STEP 1): the id list must still be a non-empty list of recoverable ids on a broad evergreen query, else wb_search silently returns no_results.
root_basket — basket-NN.wbbasket.ru (wb_root_info): imt_id must resolve, else wb_root_info AND wb_reviews (indexed by imt_id) break.
Tri-state (audit 2026-06-01): an http!=200 / network error / OOS baseline is
inconclusive (transport/baseline rot), NEVER drift. Only a reached-200 body
whose parser-critical anchor is gone is drift. Run on demand before trusting
a batch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-subcheck results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| healthy | No | Whether all checks are healthy. |
| connector | No | Connector name: wb. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It goes well beyond the readOnly/idempotent annotations by explaining the tri-state semantics: transport/OOS issues are inconclusive, only reached-200 bodies with missing anchors are drift. It also discloses the exact endpoint dependencies and why their failure would propagate to wb_search, wb_root_info, or wb_reviews.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The bullet-list structure is dense but every sentence earns its place: purpose, probed endpoints, dependent tools, failure interpretation, and invocation guidance. The most important tri-state result is frontloaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool takes no parameters and annotations already cover safety, the description is fully complete. It explains what is checks, how to interpret outcomes, and when to run it; an output schema can describe the technical return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the empty schema already covers parameter semantics completely. The description reinforces this by showing that the canary runs with no inputs and probes everything by itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: a 'structural drift canary' for WB with a tri-state result. It differentiates this diagnostic from functional WB tools by naming the endpoint families it probes and the dependent tools that would break on drift.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'Run on demand before trusting a batch.' It does not explicitly name alternatives or exclusions, such as the other marketplace selfchecks, but the intended trigger scenario is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wb_sellerWB Seller Legal 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.
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 | Russian taxpayer id (INN). |
| kpp | No | Tax registration reason code (KPP), RU legal entities only. |
| meta | No | Validation metadata. |
| name | No | Short trading name of the seller. |
| ogrn | No | State registration number (OGRN/OGRNIP). |
| full_name | No | Full registered legal-entity name. |
| host_used | No | Static CDN host that served the record. |
| trademark | No | Registered trademark, when the seller declares one. |
| supplier_id | No | WB supplier id (as passed in). |
| foreign_codes | No | Non-RU registration codes when present (unp=BY, bin=KZ, unn=other EAEU). |
| legal_address | No | Registered legal address. |
| taxpayer_code | No | Taxpayer code — INN for RU, national code for EAEU sellers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the operation as read-only and idempotent, and the description adds meaningful behavioral detail about error handling: it raises a ToolError with a JSON message describing the error code and retryability. It also clarifies what legal-entity data is returned, giving the agent a concrete picture of the call's result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then adds a crisp use-case ('who actually ships this?'), a workflow chaining hint, and a dedicated error-format note. Every sentence contributes information, and the overall length is appropriate for the behavioral detail it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with an output schema present, the description is complete: it covers when to call, where the parameter comes from, what is returned, and how failures surface. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the supplier_id property already documents the type, positive constraint, and source ('Get it from wb_card's supplier_id field'). The description repeats the chaining hint but adds no new parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Look up the registered legal entity behind a WB seller.' It clearly distinguishes the tool from siblings by explaining that it identifies who actually ships the product, using registered name, tax IDs, and legal address, rather than being a card, search, or review tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'Chain from wb_card: its supplier_id field feeds straight into this tool.' This tells an agent when in the workflow to invoke it. It does not explicitly list exclusions or alternative tools for the same task, which prevents a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_cardYandex Market Product 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.
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 | Canonical product page URL. |
| meta | No | Validation metadata. |
| brand | No | Brand name. |
| image | No | Primary product image URL. |
| title | No | Product title. |
| rating | No | Average rating, 1..5. |
| seller | No | Seller of the default offer. |
| sku_id | No | SKU id of the default offer. |
| reviews | No | Server-rendered reviews (first ~13 only; the rest load over a closed API). |
| currency | No | Currency code. |
| price_rub | No | Everyday price in roubles, without a subscription. |
| product_id | No | Yandex Market product id. |
| description | No | Product description. |
| offers_count | No | How many competing offers exist for this product. |
| rating_count | No | Number of star ratings. |
| rating_stars | No | Ratings per star level, 1..5 — reveals whether a 4.8 hides a cluster of 1-star complaints. |
| review_count | No | Number of written reviews. |
| price_with_plus | No | Price requiring a Yandex Plus/Pay subscription. |
| discount_percent | No | Discount percentage as reported upstream. |
| price_before_discount_rub | No | Pre-discount reference price. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds meaningful behavioral detail beyond annotations: reviews are capped at ~13 server-rendered items, the connector deliberately avoids the additional review-loading API, and errors follow a structured ToolError JSON with retryability information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently organized: main purpose first, then differentiators, then the cap/limitation, then error behavior. The bolded star distribution point and the review-cap paragraph earn their place because they guide correct interpretation of results, and the error format section is compact and valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and clear annotations, the description covers the essential remaining gaps: unique data value, the review count limitation, and error/retry behavior. Nothing critical is missing for an agent to invoke the tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description enriches the include_reviews parameter by explaining that reviews arrive with the card 'complete with pros, cons and helpfulness votes' and that the cap is ~13. This adds useful context not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action and resource — 'Fetch full detail for a Yandex Market product' — and enumerates the concrete contents: prices, rating breakdown, reviews. This clearly distinguishes the card tool from search and selfcheck siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear: call this when you need detailed product information, star distribution, and reviews in a single request. It does not explicitly name alternatives or state when not to use it, but the context is unambiguous enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_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.
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 | Validation metadata. |
| page | No | Page number this response covers. |
| items | No | Products on this page, in display order. |
| query | No | The search query, echoed back from the page. |
| returned | No | Number of products in this response. |
| page_count | No | Total pages available upstream. |
| has_next_page | No | Whether a further page exists. |
| total_available | No | Total matches upstream reports. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds meaningful context beyond that: price_rub vs price_with_plus semantics, the Yandex Plus requirement, the preference for price_rub when quoting to a person, the nuance that rating_count counts stars not written reviews, and the ToolError format with retryability. This substantially enriches behavioral understanding.
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: purpose first, then market positioning, pricing semantics, rating-count caveat, and error format. Each section earns its place and the structure is front-loaded with the most important call behavior. It is detailed without being bloated.
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 read-only search tool that already has an output schema, the description covers the essential usage context, pricing nuance, rating-count interpretation, connection to yandex_card, and error behavior. An agent has enough information to invoke it correctly and interpret its results safely.
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 100% of parameters with descriptions, so the baseline is 3. The description adds a useful note that query should be free-text Russian and gives examples, but it does not need to compensate for any schema coverage gaps since none exist.
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?
States a specific action ('Search Yandex Market') and resource, and lists what is returned: prices, ratings, and sellers. It also differentiates this tool by noting Yandex Market is the best single source for current Russian-market pricing and carries goods Wildberries and Ozon do not, separating it clearly from sibling 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?
Gives clear context for when to use it: 'best single source for what does this cost right now across the Russian market,' including goods WB/Ozon do not carry. It also points to yandex_card for written review counts. However, it does not explicitly say when not to use this tool or name alternative search siblings directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yandex_selfcheckYandex Market SelfcheckARead-onlyIdempotent
Probe Yandex Market's search and card pages and report a tri-state verdict.
success — the SSR state parsed as expected. drift_detected — pages
load but no longer parse, so the extraction rules need updating.
inconclusive — a transport block, geo restriction or captcha prevented a
verdict; that says nothing about the parsers.
This matters more here than for a JSON API: SSR extraction is inherently coupled to Yandex's front-end, so drift is a question of when.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | Per-page-type results. |
| status | No | Overall verdict: success, drift_detected, or inconclusive. |
| connector | No | Connector name. |
| process_id | No | OS process id. |
| tool_count | No | Number of MCP tools registered on the server. |
| cache_stats | No | TTL cache counters for this process. |
| config_loaded | No | Whether settings loaded successfully from env/defaults. |
| server_version | No | Connector server version. |
| server_started_at | No | Server start timestamp (UTC ISO-8601). |
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 goes beyond these by explaining the three possible verdicts, clarifying that 'inconclusive' means transport/geo/captcha issues rather than parser failure, and noting that SSR extraction is inherently coupled to front-end drift. This gives the agent useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the core action, and uses concise bullet-style definitions for each verdict. The final sentence about SSR drift adds meaningful context without bloating the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema available, and annotations covering safety/idempotency, the description fully covers what an agent needs: the tool's purpose, the meaning of each result, and why drift is expected. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is no parameter documentation burden. The description reinforces that the tool needs no inputs and focuses on its verdict output. Baseline 4 is appropriate for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Probe Yandex Market's search and card pages' and 'report a tri-state verdict.' It clearly positions the tool as a health-check/probe rather than a data-fetching tool, distinguishing it from yandex_search and yandex_card and from other platform selfchecks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: this tool is for detecting whether SSR extraction rules still parse Yandex Market pages, with verdict meanings explained. It does not explicitly name alternative tools or state when not to use it, but the probe/verdict framing makes the intended use reasonably obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
42 tool updates
v1.2.2- First observed
avito_card - First observed
avito_search - First observed
avito_selfcheck - First observed
avito_seller - First observed
citilink_card - First observed
citilink_search - First observed
citilink_selfcheck - First observed
compare_prices - First observed
compare_sources - First observed
detmir_card - First observed
detmir_categories - First observed
detmir_category - First observed
detmir_selfcheck - First observed
dns_card - First observed
dns_search - First observed
dns_selfcheck - First observed
lamoda_card - First observed
lamoda_search - First observed
lamoda_selfcheck - First observed
marketplace_sources - First observed
megamarket_card - First observed
megamarket_search - First observed
megamarket_selfcheck - First observed
ozon_card - First observed
ozon_reviews - First observed
ozon_search - First observed
ozon_selfcheck - First observed
taobao_card - First observed
taobao_search - First observed
taobao_selfcheck - 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_selfcheck - First observed
wb_seller - First observed
yandex_card - First observed
yandex_search - First observed
yandex_selfcheck
TDQS
Scored across 42 tools
Most tools are clearly separated by marketplace prefix and action type (search, card, selfcheck), so an agent can generally pick the right one. A few pairs could still cause hesitation, such as wb_card vs wb_root_info (both return card-like data) and detmir_category vs detmir_categories, though the descriptions clarify the distinction.
The dominant pattern is marketplace_prefix + action, and it is applied predictably to search/card/selfcheck across nearly every marketplace. There are minor inconsistencies like detmir_category vs detmir_categories for tree-browsing vs product-listing, wb_root_info and wb_category_products using noun phrases, and cross-cutting tools (compare_prices, compare_sources) not following the prefix convention.
At 42 tools, the namespace is large and exceeds the 25+ threshold for a heavy tool surface. The count is systematic because each marketplace gets multiple tools, but it still forces agents to scan a long, repetitive list, especially with nine near-identical selfcheck tools.
For a read-only marketplace intelligence server, the core workflow is well covered: every marketplace has search and card retrieval, WB has reviews/questions/categories/seller, Avito has seller profiles, and compare_prices ties it together. Some depth is uneven — Ozon lacks categories and seller lookup, Yandex lacks seller lookup, and several marketplaces lack reviews — but these are workable gaps rather than dead ends.
Maintenance
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
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
Google Shopping products, prices, sellers, and deals as structured data via a hosted MCP server.
Hosted MCP for e-commerce: live product catalog, stock, and pricing for AI agents.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- FlicenseBqualityCmaintenanceProvides MCP tools for searching and comparing products on Wildberries (and Ozon planned), including product search, detailed card retrieval, and review fetching, normalized for LLM consumption.32-
- 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
- AlicenseAqualityAmaintenanceMCP server that reads product data from Russian and Chinese marketplaces (Wildberries, Ozon, Yandex Market, Avito, etc.) — prices, availability, ratings, reviews, and seller details — with price comparison across sources. Requires no API keys; some sources use your Chrome session for anti-bot access.3687MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/neuratechcompany-ops/kettu-marketplace-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server