Busy Bar MCP Server
A Python MCP server written with FastMCP that wraps the busybar_python_sdk to communicate with a physical Busy Bar device over HTTP. The Busy Bar is a digital time-management display — this MCP server provides 32 tools for account retrieval, system information, time operations, BLE control, and input events, exposing its functionality through the standard Model Context Protocol so other tools and AI assistants can interact with it programmatically.
Status: 32 MCP tools are fully implemented across account retrieval, system information, time operations, device state queries, BLE control, and input events, with a complete test suite documented in this README. The project is ready to use — see the What's Next section below for planned work.
Prerequisites
- Python ≥ 3.12 — the project pins Python 3.12+ (see
.python-version) - uv — dependency manager and virtual environment resolver
Installation
Clone the repository and install dependencies:
uv sync
This creates a virtual environment and installs all packages declared in pyproject.toml (including busybar_python_sdk).
Configuration
Copy the example .env.example file (if present) to create your own .env at the project root with the following variables.
| Variable | Description | Example |
|---|---|---|
BUSYBAR_API_TOKEN |
API auth token for authenticating with the Busy Bar device | my-super-secret-token |
BUSYBAR_BASE_URL |
IP address or hostname of the Busy Bar device (no protocol prefix) | 10.0.4.20 |
BUSYBAR_API_TOKEN=my-super-secret-token
BUSYBAR_BASE_URL=10.0.4.20
It is also possible to declare the variables before starting the server:
export BUSYBAR_API_TOKEN=my-super-secret-token && export BUSYBAR_BASE_URL=10.0.4.20
Usage
Set the BUSYBAR_API_TOKEN and BUSYBAR_BASE_URL environment variables (or place them in a .env file in the working directory), then start the MCP server:
# One-shot run via uvx (no local install required)
BUSYBAR_API_TOKEN=… BUSYBAR_BASE_URL=10.0.4.20 uvx busybar-mcp
# Or install locally and run the console script
uv sync
BUSYBAR_API_TOKEN=… BUSYBAR_BASE_URL=10.0.4.20 busybar-mcp
# Development (built-in MCP dev server / inspector)
uv sync
BUSYBAR_API_TOKEN=… BUSYBAR_BASE_URL=10.0.4.20 mcp dev -- uvx busybar-mcp
python -m busybar_mcp is equivalent to the console script and starts the same stdio server.
Once started, clients can connect to the server using their MCP transport.
MCP Tools
Account tools
| Tool | Description |
|---|---|
get_account_info |
Retrieve linked account information (email, account ID) from the Busy Bar device |
get_account_status |
Check MQTT connection state for the linked account |
get_account_backend |
Inspect MQTT backend configuration (server URL, certificate settings) |
System tools
| Tool | Description |
|---|---|
get_api_version |
Query the API version supported by the device |
get_transport |
Get the current network transport type (USB or Wi-Fi) |
get_device_status |
Comprehensive health check: device, firmware, system, and power state |
get_device_info |
Retrieve hardware identifiers and manufacturing details |
get_firmware_info |
Get firmware version and build metadata |
get_system_status |
Runtime system metrics (uptime, API SemVer, auto-update settings) |
get_power_status |
Battery charge level, voltage, current, and charging state |
Time tools
| Tool | Description |
|---|---|
get_time |
Retrieve the device's real-time clock timestamp in ISO 8601 format |
get_timezone |
Get the currently configured timezone (name, offset, abbreviation) |
get_tzlist |
List all supported timezones available for configuration |
Device Status & Configuration
| Tool | Description |
|---|---|
get_ble_status |
Retrieve BLE module status (powered state, MAC address) |
enable_ble |
Enable the BLE module and start advertising |
disable_ble |
Disable the BLE module and stop advertising |
remove_ble_pairing |
Remove the current BLE pairing so the device becomes discoverable again |
get_busy_snapshot |
Get the current BUSY timer state including profile and timing details |
get_http_access |
Inspect HTTP API key management mode and validity |
get_device_name |
Get the human-readable device name |
get_display_brightness |
Retrieve the current display brightness level |
get_audio_volume |
Retrieve the current audio volume level |
get_smart_home_pairing_status |
Query Matter fabric count and latest commissioning outcome |
get_smart_home_switch_state |
Read smart home relay/output state and startup behavior |
list_storage_files |
List files and directories on device storage (accepts optional path argument) |
get_storage_status |
Get storage capacity details (used, free, total bytes) |
get_firmware_update_status |
Check currently installed firmware and pending update state |
get_update_changelog |
Retrieve release notes for a specific firmware version (accepts required version argument) |
get_autoupdate_settings |
Get automatic update configuration (enabled, window start/end) |
get_wifi_status |
Get Wi-Fi connection details (SSID, signal strength, channel, security) |
get_wifi_networks |
Retrieve scanned available Wi-Fi networks in range |
Input tools
| Tool | Description |
|---|---|
send_input_key |
Send a single key-press event to the device (up, down, ok, back, start, busy, custom, off, apps, settings) |
Architecture
The project follows a thin-client layering:
- busybar_mcp — the package and its
mainentry point (busybar_mcp/__init__.py): loads.env, registers all tool modules on import, and callsserver.run(transport="stdio") - busybar_mcp/ — modularized MCP tools organized by Busy Bar API namespace:
┌───────────────────────────────┐ MCP/stdio ┌──────────────────┐ SDK calls ┌──────────────┐
│ MCP Client │ ◄──────────────────► │ busybar_mcp │ │ Busy Bar │
│ (AI tool) │ FastMCP tools │ (pkg + entry pt) │ ◄────────────────► │ Device │
└───────────────────────────────┘ └──────────────────┘ └──────────────┘
busybar_mcp/ (package with 10 namespace modules + utils) HTTP (OpenAPI)
busybar_python_sdk
busybar_mcp/account.py— account retrieval toolsbusybar_mcp/system.py— system information toolsbusybar_mcp/time.py— time operations toolsbusybar_mcp/ble.py— BLE module toolsbusybar_mcp/input.py— input event toolsbusybar_mcp/busy.py— busy timer toolsbusybar_mcp/settings.py— device settings toolsbusybar_mcp/smarthome.py— smart home toolsbusybar_mcp/storage.py— storage management toolsbusybar_mcp/updater.py— firmware update toolsbusybar_mcp/wifi.py— Wi-Fi status toolsbusybar_mcp/utils.py— shared utilities (_serialize,_wrap_tool_error)
- HTTP → Busy Bar device — the SDK communicates with the device over HTTP using the OpenAPI schema defined in
openapi.yaml
Testing
A working test suite is included with the project. The convenience runner at run_tests.py invokes pytest against the tests/ directory with sensible defaults and no-header output.
Run basic tests
python run_tests.py
Run with coverage output
COVERAGE=1 python run_tests.py
Coverage is reported via pytest-cov (--cov=busybar_mcp --cov-report=term-missing).
Test Coverage Summary
- 32 MCP tools tested — one parametrized happy-path test per tool across account, system info, time, BLE, busy timer, settings, smart home, storage, update, wifi, and input categories.
- Per-module test files:
tests/test_account.py,tests/test_system.py,tests/test_time.py,tests/test_ble.py,tests/test_busy.py,tests/test_settings.py,tests/test_smarthome.py,tests/test_storage.py,tests/test_updater.py,tests/test_wifi.py,tests/test_input.py
- Per-module test files:
- Error-path tests verify behaviour when the Busy Bar device is missing or unreachable (mocked HTTP failures).
- Missing environment variable tests confirm that absent
BUSYBAR_BASE_URL/BUSYBAR_API_TOKENare handled gracefully. - conftest fixtures:
clear_env_vars— temporarily removesBUSYBAR_BASE_URLandBUSYBAR_API_TOKENfromos.environ(restoring originals afterward).
- Serialization tests (
tests/test_serialization.py) verify_serialize()handles SDK models, dicts, lists, scalars, and edge cases correctly.
What's Next
- Extend with additional write/mutation tools (display messages, notifications)
- Implement MCP resources for live device data streams
- Configure linting and formatting toolchain
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file busybar_mcp-0.1.1.tar.gz.
File metadata
- Download URL: busybar_mcp-0.1.1.tar.gz
- Upload date:
- Size: 107.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a5cce554ea0b42c7370f75c782ba24fdc810720774d57ba479226c7b985b9ea
|
|
| MD5 |
81e96a98098ff5eb0fb83971ca257661
|
|
| BLAKE2b-256 |
fe5ffe2824061329d790ef8c8f7b1d7cd8344d0c93f857a4959e7efef5c60640
|
File details
Details for the file busybar_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: busybar_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 44.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37481f3d60a23548f655d622633e5319cebe6b771178c453a5ee6a7bbcd6df1c
|
|
| MD5 |
ed0b4474a515ab10cd78f259ccac4b97
|
|
| BLAKE2b-256 |
c0a1aad14fbe4e0ce691d947b54d9aa8a9d208c411ec273a63f453529d032b7b
|