opendaw-mcp¶
547 MCP tools for agent-native control of openDAW — a browser-based digital audio workstation.
Control every aspect of music production from your LLM agent: synths, effects, MIDI, mixing, automation, rendering, stem separation, DSP scripting, and more.
Why opendaw-mcp?¶
| Feature | opendaw-mcp | Generic MCP audio servers |
|---|---|---|
| Tool count | 547 domain-specific | 5–20 generic |
| Browser bridge | Playwright + headless Chromium | Local CLI / API only |
| Real-time DAW control | Full mixer, transport, arrangement | Playback only |
| DSP scripting | Custom JS audio worklets | None |
| Stem separation | 7 SOTA models, GPU-local | API-dependent |
| Genre templates | 8 E2E-verified | None |
| Agent skills | 12 bundled | None |
| Orchestration tools | 80+ high-level composers | None |
Quick numbers¶
- 547 MCP tools (
mcp_opendaw_*prefix) - 226 Python examples
- 134 DSP scripts (Werkstatt / Apparat / Spielwerk)
- 12 agent skills
- 6139 unit + E2E tests
- 0 ruff errors
Install¶
Or run via Docker:
30-second demo¶
from opendaw_mcp.server import OpendawServer
server = OpendawServer()
await server.bridge.start()
# Create a full drum beat in one call
await server.mcp_opendaw_create_drum_pattern(
pattern="x...x...x...x...|o.......o.....o.|..x...x...x...x.",
unit_index=0
)
# Add a synth with reverb
await server.mcp_opendaw_create_synth_track(name="Lead")
await server.mcp_opendaw_add_effect(unit_index=1, effect_type="Dattorro")
await server.mcp_opendaw_set_effect_parameter(unit_index=1, effect_index=0, param="decay", value=0.6)
# Render
await server.mcp_opendaw_render_full(output_path="beat.wav")
Architecture¶
graph LR
A[LLM Agent] -->|MCP protocol| B[opendaw-mcp server]
B -->|Playwright| C[headless Chromium]
C -->|COOP/COEP| D[openDAW V8 engine]
D -->|AudioWorklet| E[Web Audio API]
E --> F[WAV / MP3 / FLAC]
The server connects to a headless Chromium instance running openDAW via Playwright. All 547 tools map to typed DAW operations through a bridge that injects typed helpers into the V8 context.