Universal Tool Calling Protocol · 1.0.1
UTCP облака
Те же инструменты, что у MCP облака, но без промежуточного сервера: агент ИИ читает руководство UTCP и сам вызывает API облака по готовым шаблонам запросов — с вашим ключом, напрямую.
UTCP или MCP
| MCP | Клиент ходит на сервер MCP облака (…/mcp), тот вызывает API за него. Вход OAuth через кабинет — для claude.ai, Claude Desktop/Code, Cursor. См. MCP облака. |
|---|---|
| UTCP | Клиент один раз читает руководство (/utcp, без ключа), дальше сам шлёт обычные HTTP-запросы в API облака с ключом X-Api-Key. Посредника нет: те же адреса, ответы, ошибки и журнал, что у API; работает в своих агентах на Python и TypeScript. |
Подключение
Нужен ключ API аккаунта hwk_…: кабинет hw-connector.ru → «Облако» → «Ключи». Для ИИ лучше «только чтение» — тогда инструменты с операциями ответят KEY_READ_ONLY. Ключ — в переменную клиента HW_CLOUD_API_KEY (некоторые клиенты добавляют к имени переменной приставку с именем руководства — см. их документацию).
Python
# pip install utcp utcp-http
import asyncio
from utcp.utcp_client import UtcpClient
async def main():
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "hw_cloud",
"call_template_type": "http",
"url": "https://cloud.hw-connector.ru/utcp",
"http_method": "GET"
}],
"variables": {"HW_CLOUD_API_KEY": "hwk_…"}
})
tools = await client.search_tools("тревоги касс")
print(await client.call_tool("hw_cloud.get_summary", {}))
asyncio.run(main())TypeScript
npm install @utcp/core @utcp/http
# руководство подключается так же: name hw_cloud, call_template_type http, url ниже, переменная HW_CLOUD_API_KEYПример клиента — в документации UTCP: utcp.io.
Само руководство
curl -s https://cloud.hw-connector.ru/utcp # руководство: без ключа
curl -s 'https://cloud.hw-connector.ru/utcp?lang=en' # по-английскиШаблон каждого инструмента — call_template_type: http: адрес с параметрами пути ({id}), метод, тело — вход body_field, остальные входы — строка запроса; ключ — auth типа api_key в заголовке X-Api-Key. Ответы и коды ошибок — как в API облака.
Инструменты
Те же, что у MCP облака (описания одни): помечены «только чтение», «меняет запись в облаке» и «операция на кассе».
Сводка аккаунта. Состояние парка одним запросом: сколько касс всего, на связи, не на связи и выключено; версии агента; открытые тревоги по кодам и сколько критичных; запросы к агентам за сутки и сколько неудачных. Начните с него.
Без входов.
Кассы аккаунта. Список касс (рабочих мест с HW agent): номер, название от агента и своё (label), версия агента, на связи ли сейчас, когда была на связи, выключена ли, сколько открытых тревог.
Входы
onlinebooleantrue — только на связи, false — только не на связиqstringЧасть названия, своего названия или номера установкиlimitintegerСколько вернуть (1–1000, по умолчанию 100)offsetintegerСколько пропустить
Карточка кассы. Всё о кассе: на связи ли, версия агента, ОС, последние значения метрик за 7 дней (смена, ФН, ОФД, принтеры), открытые тревоги и последние события.
Входы
idintegerобязательныйНомер кассы из list_deviceseventsintegerСколько последних событий (1–500, по умолчанию 20)
Устройства на рабочих местах. Последнее известное состояние устройств на рабочих местах: включено ли, у ККТ — смена открыта или просрочена, отвечает ли, дней до конца ФН, не передано в ОФД; принтеры — состояние и причины («нет бумаги»). По данным агента раз в минуту (ККТ — раз в 10 минут), at — когда пришли. Что устройство делает прямо сейчас — call_agent GET /api/v1/operations.
Входы
deviceIdintegerТолько эта касса
Переименовать или выключить кассу. Своё название кассы (агент его не затирает; пустая строка — снова как у агента) и выключатель: выключенной кассе облако не передаёт команды, запросы к агенту и чеки. Меняет только запись в облаке, не кассу.
Тело запроса — вход patch.
Входы
idintegerобязательныйНомер кассыpatchobjectТело запроса (JSON)patch.labelstringСвоё названиеpatch.disabledbooleantrue — выключить, false — включить
Тревоги касс. Тревоги: FN_EXPIRING (ФН скоро закончится), OFD_BACKLOG (документы не уходят в ОФД), SHIFT_EXPIRED (смена больше 24 ч), REGISTER_UNAVAILABLE (ККТ не отвечает), DEVICE_OFFLINE (касса пропала). Открываются и закрываются сами; по умолчанию — только открытые.
Входы
openbooleantrue — только открытые (по умолчанию), false — и закрытыеdeviceIdintegerТолько эта кассаcodestringТолько этот кодseveritystringWARNING или CRITICAL
События касс. События касс аккаунта, свежие сверху: operation.failed (неудачная операция с кодом ошибки), printer (состояние принтера), power (питание), register.unavailable (ККТ не отвечает).
Входы
deviceIdintegerТолько эта кассаtypestringТип событияsincestringНе раньше этого времени, ISO 8601limitintegerСколько вернуть (1–1000, по умолчанию 50)offsetintegerСколько пропустить
Метрика по кассам. Последнее значение одной метрики на каждой кассе за 7 дней: fn.days_left (дней до конца ФН), ofd.not_sent (не передано в ОФД), ofd.oldest_hours, shift.open, shift.expired, register.ok, agent.up, devices.active.
Входы
namestringобязательныйИмя метрики, например fn.days_leftdeviceIdintegerТолько эта касса
Журнал запросов к агентам. Запросы к API агентов через облако (call_agent, прокси, команды): касса, метод, путь, код ответа, ошибка облака (NOT_CONNECTED, TIMEOUT…), время. Тела не хранятся.
Входы
deviceIdintegerТолько эта кассаfailedbooleanТолько неудачныеlimitintegerСколько вернуть (по умолчанию 50)offsetintegerСколько пропустить
Запрос к API агента на кассе. Выполнить запрос к API HW agent на кассе (как локально на http://localhost:7790): например GET /api/v1/devices — устройства, GET /api/v1/registers/1/shift — смена, POST /api/v1/registers/1/reports/x — X-отчёт. Операции (POST) реально выполняются на кассе: печать, чеки, оплата — только по прямой просьбе пользователя и с idempotency_key (повтор с тем же ключом не выполнит операцию дважды). Настройка устройств (/api/v1/setup) недоступна. Описание API агента — https://hw-connector.ru/docs/api/agent/
Тело запроса — вход command.
Входы
idintegerобязательныйНомер кассыcommandobjectобязательныйТело запроса (JSON)command.methodstringобязательныйМетод HTTPзначения:GETPOSTPUTDELETEPATCHcommand.pathstringобязательныйПуть в API агента со строкой запроса, /api/v1/...command.bodyobjectТело JSONcommand.idempotencyKeystringКлюч идемпотентности операции
Пробить чек через облако. Чек на кассе аккаунта с очередью: касса не на связи — чек ждёт и уйдёт, когда она появится. receipt — как в API агента (type, items, payments…). Тот же idempotency_key вернёт тот же чек, второй раз не пробьёт. Настоящий фискальный чек — только по прямой просьбе пользователя.
Тело запроса — вход request.
Входы
requestobjectобязательныйТело запроса (JSON)request.idempotencyKeystringобязательныйКлюч идемпотентности, например номер заказаrequest.receiptobjectобязательныйЧек: type, items, payments…request.deviceIdintegerКасса; нет — любая на связиrequest.registerintegerНомер ККТ на кассе (по умолчанию 1)request.callbackUrlstringКуда прислать итог (вебхук)
Чек. Чек, отправленный через облако: статус (QUEUED, SENDING, DONE, FAILED, UNKNOWN, EXPIRED), ФД, ФП, ссылка на чек, ошибка.
Входы
idintegerобязательныйНомер чека
Последние чеки. Чеки через облако, свежие сверху; idempotency_key — найти чек по своему ключу.
Входы
deviceIdintegerТолько эта кассаidempotencyKeystringКлюч идемпотентностиlimitintegerСколько (по умолчанию 20)
Учёт чеков за месяц. Сколько чеков и на какую сумму пробила каждая касса за месяц, тариф и пробный лимит.
Входы
monthstringМесяц ГГГГ-ММ; нет — текущий
Безопасность
call_agentиcreate_receiptвыполняют настоящие операции на кассе: печать, фискальный чек, оплату. Агент ИИ должен спрашивать подтверждение перед ними; для наблюдения за парком хватит ключа «только чтение».- Ключ хранится у клиента (переменная, файл .env) и уходит только в API облака. Отозвать — кабинет → «Облако» → «Ключи». Каждый запрос к агентам — в журнале
GET /api/v1/requests; лимит — 600 запросов в минуту на аккаунт. - Настройку устройств (
/api/v1/setup) облако не передаёт; выключенной кассе (update_device) ничего не уходит.