MCP server for controlling Digital Audio Workstations (DAWs) like REAPER and Audacity through a unified interface
37 tools with consistent verb_noun naming (transport_*, track_*, fx_*, etc.) and explicit JsonSchema parameter structs. All tools have descriptions (10-100 chars, mostly 40-80). Input schemas are well-defined with typed parameters. However, output schemas are NOT documented, responses are serialized to JSON text without declared structure. Error handling is minimal (generic McpError::internal_error). No tool annotations (readOnlyHint, destructiveHint). Parameter descriptions are terse (avg ~30 chars) and lack constraint details (ranges, enums, format hints). No pagination support despite tools like track_list and fx_list that could return large results. Composition is sound (single responsibility per tool), but missing recovery guidance in error messages.
Execute a REAPER action by command ID (REAPER-only)
Compose a musical piece from notes and render it (REAPER-only)
Check whether the DAW and its bridge/adapter are reachable
Add an effect to a track
Get an effect parameter value
List all effects on a track
Remove an effect from a track
Enable or disable an effect on a track
Output schemas not documented. Tools return JSON text via ok_json() but no schema is declared for responses. LLMs cannot plan downstream tool calls or extract structured data without knowing response fields.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like track_remove and run_reascript are marked DESTRUCTIVE/IRREVERSIBLE in metadata but not in schema. LLMs cannot distinguish safe from dangerous tools without explicit hints.
Parameter descriptions lack constraint details. E.g., 'pan' accepts -1.0 to 1.0 but description does not state range. 'pitch' and 'velocity' accept 0-127 but no bounds documented. LLMs guess and pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Set an effect parameter value
Move an item to a new start time (REAPER-only)
Split an item at a specific time (REAPER-only)
Add a marker at a position (REAPER-only)
Add a MIDI item to a track (REAPER-only)
Add a note to a MIDI item (REAPER-only)
Save the project
Undo the last action
Add a region (REAPER-only)
Render the project to an audio file
Run arbitrary ReaScript code (REAPER-only)
Add a new track, optionally named. -1 index means master everywhere else.
List all tracks
Remove a track by index
Rename a track
Set a track's color by RGB values
Mute or unmute a track
Set a track's pan, -1.0 (left) to 1.0 (right)
Solo or unsolo a track
Set a track's volume in dB
Get transport state: playing/paused/recording, position, tempo
Pause playback
Start playback
Start recording
Seek the playhead to a position in seconds
Set the project tempo in BPM
Stop playback
Scroll the view to a position (REAPER-only)
Set the zoom level (REAPER-only)
No pagination support. track_list and fx_list could return hundreds of items but accept no limit/offset/page parameters. Large results blow context window and degrade LLM reasoning.
Error handling is generic. All errors map to McpError::internal_error() with no recovery guidance. E.g., 'track_index out of bounds' should suggest 'Call track_list() first to see available tracks.'