BLE MCP Server
Allows AI agents to discover, connect to, and interact with Arduino BLE devices for reading sensor data, sending commands, and subscribing to notifications.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BLE MCP ServerScan for nearby BLE devices and show their names."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BLE MCP Server
A stateful Bluetooth Low Energy (BLE) Model Context Protocol (MCP) server for developer tooling and AI agents. Works out of the box with Claude Code, VS Code with Copilot, and any MCP-compatible runtime. Defaults to stdio (no HTTP, no open ports), with optional SSE and Streamable HTTP transports for remote access and multi-session use. Uses bleak for cross-platform BLE on macOS, Windows, and Linux.
Example: Let Claude Code scan for nearby BLE devices, connect to one, read characteristics, and stream notifications from real hardware.
Demo
7-minute video walkthrough — scanning a real BLE device, discovering services, reading values, and promoting flows into plugins.
Why this exists
You have a BLE device. You want an AI agent to talk to it — scan, connect, read sensors, send commands, stream data. This server makes that possible.
It gives any MCP-compatible agent a full set of BLE tools: scanning, connecting, reading, writing, subscribing to notifications — plus protocol specs and device plugins, so the agent can reason about higher-level device behavior instead of just raw UUIDs and bytes.
The agent calls these tools, gets structured JSON back, and reasons about what to do next — no human in the loop for each BLE operation.
What agents can do with it:
Develop and debug — connect to your device, explore its services, read characteristics, test commands, and diagnose issues conversationally. "Why is this sensor returning zeros?" becomes a question you can ask.
Iterate on new hardware — building a BLE device? Attach a protocol spec so the agent understands your commands and data formats as you evolve them.
Automate testing — write device-specific plugins that expose high-level actions (e.g., device.start_stream, device.run_self_test), then let the agent run test sequences: enable a sensor, collect samples, validate values, report results.
Explore — point the agent at a device you’ve never seen. It discovers services, probes characteristics, and builds up protocol documentation from scratch.
Build BLE automation — agents controlling real hardware for real tasks: reading environmental sensors on a schedule, managing a fleet of BLE beacons, triggering actuators based on conditions.
Related MCP server: btdiag
Who is this for?
Embedded engineers — faster iteration on BLE protocols, conversational debugging, automated test sequences
Hobbyists and makers — explore BLE devices without writing boilerplate; let the agent help reverse-engineer simple protocols
QA and test engineers — build repeatable BLE test suites with plugin tools, run them from CI or agent sessions
Support and field engineers — diagnose BLE device issues interactively without specialized tooling
Researchers — automate data collection from BLE sensors, explore device capabilities systematically
Quickstart (Claude Code)
pip install ble-mcp-server
# Register the MCP server with Claude Code (read-only by default)
claude mcp add ble -- ble_mcpThen in Claude Code, try:
"Scan for nearby BLE devices and connect to the one whose name starts with Arduino."
The server is read-only by default. Writes and plugins can control real hardware and execute code, and are opt-in via environment variables. See Safety for details.
What the agent can do
Once connected, the agent has full BLE capabilities:
Scan for nearby devices, with optional name or service UUID filters
Connect to a device and discover its services and characteristics
Read and write characteristic values (writes require
BLE_MCP_ALLOW_WRITES)Subscribe to notifications and collect streaming data — single events, polling, or batch draining
Attach protocol specs to understand device-specific commands and data formats
Use plugins for high-level device operations (e.g.,
sensortag.read_temp) instead of raw reads/writesCreate specs and plugins for new devices, building up reusable knowledge across sessions
The agent handles multi-step flows automatically. For example, "read the temperature from my SensorTag" might involve scanning, connecting, discovering services, attaching a spec, enabling the sensor, and reading the value — without you specifying each step.
At a high level:
Raw BLE → Protocol Spec → Plugin
You can start with raw BLE tools, then move up the stack as your device protocol becomes understood and repeatable. See Concepts for how the pieces fit together.
Install (development)
# Editable install from repo root
pip install -e .
# Or with uv
uv pip install -e .MCP is a protocol — this server works with any MCP-compatible client. Below are setup instructions for the most common ones.
Add to Claude Code
# Minimal (read-only)
claude mcp add ble -- ble_mcp
# Or run as a module
claude mcp add ble -- python -m ble_mcp_server
# Enable writes
claude mcp add ble -e BLE_MCP_ALLOW_WRITES=true -- ble_mcp
# Enable writes with an allowlist of characteristic UUIDs
claude mcp add ble \
-e BLE_MCP_ALLOW_WRITES=true \
-e BLE_MCP_WRITE_ALLOWLIST="2a00,12345678-1234-1234-1234-123456789abc" \
-- ble_mcp
# Enable all plugins
claude mcp add ble -e BLE_MCP_PLUGINS=all -- ble_mcp
# Enable specific plugins only
claude mcp add ble -e BLE_MCP_PLUGINS=sensortag,hello -- ble_mcp
# Debug logging
claude mcp add ble -e BLE_MCP_LOG_LEVEL=DEBUG -- ble_mcpAdd to VS Code / Copilot
Add to your project's .vscode/mcp.json (or create it):
{
"servers": {
"ble": {
"type": "stdio",
"command": "ble_mcp",
"args": [],
"env": {
"BLE_MCP_ALLOW_WRITES": "true",
"BLE_MCP_PLUGINS": "all"
}
}
}
}Adjust env to match your needs — remove BLE_MCP_ALLOW_WRITES for read-only mode, or set BLE_MCP_PLUGINS to specific plugin names.
Add to Cursor
Add to your project's .cursor/mcp.json (or create it):
{
"mcpServers": {
"ble": {
"command": "ble_mcp",
"args": [],
"env": {
"BLE_MCP_ALLOW_WRITES": "true",
"BLE_MCP_PLUGINS": "all"
}
}
}
}Environment variables
Variable | Default | Description |
| disabled | Set to |
| empty | Comma-separated UUID allowlist for writable characteristics (checked only when writes are enabled). |
| disabled | Plugin policy: |
|
| Python log level ( |
| enabled | JSONL tracing of every tool call. Set to |
| disabled | Include |
|
| Max payload chars before truncation (only applies when |
|
| Character used to separate tool name segments. Set to |
|
| Maximum concurrent MCP sessions (only meaningful for SSE and Streamable HTTP transports). |
|
| Maximum active BLE connections per session. |
|
| Maximum active scans per session. |
|
| Maximum notification subscriptions per connection. |
| unset | Password for OAuth approval page on HTTP transports. Required unless |
Tools
See Concepts for how everything fits together, and the Tools Reference for detailed input/output schemas.
Category | Tools |
BLE Core |
|
Introspection |
|
Protocol Specs |
|
Tracing |
|
Plugins |
|
Protocol Specs
Specs are markdown files that describe a BLE device's protocol — services, characteristics, commands, and data formats. They live in .ble_mcp/specs/ and teach the agent what a device can do beyond raw UUIDs and bytes.
Without a spec, the agent can still discover services and read characteristics. With a spec, it knows what the values mean and what commands to send.
You can create specs by telling the agent about your device — paste a datasheet, describe the protocol, or just let it explore and document what it finds. The agent generates the spec file, registers it, and references it in future sessions. You can also write specs by hand.
See Concepts for details on spec format and how the agent uses them.
Plugins
Plugins add device-specific shortcut tools to the server. Instead of the agent composing raw read/write sequences, a plugin provides high-level operations like sensortag.read_temp or ota.upload_firmware.
The agent can also create plugins (with your approval). It explores a device, writes a plugin based on what it learns, and future sessions get shortcut tools — no manual coding required.
To enable plugins:
# Enable all plugins
claude mcp add ble -e BLE_MCP_PLUGINS=all -- ble_mcp
# Enable specific plugins only
claude mcp add ble -e BLE_MCP_PLUGINS=sensortag,ota -- ble_mcpEditing an already-loaded plugin only requires ble_plugin_reload — no restart needed.
Background tasks
Plugins can start background asyncio tasks for continuous monitoring — periodic scans, data collection loops, etc. The plugin template includes commented examples for this pattern.
Background tasks are registered with the server via state.register_task(name, task), making them visible to the agent:
ble_tasks_list— shows all running background tasks with statusble_tasks_cancel— stops a task by ID (safety net for runaway tasks)
Plugin notifications
Plugins can send MCP log notifications to the client via state.on_log_cb(level, message). This allows plugins to proactively alert the agent about events — device arrival, threshold crossed, anomaly detected — without waiting for a tool call.
See Concepts for the plugin contract, metadata matching, and how specs and plugins work together.
Tracing
Every tool call is traced to .ble_mcp/traces/trace.jsonl and an in-memory ring buffer (last 2000 events). Tracing is on by default — set BLE_MCP_TRACE=0 to disable.
Event format
Two events per tool call:
{"ts":"2025-01-01T00:00:00.000Z","event":"tool_call_start","tool":"ble.read","args":{"connection_id":"c1","char_uuid":"2a00"},"connection_id":"c1"}
{"ts":"2025-01-01T00:00:00.050Z","event":"tool_call_end","tool":"ble.read","ok":true,"error_code":null,"duration_ms":50,"connection_id":"c1"}connection_idis extracted from args when presentvalue_b64andvalue_hexare stripped from traced args by default (enable withBLE_MCP_TRACE_PAYLOADS=1)
Inspecting the trace
Use ble.trace.status to check config and event count, and ble.trace.tail to retrieve recent events — no need to read the file directly.
Platform BLE permissions
macOS
No special setup is needed for most cases. On macOS 12+, the Terminal app (or whichever terminal you use) must have Bluetooth permission. Go to System Settings > Privacy & Security > Bluetooth and ensure your terminal is listed and enabled. If running from an IDE, the IDE itself may need the permission.
Windows
Requires Windows 10 version 1709 (Fall Creators Update) or later. No extra drivers needed — bleak uses the native WinRT Bluetooth APIs. Just make sure Bluetooth is turned on in Settings.
Linux
Requires BlueZ 5.43+. Your user must have permission to access the D-Bus Bluetooth interface. The simplest approach:
# Add your user to the bluetooth group
sudo usermod -aG bluetooth $USER
# Then log out and back inIf you are running in a container or headless environment, ensure dbus and bluetoothd are running.
Example session
The repo includes a simulated BLE peripheral you can run on a second machine (e.g. a Raspberry Pi) to try things end-to-end — no real hardware needed. See examples/demo-device/ for setup.
"Scan for BLE devices and connect to DemoDevice. Read the battery level, then start a data collection."
The agent will:
Scan for nearby devices and find DemoDevice
Connect and discover its services
Check for a matching protocol spec — if one exists, attach it to understand the device's protocol
Check for a matching plugin — if one exists, use its shortcut tools
If no spec or plugin exists, explore the device using raw BLE tools, or ask you for guidance
Read the battery level, configure the data service, and start collection
The example includes a pre-built protocol spec and plugin — copy them into .ble_mcp/specs/ and .ble_mcp/plugins/ to skip the exploration phase, or let the agent create its own from scratch.
Try without an agent
You can test the server interactively using the MCP Inspector — no Claude or other agent needed:
npx @modelcontextprotocol/inspector python -m ble_mcp_serverOpen the URL with the auth token from the terminal output. The Inspector gives you a web UI to call any tool, see responses, and observe MCP notifications (like disconnect alerts) in real time.
Transports
The server supports three MCP transports. stdio is the default and recommended for most use cases — zero configuration, no network exposure. HTTP transports are available for remote access and multi-client scenarios.
Transport | Command | Sessions | Use case |
stdio (default) |
| Single | CLI tools, IDE integrations |
SSE |
| Multiple | Older MCP clients, web-based tools |
Streamable HTTP |
| Multiple | Newer MCP clients, production deployments |
HTTP transport options
# SSE on default port (OAuth enabled by default)
ble_mcp --transport sse
# Streamable HTTP on custom host/port
ble_mcp --transport streamable-http --host 0.0.0.0 --port 9000
# No auth (for local testing with MCP Inspector, etc.)
ble_mcp --transport streamable-http --no-auth
# Allow up to 3 concurrent sessions
BLE_MCP_MAX_SESSIONS=3 ble_mcp --transport streamable-httpFor SSE, clients connect via GET /sse and post messages to /messages/. For Streamable HTTP, the endpoint is /mcp.
Session isolation: each MCP session gets its own BLE state — connections, scans, and subscriptions are not shared between sessions. Two sessions can independently scan or connect to the same device (if the BLE hardware and device allow it).
Authentication
HTTP transports require BLE_MCP_AUTH_TOKEN to be set. This token serves as the password for the OAuth 2.0 approval page — when a client connects, it goes through the standard OAuth flow and the user must enter this password to approve access.
# Set a password and start the server
BLE_MCP_AUTH_TOKEN=mysecret ble_mcp --transport streamable-httpThe OAuth flow (handled automatically by Claude Desktop and other MCP clients):
Client discovers the server's OAuth metadata at
/.well-known/oauth-authorization-serverClient registers itself via dynamic client registration (
/register)User is redirected to an approval page where they enter the
BLE_MCP_AUTH_TOKENpasswordClient exchanges the authorization code for access/refresh tokens
All OAuth state (clients, tokens) is stored in memory and lost on restart — clients simply re-authenticate.
Claude Desktop setup (remote via tunnel):
# Terminal 1: start the server
BLE_MCP_AUTH_TOKEN=mysecret ble_mcp --transport streamable-http --host 0.0.0.0
# Terminal 2: expose via cloudflared
cloudflared tunnel --url http://localhost:8000In Claude Desktop, add a remote MCP server with the tunnel URL + /mcp path (e.g. https://abc123.trycloudflare.com/mcp). Claude Desktop handles the OAuth flow — you just enter the password when prompted.
No auth (local testing only):
For local testing with MCP Inspector or similar tools, you can disable auth entirely:
ble_mcp --transport streamable-http --no-authWithout BLE_MCP_AUTH_TOKEN or --no-auth, the server refuses to start on HTTP transports.
stdio transport ignores all auth settings — it doesn't need auth because the client launches the server as a subprocess.
Note: uvicorn and starlette are required for HTTP transports. They are already transitive dependencies of the mcp package, but you can install them explicitly with pip install ble-mcp-server[http].
Architecture
Multiple transports — stdio (default), SSE, and Streamable HTTP
Per-session isolation — each MCP session gets its own BLE state
Stateful — connections and subscriptions persist in memory
Safe by default — writes gated by env flags + allowlist
Agent-friendly — structured outputs, buffered notifications
Graceful shutdown — disconnects all clients on exit
Known limitations
Real hardware is asynchronous; agent runtimes mostly aren't. Devices disconnect, notifications arrive out of band, and state changes while the agent is thinking. Most agent runtimes are optimized for clean request/response loops. The server bridges this with polling tools, buffered notification queues, and MCP log notifications for disconnects, incoming data, and scan results — but MCP log notifications are client-dependent (they work in MCP Inspector; Claude Code and Claude Desktop currently ignore them). The agent can always detect disconnects on the next tool call and poll for notifications explicitly — the log messages are a best-effort heads-up, not a guarantee. Custom MCP clients (e.g., an edge agent using the MCP SDK directly) can receive and act on these notifications.
stdio is single-session. The stdio transport handles one MCP session at a time. For multi-session use, switch to SSE or Streamable HTTP transport with
--transport sseor--transport streamable-http.
Safety
This server connects an AI agent to real hardware. That's the point — and it means the stakes are higher than pure-software tools.
Plugins execute arbitrary code. When plugins are enabled, the agent can create and run Python code on your machine with full server privileges. Review agent-generated plugins before loading them. Use BLE_MCP_PLUGINS=name1,name2 to allow only specific plugins rather than all.
Writes affect real devices. A bad write to the wrong characteristic can brick a device, trigger unintended behavior, or disrupt other connected systems. Keep writes disabled unless you need them. Use BLE_MCP_WRITE_ALLOWLIST to restrict which characteristics are writable.
Use tool approval deliberately. When your MCP client prompts you to approve a tool call, consider whether you want to allow it once or always. "Always allow" is convenient but means the agent can repeat that action without further confirmation.
This software is provided as-is under the MIT license. You are responsible for what the agent does with your hardware.
License
This project is licensed under the MIT License — see LICENSE for details.
Acknowledgements
This project is built on top of the excellent bleak library for cross-platform BLE in Python.
Available Tools
35 toolsble_connectA
Connect to a BLE peripheral by address. Returns a connection_id, device identity (device_name, service_uuids from scan cache), and spec status (null if none attached). After connecting: 1) Use ble.spec.list to check for a matching protocol spec by device name or service UUIDs. If a match is found, attach it with ble.spec.attach. If no match, ask the user if they have a protocol spec for this device. 2) Use ble.plugin.list to check for a plugin whose name matches the device. If a matching plugin is loaded, its tools are available to use directly.
| Name | Required | Description | Default |
|---|---|---|---|
| pair | No | Pair (bond) during connect. Works on Linux and Windows, not macOS. | |
| address | Yes | MAC address or platform identifier of the device. | |
| timeout_s | No | Connection timeout in seconds (default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses return values (connection_id, device identity, spec status), notes platform-specific behavior for the pair parameter (not on macOS), and outlines the follow-up steps after connecting. This is good transparency for the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: starts with the core purpose and return values, then lists numbered steps for post-connect actions. It is concise enough to convey the necessary information without excessive verbosity, though the step-by-step instructions could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 parameters, no output schema, no annotations), the description covers the main aspects: what it does, what it returns, and what to do after. It lacks information about error handling or invalid addresses, but for a connection tool this is reasonably complete with the provided context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add significant meaning beyond the schema; it mentions address and pair implicitly but provides no extra details about the parameters (e.g., format of address, default timeout behavior).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Connect to a BLE peripheral by address.' It specifies the action (connect), the resource (BLE peripheral), and the key input (address). It also distinguishes from siblings like ble_disconnect, ble_connection_status, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a detailed post-connect workflow (check spec, attach, check plugin) but does not explicitly differentiate when to use ble_connect vs other connection-related tools like ble_scan_start or ble_disconnect. The usage context is implied but not explicitly stated with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_connections_listA
List all tracked connections with their status, address, name, timestamps, and subscription count. Useful for recovering connection IDs after context loss.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the tool lists connections and specifies returned fields (status, address, name, timestamps, subscription count), which implies a read-only, non-destructive operation. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, followed by a clear use case. No unnecessary words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no output schema, and simple behavior, the description covers all necessary information: what it does and what it returns. It is complete for its complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, but the description adds value by listing the output fields. This helps the agent understand what information it will receive, which is beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'List all tracked connections', which is a specific verb and resource. It distinguishes from sibling tools like ble_connect or ble_disconnect which perform different actions, and ble_connection_status which likely deals with a single connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete use case: 'Useful for recovering connection IDs after context loss.' This gives clear context for when to use, though it does not explicitly mention when not to use or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_connection_statusA
Check whether a connection is still alive. Returns connected (bool), address, and disconnect_ts if the device disconnected unexpectedly. Use this to verify a connection before a sequence of operations.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses return fields including conditional disconnect_ts. Does not cover error behavior or side effects (expected read-only). Adequate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy: first defines purpose and output, second gives usage context. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple status check tool, but lacks context about where connection_id comes from and how to interpret disconnect_ts. No output schema, but return fields are stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and description does not elaborate on the connection_id parameter. While the purpose is clear, the parameter's format or source (e.g., from ble_connect) is not explained, leaving ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Check' and resource 'connection status', specifying it returns connected (bool), address, and disconnect_ts. It distinguishes from sibling tools like ble_connect or ble_disconnect by its read-only verification purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool to verify a connection before a sequence of operations, providing clear context. Does not mention when not to use or alternatives, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_disconnectB
Disconnect a BLE peripheral by connection_id.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | The connection_id from ble.connect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden but only states 'disconnect'. It does not describe side effects (e.g., freeing resources), return values, or error conditions, leaving the agent uninformed about behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence of 9 words with no wasted content. However, it could slightly expand on usage context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (one required param, no output schema), the description is adequate but minimally complete. It lacks context about what the disconnect entails (e.g., whether it frees the connection ID) or post-conditions, which would help an agent assess completeness of action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the single parameter (connection_id) with a description; the tool description adds no extra meaning beyond restating the schema. Baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (disconnect), the resource (BLE peripheral), and the method (by connection_id). It strongly distinguishes from sibling tools like ble_connect and ble_connection_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, such as prerequisites (e.g., must be connected) or avoiding use when already disconnected. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_discoverB
Discover services and characteristics on a connected device. Results are cached per connection.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It notes caching ('Results are cached per connection') but omits other traits like read-only nature, auth needs, or cache behavior details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the main action and a key behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain return format or structure. It also fails to mention prerequisites (e.g., must be connected) or caching lifespan, leaving gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The lone parameter 'connection_id' lacks schema description (0% coverage). The description only vaguely implies its role ('on a connected device'), adding minimal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Discover services and characteristics') and the context ('on a connected device'), distinguishing it from sibling tools like ble_read or ble_connect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. While it implies post-connection use, it lacks when-not conditions or references to siblings like ble_spec_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_drain_notificationsA
Batch-collect notifications: waits up to timeout_s for the first notification, then keeps collecting until idle_timeout_s passes with no new data, max_items is reached, or the total timeout_s expires. Ideal for bursty flows like downloading a log file or dataset over BLE notifications.
| Name | Required | Description | Default |
|---|---|---|---|
| max_items | No | Max notifications to collect (default 200, max 5000). | |
| timeout_s | No | Total max wait in seconds (default 2, max 60). | |
| connection_id | Yes | ||
| idle_timeout_s | No | Max idle gap between notifications before stopping (default 0.25, max 10). | |
| subscription_id | Yes |
TDQS
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 clearly explains the iterative collection behavior with three stopping conditions (idle_timeout, max_items, timeout_s). The behavior is transparent, though it omits any side effects 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the key behavior in the first sentence and a use-case example in the second. No fluff; every word serves a purpose. It is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the collection logic and stopping conditions, but it does not specify the return value format (e.g., array of notifications) or error handling. Given no output schema, this is a notable gap, though the tool is relatively simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, but the description adds context by explaining how the parameters interact (wait for first, then idle or max or total timeout). This adds meaning beyond the individual field descriptions, especially for the time and count parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'batch-collect notifications' and details the collection logic (waits for first, then collects until idle_timeout, max_items, or timeout). It implies a difference from single-notification tools like ble_wait_notification but does not explicitly distinguish from siblings like ble_poll_notifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description suggests use for 'bursty flows' like downloading datasets, providing context. However, it lacks explicit guidance on when not to use this tool or comparison to alternatives (e.g., ble_wait_notification for single notifications, ble_poll_notifications for polling).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_mtuA
Return the negotiated MTU (Maximum Transmission Unit) for a connection. The effective max write payload per packet is mtu - 3 bytes (ATT header). Useful for determining chunk sizes for large writes.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return value (negotiated MTU) and side effect (calculation hint). No annotations provided, so description carries full burden. Does not mention prerequisites like active connection, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second adds practical usage. No fluff, efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose and usage adequately for a simple read tool, but lacks specification on return format (e.g., integer) and parameter format, leaving gaps without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. Description does not explain the 'connection_id' parameter beyond mentioning 'for a connection'. No format or source guidance is given, requiring the agent to infer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the negotiated MTU for a connection, explains the effective payload size calculation, and mentions usefulness for large writes. This distinguishes it from siblings like ble_read or ble_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly guides use for chunk size determination before large writes. Lacks explicit when-not-to-use or comparison with alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_plugin_listA
List loaded plugins with their tool names and metadata. Each plugin may include a 'meta' dict with matching hints like service_uuids, device_name_contains, or description — use these to determine which plugin fits the connected device. Also returns whether plugins are enabled and the current policy. Plugins require BLE_MCP_PLUGINS env var — set to 'all' for all or 'name1,name2' to allow specific plugins. If disabled, tell the user to set this variable when adding the MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description reveals key behaviors: plugins require BLE_MCP_PLUGINS env var, meta dict with matching hints, and what to do if disabled. Adequate for a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is moderately concise; each sentence adds important context about meta hints and environment variable. Could be slightly tighter but no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description sufficiently explains return content (plugins with tool names, metadata, enabled status, policy). Covers matching hints and env var. Complete for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, so description does not need to explain inputs. However, it adds value by explaining the env var dependency and meta hints, which are not in the schema. Baseline is 4 for zero params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List loaded plugins with their tool names and metadata' - specific verb and resource. Distinguishes from sibling tools like ble_plugin_load, ble_plugin_reload, ble_plugin_template by focusing on listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on when to use (to check plugins) and what to do if disabled (set env var). Does not explicitly contrast with other list or plugin tools, but the environment variable guidance is helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_plugin_loadB
Load a new plugin from a file or directory path. Requires BLE_MCP_PLUGINS env var to be set.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to a .py file or directory containing __init__.py. |
TDQS
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 only mentions an environment variable requirement, but does not disclose side effects, return behavior, or what happens after loading (e.g., immediate activation, error handling).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise, well-structured sentences with no unnecessary words. It front-loads the core action and adds a key requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite clear purpose, the description lacks details on return values, success/failure indicators, and potential side effects. Since there is no output schema, the description should compensate, but it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds meaningful context beyond the schema by specifying the environment variable prerequisite. The description adds value without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Load a new plugin') and the resource ('from a file or directory path'), and distinguishes it from sibling plugin tools like 'ble_plugin_list' and 'ble_plugin_reload'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite (BLE_MCP_PLUGINS env var) but does not provide guidance on when to use this tool compared to alternatives like 'ble_plugin_reload' or 'ble_plugin_template'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_plugin_reloadA
Hot-reload a plugin by name. Re-imports the module and refreshes tools. Requires BLE_MCP_PLUGINS env var to be set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the loaded plugin to reload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden. It discloses that the tool 're-imports the module and refreshes tools', which is helpful behavioral detail. However, it does not mention potential side effects (e.g., impact on ongoing connections or tool instances). Given the lack of annotations, this is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence states the core action, and the second adds an important usage condition. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema, no annotations), the description covers the essential aspects: what it does, and a required environment variable. It could mention that the plugin must already be loaded, but this is implied by 'reload'. Overall, it is reasonably complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'name', so the description does not need to add much. It aligns with the schema by mentioning 'by name'. No additional semantic information is provided beyond what the schema already states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Hot-reload a plugin by name' with a specific verb ('reload') and resource ('plugin'), and distinguishes itself from sibling tools like ble_plugin_load and ble_plugin_list by specifying it is for reloading an already loaded plugin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite ('Requires BLE_MCP_PLUGINS env var to be set'), which provides clear usage context. It does not explicitly state when not to use it or compare to alternatives, but the sibling tool names imply that ble_plugin_load is for initial loading, so the usage is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_plugin_templateA
Return a Python plugin template. Use this when creating a new plugin. Optionally pre-fill with a device name. Save the result to .ble_mcp/plugins/.py, fill in the tools and handlers, then load with ble.plugin.load.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | No | Device name to pre-fill in the template. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description transparently describes output (template) and optional pre-fill behavior. It lacks explicit mention of non-destructive nature, but that is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single optional parameter and no output schema, the description provides complete context: purpose, parameter usage, and post-use steps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers the parameter with a clear description (100% coverage). The tool description adds little beyond reiteration and usage context, earning the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb ('Return') and resource ('Python plugin template'), and distinguishes itself from sibling tools which focus on BLE operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when creating a new plugin') and provides precise follow-up instructions on saving, filling, and loading the template.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_poll_notificationsA
Non-blocking: return up to max_items buffered notifications immediately. Returns an empty list if the queue is empty. Also returns a dropped counter showing how many notifications were lost to queue overflow since subscription start.
| Name | Required | Description | Default |
|---|---|---|---|
| max_items | No | Max notifications to return (default 50, max 1000). | |
| connection_id | Yes | ||
| subscription_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses all key behaviors: non-blocking, returns up to max_items, empty list if queue empty, and dropped counter for overflow. No annotations exist, so description carries full burden and does well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Front-loaded with the most important trait (non-blocking) and explains behavior clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains return values (list and dropped counter) and behavior. Sibling tools exist for blocking and drain variants, so this description is complete for an agent to pick correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only max_items has a schema description (33% coverage). Description adds default and max for max_items but does not explain connection_id or subscription_id. With low coverage, description should provide more context for all params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it is non-blocking, returns buffered notifications immediately, and provides a dropped counter. Distinguishes from siblings like ble_wait_notification (blocking) and ble_drain_notifications (drain all).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentions non-blocking behavior, implying it's for polling without waiting. However, does not explicitly state when to use over alternatives like wait_notification or drain_notifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_readC
Read the value of a GATT characteristic.
| Name | Required | Description | Default |
|---|---|---|---|
| char_uuid | Yes | Characteristic UUID (16-bit or 128-bit). | |
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations; description fails to disclose behavioral traits such as blocking behavior, error handling, or state requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words, but could benefit from additional context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks information about return values, error cases, and required state (connected, discovered), leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only char_uuid described). Description adds no extra meaning; connection_id is left undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Read' and resource 'GATT characteristic', distinguishing it from sibling tools like ble_write and ble_read_descriptor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no prerequisites like connection or discovery mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_read_descriptorA
Read a GATT descriptor by handle. Use ble.discover to find descriptor handles. Descriptors provide metadata about characteristics (e.g. CCCD, user description).
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The descriptor handle (integer) from ble.discover. | |
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only states action without side effects, permissions, or limitations. Does not disclose if read is idempotent or safe, or whether it triggers any BLE interaction beyond reading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states action, second gives prerequisite and context. No unnecessary words. Efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description omits return value details (type, format, size). Missing error or edge case info (e.g., invalid handle). For a moderately complex BLE tool, this is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage 50%; description only adds meaning for 'handle' (repeats schema). 'connection_id' gets no description. No additional format, constraints, or example values beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource+method: 'Read a GATT descriptor by handle'. Distinguishes from sibling tools like 'ble_read' (characteristic) and 'ble_write_descriptor' (write). Also explains descriptor purpose (metadata like CCCD).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisite: 'Use ble.discover to find descriptor handles.' Provides context on what descriptors are for. Doesn't explicitly mention alternatives, but sibling tool names imply when not to use (e.g., write vs read).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_scan_get_resultsA
Non-blocking: return the devices discovered so far by a running (or finished) scan. Also returns whether the scan is still active. Call this to check progress or to decide whether to stop early.
| Name | Required | Description | Default |
|---|---|---|---|
| scan_id | Yes | The scan_id from ble.scan_start. |
TDQS
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 non-blocking nature and both return values (devices and scan active status). It lacks details on error handling or what happens with invalid scan_id, but covers core behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey key attributes: non-blocking, return values, and usage purpose. No unnecessary words, and the most important info is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and no output schema. The description explains what is returned (devices and scan active) but is vague about the structure of devices. For an agent to parse the response, more detail on the output format would be helpful. Adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter scan_id is fully documented in the schema. The description merely restates 'The scan_id from ble.scan_start' without adding new meaning, so it does not improve on the schema. Schema coverage is 100%, earning baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns discovered devices and scan status, and specifies it is non-blocking. It distinguishes itself from sibling tools like ble_scan_start and ble_scan_stop by focusing on retrieving results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises calling this to check progress or decide whether to stop early, providing clear usage context. It does not explicitly exclude other uses but gives sufficient guidance relative to the scan lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_scans_listA
List all tracked scans with their status, filters, timestamps, and device count. Useful for recovering scan IDs after context loss.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full burden. It discloses that the tool lists scans and specifies the returned data fields (status, filters, timestamps, device count). This is adequate for a read-only operation with no side effects, though it could mention if results are ordered or limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no wasted words. The first sentence defines the action and output, and the second provides a practical use case. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations, no output schema), the description covers the main purpose and output fields. It would benefit from specifying the return format (e.g., array of objects), but it is largely complete for a list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so the schema already documents all input expectations. The description does not need to add parameter details, and it correctly avoids redundancy. Baseline 4 is appropriate for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all tracked scans with their status, filters, timestamps, and device count,' providing a specific verb and resource along with output fields. It distinguishes this tool from sibling tools like ble_scan_start and ble_scan_stop by focusing on listing existing scans.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: 'Useful for recovering scan IDs after context loss.' This implies when to use it, though it does not explicitly exclude other scenarios or mention alternatives. The context is clear enough for an agent to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_scan_startA
Start a background BLE scan. Returns a scan_id immediately. The scan runs in the background for up to timeout_s seconds. Use ble.scan_get_results to check discovered devices and ble.scan_stop to end the scan early.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_s | No | Max scan duration in seconds (default 10, max 60). Scan auto-stops after this. | |
| name_filter | No | Only collect devices whose name contains this string (case-insensitive). | |
| service_uuid | No | Only collect devices advertising this service UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes immediate return of scan_id, background execution with timeout, auto-stop, and ability to stop early, providing full behavioral context without contradicting any annotations (none provided).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, no redundancy, and critical information (return value, background operation, timeout) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 optional parameters, no output schema, no annotations), the description covers all essential aspects: what it does, how it works, and related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions. The description does not add additional semantics to parameters beyond what the schema already provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Start a background BLE scan' with a specific verb and resource, and the context of sibling tools like ble_scan_stop and ble_scan_get_results helps distinguish it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use this tool (start a scan) and when to use siblings (get results with ble.scan_get_results, stop early with ble.scan_stop), plus note about timeout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_scan_stopA
Stop a running scan early and return the final list of discovered devices. Safe to call on an already-finished scan.
| Name | Required | Description | Default |
|---|---|---|---|
| scan_id | Yes | The scan_id from ble.scan_start. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses safety ('Safe on finished scan') and output (final list), but omits details like whether the scan_id becomes invalid after stop, or if the operation is idempotent. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The key information is front-loaded: action, scope, safety. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema, no annotations), the description is complete. It covers purpose, parameter source, safety, and return value well within context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter scan_id. The description does not add new semantic information beyond the schema's description ('The scan_id from ble.scan_start'), so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Stop a running scan early'), the resource (a running scan), and the return value ('final list of discovered devices'). It distinguishes from siblings like ble_scan_start and ble_scan_get_results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for early termination but does not explicitly compare with alternatives (e.g., waiting for scan to finish and using ble_scan_get_results). The note 'Safe to call on an already-finished scan' provides some guidance but lacks when-not advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_attachA
Attach a registered spec to a connection session (in-memory only). The spec will be available via ble.spec.get for the duration of this connection. After attaching, check ble.plugin.list for a matching plugin, then present the user with their options: interact with the device using the spec (read/write characteristics, execute flows), use plugin shortcut tools if a plugin is loaded, extend an existing plugin with new tools, or create a new plugin using ble.plugin.template.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | Yes | The spec_id from ble.spec.register. | |
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the attachment is 'in-memory only' (non-persistent) and that the spec becomes available via ble.spec.get for the connection duration. This adds behavioral context beyond what annotations would provide, though no annotations are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences: the first states the core function, the second provides actionable next steps. No redundant or extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two parameters, no output schema), the description covers the main purpose and post-usage guidance. It lacks details on error handling or behavior when inputs are invalid, but remains fairly complete for common use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes spec_id with its source. The description does not add extra meaning beyond the schema. With schema coverage at 50% (connection_id lacks description), the description does not compensate or clarify the parameters further, so a baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it attaches a registered spec to a connection session, distinguishing it from siblings like ble_spec_register or ble_spec_get. It uses specific verbs and resource: 'attach', 'spec', 'connection session'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear post-usage steps (check ble.plugin.list and present options), but does not explicitly state when not to use this tool or compare it with alternatives. It gives good context for the agent's workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_getA
Get the attached spec for a connection (returns null if none attached).
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes |
TDQS
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 returns null if no spec is attached, which is helpful. However, it lacks details on permissions, side effects, or what 'spec' refers to. Adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, directly states purpose and return behavior. No unnecessary words. Front-loaded with verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with one parameter and no output schema, the description covers the essential behavior (get spec, return null if none). It could mention that a valid connection is required, but overall quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning to parameters. It implicitly references connection_id but does not describe its format, expected values, or constraints. The added value is minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'get' and the resource 'spec for a connection', and mentions the return value (null if none). It distinguishes from siblings like 'ble_spec_attach' and 'ble_spec_list'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after attaching a spec but does not explicitly state when to use this tool versus alternatives. No exclusions or contextual guidance provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_listA
List all registered specs with their metadata and matching hints.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states the tool lists registered specs, but does not disclose potential side effects, permissions, pagination, or ordering behavior. For a simple read-only list, minimum transparency is met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, 11 words, front-loaded with action and resource. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 simplicity, the description adequately communicates the tool's purpose and what it returns (metadata and matching hints). Minor improvement could mention if ordering or limits exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (0 params, schema coverage 100%). The description adds no parameter information, but none is needed. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 'all registered specs', specifying the returned data includes 'metadata and matching hints'. This distinguishes it from siblings like ble_spec_search which likely have filtering capabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives such as ble_spec_search for filtered results. The description assumes the agent knows to call it for a full listing without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_readC
Read full spec content, file path, and metadata by spec_id.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden but only states the action. It does not disclose whether the tool is read-only, rate-limited, or returns large data. The agent has no insight into behavioral traits beyond the minimal description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no extraneous information. It is maximally concise while still conveying the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description mentions return components (content, file path, metadata) but lacks detail on size, pagination, or side effects. It is minimally adequate but could provide more context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions), and the description only mentions spec_id in passing without explaining its format, origin, or constraints. The description fails to compensate for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'read' and the resource 'full spec content, file path, and metadata' identified by spec_id. It distinguishes from sibling tools like ble_spec_list and ble_spec_search by specifying full content retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives such as ble_spec_get or ble_spec_search. The agent is left to infer the appropriate context without explicit when-to-use or when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_registerA
Register a spec file in the index. Validates YAML front-matter (requires kind: ble-protocol and name). The file path can be absolute or relative to CWD.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the spec markdown file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must fully disclose behavior. It reveals that front-matter validation occurs and path flexibility, but does not detail side effects like overwriting behavior, error handling, or what the tool returns. This is adequate but incomplete for a destructive write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first covers the core action, and the second adds essential validation and path details with no redundant information. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and complexity of registering a file, the description lacks information about return values, idempotency, and what happens on success/failure. It is sufficient for basic understanding but leaves gaps for a functional agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the single parameter, but the description adds value by specifying that the path can be absolute or relative to CWD. This goes beyond the schema's 'Path to the spec markdown file' and clarifies the expected input format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Register a spec file in the index' with a specific verb and resource. The validation detail further clarifies the tool's role. While the action distinguishes from siblings like ble_spec_list or ble_spec_get, it does not explicitly differentiate from other write operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when needing to add a spec file to the index, but provides no explicit context on when to use this tool vs alternatives (e.g., ble_spec_template for creating templates) or when not to use it (e.g., if file already registered).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_searchA
Full-text search over a spec's content. Returns matching snippets with line numbers and surrounding context.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Max results to return (default 10). | |
| query | Yes | Search terms (space-separated). | |
| spec_id | Yes |
TDQS
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 returns matching snippets with line numbers and context, but does not mention any destructive behavior, rate limits, or authentication needs. For a search tool, the behavior is adequately described but not thoroughly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the tool's function. It is front-loaded and contains no unnecessary words, though a slightly more structured format could improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description explains the return format (snippets with line numbers and context). However, it omits details about the 'spec_id' parameter's semantics and does not provide examples or pagination behavior. Adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 67%, with 'k' and 'query' having descriptions; 'spec_id' lacks description. The description adds no extra meaning beyond the schema; it only contextualizes that the search is 'over a spec's content', which hints at spec_id's role. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs full-text search over a spec's content and returns snippets with line numbers and context. It uses specific verbs and resources, distinguishing it from siblings like ble_spec_get or ble_spec_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for searching spec content but lacks explicit guidance on when to use it versus alternatives, or any context on prerequisites or limitations. No when-not or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_spec_templateA
Return a markdown template for a new BLE protocol spec. Optionally pre-fill with a device name.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | No | Device name to pre-fill in the template. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It states the tool returns a template but does not disclose side effects, permissions, or whether it is read-only. The lack of explicit behavioral information makes it minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently communicates purpose and optionality. It is front-loaded with the core action and contains zero superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no required params, no output schema), the description adequately conveys its function. It could briefly mention the template's format, but this is not critical for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional parameter 'device_name', with description matching the tool description. The description adds no extra semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns a markdown template for a new BLE protocol spec and optionally pre-fills with a device name. This clearly distinguishes it from sibling tools like ble_scan_start or ble_write, which cover different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining a starting spec template but does not provide explicit when-to-use or when-not-to-use guidance, nor mentions alternatives. The context is sufficient given tool simplicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_subscribeC
Subscribe to notifications/indications on a characteristic.
| Name | Required | Description | Default |
|---|---|---|---|
| char_uuid | Yes | ||
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does not disclose key behaviors such as subscription duration, whether it enables CCCD, or if it returns immediately. The minimal description provides little beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence and very concise, but it lacks structure and detail. While not verbose, it sacrifices completeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of BLE subscription and the absence of output schema and parameter descriptions, the description is woefully incomplete. It fails to explain the flow, lifecycle, or how to interact with related tools like ble_unsubscribe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description adds no meaning to the parameters char_uuid or connection_id. Users must infer their purpose from context, which is insufficient for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Subscribe' and the resource 'notifications/indications on a characteristic'. This effectively distinguishes the tool from siblings like ble_read, ble_write, ble_unsubscribe, and others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool, prerequisites (e.g., characteristic discovery, connection), or alternatives. The description lacks explicit usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_subscriptions_listA
List all active subscriptions with their status, queue depth, and dropped count. Optionally filter by connection_id. Useful for recovering subscription IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | No | Optional: only list subscriptions for this connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the output but does not disclose behavioral traits like state requirements or side effects. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose. No redundant words or information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description is fairly complete. It mentions the returned fields and a specific use case, though it could add pagination or limits if applicable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with description for the only parameter. The description adds no new semantic value beyond the schema's parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list), the resource (active subscriptions), and the returned fields (status, queue depth, dropped count). It distinguishes from siblings like ble_subscribe and ble_unsubscribe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions optional filtering by connection_id and a specific use case (recovering subscription IDs). While it doesn't explicitly state when not to use it, the context is clear given sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_tasks_cancelB
Cancel a running background task by task_id.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task ID to cancel (from ble.tasks.list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only states the action without disclosing consequences (e.g., irreversibility, side effects, success/failure states). This is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with key information, and contains no fluff. However, it could be slightly expanded to include behavioral context without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers the basics. It lacks details on return values or error handling, but the tool's simplicity makes this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter. The description adds no new meaning beyond the schema, which already explains the parameter's source. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (cancel), the resource (running background task), and the input (task_id). It uniquely identifies the tool among siblings, as none other performs cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies basic usage (call with task_id) but lacks explicit when-to-use, when-not-to-use, or alternatives. Given the narrow scope, the guideline is adequate but not exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_tasks_listA
List all registered background tasks (from plugins) with their status. Shows task_id, name, running/stopped, start time, and any error.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states the output fields but does not explicitly declare it as read-only or discuss side effects. The listing behavior is clear, but additional transparency (e.g., no modifications, no permissions required) would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action ('List all registered background tasks'), and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 listing behavior, the description fully covers what the tool does and what it returns. It is complete for an agent to understand and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters with 100% coverage trivially. The baseline for no parameters is 4, and the description adds no extra parameter details, which is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists registered background tasks with status and specific fields (task_id, name, running/stopped, etc.). It distinguishes itself from siblings like ble_tasks_cancel by its listing function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. However, the lack of parameters and simple listing nature implies it is a general-purpose status check. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_trace_statusB
Return tracing config and event count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It only states it returns data but does not mention side effects (e.g., read-only), prerequisites (e.g., a connection), or performance characteristics. This minimal disclosure is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence: 'Return tracing config and event count.' No wasted words, immediately front-loaded with the verb and resource. Perfect conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema), the description is adequate but leaves room for interpretation. It doesn't explain what 'tracing config' comprises or how the event count is useful. For a straightforward status tool, it is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100%. The description does not need to add parameter meaning beyond the schema. The baseline for no parameters is 4, and the description effectively communicates the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns tracing config and event count, which is a specific verb+resource. It distinguishes from siblings like ble_trace_tail (which returns trace logs) by focusing on status. However, 'tracing config' is somewhat vague, preventing a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives like ble_trace_tail or ble_scan_get_results. The description lacks when-to-use or when-not-to-use instructions, leaving the agent to infer usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_trace_tailC
Return last N trace events (default 50).
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Number of recent events to return (default 50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does not disclose any behavioral traits such as blocking behavior, resource constraints, or connection requirements. The minimal description fails to inform the agent of important behavioral aspects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, concise and to the point, with no wasted words. It is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, the description is insufficiently complete. It does not explain what trace events are, how they relate to other BLE tracing tools, or what the output format looks like. For a tool with many siblings, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single parameter 'n', already describing its default and purpose. The tool description adds no additional meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Return[s] last N trace events', specifying the verb and resource. It is distinct from sibling tools like 'ble_trace_status' which likely returns status information. However, it does not define what 'trace events' are in the BLE context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description simply states its function without indicating prerequisites, context, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_unsubscribeC
Unsubscribe from a previously created subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | ||
| subscription_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits such as whether the operation is destructive, reversible, or idempotent. It only says 'unsubscribe', leaving the agent to infer effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, but lacks necessary details. It is not verbose, but under-specification counteracts conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of BLE tooling with many siblings, the description is insufficient. It does not mention prerequisites, side effects, or return values, leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and description does not explain parameters (connection_id, subscription_id). Agent must guess their meaning and format, though siblings may provide implicit context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'unsubscribe' and the resource 'subscription', which directly matches the tool name and distinguishes from sibling tools like ble_subscribe and ble_subscriptions_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives (e.g., ble_subscriptions_list to view active subscriptions, or conditions like needing an active connection). Lacks prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_wait_notificationA
Block until the next single notification arrives on a subscription, or timeout. For bursty / bulk flows (e.g. downloading a dataset or log file) prefer ble.drain_notifications instead.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_s | No | Max seconds to wait (default 10, max 60). | |
| connection_id | Yes | ||
| subscription_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes blocking behavior and timeout but does not disclose what happens on error (e.g., invalid subscription, disconnection) or what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence packed with essential information, no wasted words, front-loaded with action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple blocking tool with 3 params and no output schema, the core behavior and usage guideline are covered. However, lacks details on return value and error handling, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only 'timeout_s' described). Description adds no meaning for required parameters 'connection_id' and 'subscription_id', which remain undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it blocks until the next single notification arrives or timeout, and distinguishes from sibling 'ble_drain_notifications' for bursty flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides a when-not-to-use guideline: for bursty/bulk flows, prefer 'ble_drain_notifications' instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_writeA
Write a value to a GATT characteristic. Requires BLE_MCP_ALLOW_WRITES=true at server startup. Provide value as base64 (value_b64) or hex (value_hex).
| Name | Required | Description | Default |
|---|---|---|---|
| char_uuid | Yes | ||
| value_b64 | No | Base64-encoded value to write. | |
| value_hex | No | Hex-encoded value to write. | |
| connection_id | Yes | ||
| with_response | No | Use write-with-response (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the need for a configuration variable and two encoding formats. However, it does not describe side effects, failure behavior, or the fact that this is a mutation operation. The with_response parameter's behavior is hinted at in the schema but not elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no extraneous information. It front-loads the primary action and encodes essential constraints efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists. The description does not specify return values or success/failure indicators. It also does not mention that writing requires an active connection or other contextual dependencies, though these may be inferred from tool names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60% (3 of 5 parameters have descriptions). The description adds value by clarifying that value_b64 and value_hex are alternative encodings for the write value, which is not obvious from the schema alone. It does not describe connection_id or char_uuid, but those are standard BLE parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Write a value to a GATT characteristic', a specific verb-resource pair. Among 33 sibling tools, ble_write is uniquely identified for writing to characteristics, distinct from ble_write_descriptor and other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite (BLE_MCP_ALLOW_WRITES=true) and provides encoding options. It lacks explicit when-to-use comparisons with alternatives, but the self-explanatory name and context make usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ble_write_descriptorA
Write to a GATT descriptor by handle. Requires BLE_MCP_ALLOW_WRITES=true. Rarely needed directly — bleak handles CCCD for notify/indicate automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The descriptor handle (integer). | |
| value_b64 | No | Base64-encoded value. | |
| value_hex | No | Hex-encoded value. | |
| connection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It mentions the environment variable requirement but does not elaborate on side effects, error behavior, or permissions needed for the write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at two sentences. Every sentence provides essential information without redundancy, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is adequate but not comprehensive. It explains the basic function and key prerequisite, but lacks details on parameter encoding, success/error responses, and how to specify a descriptor (only handle is mentioned).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (75%), so the baseline is 3. The description does not add meaningful value beyond the schema; it simply restates the handle concept. It does not clarify the relationship between value_b64 and value_hex or provide usage examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Write') and the resource ('GATT descriptor by handle'). It distinguishes from sibling tools by noting it's rarely needed directly since bleak handles CCCD automatically, which differentiates it from ble_subscribe and other notification-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite (BLE_MCP_ALLOW_WRITES=true) and a clear indication of when not to use it (for notify/indicate setup). It does not explicitly list alternative tools but the context is strong enough to guide an agent.
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. Dates show when Glama detected each change.
35 tool updates
v0.1.0- First observed
ble_connect - First observed
ble_connection_status - First observed
ble_connections_list - First observed
ble_disconnect - First observed
ble_discover - First observed
ble_drain_notifications - First observed
ble_mtu - First observed
ble_plugin_list - First observed
ble_plugin_load - First observed
ble_plugin_reload - First observed
ble_plugin_template - First observed
ble_poll_notifications - First observed
ble_read - First observed
ble_read_descriptor - First observed
ble_scan_get_results - First observed
ble_scan_start - First observed
ble_scan_stop - First observed
ble_scans_list - First observed
ble_spec_attach - First observed
ble_spec_get - First observed
ble_spec_list - First observed
ble_spec_read - First observed
ble_spec_register - First observed
ble_spec_search - First observed
ble_spec_template - First observed
ble_subscribe - First observed
ble_subscriptions_list - First observed
ble_tasks_cancel - First observed
ble_tasks_list - First observed
ble_trace_status - First observed
ble_trace_tail - First observed
ble_unsubscribe - First observed
ble_wait_notification - First observed
ble_write - First observed
ble_write_descriptor
TDQS
Each tool targets a distinct BLE operation, from scanning to connection management, GATT operations, subscriptions, spec/plugin management, and tracing. Even similar notification tools are clearly differentiated by behavior (blocking, non-blocking, batch).
All tools follow a consistent snake_case convention prefixed with 'ble_', using a noun_verb pattern (e.g., ble_scan_start, ble_connect, ble_read). The grouping by domain (scan, connection, spec, plugin) is logical and predictable.
35 tools cover a complex domain comprehensively, but the count is slightly high. However, each tool serves a specific purpose, so the scope is justified without unnecessary overlap.
The surface covers the full BLE lifecycle: scanning, connection, GATT discovery, read/write, notifications, descriptors, plus advanced features like spec management, plugins, tracing, and task management. No obvious gaps for the intended domain.
Maintenance
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
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.16BSD 2-Clause "Simplified"
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control Bluetooth audio devices via MCP tools, including battery status, connect/disconnect, find-my, and snoop decoding.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for the mimOE AI Agent, enabling on-device tools like device discovery, network insight, and persistent note storage via natural language.-
- AlicenseNot gradedqualityAmaintenanceProvides a local MCP server for Bluetooth Low Energy automation, enabling scanning, GATT inspection, characteristic reads and writes, and evidence capture, diff, and replay with safety guards.10MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/es617/ble-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server