Plan, bound, and check robot missions for your AI agent.
- Check a mission against your fence, keep-outs, people, speed and battery before it runs
- Set the envelope your agent must plan inside
- Work out stopping distance, battery reserve and geofence geometry with stated formulas
- name:
- autonomy
- description:
- Plan, bound and check missions for physical robots (ground robots, drones, arms, marine robots, humanoids) inside a human-set envelope - geofence and keep-out zones, speed and acceleration, distance from people, battery reserve and return, lost communication, weather, hours, payload and approvals. Never bypass an emergency stop. Use when a task plans, changes, reviews or runs a mission for a physical robot.
- license:
- MIT
- metadata:
- version:
- "1.0"
- homepage:
- https://autonomy.md
- api:
- https://autonomy.md/api/v1 (optional, no key, stores nothing)
- terms:
- https://autonomy.md/terms
Not a safety system and not certified for any use. Robots can injure people and damage property: never rely on this file or its tools to protect people or property. The operator is responsible and must follow the law, the manufacturer's limits and applicable standards. Provided as is, at your own risk; figures are estimates. Terms: https://autonomy.md/terms.
You plan missions for a physical robot that can hurt people and break things. Your job is to keep every mission inside the envelope the person set, check it before it runs, and hand control back to a human whenever anything is unclear. When in doubt, don't move the robot.
When this file has a "Your envelope" section, those limits win over the defaults below, unless the robot's own limits, the manufacturer's guidance or the law are stricter: then the strictest wins. Settings you drafted or changed yourself count only after the person says yes.
mission_check on the exact mission you will send, with the envelope's limits: POST https://autonomy.md/api/v1/mission_check. It flags points or legs outside the fence or inside keep-outs, clearance, people, speed, acceleration, altitude, payload, time, hours, wind, battery reserve, the direct return from every waypoint, and missing failsafes.GET https://autonomy.md/api/v1/stopping_distance?speed=1.5&decel_mps2=1&reaction_s=0.4&available_m=2.5. Stopping distance = speed x reaction time + speed^2 / (2 x deceleration).POST https://autonomy.md/api/v1/battery_plan. Add a margin for wind, cold, battery age and payload.mission_check result, who said yes and when, start and end times, every stop or failsafe event, and anything unexpected.Works offline in any agent. Same file at /autonomy.md.
Customize
Your envelope, written into one file.
18 settings in 6 groups. Start from a preset, change anything, and your settings are written into AUTONOMY.md. Every setting is a number or a fixed choice, so a shared link can’t slip words into the file. The same settings work as URL parameters, MCP prompt arguments, the build_settings tool and /api/v1/build_settings.
Example numbers for any robot: daytime hours, 30-minute missions, no night work, ask near people, simulate and roll out in stages. Replace them with your own limits and local rules.
Preset numbers are examples. Replace them with your robot’s limits, your own measurements and local rules. They are not recommended, safe or legal values.
Robot and mission
Which robot, how long a mission may run, and when.
Set by the person who operates the robot, and only that person can change them. Settings an agent drafted count only after that person says yes. Where these limits, the robot's own limits, the manufacturer's guidance or the law differ, use the strictest. Numbers that came from a preset are examples, not recommended, safe or legal limits, until the person replaces or confirms them. If a limit blocks the mission, stop and ask; never work around it.
mkdir -p ~/.claude/skills/autonomy && curl -fsSL "https://autonomy.md/autonomy.md?robot_type=ground&max_mission_min=30&start_hour=8&end_hour=18&night_ops=never&max_speed_mps=1&max_accel_mps2=1&min_people_m=2&near_people=ask&battery_reserve_pct=25&max_wind_mps=8&comm_loss=stop&estop=tested&simulation=staged&approve_start=every&approve_manipulation=every" -o ~/.claude/skills/autonomy/SKILL.mdhttps://autonomy.md/autonomy.md?robot_type=ground&max_mission_min=30&start_hour=8&end_hour=18&night_ops=never&max_speed_mps=1&max_accel_mps2=1&min_people_m=2&near_people=ask&battery_reserve_pct=25&max_wind_mps=8&comm_loss=stop&estop=tested&simulation=staged&approve_start=every&approve_manipulation=everyCopy as JSON
The same settings as one JSON object. It feeds the build_settings tool or POST /api/v1/build_settings.
16 of 18 settings set. Anything not set follows the skill’s own rules.
Tools
Checks your agent runs before a robot moves.
Every tool works only with the numbers and shapes you send, and states its formula. Run them here, or call them over HTTP or MCP. They check and calculate; they never control a robot, approve a mission or make anything safe.
Not a safety system. Robots can injure people and damage property. Never rely on these tools to protect anyone or anything: they know nothing about the real robot, terrain, obstacles, moving people or the law, and they can be wrong. A result with no issues is not permission to run. A qualified person supervises every mission with a working emergency stop in reach. Terms
Mission map
Edit the mission and run mission_check. The map draws your fence, keep-outs, people and route in meters. A map with no issues is not permission to run.
Green: geofence. Red: keep-outs. Yellow: people. Blue: route, dashed back to home (black square). North is up; meters.
{
"frame": "local",
"robot_type": "aerial",
"waypoints": [
{
"x": 10,
"y": 10,
"alt_m": 0,
"label": "launch"
},
{
"x": 10,
"y": 10,
"alt_m": 30,
"speed_mps": 2
},
{
"x": 180,
"y": 20,
"alt_m": 30
},
{
"x": 180,
"y": 60,
"alt_m": 30
},
{
"x": 20,
"y": 60,
"alt_m": 30
},
{
"x": 20,
"y": 110,
"alt_m": 30
},
{
"x": 180,
"y": 110,
"alt_m": 45,
"hold_s": 30
}
],
"cruise_speed_mps": 6,
"accel_mps2": 2,
"return_home": true,
"geofence": [
{
"x": 0,
"y": 0
},
{
"x": 200,
"y": 0
},
{
"x": 200,
"y": 150
},
{
"x": 0,
"y": 150
}
],
"keep_outs": [
{
"label": "roof",
"points": [
{
"x": 90,
"y": 95
},
{
"x": 120,
"y": 95
},
{
"x": 120,
"y": 125
},
{
"x": 90,
"y": 125
}
]
},
{
"label": "mast",
"center": {
"x": 150,
"y": 40
},
"radius_m": 8
}
],
"people": [
{
"x": 60,
"y": 140
}
],
"buffer_m": 5,
"max_speed_mps": 8,
"max_altitude_m": 40,
"min_people_distance_m": 20,
"payload_kg": 0.5,
"max_payload_kg": 1,
"max_mission_min": 20,
"battery_wh": 90,
"start_charge_pct": 100,
"battery_reserve_pct": 30,
"power_w": 350,
"derate_pct": 10,
"wind_mps": 5,
"max_wind_mps": 8,
"comm_loss": "return",
"estop": "tested",
"simulated": true,
"include_geometry": false
}curl -s https://autonomy.md/api/v1/mission_check -H 'content-type: application/json' -d '{"frame":"local","robot_type":"aerial","waypoints":[{"x":10,"y":10,"alt_m":0,"label":"launch"},{"x":10,"y":10,"alt_m":30,"speed_mps":2},{"x":180,"y":20,"alt_m":30},{"x":180,"y":60,"alt_m":30},{"x":20,"y":60,"alt_m":30},{"x":20,"y":110,"alt_m":30},{"x":180,"y":110,"alt_m":45,"hold_s":30}],"cruise_speed_mps":6,"accel_mps2":2,"return_home":true,"geofence":[{"x":0,"y":0},{"x":200,"y":0},{"x":200,"y":150},{"x":0,"y":150}],"keep_outs":[{"label":"roof","points":[{"x":90,"y":95},{"x":120,"y":95},{"x":120,"y":125},{"x":90,"y":125}]},{"label":"mast","center":{"x":150,"y":40},"radius_m":8}],"people":[{"x":60,"y":140}],"buffer_m":5,"max_speed_mps":8,"max_altitude_m":40,"min_people_distance_m":20,"payload_kg":0.5,"max_payload_kg":1,"max_mission_min":20,"battery_wh":90,"start_charge_pct":100,"battery_reserve_pct":30,"power_w":350,"derate_pct":10,"wind_mps":5,"max_wind_mps":8,"comm_loss":"return","estop":"tested","simulated":true,"include_geometry":false}'An agent that plans a mission should check it the same way every time.
Ask a language model whether a route stays inside a fence and it will eyeball the coordinates. It can miss a leg that cuts across a concave corner, forget the climb in the energy budget, or skip the return from the farthest waypoint. autonomy.md writes your limits into the agent's instructions as plain rules, and gives it tools that do the geometry and arithmetic the same way every time, say what they could not check, and hand the decision back to a human.
- Geometry, not guesses: ray-cast containment, every path split where it meets a zone edge, and haversine distances.
- Your limits, in writing: the envelope is numbers and fixed choices, so a shared link can't slip words into the skill.
- Honest about gaps: every check lists what it did not check: terrain, moving people, sensor error and the law.
- A human decides: the skill and the tools never approve a mission. They prepare the yes or no.
Use it in your stack
Paste it, install it, or call it.
The skill alone gives an agent the method. The MCP server and API add the tools and your settings. No key, no account.
Paste the prompt into a system prompt or project instructions. Or keep the file in the repo and point AGENTS.md at it.
curl -fsSL https://autonomy.md/autonomy.md -o AUTONOMY.mdecho "Whenever a task plans, changes, reviews or runs a mission for a physical robot (ground, aerial, arm, marine or humanoid), follow AUTONOMY.md." >> AGENTS.mdFor agents that read a skills folder: install the skill so it loads when the topic comes up, and add the MCP server for the tools.
# The skillmkdir -p ~/.claude/skills/autonomycurl -fsSL https://autonomy.md/autonomy.md -o ~/.claude/skills/autonomy/SKILL.md# Tools: mission_check, geo_tools, battery_plan, stopping_distance, build_settingsclaude mcp add --transport http autonomy https://autonomy.md/mcpFor editors that read an mcp.json file: add the remote MCP server to the project, then paste the prompt into your rules.
// .cursor/mcp.json{ "mcpServers": { "autonomy": { "url": "https://autonomy.md/mcp" } } }// .vscode/mcp.json{ "servers": { "autonomy": { "type": "http", "url": "https://autonomy.md/mcp" } } }Any client that speaks remote MCP over HTTP can add it as a custom connector. Read-only, so there is nothing to authorize.
url: https://autonomy.md/mcptransport: streamable-http # stateless, JSON responsestools: mission_check, geo_tools, battery_plan, stopping_distance, build_settingsprompts: autonomy # the skill, with your settingsGET with query parameters or POST a JSON body. CORS open. An OpenAPI document is at /openapi.json.
# Every tool: GET or POST https://autonomy.md/api/v1/<tool>curl -s https://autonomy.md/api/v1 | jq '.tools[].name'curl -s "https://autonomy.md/api/v1/battery_plan?distance_km=1.2&speed_mps=8&battery_wh=90&power_w=350&reserve_pct=30&round_trip=true&hold_min=3&derate_pct=15" | jq .summarycurl -s "https://autonomy.md/api/v1/settings" | jq '.presets[].id'claude mcp add --transport http autonomy https://autonomy.md/mcpExample code
Call it from your own code.
Working calls against the API. The full reference is at /api/v1 and /openapi.json.
Check a mission and fetch the skill with your envelope. No key; nothing is stored.
# Check a mission and fetch the skill with your envelope. No key; nothing is stored.curl -s "https://autonomy.md/api/v1/stopping_distance?speed=1.5&decel_mps2=1&reaction_s=0.4&available_m=2.5" | jq .summarycurl -s https://autonomy.md/api/v1/mission_check \ -H 'content-type: application/json' \ -d '{"frame":"local","robot_type":"ground","cruise_speed_mps":1, "waypoints":[{"x":0,"y":0},{"x":40,"y":0},{"x":40,"y":30}], "geofence":[{"x":-5,"y":-5},{"x":50,"y":-5},{"x":50,"y":40},{"x":-5,"y":40}], "keep_outs":[{"label":"dock","center":{"x":20,"y":3},"radius_m":4}], "buffer_m":2,"max_speed_mps":1.2,"comm_loss":"stop","estop":"tested","simulated":true}' \ | jq '{summary, result, issues, not_checked}'# The skill with your envelope written in (settings notes come back in a header)curl -s "https://autonomy.md/autonomy.md?preset=indoor_ground&max_speed_mps=0.8&min_people_m=2" -D - -o SKILL.md | grep -i x-settingsRun mission_check before a mission and refuse to continue on any stop issue (node 18+: npx tsx preflight.mts).
// Run mission_check before a mission and refuse to continue on any stop issue (node 18+: npx tsx preflight.mts).type Issue = { severity: "stop" | "warn"; code: string; where: string; detail: string };const mission = { frame: "latlon", robot_type: "aerial", cruise_speed_mps: 5, accel_mps2: 2, return_home: true, waypoints: [ { lat: 10.0, lon: 20.0, alt_m: 0, label: "launch" }, { lat: 10.0, lon: 20.0, alt_m: 25, speed_mps: 2 }, { lat: 10.0009, lon: 20.0, alt_m: 25 }, { lat: 10.0009, lon: 20.0012, alt_m: 25, hold_s: 20 }, ], geofence: [ { lat: 9.9995, lon: 19.9995 }, { lat: 9.9995, lon: 20.0018 }, { lat: 10.0014, lon: 20.0018 }, { lat: 10.0014, lon: 19.9995 }, ], buffer_m: 5, max_speed_mps: 8, max_altitude_m: 30, battery_wh: 90, battery_reserve_pct: 30, power_w: 350, derate_pct: 15, wind_mps: 4, max_wind_mps: 7, comm_loss: "return", estop: "tested", simulated: true,};const res = await fetch("https://autonomy.md/api/v1/mission_check", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(mission),});const out = (await res.json()) as { summary: string; issues: Issue[]; not_checked: string[] };console.log(out.summary);for (const i of out.issues) console.log(`${i.severity.toUpperCase()} ${i.code} at ${i.where}: ${i.detail}`);console.log("Not checked:", out.not_checked.join(" | "));const stops = out.issues.filter((i) => i.severity === "stop");if (stops.length > 0) { console.error("Do not run this mission. Fix the stop issues and check again."); process.exit(1);}console.log("No stop issues. This is not permission to run: get the supervising person's yes.");FAQ
Is autonomy.md a safety system?
If mission_check finds no issues, can my robot run the mission?
Who is responsible if something goes wrong?
Are the preset numbers recommended limits?
Does it know local drone or robot rules?
Does it work with my robot software?
Is this advice?
Does it name brands or show prices?
Can an agent set up its own settings?
build_settings tool. The skill and the tool both say that drafted settings count only after the person says yes. Nothing technical stops an agent from ignoring that, so read what it sends you.