Universal Agent Plugin for safe BLE diagnostics and automation via Skill, CLI, and MCP
BLEA demonstrates solid tool design with consistent naming (verb_noun pattern: ble_scan, ble_read, ble_write), comprehensive parameter schemas with types and descriptions, and clear risk classification (READ_ONLY vs WRITE). All 15 tools have descriptions and input schemas. However, output schemas are not documented in the source code, LLMs cannot predict response structure. Error handling is minimal; tools return BleaError.to_dict() but recovery guidance is absent. Parameter descriptions are functional but terse (avg ~50 chars); some lack constraint details (e.g., ble_probe's max_reads default of 32 is not justified). Tool composition is excellent, each tool has one clear responsibility, and chaining is supported via device/characteristic IDs. Security is well-handled: no secrets in parameters, read-only operations clearly marked.
Save a validated read-only BLE evidence package as .blea.jsonl. Capture performs one discovery and one connection, then records advertisements, GATT, bounded reads, and bounded notifications. It never writes, pairs, or changes device configuration. The output path is replaced atomically only after the final summary validates.
Close a BLE session by ID.
Compare two validated BLEA evidence files without accessing Bluetooth hardware. Transient capture metadata and notification timestamps are ignored. RSSI uses a 5 dBm tolerance by default; strict_rssi compares exact values. Device identifiers must match unless allow_different_devices is explicitly enabled.
Check whether the local Bluetooth adapter and OS BLE backend are usable.
Write and read a characteristic in one operation; timeout applies separately to scan, connect, and GATT operations.
Discover GATT; timeout applies separately to scan, connect, and GATT operations.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields ble_scan returns, whether results are paginated, what ble_inspect's GATT structure looks like). This forces agents to guess and wastes tokens on trial-and-error.
Error handling lacks recovery guidance. BleaError.to_dict() returns error details, but tool descriptions do not explain what errors are possible, whether they are retryable, or what the LLM should do next (e.g., 'Device not found, try ble_scan first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
List active BLE sessions.
Observe notify/indicate characteristics on one connection for a bounded duration. When characteristics is null, all notify/indicate characteristics are observed. Timeout is per backend operation, not a total deadline.
Read one GATT page; inspect read_page and follow next_read_offset until null. ok=true means the page ran, not that every characteristic read succeeded. timeout applies separately to scan, connect, profile discovery, and each read. The full profile is omitted by default to keep repeated pages compact; use ble_inspect first or set include_profile=true.
Read a characteristic; timeout applies separately to scan, connect, and GATT operations.
Replay scan/inspect/probe/read/subscribe/observe/run from evidence without BLE hardware. speed=0 returns matching notifications immediately. Positive speed values preserve recorded notification gaps at the requested multiplier. Replay is always read-only and never exposes a write or exchange operation.
Run a named workflow; timeout applies separately to scan, connect, and each GATT operation.
Scan nearby BLE advertisements and return stable structured evidence.
Collect bounded notifications; timeout is per backend operation, not a total deadline.
Write a characteristic value; timeout applies separately to scan, connect, and GATT operations.
Parameter descriptions are terse and lack constraint details. E.g., ble_probe's max_reads defaults to 32 with no explanation of why; timeout parameters lack guidance on when to increase them; hex-encoded value in ble_write has no format constraint or example.
ble_replay has 13 optional parameters with overlapping semantics (device, characteristic, characteristics, workflow, duration, max_reads, read_offset, include_profile, name_contains, service_uuid). Descriptions do not clarify which combinations are valid or mutually exclusive, risking silent misuse.
No pagination or result limits documented. ble_scan and ble_inspect may return large result sets; no indication of max items, pagination tokens, or guidance on handling large device lists. This risks context window exhaustion.