Introduction
Zyris is an expandable, direction-symmetric protocol that turns what a machine can do into tools an AI agent can call.
A Zyris node is any machine that dials a server over one websocket and announces capabilities — named, versioned sets of tools whose arguments are described by JSON Schema. On the same connection it can also consume the capabilities the server announces back.
The protocol is direction-symmetric. Once the handshake is done there is no client role and no server role: either peer may call the other, open streams, and change what it offers in the middle of a session.
Attacca is the reference deployment. The tools a node announces become tools
its owner's agents can call, and Attacca announces attacca_api back so the same node can drive
agents and sessions in return.
What you can build
- A tool for an agent. Write a Rust trait, put
#[zyris::capability]on it, and every method becomes a tool. Doc comments become the descriptions the model reads. - A machine an agent can use. Serve the standard catalogue —
terminal,file_io,input,screen_capture,file_transfer— with the reference implementations, and an agent can run commands, edit files and drive the screen. - A program that drives agents. Consume
attacca_apito create sessions, send messages and stream turns, over the same connection you serve tools on.
The programs on zyris.attacca.cc — Zyris, zyris-code and zyris-docker — are all built this way.
Where to go next
Quickstart
Run a node and have an agent call it, in about five minutes.
Concepts
Nodes, capabilities, credentials and addresses — the vocabulary the rest of these docs use.
Writing capabilities
Declare tools with one trait, return errors, stream results.
Capability addons
Reuse file, shell, desktop and transfer implementations and combine them with your own tools.
Protocol specification
The normative wire reference: framing, envelopes, streams and flow control.
Which version these docs describe
These docs track the main branch of
zyris-protocol, which uses long-lived zc_
credentials. The 0.2.0 release on crates.io predates that and still uses znt_ node tokens,
so until the next release, depend on the git repository as the quickstart
shows.