MoySklad MCP Server
# MCP-сервер для МойСклад — 60 инструментов для ИИ-агента: товары, склад, заказы, финансы
Если вы искали, как подключить МойСклад к Claude или другому ИИ-агенту, — этот сервер закрывает весь торгово-складской цикл через JSON API 1.2: каталог и цены, остатки по складам, контрагенты, заказы покупателей и поставщикам, отгрузки, приёмки, перемещения, инвентаризации, списания, возвраты, счета, платежи и касса, отчёты по прибыли и оборотам, аудит и вебхуки. Спрашиваете «сколько футболок свободно к продаже» или «какая маржа по каждому товару за август» — получаете таблицу с цифрами, а не выгрузку в Excel. Цены во всех инструментах в рублях (перевод в копейки, которых требует API МойСклад, сервер делает сам), лимит запросов соблюдается автоматически.
[](https://www.npmjs.com/package/@theyahia/moysklad-mcp)
[](./LICENSE)

Часть **[WWmcp](https://github.com/theYahia/WWmcp)** — набора MCP-серверов для развивающихся рынков.
## Быстрый старт
### Claude Desktop
Добавьте в `claude_desktop_config.json`:
```json
{
"mcpServers": {
"moysklad": {
"command": "npx",
"args": ["-y", "@theyahia/moysklad-mcp"],
"env": {
"MOYSKLAD_TOKEN": "your-bearer-token"
}
}
}
}
```
Чтобы использовать логин и пароль вместо токена, замените блок `env` на:
```json
"env": { "MOYSKLAD_LOGIN": "you@example.com", "MOYSKLAD_PASSWORD": "your-password" }
```
### Claude Code
```bash
claude mcp add moysklad --env MOYSKLAD_TOKEN=your-bearer-token -- npx -y @theyahia/moysklad-mcp
```
### Cursor / Windsurf
Добавьте в настройки MCP:
```json
{
"moysklad": {
"command": "npx",
"args": ["-y", "@theyahia/moysklad-mcp"],
"env": { "MOYSKLAD_TOKEN": "your-bearer-token" }
}
}
```
## Авторизация
| Переменная | Описание |
| -------------------------------------- | --------------------------- |
| `MOYSKLAD_TOKEN` | Bearer-токен (предпочтительно) |
| `MOYSKLAD_LOGIN` + `MOYSKLAD_PASSWORD` | HTTP Basic-авторизация |
Токен выдаётся в МоёмСкладе: **Настройки → Пользователи → Токены доступа** (также работает `POST /security/token` с Basic-авторизацией). Генерация нового токена отзывает предыдущий.
**Нужные права:** у пользователя или токена должен быть доступ к тем сущностям, с которыми вы работаете. Читающим инструментам нужны права просмотра, создающим и изменяющим — права редактирования соответствующего типа документов. Вебхуки и часть отчётов требуют платного тарифа МойСклад.
## Цены
API МойСклад хранит деньги в **копейках** (1 рубль = 100 копеек). Сервер конвертирует автоматически:
- **На вход**: передавайте цены и суммы **в рублях** (например, `1500.50`)
- **На выход**: цены и суммы возвращаются **в рублях**
- (Отчёт `get_dashboard` проксируется как есть, поэтому денежные значения в нём остаются в копейках.)
Если у товара есть цена продажи, МойСклад требует **тип цены**. Сервер сам подставляет тип цены по умолчанию из вашего аккаунта (берёт из `list_price_types`); чтобы выбрать конкретный, передайте `price_type_href`.
## Инструменты (60)
### Товары и каталог
| Инструмент | Описание |
| -------------------------------------------------------- | ------------------------------------------------------------ |
| `search_products` | Поиск товаров по названию или артикулу |
| `get_product` | Товар по UUID (`raw` — полный объект) |
| `create_product` | Создать товар (тип цены подставляется автоматически) |
| `update_prices` | Обновить цены продажи, закупки и минимальную |
| `search_assortment` | Сквозной поиск по товарам, модификациям, услугам и комплектам |
| `list_price_types` | Типы цен (первый — по умолчанию) |
| `search_variants` / `search_bundles` / `search_services` | Поиск модификаций / комплектов / услуг |
| `create_service` | Создать услугу |
### Остатки
| Инструмент | Описание |
| -------------------- | ----------------------------------------------- |
| `get_stock` | Текущие остатки (количество, резерв, в пути) |
| `get_stock_by_store` | Остатки в разрезе складов |
| `get_stock_current` | Быстрый срез текущих остатков |
### Контрагенты
| Инструмент | Описание |
| --------------------- | ------------------------------------------- |
| `get_counterparties` | Поиск по названию, ИНН или телефону |
| `get_counterparty` | Полная карточка (`raw` — полный объект) |
| `create_counterparty` | Создать покупателя или поставщика |
### Заказы и отгрузки
| Инструмент | Описание |
| ---------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| `create_customer_order` / `get_orders` / `get_customer_order` / `update_customer_order_status` | Жизненный цикл заказа покупателя |
| `create_purchase_order` / `get_purchase_orders` | Заказы поставщикам |
| `create_demand` | Отгрузка, привязанная к заказу и складу |
| `create_supply` | Приёмка (поступление от поставщика) |
| `create_sales_return` / `create_purchase_return` | Возвраты от покупателей и поставщикам |
### Складские документы
| Инструмент | Описание |
| -------------------------------------- | ------------------------------- |
| `create_move` / `get_moves` | Перемещение между складами |
| `create_enter` / `get_enters` | Оприходование |
| `create_loss` / `get_losses` | Списание |
| `create_inventory` / `get_inventories` | Инвентаризация |
### Финансы
| Инструмент | Описание |
| --------------------------------------------------------------- | ------------------------------------ |
| `create_payment_in` / `create_payment_out` | Входящие и исходящие банковские платежи |
| `create_cash_in` / `create_cash_out` | Приходные и расходные кассовые ордера |
| `create_invoice_out` / `create_invoice_in` / `get_invoices_out` | Счета покупателям и от поставщиков |
### Отчёты
| Инструмент | Описание |
| ------------------- | ----------------------------------------------- |
| `get_profit_report` | Прибыль по товарам (выручка, себестоимость, маржа) |
| `get_sales_report` | Продажи по товарам (количество, выручка) |
| `get_dashboard` | Показатели дашборда за день, неделю, месяц |
| `get_turnover` | Оборачиваемость товаров за период |
| `get_money_report` | Текущие остатки денег по счетам и кассам |
### Справочники и аудит
| Инструмент | Описание |
| ------------------------------------------------------------- | --------------------------------------------------------------------- |
| `list_stores` / `list_organizations` | Склады и юрлица |
| `list_employees` / `list_currencies` / `list_product_folders` | Справочные данные |
| `get_metadata` | Метаданные сущностей (статусы, атрибуты) — здесь берутся href статусов заказа |
| `get_audit` / `get_entity_audit` | Журнал событий аккаунта и история одной сущности |
### Вебхуки и универсальные инструменты
| Инструмент | Описание |
| ------------------------------------------------------------------------ | ----------------------------------------------------------- |
| `list_webhooks` / `create_webhook` / `update_webhook` / `delete_webhook` | Управление вебхуками (CREATE/UPDATE/DELETE/PROCESSED) |
| `get_documents` / `get_document` | Универсальные список и получение для любого типа сущностей, не покрытого выше |
## HTTP-транспорт
```bash
HTTP_PORT=3000 npx @theyahia/moysklad-mcp
# или
npx @theyahia/moysklad-mcp --http 3000
```
Эндпоинты: `POST /mcp` (JSON-RPC), `GET /health` (статус). CORS **выключен по умолчанию** — HTTP-эндпоинт действует от имени вашего токена МойСклад, поэтому задавайте `MOYSKLAD_HTTP_CORS_ORIGIN` только если доверенному браузерному origin это действительно нужно.
## Конфигурация (переменные окружения)
| Переменная | По умолчанию | Описание |
| -------------------------------------- | ------- | ---------------------------------------------------- |
| `MOYSKLAD_TOKEN` | — | Bearer-токен |
| `MOYSKLAD_LOGIN` / `MOYSKLAD_PASSWORD` | — | Basic-авторизация |
| `MOYSKLAD_RATE_BUCKET` | `20` | Сколько запросов разрешено в трёхсекундном окне |
| `MOYSKLAD_MAX_CONCURRENT` | `5` | Максимум параллельных запросов (МойСклад допускает 5 на пользователя) |
| `MOYSKLAD_HTTP_CORS_ORIGIN` | — | Разрешённый CORS-origin для HTTP-транспорта |
| `HTTP_PORT` | — | Запустить транспорт Streamable HTTP на этом порту |
## Ограничение частоты запросов
МойСклад считает «вес за 3 секунды» (≈45 единиц для токена решения, меньше для логина с паролем; отчёты `get_stock` и `get_stock_by_store` стоят по 5 единиц каждый). Встроенный лимитер — token bucket, который списывается по весу запроса, и по умолчанию он **консервативен** (`MOYSKLAD_RATE_BUCKET=20`), потому что API может временно отключить доступ после серии `429`. Повторы на `429`/`5xx` идут с задержкой и учитывают заголовок `X-Lognex-Retry-After`. С токеном решения корзину можно поднять ближе к 45.
## Решение проблем
| Симптом | Причина и что делать |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Auth not configured` | Задайте `MOYSKLAD_TOKEN` (или `MOYSKLAD_LOGIN` + `MOYSKLAD_PASSWORD`). |
| `auth error 401/403` | Токен недействителен или истёк, либо у пользователя нет прав на сущность. Новый токен отзывает старые. |
| `MoySklad HTTP 412 …` | Не хватает обязательного поля (например, исходящему платежу может требоваться статья расходов — передайте `expense_item_href`). Параметр указан в тексте ошибки. |
| Много `429` / медленно | Снизьте объём запросов или положитесь на встроенный лимитер; поднимайте `MOYSKLAD_RATE_BUCKET` только с токеном решения. |
| `HTTP 415` | Среда выполнения не отправляет gzip — используйте Node ≥18 (его `fetch` делает gzip автоматически). |
| Вебхуки и часть отчётов не работают | Требуют платного тарифа МойСклад. |
## E-commerce-стек
| Сервис | MCP-сервер | Что делает |
| -------- | ------------------------ | --------------------------- |
| МойСклад | `@theyahia/moysklad-mcp` | Склад, товары, заказы |
| СДЭК | `@theyahia/cdek-mcp` | Доставка, трекинг |
| DaData | `@theyahia/dadata-mcp` | Проверка адресов |
| ЮKassa | `@theyahia/yookassa-mcp` | Платежи |
## Демо-промпты
> «Покажи все товары с низким остатком (меньше 10 штук) и их текущие цены»
> «Создай заказ покупателя для контрагента „ООО Рога и Копыта“ на 50 штук „Widget Pro“ по 1500 рублей, потом сделай отгрузку с основного склада»
> «Перемести 20 штук SKU LP15 с основного склада в магазин, затем подними отчёт по прибыли за этот месяц»
## Разработка
```bash
npm install # зависимости + git-хуки (husky)
npm run build # tsc -> dist/
npm run lint # eslint
npm run typecheck # tsc --noEmit
npm test # vitest (требуется Node >=20)
npm run coverage # vitest с покрытием
```
Опубликованный рантайм поддерживает **Node ≥18**; тестовая оснастка требует **Node ≥20**.
## Справочник API
Основан на [JSON API 1.2 МойСклад](https://dev.moysklad.ru/doc/api/remap/1.2/).
## Лицензия
MIT
---
Часть [WWmcp](https://github.com/theYahia/WWmcp) · Telegram: [@vhodvai](https://t.me/vhodvai)
TDQS
Scored across 60 tools
Most tools have clearly distinct purposes, but there is some overlap among stock reports (get_stock, get_stock_by_store, get_stock_current) and among search tools (search_products, search_assortment, search_variants). The descriptions help resolve ambiguity, but an agent might still struggle to pick the right one in edge cases.
The naming mostly follows a consistent verb_noun pattern (search_*, get_*, create_*, update_*, list_*, delete_*). However, there is a mix of 'get' and 'list' for collection endpoints (get_orders vs list_invoices_out), and some verbs are more specific than others (update_prices, update_customer_order_status). Overall, the pattern is readable and predictable.
With 60 tools, this is far beyond the 25+ threshold for 'too many'. Even for an ERP-like system like MoySklad, the sheer number makes the toolset unwieldy and difficult for an agent to navigate efficiently. The scope is broad, but the count is excessive.
The toolset covers a wide range of MoySklad operations, including products, orders, stock, payments, webhooks, and reports. However, there are notable gaps: many entities only have create and read but lack update and delete (e.g., products, counterparties, payments). The generic get_documents/get_document partially compensate, but the missing CRUD operations create dead ends.