Транспортные биндинги: MCP и HTTP
Как конверт (envelope.md) ездит по двум транспортам. Оба биндинга семантически эквивалентны; получатель MAY поддерживать оба.
MCP-биндинг
Капабилити и цены
Сервер объявляет поддержку в initialize:
{ "capabilities": { "experimental": { "stipendex/payments": { "version": "0.1" } } } }
Инструменты несут ориентир цены в _meta (уровень L0 — полезен даже без
платёжного кода; _meta — точка расширения MCP, кастомные ключи annotations
SDK вырезает при валидации):
{
"name": "web_search",
"_meta": {
"stipendex/pricing": { "model": "per_call", "estimate": "0.005 USD" }
}
}
stipendex/pricing — маркетинговый ориентир для планировщика, не оферта. Обязательство —
только подписанный Quote.
Цикл оплаты
- Агент вызывает инструмент. Без оплаты сервер возвращает JSON-RPC ошибку:
{
"error": {
"code": -32402,
"message": "Payment required",
"data": { "quote": { "stipendex": "quote/0.1", "…": "…" } }
}
}
- Хост перехватывает
-32402(LLM ошибку не видит), передаёт Quote кошельку. - Кошелёк платит → Proof; хост повторяет вызов:
{
"method": "tools/call",
"params": {
"name": "web_search",
"arguments": { "query": "…" },
"_meta": { "stipendex/payment": { "stipendex": "proof/0.1", "…": "…" } }
}
}
- Сервер верифицирует Proof (сам или через фасилитатора), исполняет, возвращает
результат; Receipt — в
_metaответа:
{ "result": { "content": [ … ], "_meta": { "stipendex/receipt": { "…": "…" } } } }
Пока stipendex/payments не принят в спецификацию MCP (SEP), всё выше живёт в
experimental/_meta и не требует изменений протокола.
HITL через elicitation
В режиме interactive кошелёк запрашивает подтверждение стандартным elicitation
(интерфейс уже есть у MCP-хостов): текст = description + итог + остаток лимитов.
Ответ фиксируется в Confirmation.
Хост без поддержки Stipendex
Кошелёк работает прокси-режимом: MCP-клиент хоста подключается не к серверу
напрямую, а к локальному прокси кошелька, который прозрачно обрабатывает -32402.
Так адопция не блокируется на вендорах хостов (но нативная интеграция удобнее —
см. roadmap).
HTTP-биндинг
Совместим по духу с x402 (и осознанно близок по механике):
- Запрос без оплаты:
HTTP/1.1 402 Payment Required
Content-Type: application/json
{ "quote": { "stipendex": "quote/0.1", "…": "…" } }
- Повтор с оплатой:
GET /api/search?q=…
Stipendex-Payment: <base64url(Proof JWS)>
- Ответ:
HTTP/1.1 200 OK
Stipendex-Receipt: <base64url(Receipt JWS)>
Дискаверабилити
GET /.well-known/stipendex.json — дескриптор получателя: id, ключ, рельсы, ссылка на
реестр доверия, поддерживаемые профили. Формат совпадает с дескриптором реестра
(trust-registry.md) — self-hosted вариант того же документа.
Общие требования транспортов
- Quote/Proof/Receipt передаются целиком, без пересборки полей транспортом: подпись проверяется над каноническим JSON (JCS, RFC 8785).
- Повтор запроса с тем же Proof — идемпотентен (см. envelope).
- TLS обязателен для HTTP-биндинга; для MCP — по транспорту хоста.