MCP server that lets Claude act as a network radio DJ, streaming live-coded music via Strudel
Claude DJ MCP shows reasonable intent but suffers from critical gaps in schema documentation, parameter descriptions, and error handling. While tool names follow verb-noun conventions (start_session, play_pattern, stop_music) and descriptions exist for all 9 tools, the implementation lacks visible input/output schemas in the provided code, parameter-level documentation, and structured error recovery patterns. The tools range from 73 - 131 characters in description length, which is below the 194-char production baseline. Parameters like 'code', 'bpm', 'cps', 'voice', 'rate', and 'category' are mentioned but lack formal type constraints, ranges, enums, or detailed constraints in the schema layer. Risk annotations (READ_ONLY, WRITE) are present but tool annotations (readOnlyHint, destructiveHint, idempotentHint) are not visible in the code. The HTTP server implementation is well-structured with CORS and graceful port fallback, but the MCP layer does not show defensive input validation, actionable error messages, or recovery guidance for common failure modes (e.g., what if Strudel evaluation fails, or TTS is unavailable on Linux).
Check for any pending listener requests without waiting. Returns the list of requests in the queue.
Use text-to-speech to announce over the music. All listeners hear the announcement in the stream. Works on macOS (say) and Linux (espeak-ng).
Get a formatted list of all available Strudel sounds organized by category (drums, synths, instruments, effects). Optionally filter by category.
Get the current state of the browser: whether audio is started, active code, errors, and tempo (CPS).
Send Strudel pattern code to the browser REPL for evaluation. The code will be set and evaluated in the Strudel editor.
Set the playback tempo. Provide either BPM or CPS (cycles per second). For 4/4 time: CPS = BPM / 240.
No visible input schemas with types and constraints for any tool. Parameter 'code' in play_pattern lacks type validation, length limits, or error recovery guidance. Parameters 'bpm' and 'cps' in set_tempo lack min/max bounds or mutual-exclusivity documentation.
No output schemas documented for any tool. Callers cannot infer what fields to expect from start_session (returns URL, port, listener count?), get_session_state (what fields?), or get_available_sounds (array structure?). Forces LLM to guess downstream structure.
Parameters lack descriptions and constraints. 'category' in get_available_sounds states allowed values ('drums', 'synths', 'instruments', 'effects', 'all') in tool description but not in formal enum schema. 'voice' in dj_speak mixes examples ('Samantha', 'Alex') with OS-dependent values, no validation or error guidance for unsupported voices.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Start a DJ session: launches HTTP server and initializes the audio engine. Returns stream URL with LAN IP. Anyone on the network can tune in.
Stop the currently playing Strudel pattern.
Pause the DJ loop for N seconds and return any pending listener requests and current listener count. Use this to let a pattern play and gather user input.
No error recovery guidance. If TTS fails on Linux (espeak-ng not installed), play_pattern returns invalid Strudel code, or HTTP server port exhaustion occurs, no tool specifies what the LLM should do next. No recovery tools or fallback paths documented.
start_session initiates a side effect (launches HTTP server, binds to 0.0.0.0) but lacks idempotency documentation. If called twice, behavior unclear, does it reuse the port or start a second server? No confirmation step for irreversible operations.
Prompts feature is enabled but no prompts are visible in the provided code excerpt. registerPrompts() is called but content not shown. Verify prompts exist and are properly structured.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) not visible in tool registration. Risk field is present in metadata but not propagated to formal spec annotations. Modern MCP clients rely on annotations for safety and UI guidance.