Local, single-user MCP server for git-versioned modular conversational music composition with Claude Code + Strudel
Server has 29 tools with mostly complete schemas and descriptions. Naming follows verb_noun convention (fragment_save, part_create, etc.). Descriptions average ~100-150 chars, meeting baseline. However, several critical gaps: (1) Many parameter descriptions lack format/constraint details (e.g., 'id' params say 'Lowercase id with hyphens' but no regex/pattern in schema); (2) Output schemas are not documented, tools return data but LLM cannot predict structure; (3) Error handling is absent, no guidance on retryability, user-fixable vs fatal errors; (4) Some parameters underdescribed (e.g., 'code' in live_play has no validation hints); (5) Tool 29 (prompt/fragment_and_clip) mixes two concerns (generate + create clip), should split. Composition is reasonable but output chaining unclear.
Create or update an arrangement: ordered sequence of parts with cycles each. Stored in arrangements/<id>.arrangement.yaml. Validates all referenced parts exist. Auto-commits.
List all arrangements in the project. Optional filters: tag, search.
Play an arrangement live: each section plays in sequence for its cycles. Uses Strudel arrange(). Substitutes any currently playing audio.
Render an arrangement to Strudel code WITHOUT playing. Use to inspect what would play or to export.
Cria um clip em uma song: referencia um fragment, uma track, e define start + duration em cycles.
Remove um clip de uma song.
Output schemas not documented. Tools return data (frontmatter, code, metadata) but LLM cannot predict structure. Breaks downstream tool chaining and forces LLM to guess field names.
Error handling absent. No guidance on retryability, user-fixable errors, or recovery steps. Tools may fail silently or return opaque errors.
Parameter constraints not formalized in schema. Descriptions say 'Lowercase id with hyphens' but JSON Schema lacks pattern/regex. LLM cannot validate before calling.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Move um clip para novo start (em cycles) dentro da mesma song.
Redimensiona um clip (muda duration).
Troca o fragment de um clip (mantém track, start, duration).
Branch: duplica um fragment existente para um novo id, preservando metadata (tags/bpm/key). Útil para experimentar variações sem perder o original. Commit "+<new> (branch de <source>)".
Remove um fragment do disco e do git. Commit "-<id>".
List all fragments in the project. Optional filters: tag, bpm, key, search (substring).
Load a fragment by id. Returns its frontmatter and Strudel code.
Play a saved fragment live. Replaces any currently playing pattern.
Regenera um fragment: substitui o código preservando metadata (tags/bpm/key/name). Atualiza created. Opcional novo prompt. Commit "~<id>: <prompt>" (til = regen, ≠ + de novo). Use `git diff HEAD~1 <path>` pra ver evolução.
Save a Strudel fragment to fragments/<id>.str with YAML frontmatter and auto-commit. Returns confirmation.
Play arbitrary Strudel code live (NOT persisted). Use this to iterate before saving.
Stop all audio immediately.
Create or update a part: a group of fragments that play together as stack(). Lints fragments for setcpm/setcps (rejected — BPM belongs to the part).
List all parts in the project. Optional filters: tag, search.
Play a part live by combining all its fragments as stack(). Substitutes any currently playing audio.
Gera um fragment via prompt (Claude) e cria um clip referenciando-o em uma song. Salva o fragment automaticamente.
Cria ou atualiza uma song em songs/<id>.song.yaml. Uma song é um container de clips (cada clip = fragment + track + timing).
Lista todas as songs do projeto. Filtros opcionais: tag, search.
Toca uma song: renderiza todos os clips, agrupa por track, stacks cada track, depois arrange() sequencial. Substitui qualquer áudio tocando.
Renderiza uma song para código Strudel SEM tocar. Útil pra inspecionar ou exportar.
Cria ou atualiza uma track (faixa de instrumento) em tracks/<id>.track.yaml. Tracks são globais do projeto e referenciadas por clips em songs.
Remove uma track do projeto. Clips referenciando essa track não são deletados (orphaned).
Lista todas as tracks do projeto. Filtros opcionais: tag, search.
Tool 29 (prompt/fragment_and_clip) combines two responsibilities: generate fragment via Claude + create clip. Should split into separate tools for composability.
Destructive tools (fragment_delete, track_delete, clip_delete) lack confirmation/dry-run support. No guard against accidental deletion.