Command Palette

Search for a command to run...

UnylyUnyly
protocol · v1.0 stable

Sael

successor to MCP

The source-available protocol for AI agents talking to tools. Streaming, server-side composition, subscriptions and capability security — built into the protocol, not bolted on. MCP-compatible via an adapter. BUSL-1.1 — commercial use is licensed.

Two servers linked by a Sael data stream
−89%
round-trips
−94%
wire traffic
10×
to first byte
the shift

MCP is REST. Sael is the real-time web.

The same evolution the web already went through — from request/response to streams and subscriptions. AI tooling is stuck in the 2010s.

HTTP request/response
WebSocket streaming
one call = one request
REST
GraphQL + gRPC streams
compose on the server
Polling по cron
Subscriptions / push
reactive, no polling
The model is the router
Server composes, model orchestrates
data never hits the context

the core insight

In agentic systems the scarce resource is the context window. MCP routes every intermediate result back through the model — each hop costs tokens, latency and money. Sael keeps data on the server: the model describes the plan once and gets the answer. The model stops being the network.

Why MCP doesn’t scale

MCP is JSON-RPC from the 2010s stretched over AI. Fine for desktop apps. In production it cracks.

No native streaming
Long-running ops via SSE workarounds. Visible lag.
Stateless every call
Agent re-sends context per call. Burns tokens.
No composition
N steps = N round-trips, each dragging the payload through the client.
No subscriptions
Reactive flows via polling cron. Crude.
No backpressure
Server killable by load. No graceful degradation.
No capability model
Agent can call anything. Enterprise won’t accept it.

What Sael builds in

A WebSocket channel stays alive. Every capability is part of the protocol, not an SDK wrapper.

Streaming-first
Every tool can stream. Cancel mid-flight. Backpressure built into the transport.
One-shot composition
tool₁ → filter → map → tool₂ runs on the server. N round-trips → 1.
First-class subscriptions
subscribe(topic, filter) → event stream. Push, not polling.
Capability security
Signed tokens (SCT). The agent can’t exceed what the user granted. Granular per tool.
Multi-agent native
Agents call each other through the protocol. Server federation out of the box.
Production-grade
Session resume, heartbeat, cost tracking and W3C tracing — in the protocol core.

How it works

One live channel. Compact frames. The server runs the chain and sends back only the result.

HEYhandshake + capabilities
LSTdiscover tools
INVinvoke / pipeline
STRstream chunks
RESresult
SUBsubscribe → EVT
ENDstream end + cost

one INV describes the whole chain

→ 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 } }   // one round-trip

parallel fan-out — N branches concurrent on the server

→ 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, branches in parallel

6 independent branches × 50 ms: MCP — 7 round-trips, ~312 ms (sequential). Sael — 1 round-trip, ~53 ms (wall-clock = slowest branch, not the sum).

Measured, not marketing

Sael reference Go server vs a spec-correct MCP server. Same tools, same dataset, same transport (WebSocket). Measuring protocol shape, not hardware.

fewer round-trips
8-step chain: 9 → 1
17×
less data on the wire
139 KB → 8 KB
10×
faster to first response
streaming: 1012 ms → 101 ms

The gain scales with agent-loop depth and payload size. A single tool call sees no round-trip difference — Sael wins on multi-step work, where MCP shuttles intermediate data through the client.

Code: MCP vs Sael

MCP — one round-trip per step

// 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 — whole chain in 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 — feature by feature

CapabilityMCPSael
StreamingSSE workaroundNative, every call
CompositionNone — client chainsServer-side pipelines
Parallel fan-outN sequential calls1 call, concurrent branches
SubscriptionsPollingFirst-class push
Delta streamingFull resendMerge-patch deltas
Stateful sessionStatelessLive channel + resume
BackpressureNoneBuilt into transport
Capability securityAll-or-nothingSigned per-tool grants
Multi-agentNot addressedFederation in protocol
Transportstdio / HTTP+SSEWebSocket
Wire formatJSON onlyJSON or MessagePack
N-step latencyN round-trips1 round-trip

Where Sael wins

Multi-step data pipelines
Fetch → filter → enrich → deliver, composed server-side. Intermediate data never touches the model’s context.
Real-time agent dashboards
Subscribe to topics and stream events as they happen — no polling loops, no stale state.
Long-running tools
Stream logs, build output, or token-by-token generation with cancel mid-flight and backpressure.
Multi-agent orchestration
Agents call each other through the protocol; federate tool servers without a custom bus.
Enterprise tool access
Signed capability tokens scope exactly what an agent may call — auditable, granular, revocable.
Token-sensitive workloads
Server-side composition keeps payloads off the context window — fewer tokens per task, lower cost.

Ecosystem

MCP adapter
Any existing MCP server runs through the adapter. Zero migration.
TypeScript + Go SDK
Browser, Node and Go clients. Reference Go server — live.
BUSL-1.1
Source-available spec. Commercial license on request.

Live demo

Live in your browser. Click the buttons — they hit the live Sael server on unyly.org over WebSocket.

disconnected

click "connect" — see live v0.2 frames here

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

FAQ

Is Sael compatible with MCP?+

Yes. Any existing MCP server runs through the Sael adapter with zero code changes — you adopt streaming, composition and subscriptions incrementally.

Do I have to rewrite my MCP servers?+

No. The adapter speaks MCP to your existing server and Sael to the client. You only rewrite a tool when you want it to stream or compose natively.

What transport does Sael use?+

WebSocket. It gives bidirectional streaming, runs in every browser and server, and survives mobile network handovers — unlike stdio or HTTP+SSE.

How is Sael faster than MCP?+

Server-side composition collapses an N-step workflow into a single round-trip, and native streaming delivers the first result immediately. Measured: −89% round-trips, −94% wire traffic, 10× faster to first byte on multi-step chains.

Is Sael production-ready?+

v1.0 is stable: signed capability tokens, session resume, heartbeat, cost tracking, W3C tracing and federation. A reference Go server is live and powers the demo on this page.

What is the license?+

The specification is source-available under BUSL-1.1; the spec text is CC BY-NC-ND. TypeScript and Go SDKs are provided. A commercial license is available on request.

status

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

Source-available spec (BUSL-1.1). TypeScript + Go SDKs. Want to integrate Sael or discuss a license — reach out.