OneTrace.ru Справка

Данные магазина для бота

Бот ИИ в чате может отвечать не только по базе знаний, но и живыми данными магазина: где заказ, какой трек-номер, есть ли товар в наличии, сколько стоит доставка, как вернуть покупку. А если вы разрешите — отменить неоплаченный заказ или передать магазину заявку на возврат и смену доставки. Для этого магазин подключается к боту по протоколу MCP (Model Context Protocol): бот вызывает инструменты магазина, магазин отвечает данными.

Магазин подключается на любом тарифе, а бот, как и весь ИИ в чате, работает на платном тарифе: ответы с данными магазина оплачиваются как обычные ответы ИИ — с баланса проекта, см. Оплата.

Подключение

Проще всего — через наш модуль для магазина. Модуль сам поднимает сервер и подключает его к проекту при сохранении настроек:

Платформа Где включить
WooCommerce WooCommerce → Настройки → OneTrace.ru → ИИ-бот чата: MCP магазина
Magento 2 Stores → Configuration → OneTrace.ru → AI chat bot: store MCP → Connect to the chat bot
1С-Битрикс Настройки модуля → вкладка сайта → блок ИИ-бот чата: MCP магазина → Подключить к боту чата

Секретному ключу модуля нужно право «Подключение MCP-сервера магазина к ИИ-боту» (chats.manage). Права ключа не меняются после создания: если у ключа модуля его нет, создайте в разделе API-ключи новый ключ с прежними правами и этим и укажите его в настройках модуля. Сайты одного проекта подключаются один раз.

Свой магазин на PHP или Laravel подключается готовым сервером из PHP-библиотеки и пакета Laravel — разработчику остаётся написать обработчики инструментов. Любой другой сервер, выполняющий контракт MCP магазина, подключается вручную: в Чаты → Настройки чата → Бот → Магазин (MCP) укажите адрес https://…, ключ доступа, который выдал магазин, и название. Контракт с описанием инструментов, ошибок и подтверждения покупателя — в разделе Для разработчиков.

Магазин (MCP) в настройках бота

В разделе Магазин (MCP) видно, работает ли сервер и какие инструменты магазин разрешил боту. Переключатель временно отключает сервер, кнопка обновления заново проверяет его и перечитывает инструменты (платформа делает это и сама раз в сутки).

Что может бот

Что именно разрешено боту, решает магазин — в настройках модуля. По умолчанию включено только чтение:

Инструмент Что делает бот
Заказы покупателя, заказ находит заказы покупателя и рассказывает о заказе: состав, сумма, оплата, способ доставки, адрес
Отслеживание называет службу доставки и трек-номер, даёт ссылку на отслеживание
Наличие и цены ищет товар по названию или артикулу, говорит, есть ли он и в каких вариантах
Доставка перечисляет способы доставки с ценой и порогом бесплатной доставки
Условия возврата пересказывает условия возврата магазина

Действия выключены, пока магазин их не разрешит:

Действие Что происходит
Отмена заказа бот отменяет заказ, по которому ничего не оплачено и не отгружено
Заявка на возврат заявка уходит в магазин — комментарием к заказу и письмом сотрудникам
Изменение доставки заявка на новый адрес, дату или время уходит в магазин так же

Описания инструментов для модели задаёт платформа, а не магазин, а ответы магазина бот воспринимает как данные, а не как инструкции. Если в ответе бота есть цены, сроки или обещания, которых нет в данных магазина, проверка ответа не пропустит его клиенту.

Подтверждение покупателя

Заказы и действия с ними доступны только подтверждённому покупателю — чужой заказ бот не покажет и даже не подтвердит, что он существует. Подтвердить покупателя можно двумя способами:

  1. Вход на сайте. Если покупатель вошёл в аккаунт магазина, модуль передаёт виджету чата подписанный токен — бот сразу знает, кто пишет.
  2. Код. В мессенджерах и для гостей бот спрашивает email, указанный в магазине, магазин отправляет на него код из 6 цифр, покупатель пишет код в чат. Код действует 10 минут, на один адрес — не больше 5 кодов в час.

Подтверждение действует 24 часа. Оператор видит его в окне диалога: «покупатель подтверждён: вход на сайте» или «покупатель подтверждён кодом». Токен покупателя хранится в диалоге зашифрованным, ни модель, ни операторы его не видят.

Действия в магазине

Бот выполняет действие только после явного согласия покупателя:

  1. Бот описывает, что сделает — номер заказа, товары — и спрашивает подтверждение.
  2. Покупатель соглашается в чате, например «да, отменяйте».
  3. Отдельная модель оценок проверяет, что покупатель согласился именно на это действие. Вопрос, сомнение или другая просьба — не согласие.
  4. Магазин выполняет действие; повторный вызов того же действия ничего не повторяет.

В переписке появляется строка «Бот выполнил в магазине: …» с результатом, а в аудит-логе проекта — запись «Действие бота в магазине». Черновик оператора данными магазина пользуется только для чтения: действия выполняет оператор сам, в магазине.

Бот отменил заказ по просьбе покупателя

Для разработчиков

Свой сервер подключается, если выполняет контракт MCP магазина версии 1. Для PHP и Laravel контракт уже реализован: класс StoreMcp\Server PHP-библиотеки и маршрут POST /onetrace/mcp пакета Laravel — остаётся написать обработчики инструментов.

Транспорт. MCP Streamable HTTP, версия протокола 2025-06-18: один адрес, запросы POST с JSON-RPC 2.0, ответ — JSON или поток text/event-stream с одним ответом. Адрес — только https:// на публичном IP, без перенаправлений. Ответ — не дольше 10 секунд и не больше 256 КБ. Платформа вызывает initialize, notifications/initialized, tools/list и tools/call; заголовок Mcp-Session-Id поддерживается, но не обязателен.

Доступ. Каждый запрос несёт Authorization: Bearer <ключ>; ключ создаёт магазин, не короче 32 случайных символов. Запрос без ключа или с чужим ключом — ответ 401.

Признак контракта. В ответе на initialize сервер объявляет capabilities.experimental["onetrace/store"] = { "version": 1 } — без него сервер не подключается.

Инструменты. Имена — ровно как в таблице, tools/list возвращает только разрешённые владельцем. У каждого — аннотация readOnlyHint: true (чтение) или destructiveHint: true (действие) и _meta["onetrace/auth"]: customer — нужен подтверждённый покупатель, none — нет. Результат — structuredContent и тот же JSON текстом в content[0].text. Суммы — { "amount": 1250.5, "currency": "RUB" }, даты — ISO 8601.

Инструмент Доступ Вход Результат
store_start_verification none contact, order sent, channel, destination
store_verify none contact, code customer_token, expires_at
store_get_customer customer — id, email, phone, first_name
store_find_orders customer status, limit (до 20) orders: order, created_at, status, status_label, total, items_count
store_get_order customer order заказ с items, total, payment, shipping, can_cancel, can_return
store_get_tracking customer order carrier, tracking_number, tracking_url, status, events
store_check_availability none query, sku или product_id products (до 10) с in_stock, quantity, variants
store_get_delivery_options none country, city, postcode, total methods: name, price, free_from, min_days, max_days
store_get_return_policy none — days, conditions, text, url
store_cancel_order customer order, reason order, status, message
store_create_return customer order, items, reason return_id, status, instructions
store_change_delivery customer order, address, date, time_window order, message

Статус заказа — один из pending, processing, on_hold, shipped, delivered, completed, cancelled, refunded, failed. Заказ другого покупателя — ответ not_found, как будто его нет.

Покупатель. Токен customer_token выпускает и проверяет магазин, срок — не больше 24 часов. Код подтверждения магазин отправляет сам и отвечает одинаково, есть такой покупатель или нет; код — 6 цифр, 10 минут, до 5 попыток, до 5 кодов в час на адрес. Вошедшему покупателю страница передаёт токен трекеру: cdp.chatCustomer('…').

Контекст вызова — в params._meta: onetrace/customer_token, onetrace/language (язык диалога), onetrace/conversation, а у действий — onetrace/confirmed: true и onetrace/idempotency_key. Действие без onetrace/confirmed сервер отклоняет, повтор с тем же ключом идемпотентности возвращает тот же результат без повторного действия.

Ошибки — isError: true и structuredContent: { "error": "<код>", "message": "<текст для покупателя>" }:

Код Когда
auth_required нужен подтверждённый покупатель
invalid_code неверный или просроченный код
not_found нет такого заказа или товара
not_allowed действие недоступно в этом состоянии или выключено владельцем
invalid_input неверные аргументы
rate_limited слишком много запросов или кодов
unavailable временный сбой магазина

Подключение из модуля. Модуль регистрирует свой сервер секретным ключом с правом chats.manage: PUT /api/v1/chat/store-mcp с url, key, name, platform подключает или обновляет сервер, DELETE /api/v1/chat/store-mcp с url — отключает.