| name | wb-search-by-query |
| id | wb-search-by-query |
| title | Поисковая выдача WB |
| description | Получает живую поисковую выдачу Wildberries по фразе через браузер пользователя: топ товаров и позиции конкретных артикулов. Используйте, когда пользователь спрашивает про позицию товара в поиске ВБ, выдачу по запросу или ключевой фразе, кто в топе по запросу, мониторинг позиций или проверку ранжирования артикула. |
| skill_schema_version | 1 |
| introduced_in | 2026.7.0 |
| updated_in | 2026.7.5 |
| status | experimental |
Поисковая выдача WB
Контракт
Скилл получает поисковую выдачу Wildberries по одной или нескольким фразам через браузер
пользователя. Одна страница выдачи — примерно 100 позиций.
Сначала прочитайте общий контракт браузерных заданий: ../../shared/browser-job/README.md.
Он описывает требования, выбор транспорта (обязательно сначала попробуй postMessage-снипет;
DOM mailbox — только если postMessage не ответил, а не по умолчанию), передачу trigger_url, опрос, чтение результатов, снимок-семантику и
общие ошибки. Весь флоу гоняйте сами в браузере пользователя — не отдавайте ему
trigger_url и не просите «достать данные»; не выдумывайте ошибку авторизации (реальная
приходит только из submit/progress().setupError). Всю работу выполняет расширение через
API — не скрапьте DOM выдачи и не разбирайте сырой WB-JSON, когда хватает сводки.
Как работает
-
Вызовите MCP tool browser_job:
{ "job_type": "search_by_query", "queries": [["тушенка", 2], ["тушенка говяжья", 1]] }
queries — пары [фраза, страниц]; суммарно не больше 50 страниц. Для вопроса «на какой
позиции мой артикул» обычно достаточно 2-3 страниц (~200-300 позиций). Ответ:
trigger_url, job_ids (один родительский jobId), expires_at (~5 минут — открывайте
сразу, не откладывайте).
-
Выполните общий workflow из ../../shared/browser-job/README.md: submit → опрос
progress → чтение. Читайте результат сводкой (agent_summary.js либо mailbox-команда
summary): на каждую пару (фраза, страница) придёт готовый объект SearchSummary — без
разбора WB-JSON.
-
Поля сводки: query, page, total (товаров на странице) и products[] — для каждого
товара nmId, name, brand, supplierId, priceRub (basic/product), rating,
feedbacks, pics, promoted (рекламная выдача) и position (порядок на странице,
с 1). Поля best-effort — чего-то может не быть.
-
Сырые тела нужны только для полей, которых нет в сводке, — agent_read.js по юнитам
<jobId>__q<queryIndex>__p<page> (queryIndex — индекс фразы в queries с 0, page —
с 1; в юните data.body.products + data.body.metadata). Тела большие (~100 товаров на
страницу) — читайте порциями по 1-2 юнита.
-
Джоба — снимок: чтобы добрать поля по уже полученной выдаче, перечитывайте тот же jobId
(сводкой или read). Новый browser_job — только за актуальными позициями, для новых
фраз или после истечения хранения (~1 сутки).
Как отвечать пользователю
- Позиция артикула: сквозная позиция =
(page - 1) * 100 + position (поле position
из сводки, с 1 на странице). Если артикул не найден на запрошенных страницах — так и
скажите («не найден в первых N позициях»), не утверждайте, что его нет в выдаче вообще.
- Помечайте рекламные места: у товаров с
promoted: true указывайте «реклама» — их
позиция оплачена, а не органическая.
- Топ по запросу: верните первые N товаров из сводки с артикулом, названием, брендом,
ценой (
priceRub.product) и рейтингом — без дополнительных вычислений.
- Для нескольких фраз группируйте ответ по фразам.
- Юнит со
status: 'done', но data.ok === false / data.status === 0 — сетевая ошибка WB:
сообщите об этом по конкретной странице и предложите повторить.
- Указывайте, что выдача персонализирована слабо, но меняется во времени: позиции — снимок на
момент запроса.