
Servidor MCP impulsado por IA para Flipper Zero. Controla SubGHz, NFC, RFID, IR, BLE, GPIO y más por WiFi usando Claude o cualquier cliente MCP.
Un servidor MCP (Model Context Protocol) en Rust que se ejecuta directamente en la WiFi Dev Board v1 (ESP32-S2) del Flipper Zero, lo que permite a los agentes de IA controlar un Flipper Zero a través de la red.
Este proyecto coloca un servidor MCP en el propio Flipper. Cualquier cliente de IA compatible con MCP (Claude Desktop, Claude Code, etc.) puede conectarse y usar las capacidades del Flipper como herramientas — SubGHz, NFC, RFID, IR, GPIO, BadUSB, iButton, almacenamiento de archivos y más.
A diferencia de otros proyectos que requieren un ordenador host conectado por USB, flipper-mcp se ejecuta en el módulo WiFi ESP32-S2 conectado al Flipper. El Flipper se convierte en una herramienta autónoma y accesible por red.
LOCAL (same network):
MCP Client ──HTTP──► flipper-mcp.local:8080 (ESP32-S2) ──UART──► Flipper Zero
REMOTE (cross-network):
MCP Client ──HTTP──► Relay Server ◄──WebSocket── ESP32-S2 ──UART──► Flipper Zero
El ESP32-S2 ejecuta un servidor HTTP que implementa el protocolo MCP. Traduce las llamadas a herramientas MCP en comandos CLI del Flipper Zero a través de UART a 115200 baudios. Un servidor relay complementario permite el acceso remoto desde cualquier red.
flipper-mcp.local¿A qué dispositivo me conecto?
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install espup
espup install
source ~/export-esp.sh # Run this in every new terminal
cargo install espflash
cargo install ldproxy
sudo apt install -y git curl gcc build-essential pkg-config libudev-dev libssl-dev python3 python3-venv cmake ninja-build
Instrucciones completas de configuración en docs/SETUP.md
source ~/export-esp.sh
cd firmware
cargo build --release --target xtensa-esp32s2-espidf
espflash flash --monitor target/xtensa-esp32s2-espidf/release/flipper-mcp
Crea config.txt en la tarjeta SD del Flipper en SD:/apps_data/flipper_mcp/config.txt:
wifi_ssid=YourNetworkName
wifi_password=YourPassword
device_name=flipper-mcp
O configura directamente desde el Flipper usando el FAP complementario (ver Paso 5):
Apps → Tools → Flipper MCP → Configure WiFi
En el primer arranque sin archivo de configuración, el ESP32 espera y escribe status=needs_config en el archivo de estado. El FAP del Flipper mostrará esto en la pantalla Status.
Antes de configurar un cliente de IA, confirma que el servidor es accesible con curl:
# Quick health check
curl http://flipper-mcp.local:8080/health
# Full verification — initialize + list all available tools
./scripts/test-connection.sh
# If mDNS isn't resolving on your OS, pass the IP directly:
./scripts/test-connection.sh 192.168.x.xxx
Obtén la IP del Flipper desde el menú Flipper MCP → Status, y luego prueba:
Emisión de beacon BLE (transmitir un anuncio BLE falsificado):
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ble_beacon","arguments":{"data":"020106"}}}'
Teclado HID BLE (emular un teclado inalámbrico y escribir):
# Start HID emulation
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ble_hid_start","arguments":{}}}'
# Type a message
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"ble_hid_type","arguments":{"text":"Hello from Flipper!"}}}'
# Stop HID emulation
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"ble_hid_stop","arguments":{}}}'
Transmisión IR (enviar códigos de mando a distancia IR):
# NEC protocol IR code (generic TV power button)
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ir_tx","arguments":{"protocol":"NEC","address":"00","command":"01","repeat":0}}}'
Recepción SubGHz (escuchar señales inalámbricas en 433,92 MHz):
curl -X POST http://192.168.0.58:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"subghz_rx","arguments":{"frequency":433920000,"duration":5000}}}'
Sustituye 192.168.0.58 por la dirección IP real de tu Flipper.
Luego añade esto a tu configuración de Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"flipper": {
"url": "http://flipper-mcp.local:8080/mcp"
}
}
}
Instala la aplicación complementaria Flipper MCP desde flipper-app/ en el Flipper Zero. Compílala con ufbt y copia el .fap a SD:/apps/Tools/:
cd flipper-app && ufbt # produces flipper_mcp.fap
# Copy flipper_mcp.fap to your Flipper SD card under apps/Tools/
La aplicación aparece en Apps → Tools → Flipper MCP y proporciona:
La aplicación se comunica mediante archivos en la tarjeta SD (sin cableado adicional más allá del conector GPIO). Configure WiFi es el asistente de primer arranque — no requiere teléfono, navegador ni scripts de PC.
Autoalojado (ejecuta el binario donde quieras):
./scripts/build-relay.sh
./target/release/flipper-mcp-relay --listen 0.0.0.0:9090
# Then add relay_url to config.txt on the Flipper SD card:
# relay_url=ws://your-server:9090/tunnel
Despliegue en la nube (AWS o GCP, con TLS + DNS):
# Bootstrap state storage, then deploy
./infra/bootstrap/aws.sh # or ./infra/bootstrap/gcp.sh
cd infra/aws && cp terraform.tfvars.example terraform.tfvars
tofu init && tofu apply
# Outputs the relay URL and a ready-to-paste wifi-config.sh command
Consulta RELAY.md para las instrucciones completas.
Se pueden añadir herramientas personalizadas mediante archivos de configuración TOML o instalando aplicaciones FAP en la tarjeta SD. Consulta OPERATIONS.md para comandos curl listos para copiar y pegar de cada herramienta.
No necesitas una suscripción a Claude para usar flipper-mcp. Open WebUI es una interfaz gratuita y autoalojada al estilo ChatGPT que soporta de forma nativa MCP Streamable HTTP (v0.6.31+). Combínala con Ollama para un control del Flipper totalmente local y offline impulsado por IA.
# Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Pull a model with tool-calling support
ollama pull llama3.1 # 8B — good balance of speed and capability
# or: ollama pull qwen2.5 # strong tool-calling, good at structured output
# or: ollama pull mistral # lightweight, fast tool use
# Docker (recommended) — connects to Ollama on localhost automatically
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
-e WEBUI_AUTH=False \
-v open-webui:/app/backend/data \
--name open-webui \
ghcr.io/open-webui/open-webui:main
# Or without Docker:
pip install open-webui
open-webui serve
Abre http://localhost:3000 en tu navegador.
http://flipper-mcp.local:8080/mcp (o http://192.168.x.x:8080/mcp)https://relay.example.com/mcphttp://host.docker.internal:8080/mcp si el Flipper está en la red del host de DockerConsejo: En Workspace → Models → (tu modelo) → Advanced Parameters, establece Function Calling en Default para modelos más pequeños. Cambia a Native solo para modelos con un fuerte soporte de herramientas integrado (Llama 3.1 8B+, Qwen 2.5, Mistral).
Una vez conectado, prueba estos en el chat de Open WebUI:
Las tareas agénticas de varios pasos funcionan mejor con modelos más grandes (Llama 3.1 70B, Qwen 2.5 72B, o modelos en la nube mediante APIs compatibles con OpenAI). Los modelos más pequeños manejan llamadas de una sola herramienta de forma fiable.
flipper-mcp/
├── firmware/ # ESP32-S2 firmware (Rust, esp-idf-svc)
├── relay/ # Companion relay server (Rust, tokio/axum)
├── flipper-app/ # Flipper Zero FAP — in-device management UI (C, ufbt)
├── infra/ # OpenTofu IaC — cloud relay deployment (AWS + GCP)
├── config/ # Example module configurations
├── scripts/ # Build, flash, and setup helper scripts
└── docs/ # Architecture, setup, API, troubleshooting
Consulta AGENTS.md para obtener el contexto completo del proyecto, especificaciones técnicas, arquitectura del sistema y todo lo necesario para continuar el desarrollo de este proyecto.
MIT
| Etapa | Conectar a | Notas |
|---|
| Flashear firmware | USB-C de la WiFi Dev Board | La placa tiene su propio puerto USB, independiente del Flipper |
| Monitorización serie | USB-C de la WiFi Dev Board | La misma conexión USB que para flashear |
| Archivos de configuración en la SD | Tarjeta SD del Flipper Zero | Inserta la SD en el Flipper, o extráela y móntala en el PC |
| Comandos de control del servidor | Tarjeta SD del Flipper Zero | Crea el archivo server.cmd en apps_data/flipper_mcp/ |
| Comunicación UART | Automática | La WiFi Dev Board y el Flipper se conectan mediante el conector GPIO |
| Peticiones HTTP MCP | IP de la WiFi Dev Board:8080 | Conéctate a través de tu red WiFi |
| Pantalla | Qué hace |
|---|
| Status | Solicita una actualización de estado al ESP32, muestra IP, SSID, estado del servidor, versión |
| Start / Stop / Restart | Controla el ciclo de vida del servidor HTTP MCP |
| Reboot Board | Reinicia la WiFi Dev Board ESP32 |
| Configure WiFi | Teclado en pantalla para introducir SSID + contraseña; escribe config.txt en la tarjeta SD |
| View Logs | Registro de diagnóstico desplazable escrito por el ESP32 cada 30 s |
| Tools List | Lista desplazable de todas las herramientas MCP registradas actualmente en el ESP32 |
| Refresh Modules | Activa el reescaneo de descubrimiento de FAPs + recarga de modules.toml en el ESP32 |
| Categoría | Herramientas | Descripción |
|---|
| SubGHz | subghz_tx, subghz_rx, subghz_decode_raw, subghz_chat, subghz_tx_from_file | Operaciones de radiofrecuencia |
| NFC | nfc_detect, nfc_read, nfc_emulate, nfc_field | Interacción con etiquetas NFC |
| RFID | rfid_read, rfid_emulate, rfid_write | RFID de baja frecuencia |
| Infrarrojos | ir_tx, ir_rx | Mando a distancia IR |
| GPIO | gpio_read, gpio_write, gpio_set_mode | Control de E/S de pines |
| BadUSB | badusb_run, badusb_list | Ataques USB HID |
| iButton | ibutton_read, ibutton_emulate | Llaveros 1-Wire |
| Almacenamiento | storage_list, storage_read, storage_write, storage_remove, storage_stat | Gestión de archivos en la tarjeta SD |
| Sistema | system_device_info, system_power_info, system_power_reboot, system_ps, system_free, system_uptime | Gestión del dispositivo |
| BLE | ble_info, ble_beacon, ble_beacon_stop, ble_hid_start, ble_hid_type, ble_hid_press, ble_hid_mouse, ble_hid_stop | Bluetooth Low Energy (emisión de beacon + emulación HID) |
| Apps | app_launch_{name} (autodescubierto desde la tarjeta SD) | Gestión de aplicaciones |
| Prompt | Qué hace |
|---|
| "Scan for NFC tags near the Flipper" | Llama a nfc_detect para leer etiquetas cercanas |
| "List all files on the Flipper's SD card" | Llama a storage_list en /ext |
| "Transmit this SubGHz signal on 433.92 MHz: ..." | Llama a subghz_tx con la frecuencia indicada |
| "Read any RFID card that's presented to the Flipper" | Llama a rfid_read y devuelve los datos de la etiqueta |
| "What apps are installed on the Flipper?" | Llama a app_list para enumerar los FAPs instalados |
| "Send this IR signal to turn off the TV" | Llama a ir_tx con el protocolo y los datos especificados |
| "Show me the Flipper's system info and free memory" | Llama a system_info + system_free |
| "Read the NFC tag, then save its data to /ext/nfc/captured.nfc" | Varios pasos: nfc_read → storage_write |
| "Monitor 315 MHz for 10 seconds and decode anything you hear" | Llama a subghz_rx con frecuencia y duración |