An MCP server for the Flipper Zero. It speaks protobuf RPC to a Flipper over USB or over WiFi (via an ESP32 WiFi Dev Board) and exposes connection and system tools to MCP clients such as Claude Desktop.
Stage: S2 (wrapped). The server runs over stdio with read tools (connection
health, reconnect, system info/power/datetime/protobuf-version, and storage reads
fs_info, fs_stat, fs_timestamp, fs_list, fs_pull) and write tools
(fs_mkdir, fs_delete, fs_rename, fs_push, app_start, cli_exec).
Device-mutating storage/app operations are gated behind
FLIPPER_ENABLE_WRITE_TOOLS and transmit/destructive CLI commands behind
FLIPPER_ENABLE_TX_TOOLS, both default-off. CI runs lint and tests on the
committed lockfile. The /flipper-install flagship and live integration suite
are the S3 climb tracked in the public-launch issues (#37 umbrella). The
flagship was validated end-to-end on hardware (clone → ufbt build → md5-verified
push → launch) — see
docs/proof/2026-06-10-flipper-install.md.
- stdio MCP server (FastMCP).
- Two transports for the Flipper protobuf RPC link:
- USB: serial CDC, with CLI to RPC session switching.
- WiFi: TCP to an ESP32 dev board running the TCP-to-UART bridge firmware.
autotransport selection: USB first, WiFi fallback only when a WiFi host is set.- Tools: connection health/reconnect, system info/power/datetime/protobuf-version, storage info/stat/timestamp/list/push/pull/mkdir/delete/rename, app start, and USB CLI exec.
uv sync
# or
pip install -e .Add to claude_desktop_config.json:
{
"mcpServers": {
"flipper-zero": {
"command": "uv",
"args": ["run", "--directory", "/path/to/flipperzero-mcp", "flipperzero-mcp"],
"env": { "FLIPPER_TRANSPORT": "auto" }
}
}
}The server reads FLIPPER_* environment variables (or a local .env). See
src/flipperzero_mcp/config.py for the authoritative definitions.
| Variable | Default | Description |
|---|---|---|
FLIPPER_TRANSPORT |
auto |
Transport selection: auto, usb, or wifi. |
FLIPPER_USB_PORT |
(auto-detect) | Serial device path (e.g. /dev/ttyACM0). Unset = auto-detect. |
FLIPPER_USB_BAUDRATE |
115200 |
USB serial baud rate. |
FLIPPER_WIFI_HOST |
(unset) | Dev board IP/hostname. Required for WiFi. |
FLIPPER_WIFI_PORT |
8080 |
Dev board TCP port. |
FLIPPER_ENABLE_WRITE_TOOLS |
false |
Server-side gate for device-mutating storage writes (fs_push, fs_mkdir). Off blocks them. |
FLIPPER_ENABLE_TX_TOOLS |
false |
Server-side gate for transmit/destructive CLI commands. Off blocks them regardless of the per-call flag. |
FLIPPER_ENABLE_FIRMWARE_FLASH |
false |
Server-side gate for flipperzero_firmware_install. Requires FLIPPER_ENABLE_WRITE_TOOLS=true as well. |
FLIPPER_DEBUG |
false |
Enable verbose debug logging. |
FLIPPER_FORCE_START_RPC_SESSION |
false |
Advanced/debug: force start_rpc_session even when probing suggests RPC mode is already active. |
With FLIPPER_TRANSPORT=auto (the default), the server tries USB first and only
falls back to WiFi when FLIPPER_WIFI_HOST is set.
| Tool | Description |
|---|---|
flipperzero_connection_health |
Report connection health (connected, transport, RPC responsiveness, last error). Optionally pings RPC. |
flipperzero_connection_reconnect |
Disconnect and reconnect, then report updated health. |
flipperzero_system_info |
Return device info (name, hardware, firmware), transport, and SD-card availability. |
flipperzero_system_power_info |
Return firmware-reported power/battery key-value pairs. |
flipperzero_system_protobuf_version |
Return the device protobuf RPC major/minor version. |
flipperzero_system_datetime |
Return the device date/time fields. |
flipperzero_fs_info |
Return storage capacity information for a path such as /ext. |
flipperzero_fs_stat |
Return metadata for a device file or directory. |
flipperzero_fs_timestamp |
Return the device timestamp for a file or directory. |
flipperzero_fs_list |
List a device directory; returns typed entries (name, type, size, optional md5). |
flipperzero_fs_mkdir |
Create a directory on the device storage. |
flipperzero_fs_delete |
Delete a file or directory on the device storage. |
flipperzero_fs_rename |
Rename or move a device file/directory. |
flipperzero_fs_push |
Upload a local file to the device and verify integrity against the device MD5. |
flipperzero_fs_pull |
Download a device file to the host and verify integrity against the device MD5. |
flipperzero_app_start |
Start a Flipper application via RPC; gated behind FLIPPER_ENABLE_WRITE_TOOLS. |
flipperzero_cli_exec |
Run one Flipper CLI command and return its output, completion flag, and risk classification. |
flipperzero_firmware_install |
Flash a firmware bundle to the device via USB. Destructive; gated by FLIPPER_ENABLE_FIRMWARE_FLASH=true + FLIPPER_ENABLE_WRITE_TOOLS=true + a confirm token matching the device name. |
CLI exec is USB-only; transmit/destructive commands require both
FLIPPER_ENABLE_TX_TOOLS=true on the server and i_accept_responsibility=true
on the call.
- CLI is USB-only.
flipperzero_cli_execneeds the Flipper text CLI shell, which only the USB CDC link carries. Over the WiFi bridge (protobuf-only) it returns a clear "CLI text mode unavailable over WiFi bridge" error. - No streaming/interactive commands. Commands that never return to the
>:prompt (e.g.subghz rx,ir rx,log) time out withcompleted=falseand partial output. Commands that expect interactive input are unsupported. - Transmit/destructive commands are double-gated. Both
FLIPPER_ENABLE_TX_TOOLS=true(operator, server-side) andi_accept_responsibility=true(per call) are required; either missing refuses the command. The risk classifier is an advisory ordered-prefix list that fails open — the env flag is the real boundary. Radio transmission is subject to local regulations; you are responsible for legal use. - Device writes are gated. Storage/app mutations need
FLIPPER_ENABLE_WRITE_TOOLS=true, default-off. - Distribution is git-clone +
uv. No PyPI package at this stage. - WiFi needs the ESP32 bridge running the harvested TCP↔UART firmware; that firmware is not built in CI.
Bundled MCP resources:
flipper://reference/cliflipper://reference/connectionflipper://reference/filesystemflipper://reference/systemflipper://workflow/install-appflipper://workflow/transfer-filesflipper://workflow/flash-esp32flipper://workflow/capture-replay
Prompts:
manage_flippertroubleshoot_connectionflipper_install— the/flipper-install <github_url>flagship: clone → ufbt build matched to the device firmware → md5-verified push → launch.flipper_doctor— the/flipper-doctorend-to-end connection/device diagnostic sweep.
uv sync --extra dev # install runtime + dev deps into .venv
uv run pytest -m "not integration" # default suite (no hardware required)
uv run ruff check && uv run ruff format --check
uv run ty checkIntegration tests (-m integration) need a real Flipper over USB or WiFi and are
local-only. See CLAUDE.md for project conventions and CONTRIBUTING.md.
Supported firmware. The server supports both Official firmware (channels
release, release-candidate, development; tested on 1.4.x) and Momentum
(mntm-012). The protobuf RPC layer is firmware-agnostic. The golden test
fixtures (tests/golden/) were captured on Momentum mntm-012 (protobuf RPC
0.25, build 2025-12-31). CLI text output and command availability can differ
between firmware flavors — re-validate and re-record fixtures
(make record-fixtures) after a firmware change.
The protobuf runtime is pinned to protobuf==6.33.5 (see CLAUDE.md).
flipperzero_system_info returns a firmware block: {flavor, version, origin_fork, origin_git, target}.
Flashing firmware (flipperzero_firmware_install). The tool pushes a
firmware bundle to /ext/update/<pkg>/ on the device and reboots into the
on-device updater. The source is either a local .tgz path or {flavor, channel, version} for auto-download (downloads Official from
update.flipperzero.one or Momentum from GitHub releases).
- Integrity. Bundles are verified by sha256 before transfer — Official via
the per-file
sha256indirectory.json; Momentum via the GitHub release asset digest. This is integrity verification over HTTPS, not GPG-signed provenance. - USB-only. Flashing requires USB. The device reboots into the on-device updater; the WiFi bridge cannot survive that reboot.
- Gating. Requires
FLIPPER_ENABLE_WRITE_TOOLS=trueANDFLIPPER_ENABLE_FIRMWARE_FLASH=true(both default-off), plus aconfirmargument that must equal the connected device's name. - Recovery. If flashing fails, the device enters DFU mode. Use qFlipper to recover. Momentum has no automatic OTA fallback.
ESP32 WiFi bridge. WiFi transport requires an ESP32 WiFi Dev Board running
the TCP↔UART bridge firmware shipped in firmware/tcp_uart_bridge/. See that
directory's README.md for ESP-IDF build/flash instructions and
docs/wifi_dev_board.md for the end-to-end setup guide. The firmware is
harvested as-is and is not built in CI.
Portions of this project (transport layer, protobuf RPC implementation, and the
ESP32 WiFi-bridge firmware) are harvested from
busse/flipperzero-mcp under the MIT
License. See NOTICE for details.
MIT. See LICENSE.