Skip to main content
Glama
nuxnik

Busy Bar MCP Server

by nuxnik

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. 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

Related MCP server: TimePRO MCP Server

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

The server supports configuration through either a .env file or environment variables. The same two variables are required in both cases:

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

Using .env

Create a .env file in the project root:

BUSYBAR_API_TOKEN=my-super-secret-token
BUSYBAR_BASE_URL=10.0.4.20

The server loads .env when it starts.

Using environment variables

You can also configure the server through variables already present in the process environment:

export BUSYBAR_API_TOKEN=my-super-secret-token
export BUSYBAR_BASE_URL=10.0.4.20

Then start the server normally.

Configuration precedence

Environment variables take precedence over values in .env. The server loads .env with override=False, so an environment variable that has already been exported is never replaced by the value in .env.

For example, if .env contains:

BUSYBAR_BASE_URL=10.0.4.20

but the shell contains:

export BUSYBAR_BASE_URL=10.0.4.30

then 10.0.4.30 is used.

Usage

Set BUSYBAR_API_TOKEN and BUSYBAR_BASE_URL through either .env or the environment, 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 (inspecting/debugging the server with the MCP Inspector)
uv sync
BUSYBAR_API_TOKEN=… BUSYBAR_BASE_URL=10.0.4.20 uv run mcp dev --with-editable . mcp_entry.py:server

mcp_entry.py is a dev-only entry helper for use with mcp dev / the MCP Inspector: it loads .env (same precedence as the production entry point) and registers all tools on the server object, but is not a standalone server launcher. Production entry points remain busybar-mcp, uvx busybar-mcp, and python -m busybar_mcp (equivalent to the console script).

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 with a clear separation between MCP presentation, configuration, and device access:

┌───────────────────────────────┐      MCP/stdio       ┌──────────────────┐
│           MCP Client          │ ◄──────────────────► │   busybar_mcp    │
│         (AI tool)             │                      │                  │
└───────────────────────────────┘                      └────────┬─────────┘
                                                                │
                                      ┌─────────────────────────┼─────────────────────┐
                                      │                         │                     │
                                      ▼                         ▼                     ▼
                                  config.py                tools/              client.py
                                      │                         │                     │
                                      └─────────────────────────┼─────────────────────┘
                                                                │ SDK calls
                                                                ▼
                                                        busybar_python_sdk
                                                                │ HTTP
                                                                ▼
                                                          Busy Bar Device

Package structure

mcp_entry.py           # Repo-root dev-only entry file for mcp dev / MCP Inspector
busybar_mcp/
├── __init__.py       # Package API and entry point
├── __main__.py       # python -m busybar_mcp entry point
├── server.py         # MCP server and tool registration
├── client.py         # Busy Bar SDK client boundary
├── config.py         # Runtime configuration from environment
├── _server.py        # Backwards-compatible server import
├── utils.py          # Shared serialization/error utilities
└── tools/             # MCP tool modules and registration

The key responsibilities are:

  • server.py — creates the MCP server, registers the tool package, and starts the stdio transport.

  • config.py — reads BUSYBAR_BASE_URL and BUSYBAR_API_TOKEN from the process environment and validates that they are present.

  • client.py — provides the boundary between the MCP application and busybar_python_sdk.

  • tools/ — contains the MCP tool implementations and their registration.

  • utils.py — contains shared serialization and tool-error helpers.

  • __init__.py / __main__.py — provide the package and command-line entry points.

  • mcp_entry.py — repo-root dev-only entry file (loads .env, registers tools on server) for use with mcp dev; not part of the package or distribution.

At startup, server.py loads .env using load_dotenv(override=False). This means exported environment variables are preserved and take precedence over .env values.

The SDK communicates with the device over HTTP using the OpenAPI schema defined by 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.

  • Configuration tests verify required environment variables and configuration parsing.

  • 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_TOKEN are handled gracefully.

  • Serialization tests 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

Available Tools

28 tools
get_account_backendA

Retrieve MQTT backend configuration for the linked account from the Busy Bar device.

This tool queries GET /api/account/backend via `AccountApi.get_account_backend()` to
inspect how the device is configured to reach the busy bar server over MQTT.

Returns an AccountBackend object containing:
    - server_url (str): MQTT server URL to connect to (e.g., "default", "mqtts://mqtt.example.com:8883")
    - client_cert_type (str): Client certificate type, one of "default", "custom", or "none"
    - ignore_server_cert (bool): Whether to ignore the server certificate during TLS handshake

Use case:
    Inspect backend configuration during MQTT troubleshooting; confirm the server URL
    and certificate settings match expectations.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly states the HTTP method (GET), the return object type, and the meaning of each return field. It does not mention error conditions or authentication, but for a read-only configuration getter, this is adequate context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: a one-sentence summary, an explanation of the underlying API call, a bulleted list of return fields, and a use case. Every section adds value, and the structure makes the information easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has zero parameters and no output schema, the description fully compensates by detailing the return object structure and the practical use case. This is complete enough for an agent to understand what the tool does and when to invoke it, with no ambiguity relative to sibling getters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description has no parameter semantics to explain. According to the baseline for 0 parameters, a score of 4 is appropriate—the description correctly focuses on the return value and use case instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Retrieve') and resource ('MQTT backend configuration'), and immediately names the exact API method (GET /api/account/backend). This clearly distinguishes it from sibling getter tools like get_transport or get_account_info, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section provides explicit guidance on when to use the tool (during MQTT troubleshooting, confirming server URL and certificate settings). It does not name alternative tools, but the clear scenario is sufficient to guide selection among the many getter siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_infoA

Retrieve linked account information from the Busy Bar device.

This tool queries GET /api/account/info via `AccountApi.get_account_info()` to get
details about the account currently linked to the Busy Bar unit.

Returns an AccountInfo object containing:
    - linked (bool): Whether the device is linked to a busy bar account
    - id (str): The unique account identifier (UUID)
    - email (str): The email address associated with the account
    - user_id (str): The user identifier (UUID)

Use case:
    Verify an account is properly linked and inspect the associated email before
    performing account-specific operations like displaying messages or notifications.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses that this is a GET request and lists all return fields, but it does not explicitly state side effects (e.g., read-only) or error conditions. The endpoint and return structure provide some transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-line summary, implementation detail, bulleted return fields, and a use case. It is concise without being sparse, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple zero-parameter getter, the description covers the purpose, return object, and use case. It lacks explicit error handling details, but the provided information is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero parameters, so the description cannot conflict with it. The baseline for 0-param tools is 4; the description focuses on the operation and return object, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Retrieve linked account information from the Busy Bar device,' providing a specific verb and resource. It further details the exact API endpoint and method, distinguishing it from sibling tools like get_account_status and get_account_backend.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A dedicated 'Use case' section states 'Verify an account is properly linked and inspect the associated email before performing account-specific operations,' giving clear context for when to call this tool. It does not explicitly mention alternatives, but the use case is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_statusA

Retrieve MQTT connection status for the linked account from the Busy Bar device.

This tool queries GET /api/account/status via `AccountApi.get_account_status()` to
learn whether the device's MQTT client is actively connected to the busy bar server.

Returns an AccountStatus object containing:
    - status (str): Connection state, one of "connected", "disconnected", or "error"

Use case:
    Check MQTT connectivity before pushing data that requires cloud sync; if the
    account is not connected, queue operations locally until reconnection.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of explaining behavior. It discloses that it performs a GET request to a specific endpoint, returns an AccountStatus object with possible status values, and suggests a follow-up action based on the result. It does not explicitly state read-only or authentication details, but those are implied by the retrieve action and the simple nature of the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear first sentence, a technical detail, a return specification, and a practical use case. Every sentence adds value, and the use case is concise but illuminating. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description adequately explains the return format, including the status field and all possible values. It also provides a real-world scenario, making the tool's purpose and expected inputs/outputs fully clear for a parameterless operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so no parameter explanation is needed. Per the rubric, a baseline of 4 applies for parameterless tools. The description focuses instead on the return value and usage context, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve') and identifies a precise resource ('MQTT connection status for the linked account from the Busy Bar device'), making its purpose unmistakable. This distinguishes it clearly from sibling tools like get_transport or get_account_info, which cover different domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states a use case: 'Check MQTT connectivity before pushing data that requires cloud sync; if the account is not connected, queue operations locally until reconnection.' This gives the agent concrete guidance on when to call the tool, and implies when it may be unnecessary, with no comparable alternative among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_versionA

Retrieve the API version information supported by the Busy Bar device.

This tool queries /api/version on the device to learn which set of API
operations are available.  Returns the full version response including
api_semver and any other metadata the device exposes.

Returns a VersionInfo object containing:
    - api_semver (str): API SemVer string (e.g., "0.0.0")

Use case:
    Call this first when building integrations to verify API compatibility
    with the connected Busy Bar unit before issuing further commands.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It states that the tool 'queries /api/version' and returns 'the full version response including api_semver and any other metadata,' which clearly indicates a read-only network operation. It does not detail error conditions or prerequisites, but for a zero-parameter version check, the behavioral disclosure is adequate and non-contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the main purpose. It uses a brief paragraph for the operation, a bullet for the return type, and a short 'Use case' section. Every sentence adds value, with no redundancy or filler, making it highly concise yet informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters, no annotations, and no output schema, the description is complete. It covers the purpose, the underlying endpoint, the return object (VersionInfo with api_semver), and the recommended usage context. The sibling list confirms this is a standalone version inquiry, and the description fully equips an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is empty with 100% coverage. The description does not need to explain parameters, and the baseline for 0 params is 4. The description adds no parameter-specific semantics, but none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Retrieve the API version information supported by the Busy Bar device.' It further clarifies the scope by mentioning the underlying endpoint (/api/version) and the goal of determining available API operations, distinguishing it from sibling tools like get_firmware_info or get_device_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a dedicated 'Use case' section: 'Call this first when building integrations to verify API compatibility with the connected Busy Bar unit before issuing further commands.' This provides explicit when-to-use guidance, though it does not mention exclusions or alternatives, which keeps it one point below the maximum.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audio_volumeA

Retrieve the audio volume setting from the Busy Bar device.

This tool queries GET /api/audio/volume via `SettingsApi.get_audio_volume()`
to obtain the current volume level configuration.

Returns an AudioVolumeInfo object containing:
    - volume (int): Volume level as an integer value

Use case:
    Check or audit volume settings before playing audio notifications or tones;
    useful for confirming device is configured at an audible level.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of disclosing behavior. It explicitly mentions 'This tool queries GET /api/audio/volume' and 'Retrieve,' indicating a read-only operation. It also describes the return type (AudioVolumeInfo) and its single field, which is useful context. However, it does not discuss error cases or side effects, though for a simple getter these are minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, a concise implementation note, return value details, and a practical use case. It is slightly verbose with the 'Returns an AudioVolumeInfo object containing: - volume (int)' list, but that information is useful given the lack of an output schema. Every section contributes to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no parameters, no annotations, and no output schema, the description covers all necessary aspects: what it does, how it does it (GET endpoint), what it returns, and when to use it. It even mentions a real-world use case, which helps an agent decide to invoke it. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is empty. The baseline for zero parameters is 4, and the description appropriately does not attempt to explain parameters that do not exist. It adds no parameter-specific information, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve the audio volume setting from the Busy Bar device.' This uses a specific verb ('Retrieve') and resource ('audio volume setting'), and explicitly names the device. It distinguishes itself from sibling get_* tools by focusing on audio volume, which is unique among them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section provides a clear context: 'Check or audit volume settings before playing audio notifications or tones; useful for confirming device is configured at an audible level.' This tells an agent when to use the tool, but does not explicitly mention when not to use it or name alternatives. Since there are no sibling tools for audio volume, explicit exclusions are unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_autoupdate_settingsA

Retrieve automatic firmware update settings from the Busy Bar device.

This tool queries GET /api/update/autoupdate via `UpdaterApi.get_autoupdate_settings()`
to obtain the current autoupdate configuration.

Returns an AutoupdateSettings object containing:
    - is_enabled (bool): Whether automatic updates are enabled
    - interval_start (str): Start of the update window (e.g., "02:00")
    - interval_end (str): End of the update window (e.g., "04:00")

Use case:
    Confirm when or whether firmware updates happen automatically, to avoid unexpected
    reboots during active usage or schedule maintenance around the update window.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the tool queries GET /api/update/autoupdate and returns an AutoupdateSettings object with specific fields, which is useful. However, it does not mention potential side effects, error behavior, or network dependencies, leaving moderate gaps for a read-only network call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, technical details, return fields, and use case. It is slightly verbose (e.g., mentioning 'UpdaterApi.get_autoupdate_settings()' is arguably extra), but each sentence adds value and it remains readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately explains the return object fields (is_enabled, interval_start, interval_end) and provides a practical use case. It covers the essential information for a simple getter with no parameters, though it omits error conditions and edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is 100% vacuously. The description does not need to explain parameters, and it appropriately focuses on return value structure and use case. Baseline for zero parameters is 4, and nothing lowers it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Retrieve automatic firmware update settings from the Busy Bar device,' which is a specific verb+resource. It distinguishes from siblings like get_firmware_update_status by explicitly targeting autoupdate settings, and the details about the API endpoint reinforce the specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Confirm when or whether firmware updates happen automatically, to avoid unexpected reboots during active usage or schedule maintenance around the update window.' It gives practical context for when to use the tool, though it does not explicitly discuss alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ble_statusA

Retrieve BLE module status from the Busy Bar device.

This tool queries GET /api/ble/status via `BLEApi.get_ble_status()` to return
the current Bluetooth Low Energy module state.

Returns a BleStatusResponse object containing:
    - status (str): Current BLE status string (e.g., "powered_on", "powered_off")
    - address (str | null): BLE MAC address if available

Use case:
    Verify the BLE module is powered on and has a valid address before attempting
    Bluetooth operations like smart home pairing or device discovery.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses the underlying HTTP endpoint (GET /api/ble/status), the API method (BLEApi.get_ble_status()), and the exact response fields with types and example values. This goes well beyond a simple 'get status' and reveals the read-only nature implicitly, though it does not mention error conditions or access requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with an opening sentence, a technical detail sentence, a return field list, and a use case. Each section adds value, but it is slightly verbose compared to the two-sentence high benchmark. Still, it is well-organized and front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameterless getter with no output schema, the description covers the essential aspects: what it does, how it does it (endpoint/method), what it returns (with field types and examples), and when to use it. It lacks explicit error/disconnected device behavior, but the provided information is sufficient for an agent to invoke and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description needs no parameter documentation. The schema coverage is 100% (trivially), and the description adds no param semantics required. Baseline for 0 params is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb+resource: 'Retrieve BLE module status from the Busy Bar device.' It uniquely identifies BLE status among the sibling get_* tools, and the mention of returning status and address provides concrete scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section provides clear context: verify BLE module is powered on and has a valid address before Bluetooth operations like smart home pairing or device discovery. This gives strong guidance, though it does not explicitly name alternatives or exclusions, which prevents a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_busy_snapshotA

Retrieve the current BUSY timer snapshot from the Busy Bar device.

This tool queries GET /api/busy/snapshot via `BusyApi.get_busy_snapshot()` to
return the current BUSY timer state including active profile and timing details.

Returns a BusySnapshot object containing:
    - snapshot (BusySnapshotSnapshot): The busy snapshot data — varies by type:
        - BusySnapshotSimple: started (bool), remaining_ms (int)
        - BusySnapshotInterval: started, remaining_ms, interval_index, intervals_count
        - BusySnapshotInfinite: started (bool)
        - BusySnapshotNotStarted: fields not applicable
    - snapshot_timestamp_ms (int): Timestamp of the snapshot in milliseconds since epoch

Use case:
    Check what BUSY timer profile is currently active and how much time remains
    before scheduling display messages or other operations around the timer.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool queries a GET endpoint via BusyApi.get_busy_snapshot(), implying a read-only operation, and thoroughly explains the return structure for all snapshot variants. It lacks explicit mention of side effects, but the GET method strongly implies none.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, starting with a one-sentence summary, followed by API details, a nested list of return variants, and a use case. Every sentence provides necessary value, especially given the lack of an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a simple getter: it explains what it does, how it works, the exact return shape for every variant, and when to use it. There is no output schema, so the detailed return documentation is essential and fully provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is 100%, so the schema requires no explanation. The description adds meaning by detailing the return types and use case, which is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current BUSY timer snapshot from the Busy Bar device, using a specific verb and resource. It distinguishes from siblings by focusing on the BUSY snapshot, which no other sibling tool addresses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: checking the active BUSY profile and remaining time before scheduling operations. It does not explicitly mention when not to use it or name alternatives, but the context is clear for a simple getter tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_infoA

Retrieve detailed hardware and identification info about the Busy Bar device.

This tool queries GET /api/status/device via `SystemApi.get_status_device()` to obtain
physical identifiers and manufacturing details of the unit.

Returns a StatusDevice object containing:
    - serial_number (str): Device serial number
    - usb_mac (str): MAC address of the USB ethernet interface
    - wifi_mac (str): Wi-Fi MAC address
    - ble_mac (str): Bluetooth Low Energy MAC address
    - otp_valid (bool): Whether OTP data has been programmed and is valid
    - otp_model (str): Device model code (e.g., "BB.1")
    - otp_timestamp (int): Production timestamp as Unix epoch seconds
    - firmware_security (str): Firmware signature protection state — one of "secure",
      "insecure", "other", or "unknown"

Use case:
    Inventory tracking, device identification in multi-device setups, or
    troubleshooting hardware-specific issues.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses the underlying HTTP GET endpoint and method, and enumerates the complete StatusDevice return object with field types and meanings. This goes beyond a surface-level summary, though it omits potential error states or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a clear lead sentence, a compact API reference line, a bulleted list of return fields, and a brief use-case note. No filler or repetition; each sentence adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description precisely enumerates all returned fields and their meanings, and adds use cases. The behavior is fully explained for a no-argument getter, and it distinguishes itself from its many siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the description need not explain inputs. Baseline 4 applies; the empty input schema is fully consistent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Retrieve detailed hardware and identification info about the Busy Bar device,' a specific verb and resource. The detailed field list distinguishes it from sibling get_* tools like get_device_name and get_device_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit 'Use case' section lists inventory tracking, device identification, and troubleshooting. This gives clear context, though it does not name alternative tools or when not to use this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_nameA

Retrieve the device name configured on the Busy Bar device.

This tool queries GET /api/name via `SettingsApi.get_name()` to obtain
the human-readable name currently set for this unit.

Returns a NameInfo object containing:
    - name (str): The device name (e.g., "My Busy Bar")

Use case:
    Confirm or audit the display name shown on the device, especially useful in
    multi-device setups where each unit needs an identifiable label.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of behavioral disclosure. It explicitly details the underlying API call ('GET /api/name via SettingsApi.get_name()') and the return structure ('Returns a NameInfo object containing: name (str)'). This is transparent for a read-only operation, though it does not address error conditions or network requirements, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured. It front-loads the core purpose, then groups implementation detail, return data, and use case into clear sections. Every sentence contributes information without redundancy, making it highly readable and appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description is exceptionally complete. It covers what the tool does, how it works (API call), what it returns (with example), and when to use it. Combined with the sibling context, an agent has everything needed to decide on and invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, which yields a baseline of 4 per the rubric. The description does not need to elaborate on parameters; it instead enriches the tool's semantics by describing the return value, which adds meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific verb-resource pair: 'Retrieve the device name configured on the Busy Bar device.' This unambiguously states the tool's function and distinguishes it from sibling get_* tools, which target transport, account, status, etc. No ambiguity exists.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Confirm or audit the display name shown on the device, especially useful in multi-device setups.' This gives context for when to use the tool, though it does not explicitly name an alternative or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_statusA

Retrieve the current device status from the Busy Bar device.

This tool queries GET /api/status via `SystemApi.get_status()` and returns a comprehensive
overview of whether the device is online and healthy.  The response bundles four sub-objects:
device, firmware, system, and power.

Returns a Status object containing:
    - device (StatusDevice): Hardware identifiers — serial_number, usb_mac, wifi_mac,
      ble_mac, otp_valid, otp_model, otp_timestamp, firmware_security
    - firmware (StatusFirmware): Firmware details — version, target, branch, build_date,
      commit_hash, intercom_version, nwp_version, matter_version
    - system (StatusSystem): System metrics — api_semver, uptime, boot_time, auto_update_enabled
    - power (StatusPower): Power state — state (discharging/charging/charged), battery_charge
      (int %), battery_voltage (mV), battery_current (mA), usb_voltage (mV)

Use case:
    A quick health-check to confirm the device is reachable and in a valid
    operational state before issuing other commands.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It discloses the exact API call (GET /api/status via SystemApi.get_status()) and the complete response structure, covering all four sub-objects and their fields. It does not mention error behavior or explicitly state it is read-only, but the verb 'Retrieve' and the health-check context make the read-only nature clear. This is strong, but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although it is long, every sentence serves a purpose: purpose statement, method, detailed response breakdown, and use case. The bullet-list format makes the field details easy to scan, and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must fully explain the return value, and it does so exhaustively. It covers all four sub-objects and their specific fields, plus the use case. There is no missing context for a 0-parameter health-check tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, so the baseline is 4. The description correctly focuses on the return value instead of parameters, and there is no parameter information to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Retrieve the current device status from the Busy Bar device." It clearly distinguishes itself from sibling tools by explaining it returns a comprehensive bundle of device, firmware, system, and power sub-objects, which is more than any single sibling like get_device_info or get_system_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a clear use case: "A quick health-check to confirm the device is reachable and in a valid operational state before issuing other commands." This provides context for when to use it, though it does not explicitly name alternatives or state when not to use it, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_display_brightnessA

Retrieve the display brightness setting from the Busy Bar device.

This tool queries GET /api/display/brightness via `SettingsApi.get_display_brightness()`
to obtain the current screen brightness level.

Returns a DisplayBrightnessInfo object containing:
    - value (int): Brightness level as an integer percentage or stepped value

Use case:
    Check brightness before adjusting display behavior, or audit settings during
    device configuration management.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the underlying HTTP GET request and the return object (DisplayBrightnessInfo with an integer value), making the read-only nature clear. Given the absence of annotations, this is good coverage, though it does not address potential errors or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear lead sentence, technical detail, return type, and use case. It is slightly longer than strictly necessary but each sentence adds value, so it is appropriately sized without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple getter with no output schema and no annotations, the description is remarkably complete. It explains the purpose, the HTTP method, the return type and field, and a relevant use case. This fully equips an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the baseline for this dimension is 4. The description does not need to add parameter semantics since the schema is empty and no parameter information is provided or required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Retrieve the display brightness setting') and the resource ('Busy Bar device'), distinguishing it from the many sibling get_* tools that retrieve different settings. The verb 'retrieve' is precise and the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases ('Check brightness before adjusting display behavior, or audit settings during device configuration management') which clarifies when to use the tool. However, it does not discuss alternatives or when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firmware_infoA

Retrieve firmware version details from the Busy Bar device.

This tool queries GET /api/status/firmware via `SystemApi.get_status_firmware()` to get
information about the firmware currently installed on the unit.

Returns a StatusFirmware object containing:
    - version (str): Firmware version string (e.g., "1.0.0")
    - target (int): Firmware target code
    - branch (str): Git branch name the firmware was built from
    - build_date (str): Build date (e.g., "2024-01-01")
    - commit_hash (str): Git commit hash, may include a "-dirty" suffix
    - intercom_version (str): Intercom handshake version string
    - nwp_version (str): Radio firmware / NWP version (e.g., "1711.2.14.5.2.0.7")
    - matter_version (str): Matter framework version (e.g., "1.0")

Use case:
    Verify which firmware revision is running on a unit before deploying
    updates or diagnosing firmware-related bugs.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the tool queries a specific API endpoint and returns a StatusFirmware object with a detailed list of fields, which adds significant behavioral context. However, it does not explicitly state the operation is read-only, nor does it mention error handling or permission requirements. The GET verb and 'retrieve' imply non-destructive behavior, but the absence of explicit safety disclosure prevents a higher score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief introduction, a detailed return field list, and a clear use case section. It is appropriately sized for the tool's complexity, though the field list is somewhat long. Each sentence contributes useful information, and the structure aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool with no output schema, the description is quite complete. It includes the API endpoint, the full return object fields with examples, and a use case. It lacks mention of potential errors, authentication requirements, or rate limits, but for a simple read-only status query, the provided information is sufficient for an agent to invoke the tool and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and the schema already covers the empty parameter set completely. The description adds no parameter-related information, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves firmware version details from the Busy Bar device, and identifies the specific endpoint (GET /api/status/firmware). It distinguishes itself from siblings like get_firmware_update_status by focusing on the currently installed firmware, not update status. The verb 'retrieve' and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: verify firmware revision before deploying updates or diagnosing firmware-related bugs. This gives context for when to use the tool, but it does not explicitly mention when not to use it or point to alternative tools for related tasks such as update status or changelog.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firmware_update_statusA

Retrieve firmware update state from the Busy Bar device.

This tool queries GET /api/update/status via `UpdaterApi.get_firmware_update_status()`
to learn about the current and pending firmware states.

Returns an UpdateStatus object containing:
    - install (UpdateStatusInstall): The currently installed firmware info — version, etc.
    - check (UpdateStatusCheck): Status of the latest automatic or manual update check

Use case:
    Verify which firmware is running and whether a new update has been detected but
    not yet installed — useful for maintenance and rollout planning.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool sends a GET request to a specific endpoint, implying read-only behavior, and describes the returned UpdateStatus object. However, it does not explicitly state that there are no side effects, permission requirements, or error conditions, which would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with a clear purpose statement, then explaining the endpoint and return object, and ending with a 'Use case' section. Every sentence adds value without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description compensates by explaining the UpdateStatus object and its fields (install and check). It also provides a practical use case. It could add details on error handling or fields' meanings, but for a zero-parameter read tool, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to document. The description appropriately focuses on the return value instead of parameter details, which aligns with the baseline 4 for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve firmware update state from the Busy Bar device' with a specific verb and resource. It further clarifies the purpose by explaining the endpoint and the returned object, distinguishing it from sibling tools like get_firmware_info and get_update_changelog.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section explicitly indicates when to use this tool: 'Verify which firmware is running and whether a new update has been detected but not yet installed — useful for maintenance and rollout planning.' It provides clear context but does not mention when not to use it or name alternatives, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_http_accessA

Retrieve HTTP access configuration from the Busy Bar device.

This tool queries GET /api/access via `SettingsApi.get_http_access()` to obtain
the current HTTP API key management mode and validity state.

Returns an HttpAccessInfo object containing:
    - mode (str): HTTP access mode — one of "default", "custom_key", or "disabled"
    - key_valid (bool): Whether the configured key is currently valid

Use case:
    Inspect HTTP access configuration before deploying tools that rely on the device's
    HTTP API (e.g., remote messaging) to confirm the key setup is correct.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior itself. It reveals the tool is a read-only GET call (queries GET /api/access), returns an HttpAccessInfo object, and explains the two fields (mode and key_valid) along with possible enum values. This is substantial transparency, though it omits details like error handling or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and appropriately sized. The first sentence immediately states the purpose, followed by concise technical details and a use case. It avoids unnecessary fluff, though the implementation detail about the underlying SDK call adds a bit of length without affecting clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (no parameters, no output schema), the description fully explains what the tool does, what it returns (including field names and types), and when to use it. This is complete for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description correctly makes no mention of parameters, since there are none to explain. The schema is empty, so the description does not need to compensate for any parameter ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Retrieve HTTP access configuration from the Busy Bar device.' This specifically names the resource (HTTP access configuration) and the verb (retrieve), effectively distinguishing it from the many sibling get_* tools focused on other device aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Inspect HTTP access configuration before deploying tools that rely on the device's HTTP API to confirm the key setup is correct.' This gives contextual guidance on when to use the tool, though it does not name specific alternative tools or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_power_statusA

Retrieve power/battery status from the Busy Bar device.

This tool queries GET /api/status/power via `SystemApi.get_status_power()` to check
the current battery and charging state of the unit.

Returns a StatusPower object containing:
    - state (str): Power state — one of "discharging", "charging", or "charged"
    - battery_charge (int): Battery charge level as a percentage (0–100)
    - battery_voltage (int): Battery voltage in millivolts (e.g., 4183 mV)
    - battery_current (int): Battery current in milliamperes; negative means discharging
    - usb_voltage (int): USB input voltage in millivolts (e.g., 4843 mV)

Use case:
    Check battery health before operations that consume significant power;
    alert users when the device needs to be plugged in.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the HTTP GET method, the return object with all fields and types, and example values, giving a complete picture of the tool's behavior. Since this is a read-only operation, no side effects are expected, and the description adequately covers its scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with a concise one-line summary, followed by relevant technical details, a bulleted return schema, and a use case. While the endpoint and internal function names add extra detail, they are useful for debugging and understanding the tool's implementation. The structure is clear and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description fully documents the return object with field names, types, and example values. It also covers the use case and implementation. For a zero-parameter read-only tool, the description is complete and self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and the input schema is an empty object. The description correctly focuses on the return values and use case, so with zero parameters, the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Retrieve power/battery status from the Busy Bar device', using a specific verb and resource. It distinguishes itself from siblings by focusing on power/battery, and details the exact endpoint and function used.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Use case' section: 'Check battery health before operations that consume significant power; alert users when the device needs to be plugged in.' This provides clear context for when to use the tool, though it doesn't explicitly mention alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_smart_home_pairing_statusA

Retrieve smart home commissioning (pairing) status from the Busy Bar device.

This tool queries GET /api/smart_home/pairing via `SmartHomeApi.get_smart_home_commissioning_status()`
to learn how many Matter fabric entries exist and the latest pairing outcome.

Returns a SmartHomePairingInfo object containing:
    - fabric_count (int): Number of commissioned Matter fabrics
    - latest_pairing_status (str | null): Status of the most recent pairing attempt
        (e.g., "success", "failure", or null if no attempt yet)

Use case:
    Verify smart home device commissioning state before troubleshooting connectivity,
    confirming pairings, or starting a new setup flow.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool 'queries GET /api/smart_home/pairing' and returns a SmartHomePairingInfo object with specific fields, implying a safe read-only operation. However, it does not explicitly state that no state changes occur or mention any error behavior, which would have made it fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an initial one-line summary, a technical detail about the API call, a clear bulleted list of return fields, and a use case. It is somewhat verbose but each sentence carries useful information, and the front-loading is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters, no output schema), the description is thorough. It explains the underlying API endpoint, the exact return object fields with types and examples, and the use case. No critical information is missing for an agent to invoke or interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds value by explaining the return semantics (fabric_count and latest_pairing_status) and the meaning of the status values, which is useful given the absence of a parameter schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Retrieve smart home commissioning (pairing) status from the Busy Bar device,' which clearly states the verb (retrieve), resource (smart home commissioning status), and scope (from the Busy Bar device). It distinguishes from sibling tools by focusing specifically on pairing status rather than switch state or other smart home aspects, and provides specific return fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Verify smart home device commissioning state before troubleshooting connectivity, confirming pairings, or starting a new setup flow.' This indicates when to use the tool, but it does not explicitly mention alternatives or when not to use it, so it falls short of the full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_smart_home_switch_stateA

Retrieve smart home switch (output) state from the Busy Bar device.

This tool queries GET /api/smart_home/switch via `SmartHomeApi.get_smart_home_switch_state()`
to read the current relay/driver output configuration.

Returns a SmartHomeSwitchState object containing:
    - state (str): Current switch/output state (e.g., "on", "off")
    - startup (str | null): Startup behavior — what the switch does on power-on
        (e.g., "restore", "on", "off", "unknown")

Use case:
    Check whether a smart home relay is currently active or inspect its configured
    startup behavior to avoid unexpected device activation after power events.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden. It discloses that the tool reads via a GET request, returns a SmartHomeSwitchState object with 'state' and 'startup' fields, and explains the meaning of each field. This is sufficient behavioral transparency for a simple read-only getter, though it does not mention potential errors or authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections for the action, API call, return values, and use case. It is slightly verbose, including the API method name and a multi-line return description, but every sentence adds useful context. It is not excessively long for the level of detail provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, the description fully explains the return object's fields and their types/examples. The use case provides practical context. The tool is simple with no parameters, and this description covers all essential information for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters, so there is nothing for the description to add beyond what the input schema already shows. The baseline of 4 for zero-parameter tools is appropriate because the description does not need to explain parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the smart home switch (output) state from the Busy Bar device, using a specific verb and resource. It also distinguishes itself from sibling tools by focusing specifically on the switch state, not pairing status or other device attributes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Use case' section explaining when to use this tool: to check if a smart home relay is active or inspect startup behavior. However, it does not explicitly mention when not to use it or name specific alternatives, which would be needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_storage_statusA

Retrieve storage capacity information from the Busy Bar device.

This tool queries GET /api/storage/status via `StorageApi.get_storage_status()`
to learn current flash storage usage and available space.

Returns a StorageStatus object containing:
    - used_bytes (int): Bytes currently used on the device storage
    - free_bytes (int): Bytes available for writing
    - total_bytes (int): Total capacity of the storage

Use case:
    Check available storage before uploading files or media to confirm there is
    sufficient space, and monitor storage consumption over time.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explicitly discloses that the tool queries a GET endpoint, implying read-only behavior, and details the exact return fields (used_bytes, free_bytes, total_bytes). It doesn't mention error handling or auth, but for a simple read-only status getter, this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and concise. It starts with the main purpose, then gives the API method, a bulleted list of return fields, and a practical use case. No sentence is wasted, and the format is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and a simple read-only operation, the description is complete. It explains what the tool returns, why to use it, and how it differs from similar tools. It lacks error details, but that is not essential for this simple getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema covers 100%. The description adds no parameter-specific info, but none is needed. The baseline for zero parameters is 4, and the description appropriately notes the return structure instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to retrieve storage capacity information from the Busy Bar device. It uses a specific verb ('Retrieve') and resource ('storage capacity'), and distinguishes itself from sibling tools like list_storage_files by focusing on capacity rather than file listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: checking available storage before uploading files/media and monitoring consumption over time. While it doesn't explicitly mention alternatives or exclusions, the use case gives sufficient context for when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_statusA

Retrieve detailed system metrics from the Busy Bar device.

This tool queries GET /api/status/system via `SystemApi.get_status_system()` to get
runtime resource usage and health information.

Returns a StatusSystem object containing:
    - api_semver (str): API SemVer string (e.g., "0.0.0")
    - uptime (str): System uptime as a human-readable duration (e.g., "00d 00h 04m 13s")
    - boot_time (int): System boot timestamp as Unix epoch seconds
    - auto_update_enabled (bool): Whether automatic firmware updates are enabled

Use case:
    Monitor available system resources before performing heavy operations (e.g. large
    file uploads or firmware updates) to avoid exhausting the device.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the tool performs a GET request (implying read-only), and explicitly lists the return fields with types and descriptions. This gives a transparent picture of behavior, though it does not mention potential errors or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with a one-sentence summary, followed by technical context, a bulleted return-field list, and a practical use case. Every section adds value without unnecessary padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, parameterless tool, the description is complete. It explains what the tool does, the endpoint it calls, the return structure (since no output schema exists), and a specific usage scenario. The context signals indicate low complexity, and the description fully covers all necessary information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is empty. The baseline for 0 params is 4. The description correctly avoids adding unnecessary parameter info, and the schema coverage is 100% by virtue of having no properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the verb ('Retrieve') and resource ('detailed system metrics from the Busy Bar device'). It distinguishes itself from sibling tools like get_storage_status or get_power_status by focusing on system-wide resource usage and health information.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete use case: monitoring available system resources before heavy operations to avoid exhausting the device. This gives clear context for when to use the tool, though it does not explicitly name alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_timeA

Retrieve the current timestamp from the Busy Bar device's real-time clock.

This tool queries /api/time on the device and returns the current date and time
in ISO 8601 format with timezone information (e.g., '2025-10-02T14:30:45+04:00').

Returns a TimestampInfo object containing:
    - timestamp: str  — the current UTC/RFC timestamp in ISO 8601 format

Use case:
    Querying the device's clock as an authoritative time source for scheduling,
    logging, or coordinating events with BUSY timer profiles.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior itself. It states the endpoint (/api/time), the return object (TimestampInfo), the timestamp field, and the ISO 8601 format with timezone example. For a read-only getter, this is adequate transparency, though it doesn't explicitly mention being non-destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-sentence summary, then the endpoint and return format with an example, and a use-case paragraph. No redundant or unnecessary text; every sentence contributes to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description provides complete context. It covers what the tool does, how it works (endpoint), exactly what it returns (TimestampInfo with timestamp field and format), and when to use it. This fully compensates for the lack of structured output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description appropriately omits parameter details because there are none, and the schema coverage is already 100% (mirroring the empty properties).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear statement: 'Retrieve the current timestamp from the Busy Bar device's real-time clock.' This specifies the verb (retrieve), resource (timestamp/real-time clock), and distinguishes it from sibling tools like get_timezone. No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a 'Use case' section explaining this is for querying the device's clock as an authoritative time source for scheduling, logging, or coordinating with BUSY timers. This gives clear context, but doesn't explicitly contrast with alternatives; however, no sibling tool retrieves the current time, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_timezoneA

Retrieve the current timezone configured on the Busy Bar device.

This tool queries /api/time/timezone on the device and returns the currently
active timezone configuration including the display name, UTC offset, and
abbreviation.

Returns a TimezoneInfo object containing:
    - name:  str  — human-readable timezone name (e.g., 'America/New_York')
    - offset: str — UTC offset string (e.g., '-05:00', '+05:30')
    - abbr:   str — timezone abbreviation (e.g., 'EST', 'IST')

Use case:
    Checking which timezone the device is configured to so you can display
    times correctly or decide whether an update is needed.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosure. It explicitly states that the tool 'queries /api/time/timezone' and returns a TimezoneInfo object with fields (name, offset, abbr), making the read-only nature clear. It does not discuss error conditions or permissions, but for a zero-parameter fetch this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: a one-sentence summary, the endpoint path, a formatted list of return fields with types, and a practical use case. Every sentence contributes value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (zero params, no output schema), but the description fully specifies the return shape and types. It provides enough context for an agent to invoke the tool and interpret the result without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and the schema properties object is empty (100% coverage by default). The baseline of 4 applies, and the description adds no parameter-specific details because none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Retrieve') and resource ('current timezone configured on the Busy Bar device'), clearly stating the tool's function. It does not explicitly contrast with sibling tools like get_time or get_tzlist, but the phrase 'configured timezone' makes the intent distinct enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A 'Use case' section provides clear context for when to call this tool: 'Checking which timezone the device is configured to so you can display times correctly or decide whether an update is needed.' However, it does not mention when not to use it or name alternative tools, so it stops short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_transportA

Retrieve the current network transport type used by the Busy Bar device.

This tool queries /api/transport on the device.  The returned information
describes how the MCP server is communicating with the Busy Bar hardware —
typically "usb" (USB ethernet) or "wifi" (Wi-Fi).

Use case:
    Diagnose connectivity path issues; shows whether the device is reachable
    via USB network interface or a Wi-Fi connection.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the underlying API endpoint (/api/transport), the meaning of the returned information, and typical values ('usb' or 'wifi'). This is useful behavioral context beyond the schema, though it does not mention potential errors or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose. It includes an API endpoint, typical return values, and a use case in a small amount of text. It could be shorter, but all sentences contribute meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema), the description is fairly complete. It explains the purpose, the API endpoint, possible return values, and a use case. It stops short of describing the exact output format or error scenarios, but is sufficient for a basic getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema indicates no properties. The description accurately implies there are no inputs, so there is nothing to explain. The baseline score of 4 is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current network transport type used by the Busy Bar device, with a specific verb and resource. It distinguishes from sibling tools by focusing on transport type, which is unique among the listed get_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Diagnose connectivity path issues; shows whether the device is reachable via USB network interface or a Wi-Fi connection.' This gives context for when to use the tool, though it does not explicitly mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tzlistA

Retrieve the full list of supported timezones from the Busy Bar device.

This tool queries /api/time/tzlist on the device and returns every timezone
that can be used with the set_timezone functionality (/api/time/timezone POST).

Returns a TimezoneListResponse object containing:
    - list:  list[TimezoneInfo]  — an array of available timezones, each with:
        - name:  str  — human-readable timezone name (e.g., 'America/New_York')
        - offset: str — UTC offset string (e.g., '-05:00', '+05:30')
        - abbr:   str — timezone abbreviation (e.g., 'EST', 'IST')

Use case:
    Browsing the available timezones before choosing one to apply via set_timezone.
    Useful for building a UI dropdown or confirming that a specific named timezone is supported.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the behavioral burden. It clearly indicates a read-only query operation ('queries', 'returns') and documents the exact endpoint. It also details the return object structure, which provides strong transparency, though it could explicitly state it has no side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: a one-line summary, endpoint reference, structured return type with field explanations, and a use-case section. Every sentence adds value, and it is appropriately sized for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for this tool's complexity. It specifies the endpoint, return object fields, and practical use cases. Even without an output schema, it fully explains the returned timezone list, making the tool self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the parameter baseline is 4. The description correctly indicates the tool takes no parameters and focuses on what it returns, so no additional parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Retrieve the full list of supported timezones') targeting a specific resource (the Busy Bar device's /api/time/tzlist). It distinguishes itself from sibling get_timezone by focusing on the list of supported timezones rather than the current timezone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section explicitly explains when to use this tool: browsing timezones before setting one, building a UI dropdown, or confirming support. This provides clear guidance on when to use it versus alternatives like get_timezone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_update_changelogA

Retrieve the changelog for a specific firmware version from the Busy Bar device.

This tool queries GET /api/update/changelog via `UpdaterApi.get_update_changelog(version)`
to obtain release notes and change details for the given firmware version.

Args:
    version: The firmware version string to fetch the changelog for (e.g., "1.0.0").

Returns a GetUpdateChangelog200Response object containing:
    - changelog (str): Human-readable release notes and change log text

Use case:
    Review what changed in a specific firmware revision before deploying updates,
    or compare versions to understand new features and bug fixes.
ParametersJSON Schema
NameRequiredDescriptionDefault
versionYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It discloses the HTTP GET endpoint and the API method, and describes the return object and its changelog field. However, it doesn't address error behavior, missing versions, or authentication requirements, leaving some gaps for a network-dependent read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized into Intro, Args, Returns, and Use case sections. Every sentence contributes necessary information—endpoint, parameter details, return shape, and usage context—with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description is quite complete: it states the API endpoint, parameter format, return type, and use case. It could add error-handling details, but for a basic read-only changelog fetch, the coverage is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only states that 'version' is a string, but the description enriches it by explaining it is a 'firmware version string' and provides an example ('1.0.0'). This adds meaningful context beyond the bare schema, effectively compensating for zero schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Retrieve the changelog for a specific firmware version from the Busy Bar device.' It clearly distinguishes this tool from the many sibling status-getters by focusing on the update changelog resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete use case: 'Review what changed in a specific firmware revision before deploying updates, or compare versions to understand new features and bug fixes.' This gives clear context for when to use the tool, though it doesn't explicitly mention alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wifi_networksA

Retrieve currently scanned Wi-Fi networks from the Busy Bar device.

This tool queries GET /api/wifi/networks via `WiFiApi.get_wifi_networks()` to obtain
the latest scan results of available wireless access points in range.

Returns a NetworkResponse object containing:
    - count (int): Number of networks found in the scan
    - networks (list[Network]): Array of network entries, each with SSID, BSSID, RSSI,
      channel, security method, and frequency band information

Use case:
    Browse available Wi-Fi networks before switching the Busy Bar to a different
    access point or confirming signal quality at a new location.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that this is a GET request, returns the latest scan results, and details the response structure. It does not mention potential edge cases like empty scan results or whether the scan is triggered, but the read-only nature is clearly implied by 'Retrieve' and 'GET'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately sized and well-structured with clear sections for the return object and use case. It is a bit verbose but every sentence serves a purpose, and the structure improves readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the return values (count and network list with fields) and provides a use case. It lacks mention of error handling or empty results, but for a simple no-parameter getter, the description is sufficiently complete for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description does not need to add parameter details. The baseline for zero-parameter tools is 4, and the description appropriately avoids unnecessary parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves currently scanned Wi-Fi networks from the Busy Bar device, specifying the endpoint and method. It distinguishes itself from sibling tools like get_wifi_status by focusing on the list of available networks, not the current connection status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case (browsing networks before switching access points or checking signal quality) but does not explicitly mention when not to use it or contrast with sibling tools. The use case is specific enough to guide an agent, but exclusions are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wifi_statusA

Retrieve Wi-Fi connection status from the Busy Bar device.

This tool queries GET /api/wifi/status via `WiFiApi.api_wifi_status_get()` to obtain
the current network connection details on the Wi-Fi interface.

Returns a StatusResponse object containing:
    - state (str): Connection state — e.g., "connected", "disconnected"
    - ssid (str | null): SSID of the connected access point
    - bssid (str | null): MAC address of the connected access point
    - channel (int): Wi-Fi channel number (e.g., 1, 6, 36)
    - rssi (int): Received signal strength indicator in dBm (negative value)
    - security (str): Security type — e.g., "open", "wpa2", "wpa3"
    - ip_config (StatusResponseIpConfig): IP configuration including:
        - method (WifiIpType): How the IP was obtained ("dhcp" or "static")

Use case:
    Diagnostics for network troubleshooting — verify SSID, signal strength, security
    type, and IP assignment before debugging connectivity issues.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that the tool performs a GET request via 'WiFiApi.api_wifi_status_get()', indicating a read-only operation, and describes the complete return structure. It doesn't mention error cases, but the disclosed behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear purpose statement and uses structured bullet points for return fields. It is somewhat lengthy but every section adds value—purpose, API details, response schema, and use case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description alone must convey what the tool returns and when to use it. It does so thoroughly by listing all fields of StatusResponse and providing a diagnostic use case, making it fully complete for a simple getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is trivial. The description adds no parameter info but fully explains the response, which is appropriate. Baseline 4 is correct since there are no parameters to elaborate on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly says 'Retrieve Wi-Fi connection status from the Busy Bar device,' using a specific verb and resource. It clearly distinguishes from sibling tools like get_wifi_networks by focusing on the current connection status rather than available networks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use case' section provides clear context: 'Diagnostics for network troubleshooting — verify SSID, signal strength, security type, and IP assignment before debugging connectivity issues.' It implies when to use but does not explicitly name alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_storage_filesA

List files and directories stored on the Busy Bar device at a given path.

This tool calls `StorageApi.list_storage_files(path)` to enumerate the directory
contents on the device's internal storage for the specified path.

Args:
    path: The directory path to list (e.g., "/", "/photos"). Defaults to "/".

Returns a StorageList object containing:
    - A list of StorageListElement objects, each with:
        - type (str): File type — "file" or "dir"
        - name (str): Name of the file or directory

Use case:
    Browse device storage to find files before uploading, downloading, or managing
    media assets for display on the Busy Bar unit.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo/

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that it calls StorageApi.list_storage_files(path), enumerates directory contents, and returns a StorageList with file/dir elements. However, it does not describe error behavior (e.g., invalid/nonexistent path), sorting order, or whether the listing is recursive, which are relevant for an agent to predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening statement, an 'Args' section, a 'Returns' section, and a 'Use case' section. It is slightly verbose (e.g., 'enumerate the directory contents' followed by the return element list), but every sentence contributes to understanding the tool's behavior and purpose. It remains concise for the amount of information provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (one parameter, no output schema, no annotations), the description is quite complete. It covers what the tool does, the parameter semantics, the return structure, and a realistic use case. The only gap is the lack of error handling information, but that is not critical for a simple read-only list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'path' is explained thoroughly: 'The directory path to list (e.g., "/", "/photos"). Defaults to "/".' This adds meaning beyond the schema, which only shows a string with a default. The examples clarify the expected format and the default behavior, making the parameter easy to use correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'files and directories stored on the Busy Bar device at a given path.' It distinguishes itself from sibling getter tools by focusing on storage file enumeration, and includes specific details like the underlying StorageApi call. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'Browse device storage to find files before uploading, downloading, or managing media assets for display on the Busy Bar unit.' While it doesn't explicitly mention when not to use it or name alternative tools, the context is sufficient for an agent to select it for storage browsing tasks. Sibling tools are all get_* status/info commands, so this tool is clearly the only one for listing files.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 28 tool updatesv0.1.0
    • First observedget_account_backend
    • First observedget_account_info
    • First observedget_account_status
    • First observedget_api_version
    • First observedget_audio_volume
    • First observedget_autoupdate_settings
    • First observedget_ble_status
    • First observedget_busy_snapshot
    • First observedget_device_info
    • First observedget_device_name
    • First observedget_device_status
    • First observedget_display_brightness
    • First observedget_firmware_info
    • First observedget_firmware_update_status
    • First observedget_http_access
    • First observedget_power_status
    • First observedget_smart_home_pairing_status
    • First observedget_smart_home_switch_state
    • First observedget_storage_status
    • First observedget_system_status
    • First observedget_time
    • First observedget_timezone
    • First observedget_transport
    • First observedget_tzlist
    • First observedget_update_changelog
    • First observedget_wifi_networks
    • First observedget_wifi_status
    • First observedlist_storage_files

TDQS

A3.9/5.0

Scored across 28 tools

Disambiguation3/5

Most tools target distinct endpoints, but there is overlap between the comprehensive get_device_status and its individual sub-getters (e.g., get_device_info, get_firmware_info, get_system_status, get_power_status), which could lead to redundant calls. Similarly, get_transport and get_wifi_status both relate to network connectivity, and the three account getters (info/status/backend) are closely related, though descriptions help differentiate them.

Naming Consistency4/5

The naming pattern is overwhelmingly consistent: almost every tool follows get_<resource>. The only deviations are list_storage_files (uses 'list' instead of 'get') and get_tzlist (a slightly non-standard noun form for a list), but these are minor and do not seriously disrupt the overall pattern.

Tool Count2/5

28 tools is above the threshold where a toolset starts to feel heavy; the calibration suggests 25+ tools is too many. While each tool corresponds to a distinct device endpoint, the sheer number of read-only getters makes the surface feel bloated and could overwhelm an agent, especially since many are minor status variations.

Completeness2/5

The tool surface is entirely read-only—there are no set, update, create, or delete operations. This is a significant gap for a device management server, as users cannot change brightness, volume, timezone, device name, firmware update settings, or perform any configuration action. The description of get_tzlist even references set_timezone, implying such functionality should exist but does not.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    The Time MCP Server is a Model Context Protocol (MCP) server that provides AI assistants and other MCP clients with standardized tools to perform time and date-related operations. This server acts as a bridge between AI tools and a robust time-handling back
    43 npm
    25
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that wraps the TimePRO API, enabling AI assistants to automatically create, view, and manage timesheets for authenticated users. It provides tools for searching clients and projects, retrieving configuration defaults, and performing full CRUD operations on timesheet entries.
    10
    -
  • F
    license
    A
    quality
    F
    maintenance
    MCP server that exposes 300+ AI agents as tools via a single API key. Supports listing agents, invoking any agent with chat-completion style messages, checking agent health, and retrieving platform statistics.
    5
    3
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Lightweight MCP server providing system time tools (current time, date, datetime, time components, unix timestamp) for LLM applications.
    1
    MIT