ble-fleet-mcp
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-fleet-mcpRead temperature from all sensors in the warehouse"
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-fleet-mcp
An MCP server that lets an AI agent manage a fleet of constrained-connection devices — 10, 100, or 1000+ of them — without ever having to know or reason about how many the underlying radio can actually hold open at once.
BLE radios typically support somewhere between 3 and 7 simultaneous connections.
Existing BLE-to-MCP bridges expose scan / connect / read / write / subscribe
as direct tools and leave connection management to the agent. That breaks down the
moment a task involves more devices than the radio can hold open: "check the
temperature on all 40 sensors in the warehouse" turns into forty manual
connect/read/disconnect cycles, with the agent doing the bookkeeping itself — wasted
tokens, wasted latency, and a real failure mode when it gets the bookkeeping wrong.
ble-fleet-mcp hides all of that. The agent asks for fleet-level outcomes — "read
all sensors", "set brightness on every light in Zone 2" — and the server handles
connection pooling, scheduling, retries, and partial failures underneath, inside a
hard concurrency cap it enforces itself.
Agent ──MCP──▶ fleet_read("warehouse", "temperature_c")
│
▼
[ scheduler batches 40 devices behind a 4-connection pool,
retries failures with backoff, circuit-breaks the
unresponsive ones, evicts idle connections to make room ]
│
▼
{ "SIM:0001": 21.4, "SIM:0002": "unreachable", ... }Safety
Read-only by default.
fleet_writerefuses to run unless the server is started withFLEET_ALLOW_WRITES=1— same posture asble-mcp-server.Verify-after-write. Every write is followed by a readback; the result reports both
acknowledged(the device accepted the write) andconverged(the readback actually matches what was requested) rather than trusting the ack alone.Risk tiering. Devices registered as
safety_critical(e.g. a lock, in a fleet that also has light bulbs) are excluded fromfleet_writebatches by default and reported asconfirmation_required, unless their address is explicitly listed inconfirm_addresseson that call. A bulk write to "everything in Zone 2" can never silently include a lock.Nothing is silently dropped. Every device in a fleet operation resolves to
success, a specific error (unreachable,timeout,write_rejected), orstill_queued(pollable viafleet_operation_status) — never just missing.One bad device can't take down the fleet. Per-device timeouts and a circuit breaker isolate unresponsive devices; see docs/architecture.md.
Related MCP server: BLE MCP Server
Quick start
pip install ble-fleet-mcpOr with uv:
uv add ble-fleet-mcpRun it directly to sanity-check your BLE setup:
fleet-mcpIt speaks MCP over stdio, so in practice it's launched by your MCP client (see below), not run standalone. A minimal session, once connected from an agent:
fleet_register(name="warehouse", name_pattern="sensor")
-> {"fleet": "warehouse", "device_count": 40, "addresses": [...]}
fleet_read(fleet="warehouse", resource="temperature_c")
-> {"operation_id": "…", "status": "completed", "total": 40, "completed": 40,
"results": {"AA:BB:...:01": {"status": "success", "value": 21.4}, ...}}No BLE hardware handy? examples/simulated_fleet/ runs
the exact same tool layer against a simulated fleet of virtual peripherals:
uv run python examples/simulated_fleet/demo.py --devices 50 --cap 4Registering 50 simulated sensors (radio cap: 4)...
Reading temperature_c across the whole fleet...
Done in 1.64s over 50 devices with only 4 connections.
Status breakdown: {
"success": 50
}Adding it to your client
ble-fleet-mcp speaks standard MCP over stdio, so it works with any MCP-compatible
client. Writes stay off unless you explicitly set FLEET_ALLOW_WRITES=1.
Claude Code
claude mcp add fleet-mcp -- fleet-mcpOr add it to .mcp.json directly:
{
"mcpServers": {
"fleet-mcp": {
"command": "fleet-mcp",
"env": {
"FLEET_MAX_CONNECTIONS": "4",
"FLEET_ALLOW_WRITES": "0"
}
}
}
}Claude Desktop
Add to your claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"fleet-mcp": {
"command": "fleet-mcp",
"env": {
"FLEET_MAX_CONNECTIONS": "4",
"FLEET_ALLOW_WRITES": "0"
}
}
}
}Cursor
Add to .cursor/mcp.json in your project (or the global ~/.cursor/mcp.json):
{
"mcpServers": {
"fleet-mcp": {
"command": "fleet-mcp",
"env": {
"FLEET_MAX_CONNECTIONS": "4",
"FLEET_ALLOW_WRITES": "0"
}
}
}
}VS Code (Copilot)
Add to .vscode/mcp.json:
{
"servers": {
"fleet-mcp": {
"type": "stdio",
"command": "fleet-mcp",
"env": {
"FLEET_MAX_CONNECTIONS": "4",
"FLEET_ALLOW_WRITES": "0"
}
}
}
}Tools
Tool | Purpose |
| Register a device or group (address list, name pattern, or service UUIDs) into a named fleet. |
| Discover devices matching a filter, without connecting or registering. |
| Read one resource across a fleet (or subset). Per-device results, not all-or-nothing. |
| Write one resource across a fleet. Requires |
| Subscribe to / unsubscribe from / poll buffered, debounced notifications for a resource across a fleet. |
| Per-device health: healthy/unhealthy, consecutive failures, connected. |
| Connection pool telemetry: active/idle/evicting counts, queue depth, per-device wait times. |
| Poll a |
Full input/output schemas: docs/tools.md. Design rationale for the pool manager, scheduler, and circuit breaker: docs/architecture.md.
Environment variables
Variable | Default | Meaning |
|
| Hard cap on simultaneous BLE connections. Match this to what you measured for your adapter — see docs/hardware-validation.md. |
|
| Set to |
|
| Whether |
|
| Per-device timeout (connect + operation) before it's treated as a failure. |
|
| Default overall timeout for a |
|
| Initial per-device retry backoff. |
|
| Cap on per-device retry backoff. |
|
| Exponential backoff multiplier. |
|
| Consecutive failures before a device is marked unhealthy and stops being retried. |
|
| How long an unhealthy device is skipped before a single probe attempt is allowed through. |
|
| Structured JSONL tracing of pool/scheduler events. |
|
| Where trace events are written. |
|
| Log level; logs always go to stderr so stdout stays clean for the MCP stdio transport. |
| unset (disabled) | Set to a port number to serve the web dashboard on that port. Off by default — see below. |
|
| Dashboard bind address. Localhost only unless you explicitly widen it — there's no authentication. |
Web dashboard
A minimal, read-only dashboard over the same telemetry fleet_pool_status/fleet_status
already expose: live connection pool gauges, per-device health, recent operations, and
active watches. It's a stdlib http.server running in a background thread — no extra
dependency, and it reads straight from the running server's in-memory state, so it's
always exactly in sync.
Off by default. Enable it by setting FLEET_DASHBOARD_PORT:
FLEET_DASHBOARD_PORT=8765 fleet-mcp
# open http://127.0.0.1:8765No hardware or MCP client needed to see it in action —
examples/simulated_fleet/dashboard_demo.py
runs the dashboard against a lively simulated fleet:
uv run python examples/simulated_fleet/dashboard_demo.py --devices 30 --cap 4
# open http://127.0.0.1:8765Transports
Transport | Status |
BLE (via | v1, shipped |
Zigbee coordinator | Roadmap, not started |
Thread border router | Roadmap, not started |
The pool manager, scheduler, and MCP tool layer never import anything transport-specific — a new transport is a plugin, not a rewrite. See CONTRIBUTING.md.
Roadmap (not blocking 1.0.0)
A second transport plugin (Zigbee or Thread) to prove the plugin interface generalizes beyond BLE.
A "fleet template" registry for shareable configs of common device populations.
Development
git clone https://github.com/JephinJose/ble-fleet-mcp.git
cd ble-fleet-mcp
uv sync --extra dev
uv run pre-commit install
uv run pytest tests/unitSee CONTRIBUTING.md for the full workflow and how to add a transport plugin.
License
MIT — see LICENSE.
Available Tools
8 toolsfleet_operation_statusA
Poll a fleet_read/fleet_write batch by operation_id for partial or complete results. Never returns a silently-dropped device: every device resolves to success, a specific error, or still_queued.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It discloses the critical guarantee that no device is silently dropped (each resolves to success, specific error, or still_queued) and that results can be partial or complete. This is valuable behavioral context beyond the schema. It could mention auth/rate limits but those are not critical for a status poll.
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, no filler, front-loaded with the core purpose. The second sentence adds an important behavioral guarantee without verbosity.
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?
With a single parameter and an output schema present, the description delivers the essential context: what it polls, what it returns (partial/complete, and the device resolution guarantees). It is sufficiently complete for an agent to 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 only parameter, operation_id, is described as identifying the batch to poll, adding meaning beyond the schema's bare 'Operation Id' title. Since schema coverage is 0%, this mention partially compensates and clarifies the parameter's role.
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 uses a specific verb ('poll') and identifies the resource ('a fleet_read/fleet_write batch') and the key discriminator ('by operation_id'). This clearly distinguishes it from sibling tools like fleet_read/fleet_write (which initiate operations) and fleet_status (which likely shows general fleet 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?
It clearly implies usage after a fleet_read/fleet_write batch has been issued, with operation_id as the handle. However, it doesn't explicitly mention alternatives or exclusions (e.g., 'use fleet_status for...'), so it's one step below full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_pool_statusA
Connection pool telemetry: active/idle/evicting connection counts, queue depth, and per-device wait times. The live debugging surface for the pool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 specific telemetry data returned and the 'live' nature, but it does not explicitly state that the operation is non-destructive or mention any side effects. This is a minor gap for a status/telemetry 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 two sentences, front-loaded with the key data points and a memorable label ('live debugging surface'). Every word earns its place with no filler.
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 zero-parameter, read-only telemetry tool with an output schema, the description sufficiently conveys purpose and return content. It could be strengthened by referencing sibling tools, but the simplicity of the tool makes this adequate.
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 the schema fully covers parameter semantics. The description adds useful context about what the telemetry covers, but no parameter-specific explanation is needed.
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 identifies the tool's focus as connection pool telemetry and lists specific metrics (active/idle/evicting counts, queue depth, wait times), which clearly distinguishes it from sibling fleet-level tools like fleet_status. It lacks a direct verb, but 'telemetry' implies 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?
Calling it 'the live debugging surface for the pool' gives a clear context for when to use it (debugging pool state), but it does not explicitly compare to alternatives such as fleet_status or fleet_operation_status, nor state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_readA
Read one resource across every device in a fleet, or a subset by address. Returns per-device results (success / unreachable / timeout / still_queued) as an operation snapshot keyed by operation_id.
| Name | Required | Description | Default |
|---|---|---|---|
| fleet | Yes | ||
| priority | No | normal | |
| resource | Yes | ||
| addresses | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 discloses an asynchronous behavior via 'operation snapshot keyed by operation_id' and lists per-device result statuses (success/unreachable/timeout/still_queued). However, it does not explain the operation lifecycle, how to retrieve final results, or any side effects/auth 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?
The description is two sentences, front-loaded with the core action, and every phrase adds value—scope ('across every device'), optional subsetting, and the response format. 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?
The description covers the core read operation and result statuses, and an output schema exists to detail return values. However, the mention of 'operation_id' introduces a follow-up workflow (likely fleet_operation_status) that is not referenced, and key parameters like priority/timeout_s are unexplained. This leaves meaningful gaps for a 5-parameter async 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?
Schema description coverage is 0%, so the description must compensate. It only adds meaning for 'addresses' via 'or a subset by address.' Parameters 'fleet' and 'resource' are self-explanatory, but 'priority' and 'timeout_s' are not described at all, leaving their semantics unclear.
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: 'Read one resource across every device in a fleet, or a subset by address.' This is specific and differentiates from siblings like fleet_write (write) and fleet_scan/watchers (other operations). The verb 'read' and resource scope are explicit.
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 a clear use case (reading a resource fleet-wide or by subset) but does not explicitly compare with alternatives like fleet_status or fleet_operation_status. It lacks when-not-to-use guidance or mention of sibling tools, so usage context is present but not fully elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_registerA
Register a device or group (by explicit address list, or by name pattern / service UUIDs discovery filter) into a named fleet. risk_tier is one of read_only, low_risk_actuator, or safety_critical; safety_critical devices are excluded from fleet_write batches unless explicitly confirmed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| addresses | No | ||
| risk_tier | No | read_only | |
| name_pattern | No | ||
| service_uuids | No | ||
| scan_timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does disclose a meaningful behavioral trait: 'safety_critical devices are excluded from fleet_write batches unless explicitly confirmed' and defines risk_tier values. However, it omits other important behaviors such as whether registration is idempotent, whether existing fleet entries are overwritten, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences, front-loaded with the core purpose, followed by a focused note on risk_tier. Every sentence adds value without redundancy or unnecessary 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?
With 6 parameters, no annotations, and an output schema, the description covers the core purpose and one key behavior but lacks context about prerequisites (e.g., whether the fleet must exist), parameter interactions, or how this tool fits with fleet_scan and fleet_write. The output schema handles return values, but other completeness gaps remain.
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 compensate. It explains risk_tier (with allowed values) and the three selection mechanisms (addresses, name_pattern, service_uuids), but does not explain scan_timeout_s, the 'name' parameter's role, or whether parameters are mutually exclusive. Partial compensation, but significant gaps remain.
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: 'Register a device or group (by explicit address list, or by name pattern / service UUIDs discovery filter) into a named fleet.' It provides specific verbs and resources, and distinguishes this from sibling tools like fleet_scan (discovery), fleet_read, and fleet_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?
The description implicitly provides usage context: use this to add devices/groups to a fleet, with alternative selection methods. It also references fleet_write behavior for safety_critical devices, giving a cross-tool guideline. However, it doesn't explicitly state when not to use this tool or directly compare with other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_scanA
Discover devices matching a filter, without connecting to or registering them. Use this to see what's out there before fleet_register.
| Name | Required | Description | Default |
|---|---|---|---|
| addresses | No | ||
| timeout_s | No | ||
| name_pattern | No | ||
| service_uuids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses that this operation is non-invasive ('without connecting to or registering them') and implies a read-only scanning action. However, it does not mention potential side effects (e.g., network traffic), timeouts, or permissions, but the core safety trait is well conveyed.
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 exceptionally concise, consisting of two sentences that deliver the core purpose, the key behavioral distinction, and usage guidance. No superfluous words or repetition.
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 and the presence of an output schema, the description covers the essential purpose and safety context. However, with no parameter explanations and no annotation support, the agent may struggle to construct the right filter arguments. The description is adequate for understanding 'why' but lacks 'how' for parameters.
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 compensate for parameter meaning, but it does not. The phrase 'matching a filter' is vague and does not explain specific parameters like 'addresses', 'name_pattern', or 'service_uuids'. Only the schema names and defaults are given, leaving the agent to infer what each parameter does.
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 function: 'Discover devices matching a filter, without connecting to or registering them.' It uses a specific verb and resource, and explicitly contrasts with fleet_register, making it distinct from siblings.
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 explicit usage guidance: 'Use this to see what's out there before fleet_register.' This names the alternative (fleet_register) and indicates when to use it (before registering). It also clarifies what the tool does not do ('without connecting to or registering'), providing a clear when-not-to-use signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_statusC
Health of every device in a fleet: healthy/unhealthy, consecutive failure count, and whether it's currently connected.
| Name | Required | Description | Default |
|---|---|---|---|
| fleet | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It states the output fields but does not explicitly indicate that the operation is read-only, has no side effects, or any authentication requirements. The read-only nature is implied but not stated.
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 wasted words. It front-loads the purpose and lists the key output attributes compactly, making it easy to scan.
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 (one parameter, output schema present), and the description covers the main output aspects. However, it lacks caveats about data freshness, behavior on non-existent fleets, or permissions, which would be valuable given the absence of annotations.
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 only parameter 'fleet' is referenced as 'in a fleet' in the description, which confirms it is the target fleet, but adds little beyond the schema. The description does not explain the expected format (e.g., fleet ID vs name) or other constraints, leaving the parameter semantics minimally enriched.
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 identifies the resource (fleet devices) and the information returned (health status, failure count, connectivity). It effectively distinguishes from sibling tools like fleet_operation_status or fleet_pool_status by focusing on device health, though it lacks an explicit verb like 'retrieves'.
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 fleet_status versus alternatives such as fleet_operation_status or fleet_pool_status. There are no stated prerequisites or exclusions, leaving the decision to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_watchA
Subscribe to (action="subscribe"), stop watching (action="unsubscribe"), or drain buffered notifications for (action="poll") a resource across a fleet. Watching a device pins one pool connection slot for as long as it's watched.
| Name | Required | Description | Default |
|---|---|---|---|
| fleet | Yes | ||
| action | No | subscribe | |
| resource | Yes | ||
| addresses | No | ||
| debounce_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 important behavioral trait that watching pins a pool connection slot for the duration, which is beyond the schema. It could add more about buffer limits or lifecycle, but the key side effect is conveyed.
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 verbs, and no filler. Every sentence contributes to understanding the tool's purpose and a critical side effect.
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 covers the core functionality and a key behavioral caveat, but lacks definition for most parameters. The presence of an output schema helps with returns, yet the tool's 5-parameter complexity demands more parameter-level explanation.
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%, and the description only explains the 'action' parameter in prose. The 'fleet', 'resource', 'addresses', and 'debounce_s' parameters are not described at all, leaving the agent to guess their meaning and constraints.
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 function with specific verbs: subscribe, unsubscribe, and poll for a resource across a fleet. It distinguishes itself from siblings like fleet_read and fleet_write by focusing on watching/notification behavior.
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 clear context on the three action modes and explicitly mentions a resource-consumption tradeoff (pinning a pool connection slot). No explicit exclusions or alternatives are named, but the guidance is sufficient for basic usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fleet_writeA
Write one resource across a fleet. Requires the server to have been started
with FLEET_ALLOW_WRITES=1. Every write is verified with a readback; the result
reports both acknowledged and converged. Devices tiered safety_critical are
skipped (status confirmation_required) unless their address is passed in
confirm_addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| fleet | Yes | ||
| value | Yes | ||
| priority | No | normal | |
| resource | Yes | ||
| addresses | No | ||
| timeout_s | No | ||
| confirm_addresses | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and uses it well: it discloses the write-allowed prerequisite, the readback verification process, and the skipping behavior for safety_critical devices. It also explains the dual reporting of acknowledged and converged. This covers the key behavioral traits beyond the basic 'write' action.
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 sentences with no filler: purpose, prerequisite, verification, and safety handling. Each sentence adds essential information without redundancy, earning a 5.
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 mutation tool with 7 parameters and no annotations, the description covers the essential behavioral context: what it writes, when it's allowed, how writes are verified, and how safety classification affects execution. Missing parameter semantics for a few fields, but the output schema likely compensates for return values, making this reasonably 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 schema has zero parameter descriptions, so the description must compensate. It adds genuine meaning for confirm_addresses (overrides safety_critical skip) and implies resource/fleet, but value, priority, addresses, and timeout_s remain undocumented. The coverage gap keeps this at a 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 opens with 'Write one resource across a fleet,' which is a specific verb and resource that clearly distinguishes it from siblings like fleet_read and fleet_scan. It also adds context about write verification and safety-category handling, leaving no ambiguity about the tool's 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?
It states a hard prerequisite (FLEET_ALLOW_WRITES=1) and explains when safety_critical devices will be skipped unless confirmed. While it doesn't explicitly name alternatives, the read/scan/watch/status siblings are implicitly differentiated by the write focus. This gives clear context without formal exclusions, matching a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct role: register, scan, read, write, watch, status, pool_status, and operation_status. The three 'status' tools are differentiated by scope (device health vs. pool telemetry vs. batch progress), though the naming overlap could cause minor confusion.
All tools share the 'fleet_' prefix and use consistent snake_case. Actions are verbs (register, scan, read, write, watch), while queries are nouns (status, pool_status, operation_status), forming a predictable pattern.
Eight tools is well-scoped for a fleet management server, covering core operations without unnecessary bloat. Each tool serves a clear purpose in the lifecycle.
The set covers discovery, registration, read/write, watching, device health, pool telemetry, and operation tracking. Missing a deregister or fleet deletion operation is a minor gap, but the primary workflows are fully supported.
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
Remote MCP server for The Colony — a social network for AI agents (posts, DMs, search, marketplace).
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.15BSD 2-Clause "Simplified"
- AlicenseAqualityCmaintenanceA stateful Bluetooth Low Energy (BLE) MCP server that enables AI agents to scan, connect, read/write characteristics, and subscribe to notifications on BLE devices.3517MIT
- AlicenseAqualityCmaintenanceMCP server for multi-agent AI systems providing mailbox messaging, A2A task delegation, resource coordination, and a web dashboard.2114MIT

tinypilot-mcpofficial
AlicenseNot gradedqualityAmaintenanceMCP server that exposes fleet-aware KVM primitives for AI agents to control TinyPilot devices, including screen capture, keyboard input, mouse events, and device selection.MIT
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/JephinJose/ble-fleet-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server