Install and connect
Build the SITL binary
Section titled “Build the SITL binary”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.
cd ~/ardupilot./waf configure --board sitl./waf planeA tree elsewhere, or a binary outside a tree:
export MCARDUPILOT_ARDUPILOT=/path/to/ardupilotexport MCARDUPILOT_BINARY=/path/to/arduplane # only if it is not <tree>/build/sitl/bin/arduplaneWith a binary outside <tree>/build/<board>/bin/, the server cannot find the frame’s default parameter files, so pass params=[...] to open_sitl yourself.
Add the server
Section titled “Add the server”mcardupilot is on PyPI, so uvx fetches and runs it:
claude mcp add mcardupilot -- uvx mcardupilotAdd --refresh to the uvx arguments if you want each start to pick up a newer release.
claude mcp add mcardupilot -- uv run --directory /path/to/mcardupilot mcardupilotuv run --directory runs the editable install, so restarting the server picks up every edit to the source.
The server speaks MCP over stdio by default. Any client that launches a command works:
{ "mcpServers": { "mcardupilot": { "command": "uv", "args": ["run", "--directory", "/path/to/mcardupilot", "mcardupilot"], "env": { "MCARDUPILOT_ARDUPILOT": "/path/to/ardupilot" } } }}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=stdioIf the binary is missing it says so on the next line, and keeps running so server_info can tell you the same.
Check it
Section titled “Check it”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.
Run over HTTP
Section titled “Run over HTTP”For a client that cannot launch a process:
MCARDUPILOT_TRANSPORT=http MCARDUPILOT_HTTP_PORT=8374 uv run --directory /path/to/mcardupilot mcardupilotThe 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.