MCP server for tonearmd: read Roon state, search the library, put music on.
Server has 6 tools with clear naming (verb_noun pattern: tonearm_status, tonearm_search, tonearm_play, tonearm_control, tonearm_transfer, tonearm_pin). Descriptions are present and reasonably detailed (80-150 chars each). Input schemas are visible and properly typed with Zod validation. However, parameter descriptions are minimal or absent in several tools, output schemas are not formally documented, and error handling lacks recovery guidance. The code shows good defensive practices (error wrapping, state polling for commands) but tool definitions could be more LLM-optimized.
Transport control for the followed zone.
Change which zone the bar widget follows. Pass 'unpin' to resume auto-follow.
Play a search result in the zone the widget is following.
Search the Roon library. Returns albums and tracks with refs to pass to tonearm_play.
What is playing on Roon right now, and which zones exist.
Move what is playing to another zone, keeping the track and position.
Parameter descriptions are minimal or missing. 'ref' in tonearm_play has a description, but 'action' enum in tonearm_control lacks explanation of what each action does (playpause vs pause distinction unclear). 'zone' in tonearm_transfer and tonearm_pin lack guidance on valid zone names or how to discover them.
Output schemas are not formally documented. Tools return text responses via the `text()` helper, but the structure (e.g., what fields describe() returns, pagination for search results) is not declared. LLMs cannot plan downstream calls without knowing output shape.
Error messages lack recovery guidance. The `fail()` helper returns raw error text (e.g., 'UnknownZoneError'), but does not suggest next steps (e.g., 'Zone not found. Call tonearm_status to see available zones'). Agents cannot self-correct without explicit guidance.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | <=2025-11-25 | v2 |
tonearm_search returns results as free-form text. No structured output with refs, titles, artists, or album info. LLMs must parse unstructured text to extract refs for tonearm_play, increasing error likelihood and token waste.
Tool descriptions do not clarify state-modifying behavior. tonearm_play, tonearm_control, tonearm_transfer, and tonearm_pin all modify playback state, but descriptions do not explicitly state 'This modifies playback' or 'This is a write operation'. Agents need to know which calls are safe to retry.