3. Описание MCP-сервера › 3.5 AI-инструменты › tool_run

Выполняет одну команду 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] строка имя для людей; по умолчанию имя файла

Путь вызова

Вызов проходит три прохода, и на каждом параметры меняют вид:

Параметр 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 оборван или в нём не тот вид значения

Общие отказы — «Ответы и отказы».