iNAV MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iNAV MCP ServerFind my flight controller and check why it won't arm."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
iNAV MCP Server
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.
Requirements
Python 3.10+
An iNAV flight controller (developed against iNAV 8.x/9.x) connected over USB
The serial port the FC enumerates as (e.g.
COM3on Windows,/dev/ttyACM0on Linux)
Related MCP server: Serial MCP Server
Install
From PyPI (once the first release is published):
pip install inav-mcpFrom source (for development, or to run the latest unreleased code):
# from the repo root
python -m venv .venv
.venv/Scripts/python -m pip install -e . # Windows
# source .venv/bin/activate && pip install -e . # Linux/macOSFor development (tests):
.venv/Scripts/python -m pip install -e ".[dev]"Try it without a flight controller
You don't need any hardware to confirm the project works — the test suite runs fully offline (no FC required):
.venv/Scripts/python -m pytest # Windows
# .venv/bin/pytest # Linux/macOSAll 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.
Register with Claude
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:
{
"mcpServers": {
"inav": {
"command": "C:\\path\\to\\inav-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "inav_mcp.server"],
"cwd": "C:\\path\\to\\inav-mcp"
}
}
}Linux / macOS:
{
"mcpServers": {
"inav": {
"command": "/path/to/inav-mcp/.venv/bin/python",
"args": ["-m", "inav_mcp.server"],
"cwd": "/path/to/inav-mcp"
}
}
}The server speaks MCP over stdio. You can also run it directly with the
installed entry point inav-mcp.
Typical workflows
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."
Tools (35)
Connection & identity
Tool | What it does |
| List available serial ports. |
| Auto-detect which port has an FC by probing for MSP identity — no guessing the port. |
| Open the FC connection, return board identity. |
| Close the connection. |
| FC variant, firmware version, target, API version, sensors. |
Hardware setup
Tool | What it does |
| Offline planner — stores a profile and generates the CLI config plan. |
| The current declared profile + plan. |
| Apply the plan (gated: not armed, auto-backup, read-back verify). On iNAV, applying is inherently save+reboot. |
|
|
Flight modes & switches
Tool | What it does |
| Recommend a fixed-wing switch/mode layout (offline). |
| Assign one mode to an aux range. |
| Map a whole 2/3/6-pos switch in one call. |
| Remove a mode's switch assignments. |
Diagnostics
Tool | What it does |
| Full sweep: arming, sensors, RC, battery, GPS → prioritized fixes. |
| Decode arming-prevention flags into plain reasons + fixes. |
| Live RC channel values — flip a switch, see which channel moves. |
| Live attitude, per-sensor health, battery. |
| MSP status + CLI |
| All modes and their current switch assignments. |
| Read |
Bench tests & calibration
Tool | What it does |
| Spin ONE motor briefly. Hard-gated: |
| Zero-level the accelerometer (board flat + still). Fixes most "not level" arming blocks. |
| Calibrate the compass (rotate the craft ~30s). |
Navigation & tuning
Tool | What it does |
| Live GPS fix/sats/position + nav-readiness assessment (read-only). |
| Enable the GPS feature and set provider/SBAS. |
| Set fixed-wing RTH altitude / climb-first / landing / loiter radius. |
| Read fixed-wing PID gains, rates, and filter cutoffs. |
| Set fixed-wing P/I/D/FF gains for one axis. |
Config management
Tool | What it does |
| Save |
| List saved backups (path, time, size, label), newest first. |
| Replay a saved backup via CLI. |
| Set the RC-loss procedure / throttle (atomic write; FC validates the procedure token). |
| Raw CLI escape hatch (ONE command, one reboot). Writes need |
| 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/ |
|
|
Resources
inav://modes-reference— iNAV mode glossary with fixed-wing relevance.inav://current-profile— the declared aircraft profile + generated plan.inav://last-backup— the most recentdiff allbackup.
Safety model
Props-off gate —
test_motor()and any livemotorcommand viacli(...)requireprops_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.Armed guard — all writes (and motor tests / calibrations) refuse if the FC reports armed.
Auto-backup before every write; the backup path is returned.
Dry-run by default — writes return the exact commands;
confirm=Trueapplies.Read-back verify — after applying, settings are re-read and mismatches flagged.
save= reboot —save_and_rebootwarns and marks the connection stale.No receiver-mode changes — the FC is never switched to MSP-RX.
Reboot model — why batching matters
On iNAV, leaving the CLI always reboots the FC — both save (persist to
EEPROM) and exit (discard changes) trigger a reboot, after which the USB VCP
re-enumerates and we reconnect (~6–8 s, surfaced as reboot_seconds). So every
CLI round-trip costs one reboot, including read-only ones (get, diff,
dump, version). There is no way to read over the CLI without that reboot —
the only lever is to do fewer CLI sessions.
What this server does to keep reboot churn down:
Reads prefer MSP, which never reboots.
get_status,read_rc_channels,read_sensors,read_gps,list_flight_modes,why_wont_it_arm,diagnose, and the armed-guard all read structured data over MSP — zero reboots. Only data that's CLI-only (diff all,get failsafe, PID/rate/filtergets) pays a reboot.Writes are atomic and batch internally. Each write tool (
apply_aircraft_setup,set_flight_mode,assign_switch,set_pid,set_failsafe,restore_config, …) opens one CLI session: backup → apply all commands → save → reboot once. Multiple settings = one reboot.cli_batch()for ad-hoc runs. Instead of callingcli()in a loop (one reboot per command — the cadence that can knock a board into DFU), pass a list tocli_batch(): one session, one reboot. Read-only batchesexitwithout saving; write batches back up andsaveonce (rolling back if any command is rejected).Resilient reconnect. After a reboot the reconnect waits a short settle, then polls with backoff; if the original COM port doesn't return it scans for a re-enumerated one, and if the board came back in DFU/bootloader mode it says so and tells you to power-cycle (USB unplug/replug) rather than hanging.
How it works
Single serial handle shared between MSP and CLI modes (
connection.py), tracked by amodestate machine. Never two handles on one port.CLI-first writes — the CLI is stable across firmware versions; MSP command IDs can drift. A thin MSP v1/v2 codec (
msp.py) handles only the live binary reads (status, RC, attitude, analog, GPS, sensor health, mode ranges, box maps).Box IDs are resolved at runtime via
MSP_BOXNAMES+MSP_BOXIDS— never hardcoded.Arming flags are decoded from
knowledge/arming_flags.json, calibrated to iNAV 8.x/9.x bit positions. The table declares its calibrated major versions, andconnect()/board_info()/why_wont_it_arm()/diagnose()warn when the connected firmware is outside that range (bit positions shift between majors, so flag names may be mislabelled even though the raw flag value is correct).
Development
.venv/Scripts/python -m pytest # 186 tests, all offline (no FC needed)The suite covers the MSP codec round-trips, CLI response parsing, the diagnostic rule engine, offline profile/command generation, mode-range read-modify-write logic (against a mock connection), and resource/prompt registration.
Project layout:
inav_mcp/
server.py # FastMCP app: all tools, resources, prompts
connection.py # single serial handle, MSP + CLI mode switching
msp.py # MSP v1/v2 codec + parsers
cli.py # CLI response parsing, write-command detection
modes.py # box maps, mode-range read/write, layout planner
profiles.py # AircraftProfile + offline CLI command generator
troubleshoot.py # diagnose() rule engine + arming-flag decode
safety.py # armed guard, backup paths
state.py # connection + profile singletons
knowledge/ # arming_flags / modes_reference / esc_protocols / fc_targets (JSON)
tests/ # offline pytest suite
tools/ # gen_readme_tools.py — regenerates the tool reference below
examples/ # flying_wing_quickstart.md — end-to-end walkthroughRelease history is in CHANGELOG.md.
Full tool reference
Complete, signature-accurate list — regenerate after changing tools with
python -m tools.gen_readme_tools (a test fails if this drifts):
35 tools — auto-generated by tools/gen_readme_tools.py; do not edit by hand.
Tool | Description |
| Apply the declared aircraft profile to the FC, then save and reboot. |
| Map a multi-position switch's detents to flight modes in one call. |
| Save the current FC config to a timestamped backup file. |
| Read flight-controller identity over MSP. |
| Calibrate the accelerometer (zero-level). Fixes most 'not level' / 'accel not |
| Calibrate the compass (magnetometer). Only useful if a compass is installed. |
| Compare the FC's actual configuration against the declared aircraft profile. |
| Read and explain the failsafe configuration (what happens on RC loss). |
| Remove all switch assignments for a flight mode (disables its slots via CLI 'aux'). |
| Raw CLI escape hatch — run any iNAV CLI command directly. |
| Run MANY CLI commands in ONE CLI session — a single reboot for the whole batch. |
| Enable the GPS feature and set the receiver provider / SBAS (atomic CLI write). |
| Open the serial connection to the FC and return board identity. |
| Define the aircraft hardware profile and generate a configuration plan. |
| Full diagnostic sweep — the flagship troubleshooter. |
| Close the serial connection to the FC. |
| Auto-detect which serial port has a flight controller, so you don't guess. |
| Return the currently declared aircraft profile. |
| Read FC status via both MSP and CLI. |
| List saved config backups under ./backups/, newest first. No FC needed. |
| List all available flight modes and their current switch assignments. |
| List all available serial ports. |
| Live GPS status: fix type, satellites, position, speed, HDOP + nav-readiness. |
| Read live RC channel values via MSP. |
| Read live sensor values: attitude, per-sensor health, and analog (battery). |
| Read fixed-wing PID gains, rates, and key filter cutoffs (via CLI). |
| Restore FC config by replaying a backup file's CLI commands, then save+reboot. |
| Save the running config to EEPROM and reboot the FC. |
| Set the core failsafe behaviour (atomic CLI write: backup → apply → save+reboot). |
| Assign a flight mode to an aux channel range (read-modify-write via CLI 'aux'). |
| Set core fixed-wing navigation / RTH parameters (atomic CLI write). |
| Set fixed-wing PID gains for ONE axis (atomic CLI write). |
| Recommend a fixed-wing flight-mode/switch layout. Pure knowledge — no FC needed. |
| Spin ONE motor briefly for a bench test (direction / wiring / response). |
| Decode the FC's arming-prevention flags into plain English. |
License
MIT. This project ships its own MSP codec and does not import GPL libraries (uNAVlib / YAMSPy) at runtime, keeping it permissively licensed.
Available Tools
35 toolsapply_aircraft_setupA
Apply the declared aircraft profile to the FC, then save and reboot.
On iNAV this is an ATOMIC operation: the commands are applied in one CLI session, backed up first, then SAVED to EEPROM (the only way changes persist) and the FC reboots. We reconnect automatically and verify by read-back. If any command fails, ALL changes are rolled back (nothing is saved).
Gates:
A profile must be defined via define_aircraft().
Connected and not armed.
confirm=True required (dry-run by default).
Args: confirm: True to apply+save+reboot. Default False = dry-run (shows commands).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It meticulously describes the atomic operation: commands are applied in one CLI session, backed up first, saved to EEPROM, reboots, auto-reconnects, verifies by read-back, and rolls back all changes on failure. This is exceptional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. The subsequent paragraphs add essential behavioral detail (atomicity, rollback, verification), prerequisites (gates), and parameter explanation (Args). Every sentence earns its place, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (atomic apply, save, reboot, rollback) and the absence of annotations or output schema, the description is remarkably complete. It covers prerequisites, side effects, failure handling, and the parameter's role. Nothing critical is missing for an agent to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero description coverage for the 'confirm' parameter, but the description's 'Args' section fully explains it: 'True to apply+save+reboot. Default False = dry-run (shows commands).' This completely compensates for the lack of schema documentation, adding precise semantics that the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Apply the declared aircraft profile to the FC, then save and reboot.' This specifies a concrete verb+resource+outcome, and distinguishes it from siblings like define_aircraft (which defines the profile) and save_and_reboot (which is generic). It also highlights the atomic nature of the operation, adding further clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Gates' that must be met: a profile must be defined, the FC must be connected and not armed, and confirm=True is required. It also notes that dry-run is the default. While it clearly states prerequisites and the safe default, it does not explicitly name alternative tools or when to use them instead, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_switchA
Map a multi-position switch's detents to flight modes in one call.
Computes the µs range for each detent and writes one 'aux' assignment per mode. Dry-run by default. Gates: connected, not armed, auto-backup before write.
Args: switch_channel: 1-based AUX number the switch is on (1 = AUX1 = RC channel 5). switch_positions: Number of detents on the switch: 2, 3, or 6. mode_per_position: Map of position → mode name. Position keys may be "low"/"mid"/"high" (for 2/3-pos) or "1".."N" / "pos1".., e.g. {"low": "ANGLE", "mid": "HORIZON", "high": "MANUAL"}. confirm: True to apply. Default False = dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| switch_channel | Yes | ||
| switch_positions | Yes | ||
| mode_per_position | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses that the tool computes µs ranges, writes one aux assignment per mode, and defaults to dry-run, plus critical gates. With no annotations, this description carries the full burden and meets it well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured and front-loaded: first sentence states purpose, then behavioral notes, then a clear Args list. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers purpose, behavior, preconditions, and parameters comprehensively. It omits return value/error handling, but the absence is not critical for a tool that is primarily an action. Overall, it's near-complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has no descriptions (coverage 0%), so the description compensates by detailing each parameter: switch_channel's 1-based AUX numbering, switch_positions' allowed values (2, 3, 6), mode_per_position's key formats and example, and confirm's default. This is high-value addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Map a multi-position switch's detents to flight modes in one call.' It clearly distinguishes from siblings like set_flight_mode by focusing on multi-position mapping and mass assignment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the context: 'Dry-run by default' and 'Gates: connected, not armed, auto-backup before write,' which inform when it's safe to run. It does not explicitly name alternative tools, but the one-call mapping purpose is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_configA
Save the current FC config to a timestamped backup file.
Runs 'diff all' in the CLI and writes the output to ./backups/.txt.
NOTE: on iNAV, leaving the CLI reboots the FC, so this reboots and then auto-reconnects (~7s). The result includes 'rebooted': True.
Args: label: Optional suffix added to the filename for easy identification.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses side effects (iNAV reboot and auto-reconnect), the exact command run ('diff all'), the output file pattern, and a return value ('rebooted': True). Minor gaps include whether a connection is required and any potential errors, but the disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary purpose. Each sentence adds value: the command, output location, iNAV behavior note, and argument explanation. No redundant or verbose text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and lack of annotations, the description covers the essential aspects: action, mechanism, side effects, return value, and argument. It could mention prerequisites like being connected, but that is likely implicit from sibling tools. Overall, adequate for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only lists 'label' with no description, but the tool description clearly explains it as 'Optional suffix added to the filename for easy identification.' This fully compensates for the 0% schema coverage and adds meaningful semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource+destination: 'Save the current FC config to a timestamped backup file.' It also specifies the implementation ('Runs diff all') and output location, distinguishing it from sibling tools like restore_config and list_backups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use the tool (to back up config), but it does not explicitly contrast with alternatives such as restore_config or list_backups, nor does it mention any exclusions or prerequisites. Usage context is evident but not stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
board_infoA
Read flight-controller identity over MSP.
Returns: FC variant (e.g. 'INAV'), firmware version, board/target name, API version, build date/time/git revision, and sensors detected.
Requires an active connection (call connect first).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states this is a read operation ('Read') and lists what it returns, implying no side effects. It also discloses the need for an active connection, which is important behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single-sentence summary, a clear bullet-like list of return values, and a critical usage prerequisite. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and lack of parameters, the description is nearly complete. It covers what is returned and the necessary connection prerequisite. A return format or typical usage example would add polish but isn't strictly required for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds meaning by explaining what the tool will do and what data it returns, compensating for the absence of a parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Read') and resource ('flight-controller identity over MSP'). It enumerates the returned data (variant, firmware version, board name, etc.), making it easy to distinguish from siblings like get_status or read_sensors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Requires an active connection (call connect first)', which is a clear prerequisite and guides usage order. It doesn't mention when not to use it or alternatives, but the context is clear and practical for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calibrate_accelerometerA
Calibrate the accelerometer (zero-level). Fixes most 'not level' / 'accel not calibrated' arming blocks.
Sends MSP_ACC_CALIBRATION; iNAV samples for ~2s and saves to EEPROM automatically (no reboot).
BEFORE running: set the board/aircraft on a LEVEL surface in its normal flight orientation and DO NOT move it until this returns.
Gates: connected, not armed, confirm=True (dry-run otherwise).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries full burden and does well. It reveals the underlying MSP command, the ~2s sampling, automatic EEPROM save, no reboot needed, physical setup requirement, and dry-run behavior based on confirm. This goes beyond the schema and gives the agent critical safety and side-effect information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the purpose, and each subsequent sentence adds necessary detail (protocol, EEPROM persistence, physical prerequisites, gates). The line break for the 'BEFORE running' warning improves scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool, this description covers purpose, usage, procedure, side effects, and preconditions comprehensively. It also distinguishes from its sibling calibrate_magnetometer. No gaps appear for execution.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single boolean parameter `confirm` is explained: true executes calibration, false performs a dry-run. This adds essential meaning beyond the schema field name 'Confirm', which would otherwise be ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly names the action and resource ('Calibrate the accelerometer') and ties it to a concrete outcome ('Fixes most 'not level' / 'accel not calibrated' arming blocks'). This clearly distinguishes it from sibling tools like calibrate_magnetometer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states specific conditions for use: when the aircraft has 'not level' or 'accel not calibrated' arming blocks, and provides prerequisites (level surface, don't move, gates). However, it does not explicitly mention when not to use or alternatives such as why_wont_it_arm or diagnose, so it earns a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calibrate_magnetometerA
Calibrate the compass (magnetometer). Only useful if a compass is installed.
Sends MSP_MAG_CALIBRATION; you then have ~30s to rotate the aircraft 360° around all three axes. iNAV saves the result automatically.
Gates: connected, not armed, confirm=True (dry-run otherwise).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosure. It explains the protocol (MSP_MAG_CALIBRATION), the 30-second rotation requirement, automatic saving, and the dry-run behavior when confirm is not true. This is solid transparency for a simple calibration action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and structured in three short paragraphs: purpose, procedure, and gates. Every sentence adds value and is front-loaded with the key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single boolean parameter, no output schema, and no annotations, the description covers purpose, procedure, timing, result handling, and preconditions. It lacks details on possible errors or post-calibration verification, but those are not critical for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, confirm, is fully explained in the description: 'confirm=True (dry-run otherwise)'. This adds meaning beyond the schema's bare definition and clarifies the exact behavioral difference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool calibrates the compass/magnetometer, using a specific verb and resource. It distinguishes from the sibling calibrate_accelerometer by explicitly naming the magnetometer and describing the rotation procedure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit prerequisites: 'Only useful if a compass is installed' and gates: 'connected, not armed, confirm=True (dry-run otherwise)'. While it doesn't explicitly contrast with sibling calibration tools, the conditions and dry-run behavior give clear guidance on when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_configA
Compare the FC's actual configuration against the declared aircraft profile.
Runs 'diff all' via CLI, parses key settings, and reports mismatches against the profile declared with define_aircraft(). Also checks if ARM mode is assigned to a switch.
Useful after apply_aircraft_setup() or to sanity-check a partially configured FC.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals the mechanism ('Runs diff all via CLI, parses key settings') and the specific ARM mode check, which adds useful context. However, it does not explicitly state that the operation is read-only, nor does it describe the output format or any side effects, leaving some ambiguity for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with the main action front-loaded in the first sentence. The 'Useful after' clause adds practical guidance without redundancy, and there is no filler or repeated information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only diagnostic with no parameters, the description covers the source of truth, the method, the scope of checks, and the typical use case. It lacks explicit output format details, but since no output schema exists, the description is sufficiently complete for tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so the baseline is 4. The description correctly avoids inventing parameters and focuses on the tool's behavior, which is appropriate for a no-argument check command.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Compare' and identifies the exact resources: the FC's actual configuration vs the declared aircraft profile. It distinguishes itself from siblings like apply_aircraft_setup by framing the action as a verification step, and it references define_aircraft() to clarify the source of the declared profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Useful after apply_aircraft_setup() or to sanity-check a partially configured FC.' This provides clear contextual guidance. It does not mention when not to use it or explicitly name alternatives, but the intended timing is well understood.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_failsafeA
Read and explain the failsafe configuration (what happens on RC loss).
Reads all failsafe_* settings via CLI get failsafe, summarises the RC-loss
procedure in plain English, and flags risky setups (procedure NONE; RTH without GPS).
NOTE: reads over CLI; exiting CLI reboots the FC, so this reboots and reconnects (~7s).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It honestly discloses a significant side effect: reading via CLI exits CLI and reboots the FC, causing a ~7s reboot and reconnect. It also explains what the tool does with the data (summarize in plain English, flag risky setups). This goes beyond minimal expectations, though it does not mention permissions or other potential behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core purpose, the second details the operations, and the final note explains the reboot side effect. No wasted words; each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description provides a solid picture: reads all failsafe settings, summarizes the procedure, and flags risks with examples. It could optionally describe the exact return format, but the summary and risk-flagging behavior are clear enough to set expectations. A slight gap is lack of detail on how the summary is presented, but overall it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% (empty properties). The description adds no parameter-specific detail, but with no parameters, baseline 4 is appropriate. It does not need to compensate for any missing schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb phrase 'Read and explain the failsafe configuration' and adds context 'what happens on RC loss'. It clearly distinguishes from sibling tools like set_failsafe (which configures) and get_status (general status) by focusing on failsafe-specific reading and explanation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: use when you want to understand the failsafe/RC-loss procedure. However, there is no explicit when-not-to-use or mention of alternatives (e.g., set_failsafe for changing settings). The description implies read-only analysis but does not distinguish when to choose this over other diagnostic tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_flight_modeA
Remove all switch assignments for a flight mode (disables its slots via CLI 'aux').
Dry-run by default. Gates: connected, not armed, auto-backup before write.
Args: mode_name: Exact mode name (e.g. "HORIZON", "NAV RTH"). confirm: True to apply. Default False = dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| mode_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description fully discloses key behaviors: dry-run default, confirmation requirement, safety gates (connected, not armed), and auto-backup before write. It also explains the underlying mechanism (CLI 'aux'). This is comprehensive for a mutation tool and exceeds typical disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main purpose, then dry-run behavior, gates, and argument details. Each sentence delivers essential information without waste, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, behavior, gates, and parameters, which is complete for this tool's complexity. However, it doesn't specify what happens after a successful write (e.g., return value or automatic save) or behavior when mode_name is not found, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (coverage 0%), but the description compensates fully. mode_name is explained with exact format and examples, and confirm is described as 'True to apply. Default False = dry-run.' This provides complete meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool removes all switch assignments for a flight mode, using a specific verb ('Remove') and resource ('switch assignments for a flight mode'), and adds context via 'disables its slots via CLI aux'. This distinguishes it from sibling tools like assign_switch or set_flight_mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context, including dry-run default, the confirm flag to apply, and prerequisites (connected, not armed, auto-backup). While it doesn't explicitly name alternatives, the purpose statement makes the tool's role clear, and the gates give conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cliA
Raw CLI escape hatch — run any iNAV CLI command directly.
Read-only commands (diff, get, status, dump, tasks, help, version) run and the FC reboots on CLI exit (auto-reconnected). Write commands (set, aux, feature, smix, ...) require confirm_for_writes=True and are SAVED (persist + reboot), since on iNAV exiting CLI without save discards changes.
SAFETY — motor commands: a 'motor ...' command drives a LIVE motor output and can spin a propeller. It is gated separately from ordinary writes: it requires props_removed=True (NOT confirm_for_writes), refuses if the board is armed, and is NEVER saved — it's a momentary bench test that stops when the FC reboots on CLI exit.
Prefer the dedicated write tools (they back up and verify). Use this for one-off commands the other tools don't cover.
Args: command: The CLI command to run (without trailing newline). confirm_for_writes: Set True to allow (and persist) write commands. props_removed: Set True to allow a live 'motor' test — ONLY after physically removing all propellers from the aircraft.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| props_removed | No | ||
| confirm_for_writes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses critical details: FC reboot on CLI exit, auto-reconnection, persistence behavior for writes, motor safety gating (props_removed, armed refusal, never saved), and the difference between confirm_for_writes and props_removed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence is essential for a raw CLI tool with dangerous motor capabilities. It is well-structured with clear paragraphs for general behavior, safety warnings, usage preference, and parameter details. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with high complexity and zero annotations, the description covers all essential context: what the tool does, when to use it, safety hazards, persistence mechanics, and parameter semantics. An output schema exists, so return values need not be described. This is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides a dedicated Args section explaining each parameter: command (without trailing newline), confirm_for_writes (allow and persist writes), and props_removed (safety for live motor test). This fully compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: "Raw CLI escape hatch — run any iNAV CLI command directly." It also distinguishes itself from siblings by explicitly recommending dedicated write tools for normal use and positioning this as the fallback for one-off commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: "Prefer the dedicated write tools (they back up and verify). Use this for one-off commands the other tools don't cover." It also differentiates read-only, write, and motor command use cases with precise gating requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cli_batchA
Run MANY CLI commands in ONE CLI session — a single reboot for the whole batch.
On iNAV, leaving the CLI ALWAYS reboots the FC, so every separate cli() call
costs a full reboot + USB re-enumeration + reconnect (~7s). Doing a run of
commands one cli() call at a time means one reboot PER command — the rapid
reboot cadence is disruptive and can even knock the board into DFU/bootloader
mode. This collapses N commands into ONE session = ONE reboot. Prefer it for
any ad-hoc multi-command work (several get reads, or several set writes).
(The dedicated write tools — apply_aircraft_setup, set_flight_mode, etc. —
already batch internally; this is the escape hatch for everything else.)
Behaviour:
All read-only batch (get/diff/dump/status/tasks/version): the session exits WITHOUT saving — no EEPROM write, nothing persists. Still one reboot (unavoidable on iNAV), but reads are free of a save.
Any write (set/aux/feature/…): requires confirm_for_writes=True; a backup is taken first and the whole batch is SAVED once at the end (persist + reboot). If ANY command is rejected by the FC, the batch exits WITHOUT saving so nothing partial persists (all-or-nothing).
Live
motorcommands and session-control verbs (save/exit/batch) are rejected up front — motor tests must never be saved (use cli(..., props_removed=True) / test_motor()), and the batch manages save/exit itself.
Args: commands: Ordered list of CLI commands to run in one session. confirm_for_writes: Set True to run and persist a batch containing writes.
Returns per-command output, whether it saved, the backup path (if it wrote), and the measured reboot/reconnect seconds for the single reboot.
| Name | Required | Description | Default |
|---|---|---|---|
| commands | Yes | ||
| confirm_for_writes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses critical behaviors: the cost of each CLI session (reboot + USB re-enumeration), the session exit semantics (no save for reads, save once for writes), the all-or-nothing policy on FC rejection, and rejection of motor commands. It also mentions the backup and return values, giving the agent a complete mental model of side effects and safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first line, then uses clear section headers (Args, Behaviour) and bullet lists to organize dense information. Every sentence earns its place, explaining the why (reboot cost), the how (batch behavior), and the safety mechanisms without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (batching, side effects, safety semantics) and lack of output schema, the description is remarkably complete. It covers the reboot implications, read vs write behavior, all-or-nothing persistence, motor command restrictions, and explicitly states what the return value contains, so the agent has all necessary context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only lists types and defaults, but the description adds meaningful semantics: 'commands' is an 'Ordered list of CLI commands' and 'confirm_for_writes' must be set to run a batch containing writes. It explains why the confirmation is needed (write safety) and that a backup is taken, going far beyond the minimal schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Run MANY CLI commands in ONE CLI session — a single reboot for the whole batch,' which is a specific verb+resource statement that clearly distinguishes this tool from the single-command 'cli' sibling. It also contrasts with dedicated write tools by positioning itself as the escape hatch for ad-hoc multi-command work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Prefer it for any ad-hoc multi-command work' and notes that dedicated write tools already batch internally, so this tool is only for other cases. It also tells users to use cli(..., props_removed=True) for motor tests, offering an alternative. This is clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_gpsA
Enable the GPS feature and set the receiver provider / SBAS (atomic CLI write).
Args: provider: GPS provider token — e.g. UBLOX | NMEA | MSP (the FC validates it). sbas: Optional SBAS mode — AUTO | EGNOS | WAAS | MSAS | GAGAN | NONE. confirm: True to apply (save+reboot). Dry-run otherwise.
Gates: connected, not armed, auto-backup. After applying, give the GPS time to acquire satellites and check read_gps().
| Name | Required | Description | Default |
|---|---|---|---|
| sbas | No | ||
| confirm | No | ||
| provider | No | UBLOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses that the operation is an 'atomic CLI write', that confirm='True to apply (save+reboot)', and 'Dry-run otherwise.' It also mentions 'auto-backup' and that the FC validates the provider. This gives significant behavioral detail beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using a single purpose line, a compact arg list, and a gates line. Every sentence contributes information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, parameters, usage constraints (gates), and post-application guidance. Given there is no output schema, it appropriately focuses on the action's behavior and follow-up. It's complete for a configuration tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the parameters. It does so for each: provider with examples, sbas with options and optionality, and confirm with behavior. This exceeds what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Enable the GPS feature and set the receiver provider / SBAS (atomic CLI write).' This is a specific verb+resource combination that clearly distinguishes this tool from sibling tools like read_gps and other configuration tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists explicit gates: 'connected, not armed, auto-backup.' This tells the agent when the tool can be used and prerequisites. It also advises 'After applying, give the GPS time to acquire satellites and check read_gps().' This provides clear post-conditions and a follow-up action, though it doesn't name alternative configuration tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connectA
Open the serial connection to the FC and return board identity.
Args: port: Serial port, e.g. 'COM3' (Windows) or '/dev/ttyACM0' (Linux). baud: Baud rate (default 115200 — matches iNAV's USB VCP default).
Returns board variant, firmware version, target name, API version, build info, and a summary of detected sensors.
| Name | Required | Description | Default |
|---|---|---|---|
| baud | No | ||
| port | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the return fields (board variant, firmware version, etc.), but it fails to mention the side effect of leaving the connection open or the need to call 'disconnect' afterward. This is a significant behavioral trait that is not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise opening sentence, a clear 'Args' section, and a 'Returns' list. It is appropriately sized for the information conveyed, with no superfluous words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple connection tool with only two parameters and no output schema, the description covers the purpose, parameters, and return values thoroughly. It falls short only in not explaining when to use it in the broader workflow (e.g., before other commands) or the need to disconnect, but overall it is largely complete for a basic connect operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description thoroughly explains both parameters. It provides concrete examples for 'port' (e.g., 'COM3', '/dev/ttyACM0') and explains the default 'baud' (115200) by referencing iNAV's default. This adds significant meaning beyond the raw schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Open the serial connection to the FC and return board identity', using a specific verb ('open') and resource ('serial connection to the FC'). It distinguishes itself from sibling tools like 'board_info' by emphasizing the connection establishment, and from 'disconnect' by being the inverse operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to establish a serial connection, but it does not explicitly state when to use it versus alternatives like 'find_fc' or 'list_serial_ports'. There is no mention of prerequisites (e.g., knowing the port) or exclusions, so usage context is only implied rather than clearly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_aircraftA
Define the aircraft hardware profile and generate a configuration plan.
This is an OFFLINE planner — no FC connection required. Call it first to review the generated CLI commands, then call apply_aircraft_setup() to apply.
Args: name: A descriptive name for this aircraft (e.g., "My FPV Wing"). wing_type: One of: flying_wing, conventional, vtail, twin_tail, delta. esc_protocol: One of: DSHOT600, DSHOT300, DSHOT150, MULTISHOT, ONESHOT125, PWM. cells: LiPo battery cell count (e.g. 4 for 4S). fc_target: Optional FC board name (e.g. MATEKF405). Used for target hints. motor_kv: Optional motor KV rating (informational only). motor_poles: Motor pole count for RPM telemetry (default 14; verify with your motor). servo_count: Optional total servo count (informational). notes: Free text notes to store with the profile.
Returns a plan dict with: - profile: the stored profile - commands: the CLI commands to apply - summary: human-readable description - warnings: things to verify before/after applying
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| cells | Yes | ||
| notes | No | ||
| motor_kv | No | ||
| fc_target | No | ||
| wing_type | Yes | ||
| motor_poles | No | ||
| servo_count | No | ||
| esc_protocol | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description fully discloses behavior: it is an offline planner with no side effects on the FC, generates commands, and returns a plan dict containing profile, commands, summary, and warnings. This gives the agent a clear model of what happens when invoked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with an Args section and Returns section. The first sentences establish the core purpose and usage context, and the parameter list is formatted for quick scanning. Every sentence earns its place given the 9 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 9 parameters, no annotations, and no output schema. The description compensates by documenting all parameters, return values, and workflow integration with apply_aircraft_setup(). It is fully self-contained and leaves no critical gaps for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full parameter meaning. It explains every parameter with types, allowed values (e.g., wing_type options, esc_protocol list), defaults, and purpose (e.g., motor_poles default 14 with a verification note). This goes far beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Defines the aircraft hardware profile and generates a configuration plan,' which is a specific verb+resource combination. It differentiates itself from sibling tools by emphasizing it is an OFFLINE planner and instructing to call apply_aircraft_setup() next.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use: 'Call it first to review the generated CLI commands, then call apply_aircraft_setup() to apply.' It also states 'no FC connection required,' providing clear context for when it is appropriate and which alternative to use subsequently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnoseA
Full diagnostic sweep — the flagship troubleshooter.
Collects: arming flags, sensor health, RC channels, battery, GPS, attitude, and mode assignments. Runs all diagnostic rules and returns a prioritized problem list with concrete fixes for each issue found.
Use this when 'something is wrong but I'm not sure what.'
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool collects data, runs all diagnostic rules, and returns a prioritized problem list with fixes. It does not explicitly state whether the tool is read-only, but the diagnostic framing and the absence of mutation language are reasonably transparent. It adds useful detail beyond a simple 'diagnose' label.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the flagship role, and uses a concise bullet-like list to convey the collected items. Every sentence adds information: scope, inputs collected, processing, output, and usage trigger. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic tool with no output schema, the description is complete. It explains the tool's purpose, the data it uses, the kind of results it produces, and when to invoke it. Nothing essential is missing for an agent to select and use it appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema has no properties, so the baseline is 4. The description adds value by explaining what data is gathered during the diagnostic sweep, which indirectly clarifies why no parameters are needed. There is no schema coverage issue.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb phrase ('Full diagnostic sweep') and identifies the resource/responsibility as the 'flagship troubleshooter.' It enumerates the exact domains covered (arming flags, sensor health, RC channels, battery, GPS, attitude, mode assignments) and the output (prioritized problem list with concrete fixes), which distinguishes it from sibling tools like why_wont_it_arm or get_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit usage trigger: 'Use this when something is wrong but I'm not sure what.' This gives clear contextual guidance. It does not explicitly exclude or reference alternatives, but the use case is distinct enough, and the guidance is practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnectA
Close the serial connection to the FC.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the action and target, but does not disclose side effects, idempotency, or behavior when the connection is already closed. This is acceptable for a very simple tool but lacks deeper context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence that is front-loaded and free of any filler. Every word contributes to communicating the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 0-parameter, no-output-schema tool, this description is nearly complete. It clearly names the action and target, though it could benefit from a note about what happens if no connection is active or whether this aborts other operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description need not add parameter-level detail. Baseline for 0 parameters is 4, and the empty schema and 100% vacuous coverage mean no information is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses specific verb 'Close' and resource 'serial connection to the FC', clearly identifying the action and target. This distinguishes it from sibling tools like 'connect' and 'find_fc' by describing exactly what is disconnected.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as 'connect' or 'save_and_reboot'. The description states what it does but does not mention when it is appropriate to disconnect or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_fcA
Auto-detect which serial port has a flight controller, so you don't guess.
Briefly opens each likely USB-serial port and asks for MSP identity; returns the ports that answered as an FC (variant + firmware). Then call connect(port).
Args: baud: Baud to probe at (default 115200, iNAV's USB VCP default). probe_all: If True, probe EVERY serial port; otherwise only USB-serial-looking ones (safer — avoids poking unrelated devices like Bluetooth/modems).
| Name | Required | Description | Default |
|---|---|---|---|
| baud | No | ||
| probe_all | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses the mechanism ('Briefly opens each likely USB-serial port and asks for MSP identity'), the return value ('returns the ports that answered as an FC (variant + firmware)'), and a safety consideration ('avoids poking unrelated devices like Bluetooth/modems'). It does not mention potential edge cases like timeouts or no-FC-found behavior, but the core behavior is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded. It opens with a one-sentence summary, then a concise behavioral paragraph, followed by a well-formatted Args block. Every sentence contributes value with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a simple 2-parameter tool with no annotations and no output schema, the description is remarkably complete. It covers what the tool does, how it works, what it returns, parameter semantics, safety implications, and the next step in the workflow ('Then call connect(port)'). No significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description fully compensates. It explains 'baud' with meaning and default context ('Baud to probe at (default 115200, iNAV's USB VCP default)') and 'probe_all' with clear behavioral implications ('If True, probe EVERY serial port; otherwise only USB-serial-looking ones — safer'). This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb and resource: 'Auto-detect which serial port has a flight controller'. It also distinguishes itself from sibling tools like list_serial_ports by focusing on detection rather than mere listing, and it provides a concrete workflow by saying 'Then call connect(port)'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context on when to use the tool ('so you don't guess') and a follow-up action ('Then call connect(port)'). It also explains a conditional usage for the probe_all parameter ('If True, probe EVERY serial port; otherwise only USB-serial-looking ones — safer'), but it does not explicitly name alternative tools or situations where they should be used instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aircraft_profileA
Return the currently declared aircraft profile.
Call define_aircraft() first to set a profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the profile must have been previously declared, implying state-dependent behavior. However, it does not mention what happens if no profile is set (e.g., error or empty response), leaving a gap in behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two short, front-loaded sentences with no waste. It directly states the purpose and the required prior call, earning a perfect score for conciseness and structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (no params, no output schema), and the description gives the essential purpose and prerequisite. However, it omits likely edge-case behavior (e.g., no profile declared), which would improve completeness for an agent invoking this tool without prior context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema covers everything. The description adds no parameter-specific meaning, but with no params to explain, the baseline of 4 is appropriate. The prerequisite note adds context about the tool's overall usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the currently declared aircraft profile. The verb 'return' and resource 'aircraft profile' are specific, and the prerequisite note helps distinguish it from sibling tools like define_aircraft and apply_aircraft_setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to call define_aircraft() first, which is the key usage prerequisite. This provides clear context on when to use this tool, though it does not explicitly mention alternatives or when not to use it, which is less critical given the low complexity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Read FC status via both MSP and CLI.
Returns MSP_STATUS data (cycle time, sensor bits, CPU load, arming flags) plus the human-readable output of the CLI 'status' and 'tasks' commands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states it reads via both MSP and CLI and details the return data (MSP_STATUS fields, CLI status and tasks output). This goes beyond a simple 'gets status' and gives the agent a clear picture of what to expect, though it doesn't mention connection requirements or side effects (which are presumably none).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the core purpose in the first sentence, followed by a clear breakdown of return values. No redundant words; every sentence adds informative detail. Perfectly concise for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has zero params, no output schema, and no annotations, the description is well-rounded: it explains what the tool does and what it returns. It could optionally mention if a connection is required or how to interpret the output, but for a straightforward status read, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty schema, so the description does not need to explain parameter meanings. Per rubric, 0 params earns a baseline of 4. The description adds no parameter-specific info but also doesn't need to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read FC status via both MSP and CLI' with a specific verb and resource. It distinguishes this tool from siblings like get_aircraft_profile or board_info by specifying it returns MSP_STATUS data plus CLI status/tasks output, making its unique purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need flight controller status, but it does not provide explicit when-to-use, when-not-to-use, or alternative tool guidance. It lacks exclusions or comparisons with sibling tools like why_wont_it_arm or diagnose, so the agent gets no help in choosing between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_backupsA
List saved config backups under ./backups/, newest first. No FC needed.
Returns each backup's path, modified time, size, line count, and label — so you can pick one to replay with restore_config(path).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the output fields (path, modified time, size, line count, label), the ordering ('newest first'), and the fact that no FC connection is needed. It does not mention potential error cases or side effects, but for a simple list operation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and contains no wasted words. The first sentence states the action, and the second sentence explains the return values and usage context, making it efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is reasonably complete. It explains what the tool does, what it returns, and how the output connects to restore_config. However, it does not mention edge cases like an empty backup directory or error handling, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific information because none exist, but it does explain the return values which helps the agent interpret the tool's output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List saved config backups'), the resource ('config backups'), the location ('under ./backups/'), and ordering ('newest first'). It clearly distinguishes this from sibling tools like backup_config and restore_config by focusing on listing rather than creating or restoring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'No FC needed' tells the agent this can be used without a connection, and 'so you can pick one to replay with restore_config(path)' implies its role as a precursor to restore. However, it does not explicitly name alternatives or state when not to use it, so it falls slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_flight_modesA
List all available flight modes and their current switch assignments.
Returns:
all_modes: every mode the FC knows about (id + name + assigned flag)
assigned_modes: which modes are on which aux channel and range
unassigned_modes: mode names with no switch assignment yet
arm_assigned: bool — critical to know before first flight
Tip: call read_rc_channels() to identify which channel your switches use, then use assign_switch() to map modes to them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return payload structure, including the critical arm_assigned flag, and the verb 'List' implicitly suggests a read-only operation. However, it does not explicitly address behavior on connection failure or clearly state that no changes are made, leaving some transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence purpose, followed by a compact structured list of return fields and a final practical tip. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description adequately explains the return values and includes a critical flag (arm_assigned). The workflow tip adds valuable context. It stops short of a 5 by not mentioning what happens if the FC is not connected or if read_rc_channels() fails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema covers 100% of them (none). The description therefore has no need to explain parameter semantics, and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List all available flight modes') and clearly scopes the resource to 'current switch assignments.' It distinguishes itself from sibling tools like assign_switch and set_flight_mode by focusing on listing rather than modifying modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tip explicitly recommends calling read_rc_channels() first and assign_switch() after, giving clear usage context and alternatives. It does not explicitly state when not to use this tool, but the practical workflow and 'critical to know before first flight' note provide strong contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serial_portsA
List all available serial ports.
Use this to find the COM port (Windows) or /dev/tty* (Linux/macOS) for the FC. Plug in the FC, run this, and look for a new entry (often labelled 'STM32' or 'CP210x' for iNAV boards).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It clearly states this is a read-only listing operation ('List all available serial ports') and offers helpful naming conventions ('STM32', 'CP210x') without promising any side effects. This is sufficient for a simple enumeration tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded. The purpose is stated in the first sentence, followed by practical usage instructions. Every sentence contributes value, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters) and the presence of an output schema, the description is complete. It tells the agent when to call it and what to expect, making it fully self-contained for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to explain. The baseline for a no-parameter tool is 4, and the description adds useful context about how to interpret the output, which is effective.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List all available serial ports', a specific verb+resource combination. It further explains the practical use (finding the FC's COM port or /dev/tty* device), which clearly distinguishes it from sibling tools like find_fc or connect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: plug in the FC, run this, and look for a new entry. It implies this is the first step for locating the FC's port. It doesn't explicitly mention alternatives, but the context is enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_gpsA
Live GPS status: fix type, satellites, position, speed, HDOP + nav-readiness.
Read-only (MSP_RAW_GPS, no reboot). Use this before relying on RTH or any position-holding navigation mode.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure. It explicitly states 'Read-only (MSP_RAW_GPS, no reboot)', revealing the safe, non-destructive nature and lack of reboot side effects. This goes beyond what structured fields provide and is essential for agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first line summarizes the tool's output, the second line adds safety context, and the third gives usage guidance. Every sentence earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema or annotations, the description is complete for a simple read tool. It specifies the data returned (fix type, satellites, position, speed, HDOP, nav-readiness), the read-only nature, and the appropriate usage context. Given the complexity is low, this fully covers the agent's needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline score is 4. The description correctly omits parameter details, as there are none to document. No further meaning is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as reading live GPS status, enumerating specific data fields (fix type, satellites, position, speed, HDOP, nav-readiness). The verb 'read' is implied and the resource is unambiguous, distinguishing it from sibling tools focused on other functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use this before relying on RTH or any position-holding navigation mode.' It provides clear context but does not explicitly name alternatives or exclusions, which would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_rc_channelsA
Read live RC channel values via MSP.
Returns up to 16 channel values in microseconds (988–2012 µs typical).
Core UX: flip a switch and watch which channel value changes — that's the aux channel to use when assigning flight modes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the output format (up to 16 channel values in microseconds), the typical range, and the meaning of the values for switch mapping. It doesn't state prerequisites or error behavior, but for a simple read operation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, front-loaded with the core function, then output details, then a usage scenario. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the description covers purpose, output format, range, and a practical workflow scenario. It lacks explicit connection requirements, but overall it is highly usable and complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description does not need to explain them. It still adds context about the output format and practical use, which is helpful beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read live RC channel values via MSP' with a specific verb, resource, and method. It distinguishes from sibling tools like read_sensors by focusing on RC channel values and directly linking to flight mode assignment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a practical use case via 'Core UX: flip a switch and watch which channel value changes — that's the aux channel to use when assigning flight modes.' This implies when to use the tool but does not explicitly discuss alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sensorsA
Read live sensor values: attitude, per-sensor health, and analog (battery).
Good for a quick sanity pass before flying:
Attitude should read ~0°/0° when the aircraft is level.
All required sensors (gyro, acc) should report OK.
Battery voltage should match your pack's cell count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses what values to expect (attitude ~0°, sensors OK, battery voltage) and implies a read-only, non-mutating operation. It lacks explicit statements about connection prerequisites or error behavior, but for a simple read tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary followed by a short bulleted list of checks. Every sentence adds value, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless read tool, the description is complete. It explains what is read, how to interpret the values, and what the expected behavior is. The output schema is absent, but the description compensates by providing interpretive guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific semantics because there are none to describe. This is acceptable given the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: "Read live sensor values: attitude, per-sensor health, and analog (battery)." It enumerates specific sensor categories, making the purpose unambiguous and distinct from sibling tools like read_rc_channels or get_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context with "Good for a quick sanity pass before flying," indicating when to use it. It does not explicitly mention when not to use it or name alternatives, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_tuningA
Read fixed-wing PID gains, rates, and key filter cutoffs (via CLI).
Returns PIDs grouped by axis, plus rate and low-pass-filter settings.
NOTE: reads over CLI; exiting CLI reboots the FC, so this reboots and reconnects (~7s).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It importantly warns that exiting CLI reboots the FC, so this tool reboots and reconnects (~7s), which is a critical side effect. It also discloses the return content, though it doesn't explicitly state that no configuration is changed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the first states the purpose, the second the return structure, and the third the critical side effect. It is front-loaded, succinct, and every sentence adds essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description sufficiently covers what it does, what it returns, and a key operational side effect. It could perhaps specify units or detailed format, but the overall context is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema provides no meaningful constraints. The description adds value by enumerating exactly what data is read (PIDs, rates, filter cutoffs), which effectively explains the tool's behavior in lieu of parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads fixed-wing PID gains, rates, and filter cutoffs, which distinguishes it from sibling tools like set_pid (write) and read_rc_channels. It also specifies the return format (PIDs grouped by axis, rate and low-pass-filter settings), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies usage for reading tuning parameters on fixed-wing aircraft, and notes the CLI-based access. It doesn't explicitly contrast with alternatives like cli_batch or set_pid, but the context is sufficient for an agent to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_configA
Restore FC config by replaying a backup file's CLI commands, then save+reboot.
On iNAV this is atomic: a pre-restore backup is taken, the file's commands are replayed in one CLI session, then SAVED to EEPROM and the FC reboots (we reconnect). If any line errors, all changes are rolled back.
Args: path: Path to a backup file (as returned by backup_config). confirm: Must be True to apply. Dry-run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It fully explains the atomic workflow: pre-restore backup, replaying commands in one CLI session, saving to EEPROM, rebooting, and reconnecting. It also explicitly warns that any line error triggers a rollback. This is exceptionally transparent about side effects and safety behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and well-structured. The first sentence states the core purpose, followed by a concise paragraph detailing the atomic behavior, and a clear Args section. No redundant or filler sentences exist; every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's behavior, parameters, and safety mechanisms, which is sufficient for a complex restore operation. However, it does not mention what the tool returns or how success/failure is reported beyond rollback on error. Since there is no output schema, a brief note on the return value would have made it fully complete. Still, the core usage is fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only names and types, with 0% description coverage. The description adds critical meaning: path is defined as 'Path to a backup file (as returned by backup_config)' and confirm is explained as 'Must be True to apply. Dry-run by default.' This fully compensates for the schema's bare bones, making the tool safely invocable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Restore FC config by replaying a backup file's CLI commands, then save+reboot.' This names the specific verb (restore), the resource (FC config), and the mechanism (replaying CLI commands). It also distinguishes itself from sibling tools like backup_config (which creates backups) and save_and_reboot (which only saves and reboots without restoring).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: restoring a backup file. It also explains the dry-run default and that confirm must be True to apply. However, it does not explicitly name alternative tools or when not to use this tool, such as noting that save_and_reboot is only for saving settings without restoring, or that cli/cli_batch are for manual command execution. This omission keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_and_rebootA
Save the running config to EEPROM and reboot the FC.
Takes a backup, then 'save' (persist + reboot), then auto-reconnects (~7s).
NOTE: the dedicated write tools already save automatically on iNAV, so you rarely need this — it's for persisting changes made via the raw cli() reads or to force a clean reboot.
Args: confirm: Must be True to proceed. Dry-run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even without annotations, the description discloses important behaviors: it takes a backup, performs a save+reboot, auto-reconnects after ~7 seconds, and defaults to a dry-run unless confirm=True. This fully covers the tool's side effects and safety mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loaded with the core action, and includes a clear note and parameter explanation. Every sentence provides useful information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite being a simple one-parameter tool, the description thoroughly covers purpose, usage context, behavioral consequences, and parameter details. It is fully self-contained for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'confirm' with a default of false, but the description explains that 'confirm: Must be True to proceed. Dry-run by default.' This adds crucial meaning beyond the bare schema, clarifying exactly how the parameter controls execution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Save the running config to EEPROM and reboot the FC.' It also distinguishes itself from dedicated write tools by noting they already save automatically, and this tool is specifically for raw cli() changes or forcing a clean reboot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'the dedicated write tools already save automatically on iNAV, so you rarely need this — it's for persisting changes made via raw cli() reads or to force a clean reboot.' This clearly tells when to use versus avoid the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_failsafeA
Set the core failsafe behaviour (atomic CLI write: backup → apply → save+reboot).
Only the arguments you pass are changed; dry-run by default. For other failsafe_* knobs (distances, angles) use cli('set failsafe_... = N', confirm_for_writes=True).
Args: procedure: RC-loss action — one of DROP | LAND | SET-THR | RTH | NONE. The exact accepted tokens depend on firmware; an invalid value is rejected by the FC and the whole write is rolled back. throttle_us: failsafe_throttle in µs (used by SET-THR / LAND). Clamped 1000–2000. delay_s: Guard time after RC loss before failsafe triggers (failsafe_delay). iNAV stores this in 0.1 s units, so this is converted ×10. off_delay_s: Time the failsafe stage runs before the motor is killed (failsafe_off_delay), also 0.1 s units (×10). confirm: True to apply (saves + reboots). Dry-run otherwise.
Gates: connected, not armed, auto-backup. RTH without GPS will not work — use DROP/LAND.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| delay_s | No | ||
| procedure | No | ||
| off_delay_s | No | ||
| throttle_us | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the transparency burden. It discloses atomic write behavior (backup → apply → save+reboot), dry-run default, partial-argument changes, rollback on invalid values, and unit conversion (×10 for iNAV). This is exemplary behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a front-loaded summary, an Args list, and a Gates section. Every sentence adds essential information; there is no redundancy or filler. The length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 5 parameters, no output schema, and no annotations, the description is remarkably complete. It covers purpose, all parameter semantics, gates, failure behavior, conversion details, and alternatives to sibling tools. The agent has everything needed to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates completely. Each parameter is explained with meaning, constraints, and units: procedure (firmware-dependent tokens, rollback), throttle_us (clamped 1000–2000), delay_s (guard time, ×10 conversion), off_delay_s (stage time, ×10), confirm (apply vs dry-run).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: "Set the core failsafe behaviour," and immediately clarifies the atomic CLI write mechanism. It distinguishes itself from sibling failsafe knobs by pointing to cli('set failsafe_...') for distances/angles, and from check_failsafe which is for checking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: "dry-run by default" and when to use confirm=True. It states alternatives for other failsafe knobs (use cli), conditions under which RTH fails ('RTH without GPS will not work — use DROP/LAND'), and preconditions ('Gates: connected, not armed, auto-backup').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_flight_modeA
Assign a flight mode to an aux channel range (read-modify-write via CLI 'aux').
Finds an existing slot for this mode+channel (to modify) or the first free slot (to create), then writes the assignment. Dry-run by default.
Gates: connected, not armed, auto-backup before write. Requires confirm=True to apply.
Args: mode_name: Exact mode name as shown by list_flight_modes (e.g. "ANGLE", "NAV RTH"). aux_channel: 1-based AUX number (1 = AUX1 = RC channel 5), matching list_flight_modes. range_low: Range start in µs (900–2100). range_high: Range end in µs (must be > range_low, ≤ 2100). confirm: True to apply. Default False = dry-run (returns the command only).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| mode_name | Yes | ||
| range_low | Yes | ||
| range_high | Yes | ||
| aux_channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It is outstanding: it states the operation is read-modify-write, creates or modifies an existing slot, is dry-run by default, requires confirm=True, and mentions gates (connected, not armed, auto-backup). It even notes dry-run returns the command only. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise opening sentence, followed by key behavioral details, and a clear argument list. Every sentence adds value—no fluff. It is appropriately sized for the tool's complexity and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, no annotations, no output schema) and the presence of sibling tools, this description is remarkably complete. It covers behavior, parameter semantics, prerequisites, side effects (backup), and return behavior. It provides all the information an agent needs to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It does: mode_name is defined as exactly matching list_flight_modes, aux_channel is defined as 1-based with RC channel mapping, range_low and range_high have units and constraints, and confirm has a clear purpose and default. This is comprehensive and adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Assign a flight mode to an aux channel range'. It uses a specific verb (assign) and resource (flight mode to aux channel), and distinguishes itself by mentioning the read-modify-write via CLI 'aux' and the dry-run default, setting it apart from sibling tools like clear_flight_mode or assign_switch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to assign or modify a flight mode on an aux channel) and provides critical usage prerequisites: use list_flight_modes for exact mode names, and confirm=True is required to apply. It also notes the dry-run behavior. However, it does not explicitly mention alternatives or when not to use it, which would have made it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pidA
Set fixed-wing PID gains for ONE axis (atomic CLI write).
Changes only the terms you pass. Dry-run by default.
Args: axis: roll | pitch | yaw. p, i, d, ff: Gains for fw_p_ / fw_i_ / fw_d_ / fw_ff_. confirm: True to apply (save+reboot). Dry-run otherwise.
⚠ PID changes alter flight behaviour — change gradually and test carefully. Gates: connected, not armed, auto-backup.
| Name | Required | Description | Default |
|---|---|---|---|
| d | No | ||
| i | No | ||
| p | No | ||
| ff | No | ||
| axis | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does an excellent job: it discloses dry-run default, the confirm flag causing save+reboot, the safety warning, and the preconditions (gates). It also clarifies that only passed parameters are changed. This is far beyond the minimum and gives the agent confidence in invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. The args section is compact, the warning is a single line, and no sentence is wasted. It fits the maximum guidance for a tool with this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema or annotations, the description covers the essential operational context: purpose, parameter semantics, dry-run behavior, confirmation effect, safety implications, and prerequisites. For a 6-parameter CLI write tool, this is complete enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It does so thoroughly: axis values are enumerated, p/i/d/ff map to fw_p_<axis> etc., and confirm's meaning is explicit. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear, specific action: 'Set fixed-wing PID gains for ONE axis (atomic CLI write).' This includes the verb, resource, and scope, and distinguishes it from sibling tools like read_tuning or set_nav. It also clarifies the atomic nature of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use the tool (changing PID gains per axis) and notes the dry-run default and gates. It does not explicitly name alternatives such as read_tuning for viewing gains or cli_batch for bulk operations, but the 'ONE axis' framing and atomic write hint at its niche. The gates (connected, not armed, auto-backup) are practical usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_mode_layoutA
Recommend a fixed-wing flight-mode/switch layout. Pure knowledge — no FC needed.
Suggests which switches to use for ARM, flight modes (ANGLE/HORIZON/MANUAL), and (with GPS) NAV RTH / NAV LAUNCH, with the exact aux channels and µs ranges.
Args: skill_level: beginner | intermediate | advanced (tailors the advice). num_switches: How many spare switches you have available. has_gps: True if a GPS module is installed (enables RTH suggestion).
Returns a layout plan you can hand to assign_switch() to apply.
| Name | Required | Description | Default |
|---|---|---|---|
| has_gps | No | ||
| skill_level | No | beginner | |
| num_switches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Pure knowledge — no FC needed,' disclosing that it has no side effects on hardware. It also clarifies that it returns a plan rather than applying changes, which is important behavioral context. It could mention any limitations or error conditions, but for a knowledge-only tool, this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and appropriately sized. It leads with a one-sentence summary, expands with relevant details, and breaks out arguments in a clear list. No wasted words, and each sentence contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple knowledge/recommendation utility with 3 optional parameters and no output schema. The description covers its purpose, parameter semantics, and return value (a layout plan to be used with assign_switch()). This is entirely adequate for the tool's complexity and context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% parameter description coverage, but the description's 'Args:' section effectively explains all three parameters: skill_level (with allowed values), num_switches (what it counts), and has_gps (how it affects RTH suggestion). This fully compensates for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Recommend a fixed-wing flight-mode/switch layout.' It uses a specific verb (recommend), resource (flight-mode/switch layout), and scope (fixed-wing). It distinguishes itself from the sibling assign_switch by noting the output can be handed to assign_switch() to apply, showing a clear complementary relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys when to use the tool via 'Pure knowledge — no FC needed,' indicating it's for planning without hardware interaction. It also ties to assign_switch() as the next step. However, it does not explicitly state when NOT to use it or compare with other alternatives, so slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_motorA
Spin ONE motor briefly for a bench test (direction / wiring / response).
⚠ DANGER: this drives a LIVE motor output. REMOVE ALL PROPELLERS FIRST.
Safety gates (enforced in code):
props_removed=True is REQUIRED (refuses otherwise),
refuses if the FC reports armed,
confirm=True is REQUIRED (dry-run preview otherwise),
throttle clamped to 1000–2000 µs, duration clamped to 0.2–5.0 s,
the motor is ALWAYS commanded back to stop (1000 µs) when the test ends.
The override is live (MSP, not saved); it also stops if the FC reboots or loses power.
Args: motor: 1-based motor number (1 = motor 1). Only this motor spins; all others are held at 1000 µs (stop). throttle_us: Output in µs (1000 = stop, ~1100 = gentle, 2000 = full). Keep it LOW for a direction check. duration_s: How long to hold the output (0.2–5.0 s). props_removed: MUST be True — confirms props are physically removed. confirm: MUST be True to actually run.
| Name | Required | Description | Default |
|---|---|---|---|
| motor | Yes | ||
| confirm | No | ||
| duration_s | No | ||
| throttle_us | No | ||
| props_removed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility—and it delivers. It discloses that the tool drives a live motor output, enforces safety gates (props_removed, confirm, armed check, clamps), and explains side effects (stops on reboot/power loss, always returns to stop). This is exemplary transparency beyond what a schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for danger, safety gates, behavioral notes, and args. Every sentence adds essential information—no fluff. The front-loaded warning is appropriate given the danger level.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and 5 parameters, this description covers all necessary context: purpose, safety, parameter semantics, behavior, and failure modes. It leaves no critical gap for an agent to safely invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so thoroughly: motor is 1-based with others held at stop, throttle_us has units and recommended starting value, duration_s has range, and props_removed/confirm have explicit MUST semantics. This adds meaning far beyond the bare JSON schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Spin ONE motor briefly for a bench test (direction / wiring / response).' It clearly distinguishes this tool's narrow scope from sibling tools like calibrate_accelerometer or set_failsafe, leaving no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the use case (bench test for direction/wiring) and instructs to keep throttle low for direction checks. It does not explicitly contrast with alternatives (e.g., when not to use), but the context is clear enough that an agent would know when to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
why_wont_it_armA
Decode the FC's arming-prevention flags into plain English.
This is the #1 question from new iNAV users. Each set bit is mapped to:
A flag name
A plain-language reason
A concrete fix
Also checks whether ARM mode is assigned to a switch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of transparency. It clearly explains what the tool does (decodes flags, checks ARM mode) and the output structure (name, reason, fix), but does not explicitly state that the operation is read-only or whether a connection is required. For a diagnostic tool, this is a minor gap but not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main purpose in the first sentence. The sentence about it being the #1 question adds context but is somewhat optional; still, the overall length is appropriate and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description adequately covers what the tool does and what the user can expect (flag name, reason, fix, ARM mode check). It lacks mention of prerequisites like a live connection, but given the simplicity, the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. According to the rubric, a baseline of 4 is applied for 0 params. The description adds no parameter details because there are none to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Decode' with a clear resource 'FC's arming-prevention flags' and explains the output in plain English. It distinguishes itself from sibling tools by focusing on arming issues, stating each set bit is mapped to a name, reason, and fix, plus checking ARM mode switch assignment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a clear use case ('the #1 question from new iNAV users' when a craft won't arm) but does not explicitly contrast with alternative tools like 'diagnose' or 'get_status'. It lacks explicit when-not-to-use guidance or mention of prerequisites such as an active FC connection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
35 tool updates
v0.3.5- First observed
apply_aircraft_setup - First observed
assign_switch - First observed
backup_config - First observed
board_info - First observed
calibrate_accelerometer - First observed
calibrate_magnetometer - First observed
check_config - First observed
check_failsafe - First observed
clear_flight_mode - First observed
cli - First observed
cli_batch - First observed
configure_gps - First observed
connect - First observed
define_aircraft - First observed
diagnose - First observed
disconnect - First observed
find_fc - First observed
get_aircraft_profile - First observed
get_status - First observed
list_backups - First observed
list_flight_modes - First observed
list_serial_ports - First observed
read_gps - First observed
read_rc_channels - First observed
read_sensors - First observed
read_tuning - First observed
restore_config - First observed
save_and_reboot - First observed
set_failsafe - First observed
set_flight_mode - First observed
set_nav - First observed
set_pid - First observed
suggest_mode_layout - First observed
test_motor - First observed
why_wont_it_arm
TDQS
Scored across 35 tools
Most tools have clear, distinct purposes with thorough descriptions. A few pairs (connect/board_info, backup_config/save_and_reboot) overlap slightly, but the descriptions clarify the differences, so confusion is unlikely.
The majority follow a verb_noun pattern (e.g., list_serial_ports, set_flight_mode), but there are notable exceptions: why_wont_it_arm is a sentence, connect/disconnect/diagnose are bare verbs, and cli/cli_batch are nouns. This inconsistency makes the set feel less predictable.
35 tools is well above the typical heavy range. While the domain is complex, many tools could be consolidated (e.g., read_sensors/read_gps/read_rc_channels or multiple set_* tools), making the surface feel bloated.
The tool set covers the full workflow: connection discovery, config backup/restore, aircraft setup, mode assignment, calibration, diagnostics, failsafe, GPS, navigation, and tuning. No significant gaps are apparent for the intended fixed-wing use case.
Maintenance
Related MCP Connectors
- alloyOAuthai.usealloy
Connect Claude, Cursor, Codex, and other AI tools to your robotics mission data.
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Deploy, monitor, and manage your OpenClaw AI assistants via natural language.
Deploy sims to any screen. Control your displays with Claude.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables natural language interaction with Betaflight FPV drone flight controllers for configuration, PID tuning, sensor monitoring, VTX control, and blackbox management through Claude AI.4-
- AlicenseNot gradedqualityDmaintenanceEnables AI tools like Claude Code and Codex CLI to read and write serial port data, facilitating embedded development workflows such as coding, flashing, and debugging.20 npmMIT
- AlicenseNot gradedqualityFmaintenanceEnables natural language control of ArduPilot drones via MAVLink, supporting arm, takeoff, mode changes, and mission uploads.9GPL 3.0
- AlicenseNot gradedqualityFmaintenanceEnables natural language analysis of ArduPilot flight logs (.bin files) via AI chat apps like Claude Desktop, Cursor, and VS Code, providing explanations and answering questions about flight issues.4MIT