MCP server for iNAV flight-controller configuration and diagnostics
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP server that lets Claude configure, diagnose, and troubleshoot an iNAV flight controller over USB β built primarily for flying wings (elevon FPV wings like the TBS Chupito and Mojito), and also for conventional fixed-wing planes.
It talks to the FC through a single serial connection, using the iNAV CLI for configuration writes and a small built-in MSP codec for live/binary reads. Every write is dry-run by default, auto-backs-up first, refuses while the board is armed, and reads back to verify.

Recorded against a live iNAV 6.1.0 flight controller over USB.
β οΈ Safety: Always remove props from the aircraft before any motor test. This tool never switches the FC into MSP-RX mode and never arms the aircraft.
COM3 on Windows, /dev/ttyACM0 on Linux)From PyPI (once the first release is published):
From source (for development, or to run the latest unreleased code):
For development (tests):
You don't need any hardware to confirm the project works β the test suite runs fully offline (no FC required):
All 186 tests should pass. To actually use the server, though, you need a flight controller flashed with iNAV firmware (developed against iNAV 8.x/9.x) connected over USB β without one, the connection tools have nothing to talk to.
Add the server to your Claude (Code or Desktop) MCP config
(~/.claude/settings.json or the Claude Desktop config). Replace the paths
below with wherever you cloned this repo β the command points at the Python
inside your .venv, and cwd is the repo root.
Windows:
Linux / macOS:
The server speaks MCP over stdio. You can also run it directly with the
installed entry point inav-mcp.
The server ships prompts that walk Claude through the common jobs β just pick one:
new_fixed_wing_setup β gather hardware details β define_aircraft β review β apply.troubleshoot_no_arm β decode arming-prevention flags β guided fixes.configure_modes β identify switches from live RC β suggest a layout β assign modes.Or drive it conversationally, e.g.:
"Connect to my FC on COM3 and tell me why it won't arm."
"Set up a 4S flying wing on DSHOT600, then show me the commands before applying."
| Tool | What it does |
|---|---|
list_serial_ports() | List available serial ports. |
find_fc(baud=115200, probe_all=False) | Auto-detect which port has an FC by probing for MSP identity β no guessing the port. |
connect(port, baud=115200) | Open the FC connection, return board identity. |
disconnect() | Close the connection. |
board_info() | FC variant, firmware version, target, API version, sensors. |
| Tool | What it does |
|---|---|
define_aircraft(name, wing_type, esc_protocol, cells, β¦) | Offline planner β stores a profile and generates the CLI config plan. |
get_aircraft_profile() | The current declared profile + plan. |
apply_aircraft_setup(confirm=False) | Apply the plan (gated: not armed, auto-backup, read-back verify). On iNAV, applying is inherently save+reboot. |
check_config() | diff all + lint against the declared profile + ARM check. |
| Tool | What it does |
|---|---|
suggest_mode_layout(skill_level, num_switches, has_gps=False) | Recommend a fixed-wing switch/mode layout (offline). |
set_flight_mode(mode_name, aux_channel, range_low, range_high, confirm=False) | Assign one mode to an aux range. |
assign_switch(switch_channel, switch_positions, mode_per_position, confirm=False) | Map a whole 2/3/6-pos switch in one call. |
clear_flight_mode(mode_name, confirm=False) | Remove a mode's switch assignments. |
| Tool | What it does |
|---|---|
diagnose() | Full sweep: arming, sensors, RC, battery, GPS β prioritized fixes. |
why_wont_it_arm() | Decode arming-prevention flags into plain reasons + fixes. |
read_rc_channels() | Live RC channel values β flip a switch, see which channel moves. |
read_sensors() | Live attitude, per-sensor health, battery. |
get_status() | MSP status + CLI status/tasks. |
list_flight_modes() | All modes and their current switch assignments. |
check_failsafe() | Read failsafe_* settings, explain the RC-loss procedure, flag risky setups (e.g. RTH without GPS). |
| Tool | What it does |
|---|---|
test_motor(motor, throttle_us=1100, duration_s=2.0, props_removed=False, confirm=False) | Spin ONE motor briefly. Hard-gated: props_removed=True + confirm=True, refuses while armed, always auto-stops. (No test_servo β iNAV has no live servo override; verify surfaces with the TX sticks + read_rc_channels().) |
calibrate_accelerometer(confirm=False) | Zero-level the accelerometer (board flat + still). Fixes most "not level" arming blocks. |
calibrate_magnetometer(confirm=False) | Calibrate the compass (rotate the craft ~30s). |
| Tool | What it does |
|---|---|
read_gps() | Live GPS fix/sats/position + nav-readiness assessment (read-only). |
configure_gps(provider="UBLOX", sbas=None, confirm=False) | Enable the GPS feature and set provider/SBAS. |
set_nav(rth_altitude_m=None, rth_climb_first=None, rth_allow_landing=None, loiter_radius_m=None, confirm=False) | Set fixed-wing RTH altitude / climb-first / landing / loiter radius. |
read_tuning() | Read fixed-wing PID gains, rates, and filter cutoffs. |
set_pid(axis, p=None, i=None, d=None, ff=None, confirm=False) | Set fixed-wing P/I/D/FF gains for one axis. |
| Tool | What it does |
|---|---|
backup_config(label=None) | Save diff all to a timestamped file under ./backups/. |
list_backups() | List saved backups (path, time, size, label), newest first. |
restore_config(path, confirm=False) | Replay a saved backup via CLI. |
set_failsafe(procedure=None, throttle_us=None, confirm=False) | Set the RC-loss procedure / throttle (atomic write; FC validates the procedure token). |
cli(command, confirm_for_writes=False, props_removed=False) | Raw CLI escape hatch (ONE command, one reboot). Writes need confirm_for_writes; a live motor test needs props_removed=True and is never saved. |
cli_batch(commands, confirm_for_writes=False) | Run MANY CLI commands in one session β one reboot. Read-only batch exits without saving; a write batch backs up + saves once (rolls back if any command is rejected). Motor/save/exit commands refused. |
save_and_reboot(confirm=False) | save to EEPROM and reboot (marks the connection stale). |
inav://modes-reference β iNAV mode glossary with fixed-wing relevance.inav://current-profile β the declared aircraft profile + generated plan.inav://last-backup β the most recent diff all backup.test_motor() and any live motor command via cli(...) require props_removed=True (the generic write-confirm cannot bypass it), refuse while the board is armed, and are never saved. test_motor() also clamps throttle/duration and always commands the motor back to stop.confirm=True applies.save = reboot β save_and_reboot warns and marks the connection stale.No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/inav-mcp)<a href="https://allmcps.com/mcp/inav-mcp"><img src="https://allmcps.com/api/badge/inav-mcp?style=directory" alt="Inav MCP on AllMCPs" /></a>