efferent-ble-simulator
Efferent имитирует периферийные устройства Bluetooth Low Energy (BLE) через реальный радиоканал (Linux BlueZ): умные тренажёры FTMS, велосипедные измерители мощности, датчики скорости/каденса и мониторы сердечного ритма. Он предоставляет MCP-сервер (stdio или HTTP), благодаря чему AI-агенты — и встроенная веб-панель — могут запускать, настраивать и контролировать симуляции так, как если бы управляли реальным тренажёром.
Возможности
4 типа устройств через реальный BLE-радиоканал: умный тренажёр FTMS (0x1826), велосипедная мощность (0x1818), скорость/каденс (0x1816), сердечный ритм (0x180D)
Полная поддержка контрольной точки FTMS: Request Control / Start / Stop / Reset / Set Target Power / Set Resistance / Set Indoor Bike Simulation Params
Динамическая симуляция: реалистичный дрейф мощности/каденса + физическая модель скорости (вес, уклон, Crr, CdA), 5 сценариев езды, включая скриптовый ride_script
Горячее обновление параметров: изменение параметров на лету — подключённый телефон сохраняет соединение и получает новые значения при следующем notify (без повторного сопряжения)
Именованные пресеты конфигураций: сохранение / загрузка / переименование / удаление до 20 именованных конфигураций, общих для MCP и панели
17 MCP-инструментов для агентов: управление, настройка, пресеты конфигураций, правила взаимодействия, сессии, логи, живое состояние устройства, версия
Веб-панель (React + shadcn/ui): статус, формы, шаблоны езды в один клик, правила взаимодействия, управление сессиями/конфигурациями, боковая панель живых логов
Docker Compose — развёртывание одной командой (MCP + панель + файл навыка по HTTP), длительная работа с проверками работоспособности
Версионирование: MCP
serverInfo.version+ble_get_versionпозволяют агентам обнаруживать обновления
Related MCP server: pyBTMCP
Среда выполнения
Требование | Подробности |
ОС | Только Linux — симулятор управляет хост-сервисом BlueZ через D-Bus |
BlueZ | ≥ 5.87 (в 5.86 есть ошибка регистрации рекламных объявлений) |
Оборудование | Для фактической трансляции требуется адаптер с поддержкой BLE (встроенный или USB-донгл) |
Политика D-Bus |
|
Docker | Контейнер mcp монтирует сокет D-Bus хоста; BLE-радио всегда остаётся на хосте |
Не поддерживается | macOS / Windows нативно (потребовался бы другой BLE-стек); без BLE-адаптера MCP-сервис работает, но ничего не передаётся |
Архитектура
┌──────────────┐ 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...)│
└───────────────────────────┘Типы устройств
Тип | BLE-сервис | Характеристики |
FTMS умный тренажёр | 0x1826 | FM Feature, Indoor Bike Data (notify), Control Point (write/indicate), Status, диапазоны Resistance/Power |
Велосипедная мощность | 0x1818 | Измерение мощности/каденса, данные колеса и шатунов |
Скорость/каденс (CSC) | 0x1816 | Счётчики оборотов колеса и шатунов |
Сердечный ритм | 0x180D | Измерение ЧСС, расположение датчика на теле, батарея |
Быстрый старт
Предварительные требования
Linux с BlueZ ≥ 5.87 (bluetoothd) и адаптером с поддержкой BLE
В BlueZ 5.86 есть ошибка регистрации рекламных объявлений; на ядрах со строгой проверкой MGMT каждый
RegisterAdvertisementзавершается ошибкой. Обновитесь заранее:sudo pacman -S bluez && sudo systemctl restart bluetooth(Arch) /sudo apt install bluez(Debian).Node.js ≥ 18
1. Нативная установка
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 записывает /etc/dbus-1/system.d/ble-simulator.conf — обязательно для регистрации GATT без прав root (без него устройство транслируется, но к нему нельзя подключиться).
2. Docker Compose (рекомендуется для серверов)
bash scripts/docker-up.sh # host prep (sudo, once) + build + startURL | Назначение |
| Конечная точка MCP |
| Веб-панель |
| Навык работы (для агентов) |
| Справочная страница панели |
Сборка без компиляции (готовый бинарник better-sqlite3); в ограниченных сетях используйте зеркало:
NPM_REGISTRY=https://registry.npmmirror.com \
BETTER_SQLITE3_BINARY_HOST_MIRROR=https://registry.npmmirror.com/-/binary/better-sqlite3 \
bash scripts/docker-up.shУправление: bash scripts/docker-up.sh status|logs|down
MCP-инструменты (17)
Инструмент | Назначение |
| Запуск / остановка / перезапуск симуляции |
| Состояние контроллера + активная конфигурация + живое состояние устройства (фаза/мощность/каденс/ЧСС) |
| Обновление конфигурации — горячее обновление на месте, если запущено с тем же типом устройства |
| Текущая/последняя конфигурация в JSON (для заполнения форм) |
| Сохранение текущих параметров как именованного пресета (макс. 20) |
| Список / просмотр сохранённых пресетов |
| Переименование / удаление пресета |
| Пользовательские правила ответов на BLE-записи |
| История сессий / подробности |
| Постоянные журналы связи (connect/write/notify/error) |
| Версии MCP + навыка, журнал изменений, URL навыка (для обнаружения обновлений) |
Пример
{
"method": "tools/call",
"params": {
"name": "ble_start",
"arguments": {
"deviceType": "ftms",
"ftms": { "simulation": { "enabled": true, "scenario": { "type": "ride_script" } } }
}
}
}Динамическая симуляция
Включается через simulation для 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" }
}Параметр | По умолчанию | Описание |
|
| Главный переключатель |
| 75 / 8 | Физика скорости (масса велосипедиста + велосипеда) |
| 0.004 / 0.35 | Сопротивление качению / площадь лобового сопротивления |
| 0 | Спад мощности в минуту (0 = нет) |
|
|
|
| 0.005 | Паузы-накаты на каждый тик |
|
| Начало езды без команды Start от приложения |
|
| Сценарий езды (ниже) |
Сценарии
steady— только естественная микро-вариацияfreeride(по умолчанию) — базовая мощность дрейфует ±20% каждые 60–180 сintervals— чередование высокой/низкой мощностиwarmup_main_cooldown— разминка → основная часть → заминкаride_script— скриптовая езда: последовательность действий (start / cruise / climb / sprint / coast / stop), каждое с целевой мощностью, уклоном и опциональным каденсом; автозапуск, зацикливание сrepeat: true,stopобнуляет мощность/каденс/скорость. Опуститеphases, чтобы использовать встроенный скрипт по умолчанию.
Горячее обновление и стабильный серийный номер
Горячее обновление:
ble_configureво время работы + тот же тип устройства применяет параметры на месте — подключённый телефон сохраняет соединение и получает обновлённые значения при следующем notify. Смена типа устройства всё равно вызывает перезапуск (новый серийный номер вынуждает повторное обнаружение).Стабильный серийный номер:
SIM_SERIAL_STABLE=1сохраняет серийный номер стабильным между сессиями одного типа (SIM001-FTMS), поэтому телефон может переподключиться после stop/start без удаления устройства.
Переменные окружения
Переменная | По умолчанию | Описание |
|
|
|
|
| Адрес прослушивания HTTP |
|
| Префикс транслируемого имени |
| — | Режим идентификатора экземпляра для имени устройства |
| не задано |
|
|
| Публичный URL навыка (возвращается |
Структура исходного кода
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 devicesДоступ к BLE-периферии осуществляется через D-Bus хост-сервиса BlueZ (контейнер монтирует сокет D-Bus хоста). См. docs/design/*.md — записи о проектировании.
Лицензия
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