
Serveur MCP alimenté par IA pour Flipper Zero. Contrôlez SubGHz, NFC, RFID, IR, BLE, GPIO et plus encore via WiFi en utilisant Claude ou tout client MCP.
Un serveur MCP (Model Context Protocol) en Rust qui s'exécute directement sur la WiFi Dev Board v1 (ESP32-S2) du Flipper Zero, permettant à des agents IA de contrôler un Flipper Zero sur le réseau.
Ce projet place un serveur MCP sur le Flipper lui-même. Tout client IA compatible MCP (Claude Desktop, Claude Code, etc.) peut se connecter et utiliser les capacités du Flipper comme outils — SubGHz, NFC, RFID, IR, GPIO, BadUSB, iButton, stockage de fichiers, et plus encore.
Contrairement à d'autres projets qui nécessitent un ordinateur hôte connecté en USB, flipper-mcp s'exécute sur le module WiFi ESP32-S2 attaché au Flipper. Le Flipper devient un outil autonome, accessible sur le réseau.
LOCAL (même réseau) :
Client MCP ──HTTP──► flipper-mcp.local:8080 (ESP32-S2) ──UART──► Flipper Zero
DISTANT (inter-réseaux) :
Client MCP ──HTTP──► Serveur relais ◄──WebSocket── ESP32-S2 ──UART──► Flipper Zero
L'ESP32-S2 exécute un serveur HTTP implémentant le protocole MCP. Il traduit les appels d'outils MCP en commandes CLI du Flipper Zero via UART à 115200 bauds. Un serveur relais compagnon permet l'accès distant depuis n'importe quel réseau.
flipper-mcp.localÀ quel appareil dois-je me connecter ?
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install espup
espup install
source ~/export-esp.sh # Exécutez ceci dans chaque nouveau 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
Instructions d'installation complètes dans 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
Créez config.txt sur la carte SD du Flipper à l'emplacement SD:/apps_data/flipper_mcp/config.txt :
wifi_ssid=YourNetworkName
wifi_password=YourPassword
device_name=flipper-mcp
Ou configurez directement depuis le Flipper à l'aide du FAP compagnon (voir Étape 5) :
Apps → Tools → Flipper MCP → Configure WiFi
Au premier démarrage sans fichier de configuration, l'ESP32 attend et écrit status=needs_config dans le fichier de statut. Le FAP du Flipper affichera cela sur l'écran Status.
Avant de configurer un client IA, confirmez que le serveur est joignable avec curl :
# Vérification rapide de l'état
curl http://flipper-mcp.local:8080/health
# Vérification complète — initialisation + liste de tous les outils disponibles
./scripts/test-connection.sh
# Si mDNS ne se résout pas sur votre OS, passez l'IP directement :
./scripts/test-connection.sh 192.168.x.xxx
Récupérez l'IP du Flipper depuis le menu Flipper MCP → Status, puis testez :
Diffusion de beacon BLE (émettre une annonce BLE usurpée) :
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"}}}'
Clavier HID BLE (émuler un clavier sans fil et taper) :
# Démarrer l'émulation HID
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":{}}}'
# Taper un 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!"}}}'
# Arrêter l'émulation HID
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":{}}}'
Émission IR (envoyer des codes de télécommande IR) :
# Code IR protocole NEC (bouton power TV générique)
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}}}'
Réception SubGHz (écouter les signaux sans fil sur 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}}}'
Remplacez 192.168.0.58 par l'adresse IP réelle de votre Flipper.
Ajoutez ensuite à votre configuration Claude Desktop (claude_desktop_config.json) :
{
"mcpServers": {
"flipper": {
"url": "http://flipper-mcp.local:8080/mcp"
}
}
}
Installez l'application compagnon Flipper MCP depuis flipper-app/ sur le Flipper Zero. Compilez avec ufbt et copiez le .fap dans SD:/apps/Tools/ :
cd flipper-app && ufbt # produit flipper_mcp.fap
# Copiez flipper_mcp.fap sur votre carte SD Flipper dans apps/Tools/
L'application apparaît dans Apps → Tools → Flipper MCP et fournit :
L'application communique via des fichiers sur carte SD (aucun câblage supplémentaire au-delà du connecteur GPIO). Configure WiFi est l'assistant de premier démarrage — aucun téléphone, navigateur ou script PC nécessaire.
Auto-hébergé (exécutez le binaire n'importe où) :
./scripts/build-relay.sh
./target/release/flipper-mcp-relay --listen 0.0.0.0:9090
# Ajoutez ensuite relay_url à config.txt sur la carte SD du Flipper :
# relay_url=ws://your-server:9090/tunnel
Déploiement cloud (AWS ou GCP, avec TLS + DNS) :
# Initialisez le stockage d'état, puis déployez
./infra/bootstrap/aws.sh # ou ./infra/bootstrap/gcp.sh
cd infra/aws && cp terraform.tfvars.example terraform.tfvars
tofu init && tofu apply
# Affiche l'URL du relais et une commande wifi-config.sh prête à coller
Voir RELAY.md pour les instructions complètes.
Des outils personnalisés peuvent être ajoutés via des fichiers de configuration TOML ou en installant des applications FAP sur la carte SD. Voir OPERATIONS.md pour des commandes curl prêtes à copier-coller pour chaque outil.
Vous n'avez pas besoin d'un abonnement Claude pour utiliser flipper-mcp. Open WebUI est une interface gratuite et auto-hébergée de type ChatGPT qui prend nativement en charge MCP Streamable HTTP (v0.6.31+). Associez-la à Ollama pour un contrôle du Flipper piloté par IA entièrement local et hors ligne.
# Installer Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Récupérer un modèle avec support d'appel d'outils
ollama pull llama3.1 # 8B — bon équilibre entre vitesse et capacités
# ou : ollama pull qwen2.5 # fort appel d'outils, bon en sortie structurée
# ou : ollama pull mistral # léger, utilisation d'outils rapide
# Docker (recommandé) — se connecte automatiquement à Ollama sur localhost
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
# Ou sans Docker :
pip install open-webui
open-webui serve
Ouvrez http://localhost:3000 dans votre navigateur.
http://flipper-mcp.local:8080/mcp (ou http://192.168.x.x:8080/mcp)https://relay.example.com/mcphttp://host.docker.internal:8080/mcp si le Flipper est sur le réseau de l'hôte DockerAstuce : Sous Workspace → Models → (votre modèle) → Advanced Parameters, réglez Function Calling sur Default pour les petits modèles. Ne passez à Native que pour les modèles avec un fort support d'outils intégré (Llama 3.1 8B+, Qwen 2.5, Mistral).
Une fois connecté, essayez ceci dans le chat Open WebUI :
Les tâches agentiques multi-étapes fonctionnent mieux avec des modèles plus grands (Llama 3.1 70B, Qwen 2.5 72B, ou des modèles cloud via des API compatibles OpenAI). Les petits modèles gèrent de manière fiable les appels à un seul outil.
flipper-mcp/
├── firmware/ # Firmware ESP32-S2 (Rust, esp-idf-svc)
├── relay/ # Serveur relais compagnon (Rust, tokio/axum)
├── flipper-app/ # FAP Flipper Zero — interface de gestion embarquée (C, ufbt)
├── infra/ # IaC OpenTofu — déploiement du relais cloud (AWS + GCP)
├── config/ # Exemples de configurations de modules
├── scripts/ # Scripts d'aide pour la compilation, le flash et l'installation
└── docs/ # Architecture, installation, API, dépannage
Voir AGENTS.md pour le contexte complet du projet, les spécifications techniques, l'architecture du système, et tout ce qui est nécessaire pour poursuivre le développement de ce projet.
MIT
| Étape | Se connecter à | Remarques |
|---|
| Flash du firmware | USB-C de la WiFi Dev Board | La carte possède son propre port USB, distinct du Flipper |
| Surveillance série | USB-C de la WiFi Dev Board | Même connexion USB que le flash |
| Fichiers de configuration sur carte SD | Carte SD du Flipper Zero | Insérez la SD dans le Flipper, ou retirez-la et montez-la sur le PC |
| Commandes de contrôle du serveur | Carte SD du Flipper Zero | Créez le fichier server.cmd dans apps_data/flipper_mcp/ |
| Communication UART | Automatique | La WiFi Dev Board et le Flipper se connectent via le connecteur GPIO |
| Requêtes HTTP MCP | IP de la WiFi Dev Board:8080 | Connectez-vous via votre réseau WiFi |
| Écran | Ce qu'il fait |
|---|
| Status | Demande une mise à jour fraîche du statut à l'ESP32, affiche l'IP, le SSID, l'état du serveur, la version |
| Start / Stop / Restart | Contrôle le cycle de vie du serveur HTTP MCP |
| Reboot Board | Redémarre la WiFi Dev Board ESP32 |
| Configure WiFi | Clavier à l'écran pour saisir le SSID + mot de passe ; écrit config.txt sur la carte SD |
| View Logs | Journal de diagnostic défilable écrit par l'ESP32 toutes les 30 s |
| Tools List | Liste défilable de tous les outils MCP actuellement enregistrés sur l'ESP32 |
| Refresh Modules | Déclenche une nouvelle analyse de découverte des FAP + rechargement de modules.toml sur l'ESP32 |
| Catégorie | Outils | Description |
|---|
| SubGHz | subghz_tx, subghz_rx, subghz_decode_raw, subghz_chat, subghz_tx_from_file | Opérations radiofréquences |
| NFC | nfc_detect, nfc_read, nfc_emulate, nfc_field | Interaction avec tags NFC |
| RFID | rfid_read, rfid_emulate, rfid_write | RFID basse fréquence |
| Infrarouge | ir_tx, ir_rx | Télécommande IR |
| GPIO | gpio_read, gpio_write, gpio_set_mode | Contrôle des entrées/sorties de broches |
| BadUSB | badusb_run, badusb_list | Attaques USB HID |
| iButton | ibutton_read, ibutton_emulate | Porte-clés 1-Wire |
| Stockage | storage_list, storage_read, storage_write, storage_remove, storage_stat | Gestion de fichiers sur carte SD |
| Système | system_device_info, system_power_info, system_power_reboot, system_ps, system_free, system_uptime | Gestion de l'appareil |
| 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 (diffusion de beacon + émulation HID) |
| Apps | app_launch_{name} (découvert automatiquement depuis la carte SD) | Gestion des applications |
| Prompt | Ce qu'il fait |
|---|
| « Scan for NFC tags near the Flipper » | Appelle nfc_detect pour lire les tags à proximité |
| « List all files on the Flipper's SD card » | Appelle storage_list sur /ext |
| « Transmit this SubGHz signal on 433.92 MHz: ... » | Appelle subghz_tx avec la fréquence donnée |
| « Read any RFID card that's presented to the Flipper » | Appelle rfid_read et renvoie les données du tag |
| « What apps are installed on the Flipper? » | Appelle app_list pour énumérer les FAP installés |
| « Send this IR signal to turn off the TV » | Appelle ir_tx avec le protocole et les données spécifiés |
| « Show me the Flipper's system info and free memory » | Appelle system_info + system_free |
| « Read the NFC tag, then save its data to /ext/nfc/captured.nfc » | Multi-étapes : nfc_read → storage_write |
| « Monitor 315 MHz for 10 seconds and decode anything you hear » | Appelle subghz_rx avec fréquence et durée |