Betaflight MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| 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
- 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