Skip to content

Install and connect

mcardupilot runs a SITL binary you have already built. It never builds or edits the ArduPilot tree. By default it looks for the tree in ~/ardupilot, where ArduPilot’s setup guide clones it, and runs build/sitl/bin/arduplane from there.

Terminal window
cd ~/ardupilot
./waf configure --board sitl
./waf plane

A tree elsewhere, or a binary outside a tree:

Terminal window
export MCARDUPILOT_ARDUPILOT=/path/to/ardupilot
export MCARDUPILOT_BINARY=/path/to/arduplane # only if it is not <tree>/build/sitl/bin/arduplane

With a binary outside <tree>/build/<board>/bin/, the server cannot find the frame’s default parameter files, so pass params=[...] to open_sitl yourself.

mcardupilot is on PyPI, so uvx fetches and runs it:

Terminal window
claude mcp add mcardupilot -- uvx mcardupilot

Add --refresh to the uvx arguments if you want each start to pick up a newer release.

On start the server prints one line to stderr, never stdout, which belongs to the protocol:

mcardupilot v2026.10.03 ardupilot=~/ardupilot pool=40-59 data=~/.local/share/mcardupilot transport=stdio

If the binary is missing it says so on the next line, and keeps running so server_info can tell you the same.

Ask your agent for server_info:

{
"version": "2026.10.3",
"binary_exists": true,
"binary_mtime": "2026-10-02T18:30:12+00:00",
"instance_pool": "40-59",
"leases_held": {},
"reconciled": [],
"wait_cap_s": 85.0,
"log_budget_gb": 20.0,
"logs_used_gb": 0.0
}

binary_exists: true means sessions can start. leases_held lists every instance someone holds, from any process sharing the data directory. reconciled lists SITLs a dead server left behind that this one killed at start.

For a client that cannot launch a process:

Terminal window
MCARDUPILOT_TRANSPORT=http MCARDUPILOT_HTTP_PORT=8374 uv run --directory /path/to/mcardupilot mcardupilot

The server listens on 127.0.0.1 by default and has no authentication of its own. Over HTTP it reads logs only from under its data directory.