Strudel MCP Server
Strudel MCP Server lets an AI client drive Strudel.cc for live-coding music: browser setup, pattern editing/playback, generation, analysis, sessions, storage, MIDI/audio export, and AI assistance.
Initialize a Chromium/Strudel.cc session and control playback and tempo.
Read/write/edit patterns (append, insert, replace, clear), with undo/redo/history compare/restore.
Apply transforms (transpose, reverse, stretch, quantize, humanize, swing, scale, vary), effects, and mood/energy/refine shaping.
Generate full patterns or individual drums/bass/melody/fill layers, Euclidean/polyrhythmic rhythms, and music-theory scale/chord progressions.
Analyze live audio for spectrum, rhythm, tempo, and key; validate, statically analyze, query events, or transpile patterns.
Save/load/list on-disk patterns; import/export MIDI; capture or export live audio; screenshot the browser.
Create/destroy/list/switch isolated multi-session browser contexts and inspect diagnostics.
Use Gemini-backed AI feedback, suggestions, and jam layers when configured.
Enables AI-powered music generation and live coding through Strudel.cc, providing pattern management, audio analysis, and real-time control of TidalCycles/Strudel patterns for interactive music creation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Strudel MCP Servercreate a techno beat at 128 BPM"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
live-coding-music-mcp
🎵 MCP server for AI-assisted live-coding music via strudel.cc
Unofficial fan project. Not affiliated with, or endorsed by, the Strudel project. This adapter exists to make live-coding music accessible to beginners who want to try pattern-based music without learning the whole ecosystem first.
Status: Beta | 88% statement coverage | Published to npm | Actively developed
A Model Context Protocol (MCP) server that drives Strudel.cc from Claude for AI-assisted live-coding music, pattern generation, and algorithmic composition.
Current State: Beta. The core workflow (init → compose → playback → analyze) works reliably with real audio output. npm test reports ~3060 passing tests, 88.99% statement coverage / 79.99% branch coverage. CI is hardened with OpenSSF Scorecard, SHA-pinned actions, CODEOWNERS, Dependabot, and lint as a blocking gate.
What "Beta" means here:
Tool schemas are stable within minor versions; breaking changes require a major bump
Multi-session is supported as of v3.0.0 (#108) — named sessions get isolated browser, history, and audio-capture state
Upstream
@strudel/*dependencies pinned to known-good versions; Dependabot bumps gated on CIExpect hands-on iteration for non-standard patterns — report rough edges, they get fixed
Table of Contents
Related MCP server: Filopastry
Features
Music control
28 MCP tools covering pattern editing, playback, audio analysis, generation, history, sessions, MIDI import/export, and Gemini-backed assists. Each tool is enum-parameterized to keep the protocol surface small:
pattern_store({ action }),edit_pattern({ mode }),transform({ op }),analyze({ include }),history({ action }),playback({ action }),effect({ action }),shape({ dimension }),audio_capture({ action }),browser_window({ action }),generate_part({ role }),generate_rhythm({ type }),music_theory({ query }),session({ action }),ai_assist({ task }), ... The 58 legacy single-verb aliases that forwarded to these were removed in v4.0.0 (#178).4 MCP resources for catalog browsing without burning tool calls:
strudel://examples,strudel://patterns,strudel://styles,strudel://docs/tools.Real browser automation of Strudel.cc through Playwright.
Multi-session support — every browser-touching tool accepts an optional
session_id; sessions have isolated browser pages, undo/redo/history stacks, and audio-capture services.Audio analysis via Web Audio API (FFT spectrum, tempo detection, key detection, rhythm complexity).
Template-based pattern generation across 8 genres (techno, house, dnb, ambient, trap, jungle, jazz, experimental); optional Gemini-backed
ai_assistfor feedback, suggestions, and jamming.Music theory helpers: 14 scales, 8 chord progression styles, euclidean and polyrhythm generation.
Pattern persistence: JSON-backed save/load with tags + the in-memory edit history (undo/redo/restore/compare).
Result envelope on every
tools/call: clients branch on{ ok, errorCategory, isRetryable }instead of parsing free-text.
Testing & CI status
~3060 passing tests:
npm testruns ~3020 unit/integration/example tests in parallel, then 36 browser-validation tests serially against real Chromium. The coverage figure below is from the first tier, which is the one CI also runs — the browser tier adds ~0.2 points and CI does not execute it, so counting it would document coverage nothing verifies.
88.99% statement coverage / 79.99% branch coverage (90.5% functions, 89.75% lines), checked against
coverage/coverage-summary.jsonby a drift guard.
Lint blocking in CI: 0 errors, ~195 warnings (mostly
anyin test mocks).OIDC trusted publishing to npm with SLSA build provenance attestation on every release.
Not Production-Ready: This is experimental software under active development. Use for exploration and experimentation. Expect breaking changes, bugs, and incomplete features. See the Contributing section to help improve it.
Example patterns
7 example patterns ship in patterns/examples/, grouped by genre:
Ambient: ambient-pad (70 BPM)
Dnb: dnb-classic (174 BPM)
House: house-classic (125 BPM)
Jazz: jazz-ii-v-i (120 BPM)
Jungle: amen-break (165 BPM)
Techno: techno-driving (130 BPM)
Trap: trap-modern (140 BPM)
Each example is a JSON file with pattern code, BPM, key, and a description, and each sets the tempo it declares (#367). See patterns/examples/README.md for details. Agents can also list these via the strudel://examples MCP resource without making any tool calls.
Migrating from @williamzujkowski/strudel-mcp-server
This project was renamed from @williamzujkowski/strudel-mcp-server to @williamzujkowski/live-coding-music-mcp to make the unofficial fan-project status unambiguous (see #97). The old package is deprecated on npm.
If you were using the old package:
# Remove old
npm uninstall -g @williamzujkowski/strudel-mcp-server
# Install new
npm install -g @williamzujkowski/live-coding-music-mcpUpdate your MCP client config. The bin name changed from strudel-mcp to live-coding-music-mcp:
// BEFORE
{
"mcpServers": {
"strudel": { "command": "strudel-mcp" }
}
}
// AFTER
{
"mcpServers": {
"live-coding-music": { "command": "live-coding-music-mcp" }
}
}The MCP server's internal identity string also changed from strudel-mcp-enhanced to live-coding-music-mcp. If you have a client that keys on that string (logs, allowlists, permission policies), update it accordingly.
All tool names and schemas are unchanged.
Installation
Prerequisites
Requirement | Version | Notes |
Node.js | 22.x+ | LTS required |
npm | 10+ | Comes with Node.js |
Chromium | Latest | Auto-installed by Playwright |
Audio output | Any | Required for playback (speakers/headphones) |
Optional: Docker for containerized deployment.
From npm
npm install -g @williamzujkowski/live-coding-music-mcp
# Install browser (required once)
npx playwright install chromiumFrom Source
# Clone repository
git clone https://github.com/williamzujkowski/live-coding-music-mcp.git
cd live-coding-music-mcp
# Install dependencies
npm install
# Install Chromium for browser automation
npx playwright install chromium
# Build the project
npm run buildQuick Start
Get from install to your first generated pattern in under two minutes.
1. Install
npm install -g @williamzujkowski/live-coding-music-mcp
npx playwright install chromium # one-timeBuilding from source instead? See Installation → From Source.
2. Configure your MCP client
Claude Desktop
Edit your Claude Desktop config file:
OS | Config path |
macOS |
|
Windows |
|
Linux |
|
Add the server:
{
"mcpServers": {
"live-coding-music": {
"command": "live-coding-music-mcp"
}
}
}Restart Claude Desktop. The server appears under the 🔌 plug icon.
Claude Code (CLI)
# If installed globally
claude mcp add strudel live-coding-music-mcp
# If built from source
claude mcp add strudel node /path/to/live-coding-music-mcp/dist/index.js3. Verify the server responds
# From a global install
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | live-coding-music-mcp
# From source
npm run validateYou should see a JSON response listing 28 tools. If you see fewer, the build is out of date — run npm run build.
4. Make your first sound
In Claude, ask:
Initialize Strudel and compose a techno beat.
What you'll see: A Chromium window opens (visibly — this is the live editor, not a hidden process) and lands on strudel.cc. Claude calls init, then compose({ style: "techno" }). A 4-on-the-floor pattern appears in the CodeMirror editor and starts playing through your speakers.
Prefer headless mode (no browser window)? Set "headless": true in config.json before the first init call — see Configuration. Note that tempo detection currently reflects how often the agent polls rather than the audio itself (#322), in headed or headless mode alike.
5. Where to go next
Quick Reference below: tool cheat sheet for common operations.
Usage Examples: multi-step workflows (composition, audio analysis, AI-assisted jamming).
patterns/examples/: 18 ready-to-play patterns across 7 genres plus 4 longform pieces. Agents can browse them via thestrudel://examplesMCP resource without burning tool calls.
Quick Reference
Common operations as one-line tool calls:
Action | Tool call |
Initialize browser |
|
Create a techno beat in one shot |
|
Play pattern |
|
Stop playback |
|
Get current pattern |
|
Analyze audio (all features) |
|
Detect tempo only |
|
Save pattern |
|
Undo last edit |
|
Edit current pattern |
|
Create an isolated session |
|
The legacy single-verb tools (play, stop, save, undo, write, generate_pattern, ...) were deprecated aliases during the 3.0.x line and were removed in v4.0.0 (#178). Use the consolidated tools above.
One-shot workflow:
compose with style: "dnb", key: "Am", tempo: 174, auto_play: trueAvailable Tools
28 tools across 15 categories:
Tool | Description |
| Initialize Strudel in browser |
Tool | Description |
| Mutate the current session pattern. mode=write replaces the editor contents (default; mirrors the old write tool exactly, including optional pattern validation and auto_play). mode=append concatenates |
| Get current pattern code |
Tool | Description |
| Control transport on the current session. action=play starts the editor pattern. action=pause halts the clock where it is, so play resumes mid-cycle. action=stop ends playback. Example: playback({ action: "play" }). For pattern editing use edit_pattern; for tempo use set_tempo. |
| Set BPM. Writes setcpm(bpm/4), assuming one bar of 4/4 per cycle. |
Tool | Description |
| Persist patterns to disk and read them back. Use action=save to write the current session pattern under a name; action=load to restore a named pattern into the current session; action=list to enumerate the on-disk catalog (optionally filtered by tag). Example: pattern_store({ action: "save", name: "my-jam", tags: ["techno"] }). For session lifecycle (create/destroy/list active sessions) use the session tool — pattern_store deals with on-disk patterns, not runtime sessions. |
| Convert a .mid file into a playable Strudel pattern (Phase 1: literal transcription, #201). Use source="base64" with data= for inline bytes, or source="path" with data= to read from the patterns/midi/ directory (path traversal blocked). Drum tracks (MIDI channel 10) emit one s() lane per sample so simultaneous kicks/hats do not collide. Pitched tracks emit note("...").s("piano") with simultaneous notes merged into [a,b,c] chord tokens. Phase 2+ (structural compression, voice separation, LLM idiomatic pass) tracked in separate issues. Example: import_midi({ source: "path", data: "drumloop.mid", steps_per_cycle: 16 }). For the reverse direction (Strudel → MIDI) use the export_midi tool. |
Tool | Description |
| Navigate or inspect the pattern edit history. action=undo reverts the last edit on the targeted session. action=redo replays a previously-undone edit. action=list returns recent entries with timestamps and previews (limit defaults to 10). action=restore jumps the editor to a specific entry by id (current pattern goes on the undo stack). action=compare diffs two entries by id (or one entry vs current pattern). Example: history({ action: "list", limit: 5 }) — recent edits, newest first. For on-disk saved patterns use pattern_store — history deals with the in-memory edit timeline of the current session. |
Tool | Description |
| Generate, write, and play a complete pattern in one step. Auto-initializes default browser if needed. |
| Generate a single instrumental layer and append it to the current session pattern. role=drums takes |
| Generate a rhythmic pattern and append it to the current session. type=euclidean produces a Euclidean rhythm with |
Tool | Description |
| Music-theory queries. query=scale returns the notes of a scale (e.g. "C major scale: C, D, E, F, G, A, B"). query=chord_progression returns a chord progression for the key/style AND writes the resulting chord pattern into the current session. Example: music_theory({ query: "scale", root: "C", scale: "major" }). For pattern generation (drums/bass/melody) use generate_part; for rhythmic patterns use generate_rhythm. |
Tool | Description |
| Apply a single transform op to the current session pattern. op=transpose shifts notes by |
| Add or remove a Strudel effect on the current session pattern. action=add appends |
| Shape the current pattern along one of three high-level dimensions. dimension=mood applies a mood profile (dark/euphoric/melancholic/aggressive/dreamy/peaceful/energetic) with optional intensity 0-1. dimension=energy applies an energy level (integer 0-10). dimension=refine applies a directional refinement: faster/slower/louder/quieter/brighter/darker/"more reverb"/drier. All three auto-play by default. Example: shape({ dimension: "mood", target_mood: "dark", intensity: 0.8 }). For raw transform ops use transform; for explicit effects use effect. |
Tool | Description |
| Gemini-backed pattern assistance. task=feedback returns creative critique on the current pattern (optionally with audio analysis). task=suggest analyzes the currently playing audio and suggests a complementary Strudel pattern as text (not auto-executed). task=jam generates a fresh layer (drums/bass/melody/pad/texture) and merges it into the current pattern, then auto-plays. All three share Gemini auth + rate limiting. Example: ai_assist({ task: "jam", layer: "bass" }). Needs GEMINI_API_KEY, or a logged-in claude/agy/codex CLI on PATH (#252). For non-AI pattern generation use generate_part; for full compositions use compose. |
Tool | Description |
| Audio analysis on the currently-playing pattern. include=["all"] (default) returns the full spectrum + features object, matching the pre-consolidation behaviour. include=["tempo"] returns only BPM with confidence. include=["key"] returns detected key + scale + confidence. include=["spectrum"] returns FFT features (bass, mid, treble, brightness, etc.). include=["rhythm"] returns rhythm-only analysis (complexity, density, syncopation). Combining values returns an object keyed by category, e.g. analyze({ include: ["tempo", "key"] }) → { tempo: {...}, key: {...} }. Example: analyze({ include: ["tempo"] }) to cheaply re-check BPM during a session. For static pattern analysis (no browser) use analyze_pattern_local; for runtime validation use validate_pattern_runtime. |
| Validate pattern with runtime error checking (monitors Strudel console for errors) |
| Validate pattern syntax against the local StrudelEngine, which runs in a sandboxed child process (no browser required) |
| Static analysis (events/cycle, complexity, optional BPM) without browser playback |
| Enumerate events the pattern would emit between two cycle indices (max 16 cycles) |
| Transpile pattern source via StrudelEngine; returns transpiled code or syntax error |
Tool | Description |
| Manage isolated Strudel browser sessions (multi-session, #108). action=create starts a new named session (sessions share one browser but isolated contexts). action=destroy closes a named session and releases its resources. action=list returns metadata for all active sessions (id, created, last_activity, is_playing, is_default). action=switch changes the default session that subsequent tool calls route to when no session_id is passed. Example: session({ action: "create", session_id: "live-set-1" }). For the on-disk pattern catalog use pattern_store(action=list) — session(action=list) lists runtime sessions, not saved patterns. |
Tool | Description |
| Export current pattern to MIDI file. Parses note(), n(), and chord() functions. |
| Interact with the visible Strudel browser window. action=show brings the window to the foreground. action=screenshot captures the current editor view to disk (optional |
Tool | Description |
| Record audio output from the live Strudel session. action=start begins streaming capture (optional |
Tool | Description |
| Inspect server and browser state. level=status returns a quick state snapshot (cache read, <15ms SLA), plus which config.json was read and any warnings from it. level=full returns detailed browser diagnostics including caches, errors, and performance. level=perf returns server-side timing metrics + top bottlenecks. level=memory returns process memory usage. level=errors returns captured console errors and warnings from Strudel. Default level=full preserves the pre-consolidation behaviour. Example: diagnostics({ level: "status" }) — millisecond-cheap. For screenshots use browser_window; for tool listings use the strudel://docs/tools resource. |
Tool | Description |
| Record a window of live Strudel audio and write it to a file. Returns a path plus what was actually recorded, not a wall of base64 — prefer this over audio_capture when you want the audio to exist somewhere. format=wav (default) decodes to 16-bit PCM a DAW will open; format=webm writes the raw Opus recording. Reports silent captures instead of writing a silent file and claiming success. Audio must already be playing: call playback({ action: "play" }) first. Example: export_audio({ duration: 4000, filename: "take-01" }). |
Auto-generated from source. 28 tools registered.
Usage Examples
Basic Pattern Creation
Create a Simple Beat
You: Initialize Strudel and create a simple techno beat
Claude: [Initializes browser]
[Generates and writes pattern]
[Starts playback]
Pattern created:
setcpm(130/4)
stack(
s("bd*4"),
s("~ cp ~ cp"),
s("hh*8").gain(0.4)
).gain(0.8)Generate a Bassline
You: Add a techno bassline in C
Claude: [Generates bassline]
[Appends to current pattern]
Added: note("c2 c2 c2 c2").s("sawtooth").cutoff(800)Advanced Music Generation
Jazz Composition
You: Create a jazz progression in F major with a walking bass
Claude: Generated progression: "Gm7" "C7" "Fmaj7"
Pattern:
stack(
note("Gm7" "C7" "Fmaj7").struct("1 ~ ~ ~").s("piano"),
note("g2 c2 f2").s("sine").gain(0.7)
)Drum & Bass Track
You: Generate a complete drum & bass track at 174 BPM
Claude: [Creates multi-layer pattern with drums, bass, and pads]
// dnb pattern in C at 174 BPM
setcpm(174/4)
stack(
// Drums
s("bd ~ ~ [bd bd] ~ ~ bd ~, ~ ~ cp ~ ~ cp ~ ~").fast(2),
// Bass
note("c1 ~ ~ c2 ~ c1 ~ ~").s("square").cutoff(400),
// Pads (atmospheric)
note("c3 eb3 g3 bb3").s("sawtooth")
.attack(2).release(4).room(0.8).gain(0.6)
)Real-Time Manipulation
Live Audio Analysis
You: Analyze what's playing and show me the frequency breakdown
Claude: Audio Analysis Results:
{
"connected": true,
"features": {
"average": 78.5,
"peak": 180,
"peakFrequency": 120,
"bass": 145,
"mid": 82,
"treble": 45,
"isPlaying": true,
"brightness": "balanced"
}
}
Strong bass presence detected - typical for techno/house patterns.Pattern Variations
You: Create a glitchy variation of the current pattern
Claude: [Applies glitch transformation]
Added: .sometimes(x => x.chop(8).rev).rarely(x => x.speed(-1))Multi-Track Composition
Layered Ambient Track
You: Create an ambient soundscape with multiple layers
Claude: [Generates complex multi-layer pattern]
setcpm(90/4)
stack(
// Deep bass drone
note("c1").s("sine").attack(4).release(8).gain(0.5),
// Texture pad
note("c3 eb3 g3").s("sawtooth")
.attack(2).release(6).room(0.9).gain(0.4),
// Sparse percussion
s("bd ~ ~ ~, ~ ~ ~ hh:8").room(0.9).gain(0.3),
// Melodic sparkles
note("c5 g5 eb5 bb5").struct("~ 1 ~ 1 ~ ~ 1 ~")
.s("triangle").delay(0.5).room(0.8).gain(0.3)
)Session Management
Save and Load Patterns
You: Save this pattern as "techno-groove-1" with tags "techno" and "experimental"
Claude: Pattern saved as "techno-groove-1"
---
You: List all my techno patterns
Claude: Saved patterns with tag "techno":
• techno-groove-1 [techno, experimental] - 2025-10-23T19:30:00.000Z
• acid-bassline [techno, acid] - 2025-10-23T18:15:00.000Z
---
You: Load "acid-bassline"
Claude: Loaded pattern "acid-bassline"
[Pattern written to editor]Music Theory Applications
Generate Euclidean Rhythms
You: Create a 5/8 euclidean rhythm with kick drum
Claude: Generated Euclidean rhythm (5/8)
Pattern: s("bd").struct("1 ~ 1 ~ 1 1 ~ 1")Complex Polyrhythms
You: Generate a polyrhythm with kick (4/16), snare (7/16), and hi-hat (3/16)
Claude: Generated polyrhythm
stack(
s("bd").euclid(4, 16),
s("cp").euclid(7, 16),
s("hh").euclid(3, 16)
)Integration with LLM Agents
AI-Assisted Composition
You: Analyze the mood of my current pattern and suggest complementary elements
Claude: [Analyzes pattern structure and audio features]
Your pattern has:
- Energetic rhythm (130 BPM)
- Strong bass presence
- Minimal melodic content
Suggestions:
1. Add arpeggiated synth for movement
2. Include occasional breaks/fills
3. Layer atmospheric pad for depth
Would you like me to add any of these?
You: Add an arpeggiated synth in C minor
Claude: [Generates and adds]
note("c4 eb4 g4 bb4 c5").struct("1 1 1 1 1 1 1 1")
.s("triangle").delay(0.25).room(0.3).gain(0.5)Testing
Tools are exercised against real Strudel.cc interaction through the browser test suite; those are skipped in CI (require Playwright + audio) but run locally:
# Run integration tests
npm run test:integration
# Run browser tests
node tests/strudel-integration.js
# Run npm test to see current pass/fail/skip countsConfiguration
config.json
{
"headless": false, // Set true for background operation
"strudel_url": "https://strudel.cc/",
"patterns_dir": "./patterns",
"exports_dir": "./exports",
"viewport": { "width": 1280, "height": 720 }, // or null to track the window size (#514)
"block_resources": ["image", "font", "media"], // resource types the page route aborts
"audio_analysis": {
"fft_size": 2048, // power of 2 in [32, 32768]; code default is 1024
"smoothing": 0.8 // number in [0, 1]; default 0.8
}
}strudel_url is the REPL the browser is pointed at — set it to run against a self-hosted or
pinned Strudel build. Only http/https are accepted; anything else falls back to the default
with a logged warning. patterns_dir is where pattern_store reads and writes.
viewport pins the Playwright page layout. Set it to null in a headed window so dragging the
window resizes the page and strudel's canvases follow (#514). block_resources lists the
resource types the page route aborts to speed up load; the default blocks image, font, and
media, which suits headless CI but degrades the live editor (fallback-font button metrics,
canvases that ignore window resizes). A live-coding setup wants "block_resources": ["media"].
Both keys fall back to the defaults with a logged warning when invalid.
exports_dir is where export_midi({format:"file"}) writes. Exported filenames are reduced to a
basename and confined to this directory — a name containing path separators is sanitized rather
than honoured, and the response reports the path actually written.
Unknown top-level keys are logged as warnings at startup rather than silently ignored.
audio_analysis.fft_size tunes the FFT bin count on the AnalyserNode attached to Strudel's audio graph — larger = better frequency resolution at higher CPU cost. smoothing is the analyser's smoothingTimeConstant (higher = steadier spectrum, more lag). Invalid values fall back to defaults with a warning; the frequency-band boundaries inside analyze rescale automatically so band Hz coverage stays consistent across FFT sizes.
Architecture
The server is a thin MCP dispatcher (src/server/server.ts, ~520 lines) over twelve per-domain tool modules (src/server/tools/*.ts), ten services (MusicTheory, PatternGenerator, SessionManager, AudioCaptureService, AudioExportService, GeminiService, MIDIExportService, MIDIImportService, StrudelEngine, PatternSandbox) plus a provider-agnostic AI transport layer (src/services/ai/), two controllers (StrudelController for Playwright, AudioAnalyzer for Web Audio API), and a JSON-on-disk PatternStore. Browser automation drives the editor on strudel.cc through window.strudelMirror.editor.dispatch(...) rather than keyboard simulation — about 80% faster.
For the full breakdown — component diagram, per-component responsibilities, directory layout, data flow, and optimization strategies — see ARCHITECTURE.md.
Pattern Examples
Minimal Techno (Verified Working)
setcpm(130/4)
stack(
s("bd*4").gain(0.9),
s("~ cp ~ cp").room(0.2),
s("hh*16").gain(0.4).pan(sine.range(-0.5, 0.5)),
note("c2 c2 eb2 c2").s("sawtooth").cutoff(800)
).swing(0.05)Drum & Bass (Verified Working)
setcpm(174/4)
stack(
s("bd ~ ~ [bd bd] ~ ~ bd ~, ~ ~ sn:3 ~ ~ sn:3 ~ ~").fast(2),
s("hh*16").gain(0.5),
note("e1 ~ ~ e2 ~ e1 ~ ~").s("sine:2").lpf(200)
)Generated Jazz Progression
// Jazz ii-V-I in F
stack(
note("Gm7" "C7" "Fmaj7").struct("1 ~ ~ ~").s("piano"),
note("g2 c2 f2").s("sine").gain(0.7)
)Docker Support
# Build image
docker build -t live-coding-music-mcp .
# Run container
docker run -it --rm live-coding-music-mcp
# Or use docker-compose
docker-compose upDevelopment
For development setup, scripts, debugging, adding new tools, and the release process, see DEVELOPMENT.md.
Quick links:
Setup —
git clonetonpm testAdding new tools — module pattern + envelope helpers
Release process —
gh release createtriggers the publish workflowContributing — commit conventions and PR flow
The Configuration section above covers runtime config (config.json). ARCHITECTURE.md covers the system design.
Performance
Measured against the current StrudelController cache + Strudel.cc on a developer machine:
Operation | Latency |
Browser initialization | 1.5–2 s (with resource blocking) |
Pattern write | 50–80 ms (cached CodeMirror editor access) |
Pattern read (cached) | 10–15 ms |
Play / pause / stop | 100–150 ms |
Audio analysis (single FFT) | 10–15 ms |
Tempo detection | <100 ms (onset-based; reports poll cadence, not tempo — #322) |
Key detection | <100 ms (Krumhansl-Schmuckler, Pearson; bass-register accuracy depends on |
Pattern generation | <100 ms (template-based) |
Process resident memory | ~120–150 MB |
Advanced Usage
Custom Music Theory
Create Custom Scales
// The MusicTheory service supports 15+ built-in scales
// You can request any combination:
You: Generate a lydian scale starting on D
Claude: D lydian scale: D, E, F#, G#, A, B, C#Complex Chord Progressions
You: Create a jazz ii-V-I progression in Bb with extended voicings
Claude: Generated jazz progression in Bb: "Cm7" "F7" "Bbmaj7"
Pattern:
note("Cm7" "F7" "Bbmaj7")
.struct("1 ~ ~ ~")
.s("sawtooth")
.add(note("7")) // Add 7th extensions
.room(0.4)Advanced Rhythm Techniques
Euclidean Patterns
You: Create a complex polyrhythm using euclidean patterns:
- Bass drum: 7 hits in 16 steps
- Snare: 5 hits in 16 steps
- Hi-hat: 11 hits in 16 steps
Claude: [Generates mathematically perfect polyrhythm]
stack(
s("bd").euclid(7, 16),
s("cp").euclid(5, 16),
s("hh").euclid(11, 16)
)Generative Variations
You: Create 3 variations of my current pattern: subtle, moderate, and glitchy
Claude: [Generates three variants]
Version 1 (subtle):
original.sometimes(x => x.fast(2))
Version 2 (moderate):
original.every(4, x => x.rev).sometimes(x => x.fast(2))
Version 3 (glitchy):
original.sometimes(x => x.chop(8).rev).rarely(x => x.speed(-1))Performance Optimization Tips
Pattern Caching
// The server caches patterns intelligently:
// - Generated patterns stored before browser init
// - Editor content cached for 100ms
// - Audio analysis cached for 50ms
// For fastest performance:
1. Generate patterns before initializing browser
2. Initialize once and reuse the session
3. Batch multiple changes togetherHeadless Mode
// In config.json:
{
"headless": true, // Faster, no GUI
"strudel_url": "https://strudel.cc/",
"patterns_dir": "./patterns"
}Integration Patterns
Workflow Automation
You: Create a complete track:
1. Start with techno drums at 130 BPM
2. Add acid bassline in E
3. Layer ambient pads
4. Save as "track-001" with tags "techno", "acid", "experimental"
Claude: [Executes full workflow]
[Initializes browser]
[Generates drum pattern]
[Adds bassline]
[Layers pads]
[Saves with metadata]
Complete! Pattern saved as "track-001"Audio-Reactive Composition
You: Monitor the audio and suggest adjustments based on frequency balance
Claude: [Analyzes current playback]
Analysis shows:
- Bass: 180 (strong)
- Mid: 45 (weak)
- Treble: 30 (weak)
Recommendations:
1. Reduce bass gain by 20%
2. Add mid-range melodic content
3. Include hi-hat pattern for treble
Apply changes? [Yes/No]Advanced Pattern Manipulation
Dynamic Transformations
You: Apply these transformations in sequence:
1. Transpose up 3 semitones
2. Add 10% humanization
3. Apply reverb with 0.6 room size
4. Every 4th cycle, reverse the pattern
Claude: [Applies transformations]
Final pattern:
[original]
.transpose(3)
.nudge(rand.range(-0.1, 0.1))
.room(0.6)
.every(4, x => x.rev)Conditional Logic
You: Create a pattern that evolves:
- Bars 1-4: Simple kick pattern
- Bars 5-8: Add snare
- Bars 9-16: Add full drum kit
- Then loop with variations
Claude: [Generates evolving pattern]
s("bd*4")
.struct("1 ~ ~ ~")
.mask("<1 1 1 1 0 0 0 0>/4") // First 4 bars
.stack(
s("~ cp ~ cp")
.mask("<0 0 0 0 1 1 1 1>/8") // Bars 5-8
)
// Full complexity from bar 9
.every(8, x => x.sometimes(y => y.fast(2)))Security
Pattern Validation
All patterns are validated before execution:
Dangerous gain levels (>2.0) are flagged
Eval blocks are rejected
Path traversal attacks are blocked in PatternStore
Browser Isolation
Be precise about what this does and does not give you:
The OS-level Chrome sandbox is disabled. Chromium is launched with
--no-sandboxand--disable-setuid-sandbox(src/StrudelController.ts) for headless and container compatibility, where the sandbox otherwise needsCAP_SYS_ADMINor user namespaces. This is a deliberate trade-off, not a security feature.The browser context is a fresh, non-persistent Playwright context — no profile on disk, no cookies or storage carried over between runs, and no
file://navigation is ever performed.Resource blocking is a performance optimization, not a security boundary. Images, fonts, and media are aborted to speed up page load; scripts, stylesheets, and network requests from strudel.cc are allowed through as normal.
Patterns are validated before execution (see above), which is the actual pre-execution control.
If you need real isolation, run the whole MCP server inside a locked-down container or VM. The server does not sandbox itself.
Known Limitations
No authentication: The MCP server trusts all incoming requests
Local only: Designed for local development, not network deployment
Pattern execution: Patterns execute in browser context with audio access
Reporting Security Issues
Found a vulnerability? Please open a security issue or email the maintainer directly. Do not disclose publicly until patched.
Troubleshooting
Common Issues
Browser doesn't open
Symptom: Error: Browser not initialized or Chromium launch fails
Solutions:
# Install Chromium for Playwright
npx playwright install chromium
# If that fails, try installing all browsers
npx playwright install
# Check Playwright installation
npx playwright --version
# For Linux, install dependencies
sudo npx playwright install-deps chromiumAudio analysis returns "not connected"
Symptom: Audio analysis shows connected: false
Solutions:
Ensure pattern is playing first:
You: Play the pattern, wait 2 seconds, then analyzeReinitialize the browser:
You: Stop, close the browser, reinitialize, and try againCheck audio context activation:
Audio contexts require user interaction on some systems
The browser window must be visible (not headless) for first run
Pattern syntax errors
Symptom: Pattern doesn't play or shows errors in console
Solutions:
Common issues:
1. Missing quotes: s(bd*4) → s("bd*4")
2. Unmatched parentheses: stack(s("bd")) → stack(s("bd")))
3. Invalid note names: note("h2") → note("c2")
Test with minimal pattern first:
s("bd*4")
Then build complexity gradually.MCP connection issues
Symptom: Claude can't find the server or tools
Solutions:
# Verify server is built
npm run build
# Check if server responds
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node dist/index.js
# Should return JSON with 28 tools
# Reinstall MCP server in Claude
claude mcp remove strudel
claude mcp add strudel node $(pwd)/dist/index.js
# Restart Claude
claude chatPerformance issues / Slow response
Symptom: Operations take longer than expected
Solutions:
Enable caching (default, but verify):
Editor caching: 100ms TTL
Audio analysis: 50ms TTL
Use headless mode for faster operation:
// config.json { "headless": true }Batch operations:
Instead of: - Add drums - Add bass - Add melody Do: - Generate complete pattern with drums, bass, and melodyReduce browser overhead:
Close other browser instances
Disable browser DevTools
Use resource blocking (enabled by default)
Patterns not saving
Symptom: pattern_store({ action: "save" }) fails or patterns don't persist
Solutions:
# Check patterns directory exists
ls -la ./patterns
# Create manually if needed
mkdir -p ./patterns
# Verify write permissions
touch ./patterns/test.json
rm ./patterns/test.json
# Check for invalid pattern names
# Valid: "techno-beat-1", "my_pattern", "track001"
# Invalid: "pattern/with/slashes", "name:with:colons"Platform-Specific Issues
macOS
# Keyboard shortcut uses Meta (Cmd) key
# Already handled by ControlOrMeta
# If Chromium crashes on M1/M2:
npx playwright install chromium --with-depsLinux
# Install system dependencies
sudo npx playwright install-deps chromium
# If running in Docker/headless environment:
# Ensure config.json has headless: trueWindows
# Use PowerShell or Git Bash
# Paths should use forward slashes in config.json
# If Chromium doesn't launch:
npx playwright install chromiumDebugging Tips
Enable Verbose Logging
# Set environment variable
DEBUG=* node dist/index.js
# Or in Claude:
You: Enable detailed logging for the next operationCheck Browser State
You: Show me the current browser initialization state
and any cached patterns
Claude: Browser state:
- Initialized: true
- Cached patterns: 2
- Undo stack depth: 5
- Last operation: edit_pattern (2.5s ago)Validate Pattern Syntax
You: Before playing, validate this pattern syntax:
s("bd*4, ~ cp ~ cp")
Claude: [Checks syntax]
Valid Strudel pattern.
Ready to play.Getting Help
If you encounter issues not covered here:
Check existing issues: GitHub Issues
Run integration tests:
npm run test:integrationEnable debug mode:
DEBUG=* npm startConsult Strudel docs: Strudel.cc documentation
Create new issue: Include error messages, OS, Node version, and steps to reproduce
Contributing
PRs welcome — bug fixes, docs, tests, new tools. See CONTRIBUTING.md for the contribution guide and DEVELOPMENT.md for setup and workflow.
For non-trivial work, open a GitHub issue first (issue policy in CLAUDE.md). For typos and small fixes, a PR directly is fine.
GitHub Discussions are open for use-case questions and design conversations.
License
AGPL-3.0-or-later — see LICENSE for the full text.
This project depends on @strudel/core, @strudel/mini, @strudel/tonal, and @strudel/transpiler, which are AGPL-3.0 licensed by the upstream Strudel project. Since we import from those packages and redistribute the combined work via npm, this project must be distributed under the same copyleft terms. If you fork or redistribute, you must keep the AGPL license and provide source access to any network-accessible users (AGPL §13).
Earlier versions of this package (including @williamzujkowski/strudel-mcp-server prior to deprecation) shipped with an MIT declaration — that was incorrect given the AGPL dependencies. v2.0.0 of @williamzujkowski/live-coding-music-mcp corrects the license to AGPL-3.0-or-later. v1.0.0 of this package is deprecated; install v2.0.0 or later (current: v4.0.0).
Acknowledgments
Strudel.cc — pattern-based live coding environment (this project is a fan adapter, not affiliated)
TidalCycles — original pattern language Strudel descends from
Anthropic — Claude and the MCP protocol
Playwright — browser automation
v4.0.0 — Open source, AGPL-3.0-or-later, experimental | Report issues | Contribute
This project is under active development. Core features work, but expect bugs and breaking changes. Not recommended for production use.
Available Tools
28 toolsai_assistA
Gemini-backed pattern assistance. task=feedback returns creative critique on the current pattern (optionally with audio analysis). task=suggest analyzes the currently playing audio and suggests a complementary Strudel pattern as text (not auto-executed). task=jam generates a fresh layer (drums/bass/melody/pad/texture) and merges it into the current pattern, then auto-plays. All three share Gemini auth + rate limiting. Example: ai_assist({ task: "jam", layer: "bass" }). Needs GEMINI_API_KEY, or a logged-in claude/agy/codex CLI on PATH (#252). For non-AI pattern generation use generate_part; for full compositions use compose.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | task=suggest: role the suggested pattern fills (default complement) | |
| task | Yes | Which AI task | |
| layer | No | task=jam: layer type to generate | |
| style | No | task=feedback/suggest: style hint | |
| auto_play | No | task=jam: start playback after merge (default true) | |
| session_id | No | Optional session ID (#108). Omit to use default session. | |
| style_hint | No | task=jam: style guidance | |
| includeAudio | No | task=feedback: include audio analysis (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the mutation side effect of task=jam (merges into the current pattern then auto-plays), that suggest output is not auto-executed, that audio analysis is opt-in via includeAudio, and that all three modes share Gemini auth plus rate limiting. It stops short of covering failure behavior and how a jam merge interacts with existing layers of the same type, which matters for a tool that mutates state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and dense: capability, then per-task behavior, then auth, then alternatives. Minor waste in the trailing issue references (#252) and the inline example, but nothing is buried and no sentence restates the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, three-mode tool with no annotations and no output schema, the description covers purpose, mode semantics, auth prerequisites, side effects, and alternatives — enough to invoke it correctly. The remaining gap is return-value shape for feedback/suggest (what 'creative critique' or 'pattern as text' concretely contains), which has no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter already documents its task binding and defaults, so the schema does the heavy lifting. The description reinforces the task-to-behavior mapping and adds one concrete call example, but supplies no syntax or format detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific capability (Gemini-backed pattern assistance) and decomposes it into three clearly distinguished modes: feedback returns critique, suggest returns a suggested Strudel pattern as text, jam generates and merges a layer then auto-plays. It also explicitly separates itself from siblings generate_part (non-AI generation) and compose (full compositions), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each task variant is given an explicit use condition, including the scope of what it produces and whether it is auto-executed. The closing sentence names two alternative tools and the situations that select them (non-AI generation, full compositions), which is exactly the when-to-use/when-not guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyzeA
Audio analysis on the currently-playing pattern. include=["all"] (default) returns the full spectrum + features object, matching the pre-consolidation behaviour. include=["tempo"] returns only BPM with confidence. include=["key"] returns detected key + scale + confidence. include=["spectrum"] returns FFT features (bass, mid, treble, brightness, etc.). include=["rhythm"] returns rhythm-only analysis (complexity, density, syncopation). Combining values returns an object keyed by category, e.g. analyze({ include: ["tempo", "key"] }) → { tempo: {...}, key: {...} }. Example: analyze({ include: ["tempo"] }) to cheaply re-check BPM during a session. For static pattern analysis (no browser) use analyze_pattern_local; for runtime validation use validate_pattern_runtime.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Which analyses to return. Default ["all"] preserves pre-consolidation behaviour. | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return structures for each include option, explains combining behavior, and mentions pre-consolidation behavior for 'all'. Lacks explicit read-only statement but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is comprehensive but slightly lengthy; each sentence adds value and structure is clear. Could be more concise but still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains return values for each category. Covers main use cases and alternatives. Missing error handling but sufficient for most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). Description adds meaning with explanations of enum values, default behavior, and examples of combining categories.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Audio analysis on the currently-playing pattern' with specific analysis categories (tempo, key, spectrum, rhythm, all). Distinguishes from siblings analyze_pattern_local and validate_pattern_runtime.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use each include value, demonstrates with examples, and names alternatives: 'For static pattern analysis (no browser) use analyze_pattern_local; for runtime validation use validate_pattern_runtime.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_pattern_localB
Static analysis (events/cycle, complexity, optional BPM) without browser playback
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Pattern code to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior fully. It only states static analysis without browser playback, but omits whether it is read-only, output format, or any side effects. Insufficient for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence efficiently communicates the core purpose and key differentiator (no browser playback). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter and no output schema, the description is minimal but covers the basics. However, it does not explain what the analysis returns or provide usage context (e.g., costs, limitations), leaving gaps for a full understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds context about the analysis type but no additional meaning for the 'pattern' parameter beyond the schema. Adequate but not improved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description specifies static analysis of events/cycle, complexity, and optional BPM, and explicitly excludes browser playback. This makes the purpose clear, though it does not explicitly state it is for patterns (implied by parameter name).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like 'analyze' or 'validate_pattern_local'. The mention of 'without browser playback' hints at a scenario but does not name sibling tools or provide criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audio_captureA
Record audio output from the live Strudel session. action=start begins streaming capture (optional format webm/opus, default webm). action=stop ends the stream and returns base64-encoded audio. action=sample captures a fixed-duration window in one call (100-60000ms, default 5000ms). Example: audio_capture({ action: "sample", duration: 3000 }). Audio must be playing for capture to record meaningful data. For MIDI export use export_midi; for runtime diagnostics use diagnostics. Each session has its own recorder, so captures in different sessions do not interfere (#180).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Capture action | |
| format | No | action=start: audio format (default webm) | |
| duration | No | action=sample: duration ms (100-60000, default 5000) | |
| session_id | No | Optional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180). | |
| maxDuration | No | action=start: stop the recorder automatically after this many ms. Defaults to 600000 (ten minutes); the recording so far is kept and returned by a later stop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description itself discloses the streaming start/stop lifecycle, base64 output on stop, fixed-window sampling, the playback prerequisite, and per-session recorder isolation. This is strong operational context, although raw base64 versus a data URI and behavior for invalid recorder states are not specified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and dense with usable operational detail, including a compact example. Repeated defaults and ranges already present in the schema, plus internal issue markers such as (#180), add slight noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the fully described schema, it covers the three invocation modes, output encoding, preconditions, limits and defaults, and concurrent-session behavior sufficiently for most calls. The base64 statement partly compensates for the absent output schema, but export_audio selection guidance and recorder-state or error behavior remain uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the action schema only says "Capture action"; the description adds the meaningful start/stop/sample workflow and a concrete sample invocation. Much of the format, duration, and session detail repeats the schema, and maxDuration is left entirely to the schema, so this is above baseline rather than exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb, resource, and live-session scope, while the action breakdown makes the tool's role clear. It distinguishes the tool from export_midi and diagnostics but not from export_audio, the closest sibling for audio-related selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete guidance for start, stop, and sample, states that audio must be playing, and routes MIDI export and runtime diagnostics to named alternatives. It does not explain when live capture is preferable to export_audio, leaving the most likely sibling-selection ambiguity unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_windowA
Interact with the visible Strudel browser window. action=show brings the window to the foreground. action=screenshot captures the current editor view to disk (optional filename). Example: browser_window({ action: "screenshot", filename: "demo.png" }). For diagnostics (status/errors/perf) use diagnostics; for the editor itself use edit_pattern.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Window action | |
| filename | No | action=screenshot: optional output filename | |
| session_id | No | Optional session ID (#108). Omit to use default session. compose auto-init only applies to default session — named sessions must already exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses that 'show brings window to foreground' and 'screenshot captures editor view to disk.' It also explains session_id behavior regarding compose auto-init. Minor omission: no mention of error states or file overwrite behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, four sentences: purpose, two actions with brief explanation, example, and cross-reference to siblings. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and three parameters with one required, description covers main use cases. Includes example and alternatives. Could mention what happens on failure (e.g., screenshot to existing file) but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage of parameters with descriptions. The description adds minimal value beyond schema with an example for filename, but no additional semantic explanation for action or session_id that isn't already in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it interacts with the Strudel browser window and lists two specific actions (show, screenshot). It distinguishes from sibling tools by referencing diagnostics and edit_pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit alternatives: 'For diagnostics use diagnostics; for the editor itself use edit_pattern.' Also includes an example and clarifies when to use session_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composeA
Generate, write, and play a complete pattern in one step. Auto-initializes default browser if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Musical key (default: C) | |
| style | Yes | Genre: techno, house, dnb, breakbeat, trap, jungle, ambient, experimental, intelligent_dnb, trip_hop, boom_bap. Anything else (jazz included) gets techno drums, and the response says so. | |
| tempo | No | BPM (default: genre-appropriate) | |
| auto_play | No | Start playback immediately (default: true) | |
| session_id | No | Optional session ID (#108). Omit to use default session. compose auto-init only applies to default session — named sessions must already exist. | |
| get_feedback | No | Get AI feedback on the generated pattern (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full disclosure burden. It does reveal two side effects: playback is triggered and a default browser is auto-initialized if needed. It does not say whether an existing pattern is overwritten, whether audio output requires a browser session, or how slow or expensive the composite operation is, so a mutation/playback tool remains under-disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed by the one non-obvious side effect. No filler and nothing restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters, no annotations, and no output schema, the description should say more about what a successful call returns (pattern handle/session id, feedback payload when get_feedback is true) and what state it mutates. As it stands, an agent can pick the tool but cannot predict its results or side effects beyond browser init.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (style genres, key default, tempo default, auto_play, session_id, get_feedback), so the schema already handles parameter meaning. The description adds nothing about any parameter and doesn't explain the interplay between auto_play and get_feedback. The baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses concrete verbs (generate, write, play) on a specific resource (a complete pattern) and highlights the composite 'in one step' nature, which distinguishes it from the granular siblings (generate_part, init, playback, edit_pattern). It stops short of naming which siblings it replaces, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'In one step' only implies that this tool is the shortcut alternative to initializing, generating, and playing separately; neither a when-to-use condition nor an excluded case is stated. The important precondition — that auto-init applies only to the default session and named sessions must already exist — appears in the schema's session_id description, not in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnosticsA
Inspect server and browser state. level=status returns a quick state snapshot (cache read, <15ms SLA), plus which config.json was read and any warnings from it. level=full returns detailed browser diagnostics including caches, errors, and performance. level=perf returns server-side timing metrics + top bottlenecks. level=memory returns process memory usage. level=errors returns captured console errors and warnings from Strudel. Default level=full preserves the pre-consolidation behaviour. Example: diagnostics({ level: "status" }) — millisecond-cheap. For screenshots use browser_window; for tool listings use the strudel://docs/tools resource.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Which diagnostic surface to read (default: full) | |
| session_id | No | Optional session ID (#108). Applies to level=status, full, errors. Ignored for perf/memory (server-wide metrics). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does well: it discloses a <15ms SLA for status, that config.json provenance and warnings are surfaced, and that session_id is ignored for perf/memory because those are server-wide metrics. It stops short of stating that the tool is read-only and side-effect free, which has to be inferred from "Inspect".
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the cheapest level first, then the heavier surfaces, then the redirects, then the example. Dense but nearly every clause carries information; the level enumeration is long but functional. Minor redundancy between the opening scope statement and the per-level list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param, no-output-schema tool, the description adequately fills the return-value gap by naming what each level yields (snapshots, caches, errors, timing metrics, memory). Return shapes remain coarse, but that is acceptable for a diagnostics surface where the caller inspects the payload anyway.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning beyond the enum by explaining what each level actually returns and by scoping session_id's applicability (status/full/errors) versus perf/memory. That is semantic information the schema's terse "Which diagnostic surface to read" does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair ("Inspect server and browser state") and then enumerates all five level values with what each one returns, so an agent can distinguish this from siblings like session or browser_window without opening the schema. The scope (server-side vs browser-side surfaces) is made explicit per level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the default (level=full preserves pre-consolidation behaviour) and gives an explicit example call for the cheap path, plus routes two adjacent needs elsewhere ("For screenshots use browser_window; for tool listings use the strudel://docs/tools resource"). It does not contrast against diagnostic-adjacent siblings like session or history, so the routing is useful but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_patternA
Mutate the current session pattern. mode=write replaces the editor contents (default; mirrors the old write tool exactly, including optional pattern validation and auto_play). mode=append concatenates code after the current pattern with a newline. mode=insert places code at the given line position. mode=replace substitutes search with replace — the first occurrence only, unless replace_all is true. The response reports how many occurrences matched, were replaced, and remain. mode=clear empties the editor. Example: edit_pattern({ mode: "write", pattern: "s("bd")", auto_play: true }). For reading the editor without mutating it use get_pattern; for the on-disk pattern catalog use pattern_store.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Code to append/insert (mode=append/insert) | |
| mode | No | Which edit operation to perform (default: write) | |
| search | No | Text to replace (mode=replace) | |
| pattern | No | Pattern code (mode=write) | |
| replace | No | Replacement text (mode=replace) | |
| position | No | mode=insert: 0-indexed line to insert BEFORE. 0 puts the code at the top; a value equal to the line count appends. Out of range is an error, not an append. | |
| validate | No | Validate pattern before write (mode=write only, default: true) | |
| auto_play | No | Start playback after write (mode=write only, default: false) | |
| session_id | No | Optional session ID (#108). Omit to use default session. | |
| replace_all | No | mode=replace: replace every occurrence instead of just the first (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the default mode replaces editor contents entirely, that write mirrors the old write tool including validation and auto_play, that replace touches only the first occurrence unless replace_all, that the response reports matched/replaced/remaining counts, and that clear wipes the editor. What is missing is whether mutations are undoable/recoverable via history and whether a session must exist first, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then one sentence per mode, then alternatives and an example. Every sentence maps to a distinct behavior, though the mode enumeration partially duplicates the enum documentation in the schema and could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, five-mode mutation tool with no output schema, the description covers mode behavior, defaults, the shape of the response counts, and routing to sibling tools. The remaining gap is side-effect and recoverability context (does an overwrite lose prior work, is there an undo path through history), which matters for a destructive-capable tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already carries a mode-scoped description, so the baseline is 3. The description adds cross-parameter meaning the schema cannot express — which parameter pairs are active for which mode — plus a concrete example call combining mode, pattern, and auto_play, which is real added value but largely restates mode semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Mutate the current session pattern") and then enumerates all five modes, each with its precise effect. It explicitly differentiates itself from siblings get_pattern (read) and pattern_store (on-disk catalog), so an agent can tell exactly which tool owns editor mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-mode conditions of use (write replaces, append concatenates with newline, insert at position, replace uses search/replace, clear empties) and names the alternatives plus the condition that selects them: get_pattern when reading without mutating, pattern_store for the disk catalog. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
effectA
Add or remove a Strudel effect on the current session pattern. action=add appends .<effect>(<params>). action=remove strips EVERY .<effect>(...) call from the pattern, not just the last. Example: effect({ action: "add", effect: "lpf", params: "1000" }). For higher-level effect bundles (mood/energy/refine) use shape; for raw transforms use transform.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | add or remove the effect | |
| effect | Yes | Effect name (e.g. lpf, room, delay) | |
| params | No | Effect parameters (action=add only) | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description usefully discloses that adding appends syntax to the session pattern and that removal is potentially broad, stripping every matching effect call rather than only the last. It does not explain error handling, removal of a nonexistent effect, or whether changes affect playback immediately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with purpose, followed by exact mutation semantics, an important removal warning, an example, and sibling routing. Every sentence contributes practical selection or invocation information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter session-pattern mutation, this supplies nearly everything needed to select and invoke the tool correctly, with the schema covering the remaining session parameter. The main omissions are result feedback and edge-case behavior, which matter somewhat more because there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, and the description adds meaningful semantics by showing how action, effect, and params combine into `.<effect>(<params>)`. The lpf example makes the expected string parameters concrete, while session_id remains adequately documented by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives specific actions, resource, and scope: adding or removing a Strudel effect on the current session pattern. The final sentence also distinguishes it from shape for effect bundles and transform for raw transforms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how action=add and action=remove differ and provides a concrete add invocation. Explicit routing to shape for mood/energy/refine bundles and transform for raw transforms gives clear sibling-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_audioA
Record a window of live Strudel audio and write it to a file. Returns a path plus what was actually recorded, not a wall of base64 — prefer this over audio_capture when you want the audio to exist somewhere. format=wav (default) decodes to 16-bit PCM a DAW will open; format=webm writes the raw Opus recording. Reports silent captures instead of writing a silent file and claiming success. Audio must already be playing: call playback({ action: "play" }) first. Example: export_audio({ duration: 4000, filename: "take-01" }).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format (default wav) | |
| output | No | file (default) writes to disk and returns a path; base64 returns bytes inline | |
| duration | No | Window to record in ms (100-30000, default 5000) | |
| filename | No | Output filename; reduced to a basename and confined to the export directory | |
| session_id | No | Optional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return shape (a path plus capture metadata, not inline bytes), the failure mode ('Reports silent captures instead of writing a silent file and claiming success'), and the required precondition of active playback. It does not discuss overwrite behavior, export directory location, or duration limits, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then alternative routing, then format semantics, then precondition, then an example — a sensible order. A few phrases are stylistically loose ('not a wall of base64', 'claiming success') but they carry behavioral information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, zero-required capture tool with no output schema, the description covers return values, format tradeoffs, the silent-capture edge case, and the playback precondition. Remaining gaps — where files land, overwrite behavior, and session routing — are either minor or already handled by the schema's parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: 'format=wav (default) decodes to 16-bit PCM a DAW will open; format=webm writes the raw Opus recording' explains the consequence of each enum value rather than restating it. It also demonstrates filename usage in the example call, though it says nothing extra about output=base64 or session_id beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource — 'Record a window of live Strudel audio and write it to a file' — and immediately differentiates itself from the sibling audio_capture by saying it is preferred 'when you want the audio to exist somewhere.' An agent can pick between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative ('prefer this over audio_capture') with the condition that selects it, plus a hard prerequisite: 'Audio must already be playing: call playback({ action: "play" }) first.' That is when-to-use, when-to-use-something-else, and ordering guidance in two sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_midiB
Export current pattern to MIDI file. Parses note(), n(), and chord() functions.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Tempo in BPM (default: the pattern's own tempo, or 120 if it declares none) | |
| format | No | Output format: file or base64 (default: base64) | |
| duration | No | Export duration in bars (default: 4) | |
| filename | No | Output filename (optional, default: pattern.mid) | |
| session_id | No | Optional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It does disclose that only note(), n(), and chord() calls are parsed, which is a real behavioral constraint (other event types may not be exported), but it omits failure behavior with no loaded pattern, where a 'file' output is written, and how sessions affect the capture despite a session_id parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and no filler. Every clause carries information; nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple export tool with a fully documented schema this is close to adequate, but with no annotations and no output schema the description should at least say what 'current pattern' means when multiple sessions exist and what a 'file' export produces. As written it leaves those operational questions unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with five documented parameters, so the schema already explains bpm defaults, the file/base64 enum, duration in bars, filename, and session routing. The description adds nothing about any parameter, so baseline 3 applies — not the zero-parameter baseline of 4, since five parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Export current pattern to MIDI file') and adds what it parses (note(), n(), chord()), which tells an agent what content is captured. It never names or distinguishes itself from the closest siblings (import_midi, export_audio), so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no mention of the obvious alternatives (import_midi for the reverse direction, export_audio for non-MIDI output). Usage is only implied by the 'current pattern' scoping phrase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_partA
Generate a single instrumental layer and append it to the current session pattern. role=drums takes style (e.g. "techno"/"house") and optional complexity 0-1. role=bass takes key (e.g. "C") + style. role=melody takes root/scale (e.g. C/minor) and optional length (notes). role=fill takes style and optional bars. Example: generate_part({ role: "drums", style: "techno", complexity: 0.7 }). For full compositions use compose; for rhythmic patterns use generate_rhythm; for music-theory queries use music_theory.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | role=bass: musical key | |
| bars | No | role=fill: number of bars (default 1) | |
| role | Yes | Which part to generate | |
| root | No | role=melody: root note | |
| scale | No | role=melody: scale name | |
| style | No | role=drums/bass/fill: musical style | |
| length | No | role=melody: number of notes (default 8) | |
| complexity | No | role=drums: complexity 0-1 (default 0.5) | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses mutation ('append it to the current session pattern') but lacks details on reversibility, error handling, or session management beyond session_id. No annotations provided to offset; would benefit from noting side effects more fully.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with role-specific paragraphs, an example, and a final line for sibling differentiation. Every sentence is informative, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all roles, defaults, and examples. Lacks return value description (no output schema), which would aid agent understanding of what to expect. Otherwise thorough for a generative tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds conditional per-role parameter usage (e.g., role=drums takes style, complexity; role=melody takes root/scale), which significantly aids parameter selection beyond schema's flat listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Generate' and distinct resource 'single instrumental layer' appended to session pattern. It clearly differentiates from siblings by naming alternatives (compose, generate_rhythm, music_theory).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs alternatives: 'For full compositions use compose; for rhythmic patterns use generate_rhythm; for music-theory queries use music_theory.' Also provides an example call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_rhythmA
Generate a rhythmic pattern and append it to the current session. type=euclidean produces a Euclidean rhythm with hits evenly distributed across steps (optional sound param, default "bd"). type=polyrhythm overlays multiple sound layers with given pattern numbers. Example: generate_rhythm({ type: "euclidean", hits: 3, steps: 8, sound: "hh" }). For complete patterns (drums/bass/melody) use generate_part; for whole compositions use compose.
| Name | Required | Description | Default |
|---|---|---|---|
| hits | No | type=euclidean: hits count | |
| type | Yes | Rhythm type | |
| sound | No | type=euclidean: sound to use (default bd) | |
| steps | No | type=euclidean: total steps | |
| sounds | No | type=polyrhythm: sounds per layer | |
| patterns | No | type=polyrhythm: pattern numbers per layer | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It explains the two modes and that the pattern is appended (state mutation). However, it does not detail side effects (e.g., overwriting, error handling) or prerequisites like session existence. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences) and well-structured: purpose first, then type explanations with example, then sibling alternatives. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and mutation behavior, the description covers types, parameters, and alternatives. However, it lacks details on return value or error conditions. With no output schema, a note on what the tool returns would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline 3. The description adds meaning by linking parameters to types (e.g., 'hits evenly distributed across steps') and stating defaults (sound default 'bd'). This enriches understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a rhythmic pattern and appends it to the current session. It specifies two types (euclidean, polyrhythm) and distinguishes itself from generate_part and compose, making the purpose unambiguous and differentiating it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: use generate_part for complete patterns and compose for whole compositions. The example demonstrates correct invocation, and the parameter descriptions clarify when each type applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_patternC
Get current pattern code
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral traits. It does not state whether the operation is read-only, has side effects, or requires specific permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise but at the cost of missing important context. It is not verbose, but it does not add value beyond the bare minimum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and the presence of many sibling tools, the description fails to provide enough context to understand what 'pattern code' is, what the tool returns, or how it relates to other pattern tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a clear description for the session_id parameter. The description adds no further value beyond the schema, but the schema itself is adequate, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool gets the current pattern code, identifying the verb and resource. However, 'pattern code' is somewhat vague without further context, and the description does not differentiate from similar sibling tools like 'query_pattern_events' or 'analyze_pattern'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of context, prerequisites, or exclusion criteria, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
historyA
Navigate or inspect the pattern edit history. action=undo reverts the last edit on the targeted session. action=redo replays a previously-undone edit. action=list returns recent entries with timestamps and previews (limit defaults to 10). action=restore jumps the editor to a specific entry by id (current pattern goes on the undo stack). action=compare diffs two entries by id (or one entry vs current pattern). Example: history({ action: "list", limit: 5 }) — recent edits, newest first. For on-disk saved patterns use pattern_store — history deals with the in-memory edit timeline of the current session.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | History entry ID (action=restore) | |
| id1 | No | First entry ID (action=compare) | |
| id2 | No | Second entry ID (action=compare, default: current pattern) | |
| limit | No | Maximum entries (action=list, default 10) | |
| action | Yes | Which history operation to perform | |
| session_id | No | Optional session ID (#108). Omit to use default session. Note: undo/redo/history stacks are currently server-wide; only the read/write target changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: undo reverts, redo replays, restore pushes current onto undo stack, compare diffs with defaults. It lacks details on side effects (e.g., idempotency) but covers the main behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs, front-loaded with the purpose and actions, followed by an example and sibling distinction. Every sentence is informative, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters and no output schema or annotations, the description covers all actions, parameters, defaults, and an example. It omits error scenarios but is otherwise sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds context beyond schema: it explains default limit (10), default id2 (current pattern), and the undo-stack effect of restore. This additional behavioral information enhances parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool navigates or inspects the pattern edit history, listing all five actions with clear verb-resource pairs. It explicitly contrasts with sibling tool pattern_store (in-memory vs on-disk), fully distinguishing its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each action and provides an example. It explicitly directs users to pattern_store for on-disk patterns, though it does not cover all sibling tools or edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_midiA
Convert a .mid file into a playable Strudel pattern (Phase 1: literal transcription, #201). Use source="base64" with data= for inline bytes, or source="path" with data= to read from the patterns/midi/ directory (path traversal blocked). Drum tracks (MIDI channel 10) emit one s() lane per sample so simultaneous kicks/hats do not collide. Pitched tracks emit note("...").s("piano") with simultaneous notes merged into [a,b,c] chord tokens. Phase 2+ (structural compression, voice separation, LLM idiomatic pass) tracked in separate issues. Example: import_midi({ source: "path", data: "drumloop.mid", steps_per_cycle: 16 }). For the reverse direction (Strudel → MIDI) use the export_midi tool.
| Name | Required | Description | Default |
|---|---|---|---|
| bars | No | Cap on bars to emit. Default: full file. | |
| data | Yes | For source=base64: base64-encoded .mid bytes (≤1MB decoded). For source=path: basename of a .mid file under ./patterns/midi/ (path-traversal blocked). | |
| source | Yes | How to interpret `data` — raw base64 bytes or a filename under patterns/midi/ | |
| drum_map | No | Optional override / extension to the default GM percussion map. Keys are MIDI note numbers (as strings, since JSON object keys), values are Strudel sample names. Example: { "60": "cp", "61": "rim" }. Unmapped drums fall back to rests and are surfaced in the result summary. | |
| steps_per_cycle | No | Grid resolution per bar (integer 1-64). Default 16. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the Phase 1 literal-transcription scope, channel-10 drum lane splitting, note("...").s("piano") emission for pitched tracks, chord-token merging, and that path traversal is blocked. What it omits is the shape of the return value (the schema mentions a 'result summary' but the description never says what is returned on success or failure).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then modes, then emission semantics, then the alternative tool — a sensible ordering. The Phase 2+ roadmap sentence and the '#201' issue reference are internal noise that an agent gains nothing from, though they cost only one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a converter with five parameters (including a nested drum_map) and no output schema, the description covers the important behavioral questions: how drums vs pitched tracks are rendered and what limits path input. The remaining gap is the return contract — whether the tool returns a pattern string, an object, or a summary with unmapped drums — which the agent must discover empirically.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning by tying source values to concrete data semantics ('data=<base64 string>' vs 'data=<basename>') and by showing steps_per_cycle in a realistic call. The drum_map override and bars cap are left entirely to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Convert a .mid file into a playable Strudel pattern') and immediately distinguishes itself from the sibling export_midi by naming the reverse-direction tool. An agent can tell what this does and what it does not do without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance for the two source modes (base64 for inline bytes, path for files under patterns/midi/) and names the alternative tool for the opposite direction. The inline example with source="path" anchors the intended invocation pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initB
Initialize Strudel in browser
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as side effects, required permissions, or state changes. 'Initialize' implies setup but lacks specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded. It avoids verbosity, but could benefit from a bit more context without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, the description is minimally complete. However, the absence of output schema and annotations means the agent gains little insight into what initialization entails, which is a gap for a potentially impactful action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so schema coverage is 100%. The description adds no parameter information but is not required to; baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Initialize' and the resource 'Strudel', indicating it sets up the Strudel environment. However, it does not differentiate from sibling tools like 'session' or 'browser_window' which might have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description lacks context about prerequisites or typical usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
music_theoryA
Music-theory queries. query=scale returns the notes of a scale (e.g. "C major scale: C, D, E, F, G, A, B"). query=chord_progression returns a chord progression for the key/style AND writes the resulting chord pattern into the current session. Example: music_theory({ query: "scale", root: "C", scale: "major" }). For pattern generation (drums/bass/melody) use generate_part; for rhythmic patterns use generate_rhythm.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Key (query=chord_progression) | |
| root | No | Root note (query=scale; also used as key for chord_progression) | |
| query | Yes | Which theory query | |
| scale | No | Scale type (query=scale) | |
| style | No | Style (query=chord_progression: pop/jazz/blues/etc) | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that chord_progression writes into the current session (side effect) and explains the output format for scale queries. However, it does not detail the chord progression output format or any error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences) and front-loaded with the core purpose. Each sentence adds distinct value, including an example and sibling tool references.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and a moderate complexity domain, the description is fairly complete. It covers both query types, inputs, side effects, and alternatives. Missing the exact output format for chord_progression prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but description adds value: it explains that root also serves as key for chord_progression, gives an example usage, and illustrates the scale output format. This goes beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is for music-theory queries, detailing two query types (scale and chord_progression) with specific outputs. It distinguishes from sibling tools (generate_part, generate_rhythm) by explicitly stating their use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use alternatives: 'For pattern generation (drums/bass/melody) use generate_part; for rhythmic patterns use generate_rhythm.' It also includes a concrete example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pattern_storeA
Persist patterns to disk and read them back. Use action=save to write the current session pattern under a name; action=load to restore a named pattern into the current session; action=list to enumerate the on-disk catalog (optionally filtered by tag). Example: pattern_store({ action: "save", name: "my-jam", tags: ["techno"] }). For session lifecycle (create/destroy/list active sessions) use the session tool — pattern_store deals with on-disk patterns, not runtime sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag (list only) | |
| name | No | Pattern name (required for save/load) | |
| tags | No | Tags to attach (save only) | |
| action | Yes | Which on-disk operation to perform | |
| overwrite | No | save only: replace a pattern saved under a DIFFERENT name that maps to the same file (names are lowercased and stripped of punctuation, so "My Jam" and "my-jam" collide). Off by default; the replaced pattern is unrecoverable. | |
| session_id | No | Optional session ID (#108). Sources/targets the named session's current pattern; the on-disk catalog is shared across sessions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that load mutates the current session and that the catalog is on-disk, but it omits the riskiest trait — the overwrite/collision behavior and irreversibility — which appears only in the schema's overwrite field rather than in the description. It also says nothing about return content or error behavior, so the safety profile is only partially surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then actions, then an example, then a sibling redirect — a sensible information hierarchy with no filler sentences. The example is slightly redundant with the enumerated actions, but it earns its place by showing the argument shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description ideally would say what save/load/list return (e.g., catalog entry shape), and it does not. Otherwise it is sufficiently complete for a 6-parameter persistence tool: operation semantics, tag filtering, and tool boundaries are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the field docs by explaining how each action value interacts with session state (save reads the current session pattern; load replaces it) and by clarifying the tag filter only applies to list. The collision/overwrite semantics and session_id scoping are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb pair and resource: "Persist patterns to disk and read them back," then enumerates the three operations (save/load/list) with what each does. It also explicitly scopes itself as the on-disk tool versus the runtime 'session' sibling, so an agent can separate it from the rest of the list without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the selection rule for each action (save = write current session pattern under a name; load = restore a named pattern; list = enumerate catalog, optionally tag-filtered) and gives a concrete call example. It also names the alternative tool and the condition that selects it: session lifecycle goes to the session tool, not here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playbackA
Control transport on the current session. action=play starts the editor pattern. action=pause halts the clock where it is, so play resumes mid-cycle. action=stop ends playback. Example: playback({ action: "play" }). For pattern editing use edit_pattern; for tempo use set_tempo.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Transport action | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses that pause halts the clock and play resumes mid-cycle, which is meaningful state behavior beyond the schema, though it omits whether stop resets position and what happens on errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then explains action semantics and sibling routing. The example is short and the text contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter transport tool with no output schema and no annotations, the core behavior and alternatives are adequately covered. Additional detail on session selection and stop/reset behavior would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining what play, pause, and stop actually do, going beyond the schema's brief 'Transport action' enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Control transport on the current session.' It also defines each enum action and distinguishes playback from edit_pattern and set_tempo, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete routing guidance: use edit_pattern for pattern editing and set_tempo for tempo. The required action parameter makes invocation clear, but it does not fully explain when to supply session_id or when playback should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_pattern_eventsA
Enumerate events the pattern would emit between two cycle indices (max 16 cycles)
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End cycle (default 1) | |
| start | No | Start cycle (default 0) | |
| pattern | Yes | Pattern code to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the max cycle range (16 cycles) and the action (enumerate events), but omits behavioral details such as whether the tool is read-only, side effects, or error handling. Some transparency is present but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to understanding the tool's purpose and constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and low complexity (3 params), the description adequately covers the core functionality. It states the action, range constraint, and max cycles. However, it could mention prerequisites (e.g., pattern existence) or return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, so the schema already defines parameters. The description adds no extra semantic context beyond the schema's descriptions. Baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'enumerate' and clearly states the resource ('events') and scope ('between two cycle indices, max 16 cycles'). It differentiates from siblings like 'get_pattern' by focusing on emitted events rather than the pattern itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention scenarios where it should not be used. The usage context is implied only through the tool's name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sessionA
Manage isolated Strudel browser sessions (multi-session, #108). action=create starts a new named session (sessions share one browser but isolated contexts). action=destroy closes a named session and releases its resources. action=list returns metadata for all active sessions (id, created, last_activity, is_playing, is_default). action=switch changes the default session that subsequent tool calls route to when no session_id is passed. Example: session({ action: "create", session_id: "live-set-1" }). For the on-disk pattern catalog use pattern_store(action=list) — session(action=list) lists runtime sessions, not saved patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Session lifecycle action | |
| session_id | No | Session identifier (required for create/destroy/switch) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: sessions share a browser but have isolated contexts, destroy releases resources, switch changes routing for subsequent calls. However, it omits potential error conditions (e.g., invalid session_id).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured, starting with a clear one-line summary, then breaking down each action in bullet-like format, and ending with a contrast to a sibling tool. No superfluous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking annotations and output schema, the description covers all actions, explains the shared-browser-but-isolated-context behavior, and distinguishes from a sibling tool. It provides an example and sufficient detail for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds context for each action value but does not significantly extend the schema's semantic detail beyond the provided enum and parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as managing isolated browser sessions, explicitly differentiates from the sibling pattern_store by contrasting runtime sessions vs. on-disk patterns, and uses specific verb-resource pairs for each action (e.g., 'starts a new named session').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance for each action (create, destroy, list, switch) and directly advises when to use the sibling pattern_store instead, establishing clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_tempoB
Set BPM. Writes setcpm(bpm/4), assuming one bar of 4/4 per cycle.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | Tempo in BPM | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one genuinely non-obvious behavior: the tool writes setcpm(bpm/4), assuming a bar of 4/4 per cycle. That conversion is invisible from the schema and valuable. However, it omits whether the change is global or session-scoped, whether it persists, and whether it affects currently playing audio, which are important for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary action, zero filler. Every clause carries information the caller could not get from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is on the thin side. It explains the internal mapping but not the scope of effect, persistence, or whether the caller must supply session_id to target a specific session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description exceeds that by explaining the underlying transformation of the bpm value (bpm/4 into setcpm), giving the parameter meaning beyond 'Tempo in BPM.' The optional session_id is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set BPM.' An agent immediately knows this changes the tempo. It doesn't differentiate itself from siblings like playback or compose, but 'Set BPM' is unambiguous enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no mention of when not to use it. The session_id parameter's behavior (default session fallback) is documented only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shapeA
Shape the current pattern along one of three high-level dimensions. dimension=mood applies a mood profile (dark/euphoric/melancholic/aggressive/dreamy/peaceful/energetic) with optional intensity 0-1. dimension=energy applies an energy level (integer 0-10). dimension=refine applies a directional refinement: faster/slower/louder/quieter/brighter/darker/"more reverb"/drier. All three auto-play by default. Example: shape({ dimension: "mood", target_mood: "dark", intensity: 0.8 }). For raw transform ops use transform; for explicit effects use effect.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | dimension=energy: integer level 0-10 | |
| auto_play | No | Start playback after shape (default true) | |
| dimension | Yes | Which dimension to shape along | |
| direction | No | dimension=refine: faster, slower, louder, quieter, brighter, darker, "more reverb", drier | |
| intensity | No | dimension=mood: intensity 0-1 (default 0.5) | |
| session_id | No | Optional session ID (#108). Omit to use default session. | |
| target_mood | No | dimension=mood: target mood |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that all dimensions auto-play by default and mentions optional intensity with a default of 0.5. However, it does not explicitly state whether the shape operation is non-destructive or what the return value is, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph that front-loads the main action and then details each dimension. All sentences are informative, but it could be slightly more concise by grouping the dimension descriptions more tightly. Still, it is well-structured and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters and no output schema, the description covers the core functionality well, including usage context and sibling differentiation. However, it lacks details on the return value or confirmation of success/failure, which would be helpful for an agent to fully understand the tool's effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all parameters described. The description adds significant value beyond the schema by explaining the meaning of each dimension, providing the example with target_mood and intensity, clarifying default values (intensity 0.5, auto_play true), and listing valid options for each dimension. This greatly aids parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Shape the current pattern along one of three high-level dimensions.' It lists the three dimensions (mood, energy, refine) with specific examples and distinguishes itself from sibling tools by explicitly directing users to 'transform' for raw transforms and 'effect' for explicit effects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each dimension (mood, energy, refine) with their respective parameters. It also tells users when not to use this tool, directing them to 'transform' for raw operations and 'effect' for effects. An example usage is included, making the expected call pattern clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transformA
Apply a single transform op to the current session pattern. op=transpose shifts notes by semitones. op=reverse appends .rev to the pattern. op=stretch slows by factor (>1 slower, <1 faster). op=quantize snaps to the grid (e.g. "1/16"). op=humanize adds rand-nudge timing of amount (0-1). op=swing applies .swing(amount). op=scale applies a root/scale filter to notes. op=vary returns a variation of type (subtle/moderate/extreme/glitch/evolving). Example: transform({ op: "transpose", semitones: 7 }). For effects (add/remove) use effect; for mood/energy/refine use shape; for tempo use set_tempo.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | Which transform to apply | |
| grid | No | op=quantize: grid size (e.g. "1/16") | |
| root | No | op=scale: root note (e.g. "C") | |
| type | No | op=vary: variation type (subtle/moderate/extreme/glitch/evolving) | |
| scale | No | op=scale: scale name (e.g. "minor") | |
| amount | No | op=humanize/swing: amount 0-1 | |
| factor | No | op=stretch: stretch factor | |
| semitones | No | op=transpose: integer semitones to shift | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes behavioral traits for each op, including side effects like appending '.rev' for reverse and mutating the session pattern. No annotations provided, so description carries burden well, though it could mention whether changes are reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but is well-organized and front-loaded with the purpose. It efficiently covers all ops without excessive length. Could be slightly more structured with bullets, but still concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (9 parameters, 8 ops) and absence of output schema, the description covers all necessary details, including an example and differentiation from siblings. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions, but the description adds significant meaning by explaining each op's effect and parameter usage. Includes an example for transpose, which goes beyond schema bare descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it applies a single transform operation to the current session pattern. It lists all eight ops and their effects, and differentiates from sibling tools like effect, shape, and set_tempo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool vs alternatives: 'For effects (add/remove) use effect; for mood/energy/refine use shape; for tempo use set_tempo.' Provides clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transpile_patternB
Transpile pattern source via StrudelEngine; returns transpiled code or syntax error
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Pattern code to transpile |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only mentions it returns transpiled code or a syntax error, but does not disclose side effects, safety (read-only or destructive), or any behavioral traits beyond the basic purpose. The agent is left uninformed about whether this modifies state or has prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently states the action, engine, and result. No unnecessary words; every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool, the description covers the basic purpose, but without annotations or output schema, it lacks detail on return value format and precise behavior. It is minimally adequate but could benefit from explaining what 'transpiled code' looks like or when errors occur.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage with a description for the single 'pattern' parameter: 'Pattern code to transpile'. The description does not add further meaning beyond what the schema already provides (e.g., format, constraints, examples). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'transpile', the resource 'pattern source via StrudelEngine', and the outcome ('returns transpiled code or syntax error'). This distinguishes it from sibling tools like 'validate_pattern_local' or 'analyze_pattern_local', though it could be more specific about what transpilation entails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. No when-to-use, when-not-to-use, or comparison with siblings is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_pattern_localB
Validate pattern syntax against the local StrudelEngine, which runs in a sandboxed child process (no browser required)
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Pattern code to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden. It usefully discloses the execution model (sandboxed child process, no browser), but says nothing about what happens on invalid syntax, whether errors are thrown or returned, side effects, or resource/timeout limits for the spawned process.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core action comes first and the environment qualifier follows. It is terse to the point of leaving gaps, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter validation tool with no output schema, the description should at least indicate the shape of a validation result (error list, boolean, line/column info). It instead covers only the execution environment, leaving the agent to discover return semantics by calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage ('Pattern code to validate'), so the schema already does the work. The description adds only the word 'syntax,' which slightly narrows the meaning but provides no format or example detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Validate pattern syntax') plus the execution target ('local StrudelEngine'), which implicitly separates it from the sibling validate_pattern_runtime. It does not name that sibling outright, so the differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'no browser required' hints at when this is preferred (headless/local contexts), but there is no explicit when-to-use, when-not-to-use, or named alternative such as validate_pattern_runtime. The agent must infer the routing decision from the environment note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_pattern_runtimeA
Validate pattern with runtime error checking (monitors Strudel console for errors)
| Name | Required | Description | Default |
|---|---|---|---|
| waitMs | No | How long to wait for errors (default 500ms) | |
| pattern | Yes | Pattern code to validate | |
| session_id | No | Optional session ID (#108). Omit to use default session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it monitors the Strudel console for errors, but does not mention side effects of executing the pattern or any required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient single sentence with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks details about return format, error behavior, and potential for pattern execution side effects; adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, description adds no additional meaning to parameters beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates a pattern with runtime error checking, distinguishing it from siblings like validate_pattern_local (static) and analyze (general).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this vs alternatives like validate_pattern_local; usage implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v4.1.1- Changed
audio_capture2 fields changed- changed
Input schema / properties / maxDuration / descriptionPrevious value: -"action=start: maximum capture duration ms"New value: +"action=start: stop the recorder automatically after this many ms. Defaults to 600000 (ten minutes); the recording so far is kept and returned by a later stop." - changed
Input schema / properties / session_id / descriptionPrevious value: -"Optional session ID (#108). Routes page reference to the named session. Note: AudioCaptureService is currently server-wide — concurrent captures across sessions will conflict."New value: +"Optional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180)."
- Changed
compose1 field changed- changed
Input schema / properties / style / descriptionPrevious value: -"Genre: techno, house, dnb, ambient, trap, jungle, jazz, experimental"New value: +"Genre: techno, house, dnb, breakbeat, trap, jungle, ambient, experimental, intelligent_dnb, trip_hop, boom_bap. Anything else (jazz included) gets techno drums, and the response says so."
- Changed
edit_pattern2 fields changed- changed
Input schema / properties / position / descriptionPrevious value: -"Line number (mode=insert)"New value: +"mode=insert: 0-indexed line to insert BEFORE. 0 puts the code at the top; a value equal to the line count appends. Out of range is an error, not an append." - added
Input schema / properties / replace_allAdded value: +{ + "description": "mode=replace: replace every occurrence instead of just the first (default false)", + "type": "boolean" +}
- Added
export_audio - Changed
export_midi2 fields changed- changed
Input schema / properties / bpm / descriptionPrevious value: -"Tempo in BPM (default: 120)"New value: +"Tempo in BPM (default: the pattern's own tempo, or 120 if it declares none)" - changed
Input schema / properties / session_id / descriptionPrevious value: -"Optional session ID (#108). Routes page reference to the named session. Note: AudioCaptureService is currently server-wide — concurrent captures across sessions will conflict."New value: +"Optional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180)."
- Changed
pattern_store1 field changed- added
Input schema / properties / overwriteAdded value: +{ + "description": "save only: replace a pattern saved under a DIFFERENT name that maps to the same file (names are lowercased and stripped of punctuation, so \"My Jam\" and \"my-jam\" collide). Off by default; the replaced pattern is unrecoverable.", + "type": "boolean" +}
84 tool updates
v4.0.0- Removed
add_effect - Removed
add_swing - Added
ai_assist - Changed
analyze2 fields changed- added
Input schema / properties / includeAdded value: +{ + "description": "Which analyses to return. Default [\"all\"] preserves pre-consolidation behaviour.", + "items": { + "enum": [ + "all", + "spectrum", + "rhythm", + "tempo", + "key" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Omit to use default session.", + "type": "string" +}
- Added
analyze_pattern_local - Removed
analyze_rhythm - Removed
analyze_spectrum - Removed
append - Removed
apply_scale - Added
audio_capture - Added
browser_window - Removed
capture_audio_sample - Removed
clear - Removed
compare_patterns - Changed
compose1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Omit to use default session. compose auto-init only applies to default session — named sessions must already exist.", + "type": "string" +}
- Removed
create_session - Removed
destroy_session - Removed
detect_key - Removed
detect_tempo - Changed
diagnostics2 fields changed- added
Input schema / properties / levelAdded value: +{ + "description": "Which diagnostic surface to read (default: full)", + "enum": [ + "status", + "full", + "perf", + "memory", + "errors" + ], + "type": "string" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Applies to level=status, full, errors. Ignored for perf/memory (server-wide metrics).", + "type": "string" +}
- Added
edit_pattern - Added
effect - Changed
export_midi1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Routes page reference to the named session. Note: AudioCaptureService is currently server-wide — concurrent captures across sessions will conflict.", + "type": "string" +}
- Removed
generate_bassline - Removed
generate_chord_progression - Removed
generate_drums - Removed
generate_euclidean - Removed
generate_fill - Removed
generate_melody - Added
generate_part - Removed
generate_pattern - Removed
generate_polyrhythm - Added
generate_rhythm - Removed
generate_scale - Removed
generate_variation - Changed
get_pattern1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Omit to use default session.", + "type": "string" +}
- Removed
get_pattern_feedback - Added
history - Removed
humanize - Added
import_midi - Removed
insert - Removed
jam_with - Removed
list - Removed
list_history - Removed
list_sessions - Removed
load - Removed
memory_usage - Added
music_theory - Added
pattern_store - Removed
pause - Removed
performance_report - Removed
play - Added
playback - Removed
quantize - Added
query_pattern_events - Removed
redo - Removed
refine - Removed
remove_effect - Removed
replace - Removed
restore_history - Removed
reverse - Removed
save - Removed
screenshot - Added
session - Removed
set_energy - Changed
set_tempo1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Omit to use default session.", + "type": "string" +}
- Added
shape - Removed
shift_mood - Removed
show_browser - Removed
show_errors - Removed
start_audio_capture - Removed
status - Removed
stop - Removed
stop_audio_capture - Removed
stretch - Removed
suggest_pattern_from_audio - Removed
switch_session - Added
transform - Added
transpile_pattern - Removed
transpose - Removed
undo - Added
validate_pattern_local - Changed
validate_pattern_runtime1 field changed- added
Input schema / properties / session_idAdded value: +{ + "description": "Optional session ID (#108). Omit to use default session.", + "type": "string" +}
- Removed
write
15 tool updates
v2.2.0- Added
capture_audio_sample - Changed
compose1 field changed- added
Input schema / properties / get_feedbackAdded value: +{ + "description": "Get AI feedback on the generated pattern (default: false)", + "type": "boolean" +}
- Added
create_session - Added
destroy_session - Added
export_midi - Added
get_pattern_feedback - Added
jam_with - Added
list_sessions - Added
refine - Added
set_energy - Added
shift_mood - Added
start_audio_capture - Added
stop_audio_capture - Added
suggest_pattern_from_audio - Added
switch_session
52 tool updates
v1.0.0- Added
add_effect - Added
add_swing - Added
analyze - Added
analyze_rhythm - Added
analyze_spectrum - Added
append - Added
apply_scale - Added
clear - Added
compare_patterns - Added
compose - Added
detect_key - Added
detect_tempo - Added
diagnostics - Added
generate_bassline - Added
generate_chord_progression - Added
generate_drums - Added
generate_euclidean - Added
generate_fill - Added
generate_melody - Added
generate_pattern - Added
generate_polyrhythm - Added
generate_scale - Added
generate_variation - Added
get_pattern - Added
humanize - Added
init - Added
insert - Added
list - Added
list_history - Added
load - Added
memory_usage - Added
pause - Added
performance_report - Added
play - Added
quantize - Added
redo - Added
remove_effect - Added
replace - Added
restore_history - Added
reverse - Added
save - Added
screenshot - Added
set_tempo - Added
show_browser - Added
show_errors - Added
status - Added
stop - Added
stretch - Added
transpose - Added
undo - Added
validate_pattern_runtime - Added
write
40 tool updates
- Removed
add_effect - Removed
add_swing - Removed
analyze - Removed
analyze_rhythm - Removed
analyze_spectrum - Removed
append - Removed
apply_scale - Removed
clear - Removed
detect_key - Removed
detect_tempo - Removed
generate_bassline - Removed
generate_chord_progression - Removed
generate_drums - Removed
generate_euclidean - Removed
generate_fill - Removed
generate_melody - Removed
generate_pattern - Removed
generate_polyrhythm - Removed
generate_scale - Removed
generate_variation - Removed
get_pattern - Removed
humanize - Removed
init - Removed
insert - Removed
list - Removed
load - Removed
pause - Removed
play - Removed
quantize - Removed
redo - Removed
remove_effect - Removed
replace - Removed
reverse - Removed
save - Removed
set_tempo - Removed
stop - Removed
stretch - Removed
transpose - Removed
undo - Removed
write
40 tool updates
- First observed
add_effect - First observed
add_swing - First observed
analyze - First observed
analyze_rhythm - First observed
analyze_spectrum - First observed
append - First observed
apply_scale - First observed
clear - First observed
detect_key - First observed
detect_tempo - First observed
generate_bassline - First observed
generate_chord_progression - First observed
generate_drums - First observed
generate_euclidean - First observed
generate_fill - First observed
generate_melody - First observed
generate_pattern - First observed
generate_polyrhythm - First observed
generate_scale - First observed
generate_variation - First observed
get_pattern - First observed
humanize - First observed
init - First observed
insert - First observed
list - First observed
load - First observed
pause - First observed
play - First observed
quantize - First observed
redo - First observed
remove_effect - First observed
replace - First observed
reverse - First observed
save - First observed
set_tempo - First observed
stop - First observed
stretch - First observed
transpose - First observed
undo - First observed
write
TDQS
Scored across 28 tools
The set has many pattern-mutating tools (edit_pattern, effect, transform, shape, generate_part, generate_rhythm, compose, ai_assist) plus several validation/analysis tools that could be confused without reading the long cross-references. The descriptions do explicitly point to adjacent tools, but the boundaries are still dense and require careful reading.
Names mix verb-first patterns (get_pattern, set_tempo, edit_pattern, export_midi) with noun-first names (pattern_store, audio_capture, browser_window, music_theory) and bare nouns (playback, effect, diagnostics, history, session). It remains readable but is not a predictable convention throughout.
At 28 tools, the surface is heavy for an agent to navigate, even for a rich live-coding domain. Many tools use action parameters, but there are still numerous fine-grained operations that could be consolidated or scoped down.
Coverage is broad: playback, editing, effects, transforms, generation, AI assistance, validation, analysis, MIDI/audio export, history, sessions, diagnostics, and browser interaction are all present. The main minor gap is pattern_store lacking delete/rename lifecycle operations, but core workflows are well covered.
Maintenance
Related MCP Connectors
Browser DAW for AI assistants: build multitrack songs with MIDI, effects, stems and generation.
ABC sheet music + Strudel live coding: songs, videos and live jam sessions in ext-apps widgets.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Autonomous music production for AI agents with MIDI generation, QC and provenance.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to work with Strudel live coding patterns for music creation, including parsing mini notation, generating rhythmic patterns, accessing music theory (scales/chords), and applying pattern transformations.9 npmMIT
- FlicenseCqualityDmaintenanceEnables AI agents to generate, manipulate, and perform algorithmic music using Strudel.cc live coding environment. Provides 46+ tools for pattern generation across multiple genres, music theory operations, real-time audio analysis, and AI-powered composition.50-
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with Strudel, a JavaScript live coding music environment, by executing patterns, retrieving states, and accessing documentation.2AGPL 3.0
- AlicenseAqualityAmaintenanceEnables conversational live coding with Claude AI and TidalCycles, allowing users to create and manipulate algorithmic music patterns through natural language.2029 npm17MIT