Stipendex

Транспортные биндинги: 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.

Цикл оплаты

  1. Агент вызывает инструмент. Без оплаты сервер возвращает JSON-RPC ошибку:
{
  "error": {
    "code": -32402,
    "message": "Payment required",
    "data": { "quote": { "stipendex": "quote/0.1", "…": "…" } }
  }
}
  1. Хост перехватывает -32402 (LLM ошибку не видит), передаёт Quote кошельку.
  2. Кошелёк платит → Proof; хост повторяет вызов:
{
  "method": "tools/call",
  "params": {
    "name": "web_search",
    "arguments": { "query": "…" },
    "_meta": { "stipendex/payment": { "stipendex": "proof/0.1", "…": "…" } }
  }
}
  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 (и осознанно близок по механике):

  1. Запрос без оплаты:
HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "quote": { "stipendex": "quote/0.1", "…": "…" } }
  1. Повтор с оплатой:
GET /api/search?q=…
Stipendex-Payment: <base64url(Proof JWS)>
  1. Ответ:
HTTP/1.1 200 OK
Stipendex-Receipt: <base64url(Receipt JWS)>

Дискаверабилити

GET /.well-known/stipendex.json — дескриптор получателя: id, ключ, рельсы, ссылка на реестр доверия, поддерживаемые профили. Формат совпадает с дескриптором реестра (trust-registry.md) — self-hosted вариант того же документа.

Общие требования транспортов