- TypeScript 94%
- Shell 3.2%
- JavaScript 2.8%
| .github/workflows | ||
| docs/clients | ||
| hooks | ||
| src | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| .sanity-patterns.json | ||
| LICENSE | ||
| manifest.json | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| WHITEPAPER.md | ||
Dr. Dabber MCP
Control a Dr. Dabber Switch 2 over Bluetooth LE from any MCP client. Your device stays on your machine.
An MCP server that exposes the Dr. Dabber Switch 2 to any MCP-capable client (Claude Desktop, Claude Code, Cursor, ChatGPT, and more). Credentials and device info stay on your machine, in your own OS keychain or .env. Nothing is ever sent to the author of this repo.
60-second quickstart
Pick whichever install path fits your client. All four end up at the same place: a running drdabber-mcp server wired into your tool.
1. npx one-liner (Claude Code)
claude mcp add drdabber -- npx -y github:nidamen/drdabber-mcp
That's it. Restart Claude Code and the drdabber tools appear. Run the init wizard (path 3) to set up your device target first.
2. Desktop Extension (.mcpb double-click)
- Download
drdabber-mcp.mcpbfrom the latest release. - Double-click it. Claude Desktop opens an install dialog.
- Fill in the config fields (the same env vars listed below) and click Install.
No terminal required. The extension bundles the server and prompts you for the device name.
3. Guided wizard
npx github:nidamen/drdabber-mcp init
The wizard scans nearby BLE devices, lets you pick your Switch 2, stores the target securely (macOS Keychain via security add-generic-password, or a local .env elsewhere), prints the exact config line for your client, and runs a connection check so you know it works before you wire it in.
4. Proxy mode (optional)
If an always-on process already owns the BLE connection (e.g. a Raspberry Pi running a web control server), point the MCP at it instead:
DRDABBER_PROXY_URL=http://192.168.1.100:4477 npx -y github:nidamen/drdabber-mcp
Tools
| Tool | Description | Mutates? |
|---|---|---|
discover_switch2 |
Scan for nearby Switch 2 devices advertising the fee7 BLE service. | no |
connect_switch2 |
Connect to a Switch 2 and read device information. | no |
disconnect_switch2 |
Disconnect from the current Switch 2. | no |
get_device_info |
Return cached model, serial, firmware, and manufacturer information. | no |
get_status |
Refresh and return current device status (battery, temp, light mode, preset, session). | no |
get_presets |
Return cached preset temperatures, hold times, heating profiles, and custom points. | no |
set_active_preset |
Set the active vapor profile preset from 1 to 5. | yes |
set_preset_temperature |
Set a preset temperature (tempF or tempC). | yes |
set_preset_hold_time |
Set a preset hold time in seconds. | yes |
set_heating_profile |
Set preset heating profile (Steady/Ascent/Descent/Valley/Hill/Custom). | yes |
set_light_mode |
Set the active light mode from 0 to 17. | yes |
set_light_brightness |
Set light brightness from 0 to 100. | yes |
set_temp_unit |
Set displayed temperature unit (F or C). | yes |
start_session |
Start the active heating session. | yes |
stop_session |
Stop the active heating session. | yes |
extend_session |
Set session extension value from 0 to 9. | yes |
set_haptic_feedback |
Enable or disable haptic feedback. | yes |
set_auto_shutoff |
Set idle auto-shutoff timer in minutes (0 to disable). | yes |
set_device_name |
Rename the Switch 2 (1 to 29 printable ASCII characters). | yes |
start_cleaning_assist |
Start cleaning assist. | yes |
stop_cleaning_assist |
Stop cleaning assist. | yes |
OTA firmware updates, factory reset, and raw BLE writes are intentionally not exposed.
Configuration
These are read from your environment (or from the keychain entry the wizard creates). Never commit real values.
| Variable | Required | Description |
|---|---|---|
DRDABBER_SWITCH2_TARGET |
no | The BLE advertised name or hardware id of your Switch 2 (e.g. My Switch 2). If unset the server auto-connects to the first Switch 2 it finds. |
DRDABBER_PROXY_URL |
no | Base URL of an always-on web control process (e.g. http://localhost:4477). When set, commands are forwarded via HTTP instead of opening a local BLE connection. |
DRDABBER_KEYCHAIN_ACCOUNT |
no | macOS Keychain account name for the stored device target. Defaults to $USER. |
The device target is resolved at startup in this order: DRDABBER_SWITCH2_TARGET env var, then macOS Keychain (service drdabber-switch2-target, account $USER), then local .env. The init wizard stores it in the Keychain (macOS) or a local gitignored .env.
Per-client setup
Exact config snippets for each client:
Requirements
- Node.js >= 20
- Bluetooth LE adapter (macOS built-in, or USB dongle on Linux/Windows)
- macOS: grant the
nodeprocess Bluetooth permission in System Settings > Privacy > Bluetooth on first use
Security
Device info lives only on your machine, in your OS keychain or a local .env you control. This server talks directly from your machine to the Switch 2 over BLE. The author of this repo never receives your device information. See WHITEPAPER.md for the full security and threat model.