flipper-ble-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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| playbookA | The operating manual for driving this Flipper efficiently over BLE. CALL THIS FIRST in a fresh session before navigating the device: returns the data-first control algorithm, verified menu maps (main menu, Momentum settings, region-bypass path), app-entry recipes, input/widget conventions, and key device behaviors. Read-only, no device action. |
| scanA | Diagnostic: is the Flipper advertising over BLE right now? If not, it's most likely connected to your phone (only one BLE central at a time) or asleep. No device action. |
| device_infoA | Read the Flipper's device_info (60+ fields: firmware, hardware revision, radio stack, battery, etc.) WIRELESSLY over BLE, as a {field: value} map. Read-only. |
| screenshotA | 📷 Capture the Flipper's 128x64 screen as a PNG over BLE — the agent's eyes, wireless. Read-only/observational (safe to auto-allow). |
| pressA | Inject a UI button over BLE to drive the Flipper wirelessly. button: up|down|left|right|ok|back. kind: short|long|press|release (default short). then_screenshot (default True): capture the resulting screen in the SAME BLE connection so you SEE what changed. Real action — Claude Desktop prompts per call (the gate). |
| press_sequenceA | Inject a SEQUENCE of buttons in ONE BLE connection — efficient multi-step navigation (one connect instead of one per press). buttons: space-separated btn[:kind], e.g. 'down down ok' or 'right right ok:long'. then_screenshot (default True): capture the final screen in the same connection. Real actions — approve per call. |
| storage_listA | List a directory on the Flipper's SD/internal storage over BLE (storage_list_request). path: e.g. '/ext' (SD root), '/ext/subghz', '/ext/nfc', '/ext/infrared', '/int'. Dirs are tagged [DIR], files show their byte size. Read-only. |
| storage_readA | Read a file from the Flipper's storage over BLE (storage_read_request). Returns decoded text
for text files (.sub / .nfc / .ir / configs, capped ~8 KB), or a binary summary + local path
otherwise. path: e.g. '/ext/subghz/Tesla/foo.sub'. ⚠️ BLE times out on LARGE files (firmware
#3174) — for big ones use the USB |
| storage_infoA | Free/total space on a Flipper filesystem over BLE (storage_info_request). path: '/ext' (SD) or '/int' (internal). Read-only. |
| storage_statA | Stat a file/dir on the Flipper over BLE (storage_stat_request) — type (FILE/DIR) + size. Read-only. |
| storage_md5A | MD5 hash of a file on the Flipper over BLE (storage_md5sum_request) — integrity check. Read-only. |
| power_infoA | Detailed battery/power info over BLE (system_power_info) as a {field: value} map: voltage, current, charge %, temperature, charging state. Read-only. |
| pingA | Ping the Flipper over BLE (system_ping) — liveness + round-trip echo check. Read-only. |
| get_datetimeA | Read the Flipper's real-time clock over BLE (system_get_datetime). Read-only. |
| desktop_is_lockedB | Is the Flipper's desktop PIN-locked? over BLE (desktop_is_locked). Read-only. |
| app_lock_statusA | Is an app currently running/locking the Flipper? over BLE (app_lock_status) — a good pre-check before app_launch. Read-only. |
| app_exitA | Cleanly EXIT the app currently running on the Flipper over BLE (app_exit_request) — back to the desktop/menu. Use before app_launch if an app is already running. Real action — approve per call. |
| app_load_fileA | Open a specific saved file in its app over BLE (app_load_file_request) — e.g. load a .sub into Sub-GHz. ⚠️ The matching app must already be running (app_launch it first). Real action. |
| app_buttonA | Press a NAMED in-app button over BLE (app_button_press + release). App-specific: in the universal IR / Sub-GHz / etc. apps this triggers actions (including transmit). args = the button name/index the running app expects. ⚠️ Advanced + app-specific; YOUR OWN TARGETS ONLY. Real action. |
| set_datetimeA | Set the Flipper's clock over BLE (system_set_datetime). when='now' syncs to this Mac's time, or pass 'YYYY-MM-DD HH:MM:SS'. Real action. |
| find_my_flipperA | Make the Flipper beep + flash to locate it over BLE (system_play_audiovisual_alert) — the one 'output' reachable over BLE RPC (LED/vibro proper are CLI-only). Real action (noise + light). |
| storage_mkdirC | Create a directory on the Flipper over BLE (storage_mkdir_request). Real action. |
| storage_deleteA | ⚠️ DELETE a file/dir on the Flipper over BLE (storage_delete_request). recursive=True for a non-empty dir. Real action — irreversible. |
| storage_renameC | Rename/move a file or dir on the Flipper over BLE (storage_rename_request). Real action. |
| storage_writeA | ⚠️ WRITE/UPLOAD a file to the Flipper over BLE (chunked storage_write_request). Provide EITHER content (text, written as UTF-8) OR local_path (a file on this Mac to upload). dest = full Flipper path, e.g. '/ext/subghz/foo.sub'. Overwrites. ⚠️ BLE is slow for large files — use USB for big ones. Real action. |
| app_launchA | Launch a Flipper app BY NAME over BLE (app_start_request) — skips UI navigation. name: exact app name, e.g. 'NFC', 'Sub-GHz', '125 kHz RFID', 'Infrared', 'GPIO', 'U2F', 'iButton', 'Bad USB' (get exact names from the USB read server's app_list). args (optional): a launch argument — typically a FILE PATH to open directly (a .sub/.nfc/.ir); many apps jump straight to that file. then_screenshot (default True): capture the first screen. FAILS if an app is already running (app_exit first) or the name is unknown. Real action. |
| transmit_subghzA | ⚠️ TRANSMIT a saved Sub-GHz capture over BLE — the app-driven TX path (there is NO direct Sub-GHz TX RPC). Launches the Sub-GHz app with the file as its launch arg, which drives straight into the transmit flow. path: e.g. '/ext/subghz/Tesla/Tesla_US_AM650.sub'. The firmware's region check applies — a 'Transmission is blocked / missing region file' screen = the device's region lock (fix in Momentum settings, not here). ⚠️ Real RF — YOUR OWN TARGETS, LEGAL BANDS ONLY. Approve per call. |
| transmit_infraredA | ⚠️ Open a saved Infrared remote over BLE — the app-driven IR path. Launches the Infrared app
with the .ir file as its launch arg, showing the remote's BUTTON LIST. path: e.g.
'/ext/infrared/TV.ir'. IR is one-command-per-button, so this opens the remote; then use |
| app_get_errorA | Read the running app's last error as a HUMAN-READABLE string over BLE (app_get_error). Call this when an app_launch / app_button / transmit returns a bare status code, to get the app's own error text. Read-only. |
| desktop_unlockA | Clear the Flipper's desktop lock over BLE (desktop_unlock_request). Note: likely clears the swipe-lock only, not a numeric PIN. Real action. |
| rebootA | ⚠️ Reboot the Flipper over BLE (system_reboot). mode: OS (normal, default) | DFU (bootloader) | UPDATE. Use OS as a recovery action when the device is wedged; the BLE link drops as it restarts. Real action — do NOT use DFU/UPDATE unless you mean it. |
| gpio_readA | Read a GPIO pin over BLE (gpio_read_pin). pin: PC0|PC1|PC3|PB2|PB3|PA4|PA6|PA7. Read-only. (Corrects the earlier 'GPIO is CLI-only' note — GPIO IS in the RPC schema.) |
| gpio_writeA | Set a GPIO OUTPUT pin over BLE (gpio_write_pin). pin: PC0|PC1|PC3|PB2|PB3|PA4|PA6|PA7; value 0/1. Set the pin to OUTPUT first via gpio_set_mode. Real action. |
| gpio_set_modeA | Set a GPIO pin mode over BLE (gpio_set_pin_mode). pin: PC0|PC1|PC3|PB2|PB3|PA4|PA6|PA7; mode: output|input. Real action. |
| run_badusbA | ⚠️ Run a BadUSB (DuckyScript) payload over BLE: if |
| selftestA | Daemon self-test / diagnostics: is the daemon up, is the BLE link connected, cached-device status, ping round-trip time, idle timer. Does NOT force a connect (reports current state). Read-only — call this to debug 'is the wireless toolkit healthy?'. |
| read_latestA | Read the MOST-RECENTLY-SAVED file in a Flipper folder over BLE (newest by timestamp) — e.g. pull the NFC card / Sub-GHz capture / RFID dump you just saved on the device. folder: e.g. '/ext/nfc', '/ext/subghz', '/ext/lfrfid', '/ext/infrared'. Returns decoded text or a binary summary. Read-only. |
| healthwatchA | Manage the M5 unattended HEALTH-WATCH — a scheduled, READ-ONLY job that polls the Flipper (battery / storage / clock / firmware / reachability) and fires a macOS notification on anomalies (low/aging/hot battery, full SD, clock drift, firmware change). DEFAULT-OFF; this tool is the on/off switch. When enabled it runs 3×/day (09:00 / 15:00 / 21:00 local) via a launchd LaunchAgent. action: 'status' (default) — enabled? + the last snapshot summary (read-only, no device poll). 'on' — enable the 3×/day schedule (load the LaunchAgent). 'off' — disable it (back to default-off). 'run' — run ONE read-only health check right now and return the summary. The job is structurally incapable of transmit/write (hardcoded read-only command allowlist). |
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
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/pogorelov-labs/flipper-ble-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server