MCP server exposing the divoom-agent semantic API as tools for LLMs (Claude, etc.)
18 tools with basic descriptions and parameter schemas, but significant gaps in LLM-optimization and error guidance. Most tool descriptions are 20-80 chars (below the 50-200 char baseline for A+ tools). Parameter descriptions exist but are minimal (e.g., 'Red channel (0-255)' lacks context on when/why to use the tool). No output schemas documented. No error handling guidance or recovery paths. Naming is verb-forward (set_, paint_, speak_) which is good, but descriptions don't explain WHEN to use each tool or what happens on failure. No tool annotations (readOnlyHint/destructiveHint). All 18 tools are write-heavy (17 WRITE, 1 READ_ONLY) but descriptions don't warn about side effects or idempotency.
Turn off the panel (set to black).
Start a breathing-sphere ambient orb animation.
Check BLE link health to the panel.
Trigger a discrete notification animation.
Paint a 16x16 grid of RGB pixels directly onto the panel.
Switch to a stored animation slot.
Trigger an alert animation at a given severity level.
Descriptions are too brief (20-80 chars) and lack LLM-optimization. Baseline for A+ tools is 50-200 chars with context on WHEN to use and WHAT happens. E.g., 'set_status' says 'Set the panel's ambient status display. Loops until replaced.' but doesn't explain when an LLM should call it (e.g., during thinking vs. after completion) or what 'loops until replaced' means operationally.
No output schemas documented. Tools return values but LLMs cannot plan downstream calls or extract structured data. E.g., is_connected returns a boolean, but the description doesn't state the return type or what the LLM should do if false (retry? alert user?).
No error handling guidance. 17 of 18 tools are destructive (WRITE) but descriptions don't warn about side effects, idempotency, or recovery paths. E.g., 'upload_animation' could fail mid-transfer; no guidance on retry or rollback.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | <=2025-11-25 | v2 |
Set the panel brightness.
Set a solid lighting color.
Set face expression for lip-sync.
Set the persistent boot channel.
Set the panel's ambient status display. Loops until replaced.
Display the built-in clock channel.
Trigger macOS `say` audio output (no lip-sync).
Trigger voice output with synced mouth animation.
Start a generative Mondrian art cycle.
Cancel any running animation.
Upload a persistent multi-frame animation to a storage slot.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot infer which tools are safe to retry, which modify state, or which are read-only. All 17 write tools should be marked destructiveHint=true.
Parameter descriptions are minimal (e.g., 'Red channel (0-255)') and lack context. Baseline is 50-100 chars with format, range, and use-case hints. E.g., 'slot' in upload_animation should explain valid range, what happens if slot is full, and whether slots persist across reboots.