Build a custom machine

Routes and tools

Python SDK version 1

Markdown

For your AI: the Ownbox's connector

Your AI reaches the Ownbox through its connector. The owner's Developers page shows the line, with the Ownbox's own address, to the owner only. The line signs in as the owner, so the AI that holds it reads what the owner reads: the owner hands it only to a developer they trust.

Terminal
claude mcp add --transport http --scope user ownbox https://<the Ownbox>/mcp
ToolDoesActs?
core.dev_referenceReads this guide whole, with a build's file limits.No
core.propose_dev_buildAsks the owner to build from your files, each between === FILE: <name> === and === END ===; while a build waits for fixed files, sends them to it. A malformed set is refused before the owner is asked.A proposal only
core.dev_buildWhere a build is, in words, and its next step. With no id, the build going now.No
core.dev_buildsThe last 10 builds: name, status, progress.No

Pages on the Ownbox

AddressWho opens itIs
/my/<slug> and belowAnyone signed inThe machine's own pages.
/settings/machines/<slug>/keysThe ownerIts Keys page: the keys it named, and each key's monthly limit.
/approvalsThe ownerBuilds, review cards and the machine's proposals.
/add-machine/developersAnyone signed inDevelopers. The owner also sees the connector line and building from a description.
/add-machine/developers/sdkAnyone signed inThe SDK reference.
/add-machine/build/<id>The ownerOne build: its progress, its dry runs' log, its review card.

HTTP routes

The Ownbox's own pages call these; each is for the owner only (a member gets 403 owner_only). An error answers 400 bad_request, 404 not_found, or 409 (busy, not_now, changed) with the build attached.

MethodPathBodyDoes
GET/machines/build—The build going now, and the last 10.
POST/machines/build{description} or {files, does?}Starts a build; 202.
GET/machines/build/<id>—One build.
POST/machines/build/<id>/files{files}New files for a build that waits for them (the owner's own; your AI uses core.propose_dev_build).
POST/machines/build/<id>/tap{hosts, max}The hosts for the fetch run, and how many fetches.
POST/machines/build/<id>/more—More turns and dry runs for a failed build.
POST/machines/build/<id>/cancel—Cancels it.
POST/machines/build/<id>/approve{version, sha256, grants}Approves exactly what the card showed.
POST/machines/build/<id>/resend—Sends a partner Ownbox's approved build to Ownbox again.
POST/machines/rollback/<slug>{version}Returns to the version before.
POST/machines/remove/<slug>{confirm}Removes it; confirm is its name as shown.

Names the Ownbox gives a machine

Every name a custom machine takes on the Ownbox starts my_, so it never collides with a machine that ships with the Ownbox. Its key is my_ and its slug with - as _: quote-follow-up is my_quote_follow_up.

WhatNameExample
Its pages/my/<slug>/my/quote-follow-up
A tool for the owner's AI<key>.<name>my_quote_follow_up.open_quotes
Its tools' capabilityread:<key>read:my_quote_follow_up
Its pages, read by the owner's AI<key>.screenmy_quote_follow_up.screen
A proposal's kind<key>.<kind>my_quote_follow_up.send_quote
Its unit's useraiosm-<slug>aiosm-quote-follow-up