Betaflight MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_serial_portsA | List all available serial ports on this system. Use this to find the port your flight controller is connected to. |
| connect_flight_controllerA | Connect to a Betaflight flight controller over USB/serial. Use list_serial_ports first to find the correct port. |
| reconnect_flight_controllerA | Reconnect to the last connected flight controller using the same port and baud rate. Useful after a reboot (e.g. following cli_save or reboot_flight_controller). Will disconnect any existing session first. |
| disconnect_flight_controllerA | Disconnect from the currently connected flight controller. |
| get_statusA | Get flight controller status: cycle time, I2C errors, active sensors, mode flags, and active profile. |
| get_raw_imuA | Get raw IMU sensor data: accelerometer (G), gyroscope (°/s), and magnetometer values. |
| get_attitudeA | Get current attitude: roll (°), pitch (°), and yaw (°) from the flight controller. |
| get_altitudeA | Get current altitude (meters) and variometer (cm/s) from the barometer. |
| get_batteryA | Get battery analog data: voltage (V), mAh drawn, RSSI, and current (A). |
| get_battery_stateB | Get detailed battery state: cell count, capacity, voltage, current draw, and state code. |
| get_rc_channelsA | Get current RC channel values (microseconds). Returns all active channels. |
| get_motor_valuesB | Get current motor output values (microseconds). Returns all active motor outputs. |
| get_gps_dataB | Get GPS data: fix status, satellite count, latitude/longitude (°), altitude (m), and ground speed (cm/s). |
| feature_listA | List all features and their enabled/disabled state on the flight controller. |
| feature_enableB | Enable a named feature on the flight controller (e.g. TELEMETRY, GPS, SOFTSERIAL). |
| feature_disableB | Disable a named feature on the flight controller. |
| get_serial_configC | Get serial port configuration from the flight controller. |
| get_aux_configB | Get auxiliary channel (AUX) mode configuration. |
| get_channel_mapA | Get the current RC channel map (order of AETR channels). |
| set_channel_mapA | Set the RC channel map order (e.g. AETR1234). |
| get_mixerB | Get the current mixer type configuration. |
| get_tasksA | Get the list of scheduler tasks and their timing statistics. |
| get_versionA | Get the Betaflight firmware version and build information. |
| motor_getB | Get the current output value for a specific motor index. |
| motor_setA | Set the output value for a specific motor (use with caution — props off!). Value 0 = off, 1000–2000 = throttle range. |
| cli_execA | Execute an arbitrary CLI command on the flight controller and return the output. NOTE: for "set simplified_*" commands, prefer the set_pid_sliders tool — it recalculates the underlying PID/filter gains via MSP. If used here anyway, this tool automatically runs "simplified_tuning apply" afterward to keep the actual gains in sync with the slider value. |
| cli_dumpA | Dump the complete flight controller configuration as CLI commands. This may take several seconds. |
| cli_diffA | Show only the settings that differ from the defaults (diff all). More concise than a full dump. |
| cli_statusA | Get flight controller status text output from the CLI status command. |
| cli_helpB | List all available CLI commands on the flight controller. |
| cli_saveA | Save current configuration to EEPROM and reboot the flight controller. WARNING: This will close the connection as the FC reboots. Reconnect after save. |
| cli_defaultsA | Reset flight controller configuration to factory defaults and reboot. WARNING: This will erase all settings and close the connection. Use cli_save after reconnecting to preserve the reset. |
| reboot_flight_controllerA | Reboot the flight controller. The connection will be closed as the FC restarts. Use reconnect_flight_controller (or connect_flight_controller) afterwards. |
| calibrate_accelerometerA | Calibrate the accelerometer. Place the flight controller level and stationary before calling this. Note: call this before any CLI tools in the same session (MSP cannot be used after CLI mode is entered). |
| calibrate_magnetometerA | Calibrate the magnetometer (compass). Rotate the flight controller through all orientations when prompted. Note: call this before any CLI tools in the same session (MSP cannot be used after CLI mode is entered). |
| get_dataflash_summaryA | Get onboard blackbox flash storage summary: ready state, total size, and used size. Note: call this before any CLI tools in the same session. |
| erase_blackbox_logsA | Erase all blackbox logs stored in onboard flash memory. This is irreversible and can take up to 30 seconds. Note: call this before any CLI tools in the same session. |
| get_arming_disable_flagsA | Get the flags explaining why the flight controller is refusing to arm. Returns a list of active arming-disable conditions. An empty list means the FC is ready to arm. Note: call this before any CLI tools in the same session. |
| get_current_profileA | Get the currently active PID profile index and rate profile index. |
| set_pid_profileB | Switch the active PID profile (0-indexed). Call cli_save afterwards to persist the change. |
| set_rate_profileA | Switch the active rate profile (0-indexed). Call cli_save afterwards to persist the change. |
| copy_pid_profileA | Copy a PID profile to another slot. Switches to the source profile then copies it to the destination. Call cli_save afterwards to persist. |
| preflight_checkA | Run a comprehensive preflight safety check: arming readiness, battery voltage, GPS lock status, and CPU load. Note: call this before any CLI tools in the same session (uses MSP). |
| get_pid_slidersA | Get the current Betaflight simplified filter and tuning slider values. Returns float positions (1.0 = default/100%) matching the slider controls in Betaflight Configurator. pids_mode 0 = disabled, 1 = roll+pitch, 2 = roll+pitch+yaw. |
| set_pid_slidersA | Set Betaflight simplified filter and tuning slider values. Provide only the sliders you want to change; all others keep their current values. The FC recalculates actual PID gains immediately via MSP (equivalent to moving sliders in Configurator). Call cli_save afterwards to persist to EEPROM. If pids_mode is currently 0 (disabled), it is automatically enabled (set to 1) unless you specify otherwise. |
| get_gyro_hardware_lpfB | Get gyro_hardware_lpf: Hardware low-pass filter mode built into the gyro chip. NORMAL is correct for almost all builds. OPTION_1/2/EXPERIMENTAL select alternative hardware bandwidth settings where supported by the sensor. [UINT8, default: NORMAL] |
| set_gyro_hardware_lpfA | Set gyro_hardware_lpf: Hardware low-pass filter mode built into the gyro chip. NORMAL is correct for almost all builds. OPTION_1/2/EXPERIMENTAL select alternative hardware bandwidth settings where supported by the sensor. [UINT8, default: NORMAL] |
| get_gyro_lpf1_typeB | Get gyro_lpf1_type: Filter type for gyro LPF1. PT1 = first-order, least delay. [UINT8, default: PT1] |
| set_gyro_lpf1_typeA | Set gyro_lpf1_type: Filter type for gyro LPF1. PT1 = first-order, least delay. [UINT8, default: PT1] |
| get_gyro_lpf1_static_hzA | Get gyro_lpf1_static_hz: Static cutoff for LPF1. Set to 0 to disable (recommended with RPM filtering). [UINT16, default: 250] |
| set_gyro_lpf1_static_hzA | Set gyro_lpf1_static_hz: Static cutoff for LPF1. Set to 0 to disable (recommended with RPM filtering). [UINT16, default: 250] |
| get_gyro_lpf2_typeB | Get gyro_lpf2_type: Filter type for gyro LPF2 (anti-aliasing). [UINT8, default: PT1] |
| set_gyro_lpf2_typeB | Set gyro_lpf2_type: Filter type for gyro LPF2 (anti-aliasing). [UINT8, default: PT1] |
| get_gyro_lpf2_static_hzA | Get gyro_lpf2_static_hz: LPF2 cutoff. Raise toward 1000 Hz to reduce phase delay. Set to 0 if gyro rate = PID rate (aliasing not possible). [UINT16, default: 500] |
| set_gyro_lpf2_static_hzA | Set gyro_lpf2_static_hz: LPF2 cutoff. Raise toward 1000 Hz to reduce phase delay. Set to 0 if gyro rate = PID rate (aliasing not possible). [UINT16, default: 500] |
| get_gyro_notch1_hzA | Get gyro_notch1_hz: Centre frequency of static gyro notch 1. 0 = disabled. Use for specific persistent resonances not handled by dynamic notch. [UINT16, default: 0] |
| set_gyro_notch1_hzA | Set gyro_notch1_hz: Centre frequency of static gyro notch 1. 0 = disabled. Use for specific persistent resonances not handled by dynamic notch. [UINT16, default: 0] |
| get_gyro_notch1_cutoffA | Get gyro_notch1_cutoff: Bandwidth of gyro notch 1. Must be less than |
| set_gyro_notch1_cutoffA | Set gyro_notch1_cutoff: Bandwidth of gyro notch 1. Must be less than |
| get_gyro_notch2_hzA | Get gyro_notch2_hz: Centre frequency of static gyro notch 2. 0 = disabled. [UINT16, default: 0] |
| set_gyro_notch2_hzA | Set gyro_notch2_hz: Centre frequency of static gyro notch 2. 0 = disabled. [UINT16, default: 0] |
| get_gyro_notch2_cutoffA | Get gyro_notch2_cutoff: Bandwidth of gyro notch 2. [UINT16, default: 0] |
| set_gyro_notch2_cutoffB | Set gyro_notch2_cutoff: Bandwidth of gyro notch 2. [UINT16, default: 0] |
| get_gyro_calib_durationA | Get gyro_calib_duration: Gyro calibration duration in 0.1s steps (125 = 12.5s). Longer = more accurate offset measurement. [UINT16, 50–3000, default: 125] |
| set_gyro_calib_durationA | Set gyro_calib_duration: Gyro calibration duration in 0.1s steps (125 = 12.5s). Longer = more accurate offset measurement. [UINT16, 50–3000, default: 125] |
| get_gyro_calib_noise_limitA | Get gyro_calib_noise_limit: Noise threshold during calibration. If movement exceeds this, calibration restarts. Increase if it won't calibrate in a noisy environment. [UINT8, 0–200, default: 48] |
| set_gyro_calib_noise_limitA | Set gyro_calib_noise_limit: Noise threshold during calibration. If movement exceeds this, calibration restarts. Increase if it won't calibrate in a noisy environment. [UINT8, 0–200, default: 48] |
| get_gyro_offset_yawA | Get gyro_offset_yaw: Manual yaw gyro trim (tenths of degrees/s). Use to correct persistent yaw drift if trim sticks or acc trim are not sufficient. [INT16, -1000–1000, default: 0] |
| set_gyro_offset_yawA | Set gyro_offset_yaw: Manual yaw gyro trim (tenths of degrees/s). Use to correct persistent yaw drift if trim sticks or acc trim are not sufficient. [INT16, -1000–1000, default: 0] |
| get_gyro_overflow_detectC | Get gyro_overflow_detect: Detects gyro ADC saturation (sensor hitting its limit) and disarms. Recommended: ALL. [UINT8, default: ALL] |
| set_gyro_overflow_detectA | Set gyro_overflow_detect: Detects gyro ADC saturation (sensor hitting its limit) and disarms. Recommended: ALL. [UINT8, default: ALL] |
| get_dyn_notch_countA | Get dyn_notch_count: Number of independently tracked dynamic notches. Set to 0 to disable if no frame resonances are visible in the spectrum (eliminates delay). With RPM filtering active, 1–2 notches are sufficient for most frame resonances. Without RPM filtering, use 4–5. [UINT8, default: 3] |
| set_dyn_notch_countA | Set dyn_notch_count: Number of independently tracked dynamic notches. Set to 0 to disable if no frame resonances are visible in the spectrum (eliminates delay). With RPM filtering active, 1–2 notches are sufficient for most frame resonances. Without RPM filtering, use 4–5. [UINT8, default: 3] |
| get_dyn_notch_qA | Get dyn_notch_q: Q factor — narrowness of each notch. Increase until the resonance just stays within the notch, then stop. Max useful value ~1000. [UINT16, 1–1000, default: 300] |
| set_dyn_notch_qA | Set dyn_notch_q: Q factor — narrowness of each notch. Increase until the resonance just stays within the notch, then stop. Max useful value ~1000. [UINT16, 1–1000, default: 300] |
| get_dyn_notch_min_hzA | Get dyn_notch_min_hz: Minimum frequency any notch will track. Set ~25 Hz below the lowest resonance you need to catch. ideally >=150 Hz unless blackbox shows a real resonance below that — tracking low frequencies causes unwanted filtering of PID-relevant signals. [UINT16, 20–250, default: 100] |
| set_dyn_notch_min_hzA | Set dyn_notch_min_hz: Minimum frequency any notch will track. Set ~25 Hz below the lowest resonance you need to catch. ideally >=150 Hz unless blackbox shows a real resonance below that — tracking low frequencies causes unwanted filtering of PID-relevant signals. [UINT16, 20–250, default: 100] |
| get_dyn_notch_max_hzA | Get dyn_notch_max_hz: Maximum frequency any notch will track. Default 600 is fine for most builds. Narrowing the range improves notch resolution. [UINT16, 200–1000, default: 600] |
| set_dyn_notch_max_hzA | Set dyn_notch_max_hz: Maximum frequency any notch will track. Default 600 is fine for most builds. Narrowing the range improves notch resolution. [UINT16, 200–1000, default: 600] |
| get_gyro_lpf1_dyn_min_hzA | Get gyro_lpf1_dyn_min_hz: Dynamic LPF1 minimum cutoff (at low throttle). Set equal to |
| set_gyro_lpf1_dyn_min_hzA | Set gyro_lpf1_dyn_min_hz: Dynamic LPF1 minimum cutoff (at low throttle). Set equal to |
| get_gyro_lpf1_dyn_max_hzA | Get gyro_lpf1_dyn_max_hz: Dynamic LPF1 maximum cutoff (at full throttle). [UINT16, default: 500] |
| set_gyro_lpf1_dyn_max_hzB | Set gyro_lpf1_dyn_max_hz: Dynamic LPF1 maximum cutoff (at full throttle). [UINT16, default: 500] |
| get_gyro_lpf1_dyn_expoA | Get gyro_lpf1_dyn_expo: Expo curve shaping for dynamic LPF1 cutoff vs throttle. Higher = faster rise. [UINT8, 0–10, default: 5] |
| set_gyro_lpf1_dyn_expoA | Set gyro_lpf1_dyn_expo: Expo curve shaping for dynamic LPF1 cutoff vs throttle. Higher = faster rise. [UINT8, 0–10, default: 5] |
| get_gyro_filter_debug_axisB | Get gyro_filter_debug_axis: Which axis is exposed in debug fields for gyro filter analysis. [UINT8, default: ROLL] |
| set_gyro_filter_debug_axisB | Set gyro_filter_debug_axis: Which axis is exposed in debug fields for gyro filter analysis. [UINT8, default: ROLL] |
| get_acc_hardwareB | Get acc_hardware: Force accelerometer driver or AUTO-detect. [UINT8, default: AUTO] |
| set_acc_hardwareB | Set acc_hardware: Force accelerometer driver or AUTO-detect. [UINT8, default: AUTO] |
| get_acc_high_rangeA | Get acc_high_range: Enable high-range accelerometer mode for sensors that support it. [UINT8, default: OFF] |
| set_acc_high_rangeB | Set acc_high_range: Enable high-range accelerometer mode for sensors that support it. [UINT8, default: OFF] |
| get_acc_lpf_hzA | Get acc_lpf_hz: Accelerometer low-pass filter cutoff. Smooths acc readings used for attitude estimation. [UINT16, 0–500, default: 25] |
| set_acc_lpf_hzA | Set acc_lpf_hz: Accelerometer low-pass filter cutoff. Smooths acc readings used for attitude estimation. [UINT16, 0–500, default: 25] |
| get_acc_trim_pitchA | Get acc_trim_pitch: Accelerometer pitch trim for level calibration. [INT16, -300–300, default: 0] |
| set_acc_trim_pitchA | Set acc_trim_pitch: Accelerometer pitch trim for level calibration. [INT16, -300–300, default: 0] |
| get_acc_trim_rollA | Get acc_trim_roll: Accelerometer roll trim for level calibration. [INT16, -300–300, default: 0] |
| set_acc_trim_rollB | Set acc_trim_roll: Accelerometer roll trim for level calibration. [INT16, -300–300, default: 0] |
| get_acc_calibrationA | Get acc_calibration: Raw accelerometer calibration offsets written by the calibration routine. Do not edit manually. [INT16, default: 0,0,0,0] |
| set_acc_calibrationA | Set acc_calibration: Raw accelerometer calibration offsets written by the calibration routine. Do not edit manually. [INT16, default: 0,0,0,0] |
| get_align_magA | Get align_mag: Magnetometer orientation. (Requires: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/bvandevliet/betaflight-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server