zas-agent MCP server exposes, in one page.
Commands
Tools
channel takes a channel name or a channel id. A name has to match exactly one granted channel. With exactly one grant, every tool that takes channel can leave it out except zas_list_items and zas_get_item, which always name theirs.
zas_status
Says whether this machine is paired, and lists the channels this agent may send to or read from. Also prints the package version, the profile, and the telemetry state. No arguments.
zas_pair
Pairs this machine with a Zas account. The first call returns a URL for you to open; a later call says whether you approved. In a profile that is already paired, approval replaces the old agent.
zas_send_file
Sends a file from this machine into a granted channel. Returns the item id, or a job id when the upload takes longer than a minute.
A channel in Directo mode refuses this tool with
direct_mode. Use zas_send_direct there.
zas_send_note
Sends a note: plain text, or a code snippet with its language.
expires_in_days
Both sending tools take it, and it only ever shortens an item’s life. A request longer than the plan grants is answered with the plan’s number rather than refused, so asking for 100 days gives you five. The floor is one whole day, because the countdown ring counts whole days.
It is worth setting for output that is stale tomorrow: a build log, a test run, a screenshot of a fix.
zas_send_direct
Sends a file through Directo: a live, device-to-device transfer into a granted channel that is in Directo mode. Nothing is stored. Somebody has to press Receive on another device within ten minutes. The call waits a minute and then returns a job id to check with zas_jobs.
A channel that is not in Directo mode refuses this tool with
not_direct_mode.
zas_receive_direct
Receives a file sent through Directo, straight onto this machine. It waits for the offer, takes it, and writes the file to disk. Only for a channel in Directo mode, and only with a grant that includes reading, because it writes onto the machine.
It never overwrites an existing file. The wait for an offer alone can take ten minutes, so the call returns a job id after a minute.
zas_send_direct_fallback
After a zas_send_direct job failed in flight, delivers the same file through reliable delivery instead. Zas encrypts the file on this machine and stores only that encrypted copy for up to 24 hours; it uses none of your space, and the device that claimed the offer can download it later.
This stops being Directo: the encrypted bytes pass through storage. The tool’s own description tells the model to ask you first, because it is your choice, not the model’s.
zas_receive_direct_fallback
After a zas_receive_direct job failed in flight, downloads the encrypted copy the sender chose to store. It works only if the person sending picked reliable delivery for that transfer. The file is decrypted on this machine and written to the same destination.
zas_list_items
Lists the most recent items in a channel. Needs a grant that includes reading.
zas_get_item
Fetches one item. A note comes back as text; a file is written to disk.
It never overwrites an existing file. A name that is taken gets a suffix, and the path it answers with is the one it actually wrote.
zas_jobs
Lists the sends and Directo transfers this server started, newest first, with the phase each one reached and how it ended. A job_id from a long send is redeemed here, and a finished job keeps its result.
Error codes
The agent answers in a closed set. Anything a route says that is not in this set collapses toupload_failed or network, so no raw server string ever reaches a terminal, and no stack trace does either.
Pairing and identity
Channels and grants
Sending and reading
Directo
Everything else
Files on disk
One directory per profile, so one machine can hold a Claude Code agent and a Codex agent without either reading the other’s keys.
One file sits a level up, in
~/.zas/agent/ itself, because it is a choice about the machine rather than about one identity:
Every file is written through a temporary file and renamed into place, so a crash mid-write cannot leave half a file behind.
On macOS and Linux the directory is created
0700 and every file 0600. On Windows those bits have no effect: the files carry the permissions of the user profile they live in, and the package sets no others.
Deleting the directory makes the machine forget the agent. It does not revoke it. That happens in Settings → Agents → Revoke.
Telemetry
The agent reports the pairing funnel and oneagent.tool_call event per tool call, so Zas can see which tools work and which fail. It is on by default and it prints a notice the first time.
What it never sends: file names, titles, note bodies, channel names, paths, or item content.
Three ways to turn it off, in the order they are read:
zas-agent telemetry with no setting prints the current state and which of the three decided it. zas_status prints the same line.
Settings
Only
--profile, ZAS_AGENT_HOME and the telemetry switches are worth setting by hand. The rest exist so the package can be pointed at a test deployment.
Numbers
Where to go next
Connect an agent
Pairing, the harness commands and the failure modes.
Limits
Every limit Zas enforces, agents included.
FAQ
Short answers to the usual questions.
Recommendations
Safe practice, and the warning about secrets.