SDK Overview
The CMDOP SDK gives you programmatic access to your fleet from Python (cmdop) and Node (@cmdop/sdk) — one typed Client over the same surface: list and inspect machines, stream a machine’s AI agent (machines.ask()), manage fleets, tunnels, schedules, and keys, and drive the skills marketplace. Both packages ship in lockstep at the same version.
How it connects

Your app uses the SDK to reach your machines — any hardware, anywhere — through your CMDOP relay: the one your cmdop.com account provisions, or a relay you self-host. The relay links your fleet over gRPC and hosts Jarvis, a built-in AI that can drive those machines on its own.
Both SDK packages are MIT-licensed, with source on GitHub (commandoperator/cmdop-sdk ).
Two packages, one surface. Snake_case in Python, camelCase in Node — otherwise identical, kept at parity by construction.
| Install | Version | Registry | |
|---|---|---|---|
| Python | pip install cmdop | 1.1.0 | cmdop on PyPI |
| Node | npm i @cmdop/sdk | 1.1.0 | @cmdop/sdk on npm |
Why it’s easy to adopt
- One install, zero dependencies.
pip install cmdop/npm i @cmdop/sdkis everything — no native build step, no extra runtime, nothing fetched on first run. - Works anywhere. A single self-contained package runs the same on macOS, Linux, and Windows wherever Python or Node runs.
- Typed end to end. Every resource and response is fully typed, with one clean async streaming API for live agent output.
Quick start
# pip install cmdop
from cmdop import Client
async with Client(token="...") as c: # or Client.from_env()
page = await c.machines.list(presence="online")
for m in page.items:
print(m.hostname, m.presence)
text = await c.machines.ask(machine_id, "uptime").collect()
print(text)// npm i @cmdop/sdk
import { Client } from "@cmdop/sdk";
const c = new Client({ token: "..." }); // or Client.fromEnv()
const page = await c.machines.list({ presence: "online" });
for (const m of page.items) console.log(m.hostname, m.presence);
const text = await c.machines.ask(machineId, "uptime").collect();
console.log(text);
await c.close();What you can do
| Namespace | What | Plane |
|---|---|---|
machines | list / inspect machines, stream their AI agent (ask), read & manage conversations | relay |
fleets | create and manage fleets, members, and machine membership | relay |
tunnels | open / close / inspect tunnels | relay |
schedules | create, trigger, and review scheduled jobs | relay |
keys | issue and revoke fleet access keys | relay |
skills | browse, install, publish, and review marketplace skills | platform |
The headline feature is machines.ask() — stream a machine’s AI agent as a clean async iterator of typed frames, with mid-stream PIN and confirmation prompts surfaced as first-class steps.
Two planes, one client. machines / fleets / tunnels / schedules / keys use your relay token (CMDOP_TOKEN); the skills marketplace uses your platform API key (CMDOP_API_KEY). Set whichever you need — the client routes each call to the right plane. See Configuration.