MCP server for Sonic Pi: natural-language DJ sessions, OSC, queue runner, tools and prompts
The server defines 4 tools with schemas and descriptions present. Tool names start with verbs (queue_, run_, stop_, play_) which is good. However, descriptions are concise but lack depth on error handling and recovery scenarios. Parameters are typed with Zod but some descriptions could be more actionable. Output schemas are not explicitly documented. The queue_segment and run_code tools are near-duplicates which violates single-responsibility. play_note has good parameter constraints (MIDI range 0-127). No tool annotation hints (readOnlyHint, destructiveHint) despite clear side effects.
Play a single test note (quick sanity check). Not for full DJ segments—use queue_segment for those.
Push the next music segment to Sonic Pi. Use with the v2 DJ session runner for crossfaded handoffs. Prefer this over ad-hoc snippets for long sets.
Alias of queue_segment for compatibility. Sends Sonic Pi code over OSC to the session runner.
Hard stop: stop all running Sonic Pi jobs (like the Stop button). Use sparingly; prefer queue_segment for musical transitions.
Duplicate tools: queue_segment and run_code perform identical actions (push code to Sonic Pi via OSC). LLMs waste reasoning cycles deciding between them; violates single-responsibility.
Missing tool annotations. stop_all and queue_segment are destructive/irreversible but lack destructiveHint annotation. Without annotations, LLMs cannot determine safety and may invoke carelessly.
Output schemas not documented. Tools return text-only responses like 'Segment queued to Sonic Pi (OSC)' but the response type contract is not explicitly declared. LLMs cannot reason about downstream processing.
Error handling incomplete. No guidance on what to do if OSC send fails (network down, Sonic Pi not listening). Descriptions mention 'OSC' but not failure scenarios or recovery steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
play_note description is clear but optional parameters (synth, sustain, cutoff) lack concrete examples or guidance. LLMs may pass invalid synth names like ':invalid_synth' without knowing valid options.