Skip to main content

wb-mcp

MCP-сервер для API Wildberries. Один процесс, любой MCP-клиент, сколько угодно кабинетов. Список методов лежит в пакете (wbmcp/specs): 305 методов в 13 разделах, снимок 28.09.2026.

Проблематика: агенту, как правило, нужен доступ ко всему API, при этом нужно учитывать лимиты запросов WB. Сервер служит middleware — проверяет, что токену доступен метод, смотрит лимит, ведёт журнал записей и отдаёт ответ WB как есть. Повторные чтения справочников и карточек берутся из кэша.

Состав

  • wbmcp/tokens.py, wbmcp/sellers -- разбор токена (sid, категории, только чтение, песочница, срок) и реестр кабинетов. Токены лежат в SQLite или Postgres, при наличии ключа WBMCP_TOKEN_KEY шифруются.
  • wbmcp/catalog -- каталог операций: допуск по категориям и типу токена, таблицы лимитов, схемы аргументов, поиск.
  • wbmcp/ratelimit -- token bucket на кабинет и класс лимита.
  • wbmcp/client -- сам запрос: допуск, лимит, повторы, журнал записей, файлы из ответов.
  • wbmcp/tools -- инструменты MCP, базовые, курируемые и сгенерированные.
  • wbmcp/cloud -- каркас многоарендного режима и Redis, у них своя лицензия, см. в конце.

Установка

Python 3.12 или выше. Установка из репозитория:

pip install git+https://github.com/S-typy/WB-MCP.git

Дополнительные зависимости, если нужны:

pip install "wb-mcp[crypto] @ git+https://github.com/S-typy/WB-MCP.git"
pip install "wb-mcp[postgres] @ git+https://github.com/S-typy/WB-MCP.git"
pip install "wb-mcp[redis] @ git+https://github.com/S-typy/WB-MCP.git"

crypto нужен для шифрования токенов в базе, postgres -- для общего реестра кабинетов и журнала, redis -- для общего лимитера и кэша. Можно объединить: wb-mcp[crypto,postgres]. У Redis-модулей коммерческая лицензия, установка зависимостей её не заменяет.

Токен

Токен выпускается в личном кабинете продавца, раздел «Настройки, Доступ к API». Для локального режима подходит любой тип: персональный, сервисный, базовый, тестовый. Сервер сам читает из токена, какие категории открыты, только чтение или признак песочницы. С тестовым токеном запросы уходят на *-sandbox.wildberries.ru, ничего переключать не надо.

Самый короткий запуск с одним кабинетом:

export WB_TOKEN=eyJ...
wb-mcp --check      # собрать сервер и напечатать сводку, без запросов к WB
wb-mcp --smoke      # пять шагов проверки с запросами к WB
wb-mcp              # stdio для MCP-клиента

--smoke проверяет кабинеты, ping, сведения о продавце, новости и квоту. Для тестового токена вместо сведений о продавце и новостей запрашиваются склады и новые заказы. При нескольких кабинетах укажите --seller main; этот флаг относится только к --smoke.

Для клиента, поддерживающего stdio-серверы, достаточно такого описания:

{"mcpServers": {"wb": {"command": "wb-mcp", "args": ["--config", "/home/me/wb-mcp.toml"]}}}

Настройка

Несколько кабинетов, профили инструментов и ключи клиентов для HTTP описываются в TOML. Путь к файлу передаётся через --config или переменную WBMCP_CONFIG.

[server]
profiles = ["orders", "content"]
data_dir = "~/.wb-mcp"

[[sellers]]
alias = "main"
token_env = "WB_TOKEN_MAIN"

[[sellers]]
alias = "second"
token_file = "~/.wb-mcp/second.token"

[[clients]]                      # нужны только для --transport http
name = "agent"
key_env = "WBMCP_KEY_AGENT"
sellers = ["main"]
scopes = ["read", "write"]

Профили: core (только базовые инструменты), orders, content, promo, analytics, communication, finance, common, full. Профиль решает, какие из 305 сгенерированных инструментов wb_op_* попадут в список. Все 305 сразу отдавать не стоит, агенту столько не переварить, а wb_request доступен всегда.

Без настройки включён core; курируемые инструменты тоже доступны. Профили можно задать при запуске: wb-mcp --profiles orders,content. Они меняют список инструментов, права клиента задаются отдельно через scopes и sellers. --read-only запрещает записи в WB для всего сервера, в том числе с force=true.

Токены, добавленные через wb_seller_add, сохраняются в базе. Для шифрования установите crypto и задайте WBMCP_TOKEN_KEY -- ключ Fernet. Например, один раз создайте ключ:

export WBMCP_TOKEN_KEY="$(python -c '
from wbmcp.sellers.crypto import FernetCipher
print(FernetCipher.generate_key())
')"

Сохраните его для следующих запусков: новый ключ старые записи не откроет. Без ключа токены в базе хранятся открыто. Уже записанные токены при включении шифрования автоматически не перешифровываются; токены из TOML, переменных и файлов остаются в своих источниках.

Каталог API

В пакет входит собранный catalog.json: пути, хосты, схемы, допуски и лимиты. Исходных OpenAPI-файлов и полных текстов документации WB в поставке нет, названия методов сохранены. Поэтому поиск и wb_api_describe работают по каталогу, но пояснения WB к полям будут пустыми.

Свою копию OpenAPI-спецификаций можно подключить через --specs /path/to/snapshot, WBMCP_SPECS или specs_dir в [server]. В каталоге должны лежать JSON-файлы разделов; если они есть, сервер читает их вместо собранного каталога. Сам сервер снимок не обновляет.

Инструменты

wb_sellers показывает кабинеты и что умеют их токены. В остальных инструментах кабинет указывается аргументом seller, при одном кабинете его можно не писать.

wb_api_search и wb_api_describe ищут метод и отдают карточку с допуском, лимитом и схемой аргументов. wb_request зовёт любой метод по пути, например GET /api/v3/orders/new: путь сверяется с каталогом, аргументы со спецификацией. wb_op_<operationId> делает то же, но с готовой схемой, по одному инструменту на метод из включённых профилей.

Для частых задач есть wb_orders_new, wb_orders, wb_cards, wb_feedbacks, wb_warehouses, wb_prices_set, wb_stocks_set и wb_report. wb_orders и wb_cards собирают страницы до max_pages; capped=true в ответе значит, что достигнут этот предел. Остальные постраничные методы отдают одну страницу. wb_report умеет ждать готовности остатков, платного хранения, приёмки и отчёта по воронке. Служебные: wb_ping, wb_seller_info, wb_news, wb_changes (новости WB, сопоставленные с каталогом), wb_quota, wb_journal, wb_audit. wb_seller_add и wb_seller_remove меняют реестр, им нужен admin; кабинеты из TOML удаляются из самого файла настроек. Для кэша и сохранённых выгрузок есть wb_cache и wb_result.

Большие ответы и файлы

Небольшой JSON приходит целиком. Если данные больше 200 000 байт, они сохраняются в data_dir/results, а в ответе остаются образец, truncated=true и stored: id, путь, размер и sha256. Полные данные из-за этого не теряются.

wb_result без аргументов показывает сохранённые выгрузки. С result_id читает данные, для списков есть offset и limit (по умолчанию 100). Полный JSON можно получить через ресурс wb://results/<id>, в том числе по HTTP, без доступа к диску сервера.

select -- выражение JMESPath. Например, у wb_cards можно передать "[].{nmID: nmID, title: title}", чтобы оставить только номера и названия. Проекция выполняется до сохранения: в файле будет уже выбранная часть. У wb_result она применяется к сохранённым данным, затем к списку применяются offset и limit.

Порог и срок хранения меняются в TOML, ниже значения по умолчанию:

[server.results]
inline_max_bytes = 200000
preview_items = 5
keep_hours = 168

Старые выгрузки удаляются при старте и при сохранении новых. Бинарные файлы из ответов (отчёты, ярлыки, документы) пишутся отдельно в data_dir/files, в ответе путь и sha256. Файлы до 512 КиБ включительно возвращаются ещё и в base64. Лимит файла по умолчанию 20 МиБ, меняется через max_file_bytes в [server]; файлы здесь автоматически не чистятся.

Кэш

По умолчанию кэш в памяти: карточки -- 5 минут, склады и тарифы -- час, справочники -- сутки. Новые заказы и остатки по умолчанию не кэшируются. Настройки, например для SQLite:

[server.cache]
enabled = true
backend = "sqlite"
max_entries = 5000
invalidate_on_write = true

[server.cache.ttl]
"path:/content/v2/get/cards" = 60

Варианты backend: memory, sqlite, redis. SQLite переживает перезапуск, Redis требует redis_url. Правила TTL задаются для op:<operationId>, path:<METHOD /путь>, префикса path:/путь, section:<раздел> или *, в таком порядке приоритета. Нулевой TTL отключает кэш для правила, enabled=false -- весь кэш. Пишущие методы не кэшируются.

fresh=true у wb_request, wb_cards, wb_orders и сгенерированных читающих инструментов заставляет сходить в WB заново. wb_cache показывает статистику и правила, action="clear" сбрасывает кэш; можно указать seller и section. У клиента без admin сбрасываются только его кабинеты. Успешная запись по умолчанию очищает кэш своего раздела для этого кабинета.

Лимиты

У каждого метода в описании есть таблица лимитов: период, число запросов, интервал, всплеск, отдельно по типам токена. Сервер держит token bucket на пару «кабинет плюс класс лимита» и при нехватке квоты откладывает запрос. Учитывает, что 4XX в Маркетплейсе стоит десять запросов, читает заголовки X-Ratelimit-* и при ответе 429 выдерживает указанную WB паузу. Бюджет класса один на кабинет, его делят все агенты и инструменты этого процесса. Для нескольких процессов нужен общий Redis. wb_quota показывает остаток.

Записи

У пишущих инструментов есть dry_run (собрать запрос и показать, не отправляя) и force. Каждая запись идёт через журнал: таймаут или 5xx считаются неоднозначным исходом, и повтор с теми же аргументами блокируется. После проверки результата в кабинете повтор можно разрешить через force=true. Повтор успешной записи с теми же аргументами тоже блокируется в течение десяти минут.

force=true обходит блокировку повторной записи в журнале, проверку аргументов по схеме и запрос подтверждения опасного действия. Проверки прав доступа и лимиты сохраняются. Отмена, удаление, бюджеты и доступы пользователей по умолчанию запрашивают подтверждение у клиента. Флаг запуска --yes автоматически подтверждает такие действия.

HTTP-режим

wb-mcp --transport http --host 0.0.0.0 --port 8000 --config wb-mcp.toml

Клиенты ходят на /mcp с bearer-ключом из [[clients]], у каждого ключа свои кабинеты и scope: read, write, finance, admin. /health и /metrics (формат Prometheus) открыты без ключа. Без [[clients]] HTTP не поднимется, разве что с --insecure для отладки.

Для финансовых методов и документов нужен finance вместе с read или write. admin сам по себе не добавляет остальные scope. В stdio клиент имеет все права на настроенные кабинеты; ограничения [[clients]] работают в HTTP.

Для multipart-загрузок по HTTP путь к файлу должен лежать внутри data_dir/uploads на сервере. Каталог создайте и наполните заранее; он общий для HTTP-клиентов этого процесса. Вместо пути можно передать base64 и filename. В stdio допускается любой доступный процессу файл. Пути в ответах относятся к серверу, а не к машине HTTP-клиента.

Postgres

По умолчанию кабинеты, журнал записей и аудит лежат в SQLite в data_dir. Для нескольких экземпляров сервера укажите database_url в [server] или переменную WBMCP_DATABASE_URL. Схема и таблицы создаются при старте.

Для общего лимитера установите extra redis и задайте redis_url в [server] или переменную WBMCP_REDIS_URL, например redis://localhost:6379/0. Все экземпляры должны использовать одну базу Redis, часы на хостах должны быть синхронизированы (например, NTP). Без этой настройки лимитер хранит состояние в памяти каждого процесса. Redis-кэш включается отдельно через backend = "redis" в [server.cache].

Файлы и индекс выгрузок остаются в data_dir, даже с Postgres и Redis. Эти две настройки сами по себе не делают сохранённый результат доступным на другом экземпляре сервера.

Облачный режим

В wbmcp/cloud есть проверки типа токена, реестры арендаторов и Redis-хранилища. Подключение кабинетов через OAuth пока не реализовано, готового облачного сервиса в пакете нет. HTTP-режим выше -- способ подключить клиентов к своему серверу.

Лицензия

Ядро распространяется под GNU AGPL-3.0-only, текст в файле LICENSE. Каталог wbmcp/cloud (включая Redis-лимитер и Redis-кэш) под коммерческой лицензией, wbmcp/cloud/LICENSE: исходники открыты, использовать в production можно только по договору. Коммерческая лицензия на ядро для тех, кому AGPL не подходит, обсуждается отдельно, контакт в профиле https://github.com/S-typy.

Metadata

Release files for wb-mcp 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wb-mcp 0.1.0
File Size Uploaded
wb_mcp-0.1.0.tar.gz 234.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wb-mcp 0.1.0
File Interpreter ABI Platform
wb_mcp-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 463.8 kB

Release files / wb_mcp-0.1.0.tar.gz

Download URL wb_mcp-0.1.0.tar.gz
Size 234.9 kB
Tags Source
SHA-256 checksum
How to use checksums
13057cf8ec685279b8398741e43683eb808969284c02f81fd7812735db3c8356
BLAKE2b-256 checksum
How to use checksums
66ee0c3a62195a0213cc262d47c230dc3c25c2f08ccecd006ad064a6feefb94a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / wb_mcp-0.1.0-py3-none-any.whl

Download URL wb_mcp-0.1.0-py3-none-any.whl
Size 228.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2e8964b94fb68c86d8610135830dc319b6b6ddcd09947fe70c75141f6531e234
BLAKE2b-256 checksum
How to use checksums
5071a27b1272e5ed80d659774b7fb2dc531774a6d46d0acdb01aa1a3365938f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page