MCP server for controlling Sonic Pi via psonic library
The server has 4 tools with basic definitions but significant quality gaps. Naming follows verb_noun convention reasonably well. However, descriptions lack depth and specificity for LLM decision-making. Parameter schemas are present but minimal. Most critically, the tools have generic error handling that returns strings rather than structured error guidance. The server is designed for a very narrow domain (Sonic Pi music) and lacks the sophistication expected of production tools.
Get drum beat patterns for Sonic Pi. Args: style: Beat style (blues, rock, jazz, hiphop, etc.) Returns: Sonic Pi code for the requested beat pattern
Initialize the Sonic Pi server Returns: The system prompt for the server
Play music using Sonic Pi code. Args: code: Sonic Pi Ruby code Returns: A confirmation message
Stop all currently playing Sonic Pi music. Returns: A confirmation message
No enum constraint on 'style' parameter in get_beat_pattern despite hardcoded valid values (blues, rock, jazz, hiphop, electronic). LLM can hallucinate invalid beat styles.
play_music tool lacks critical metadata: no mention of state modification, no error recovery guidance, no idempotency guarantee. Descriptions do not inform LLM whether tool is safe to retry on failure.
All tools return unstructured error strings ('Error: ...') instead of structured error objects. LLM cannot parse error type, classification (retryable/fatal), or next steps. Violates error-classification pattern.
Tool descriptions are generic and lack context about when to use each tool. No guidance on multi-step workflows (e.g., 'call initialize_sonic_pi first'). Descriptions average ~50 chars, well below production baseline of 194 chars.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
No output schemas documented for any tool. LLMs cannot predict return structure or plan downstream calls. play_music and stop_music return confirmation strings, get_beat_pattern returns Ruby code string, but nothing is formally documented.
play_music and stop_music lack idempotency guarantees. If Sonic Pi is unresponsive, LLM may retry indefinitely. No documentation of side effects or state changes.
Dependency on external Sonic Pi server not documented in tool descriptions. initialize_sonic_pi performs a check but other tools do not clearly state prerequisite. LLM may attempt play_music without initializing.