Skip to main content
Glama

mavlink-mcp

License: MIT Python 3.10+

mavlink-mcp is a vendor-neutral UAV capability layer + Model Context Protocol server built on open standards. It connects AI agents (Claude Desktop, Cursor, VS Code, and any other MCP client) to drones that speak MAVLink — PX4 SITL, ArduPilot SITL, and Pixhawk-class autopilots — through MAVSDK (BSD-3-Clause). Instead of wrapping protocol messages, it exposes 8 flight capabilities (telemetry, flight mode, arm/disarm, takeoff, land, goto, mission, return-to-launch) behind one clean API with safety guardrails on by default.

It is the sister project of rosbridge-mcp (AI agents ↔ ROS 2 robots) and shares its philosophy: open protocols only, readonly-by-default guardrails, simulation-first, zero telemetry, MIT licensed.

Note on the name: "mavlink-mcp" is a provisional working name. "MAVLink" is a trademark of the Dronecode Foundation; the project name may be adjusted pending a review of their trademark policy before any public release.

Safety disclaimer: this project is built for simulation and research. Flying real aircraft with it is entirely at your own risk and responsibility, including compliance with your local aviation law (registration, flight permits, pilot licensing). See SECURITY.md.

Why a capability layer, not another SDK?

  • For AI agents, capabilities beat 400 SDK functions. An agent asks get_capabilities ("what can this drone do?"), gets back a small vocabulary of physical actions, and plans with it — no MAVLink knowledge needed on the model side.

  • Vendor-neutral by construction. Capabilities are defined in physical quantities (degrees, meters, volts) from open specs — not copied from any proprietary SDK surface. The MAVSDK adapter is one implementation; a future ROS 2 adapter (reusing rosbridge-mcp) implements the same interface.

  • Guardrails are part of the API, not an afterthought. Readonly mode is the default, arming and takeoff require explicit operator-approved confirmation, and every commanded location is checked against an altitude ceiling and a soft geofence — before anything reaches the autopilot.

Related MCP server: ArduPilot MCP Server Sandbox

Architecture

+--------------------+  stdio (MCP)  +----------------------------------+  MAVLink (UDP)  +------------------+
|  AI client         | <-----------> | mavlink-mcp                      | <-------------> | PX4 / ArduPilot  |
|  (Claude, Cursor,  |               |  MCP server                      |     via         |  SITL or real FC |
|   VS Code, ...)    |               |   └─ capability layer + policy   |    MAVSDK       |  (Pixhawk-class) |
+--------------------+               |       └─ MAVSDK adapter          |    (BSD-3)      +------------------+
                                     +----------------------------------+
Python scripts use the same capability layer directly (mavlink_mcp.Drone).

The capability layer (Drone) owns all policy — readonly, confirmation, altitude, geofence. The adapter (MavsdkAdapter) only translates approved operations to MAVLink; it is the only module that imports mavsdk. New backends implement the same DroneAdapter interface and inherit both surfaces (MCP tools + Python library) and every guardrail for free.

Quick Start (60 seconds)

pip install git+https://github.com/hieutachi/mavlink-mcp.git

Start a PX4 SITL (see docs/simulator-quickstart.md — one Docker command), then add to your MCP client config:

{
  "mcpServers": {
    "mavlink": {
      "command": "mavlink-mcp",
      "env": { "MAVLINK_MCP_READONLY": "true" }
    }
  }
}

Then ask your agent: "What can this drone do, and where is it right now?"

When you're ready to fly (in the simulator!), set MAVLINK_MCP_READONLY to "false".

Capabilities & tools

12 tools covering 8 capabilities. All tools return JSON; errors come back as {"error": "...", "guardrail": true} instead of raising, so the agent can read and react.

Tool

Capability

What it does

Mutating?

get_capabilities

What the vehicle supports + active guardrails

no

get_telemetry

Telemetry

Position, attitude, battery, GPS, mode, armed, in-air

no

get_flight_mode

FlightMode

Current flight mode (HOLD, MISSION, RTL, ...)

no

get_connection_status

Endpoint, connection state, guardrail config

no

arm

Arm/Disarm

Spin up motors

yes — requires confirm=true

disarm

Arm/Disarm

Stop motors (on the ground)

yes

takeoff

Takeoff

Climb to a target altitude

yes — requires confirm=true

land

Land

Land at the current position

yes

hold

FlightMode

Pause: stop and loiter in place

yes

return_to_launch

ReturnToLaunch

Fly home and land

yes

goto_location

Goto

Fly to one waypoint and loiter

yes — geofence + altitude checked

fly_mission

Mission

Upload a waypoint mission and start it

yes — every waypoint checked

Example conversation

You: Check the drone and, if it's healthy, do a short patrol at 20 m.

Agent: (calls get_capabilities — sees readonly is off, geofence 200 m; calls get_telemetry — GPS FIX_3D, 10 satellites, battery 100%) The drone is healthy. I need your approval to arm and take off — confirm?

You: Confirmed, go ahead.

Agent: (calls arm(confirm=true), takeoff(altitude_m=20, confirm=true), then fly_mission with 3 waypoints inside the geofence, monitors get_telemetry, finishes with return_to_launch) Patrol complete — the drone is back at the launch point and disarmed.

Configuration

Environment variable

Default

Description

MAVLINK_MCP_URL

udpin://0.0.0.0:14540

MAVLink endpoint (PX4 SITL's offboard port). With MAVSDK 2.x the older syntax udp://:14540 is used automatically.

MAVLINK_MCP_READONLY

true

Reject every tool that can move the vehicle (see Safety)

MAVLINK_MCP_MAX_ALTITUDE_M

50

Ceiling for takeoff/goto/mission altitudes, meters above launch. 0 disables.

MAVLINK_MCP_GEOFENCE_RADIUS_M

200

Soft geofence radius around the home position, meters. 0 disables.

Safety

Letting a language model command an aircraft is a real risk, so the guardrails are stricter than a typical SDK:

  1. Readonly by default. Unlike most tools, you must explicitly opt in to flight with MAVLINK_MCP_READONLY=false. In readonly mode all telemetry tools work; every mutating tool is rejected with a clear explanation.

  2. Two-step confirmation for the dangerous transitions. arm and takeoff require confirm=true, and the tool descriptions instruct the agent to obtain human approval first — an agent cannot legitimately take off in a single autonomous step.

  3. Soft geofence + altitude ceiling. Every commanded location (goto and each mission waypoint) is validated against MAVLINK_MCP_GEOFENCE_RADIUS_M around home and MAVLINK_MCP_MAX_ALTITUDE_M before anything is sent to the autopilot.

  4. Safety actions stay friction-free. land, hold, and return_to_launch never require confirmation — de-escalation must always be cheap.

These checks are policy inside this process — not a substitute for the autopilot's own failsafes, a real geofence configured in PX4/ArduPilot, network isolation, or a human with an RC transmitter. Read SECURITY.md before considering real hardware, and treat real-world flights as requiring registration/permits under your local aviation law (e.g. Vietnam's UAV Decree 288/2025 requires registration and flight permits).

Python library

The same capability layer is importable for scripts and notebooks — see examples/patrol_sitl.py for a full takeoff → waypoint → land run against SITL:

from mavlink_mcp import Drone, GuardrailConfig
from mavlink_mcp.adapters.mavsdk_adapter import MavsdkAdapter

drone = Drone(MavsdkAdapter(), guardrails=GuardrailConfig(readonly=False))
snapshot = await drone.get_telemetry()
await drone.arm(confirm=True)
await drone.takeoff(20.0, confirm=True)

No telemetry, no data collection. The only network connection this package opens is the MAVLink endpoint you configure (MAVLINK_MCP_URL). Vehicle data returned by tools goes exclusively to your MCP client.

License compliance. The core deliberately depends on MAVSDK-Python (BSD-3-Clause) and not on pymavlink (LGPL-3), keeping the dependency tree permissive under this project's MIT license. Direct dependencies: mavsdk (BSD-3-Clause), fastmcp (Apache-2.0). All code in this repository is original work written from public, open specifications (MAVLink protocol docs, MAVSDK docs) — no proprietary SDKs, no reverse engineering, no vendor EULAs accepted.

FAQ

Do I need a drone? No. MVP1 is simulation-first: everything works against PX4 SITL (one Docker command) and is designed to also work against ArduPilot SITL. See docs/simulator-quickstart.md.

Does it work with ArduPilot? The capability layer targets both PX4 and ArduPilot through MAVSDK. PX4 SITL is the primary tested target in MVP1; ArduPilot SITL compatibility notes are in the quickstart, and validating it in CI is a roadmap item.

Why not just use MAVSDK directly? If you're writing Python by hand, do! mavlink-mcp adds the layer MAVSDK doesn't have: an MCP tool surface for AI agents, a capability model with runtime discovery, and production guardrails (readonly, confirmation, geofence) enforced above the protocol.

The agent says no vehicle was discovered. Check the SITL is running and sending MAVLink to the endpoint in MAVLINK_MCP_URL (PX4 SITL sends to UDP 14540 by default). The quickstart has a troubleshooting table.

Is my data sent anywhere? Only to your MCP client, which forwards it to whatever LLM you use — treat position data accordingly.

Roadmap

Staged plan in ROADMAP.md: MVP1 (this — capability layer + MCP server on SITL), MVP2 (real Pixhawk-class hardware, ROS 2 adapter reusing rosbridge-mcp, plugin/conformance system), MVP3 (community adapters, multi-vehicle, open-core services).

Contributing

Contributions are welcome — see CONTRIBUTING.md. Please sign off your commits (DCO). Note the clean-contribution rule: PRs must be based on public specs and documentation only.

License

MIT — see LICENSE. Dependency licenses are permissive and compatible: mavsdk (BSD-3-Clause), fastmcp (Apache-2.0). No GPL/LGPL/AGPL dependencies in the core.


Tóm tắt tiếng Việt

mavlink-mcp là lớp capability trung lập (vendor-neutral) cho UAV kèm MCP server, xây hoàn toàn trên chuẩn mở: kết nối AI agent (Claude Desktop, Cursor, VS Code...) với drone nói MAVLink (PX4/ArduPilot) qua thư viện MAVSDK (BSD-3). Đây là dự án chị em của rosbridge-mcp.

  • 8 capability: telemetry (vị trí/tư thế/pin/GPS), flight mode, arm/disarm, takeoff, land, goto, mission, return-to-launch — 12 tool MCP.

  • An toàn mặc định: chế độ readonly bật sẵn (MAVLINK_MCP_READONLY mặc định true); arm và takeoff cần confirm=true sau khi người vận hành đồng ý; geofence mềm + trần độ cao cấu hình được.

  • Simulation-first: chạy với PX4 SITL (1 lệnh Docker) — xem docs/simulator-quickstart.md. Dự án dành cho mô phỏng/nghiên cứu; bay thật hoàn toàn do bạn tự chịu trách nhiệm, bao gồm đăng ký thiết bị và xin phép bay theo Luật Phòng không nhân dân 49/2024 và Nghị định 288/2025.

  • Tên "mavlink-mcp" là tên tạm — sẽ rà soát trademark policy của Dronecode trước khi công bố.

Available Tools

12 tools
armA

Arm the vehicle (spin up motors). DANGEROUS on real hardware.

Rejected in readonly mode. Additionally requires confirm=true: ask the human operator for approval first — never set confirm=true on your own initiative. Preflight: check get_telemetry (GPS fix, battery) before arming. Returns {"armed": true} or {"error": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully compensates for the lack of annotations by disclosing that the tool is 'DANGEROUS on real hardware', that it is 'Rejected in readonly mode', and that it returns specific outputs ('{"armed": true}' or error). It also details required confirmation workflow and preflight checks, providing comprehensive 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise and well-structured: a bold headline, a warning on the first line, critical usage rules for parameters and readonly behavior, a preflight instruction, and return format—all in just three sentences. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of this dangerous operation, the description covers all critical aspects: action, danger level, parameter semantics, error handling, preconditions, and output format. The output schema exists and matches the return values mentioned. No gaps remain for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema has 0% description coverage, the description adds essential meaning to the 'confirm' parameter by explaining its role in requiring human approval and explicitly instructing the agent never to set it to true autonomously. This goes well beyond the schema's bare type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Arm the vehicle (spin up motors)' with a specific verb-resource pair ('arm' + 'vehicle'). It also distinguishes from sibling tools like 'disarm' and 'takeoff' by explicitly marking this as the arming action and noting its preflight dependencies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: it requires human approval via confirm=true, and specifies that the agent must never set confirm=true on its own initiative. It also tells when to use this tool (after checking get_telemetry for GPS fix and battery) and indicates it is rejected in readonly mode, offering clear context for when not to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disarmA

Disarm the vehicle (stop motors). Autopilots reject this in flight.

Rejected in readonly mode. Returns {"disarmed": true} or {"error": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the core behavior (stop motors), rejection conditions, and return format. It does not detail side effects or reversibility, but for a disarm command 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences), front-loads the main purpose, and adds constraints and return format without redundancy. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, an output schema (implied by return description), and clear behavior, the description is complete for an agent to select and invoke the tool correctly. It covers purpose, constraints, and expected output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters (100% coverage), so the description is not required to add parameter details. It adds value by describing the return value format, which is helpful for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Disarm the vehicle (stop motors)') and distinguishes it from siblings like 'arm' and 'takeoff'. It also specifies conditions where it is rejected, enhancing clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when the tool is rejected ('in flight', 'in readonly mode'), which guides appropriate usage. However, it does not explicitly mention alternatives or when-not-to-use in a comparative sense, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fly_missionA

Upload a waypoint mission and start flying it. The vehicle must be armed and flying (or the autopilot will take off per its mission config).

Args: waypoints: List of {"latitude_deg", "longitude_deg", "relative_altitude_m", "speed_m_s"?} objects, flown in order. Every waypoint is validated against the altitude ceiling and the soft geofence before anything is uploaded.

Rejected in readonly mode. Returns {"mission_started": true, "waypoint_count": N}. Use hold to pause or return_to_launch to abort; poll get_flight_mode — mode leaves MISSION when the mission ends.

ParametersJSON Schema
NameRequiredDescriptionDefault
waypointsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses: rejection in readonly mode, return value format, per-waypoint validation against altitude ceiling and soft geofence, precondition with fallback behavior (autopilot takeoff), and mode lifecycle ('mode leaves MISSION when the mission ends'). This is comprehensive and reveals all key behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then preconditions, parameter details, limitations, return value, and sibling usage. Every sentence adds value; there is no fluff. It could be slightly tighter (e.g., combining precondition and fallback), but the structure is logical and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (one parameter, clear input/output) and the presence of an output schema (though not shown), the description covers input structure, preconditions, validation, return value, and post-action guidance. It lacks explicit error cases beyond readonly mode rejection, but overall it provides enough information for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (the schema only shows an array of objects with 'additionalProperties: number'). The description compensates fully by specifying the exact object fields: latitude_deg, longitude_deg, relative_altitude_m, and optional speed_m_s. It also explains validation behavior, adding meaning that the agent cannot infer from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Upload a waypoint mission and start flying it', which is a specific verb+resource. It clearly distinguishes from sibling tools like takeoff (just take off), hold (pause), and return_to_launch (abort) by explicitly mentioning them as alternatives. The scope (waypoint mission vs other actions) is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states prerequisites: 'The vehicle must be armed and flying (or the autopilot will take off per its mission config)' and notes rejection in readonly mode. It also directs to use hold or return_to_launch for pausing or aborting. While it doesn't explicitly say 'use this when you have a waypoint list vs. use takeoff for simple ascent', the context and sibling differentiation provide sufficient guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_capabilitiesA

Discover what this vehicle can do and which guardrails are active.

Takes no arguments; does not require a live vehicle. Call this first. Returns {"adapter", "capabilities": ["telemetry", "arm_disarm", ...], "guardrails": {"readonly", "max_altitude_m", "geofence_radius_m"}, "connected"}. Plan only with listed capabilities; if "readonly" is true, every tool that can move the vehicle will be rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It transparently discloses that the tool takes no arguments, does not require a live vehicle, and returns a specific structure with fields like 'capabilities' and 'guardrails'. It also explains the behavioral impact of the 'readonly' guardrail on other tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise and well-structured. It front-loads the purpose, then provides key details (no arguments, no live vehicle needed, call first), and ends with the return shape and an important behavioral note. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has zero parameters and an output schema exists, the description does an excellent job of explaining the output structure and its implications. It covers the return fields, the meaning of 'readonly', and the recommended usage order, making it fully complete for a discovery tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty with 0 parameters, so there is no need to explain parameters. The description adds value by explicitly stating 'Takes no arguments' and 'does not require a live vehicle', which clarifies usage beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Discover what this vehicle can do and which guardrails are active.' It uses a specific verb and resource, and distinguishes itself from sibling tools (e.g., get_flight_mode, arm) by being the only one that returns capabilities and guardrails and is safe to call without a live vehicle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this first' and instructs to 'Plan only with listed capabilities; if "readonly" is true, every tool that can move the vehicle will be rejected.' This provides clear guidance on when to use this tool and its implications for subsequent tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_connection_statusA

Report the MAVLink endpoint, connection state, and guardrail config.

Takes no arguments. The connection is opened lazily, so "connected" is false until another tool has been used. Check this first when other tools report errors.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the critical lazy-connection behavior ('connected is false until another tool has been used') which is essential for correct interpretation of the result. This exceeds expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-loading purpose, then providing essential behavioral context and usage guidance. Every sentence is necessary and earns its place. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has zero parameters and an output schema. Given this simplicity, the description is fully complete: it explains what is reported, the lazy-connection nuance, and the diagnostic usage pattern. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with zero parameters, so baseline is 3. The description adds value by stating 'Takes no arguments' upfront, confirming no hidden inputs. A 4 is appropriate for a param-free tool where the description reinforces the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports the MAVLink endpoint, connection state, and guardrail config. It is a singular, specific verb+resource combination that is easily distinguished from sibling tools like arm, takeoff, or get_telemetry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to check this first when other tools report errors, and explains the lazy-connection behavior that makes this diagnostic. It provides clear context for when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_flight_modeA

Report the current flight mode (e.g. HOLD, TAKEOFF, MISSION, RTL).

Takes no arguments. Read-only. Returns {"flight_mode": "HOLD"}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly states 'Read-only' and provides an example return value. This discloses the core behavioral trait. However, it does not mention error handling, connection prerequisites, or rate limits, which are minor gaps for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the purpose, and contains no extraneous information. Every sentence serves a clear function: stating the purpose, noting no arguments, and giving an example output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, simple output), the description is nearly complete. It covers what the tool does, its input, and its output format. It does not explain possible errors or connection requirements, but for a straightforward getter, this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema coverage is 100%. The description adds 'Takes no arguments,' which is redundant but confirms the schema. For a zero-parameter tool, baseline is 4, and the description does not detract from it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Report the current flight mode (e.g. HOLD, TAKEOFF, MISSION, RTL).' The verb 'report' and resource 'flight mode' are specific, and the examples distinguish it from the sibling action commands (e.g., arm, takeoff, land).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies read-only usage by stating 'Takes no arguments. Read-only,' but it does not explicitly say when to use this tool versus alternatives. No guidance on when not to use it or in what contexts (e.g., before taking action). However, the sibling set includes many write commands, so the intent is somewhat clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_telemetryA

Read one snapshot of the vehicle's telemetry. Read-only.

Takes no arguments. Returns {"position": {latitude_deg, longitude_deg, absolute_altitude_m, relative_altitude_m}, "attitude": {roll_deg, pitch_deg, yaw_deg}, "battery": {voltage_v, remaining_percent}, "gps": {num_satellites, fix_type}, "flight_mode", "armed", "in_air"}. Fields the vehicle did not report within a few seconds are null. Always check telemetry before commanding motion.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It discloses 'Read-only' behavior and that fields not reported within a few seconds are null. It does not cover connectivity scenarios or refresh semantics, but the null-handling is a valuable behavioral trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. It front-loads the purpose and key traits, then efficiently provides return structure, null handling, and a usage advisory.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an existing output schema, the description is complete. It covers the tool's purpose, behavior (null fields), and use-case advisory. No obvious gaps remain for a simple telemetry read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and schema coverage is 100%. The description adds value beyond the schema by explicitly listing the returned fields (position, attitude, battery, gps, flight_mode, armed, in_air) with their subfields, which aids an agent in understanding what to expect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Read one snapshot of the vehicle's telemetry. Read-only.' It uses a specific verb ('Read') and resource ('telemetry snapshot'), and the purpose is distinct from siblings like `get_flight_mode` or `get_capabilities`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly advises when to use the tool with 'Always check telemetry before commanding motion,' and declares it read-only (safe, no side effects). It does not explicitly state when not to use it or list alternatives, but the sibling context provides differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

goto_locationA

Fly to a single waypoint and loiter there. The vehicle must be flying already (armed + taken off).

Args: latitude_deg: Target latitude (WGS84). longitude_deg: Target longitude (WGS84). relative_altitude_m: Target altitude above the launch point, in meters. Checked against the altitude ceiling. yaw_deg: Heading at the target, 0 = north (default 0).

Rejected in readonly mode. The target is also checked against the soft geofence around home (MAVLINK_MCP_GEOFENCE_RADIUS_M, default 200 m). Returns {"goto_started": true, "target": {...}} — travel is asynchronous; poll get_telemetry to track progress.

ParametersJSON Schema
NameRequiredDescriptionDefault
yaw_degNo
latitude_degYes
longitude_degYes
relative_altitude_mYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations were provided, so the description carries the full burden of behavioral disclosure. It clearly states the tool is destructive (it sends a movement command) by noting it is 'Rejected in readonly mode.' It also describes the asynchronous nature of the travel ('travel is asynchronous; poll get_telemetry to track progress'), which is critical behavioral context. It could have mentioned if the command is reversible (e.g., can it be cancelled mid-flight?), but the description is strong for a tool with zero annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with an Args section and behavioral notes. It is front-loaded with the core action and precondition. Every sentence adds useful information. It is somewhat long at ~100 words, but this length is justified given the four parameters and the need to explain behavior. Minor inefficiency: the Args section could be more concise by relying on the schema, but since schema coverage is 0%, the verbosity is warranted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 4 parameters with 0% schema coverage, no annotations, and an output schema exists. The description provides a complete understanding: it explains each parameter, notes the prerequisite (must be flying), mentions safety checks (geofence, altitude ceiling), and describes the return value format (including an example). However, it does not explicitly document all output schema fields (just a partial example), and it misses any mention of error conditions or failure scenarios (e.g., what happens if the geofence limit is exceeded). For a tool with this complexity, the description is nearly complete but has a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the input schema provides no descriptions for the parameters. The description compensates by listing and explaining each parameter inline in the docstring. For example, it states 'yaw_deg: Heading at the target, 0 = north (default 0).' It also provides constraints: 'relative_altitude_m: Checked against the altitude ceiling.' This adds value beyond the raw schema, but the documentation is embedded in the text rather than structured. Baseline is 3 due to zero coverage, and the description meets that baseline adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Fly to a single waypoint and loiter there.' The verb 'fly' and resource 'single waypoint' are specific, and the description distinguishes this tool from siblings like 'fly_mission' (which handles multiple waypoints) and 'return_to_launch' (which returns home). The title is missing, but the description compensates fully.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states a prerequisite: 'The vehicle must be flying already (armed + taken off).' This tells the agent when it is appropriate to use this tool (only after arming and takeoff). It also mentions constraints like the altitude ceiling and soft geofence, guiding proper invocation. No explicit when-not-to-use is given, but the negative condition ('not armed/taken off') is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

holdA

Pause: stop and loiter at the current position (HOLD mode).

Rejected in readonly mode. Use this to interrupt a goto or mission safely. Returns {"holding": true}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the rejection in readonly mode and the return value. However, it does not elaborate on side effects like whether the mission is paused or aborted, which would be useful for a safety-critical tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences, front-loaded with the key purpose. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 params, no nested objects, output schema exists), the description covers purpose, usage, behavior, and return value. It is fully adequate for an agent 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so baseline is 4. The description does not need to add parameter info since none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Pause: stop and loiter') and the resource ('current position', 'HOLD mode'). It distinguishes this from sibling tools like goto_location and fly_mission by focusing on interruption.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use ('interrupt a goto or mission safely') and when not ('Rejected in readonly mode'). This provides clear guidance on context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

landA

Land at the current position.

Rejected in readonly mode (no confirmation needed — landing makes the vehicle safer). Returns {"landing_started": true}; poll get_telemetry until "in_air" is false.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description adequately discloses behavioral traits: it is rejected in readonly mode, landing enhances safety, and it returns a specific JSON object. It also recommends polling for completion, which adds useful 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, each earning its place. The first sentence defines the action succinctly, and the second adds essential behavioral details and post-call advice without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema (though context signals oddly indicate one), the description fully covers purpose, rejection condition, return value, and next steps. No gaps remain for an agent to invoke and understand the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the schema provides no additional information. The description adds value by specifying the return format and polling guidance, which is more than the baseline for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Land at the current position', using a specific verb and resource scope. It distinguishes itself from sibling tools like 'takeoff' and 'hold', making the action unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the tool is rejected in readonly mode and that no confirmation is needed, providing clear context for when it can be used. It also advises polling get_telemetry after use, but does not explicitly compare to other landing-related actions like 'return_to_launch'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

return_to_launchA

Fly back to the launch point and land there (RTL).

Rejected in readonly mode (no confirmation needed — RTL is a recovery action). Returns {"rtl_started": true}; poll get_telemetry until "in_air" is false.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses key behavior: rejection in readonly mode, no confirmation need, the exact return value, and instructions to poll get_telemetry until 'in_air' is false. This is thorough behavioral guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each adding value: action, exception/confirmation, return/polling. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter command, the description is complete: it explains the action, the readonly restriction, the return shape, and the follow-up monitoring step. An agent can invoke and verify the operation successfully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 unnecessary parameter information, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the action: 'Fly back to the launch point and land there (RTL).' This is a specific verb+resource and clearly distinguishes it from sibling tools like land or goto_location.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context: RTL is a recovery action, rejected in readonly mode, and requires no confirmation. While it does not explicitly compare to alternatives, the recovery role and the exclusion are enough to guide usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

takeoffA

Take off vertically to altitude_m meters above the launch point.

Rejected in readonly mode. Additionally requires confirm=true after human operator approval — never set it on your own initiative. The vehicle must be armed first (call arm). Altitude is validated against the configured ceiling (MAVLINK_MCP_MAX_ALTITUDE_M, default 50 m).

Returns {"takeoff_started": true, "target_altitude_m": ...} — takeoff is asynchronous; poll get_telemetry to watch the climb.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
altitude_mNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits such as altitude validation against a configured ceiling with a default value, and the asynchronous nature of the operation. Since no annotations are provided, the description carries the full burden, and it handles this well, though it could also mention safety implications or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and concise, providing essential information in three focused paragraphs: purpose, usage constraints, and return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the description provides adequate context about the return value and asynchronous behavior. It covers prerequisites, restrictions, and cited alternatives, making it complete for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to the parameters, explaining that 'altitude_m' is meters above launch point and validated against a ceiling, and that 'confirm' requires human approval. With 0% schema description coverage, the description fully compensates, though it does not list the exact default values from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool makes the vehicle 'take off vertically to `altitude_m` meters above the launch point', providing a specific verb and resource. It distinguishes itself from sibling tools like 'land' or 'arm' by describing a distinct flight action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when the tool is rejected ('Rejected in readonly mode'), requires specific user confirmation ('confirm=true after human operator approval'), and lists prerequisites ('The vehicle must be armed first (call arm)'). It provides clear usage guidance without ambiguity.

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. Dates show when Glama detected each change.

  1. 12 tool updatesv0.1.0
    • First observedarm
    • First observeddisarm
    • First observedfly_mission
    • First observedget_capabilities
    • First observedget_connection_status
    • First observedget_flight_mode
    • First observedget_telemetry
    • First observedgoto_location
    • First observedhold
    • First observedland
    • First observedreturn_to_launch
    • First observedtakeoff

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: read operations (get_flight_mode, get_capabilities, get_telemetry, get_connection_status), safety actions (arm, disarm), and navigation commands (takeoff, land, hold, return_to_launch, goto_location, fly_mission). No overlap or ambiguity.

Naming Consistency4/5

Most tools use a consistent verb_noun pattern with snake_case (e.g., get_flight_mode, get_telemetry). Action verbs are single words (arm, disarm, takeoff, land, hold) except return_to_launch and goto_location, which are phrases. The pattern is clear and predictable, with only minor deviation.

Tool Count5/5

12 tools is well-scoped for a drone control server. It covers essential read capabilities, safety, and navigation without being excessive. Each tool has a clear role and contributes to a complete workflow.

Completeness4/5

The toolset covers core drone operations: reading state, arming, disarming, takeoff, landing, holding, returning, going to a location, and flying missions. Minor gaps exist, such as no direct parameter setting or mode change tool, but the core workflows are fully supported and the guardrails are well-integrated.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables Large Language Models to interact with the ILP Drone Delivery System to plan deliveries, check drone availability, and generate route visualizations. It allows users to manage logistics tasks like capacity planning and temperature requirement matching through natural language.
    6
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to interact with an ArduPilot vehicle in real-time via MAVLink, including reading state, inspecting and changing parameters, switching flight modes, diagnosing arming failures, and gated arming/disarming.
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to control Betaflight flight controllers over serial via MSP and CLI, providing real-time sensor reads, full CLI access, and auto-generated variable tools for configuration and tuning.
    100
    201
    1
    AGPL 3.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hieutachi/mavlink-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server