3. Описание MCP-сервера › 3.6 Витрина › Концепция

Семья shop работает с магазином снаружи: открывает страницу витрины так, как её получает посетитель, запускает на витрине собственный модуль агента и копирует код магазина на этот компьютер.

Инструмент Что делает Куда обращается
shop_page открывает страницу или отправляет форму адрес страницы на сайте
shop_run запускает модуль агента agent.php в корне сайта
shop_download копирует модули, профайлы или базу движок, как инструменты engine_*

shop_page и shop_run прав не требуют: они идут на сайт дорогой посетителя, а не в движок. Одно исключение: shop_page с debug=true спрашивает у движка код отладчика и поэтому требует права «Получить конфигурацию». shop_download требует права «Экспорт → Магазин».

Правила

У семьи свои правила — shop.md в папке Engine\MCP. Первый вызов любого инструмента shop_* в сессии отказывает с ними; после подтверждения через session_rules_accept работают все инструменты семьи.

Страница

shop_page запрашивает страницу, как браузер посетителя, и сохраняет HTML в mcp\melbis\pages\. Каждое чтение — новый визит: без кук и без сессии.

Страница может прийти из кеша. Сохранение файла модуля сбрасывает кеш только этого модуля — что очищается само, описано в «Конфигурации и кеше». Если правка на странице не видна, причиной бывает кеш другого модуля, который выводит изменённое место.

Это разметка, а не картинка. По HTML видно, что изменилось в коде страницы; как она выглядит, видит только человек в браузере.

Отчёт отладчика. С debug страница запрашивается в машинном виде отладчика («Средства отладки»): весь отчёт сохраняется рядом со страницей, в ответ приходят главные числа и модули страницы. Код отладчика сервер берёт из конфигурации магазина, поэтому такой вызов требует права «Прямой доступ → Разработка → Получить конфигурацию». В ответ и в имена файлов код не попадает. Если кода нет, его задаёт владелец: «Проектирование → Инсталляция», поле «Пароль отладчика». Подписи на оригинальном языке могут отличаться.

Форма

С полем post вызов становится отправкой формы. Так работает всё живое на витрине: корзина, заявка, отзыв, заказ. В отличие от чтения, отправка меняет магазин — появляются строки корзины, заявки, письма менеджеру, а в работающем магазине и настоящий заказ. Тестового режима у витрины нет.

Куки отправок сохраняются, пока работает MCP-сервер, поэтому отправки подряд — один посетитель. Чтение страницы этих кук не видит: положить товар в корзину и посмотреть корзину — две отправки. В демо-магазине корзина отвечает на поля func и id:

{"url": "/?mod=melbis_basket", "post": {"func": "Plus", "id": 12}}
{"url": "/?mod=melbis_basket", "post": {"func": "Goods"}}

Поля формы называются так, как их пишет разметка страницы. Список значений уходит как имя[]=… по одному на значение — так браузер отправляет флажки и множественный выбор, и только так PHP читает поле массивом. Токен формы, если он есть, сам не берётся: сначала читают страницу.

Модуль агента

shop_run запускает модуль через точку входа agent.php в корне сайта и возвращает ответ витрины. Так выполняется работа, для которой нет AI-инструмента: отчёт по нескольким таблицам, проверка всего каталога, разовая правка со своей логикой.

Точка входа запускает модуль, только если:

  1. подходит ключ сессии — его выдаёт session_connect;
  2. имя модуля начинается с agent_;
  3. модуль есть в units/;
  4. модуль — точка входа: ajax_load: 1 в манифесте, в программе — «Модуль входной точки».

Ключ сессии один на логин: параллельные сессии одного пользователя делят его. Сервер магазина хранит ключ в памяти сутки, каждый session_connect продлевает срок, а перезапуск сервера ключ стирает.

Параметры уходят так же, как поля формы, — список приходит массивом, — и модуль получает их одним сериализованным аргументом: в манифесте объявлено post: serial, значения лежат в $mVars['post'] — см. «Модульный скрипт». Служебные login, secret и mod точка входа убирает до запуска модуля.

Ответ проходит через парсер, как любая страница: шаблоны, теги, кеш. Весь он сохраняется в mcp\melbis\runs\<модуль>.txt. Если модуль упал, сообщение, файл и строку движок записывает в журнал витрины core/log/melbis/front.log.

Прав на запуск нет. Запустить готовый модуль agent_* может любой, кто вошёл в магазин; создать или изменить модуль — логин с правом «Прямой доступ → Разработка → Изменение данных».

shop_run и tool_run

Оба запускают PHP-код магазина, но это разные двери.

shop_run tool_run
Куда идёт витрина, agent.php в корне сайта движок, core/mcp.php
Что запускает модуль-точку входа agent_* команду AI-инструмента
Как через парсер: шаблоны, кеш вызывает функцию команды в модуле инструмента
Что возвращает ответ модуля текстом JSON команды: result, message, detail, tables, files
Кто разрешает только ключ сессии реестр AI-инструментов и выданная команда
Для чего свой код: попробовать, разовая работа работа, которую предусмотрел владелец

tool_run — рабочий вызов, shop_run — мастерская. Черновик из мастерской нередко становится AI-инструментом: «AI-инструменты».

Копия магазина

shop_download — единственный инструмент семьи, который берёт из движка данные. Архив он собирает так же, как «Копирование» в программе, и распаковывает на этом компьютере:

action Что в копии
modules units/, templates/ и файлы корня сайта
profiles profiles/ — профайлы пользователей программы: сохранённые настройки окон и условия запросов
database dump.sql — дамп всей базы магазина

config.json в копию не попадает никогда. Файлов элементов из files/ среди видов копии нет: их скачивает engine_files_load.

Копия — снимок на момент вызова. Правка в ней не уходит на сервер, а поздние правки магазина в неё не попадают: файлы магазина меняют инструменты engine_*.