Command Palette

Search for a command to run...

UnylyUnyly
протокол · v1.0 stable

Sael

наследник MCP

Source-available протокол для общения AI-агентов с тулзами. Стриминг, серверная композиция, подписки и capability-безопасность — встроены в протокол, а не прикручены сверху. Совместим с MCP через adapter. Лицензия BUSL-1.1 — коммерческое использование по лицензии.

Два сервера, соединённые потоком данных Sael
−89%
round-trips
−94%
трафик
10×
до 1-го ответа
сдвиг парадигмы

MCP — это REST. Sael — это real-time web.

Та же эволюция, что веб уже прошёл: от запрос-ответ к стримам и подпискам. AI-тулинг сейчас застрял в 2010-х.

HTTP request/response
WebSocket streaming
один вызов = один запрос
REST
GraphQL + gRPC-стримы
композиция на сервере
Polling по cron
Подписки / push
реактивно, без опроса
Модель — это роутер
Сервер композирует, модель оркеструет
данные не идут через контекст

главный инсайт

В агентных системах дефицитный ресурс — это контекстное окно. MCP гоняет каждый промежуточный результат обратно через модель: каждый хоп стоит токенов, латентности и денег. Sael оставляет данные на сервере — модель один раз описывает план и получает ответ. Модель перестаёт быть сетью.

Почему MCP перестал тянуть

MCP — это JSON-RPC из 2010-х, натянутый на AI. Для desktop-app — норм. В production — рвётся по швам.

Нет стриминга
Long-running операции через SSE-костыли. Заметный lag.
Контекст забывается
Агент шлёт контекст заново на каждый вызов. Жжёт токены.
Нет композиции
N шагов = N round-trips, каждый тащит payload через клиента.
Нет подписок
Реактивные flow — через polling cron-ом. Грубо.
Нет backpressure
Сервер можно убить трафиком. Нет graceful degradation.
Тулзы могут всё
Агент может вызвать что угодно. Enterprise это не примет.

Что встроено в Sael

Канал WebSocket держится живым. Каждая возможность — часть протокола, а не SDK-обёртка.

Streaming-first
Любой tool может стримить. Cancel на лету. Backpressure встроен в транспорт.
Композиция за 1 вызов
tool₁ → filter → map → tool₂ выполняется на сервере. N round-trips → 1.
Подписки first-class
subscribe(topic, filter) → стрим событий. Push вместо polling.
Capability-безопасность
Подписанные токены (SCT). Агент не может больше, чем выдал юзер. Granular per-tool.
Multi-agent нативно
Агенты вызывают друг друга через протокол. Федерация серверов из коробки.
Production-готовность
Session resume, heartbeat, cost-tracking и W3C-трейсинг — в ядре протокола.

Как это работает

Один живой канал. Компактные фреймы. Сервер исполняет цепочку и шлёт клиенту только финал.

HEYhandshake + capabilities
LSTдискавери тулз
INVвызов / pipeline
STRстрим-чанки
RESрезультат
SUBподписка → EVT
ENDконец стрима + cost

один INV описывает всю цепочку

→ INV { pipeline: [
    { tool: 'github.list_repos', input: { owner: 'anthropic' } },
    { filter: 'stars > 100' },
    { map: ['name'] },
    { tool: 'slack.notify', input_bind: { items: '$prev', channel: '#dev' } },
  ] }
← RES { output: { delivered: 2 }, cost: { compute_ms: 14 } }   // один round-trip

parallel fan-out — N веток конкурентно на сервере

→ INV { pipeline: [
    { tool: 'data.fetch', input: { n: 20 } },
    { parallel: [
        [ { tool: 'enrich.summary',   input_bind: { data: '$prev' } } ],
        [ { tool: 'enrich.sentiment', input_bind: { data: '$prev' } } ],
        [ { tool: 'enrich.translate', input_bind: { data: '$prev' } } ],
    ] },
  ] }
← RES { output: [ /* 3 results, in order */ ] }   // 1 round-trip, ветки параллельно

6 независимых веток × 50 мс: MCP — 7 round-trips, ~312 мс (последовательно). Sael — 1 round-trip, ~53 мс (wall-clock = медленная ветка, не сумма).

Бенчмарк, не маркетинг

Эталонный Go-сервер Sael против spec-корректного MCP. Те же тулзы, тот же датасет, тот же транспорт (WebSocket). Считаем структуру протокола, а не железо.

меньше round-trips
цепочка из 8 шагов: 9 → 1
17×
меньше данных на проводе
139 KB → 8 KB
10×
быстрее до первого ответа
стриминг: 1012 мс → 101 мс

Выигрыш растёт с глубиной агентного цикла и размером данных. На одиночном tool-вызове разницы в round-trips нет — Sael выигрывает на многошаговых задачах, где MCP гоняет промежуточные данные через клиента.

Код: MCP против Sael

MCP — каждый шаг отдельным round-trip

// 1. List repos
const repos = await mcp.call(
  'github.list_repos',
  { owner: 'anthropic' }
)

// 2. Filter client-side
const big = repos.filter(r => r.stars > 100)

// 3. Get names
const names = big.map(r => r.name)

// 4. Send to slack
await mcp.call('slack.notify', {
  channel: '#dev',
  items: names
})

Sael — вся цепочка за 1 round-trip

await ch.pipeline([
  { tool: 'github.list_repos',
    input: { owner: 'anthropic' } },
  { filter: 'stars > 100' },
  { map: ['name'] },
  { tool: 'slack.notify',
    input_bind: {
      items: '$prev',
      channel: '#dev'
    } },
])

MCP vs Sael — по пунктам

ВозможностьMCPSael
СтримингКостыль на SSEНативно, любой вызов
КомпозицияНет — цепляет клиентСерверные pipeline
Параллельный fan-outN последовательных вызовов1 вызов, ветки конкурентно
ПодпискиPollingFirst-class push
Delta-стримингСлать целикомMerge-patch дельты
СессияStatelessЖивой канал + resume
BackpressureНетВстроен в транспорт
Capability-безопасностьВсё или ничегоПодписанные per-tool гранты
Multi-agentНе решеноФедерация в протоколе
Транспортstdio / HTTP+SSEWebSocket
Формат фреймовТолько JSONJSON или MessagePack
Латентность N шаговN round-trips1 round-trip

Где Sael выигрывает

Многошаговые data-pipeline
Fetch → filter → enrich → deliver — собирается на сервере. Промежуточные данные не попадают в контекст модели.
Real-time дашборды агентов
Подписка на топики и стрим событий по факту — без циклов polling и устаревшего состояния.
Long-running тулзы
Стрим логов, вывода сборки или генерации по токенам — с отменой на лету и backpressure.
Оркестрация multi-agent
Агенты вызывают друг друга через протокол; федерация tool-серверов без кастомной шины.
Enterprise-доступ к тулзам
Подписанные capability-токены задают, что именно агент может вызвать — аудит, гранулярность, отзыв.
Token-чувствительные задачи
Серверная композиция держит payload вне контекстного окна — меньше токенов на задачу, ниже стоимость.

Экосистема

MCP-adapter
Любой существующий MCP-сервер работает через адаптер. Zero migration.
TypeScript + Go SDK
Клиенты для браузера, Node и Go. Эталонный сервер на Go — live.
BUSL-1.1
Source-available спецификация. Коммерческая лицензия — по запросу.

Живой demo

Прямо в браузере. Жми кнопки — они идут через WebSocket к живому Sael-серверу на unyly.org.

disconnected

кликни «подключиться» — увидишь живые v0.2 frames

▸ endpoint: wss://unyly.org/quark/ws

FAQ

Sael совместим с MCP?+

Да. Любой существующий MCP-сервер работает через Sael-adapter без изменений кода — стриминг, композицию и подписки подключаешь постепенно.

Нужно ли переписывать MCP-серверы?+

Нет. Адаптер говорит с твоим сервером по MCP, а с клиентом — по Sael. Переписываешь тулзу только когда хочешь нативный стриминг или композицию.

Какой транспорт у Sael?+

WebSocket. Двунаправленный стриминг, работает в любом браузере и на сервере, переживает смену сети на мобильном — в отличие от stdio или HTTP+SSE.

За счёт чего Sael быстрее MCP?+

Серверная композиция схлопывает N-шаговый workflow в один round-trip, а нативный стриминг отдаёт первый результат сразу. Измерено: −89% round-trips, −94% трафика, 10× быстрее до первого ответа на многошаговых цепочках.

Sael готов к production?+

v1.0 stable: подписанные capability-токены, session resume, heartbeat, cost-tracking, W3C-трейсинг и федерация. Эталонный Go-сервер работает и питает demo на этой странице.

Какая лицензия?+

Спецификация source-available под BUSL-1.1; текст спеки — CC BY-NC-ND. Есть SDK на TypeScript и Go. Коммерческая лицензия — по запросу.

статус

v1.0 — stable. SCT auth, session resume, heartbeat, cost tracking, tracing, federation. Reference server live.

Source-available спецификация (BUSL-1.1). SDK на TypeScript и Go. Хочешь интегрировать Sael или обсудить лицензию — напиши.