Перейти к содержимому

Интеграция Agentfy ​

Граница runtime и делегированный контекст ниже — требования к реализации. Сведения о готовности отражают проверку 2 октября 2026, не текущий статус. Для транспорта модуля и записей используйте REST 1.0.

Три границы полномочий ​

text
Runtime Agentfy ──(1) ключ агента + (2) грант разговора──▶ MCP Store Deputy
                                                            │ права, аудит
                                                            │
                 (3) подпись подключения, никогда (1) или (2) ┘
                                                            ▼
                                              REST API модуля OpenCart
ГраницаДоказательствоКто выдаёт, кто хранитДействует только вНикогда
Агент → Store DeputyAuthorization: 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-IdRuntime AgentfyСовпадает с агентом, которому выдан ключ
X-SD-Context: sdcg_…Runtime Agentfy, для каждого разговораСуществует, не просрочен и не отозван, выдан этому агенту и этому треду
X-Agentfy-Thread-IdRuntime AgentfyСовпадает с тредом, для которого выдан грант
X-Agentfy-Turn-IdRuntime AgentfyТолько для аудита
X-Agentfy-Tool-Call-IdRuntime AgentfyСтановится стабильным ключом операции для изменения
X-Agentfy-Initiated-ByRuntime Agentfyhuman, 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 человек вошёл в аккаунт.