Интеграция Agentfy
Граница runtime и делегированный контекст ниже — требования к реализации. Сведения о готовности отражают проверку 2 октября 2026, не текущий статус. Для транспорта модуля и записей используйте REST 1.0.
Три границы полномочий
Runtime Agentfy ──(1) ключ агента + (2) грант разговора──▶ MCP Store Deputy
│ права, аудит
│
(3) подпись подключения, никогда (1) или (2) ┘
▼
REST API модуля OpenCart| Граница | Доказательство | Кто выдаёт, кто хранит | Действует только в | Никогда |
|---|---|---|---|---|
| Агент → Store Deputy | Authorization: Bearer sdak_…, один на созданного агента | Store Deputy; Agentfy хранит как секрет команды | MCP Store Deputy | Не пересылается в магазин, не показывается модели, не считается полномочием человека |
| Человек или покупатель | X-SD-Context: sdcg_…, один на разговор | Store Deputy; Agentfy несёт его для каждого разговора | MCP Store Deputy, для этого агента и треда | Не имеет собственных прав; не переживает отозванного членства |
| Store Deputy → магазин | HMAC секретом подключения, в обе стороны | Store Deputy и модуль, при подключении | Модуль одного этого магазина | Не покидает серверов Store Deputy или магазина |
Storefront-сессия покупателя — четвёртый секрет, и она никогда не покидает магазин. Модуль проверяет её и передаёт Store Deputy только непрозрачную ссылку (см. покупатели).
MCP Store Deputy
Транспорт. Один адрес {STORE_DEPUTY_API}/mcp, Streamable HTTP, версия протокола 2025-06-18 (именно её сегодня отправляет клиент Agentfy). Сервер без состояния: Agentfy открывает новую MCP-сессию на каждый вызов, поэтому initialize должен быть дешёвым, и никакое состояние не может держаться на Mcp-Session-Id. tools/list возвращает все инструменты одной страницей, потому что Agentfy не идёт по nextCursor.
Инструменты Admin Agent (этап A). Все только читают; всем, кроме store_status, нужна возможность catalog.read.
| Инструмент | Что делает |
|---|---|
store_status | Какой магазин, доступен ли, на паузе ли, какие инструменты сейчас работают |
catalog_find_products | Поиск по SKU, модели, EAN и другим идентификаторам; возвращает все совпадения и никогда не выбирает одно |
catalog_get_products | Актуальные данные по ID товара; отсутствующие ID перечислены |
catalog_list_products | Постраничный просмотр каталога, при желании — только недавние изменения |
Инструменты Frontend Agent (этап B): cart_get, cart_add_item, cart_update_item, cart_remove_item. Изменение цен выключено, пока у STOR-5 не появится собственная проверка согласования.
Правила для каждого инструмента:
- Ни один аргумент не называет магазин, команду, человека, покупателя, разговор, право на цену или разрешение. Каждая объектная схема запрещает лишние поля. Передача
store_idотклоняется сinvalid_argumentsи ничего не выбирает. Скрипт проверки контролирует оба правила. - Имена — только буквы, цифры и подчёркивания. Провайдеры моделей за Agentfy отвергают точки, а Agentfy молча убирает имена, которые провайдер не принимает.
- Инструмент появляется в списке только тогда, когда он есть в профиле агента, манифест магазина объявляет нужную возможность и подписка команды это разрешает. Вызов инструмента вне списка отклоняет сервер, а не только скрывает.
- Результаты. Успех возвращает
structuredContentи тот же JSON текстом. Ошибка устанавливаетisErrorи возвращает{ "error": { "code", "message", "retryable", "details" } }. Agentfy сегодня не читаетisError, поэтому сообщение должно быть понятно модели само по себе. - Текст магазина — это данные. Названия товаров и опций возвращаются как поля и никогда не встраиваются в инструкции. Товар с названием «ignore previous instructions» ничего не меняет.
- ID — текстом (
"42"), чтобы схема была одинаковой на всех платформах; деньги — десятичной строкой с четырьмя знаками.
Доверенный контекст
Что отправляет Agentfy
| Заголовок | Кто устанавливает | Что проверяет Store Deputy |
|---|---|---|
Authorization: Bearer sdak_… | Agentfy, из секрета команды storedeputy:Authorization (работает уже сегодня) | Известен и не отозван; даёт команду, магазин и профиль |
X-Agentfy-Agent-Id | Runtime Agentfy | Совпадает с агентом, которому выдан ключ |
X-SD-Context: sdcg_… | Runtime Agentfy, для каждого разговора | Существует, не просрочен и не отозван, выдан этому агенту и этому треду |
X-Agentfy-Thread-Id | Runtime Agentfy | Совпадает с тредом, для которого выдан грант |
X-Agentfy-Turn-Id | Runtime Agentfy | Только для аудита |
X-Agentfy-Tool-Call-Id | Runtime Agentfy | Становится стабильным ключом операции для изменения |
X-Agentfy-Initiated-By | Runtime Agentfy | human, heartbeat или agent; грант человека могут нести только ходы human |
Модель не устанавливает ни один из них. Заголовки идут тем же TLS-запросом, что и ключ агента, поэтому они ровно настолько надёжны, насколько надёжен сам Agentfy. Подписанный токен контекста не нужен, пока между Agentfy и Store Deputy не появится посредник.
Что выводит Store Deputy
На каждом вызове инструмента, до любого запроса в магазин, Store Deputy превращает заголовки в один разрешённый контекст: команда, магазин, профиль, актор и действующие права. Код инструмента видит только этот результат.
| Актор | Когда | Что может |
|---|---|---|
employee | Человек открыл разговор в app; грант называет пользователя Store Deputy | Пересечение гранта, его текущей роли в команде, профиля агента, подписки и возможностей магазина |
agent | Ход по расписанию или от другого агента, без гранта | Чтения, которые владелец разрешил агенту; никогда не изменение, требующее согласования человека |
shopper | Посетитель открыл чат на витрине; грант называет привязку покупателя | Только собственная корзина, пока модуль подтверждает привязку |
Смена роли, удаление участника, отключение магазина или отзыв гранта действуют со следующего вызова, потому что в гранте ничего не кешируется. Грант одного разговора отклоняется в другом, поэтому два параллельных разговора одного агента не смешиваются.
Чего Agentfy ещё не делает
Это результат чтения ветки main Agentfy 2 октября 2026 года. Это требования к STOR-22 и связанным задачам, которые нужно согласовать с командой Agentfy, а не изменения, которые делаются здесь.
| Сегодня в Agentfy | Нужно |
|---|---|
| Вызовы MCP несут только статические заголовки, общие для команды; по правилу никакого контекста агента, пользователя или разговора не отправляется | По явному включению для конкретного MCP-сервера — заголовки из таблицы выше, которые устанавливает runtime |
| Нет секрета на уровне разговора | Хранить грант Store Deputy для каждого треда вне prompt и отправлять его в вызовах этого треда |
| Ходы посетителей вообще не получают MCP-инструментов | Разрешить их для сервера, помеченного как frontend (этап B) |
isError не проверяется | Считать такой шаг инструмента неудачным (рекомендуется) |
| Треды кабинета привязаны к пользователю Agentfy | Отдельный тред для каждого человека Store Deputy, чтобы их гранты никогда не пересекались |
| Нет сервисного ключа; создание агентов и MCP-серверов требует сессии пользователя | Сервисный способ создать агента (STOR-23) |
Как Agentfy получает грант в начале разговора, зависит от того, кто открывает разговор, а это ещё открытый вопрос (см. открытые пункты). Предложение: разговор открывает Store Deputy, потому что именно в app человек вошёл в аккаунт.