box
docs /Agent-native ops

Agent-native ops

Every infra product is currently bolting on an "AI integration": an MCP server, an API wrapper, a chatbot in the dashboard — adapters between an agent and a system built for humans with browsers.

ply doesn't need the adapter. An agent's two most reliable tools are read a file and write a file — and that is already ply's entire operational surface. The filesystem is the API, so every agent ships with the client. An agent with ssh access operates a ply host with the tools it was born with, and it can discover the system by ls, because state is legible text at stable paths — not rows inside a daemon.

#The whole API, one table

operation what the agent does
deploy an app write /var/lib/ply/deployments/<name>.toml
check how it went read deployments/.status/<name>.status
see what happened read <apps>/events.log (JSON lines)
read logs — dead builders included read <run>/logs/<app>.<n>.log
scale to 3 write 3 into <apps>/<app>/control/scale
trigger an update touch the spec file
roll back pin version = / ref = in the spec
shell into an instance ply exec <app> sh
machine-readable everything ply ps --json; statuses and events are JSON already

No token to mint, no SDK version to match, no schema to paste into context. Compare what an agent needs elsewhere: an API token and a REST client for Coolify; kubectl, CRD schemas and RBAC for Kubernetes. For ply: cat and tee.

#Why the fit is structural, not cosmetic

Declarative beats imperative — especially for agents. Agents fumble long imperative sequences and excel at stating desired outcomes. ply's model is exactly that: the agent writes what should be true, ply reconcile makes it true — health gates, rolls, retries and failure backoff absorbed by the machinery — and the status file reports back in plain text the agent can read and react to.

Permissions are the ACL — for agents too. No bot tokens, no roles: an agent's blast radius is unix permissions on directories, the identical mechanism that scopes a human or the dashboard. Read-only mounts make an observing agent. And every action lands in the events journal like anyone else's — the audit trail exists before the auditor asks.

Fleet turns agent access into pull requests. On a GitOps fleet, the agent's fleet-wide write is a PR against the infra repo. It diagnoses at 3am from status + events + the builder's log ring, opens a PR pinning the last good version, and a human merges. The approval boundary is git review — mature, understood, tooled — not a bespoke "agent permission system" nobody trusts yet.

#Recipes (prompt-sized)

Deploy:

cat > /var/lib/ply/deployments/api.toml <<'EOF'
repo = "https://github.com/org/api"
build = "npm ci && npm run build"
runtime = "node@24"
entrypoint = ["node", "dist/index.js"]
port = 3000
publish = ["internal:3000"]
domain = ["api.example.com"]
EOF
# then watch: cat /var/lib/ply/deployments/.status/api.status

Diagnose a failed deploy:

cat /var/lib/ply/deployments/.status/api.status   # the verdict
tail -50 /var/lib/ply/apps/events.log             # what led up to it
cat /run/ply/logs/api-builder.1.log               # the build's own output —
                                                  # the ring outlives the builder

Roll back: edit the spec, pin version = "1.4.2" (or ref = "<commit>" for repo builds) — the edit is the trigger. Scale: echo 3 > /var/lib/ply/apps/api/control/scale, answer arrives in control/last-result within ~2s.

#Give your agent the skill

The ply skill covers packaging and operating — the file map above, the diagnose loop, and the cautions (atomic writes, secrets stay in root-owned files, one deployment per app name). One URL:

https://plybox.sh/ply-skill.md

#Where's your MCP server?

You don't need one. ssh is the protocol; the filesystem is the schema. An MCP layer here would wrap cat in JSON-RPC and call it progress. If your setup insists on one, a thin shim is trivial to write over these same files — but it will always be optional, because the real interface is load-bearing and public.

One receipt, offered plainly: this platform — the deploy wizard, the web terminal, the timers, its own production migration — was built and operated over two days by an AI agent working through exactly these interfaces. The product is its own demo.