mavlink-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MAVLINK_MCP_URL | No | MAVLink endpoint (PX4 SITL's offboard port). With MAVSDK 2.x the older syntax udp://:14540 is used automatically. | udpin://0.0.0.0:14540 |
| MAVLINK_MCP_READONLY | No | Reject every tool that can move the vehicle (see Safety) | true |
| MAVLINK_MCP_MAX_ALTITUDE_M | No | Ceiling for takeoff/goto/mission altitudes, meters above launch. 0 disables. | 50 |
| MAVLINK_MCP_GEOFENCE_RADIUS_M | No | Soft geofence radius around the home position, meters. 0 disables. | 200 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tasks | {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
},
"prompts": {
"get": {}
},
"resources": {
"read": {}
}
}
} |
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| 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. |
| get_flight_modeA | Report the current flight mode (e.g. HOLD, TAKEOFF, MISSION, RTL). Takes no arguments. Read-only. Returns {"flight_mode": "HOLD"}. |
| 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. |
| 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": ...}. |
| disarmA | Disarm the vehicle (stop motors). Autopilots reject this in flight. Rejected in readonly mode. Returns {"disarmed": true} or {"error": ...}. |
| takeoffA | Take off vertically to 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. |
| 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. |
| 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}. |
| 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. |
| 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. |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 12 tools
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.
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.
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.
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.