Skip to main content
Glama
danroblewis

G1 UART MCP Server

by danroblewis

G1 UART MCP Server

A Model Context Protocol (MCP) server that provides tools for communicating with G1 devices over Bluetooth Low Energy (BLE) using the Nordic UART protocol.

Overview

This project implements an MCP server that enables AI assistants and other MCP clients to:

  • Scan for G1 Bluetooth devices

  • Connect to G1 devices

  • Send and receive messages using the Nordic BLE UART protocol

  • Monitor connection status and device information

  • NEW: Automatically monitor and maintain stable connections

  • NEW: Auto-reconnect on connection loss

  • NEW: Configurable connection monitoring parameters

The server is particularly designed for working with Even G1 devices, which appear to be paired left/right devices for audio applications.

Related MCP server: blew BLE MCP

Features

  • Device Discovery: Scan for available G1 devices with automatic side detection (left/right)

  • BLE Connection Management: Connect, disconnect, and monitor connection status

  • Nordic UART Protocol: Full support for the Nordic UART service (6E400001-B5A3-F393-E0A9-E50E24DCCA9E)

  • Message Communication: Send hex-formatted messages and receive responses

  • MCP Integration: Seamless integration with MCP-compatible AI assistants and tools

  • 🆕 Connection Monitoring: Automatic heartbeat and health checks to maintain stable connections

  • 🆕 Auto-Reconnection: Automatically attempt to reconnect if the connection is lost

  • 🆕 Configurable Settings: Adjustable heartbeat intervals, timeouts, and reconnection parameters

Prerequisites

  • Python 3.8+

  • macOS (tested on darwin 24.3.0)

  • Bluetooth Low Energy support

  • Access to G1 devices

Installation

Run directly from GitHub without installation:

uvx --from git+https://github.com/danroblewis/g1_uart_mcp g1-device-mcp

For MCP Configuration: Add this to your mcp.json:

{
  "mcpServers": {
    "g1-device-mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/danroblewis/g1_uart_mcp",
        "g1-device-mcp"
      ]
    }
  }
}

Option 2: Local Installation

  1. Clone the repository:

git clone <repository-url>
cd g1_uart_mcp
  1. Create a virtual environment:

python3 -m venv venv
source venv/bin/activate  # On macOS/Linux
  1. Install dependencies:

pip install -r requirements.txt

Configuration

The MCP server is configured via mcp.json. For the recommended uvx method, use this configuration:

{
  "mcpServers": {
    "g1-device-mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/danroblewis/g1_uart_mcp",
        "g1-device-mcp"
      ]
    }
  }
}

Alternative: Local Installation If you prefer local installation, update the paths to match your system:

{
  "mcpServers": {
    "g1-device-mcp": {
      "command": "/path/to/your/venv/bin/python",
      "args": [
        "/path/to/your/g1_uart_mcp/mcp_server.py"
      ]
    }
  }
}

Usage

Starting the MCP Server

The server can be started directly or through an MCP client:

uvx --from git+https://github.com/danroblewis/g1_uart_mcp g1-device-mcp

Local Installation

python mcp_server.py

Available Tools

1. Scan for G1 Devices

scan_g1_devices()

Scans for available G1 devices and returns a list with device information including name, ID, side (left/right), and signal strength.

2. Connect to G1 Device

connect_g1_device(address)

Connects to a specific G1 device by its address or UUID.

3. Get Connection Status

get_g1_connection_status()

Returns detailed information about the current connection including device details, UART service availability, and connection monitoring statistics.

4. Send Message

send_g1_message(hex_data)

Sends a hex-formatted message to the connected device and waits for a response. Now includes automatic connection health checks and reconnection attempts.

5. Disconnect

disconnect_g1_device()

Disconnects from the currently connected device.

6. 🆕 Configure Connection Settings

configure_g1_connection_settings(
    heartbeat_interval=5.0,
    connection_timeout=30.0,
    auto_reconnect_enabled=True,
    max_reconnect_attempts=3,
    reconnect_delay=2.0
)

Configures connection monitoring and auto-reconnection parameters.

Example Workflow

  1. Scan for devices:

    devices = scan_g1_devices()
    # Returns list of available G1 devices
  2. Connect to a device:

    result = connect_g1_device("device_uuid_or_address")
  3. Configure connection monitoring (optional):

    configure_g1_connection_settings(
        heartbeat_interval=3.0,  # More frequent heartbeats
        auto_reconnect_enabled=True
    )
  4. Send a message:

    response = send_g1_message("2506")
    # Sends command 0x25 with data 0x06
    # Connection is automatically monitored and maintained
  5. Check status:

    status = get_g1_connection_status()
    # Now includes connection duration, last activity, and reconnection info
  6. Disconnect:

    disconnect_g1_device()

Connection Monitoring & Auto-Reconnection

How It Works

The enhanced MCP server now includes robust connection management:

  1. Heartbeat Monitoring: Sends periodic ping messages (every 5 seconds by default) to keep the connection alive

  2. Health Checks: Regularly verifies the connection is still responsive

  3. Auto-Detection: Automatically detects when the connection is lost

  4. Smart Reconnection: Attempts to reconnect up to 3 times with configurable delays

  5. Background Monitoring: All monitoring happens in the background without blocking message sending

Configuration Options

  • heartbeat_interval: How often to send heartbeat messages (default: 5 seconds)

  • connection_timeout: Maximum connection duration before health check (default: 30 seconds)

  • auto_reconnect_enabled: Whether to automatically attempt reconnection (default: True)

  • max_reconnect_attempts: Maximum number of reconnection attempts (default: 3)

  • reconnect_delay: Delay between reconnection attempts (default: 2 seconds)

Benefits

  • Stable Connections: Significantly reduces unexpected disconnections

  • Automatic Recovery: No manual intervention needed when connections drop

  • Better Reliability: Especially important for the critical send_g1_message command

  • Configurable: Adjust settings based on your specific use case and device behavior

Example Files

  • example_connect.py - Demonstrates device connection

  • example_scan.py - Shows device scanning functionality

  • example_send_message.py - Example of sending messages

  • example_tools.py - Comprehensive tool usage examples

  • 🆕 test_connection_monitoring.py - Demonstrates the new connection monitoring features

Architecture

Core Components

  • mcp_server.py: Main MCP server implementation with tool definitions and connection configuration

  • g1_uart_manager.py: Enhanced BLE UART protocol manager with connection monitoring and auto-reconnection

  • mcp.json: MCP server configuration

BLE UART Protocol

The server implements the Nordic UART service:

  • Service UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E

  • TX Characteristic: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E (Write)

  • RX Characteristic: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E (Notify)

Dependencies

  • mcp: Model Context Protocol implementation

  • bleak: Cross-platform Bluetooth Low Energy library

Troubleshooting

Common Issues

  1. Permission Denied: Ensure Bluetooth permissions are granted to your application

  2. Device Not Found: Verify the device is in range and discoverable

  3. Connection Failed: Check if the device is already connected to another client

  4. Message Timeout: Ensure the device is responsive and supports the Nordic UART protocol

  5. 🆕 Frequent Disconnections: Try adjusting connection monitoring settings or check device power management

Debug Mode

Enable debug logging by modifying the logging level in mcp_server.py:

logging.basicConfig(level=logging.DEBUG)

Connection Issues

If you're experiencing frequent disconnections:

  1. Check connection monitoring settings:

    status = get_g1_connection_status()
    print(f"Auto-reconnect: {status['auto_reconnect_enabled']}")
    print(f"Reconnect attempts: {status['reconnect_attempts']}")
  2. Adjust heartbeat frequency:

    configure_g1_connection_settings(heartbeat_interval=3.0)
  3. Increase reconnection attempts:

    configure_g1_connection_settings(max_reconnect_attempts=5)
  4. Check device power settings: Some devices may go to sleep mode, causing disconnections

Contributing

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Add tests if applicable

  5. Submit a pull request

License

[Add your license information here]

Support

For issues and questions, please create an issue or contact the maintainers.

Available Tools

5 tools
connect_g1_deviceA

Connect to a G1 device by address.

Args:
    address (str): The Bluetooth MAC address of the G1 device to connect to.
                  Format should be XX:XX:XX:XX:XX:XX where X are hexadecimal characters.
                  Example: "AA:BB:CC:DD:EE:FF"

Returns:
    Dict[str, Any]: JSON response with connection status including:
        - result: "success" or "error"
        - connected: Boolean indicating connection state
        - device_name: Name of connected device (if successful)
        - device_address: Address of connected device (if successful)
        - error: Error message if connection failed
    
Note:
    This establishes a BLE connection to the specified device and discovers
    the Nordic UART service and characteristics.
ParametersJSON Schema
NameRequiredDescriptionDefault
addressYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 this establishes a BLE connection and discovers specific services/characteristics, which is useful behavioral context. However, it doesn't mention potential side effects (e.g., if it disconnects existing connections), authentication needs, rate limits, or error handling beyond the return structure. The description doesn't contradict any annotations.

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 with clear sections (Args, Returns, Note), front-loaded purpose, and no redundant information. Each sentence adds value: the first states the action, followed by parameter details, return values, and behavioral notes. It's appropriately sized for the tool's complexity.

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 1 parameter with no schema coverage and an output schema present, the description is largely complete. It fully documents the parameter and return structure, and adds behavioral context about BLE and Nordic UART. However, as a connection tool with no annotations, it could benefit from more operational details like timeout behavior or connection persistence.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description fully compensates. It provides detailed semantics for the single parameter 'address', including format requirements (XX:XX:XX:XX:XX:XX with hexadecimal characters), an example ('AA:BB:CC:DD:EE:FF'), and clarifies it's a Bluetooth MAC address for the G1 device.

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 ('Connect to a G1 device by address') and distinguishes it from siblings like 'disconnect_g1_device', 'get_g1_connection_status', 'scan_g1_devices', and 'send_g1_message'. It specifies the resource (G1 device) and mechanism (Bluetooth/BLE connection).

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 implies usage context by mentioning BLE connection and Nordic UART service discovery, which suggests this is for establishing communication with a specific device. However, it doesn't explicitly state when to use this versus alternatives like 'scan_g1_devices' for discovery or 'get_g1_connection_status' for checking state, nor does it mention prerequisites like device availability.

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

disconnect_g1_deviceA

Disconnect from the current G1 device.

Returns:
    Dict[str, Any]: JSON response with disconnection status including:
        - result: "success" or "error"
        - disconnected: Boolean indicating disconnection state
        - device_name: Name of previously connected device (if successful)
        - error: Error message if disconnection failed
    
Note:
    This closes the BLE connection to the currently connected device,
    cleans up resources, stops the heartbeat mechanism, and resets connection state.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden and delivers comprehensive behavioral disclosure. It details the multi-step process: closes BLE connection, cleans up resources, stops heartbeat mechanism, and resets connection state. This goes far beyond just stating the action.

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?

Perfectly structured with clear sections: purpose statement, returns documentation, and behavioral notes. Every sentence adds value - no redundancy or wasted words. The information is front-loaded with the core action first.

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 tool with no annotations but with output schema, the description provides complete context. It explains the action, detailed behavioral consequences, and documents the return structure, making the output schema documentation redundant but helpful for reinforcement.

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 with 100% schema description coverage, so the baseline would be 4. The description appropriately doesn't discuss parameters since none exist, maintaining focus on the tool's purpose and behavior.

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 ('Disconnect from') and target resource ('the current G1 device'), distinguishing it from siblings like connect_g1_device and get_g1_connection_status. It goes beyond the tool name by specifying it's about BLE connection termination.

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?

Explicitly states when to use ('Disconnect from the current G1 device') and implies when not to use (when no device is connected). The sibling tools provide clear alternatives for other operations like connecting, checking status, scanning, or sending messages.

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

get_g1_connection_statusA

Get current connection status and device info.

Returns:
    Dict[str, Any]: JSON response with detailed connection status including:
        - result: "success" or "error"
        - connected: Boolean indicating connection state
        - device_name: Name of connected device (if connected)
        - device_address: Address of connected device (if connected)
        - uart_service_available: Boolean indicating UART service availability
        - tx_characteristic_available: Boolean indicating TX characteristic availability
        - rx_characteristic_available: Boolean indicating RX characteristic availability
        - pending_messages_count: Number of pending messages
        - total_messages: Total message count
        - error: Error message if status check failed
    
Note:
    This returns detailed status information including:
     - Connection state (connected/disconnected)
     - Device name and address (if connected)
     - UART service availability
     - Number of pending messages
     - Total message count
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 of behavioral disclosure. It effectively describes the tool's read-only nature by specifying it 'returns' status information without indicating any mutations. However, it does not address potential side effects, error handling beyond the 'error' field, or performance characteristics like latency or rate limits.

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 front-loaded, starting with a clear purpose statement followed by a detailed return specification. However, the 'Note' section is somewhat redundant with the 'Returns' section, repeating information about connection state and device details, which slightly reduces efficiency.

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 complexity (status retrieval with detailed output), the description is complete. It fully explains the return values, compensating for the lack of annotations and output schema by detailing each field in the JSON response. The context signals (0 parameters, output schema true) are adequately addressed, making the tool's behavior clear for an AI agent.

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 input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately focuses on output semantics, detailing the return structure comprehensively. This adds significant value beyond the schema by explaining the meaning of each field in the response, such as what 'pending_messages_count' represents.

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 with specific verbs ('Get current connection status and device info') and identifies the exact resource (G1 device connection status). It distinguishes from siblings like connect_g1_device, disconnect_g1_device, scan_g1_devices, and send_g1_message by focusing on status retrieval rather than connection management or communication.

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 implies usage context through the detailed return structure, suggesting this tool is for checking connection state and device details. However, it lacks explicit guidance on when to use this versus alternatives like scan_g1_devices (for discovery) or send_g1_message (for communication), and does not specify prerequisites such as requiring a prior connection attempt.

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

scan_g1_devicesA

Scan for available G1 devices.

Returns:
    Dict[str, Any]: JSON response with scan results including:
        - result: "success" or "error"
        - devices: List of discovered devices with their properties
        - count: Number of devices found
        - error: Error message if scan failed
    
Note:
    This performs an actual BLE scan for devices with names containing "G1_" pattern.
    Returns a structured list of discovered devices with their addresses and signal strength.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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 key behavioral traits: it performs a BLE scan (implying it may take time and consume resources), returns structured results including success/error status and device properties, and specifies the device name pattern 'G1_'. It doesn't mention rate limits, auth needs, or destructive effects, but for a scan tool, this is reasonably transparent given the lack of annotations.

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 appropriately sized and well-structured: it starts with a clear purpose statement, then details the return format in a bulleted list, and adds a note with behavioral context. Every sentence adds value, with no wasted words, and it's front-loaded with the main action.

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 (0 parameters), lack of annotations, and presence of an output schema (implied by the return description), the description is complete enough. It explains what the tool does, the return structure, and key behavioral aspects like the BLE scan and device pattern. No output schema is explicitly provided, but the return description compensates adequately.

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 input schema has 0 parameters with 100% coverage, so no parameters need documentation. The description doesn't add param info, which is fine here. Baseline is 4 for 0 parameters, as it doesn't need to compensate for any gaps.

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 clearly states the tool's purpose: 'Scan for available G1 devices.' It specifies the verb ('Scan') and resource ('G1 devices'), and the note adds that it performs a BLE scan for devices with names containing 'G1_'. However, it doesn't explicitly differentiate from sibling tools like 'connect_g1_device' or 'get_g1_connection_status' beyond the scanning action.

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

Usage Guidelines3/5

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

The description implies usage by stating it 'performs an actual BLE scan for devices with names containing "G1_" pattern,' which suggests when to use it (to discover G1 devices). However, it doesn't provide explicit guidance on when not to use it or mention alternatives like checking connection status with sibling tools. The context is clear but lacks exclusions or named alternatives.

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

send_g1_messageA

Send a message to the connected G1 device.

Args:
    hex_data (str): Hexadecimal string representation of the message to send.
                   Can contain spaces, tabs, or other whitespace which will be automatically removed.
                   Should contain only valid hexadecimal characters (0-9, A-F, a-f).
                   Examples: "2506", "25 06", "25 06 00 01", "25 06 00 01 04 02"

Returns:
    Dict[str, Any]: JSON response with message status including:
        - result: "success" or "error"
        - message_sent: Boolean indicating if message was sent
        - response_received: Boolean indicating if response was received
        - response_data: Response data in hex format (if received)
        - timeout: Boolean indicating if message timed out
        - error: Error message if sending failed
    
Note:
    This sends the hex_data as bytes to the connected G1 device using the
    Nordic BLE UART protocol and waits for a response up to 2 seconds.
    All messages are treated as commands and will timeout after 2 seconds if no response is received.
    Spaces, tabs, and other whitespace in hex_data are automatically removed before processing.
    
Examples:
    - send_g1_message("2506") -> Sends command 0x25 with data 0x06
    - send_g1_message("25 06") -> Same as above (spaces removed)
    - send_g1_message("25 06 00 01") -> Sends 0x25060001
    - send_g1_message("ABCD 1234") -> Sends 0xABCD1234
    - send_g1_message("1234567890ABCDEF") -> Sends longer message
ParametersJSON Schema
NameRequiredDescriptionDefault
hex_dataYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden and excels at disclosing behavioral traits. It explains the Nordic BLE UART protocol usage, 2-second timeout behavior, automatic whitespace removal, and that all messages are treated as commands. It also details the response structure and error conditions comprehensively.

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?

Well-structured with clear sections (Args, Returns, Note, Examples) and front-loaded core purpose. Some redundancy exists (whitespace removal mentioned twice), and the examples section could be slightly more concise while maintaining clarity. Overall efficient but with minor room for optimization.

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 a single-parameter tool with no annotations but with output schema, the description provides complete context. It covers purpose, parameter semantics, behavioral details (protocol, timeout, command nature), return structure, and practical examples. The output schema handles return value documentation, allowing the description to focus on operational context.

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

Parameters5/5

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

With 0% schema description coverage for the single parameter, the description fully compensates by providing rich semantic information. It explains hex_data format requirements, whitespace handling, valid character constraints, and provides multiple concrete examples showing different input patterns and their corresponding byte interpretations.

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 ('Send a message') and target resource ('connected G1 device'), distinguishing it from sibling tools like connect/disconnect/scan devices. It explicitly identifies the tool's function as sending data to a specific hardware device.

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 clear context about when to use this tool (after device connection, for command communication), but doesn't explicitly contrast with alternatives or state when NOT to use it. The examples show typical usage patterns, but no explicit guidance about prerequisites like needing a connected device first.

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

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: connect, disconnect, get status, scan, and send message. The descriptions specify unique actions (e.g., connect_g1_device establishes a connection, while send_g1_device transmits data), making misselection unlikely. Tools are well-differentiated by their core functions within the G1 UART device management workflow.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with 'g1_device' or 'g1_message' as the noun, using snake_case throughout (e.g., connect_g1_device, send_g1_message). The naming is predictable and uniform, enhancing readability and agent usability without any deviations in style or structure.

Tool Count5/5

With 5 tools, the server is well-scoped for managing G1 UART devices, covering essential operations like connection, disconnection, status checking, scanning, and message sending. Each tool serves a necessary role in the device lifecycle, avoiding bloat or gaps, making the count ideal for the domain's typical workflows.

Completeness5/5

The tool set provides complete coverage for G1 UART device management, including connection lifecycle (connect, disconnect, status), device discovery (scan), and data interaction (send message). There are no obvious gaps; agents can perform all core operations from scanning to communication without dead ends or missing critical functions.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Bluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.
    16
    BSD 2-Clause "Simplified"
  • A
    license
    A
    quality
    C
    maintenance
    A stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.
    35
    17
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to control Govee smart devices, including lights, via natural language. Supports turning on/off, changing colors, adjusting brightness, and activating scenes through the Govee API or local network.
    9
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/danroblewis/g1_uart_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server