Skip to main content
Glama
Strudel MCP Server

Strudel MCP Server

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

CI npm version Nerq Trust Tools License

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 CI

  • Expect 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_assist for 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 test runs ~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.json by a drift guard.

  • Lint blocking in CI: 0 errors, ~195 warnings (mostly any in 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-mcp

Update 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 chromium

From 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 build

Quick 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-time

Building from source instead? See Installation → From Source.

2. Configure your MCP client

Claude Desktop

Edit your Claude Desktop config file:

OS

Config path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

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.js

3. 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 validate

You 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 the strudel://examples MCP resource without burning tool calls.

Quick Reference

Common operations as one-line tool calls:

Action

Tool call

Initialize browser

init

Create a techno beat in one shot

compose({ style: "techno" })

Play pattern

playback({ action: "play" })

Stop playback

playback({ action: "stop" })

Get current pattern

get_pattern

Analyze audio (all features)

analyze({ include: ["all"] })

Detect tempo only

analyze({ include: ["tempo"] })

Save pattern

pattern_store({ action: "save", name: "my-pattern" })

Undo last edit

history({ action: "undo" })

Edit current pattern

edit_pattern({ mode: "write", pattern: "..." })

Create an isolated session

session({ action: "create", session_id: "live-1" })

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: true

Available Tools

28 tools across 15 categories:

Tool

Description

init

Initialize Strudel in browser

Tool

Description

edit_pattern

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.

get_pattern

Get current pattern code

Tool

Description

playback

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_tempo

Set BPM. Writes setcpm(bpm/4), assuming one bar of 4/4 per cycle.

Tool

Description

pattern_store

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.

import_midi

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

history

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

compose

Generate, write, and play a complete pattern in one step. Auto-initializes default browser if needed.

generate_part

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.

generate_rhythm

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.

Tool

Description

music_theory

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

transform

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.

effect

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.

shape

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

ai_assist

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

analyze

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_runtime

Validate pattern with runtime error checking (monitors Strudel console for errors)

validate_pattern_local

Validate pattern syntax against the local StrudelEngine, which runs in a sandboxed child process (no browser required)

analyze_pattern_local

Static analysis (events/cycle, complexity, optional BPM) without browser playback

query_pattern_events

Enumerate events the pattern would emit between two cycle indices (max 16 cycles)

transpile_pattern

Transpile pattern source via StrudelEngine; returns transpiled code or syntax error

Tool

Description

session

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_midi

Export current pattern to MIDI file. Parses note(), n(), and chord() functions.

browser_window

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.

Tool

Description

audio_capture

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).

Tool

Description

diagnostics

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

export_audio

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 counts

Configuration

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 up

Development

For development setup, scripts, debugging, adding new tools, and the release process, see DEVELOPMENT.md.

Quick links:

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 fft_size)

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 together

Headless 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-sandbox and --disable-setuid-sandbox (src/StrudelController.ts) for headless and container compatibility, where the sandbox otherwise needs CAP_SYS_ADMIN or 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 chromium

Audio analysis returns "not connected"

Symptom: Audio analysis shows connected: false

Solutions:

  1. Ensure pattern is playing first:

    You: Play the pattern, wait 2 seconds, then analyze
  2. Reinitialize the browser:

    You: Stop, close the browser, reinitialize, and try again
  3. Check 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 chat

Performance issues / Slow response

Symptom: Operations take longer than expected

Solutions:

  1. Enable caching (default, but verify):

    • Editor caching: 100ms TTL

    • Audio analysis: 50ms TTL

  2. Use headless mode for faster operation:

    // config.json
    { "headless": true }
  3. Batch operations:

    Instead of:
    - Add drums
    - Add bass
    - Add melody
    
    Do:
    - Generate complete pattern with drums, bass, and melody
  4. Reduce 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-deps

Linux

# Install system dependencies
sudo npx playwright install-deps chromium

# If running in Docker/headless environment:
# Ensure config.json has headless: true

Windows

# Use PowerShell or Git Bash
# Paths should use forward slashes in config.json

# If Chromium doesn't launch:
npx playwright install chromium

Debugging Tips

Enable Verbose Logging

# Set environment variable
DEBUG=* node dist/index.js

# Or in Claude:
You: Enable detailed logging for the next operation

Check 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:

  1. Check existing issues: GitHub Issues

  2. Run integration tests: npm run test:integration

  3. Enable debug mode: DEBUG=* npm start

  4. Consult Strudel docs: Strudel.cc documentation

  5. 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 tools
ai_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.

NameRequiredDescriptionDefault
roleNotask=suggest: role the suggested pattern fills (default complement)
taskYesWhich AI task
layerNotask=jam: layer type to generate
styleNotask=feedback/suggest: style hint
auto_playNotask=jam: start playback after merge (default true)
session_idNoOptional session ID (#108). Omit to use default session.
style_hintNotask=jam: style guidance
includeAudioNotask=feedback: include audio analysis (default false)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
includeNoWhich analyses to return. Default ["all"] preserves pre-consolidation behaviour.
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
patternYesPattern code to analyze

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

NameRequiredDescriptionDefault
actionYesCapture action
formatNoaction=start: audio format (default webm)
durationNoaction=sample: duration ms (100-60000, default 5000)
session_idNoOptional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180).
maxDurationNoaction=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

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
actionYesWindow action
filenameNoaction=screenshot: optional output filename
session_idNoOptional session ID (#108). Omit to use default session. compose auto-init only applies to default session — named sessions must already exist.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
keyNoMusical key (default: C)
styleYesGenre: 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.
tempoNoBPM (default: genre-appropriate)
auto_playNoStart playback immediately (default: true)
session_idNoOptional session ID (#108). Omit to use default session. compose auto-init only applies to default session — named sessions must already exist.
get_feedbackNoGet AI feedback on the generated pattern (default: false)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
levelNoWhich diagnostic surface to read (default: full)
session_idNoOptional session ID (#108). Applies to level=status, full, errors. Ignored for perf/memory (server-wide metrics).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
codeNoCode to append/insert (mode=append/insert)
modeNoWhich edit operation to perform (default: write)
searchNoText to replace (mode=replace)
patternNoPattern code (mode=write)
replaceNoReplacement text (mode=replace)
positionNomode=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.
validateNoValidate pattern before write (mode=write only, default: true)
auto_playNoStart playback after write (mode=write only, default: false)
session_idNoOptional session ID (#108). Omit to use default session.
replace_allNomode=replace: replace every occurrence instead of just the first (default false)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
actionYesadd or remove the effect
effectYesEffect name (e.g. lpf, room, delay)
paramsNoEffect parameters (action=add only)
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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" }).

NameRequiredDescriptionDefault
formatNoOutput format (default wav)
outputNofile (default) writes to disk and returns a path; base64 returns bytes inline
durationNoWindow to record in ms (100-30000, default 5000)
filenameNoOutput filename; reduced to a basename and confined to the export directory
session_idNoOptional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
bpmNoTempo in BPM (default: the pattern's own tempo, or 120 if it declares none)
formatNoOutput format: file or base64 (default: base64)
durationNoExport duration in bars (default: 4)
filenameNoOutput filename (optional, default: pattern.mid)
session_idNoOptional session ID (#108). Routes the capture to the named session, which has its own recorder — concurrent captures across sessions are safe (#180).

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
keyNorole=bass: musical key
barsNorole=fill: number of bars (default 1)
roleYesWhich part to generate
rootNorole=melody: root note
scaleNorole=melody: scale name
styleNorole=drums/bass/fill: musical style
lengthNorole=melody: number of notes (default 8)
complexityNorole=drums: complexity 0-1 (default 0.5)
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
hitsNotype=euclidean: hits count
typeYesRhythm type
soundNotype=euclidean: sound to use (default bd)
stepsNotype=euclidean: total steps
soundsNotype=polyrhythm: sounds per layer
patternsNotype=polyrhythm: pattern numbers per layer
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

C2.5/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
idNoHistory entry ID (action=restore)
id1NoFirst entry ID (action=compare)
id2NoSecond entry ID (action=compare, default: current pattern)
limitNoMaximum entries (action=list, default 10)
actionYesWhich history operation to perform
session_idNoOptional session ID (#108). Omit to use default session. Note: undo/redo/history stacks are currently server-wide; only the read/write target changes.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
barsNoCap on bars to emit. Default: full file.
dataYesFor source=base64: base64-encoded .mid bytes (≤1MB decoded). For source=path: basename of a .mid file under ./patterns/midi/ (path-traversal blocked).
sourceYesHow to interpret `data` — raw base64 bytes or a filename under patterns/midi/
drum_mapNoOptional 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_cycleNoGrid resolution per bar (integer 1-64). Default 16.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
keyNoKey (query=chord_progression)
rootNoRoot note (query=scale; also used as key for chord_progression)
queryYesWhich theory query
scaleNoScale type (query=scale)
styleNoStyle (query=chord_progression: pop/jazz/blues/etc)
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
tagNoFilter by tag (list only)
nameNoPattern name (required for save/load)
tagsNoTags to attach (save only)
actionYesWhich on-disk operation to perform
overwriteNosave 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_idNoOptional session ID (#108). Sources/targets the named session's current pattern; the on-disk catalog is shared across sessions.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
actionYesTransport action
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

NameRequiredDescriptionDefault
endNoEnd cycle (default 1)
startNoStart cycle (default 0)
patternYesPattern code to query

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
actionYesSession lifecycle action
session_idNoSession identifier (required for create/destroy/switch)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
bpmYesTempo in BPM
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
levelNodimension=energy: integer level 0-10
auto_playNoStart playback after shape (default true)
dimensionYesWhich dimension to shape along
directionNodimension=refine: faster, slower, louder, quieter, brighter, darker, "more reverb", drier
intensityNodimension=mood: intensity 0-1 (default 0.5)
session_idNoOptional session ID (#108). Omit to use default session.
target_moodNodimension=mood: target mood

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
opYesWhich transform to apply
gridNoop=quantize: grid size (e.g. "1/16")
rootNoop=scale: root note (e.g. "C")
typeNoop=vary: variation type (subtle/moderate/extreme/glitch/evolving)
scaleNoop=scale: scale name (e.g. "minor")
amountNoop=humanize/swing: amount 0-1
factorNoop=stretch: stretch factor
semitonesNoop=transpose: integer semitones to shift
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
patternYesPattern code to transpile

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

NameRequiredDescriptionDefault
patternYesPattern code to validate

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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)

NameRequiredDescriptionDefault
waitMsNoHow long to wait for errors (default 500ms)
patternYesPattern code to validate
session_idNoOptional session ID (#108). Omit to use default session.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv4.1.1
    • Changedaudio_capture2 fields changed
      • changedInput schema / properties / maxDuration / description
        Previous 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."
      • changedInput schema / properties / session_id / description
        Previous 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)."
    • Changedcompose1 field changed
      • changedInput schema / properties / style / description
        Previous 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."
    • Changededit_pattern2 fields changed
      • changedInput schema / properties / position / description
        Previous 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."
      • addedInput schema / properties / replace_all
        Added value: +{
        +  "description": "mode=replace: replace every occurrence instead of just the first (default false)",
        +  "type": "boolean"
        +}
    • Addedexport_audio
    • Changedexport_midi2 fields changed
      • changedInput schema / properties / bpm / description
        Previous value: -"Tempo in BPM (default: 120)"New value: +"Tempo in BPM (default: the pattern's own tempo, or 120 if it declares none)"
      • changedInput schema / properties / session_id / description
        Previous 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)."
    • Changedpattern_store1 field changed
      • addedInput schema / properties / overwrite
        Added 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"
        +}
  2. 84 tool updatesv4.0.0
    • Removedadd_effect
    • Removedadd_swing
    • Addedai_assist
    • Changedanalyze2 fields changed
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Which analyses to return. Default [\"all\"] preserves pre-consolidation behaviour.",
        +  "items": {
        +    "enum": [
        +      "all",
        +      "spectrum",
        +      "rhythm",
        +      "tempo",
        +      "key"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Optional session ID (#108). Omit to use default session.",
        +  "type": "string"
        +}
    • Addedanalyze_pattern_local
    • Removedanalyze_rhythm
    • Removedanalyze_spectrum
    • Removedappend
    • Removedapply_scale
    • Addedaudio_capture
    • Addedbrowser_window
    • Removedcapture_audio_sample
    • Removedclear
    • Removedcompare_patterns
    • Changedcompose1 field changed
      • addedInput schema / properties / session_id
        Added 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"
        +}
    • Removedcreate_session
    • Removeddestroy_session
    • Removeddetect_key
    • Removeddetect_tempo
    • Changeddiagnostics2 fields changed
      • addedInput schema / properties / level
        Added value: +{
        +  "description": "Which diagnostic surface to read (default: full)",
        +  "enum": [
        +    "status",
        +    "full",
        +    "perf",
        +    "memory",
        +    "errors"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Optional session ID (#108). Applies to level=status, full, errors. Ignored for perf/memory (server-wide metrics).",
        +  "type": "string"
        +}
    • Addededit_pattern
    • Addedeffect
    • Changedexport_midi1 field changed
      • addedInput schema / properties / session_id
        Added 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"
        +}
    • Removedgenerate_bassline
    • Removedgenerate_chord_progression
    • Removedgenerate_drums
    • Removedgenerate_euclidean
    • Removedgenerate_fill
    • Removedgenerate_melody
    • Addedgenerate_part
    • Removedgenerate_pattern
    • Removedgenerate_polyrhythm
    • Addedgenerate_rhythm
    • Removedgenerate_scale
    • Removedgenerate_variation
    • Changedget_pattern1 field changed
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Optional session ID (#108). Omit to use default session.",
        +  "type": "string"
        +}
    • Removedget_pattern_feedback
    • Addedhistory
    • Removedhumanize
    • Addedimport_midi
    • Removedinsert
    • Removedjam_with
    • Removedlist
    • Removedlist_history
    • Removedlist_sessions
    • Removedload
    • Removedmemory_usage
    • Addedmusic_theory
    • Addedpattern_store
    • Removedpause
    • Removedperformance_report
    • Removedplay
    • Addedplayback
    • Removedquantize
    • Addedquery_pattern_events
    • Removedredo
    • Removedrefine
    • Removedremove_effect
    • Removedreplace
    • Removedrestore_history
    • Removedreverse
    • Removedsave
    • Removedscreenshot
    • Addedsession
    • Removedset_energy
    • Changedset_tempo1 field changed
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Optional session ID (#108). Omit to use default session.",
        +  "type": "string"
        +}
    • Addedshape
    • Removedshift_mood
    • Removedshow_browser
    • Removedshow_errors
    • Removedstart_audio_capture
    • Removedstatus
    • Removedstop
    • Removedstop_audio_capture
    • Removedstretch
    • Removedsuggest_pattern_from_audio
    • Removedswitch_session
    • Addedtransform
    • Addedtranspile_pattern
    • Removedtranspose
    • Removedundo
    • Addedvalidate_pattern_local
    • Changedvalidate_pattern_runtime1 field changed
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Optional session ID (#108). Omit to use default session.",
        +  "type": "string"
        +}
    • Removedwrite
  3. 15 tool updatesv2.2.0
    • Addedcapture_audio_sample
    • Changedcompose1 field changed
      • addedInput schema / properties / get_feedback
        Added value: +{
        +  "description": "Get AI feedback on the generated pattern (default: false)",
        +  "type": "boolean"
        +}
    • Addedcreate_session
    • Addeddestroy_session
    • Addedexport_midi
    • Addedget_pattern_feedback
    • Addedjam_with
    • Addedlist_sessions
    • Addedrefine
    • Addedset_energy
    • Addedshift_mood
    • Addedstart_audio_capture
    • Addedstop_audio_capture
    • Addedsuggest_pattern_from_audio
    • Addedswitch_session
  4. 52 tool updatesv1.0.0
    • Addedadd_effect
    • Addedadd_swing
    • Addedanalyze
    • Addedanalyze_rhythm
    • Addedanalyze_spectrum
    • Addedappend
    • Addedapply_scale
    • Addedclear
    • Addedcompare_patterns
    • Addedcompose
    • Addeddetect_key
    • Addeddetect_tempo
    • Addeddiagnostics
    • Addedgenerate_bassline
    • Addedgenerate_chord_progression
    • Addedgenerate_drums
    • Addedgenerate_euclidean
    • Addedgenerate_fill
    • Addedgenerate_melody
    • Addedgenerate_pattern
    • Addedgenerate_polyrhythm
    • Addedgenerate_scale
    • Addedgenerate_variation
    • Addedget_pattern
    • Addedhumanize
    • Addedinit
    • Addedinsert
    • Addedlist
    • Addedlist_history
    • Addedload
    • Addedmemory_usage
    • Addedpause
    • Addedperformance_report
    • Addedplay
    • Addedquantize
    • Addedredo
    • Addedremove_effect
    • Addedreplace
    • Addedrestore_history
    • Addedreverse
    • Addedsave
    • Addedscreenshot
    • Addedset_tempo
    • Addedshow_browser
    • Addedshow_errors
    • Addedstatus
    • Addedstop
    • Addedstretch
    • Addedtranspose
    • Addedundo
    • Addedvalidate_pattern_runtime
    • Addedwrite
  5. 40 tool updates
    • Removedadd_effect
    • Removedadd_swing
    • Removedanalyze
    • Removedanalyze_rhythm
    • Removedanalyze_spectrum
    • Removedappend
    • Removedapply_scale
    • Removedclear
    • Removeddetect_key
    • Removeddetect_tempo
    • Removedgenerate_bassline
    • Removedgenerate_chord_progression
    • Removedgenerate_drums
    • Removedgenerate_euclidean
    • Removedgenerate_fill
    • Removedgenerate_melody
    • Removedgenerate_pattern
    • Removedgenerate_polyrhythm
    • Removedgenerate_scale
    • Removedgenerate_variation
    • Removedget_pattern
    • Removedhumanize
    • Removedinit
    • Removedinsert
    • Removedlist
    • Removedload
    • Removedpause
    • Removedplay
    • Removedquantize
    • Removedredo
    • Removedremove_effect
    • Removedreplace
    • Removedreverse
    • Removedsave
    • Removedset_tempo
    • Removedstop
    • Removedstretch
    • Removedtranspose
    • Removedundo
    • Removedwrite
  6. 40 tool updates
    • First observedadd_effect
    • First observedadd_swing
    • First observedanalyze
    • First observedanalyze_rhythm
    • First observedanalyze_spectrum
    • First observedappend
    • First observedapply_scale
    • First observedclear
    • First observeddetect_key
    • First observeddetect_tempo
    • First observedgenerate_bassline
    • First observedgenerate_chord_progression
    • First observedgenerate_drums
    • First observedgenerate_euclidean
    • First observedgenerate_fill
    • First observedgenerate_melody
    • First observedgenerate_pattern
    • First observedgenerate_polyrhythm
    • First observedgenerate_scale
    • First observedgenerate_variation
    • First observedget_pattern
    • First observedhumanize
    • First observedinit
    • First observedinsert
    • First observedlist
    • First observedload
    • First observedpause
    • First observedplay
    • First observedquantize
    • First observedredo
    • First observedremove_effect
    • First observedreplace
    • First observedreverse
    • First observedsave
    • First observedset_tempo
    • First observedstop
    • First observedstretch
    • First observedtranspose
    • First observedundo
    • First observedwrite

TDQS

B3.3/5.0

Scored across 28 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to interact with Strudel, a JavaScript live coding music environment, by executing patterns, retrieving states, and accessing documentation.
    2
    AGPL 3.0