ADOLF SHOP — Раздел 4: Open WebUI Integration
Проект: Интеллектуальная система управления интернет-магазином
Модуль: Shop / Open WebUI
Версия: 1.0
Дата: Январь 2026
4.1 Назначение
Примечание (Март 2026): Ниже описана архитектура интеграции через chat-агента. Фактическая реализация использует standalone-страницу
/shop. Структура страницы:
Вкладка Описание Дашборд Общая сводка Заказы Управление заказами Товары Каталог товаров Аналитика Аналитика продаж Документация агента ниже сохранена как спецификация backend API.
Интеграция модуля Shop с Open WebUI обеспечивает:
- Интерфейс управления интернет-магазином через агента
@Adolf_Shop - Прямой доступ к WooCommerce через MCP tools
- Отображение уведомлений о событиях (заказы, отмены, возвраты)
4.2 Агент @Adolf_Shop
Конфигурация
yaml
name: Adolf_Shop
description: Управление интернет-магазином ohana.market
model: claude-opus-4-5
temperature: 0.3
mcp_servers:
- woocommerce_mcp
system_prompt: |
Ты — AI-ассистент для управления интернет-магазином ohana.market на базе WooCommerce.
## Твои возможности
### Заказы
- Просмотр новых заказов (статус: processing)
- Просмотр заказов в ожидании оплаты (статус: pending)
- Просмотр проблемных заказов (статусы: failed, refunded)
- Поиск заказов по номеру, клиенту, дате
- Детали конкретного заказа
### Товары
- Поиск товаров по названию, артикулу, бренду
### Аналитика
- Выручка за период
- Количество заказов
- Средний чек
- Топ товаров по продажам
- Продажи по брендам
- Заказы без оплаты более 48 часов
## Бренды магазина
- Охана Kids — детская одежда
- Охана Style — взрослая одежда
- Охана Care — товары для ухода
- Охана Lux — премиум-сегмент
## Правила ответов
- Форматируй данные в таблицы для наглядности
- При аналитике всегда указывай период
- Суммы указывай в рублях (₽)
- Группируй данные по брендам, если это улучшает понимание
- При большом количестве данных показывай топ-10Доступ по ролям
| Роль | Доступ | Ограничения |
|---|---|---|
| Staff | ❌ | Нет доступа |
| Manager | ❌ | Нет доступа |
| Senior | ✅ | Полный доступ |
| Director | ✅ | Полный доступ |
| Administrator | ✅ | Полный доступ |
4.3 MCP Tools Configuration
Подключение WooCommerce MCP
json
{
"mcpServers": {
"woocommerce_mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@automattic/mcp-wordpress-remote@latest"
],
"env": {
"WP_API_URL": "${WOOCOMMERCE_MCP_URL}",
"CUSTOM_HEADERS": "{\"X-MCP-API-Key\": \"${WOOCOMMERCE_CONSUMER_KEY}:${WOOCOMMERCE_CONSUMER_SECRET}\"}"
}
}
}
}Доступные MCP Tools
Claude автоматически получает доступ к WooCommerce abilities:
| Tool | Описание | Использование |
|---|---|---|
woocommerce/orders-list | Список заказов | Новые, в ожидании, проблемные |
woocommerce/orders-get | Детали заказа | Просмотр конкретного заказа |
woocommerce/products-list | Список товаров | Поиск по каталогу |
woocommerce/products-get | Детали товара | Информация о товаре |
Параметры orders-list
| Параметр | Тип | Описание |
|---|---|---|
status | string | pending, processing, on-hold, completed, cancelled, refunded, failed |
customer | integer | ID клиента |
after | string | Заказы после даты (ISO 8601) |
before | string | Заказы до даты (ISO 8601) |
page | integer | Номер страницы |
per_page | integer | Записей на страницу (max 100) |
orderby | string | Сортировка: date, id, include, title |
order | string | asc / desc |
Параметры products-list
| Параметр | Тип | Описание |
|---|---|---|
search | string | Поисковый запрос |
status | string | publish, draft, pending |
category | integer | ID категории |
sku | string | Артикул |
min_price | string | Минимальная цена |
max_price | string | Максимальная цена |
stock_status | string | instock, outofstock, onbackorder |
brand | integer | ID бренда (WooCommerce Brands) |
4.4 Сценарии использования
Сценарий 1: Просмотр новых заказов
Пользователь: Покажи новые заказы
Claude:
[MCP: woocommerce/orders-list(status=processing, per_page=20, orderby=date, order=desc)]
Ответ:
## Новые заказы (5)
| № | Дата | Клиент | Сумма | Товары |
|---|------|--------|-------|--------|
| #12347 | 25.01 11:45 | Сидорова М. | 8 990 ₽ | Костюм детский (1) |
| #12346 | 25.01 11:20 | Козлов А. | 3 490 ₽ | Футболка (2) |
| #12345 | 25.01 10:30 | Иванов И. | 5 990 ₽ | Платье летнее (1) |
| #12344 | 25.01 09:15 | Петрова А. | 12 500 ₽ | Костюм (1), Блузка (2) |
| #12343 | 25.01 08:40 | Николаев С. | 4 200 ₽ | Джинсы (1) |
**Итого:** 35 170 ₽Сценарий 2: Детали заказа
Пользователь: Покажи заказ 12345
Claude:
[MCP: woocommerce/orders-get(id=12345)]
Ответ:
## Заказ #12345
| Параметр | Значение |
|----------|----------|
| **Статус** | В обработке |
| **Дата** | 25.01.2026 10:30 |
| **Сумма** | 5 990 ₽ |
### Клиент
- **Имя:** Иван Петров
- **Email:** ivan@example.com
- **Телефон:** +7 999 123-45-67
### Адрес доставки
г. Москва, ул. Примерная, д. 1, кв. 10
### Состав заказа
| Товар | Артикул | Кол-во | Цена |
|-------|---------|--------|------|
| Платье летнее | DR-2026-001 | 1 | 5 990 ₽ |
### Комментарий клиента
Позвонить перед доставкойСценарий 3: Проблемные заказы
Пользователь: Есть ли проблемные заказы?
Claude:
[MCP: woocommerce/orders-list(status=failed,refunded, per_page=50)]
Ответ:
## Проблемные заказы (2)
### Ошибки оплаты (failed)
| № | Дата | Клиент | Сумма | Причина |
|---|------|--------|-------|---------|
| #12340 | 24.01 | Козлова Н. | 6 500 ₽ | Недостаточно средств |
### Возвраты (refunded)
| № | Дата | Клиент | Сумма | Причина |
|---|------|--------|-------|---------|
| #12305 | 20.01 | Смирнов В. | 9 990 ₽ | Не подошёл размер |
**Рекомендации:**
- Заказ #12340: связаться с клиентом для повторной оплаты
- Заказ #12305: проверить возврат товара на складСценарий 4: Поиск товаров
Пользователь: Найди детские платья до 3000 рублей
Claude:
[MCP: woocommerce/products-list(search=платье, brand=kids_brand_id, max_price=3000)]
Ответ:
## Найдено: 4 товара
| Название | Артикул | Цена | Остаток | Бренд |
|----------|---------|------|---------|-------|
| Платье праздничное | DR-K-010 | 2 990 ₽ | 8 шт | Kids |
| Платье повседневное | DR-K-011 | 1 990 ₽ | 15 шт | Kids |
| Платье летнее | DR-K-012 | 2 490 ₽ | 12 шт | Kids |
| Сарафан | DR-K-013 | 1 790 ₽ | 20 шт | Kids |Сценарий 5: Аналитика продаж
Пользователь: Аналитика за последнюю неделю
Claude:
[MCP: woocommerce/orders-list(status=completed, after=2026-01-18, per_page=100)]
[Агрегация данных...]
Ответ:
## Аналитика продаж: 18.01 — 25.01.2026
### Общие показатели
| Метрика | Значение |
|---------|----------|
| **Выручка** | 450 000 ₽ |
| **Заказов** | 75 |
| **Средний чек** | 6 000 ₽ |
### Продажи по брендам
| Бренд | Заказов | Выручка | Доля |
|-------|---------|---------|------|
| Style | 35 | 210 000 ₽ | 47% |
| Kids | 25 | 125 000 ₽ | 28% |
| Care | 10 | 65 000 ₽ | 14% |
| Lux | 5 | 50 000 ₽ | 11% |
### Топ-5 товаров
| # | Товар | Продано | Выручка |
|---|-------|---------|---------|
| 1 | Платье летнее | 15 шт | 89 850 ₽ |
| 2 | Костюм детский | 12 шт | 47 880 ₽ |
| 3 | Блузка шёлковая | 10 шт | 45 900 ₽ |
| 4 | Юбка миди | 8 шт | 31 920 ₽ |
| 5 | Футболка базовая | 20 шт | 29 800 ₽ |Сценарий 6: Заказы без оплаты
Пользователь: Заказы без оплаты больше 48 часов
Claude:
[MCP: woocommerce/orders-list(status=pending, before=2026-01-23T10:00:00)]
Ответ:
## Заказы без оплаты > 48 часов (3)
| № | Дата создания | Клиент | Сумма | Ожидание |
|---|---------------|--------|-------|----------|
| #12330 | 22.01 15:30 | Иванова Е. | 8 500 ₽ | 67 часов |
| #12325 | 22.01 10:00 | Сергеев П. | 4 200 ₽ | 72 часа |
| #12318 | 21.01 18:45 | Козлов Д. | 5 800 ₽ | 88 часов |
**Общая сумма:** 18 500 ₽
**Рекомендации:**
- Отправить напоминание об оплате
- При отсутствии реакции — отменить через 24 часа4.5 Уведомления
Интеграция с Notification System
Celery Beat polling создаёт уведомления при обнаружении событий:
python
# При обнаружении нового заказа
notification_publisher.publish(
event_type="shop.order.new",
title="Новый заказ",
message=f"Заказ #{order_id} на сумму {total} ₽",
source_module="shop",
source_id=str(order_id),
level="info",
data={
"order_id": order_id,
"total": total,
"customer": customer_name
}
)
# При отмене заказа
notification_publisher.publish(
event_type="shop.order.cancelled",
title="Заказ отменён",
message=f"Клиент отменил заказ #{order_id}",
source_module="shop",
source_id=str(order_id),
level="warning",
data={
"order_id": order_id,
"reason": cancellation_reason
}
)
# При возврате
notification_publisher.publish(
event_type="shop.order.refunded",
title="Возврат средств",
message=f"Оформлен возврат по заказу #{order_id}",
source_module="shop",
source_id=str(order_id),
level="warning",
data={
"order_id": order_id,
"refund_amount": refund_amount
}
)
# При ошибке оплаты
notification_publisher.publish(
event_type="shop.order.failed",
title="Ошибка оплаты",
message=f"Не удалась оплата заказа #{order_id}",
source_module="shop",
source_id=str(order_id),
level="error",
data={
"order_id": order_id,
"failure_reason": failure_reason
}
)Типы уведомлений
| Событие | Уровень | Описание |
|---|---|---|
shop.order.new | info | Новый заказ в обработке |
shop.order.cancelled | warning | Заказ отменён клиентом |
shop.order.refunded | warning | Оформлен возврат средств |
shop.order.failed | error | Ошибка оплаты |
4.6 Обработка ошибок
Ошибки MCP
При ошибках MCP Claude формирует понятное сообщение:
| Ошибка | Сообщение пользователю |
|---|---|
| Connection timeout | "Не удалось подключиться к магазину. Попробуйте через минуту." |
| Authentication error | "Ошибка авторизации в магазине. Обратитесь к администратору." |
| No results | "По вашему запросу ничего не найдено." |
| Rate limit | "Слишком много запросов. Подождите минуту и повторите." |
| Server error | "Ошибка на стороне магазина. Попробуйте позже." |
Пример обработки ошибки
Пользователь: Покажи заказ 99999
Claude:
[MCP: woocommerce/orders-get(id=99999)]
[Error: 404 Not Found]
Ответ:
Заказ #99999 не найден. Проверьте номер заказа и попробуйте снова.4.7 Настройка агента
Создание агента в Open WebUI
- Перейти в Workspace → Functions → Create new
- Тип: MCP Agent
- Заполнить:
- Name:
Adolf_Shop - Description:
Управление интернет-магазином ohana.market - Model:
claude-opus-4-5
- Name:
- Добавить MCP Server:
- Name:
woocommerce_mcp - URL:
${WOOCOMMERCE_MCP_URL}
- Name:
- Настроить System Prompt (см. раздел 4.2)
- Настроить доступ: Senior, Director, Administrator
Environment Variables
bash
# В конфигурации Open WebUI
WOOCOMMERCE_MCP_URL=https://ohana.market/wp-json/woocommerce/mcp
WOOCOMMERCE_CONSUMER_KEY=ck_xxxxxxxx
WOOCOMMERCE_CONSUMER_SECRET=cs_xxxxxxxx4.8 Ограничения MVP
| Ограничение | Описание |
|---|---|
| Только чтение | Write-операции (изменение статуса) не доступны |
| Нет кэширования | Каждый запрос обращается к WooCommerce |
| Пагинация | Максимум 100 записей за запрос |
| Аналитика | Расчёт на стороне Claude |
Приложение А: Справочник запросов
Заказы
| Запрос пользователя | MCP Tool | Параметры |
|---|---|---|
| "Новые заказы" | orders-list | status=processing |
| "Заказы в ожидании" | orders-list | status=pending |
| "Проблемные заказы" | orders-list | status=failed,refunded |
"Заказ #12345" | orders-get | id=12345 |
Товары
| Запрос пользователя | MCP Tool | Параметры |
|---|---|---|
| "Найди платье" | products-list | search=платье |
| "Товары Kids" | products-list | brand=kids_id |
Приложение Б: Контрольные точки
| Критерий | Проверка |
|---|---|
| Агент доступен | @Adolf_Shop отвечает на запросы |
| MCP работает | Данные из WooCommerce получаются |
| Уведомления | События polling создают notifications |
| Доступ | Staff/Manager получают отказ |
Документ подготовлен: Январь 2026
Версия: 1.0
Статус: Черновик