efferent-ble-simulator
Efferent simula dispositivos periféricos Bluetooth Low Energy (BLE) a través de una radio real (Linux BlueZ): rodillos inteligentes FTMS, potenciómetros de ciclismo, sensores de velocidad/cadencia y pulsómetros de frecuencia cardíaca. Expone un servidor MCP (stdio o HTTP) para que los agentes de IA — y el panel web incluido — puedan iniciar, configurar y supervisar simulaciones como si controlaran un rodillo real.
Características
4 tipos de dispositivo sobre radio BLE real: rodillo inteligente FTMS (0x1826), potencia de ciclismo (0x1818), velocidad/cadencia (0x1816), frecuencia cardíaca (0x180D)
Soporte completo del punto de control FTMS: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params
Simulación dinámica: deriva de potencia/cadencia realista + modelo de velocidad basado en física (peso, pendiente, Crr, CdA), 5 escenarios de rodaje, incluido el ride_script con guion
Actualización de parámetros en caliente: cambia los parámetros mientras se ejecuta — el teléfono conectado mantiene su enlace y recibe los nuevos valores en la siguiente notificación (sin re-vinculación)
Presets de configuración con nombre: guardar / cargar / renombrar / eliminar hasta 20 configuraciones con nombre, compartidas entre MCP y el panel
17 herramientas MCP para agentes: control, configuración, presets de configuración, reglas de interacción, sesiones, registros, estado del dispositivo en vivo, versión
Panel web (React + shadcn/ui): estado, formularios, plantillas de rodaje con un clic, reglas de interacción, gestión de sesiones/configuraciones, panel lateral de registros en vivo
Docker Compose de despliegue con un solo comando (MCP + Panel + archivo de Skill por HTTP), de larga duración con comprobaciones de salud
Versionado:
serverInfo.versionde MCP +ble_get_versionpermiten a los agentes detectar actualizaciones
Related MCP server: pyBTMCP
Entorno de ejecución
Requisito | Detalle |
SO | Solo Linux — el simulador controla el BlueZ del host a través de D-Bus |
BlueZ | ≥ 5.87 (5.86 tiene un error de registro de anuncios) |
Hardware | Se requiere un adaptador compatible con BLE (integrado o dongle USB) para transmitir realmente |
Política D-Bus |
|
Docker | El contenedor mcp monta el socket D-Bus del host; la radio BLE siempre permanece en el host |
No compatible | macOS / Windows de forma nativa (requeriría una pila BLE diferente); sin ningún adaptador BLE, el servicio MCP se ejecuta pero no se transmite nada |
Arquitectura
┌──────────────┐ MCP protocol ┌───────────────────────────┐
│ AI Agent / │ ◄───────────────► │ MCP Server (HTTP :3300) │
│ MCP Client │ stdio / :3300 │ Web Dashboard (:3330) │
│ (Claude, │ └────────────┬──────────────┘
│ Codex, pi) │ │ BlueZ D-Bus (system bus)
└──────────────┘ ▼
┌───────────────────────────┐
│ Host Linux BlueZ │
│ bluetoothd + BLE adapter │
│ (D-Bus policy, ≥ 5.87) │
└────────────┬──────────────┘
│ HCI / radio
▼
┌───────────────────────────┐
│ BLE advertisement + GATT │
│ FTMS / Power / CSC / HR │
└────────────┬──────────────┘
│
┌────────────▼──────────────┐
│ Phone / Cycling App │
│ (Zwift, Garmin, Strava...)│
└───────────────────────────┘Tipos de dispositivo
Tipo | Servicio BLE | Características |
Rodillo inteligente FTMS | 0x1826 | FM Feature, Indoor Bike Data (notify), Control Point (write/indicate), Status, rangos de Resistencia/Potencia |
Potencia de ciclismo | 0x1818 | Medición de potencia/cadencia, datos de rueda y biela |
Velocidad/Cadencia (CSC) | 0x1816 | Contadores de revoluciones de rueda y biela |
Frecuencia cardíaca | 0x180D | Medición de FC, ubicación del sensor corporal, batería |
Inicio rápido
Requisitos previos
Linux con BlueZ ≥ 5.87 (bluetoothd) y un adaptador compatible con BLE
BlueZ 5.86 tiene un error de registro de anuncios; en kernels con validación MGMT estricta, cada
RegisterAdvertisementfalla. Actualiza primero:sudo pacman -S bluez && sudo systemctl restart bluetooth(Arch) /sudo apt install bluez(Debian).Node.js ≥ 18
1. Instalación nativa
npm install
npm run setup # sudo — installs D-Bus policy, enables bluetoothd, verifies GATT
npm run build
npm run start:http # HTTP mode on :3300 (or npm start for stdio)npm run setup escribe /etc/dbus-1/system.d/ble-simulator.conf — necesario para el registro GATT sin root (sin él, el dispositivo anuncia pero no se puede conectar).
2. Docker Compose (recomendado para servidores)
bash scripts/docker-up.sh # host prep (sudo, once) + build + startURL | Propósito |
| Endpoint MCP |
| Panel web |
| Skill de operación (para agentes) |
| Página de ayuda del panel |
Compilación sin compilar (binario precompilado de better-sqlite3); en redes restringidas usa un espejo:
NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.shGestión: bash scripts/docker-up.sh status|logs|down
Herramientas MCP (17)
Herramienta | Propósito |
| Iniciar / detener / reiniciar una simulación |
| Estado del controlador + configuración activa + estado del dispositivo en vivo (fase/potencia/cadencia/FC) |
| Actualizar configuración — se aplica en caliente si se ejecuta con el mismo tipo de dispositivo |
| Configuración actual/última como JSON (para rellenar formularios) |
| Guardar los parámetros actuales como preset con nombre (máx. 20) |
| Listar / ver presets guardados |
| Renombrar / eliminar un preset |
| Reglas personalizadas de respuesta a escrituras BLE |
| Historial de sesiones / detalle |
| Registros de comunicación persistentes (conexión/escritura/notificación/error) |
| Versiones de MCP + Skill, registro de cambios, URL del Skill (para detección de actualizaciones) |
Ejemplo
{
"method": "tools/call",
"params": {
"name": "ble_start",
"arguments": {
"deviceType": "ftms",
"ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
}
}
}Simulación dinámica
Actívala mediante simulation en FTMS / CyclingPower / CSC:
"simulation": {
"enabled": true,
"riderWeightKg": 75, "bikeWeightKg": 8, "crr": 0.004, "cdA": 0.35,
"fatigueFactor": 0.0005, "cadenceCoupling": "proportional", "microPauseProbability": 0.008,
"autoStart": true,
"scenario": { "type": "ride_script" }
}Parámetro | Valor predeterminado | Descripción |
|
| Interruptor principal |
| 75 / 8 | Física de velocidad (masa ciclista+bici) |
| 0.004 / 0.35 | Resistencia a la rodadura / área de arrastre |
| 0 | Decaimiento de potencia por minuto (0 = ninguno) |
|
|
|
| 0.005 | Pausas de inercia por tick |
|
| Empezar a rodar sin que una app envíe Start |
|
| Escenario de rodaje (abajo) |
Escenarios
steady— solo micro-variación naturalfreeride(predeterminado) — la potencia base varía ±20 % cada 60–180 sintervals— alternancia de potencia alta/bajawarmup_main_cooldown— calentamiento → parte principal → enfriamientoride_script— rodaje con guion: una secuencia de acciones de rodaje (start / cruise / climb / sprint / coast / stop), cada una con potencia objetivo, pendiente y cadencia opcional; se autoinicia, se repite conrepeat: true,stoppone potencia/cadencia/velocidad a cero. Omitephasespara usar el guion predeterminado integrado.
Actualización en caliente y serial estable
Actualización en caliente:
ble_configuremientras se ejecuta + mismo tipo de dispositivo aplica los parámetros en el lugar — el teléfono conectado mantiene su enlace y recibe los valores actualizados en la siguiente notificación. Los cambios de tipo de dispositivo siguen reiniciando (un serial nuevo obliga a redescubrir).Serial estable:
SIM_SERIAL_STABLE=1mantiene el serial estable entre sesiones del mismo tipo (SIM001-FTMS), de modo que un teléfono puede reconectarse tras detener/iniciar sin olvidar el dispositivo.
Variables de entorno
Var | Predeterminado | Descripción |
|
|
|
|
| Dirección de escucha HTTP |
|
| Prefijo del nombre anunciado |
| — | Modo de ID de instancia para el nombre del dispositivo |
| sin definir |
|
|
| URL pública del Skill (devuelta por |
Estructura del código fuente
src/
├── index.ts # entry, lifecycle
├── mcp-server.ts # 17 MCP tool definitions & handlers
├── ble-controller.ts # BlueZ D-Bus lifecycle, advertisement, hot-update
├── database.ts # SQLite layer (sessions / saved_configs / logs)
├── config.ts # config merge & defaults
├── version.ts # version single-source
├── simulator.ts # HeartRate / Battery simulators
├── cycling-simulator.ts # power/cadence simulators + physics + ride_script engine
└── devices/ # heart-rate / cycling-power / csc / ftms GATT devicesEl acceso al periférico BLE se realiza a través del D-Bus de BlueZ del host (el contenedor monta el socket D-Bus del host). Consulta docs/design/*.md para los registros de diseño.
Licencia
MIT © BLE Simulator Contributors
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.15BSD 2-Clause "Simplified"
- FlicenseNot gradedqualityNot gradedmaintenanceA BLE fitness device simulator that enables AI agents to control simulated heart rate monitors, treadmills, and cycling trainers via the Model Context Protocol. It integrates ESP32 firmware, an MQTT broker, and a FastAPI backend for comprehensive device management and real-time interaction.
- AlicenseAqualityCmaintenanceA stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.3517MIT
- FlicenseNot gradedqualityBmaintenanceExposes Garmin Connect data and workout management to AI agents, supporting tools, resources, and prompts for health data, workout creation, and coaching workflows.1
Related MCP Connectors
Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Build, validate, and deploy multi-agent AI solutions from any AI environment.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/dncore/efferent-ble-simulator'
If you have feedback or need assistance with the MCP directory API, please join our Discord server