A native macOS MCP server for Bluetooth Low Energy testing. Works with any BLE device, with first-class support for FTMS fitness equipment.
brew install mint
mint install bmdragos/CoreBluetooth-MCP@1.0.5Add to ~/.claude/settings.json:
{
"mcpServers": {
"corebluetooth-mcp": {
"command": "/Users/YOUR_USERNAME/.mint/bin/corebluetooth-mcp"
}
}
}Run /mcp in Claude Code, then:
ble_scan # find devices
ble_connect identifier="My Device"
ble_services # see what's available
ble_read uuid="2A19" # read battery level
ble_scan- Scan for nearby BLE devices with optional name/service filtersble_connect- Connect to a device by name or UUIDble_disconnect- Disconnect from the current deviceble_status- Show connection state, device info, and signal strengthble_services- List all services on connected deviceble_characteristics- List characteristics with properties (read/write/notify)
ble_read- Read any characteristic by UUID with auto-decodingble_write- Write hex bytes or text to any characteristicble_subscribe- Subscribe to notifications from any characteristicble_unsubscribe- Stop notificationsble_descriptors- List descriptors for characteristics (CCCD, user description, etc.)ble_battery- Read battery level (if available)ble_device_info- Read manufacturer, model, serial, firmware
hrs_discover- Scan for heart rate monitorshrs_read- Read current heart rate (BPM)hrs_subscribe- Stream heart rate with min/max/avg and HRV statshrs_unsubscribe- Stop streaminghrs_location- Read sensor location (chest, wrist, etc.)
ftms_discover- Scan specifically for FTMS devices (service UUID 0x1826)ftms_info- Read FTMS Feature characteristic to show supported features
ftms_read- Single reading of Indoor Bike Data (power, cadence, speed)ftms_subscribe- Stream notifications with min/max/avg statsftms_unsubscribe- Stop streamingftms_monitor- Timed monitoring session with summary statistics
ftms_request_control- Request control of the fitness machineftms_set_power- Set target power in wattsftms_start- Start/resume workoutftms_stop- Stop/pause workoutftms_reset- Reset the device
ftms_test_sequence- Automated validation: request control, set power levels, verify readingsftms_log_start/ftms_log_stop- Log notifications to CSVftms_raw_read/ftms_raw_write- Raw characteristic access for debugging
> ftms_discover
Found 1 device(s):
Lode Bike (CC77AB70-...) RSSI: -36 dBm [Services: 1826]
> ble_connect identifier="Lode Bike"
Connected to Lode Bike
> ftms_info
Supported features: Target Power, Indoor Bike Data
> ftms_subscribe samples=10
Collected 10 samples in 5.2s
Power: 98W - 102W (avg: 100W)
Cadence: 88 - 92 rpm (avg: 90 rpm)
Last reading: 101W @ 91rpm
> ftms_request_control
Control granted
> ftms_set_power watts=150
Target power set to 150W
> ftms_read
Power: 150 W
Cadence: 85 rpm
> ftms_test_sequence power_low=100 power_high=200
═══════════════════════════════════════
FTMS Test Sequence Results
═══════════════════════════════════════
✓ Request Control: OK
✓ Set 100W: Command sent
✓ Read @ 100W: 100W @ 88rpm
✓ Set 200W: Command sent
✓ Read @ 200W: 199W @ 92rpm
═══════════════════════════════════════
Result: 5/5 steps passed
Status: ALL TESTS PASSED ✓
- macOS 13.0+
- Xcode 15+ / Swift 5.9+
- Bluetooth hardware
- Native performance - No bridging overhead, direct CoreBluetooth access
- No dependencies - Single binary, no npm/pip/runtime needed
- Inline testing - Test BLE firmware without leaving your IDE
- FTMS-first - Purpose-built for fitness device development
git clone https://github.com/bmdragos/CoreBluetooth-MCP.git
cd CoreBluetooth-MCP
swift build -c releaseBinary at .build/release/corebluetooth-mcp
git tag 1.1.0 && git push origin 1.1.0MIT
