Connect your agent
Your agent reaches Orbit through an MCP server. Once connected, it can file tasks, ship them, and run drains.
Connect
Section titled “Connect”orbit workspace init --mcpThis registers Orbit with every agent client it finds, with operator authority, so your agent can ship tasks and run drains as well as file them. Start a fresh agent session afterwards so the tools load.
The registration launches orbit . Operator sessions can
dispatch workflows, resume runs, and run governed commands; agents launched by
Orbit get agent-only authority. Each session’s capabilities filter the tools
advertised by tools/; authorization is also checked when a tool is called.
orbit registers Orbit with the narrower agent-only authority:
the agent can file and update tasks but cannot dispatch runs. Use it to pick
clients or to limit an agent:
orbit mcp init --auto # every detected clientorbit mcp init --claude --codex # specific clientsorbit mcp init --all --scope home # user-level config, every clientSupported clients: claude, codex, gemini, antigravity, grok,
cursor, vscode, and windsurf. --scope , the default, writes
config into the repository; --scope writes it for your user.
Grok Build reads the shared . (or ~/ with
--scope ); when its shared reader is off, Orbit writes
. instead.
If the workspace’s Orbit data lives outside the repository, pass
orbit the same --root (or ORBIT_ROOT) you used for
orbit .
Register the federated mux
Section titled “Register the federated mux”A federated server puts this machine’s workspaces and those on SSH remotes
under one namespace. Register each remote host once, by its SSH alias or
user@host:
orbit host add orbit-ownerorbit host listorbit reads the host’s machine ID, name and task prefix from the
host itself and records them in ~/. orbit shows
every host with its live reachability, Orbit version, pull protocol and
workspaces, and flags a version or protocol that differs from this machine’s.
orbit and orbit manage the entries. An older
~/ is still read until the first of these
commands migrates it.
Then register the federated server with a client:
orbit mcp init --federated --client codex --scope homeThis adds a separate orbit-federated entry beside any existing orbit one.
In that session, orbit_workspace_list returns host-qualified selectors such
as hm_alpha/; pass one unchanged as the workspace of a call. Task
reads go to the owner’s selector. A call that addresses one task by ID, such
as orbit_task_show or orbit_task_update, can omit workspace: it goes to
the host the ID’s prefix names. There is no automatic failover: a call reaches
only the machine you select or the one its task ID names. A plain
orbit session does not relay. Given another host’s task ID without
workspace, it answers task_prefix_remote and names that host.
Operator authority travels over SSH. A client started with --operator serves
operator on every destination it opens, because an SSH login to a machine is
ownership of it. Without --operator, and always for a client running inside
a managed run, remote sessions get agent-only authority. To shut a caller out,
remove its key from that machine’s ~/.
Attribute tasks to an orchestrator
Section titled “Attribute tasks to an orchestrator”orbit mcp serve --workspace <selector> --orchestrator <crew>Tasks the session creates are recorded as filed by that crew, unless a call
passes its own orchestrator. This is attribution only: it grants no
authority and does not choose the crew that executes a task. The same flag
works with --mode and --mode .
Serve on a socket
Section titled “Serve on a socket”orbit mcp listen # 127.0.0.1:7879The listener serves the same tools over TCP, one session per connection, for
setups such as a server-side Orbit reached through an SSH tunnel. It does not
authenticate clients, so it binds loopback unless you pass
--allow-non-loopback.
The listener allows 64 concurrent sessions. Each accepted connection has five seconds to send a complete initialization request and receive its response; silent peers and incomplete messages are closed and release their slots. Established sessions remain connected while idle, until the client disconnects.
Operator tools
Section titled “Operator tools”Tool names such as orbit. use dots in orbit ; MCP
advertises them with underscores, such as orbit_command_exec. Read the
session’s tools/ for the registered input schemas. A listed tool still
requires the caller’s authority and workspace policy to admit the call.
Use the existing guides for the other public families:
| Tools | Guide |
|---|---|
orbit., orbit., orbit. |
Tasks and lifecycle and your first task. |
orbit., orbit. |
Agents and crews. |
orbit., orbit., orbit. |
Delivery workflows and delivery windows. |
orbit. |
Activities and jobs, write an activity, and Activity and Job YAML. |
orbit., orbit. |
Routines and Auto-Tasks and schedule recurring work. |
orbit., orbit., orbit., orbit. |
Decision channels covers read-only inspection, operator registration and authenticated plugin callbacks. Agents cannot answer requests. |
orbit. |
Dashboard views. |
orbit., orbit. |
Open the MCP Apps control center. |
The requests below are illustrative MCP tools/ bodies, not setup steps.
Replace ws_example with an unchanged selector from orbit_workspace_list
(host-qualified in a federated session), and replace paths, job names and run
IDs with values from that workspace. Public command execution and job
submission require an operator session, such as orbit .
The model field records provenance; it grants no authority.
Execute a bounded command
Section titled “Execute a bounded command”orbit. runs a non-empty argv array, program first, in the
explicit working_directory. Each argument is a separate string. No shell
interprets it: pipes, redirection, variable expansion and && are not shell
syntax here. Do not put a whole command line in one string or add shell
quoting around an argument containing spaces.
{ "name": "orbit_command_exec", "arguments": { "workspace": "ws_example", "argv": ["git", "status", "--short"], "working_directory": "/home/operator/example", "timeout_ms": 30000, "model": "codex" }}The directory must exist and be absolute, inside the selected workspace’s
checkout or a linked worktree under .. Orbit never
infers it from the caller’s current directory.
The workspace claim is an optional exclusive coordination hold, separate
from operator authority. An unclaimed workspace admits the command. If a
claim is held, supply its matching claim_token argument or set
ORBIT_WORKSPACE_CLAIM_TOKEN in the executing Orbit server’s environment.
A mismatched or missing token refuses the command and identifies the holder
and expiry. Claim management is not exposed over MCP; coordinate with the
operator holding the claim. A token does not grant operator authority.
The default deadline is 120000 ms; requested values are clamped to
1–600000 ms. Orbit caps each of stdout and stderr at 4 MiB. The result
includes success, stdout, stderr, exit_code, duration_ms and
timed_out. On timeout, Orbit kills the command and its process group,
returns timed_out: with no exit code, and discards captured command
output. Inspect the result rather than treating a completed tool call as a
successful command.
Managed runs cannot call this tool, even if it appears in their tool list: a leaf agent cannot use general command execution to bypass its tool policy.
Submit a durable job
Section titled “Submit a durable job”orbit. submits a registered v2 job and returns immediately
with a durable run_id; acceptance is not completion. With ordinary input,
pass a JSON object matching the job’s input contract. For example, after
registering a job named example_check that accepts directory:
{ "name": "orbit_pipeline_invoke", "arguments": { "workspace": "ws_example", "job_name": "example_check", "input": { "directory": "src" }, "priority": "low", "model": "codex" }}priority is optional: low, medium, high or critical. Ordinary
submission requires input, even when it is {}. This schema does not
advertise claim_token; do not copy command-execution arguments into it.
Managed runs may invoke only a host-authorized child pipeline admission. That admission comes from trusted host context, not caller-supplied JSON; ordinary leaf submissions are refused.
Submit with catalog defaults
Section titled “Submit with catalog defaults”To run an enabled job that the catalog permits for no-input submission,
use default_input: and an explicit workspace. First inspect the
no-input job catalog alongside recent runs:
{ "name": "orbit_workflow_run_list", "arguments": { "workspace": "ws_example", "view": "bounded", "include_catalog": true, "limit": 10 }}After selecting an eligible job, submit it with its defaults. Here
example_check stands for that catalog job:
{ "name": "orbit_pipeline_invoke", "arguments": { "workspace": "ws_example", "job_name": "example_check", "default_input": true, "model": "codex" }}This variant accepts only workspace, job_name, default_input and the
optional model. Omit both input and priority. It requires trusted
operator authority and always refuses managed runs, including child
admissions. Not every registered job is eligible: subroutines, disabled jobs
and task-delivery jobs do not belong on this route. Use the delivery tools
for task shipping.
Observe the run
Section titled “Observe the run”Keep the returned run_id and fetch it with orbit.:
{ "name": "orbit_workflow_run_show", "arguments": { "workspace": "ws_example", "id": "<returned-run-id>", "view": "bounded", "limit": 20 }}Run listing and detail require operator capability; agent-only sessions are
refused. The bounded detail includes the run and a bounded log page; use
log_offset and limit to page through logs. Continue observing until the
run is terminal, then inspect its outcome and failure details. An unfinished
run is still durable after the submission call returns.
If a submission reply is lost, inspect recent runs and their details before submitting again. Never automatically replay a default-input submission: the first call may already have created a run.
Response shapes
Section titled “Response shapes”orbit shows available tools; --all also includes inactive tools.
Each one advertises MCP annotations
(readOnlyHint, destructiveHint, and so on) so a client can decide what to
auto-approve; Orbit still enforces authority on every call.
orbit_task_listandorbit_task_eligiblereturn{.tasks, total, truncated } orbit_task_listreturns compact task rows by default (id, title, status, priority, type, dependencies, resolved_dependencies, implemented_by, not_before, created_at, updated_at, and workspace).not_beforeis null when unset. Passfieldsto select only named fields, including long-text fields such asdescriptionorplan.orbit_task_listacceptsnot_before_fromandnot_before_untilas RFC 3339 instants with offsets, individually or together. Both endpoints are inclusive; tasks without a schedule do not match. Malformed bounds name the input in the error.scheduled:lists future schedules soonest first, including proposed tasks; other filters and the limit still apply.true orbit_task_showexposesnot_beforeand derivedstarted_at(the first recorded entry into in-progress), also available throughfields.scheduled_holdreports whether a backlog task is still held by its future schedule, accounting for operator overrides. A task’s schedule does not guarantee an exact execution time. Setnot_beforethroughorbit_task_addororbit_task_update; an empty string clears it on update, while null leaves it unchanged.orbit_task_eligiblerows are minimal: id, title, type, status, priority and complexity. The tool takes nofieldsprojection. To read a full record, useorbit_task_show; to add long-text fields to a listing, useorbit_task_listwithfields.orbit_task_eligiblelists, in dispatch order, thebacklogandproposedtasks whose files overlap no running or in-review task. Withexplain:,true conflictingalso lists the held-back tasks, each with the overlapping file and the task holding it.- The task-write tools leave out
commentsandhistoryunless you name them infields.
Remove
Section titled “Remove”orbit mcp remove --allorbit mcp remove --federated --all # only the federated entry