Руководство Melbis Shop: оглавление
Выполняет одну команду AI-инструмента магазина.
«Инструменты → Выполнить» (AGENT_TOOL_RUN); команды
самих AI-инструментов выдаются отдельно, в реестре AI-инструментов.
| Параметр | Тип | Что это |
|---|---|---|
unit |
строка | адрес инструмента из tool_list:
MELBIS_AGENT_CURRENCY |
command |
строка | команда: CmdList |
[params] |
объект | поля команды, как их объявляет tool_list с этим
unit, каждое значением своего типа |
[params_source] |
строка | файл JSON на этом компьютере с тем же объектом полей — абсолютный
путь или путь от папки магазина — вместо params, см. «Поля и вложения из файла» |
[files] |
список объектов | вложения — для команды, которая их принимает |
[files_source] |
строка | файл JSON на этом компьютере с тем же списком вложений — вместо
files |
[debug] |
да/нет | добавить ко времени число запросов модуля и их время |
[into] |
строка | имя задания одним словом, без пути и точек: таблицы ответа
дописываются ещё и в файл <into>.<table>.jsonl,
см. «Задание into» |
params и params_source — одно и то же двумя
путями, вместе их указывать нельзя; так же files и
files_source. Команде без полей не нужно ни то, ни другое.
Поле со значением null считается неназванным. Что принимает
каждый тип поля — «AI-инструменты».
Запись вложения:
| Поле | Тип | Что это |
|---|---|---|
file |
строка | файл на этом компьютере — абсолютный путь или путь от папки магазина |
entity |
строка | сущность — таблица-владелец файла, см. «Файлы элементов» |
elem_id |
число | id строки, которой принадлежит файл |
[kind_key] |
строка | вид файла; по умолчанию kBase |
[real_name] |
строка | имя для людей; по умолчанию имя файла |
Вызов проходит три прохода, и на каждом параметры меняют вид:
$mParam.| Параметр | MCP-сервер | Melbis Core | Модуль |
|---|---|---|---|
unit |
передаёт | находит инструмент в реестре; файл модуля берёт из реестра, а не из вызова | — |
command |
передаёт | находит функцию модуля в любом регистре имени, проверяет, выдана ли команда | — |
[params] |
передаёт | сверяет поля с реестром, приводит типы, ставит умолчания | $mParam |
[params_source] |
читает файл и отправляет его как params |
как params |
$mParam |
[files] |
читает файлы в части запроса; путь file в магазин не
уходит |
раскладывает файлы на диск и создаёт их строки | $mParam['files'] — строки файлов с id,
path, size… |
[files_source] |
читает список и отправляет его как files |
как files |
как files |
[debug] |
передаёт флагом рядом с вызовом | считает запросы модуля | — |
[into] |
оставляет себе: дописывает таблицы ответа в файлы задания | — | — |
Тот же путь на одном вызове «Импорта файлов» из поставки.
1. Агент вызывает:
{"unit": "MELBIS_AGENT_IMPORT_FILES", "command": "CmdAdd",
"params": {"profile": "catalog"}, "files_source": "mcp\\claude-code\\photos.json",
"into": "photos", "debug": true}а в photos.json его скрипт записал:
[{"file": "C:\\photos\\1532_front.jpg", "entity": "store", "elem_id": 1532, "real_name": "Вид спереди"}]2. MCP-сервер читает список и файл и отправляет в
магазин запрос, в котором файл едет частью data_1, а
локального пути нет. into сервер оставляет себе:
{"unit": "MELBIS_AGENT_IMPORT_FILES", "command": "CmdAdd", "params": {"profile": "catalog"},
"debug": true, "files": [{"part": "data_1", "entity": "store", "elem_id": 1532, "real_name": "Вид спереди"}]}3. Melbis Core находит инструмент и команду,
проверяет выдачу и поле profile, кладёт файл в
files/2026/09_18/14_05/, создаёт строку в
files_store и вызывает модуль:
CmdAdd($mUserId, [
'profile' => 'catalog',
'files' => [['entity' => 'store', 'id' => 841, 'elem_id' => 1532, 'kind_key' => 'kBase',
'file_name' => 'files_store_1_841.jpg', 'path' => 'files/2026/09_18/14_05/',
'real_name' => 'Вид спереди', 'size' => 184233, 'pos' => 1, …]]
]);Поля, которые агент написал на вложении сверх известных магазину, едут в той же строке: инструмент может спросить о файле больше, чем знает Melbis Core.
4. Модуль видит только человека сессии и готовые
поля: о debug, into, локальных путях и
files_source он не знает. Его ответ проходит обратный путь
— «Путь ответа» ниже.
{"result": true, "message": "The tables asked for",
"detail": {},
"tables": {"currency": {"rows": 3,
"file": "D:\\Melbis\\shop.example.com\\mcp\\melbis\\tables\\MELBIS_AGENT_CURRENCY.CmdList.currency.jsonl",
"head": ["{\"id\":\"1\",\"name\":\"USD\"}", "…", "…"]}},
"files": [],
"time": {"server": 11, "module": 1, "trip": 46}}| Поле | Что это |
|---|---|
result |
true — сделано, false — отказ |
message |
что произошло и что делать дальше |
detail |
значения, которые вернула команда: id новой строки,
found и другие — их смысл написан в описании команды;
{}, если их нет |
tables |
таблицы ответа: rows — сколько строк, file
— где они лежат, head — первые три строки текстом,
обрезанные до 300 символов; с into ещё job —
файл задания и job_rows — сколько строк в нём теперь;
{}, если таблиц нет |
files |
вложения, которые команда оставила себе; [], если их
нет |
time |
server — сколько вызов длился на сервере,
module — сколько из этого занял модуль, trip —
полный круг по часам этого компьютера; с debug ещё
sql и sql_ms |
Файл таблицы перезаписывается каждым вызовом этой команды, файл задания только растёт — см. «AI-инструменты». Как команда строит этот ответ — ключи, таблицы, отказы и падения с примерами — описано в «Ответе команды» руководства разработчика, «AI-инструменты».
Вложения принадлежат той команде, которая назвала их своими в
files. Если отправленные файлы там не названы, магазин
убирает их все, а к message дописывается
The N file(s) sent with this call are gone: the command [<команда>] did not take them.
Если модуль не нашёлся или прервался ошибкой, отправленные с вызовом
файлы уже записаны: они остаются у тех товаров и других элементов, к
которым их прислали.
Ответ идёт обратно теми же тремя проходами, и то, что вернул модуль, агент получает в другом виде: строки уходят в файлы, недостающие ключи дописываются, появляется время.
| Ключ | Модуль | Melbis Core | MCP-сервер | Агент получает |
|---|---|---|---|---|
result |
обязан вернуть true или false |
нет result — падение:
<UNIT>\<команда> answered without result |
передаёт как есть | true или false |
message |
что произошло и что делать дальше | если убрал непринятые файлы, дописывает об этом фразу | передаёт как есть | message |
detail |
свои значения: id, found… |
не вернул — ставит {} |
передаёт как есть | detail |
tables |
строки списками под именами | не вернул — ставит {} |
пишет каждую таблицу в
<UNIT>.<команда>.<таблица>.jsonl; с
into дописывает её ещё в файл задания |
по каждой таблице rows, file,
head; с into ещё job,
job_rows |
files |
принятые вложения | не вернул — ставит [] |
передаёт как есть | files |
| другие ключи | всё, что вернул сверх пяти | оставляет после пяти ключей | передаёт как есть | как вернул модуль |
| время | не пишет | время всего запроса и время модуля; с debug — число
запросов модуля и их время |
добавляет полный круг по часам этого компьютера | time: server, module,
trip; с debug ещё sql,
sql_ms |
| падение | исключение, нет модуля или функции | отвечает текстом ошибки вместо JSON | передаёт текст | отказ текстом, без JSON |
При result: false агент получает тот же ответ, но
помеченный как ошибка вызова (isError): по этой пометке
приложение-агент понимает, что команда не выполнена.
Тот же путь на ответе «Валют», CmdList.
1. Модуль возвращает:
return ['result' => true, 'message' => 'The tables asked for', 'tables' => ['currency' => $rows]];2. Melbis Core дописывает недостающие ключи и отправляет ответ в своём конверте вместе со временем:
{"ok": true, "ms": 11, "unit_ms": 1,
"data": {"result": true, "message": "The tables asked for", "detail": {},
"tables": {"currency": [{"id": "1", "name": "USD"}, …]}, "files": []}}3. MCP-сервер снимает конверт, пишет строки таблицы
в файл и собирает time. Агент получает:
{"result": true, "message": "The tables asked for", "detail": {},
"tables": {"currency": {"rows": 3, "file": "…\\MELBIS_AGENT_CURRENCY.CmdList.currency.jsonl",
"head": ["{\"id\":\"1\",\"name\":\"USD\"}", "…", "…"]}},
"files": [], "time": {"server": 11, "module": 1, "trip": 46}}Приложению на версии протокола 2025-06-18 и новее тот же объект
приходит ещё и данными, в structuredContent — см. «Ответы и отказы». Что каждый ключ значит для
того, кто пишет инструмент, — «Ответ команды» в «AI-инструментах».
result: false — отказ команды или
движка до неё: незнакомая команда, невыданная, лишнее или отсутствующее
обязательное поле, неверный тип. Ответ приходит с признаком ошибки и тем
же JSON, что и успешный; причина — в message.
{"result": false, "message": "Unknown command [CmdNope]. The tool has: CmdList, CmdAdd, CmdUpdate, CmdRemove, CmdPos",
"detail": {}, "tables": {}, "files": [],
"time": {"server": 6, "trip": 47}}| Ответ | Когда |
|---|---|
ACCESS_DENIED: no such tool: <unit> |
инструмента с таким адресом нет |
Module not found! [units/<модуль>.php] |
модуль инструмента не найден на сервере |
Function not found! [<UNIT>\<команда>] |
в модуле нет функции этой команды |
<UNIT>\<команда> failed: <текст> |
модуль прервался ошибкой; текст называет её |
<UNIT>\<команда> answered without result,
The command answered without result… |
команда ответила без result: сделано или отказано, не
узнать |
The command [<команда>] takes no files… |
вложения отправлены команде, которая их не принимает |
The command [<команда>] carries the files themselves - … |
команда требует вложений, а их нет |
Unknown element entity: <сущность>,
Element not found: <сущность> id <id>,
No group […] |
вложение указывает на неизвестную сущность, несуществующий элемент или чужой вид файла |
The table files_… is in work right now, and nothing was written… |
таблицу вложений держит кто-то другой; не записано ни одно |
unit is required…,
command is required… |
не указан инструмент или команда |
into is the bare name of a job… |
в into есть путь или точка |
These files come to more than … KB together… |
вложения вместе тяжелее MaxFileSize из
Shop.ini: если команда берёт каждый файл отдельно, их
отправляют меньшими пачками, иначе владелец поднимает предел; один файл
проходит при любом размере |
Every entry needs file - a path on this machine.,
No such file: … |
у вложения нет file, или нет файла вложения,
params_source или files_source |
params or params_source, not both…,
files or files_source, not both… |
указаны оба |
params is an object of fields…,
files is a list of entries… |
значение не того вида |
… is not utf-8 text - save it in utf-8. |
файл params_source или files_source не в
UTF-8 или в нём нулевой байт |
… is not whole json…,
… holds no object of fields…,
… holds no list of entries… |
файл params_source или files_source
оборван или в нём не тот вид значения |
Общие отказы — «Ответы и отказы».