ARCP is a transport-agnostic wire protocol for submitting, observing, and controlling long-running AI agent jobs — and nothing more.
ARCP defines the execution envelope around AI agent work: sessions, jobs, resumable event streams, capability-bounded leases, and delegation. It specifies how a job is submitted, how its events flow back, who is allowed to do what, and how the whole thing survives a dropped connection.
It is deliberately narrow. ARCP wraps the agent function — it does not implement the agent, expose its tools, or export its telemetry. Tool exposure is the concern of MCP. Telemetry export is the concern of OpenTelemetry. ARCP composes with them rather than absorbing them.
A job submitted over ARCP keeps running when the client disconnects, can be
resumed or watched live from another machine, and cannot exceed the lease it
was granted — a bound on what it may read, write, call, spend, and for how long.
Long-running agent jobs break the assumptions of a request/response API. They outlive the connection that started them, act with real spending and filesystem authority, and frequently need to be watched by more than one observer at once. ARCP exists to make that envelope explicit and enforceable at the wire level, so any client and any runtime can interoperate.
The protocol organizes every message under four concerns. Everything it specifies is in service of one of them.
An interaction is a session that carries one or more jobs. The wire format is a single JSON envelope; the transport is WebSocket for the network and stdio for in-process children.
session.hello → session.welcome. The client declares identity and supported features; the runtime returns a session, a resume token, and an agent inventory with versions.job.submit carrying a lease_request — what the agent may read, write, call, spend, and until when. The runtime replies job.accepted with the effective lease.job.event stream: logs, thoughts, tool calls, structured progress, cost metrics, and chunked result_chunks for large outputs.session.resume after a network drop, or job.subscribe from another session to watch a job live — without the authority to cancel it.job.result or job.error. Leases that expire or budgets that run out fail closed.{
"type": "job.submit",
"payload": {
"agent": "code-refactor@2.0.0",
"lease_request": {
"fs.read": ["/workspace/app/**"],
"fs.write": ["/workspace/app/src/**"],
"cost.budget": ["USD:5.00"],
"model.use": ["tier-fast/*"]
},
"lease_constraints": { "expires_at": "2026-05-13T23:42:00Z" }
}
}
The clearest way to understand a protocol is to know where it stops. ARCP draws a hard line and stays behind it.