Reaper Daemon
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mix_recipeB | Capture a local mix recipe, compare it with the current session, or rebuild it in a separate project tab. Original tab is restored. Media is excluded. |
| get_statusA | Check the bridge is alive inside REAPER (heartbeat, open project, whether risk-level-3 commands like audio capture are enabled). Call this first. |
| get_contextA | Read the open REAPER project: name, tempo, transport, cursor, time selection, every track (with FX names), markers, regions. Read-only. Run before ambiguous edits. |
| scan_fxA | Enumerate FX and their parameters — one track or the whole project (omit the track selector). Read-only. Lists only FX ALREADY LOADED in the project, NOT your installed-plugin library. Never use it to check whether a plugin exists before adding one — that is the fx add resolver's job. |
| get_fx_parametersA | Full parameter list for ONE FX (auto-paginated): index, name, normalized value, formatted display value. Scan before setting parameters; prefer param_index from this scan over name matching. |
| get_track_routingA | Read a track's routing: sends, receives, parent bus, volume, pan, phase, automation mode. Read-only. |
| transportB | Transport and project timing: play, stop, pause, record, set_cursor, set_time_selection, set_tempo. Mutations run in an undo block (Ctrl/Cmd+Z reverts). |
| trackB | Track operations: add, delete, rename, select, set_volume (dB), set_pan (-1..1), mute, solo, arm, set_color. Every mutation runs in a REAPER undo block. Supports dry_run. delete is destructive — confirm intent first. |
| fxA | FX chain operations: add (fuzzy plugin-name resolution against REAPER's installed-plugin cache), remove, bypass, move. Undo-block wrapped; supports dry_run (dry_run add needs the exact fx_name, no fuzzy resolution). TO ADD A PLUGIN, JUST RUN add IN ONE CALL. The resolver against the installed-plugin cache IS the check — a plugin being absent from the project is normal and expected (adding it is the whole point). Do NOT precheck with scan_fx, do NOT hedge about whether it's installed, do NOT narrate a plan. Target the master with track:"master". The user may be recording live; extra steps and preamble ruin the take. To change a parameter on an FX already in the chain use set_fx_param. |
| set_fx_paramA | Set one FX parameter. Give normalized_value (0-1), formatted_value (e.g. '-16.00 dB', '80 Hz' — the bridge binary-searches the normalized value whose display matches), or relative ('+0.1'). Scan with get_fx_parameters first and prefer param_index. Undo-block wrapped; supports dry_run. |
| get_fx_param_automationB | Read one existing FX-parameter envelope without creating or arming it. Returns envelope state, inclusive-range points, optional neighbors, automation items, duplicate times, and a canonical content hash. |
| write_automationA | Write one FX-parameter envelope transactionally: snapshot, inclusive-range replacement, reread confirmation, and automatic rollback on any failure. A declared range always means replacement. |
| apply_automation_transactionA | Atomically write several FX-parameter envelopes (e.g. a stereo pair) in one undo block. Every envelope is snapshotted before mutation; any failure restores all of them and rereads the restoration before reporting. |
| markersC | Add or delete markers and regions (add_marker, add_region, delete_marker). |
| insert_midi_fileA | Insert a .mid file from disk onto a track at a position. Write the MIDI yourself, then insert. Never overwrites existing items unless replace_existing_in_range is true. Use this when a .mid file already exists; to build MIDI from a list of notes use insert_midi_events, for humanized drums insert_groove, for guitar or bass insert_riff. |
| delete_items_in_rangeA | Delete media items in a time range on one track (or all_tracks). Destructive — confirm intent; undo-block wrapped; supports dry_run. |
| get_mix_snapshotA | Read a bounded page of tracks, master, GUIDs, routing, FX, optional parameter values and instantaneous peak meters in one hop. Use measure for integrated audio evidence. |
| batchA | Run several bridge commands as ONE undo block and one round-trip. commands: [{type, payload}]. Use for multi-step edits (e.g. several set_fx_param calls) so a failure stops cleanly and one Ctrl+Z reverts everything. Nested batches are refused. Returns {results: [per-command result], all_ok, failed_index, completed, total, stopped, rolled_back}. With stop_on_error (default) a failure stops the batch and the call errors with the failing command's code and index, unless return_partial_results is true, which returns the object above with stopped=true instead. Commands already run are NOT rolled back; undo the block. |
| capture_track_audioA | Render a track capture to WAV and return its evidence scope. Only isolated_track with isolation_verified=true is per-track audio; item-based tracks can report a full_mix fallback. Gated: needs allow_audio_writes=true (or the legacy allow_risk_level_3 fallback) in bridge/bridge_config.json (python3 setup/install.py --allow-audio-writes writes it; capture does NOT need save_project or preference rights) AND the change applied by the reload_bridge command, or a REAPER relaunch — the flag is read once per bridge load. Synchronous — blocks the bridge for the render duration. |
| profile_trackA | Daemon Beater: profile a guitar stem bar by bar to plan drums — onset density, IOI regularity, decay ratio (palm-mute vs ringing), silence, low/bright balance, RMS/crest, a 16th accent grid, plus suggested section boundaries and repeated-section groups (A/B/A). READS THE SAVED .rpp FILE ON DISK, NOT REAPER's live project: unsaved edits are invisible, so on a dirty project this analyzes stale material. The result repeats that caveat — relay it, never present these numbers as the current session. Numbers, not verdicts: YOU propose the section labels and the user corrects them. Point it at the DI track, not the amped stem (distortion flattens the decay contrast) and say which you used. Slow (up to 600 s on a long stem) — window it with bars / start_bar / max_seconds. |
| riff_gridA | Step 1 of the drum workflow: read a guitar stem's transients into a proposed KICK GRID, printed at 100/50/30% attack strength. READS THE SAVED .rpp FILE ON DISK, NOT REAPER's live project — same stale-material caveat as profile_track, and the result carries it. This is a PROPOSAL the user corrects, not an auto-beat: transients say WHEN a note is picked, never whether it rings open or is palm-muted, so the percentile is an attack-strength heuristic. The 30% row is the sparse slam/breakdown feel (the default); the 100% row turns every pick attack into a kick (gallops/triplets). The grid is anchored to item time 0, so a stem whose downbeat sits a step off reads a 16th early — check the first render. Transcribe the row the user picks into a DSL, then insert_groove. |
| insert_grooveA | Render a drum DSL to MIDI and insert it on a track in ONE call — the engine (skills/drum-apparatus/) humanizes velocity, fatigue and timing at placement. Give the DSL EITHER inline as dsl_text OR as a file with dsl_path, never both. MUTATES the project (undo-block wrapped, one Ctrl/Cmd+Z reverts); supports dry_run. Refuses in ~0 s when the bridge heartbeat is dead, before generating anything. The rendered .mid is KEPT under rendered-midi/ — REAPER imports MIDI by reference on this build, so a deleted render leaves an empty take. Kit map: the DSL's own @map wins, then this map argument, then drum-config.json, then GM Standard. Track: named track, else drum-config.json's default, else REAPER's selected track. A bad DSL comes back as DSL_ERROR with the engine's own message — fix the DSL from it. |
| insert_riffA | Render ONE humanized guitar or bass part and insert it on a track (skills/guitar-apparatus/). Write the riff as bars_text — one 16-step bar per line, e.g. 'x.x.x.x.x.x.x.x.' — or point at a file with bars_file, never both; omit both to use the built-in 'demo' riff. Step alphabet: '.' rest, 'x' muted chug, 'X' accented root, 'o' let-ring root, 'g' ghost, '_' tie the previous note through this step, '~' slide into the next; UPPERCASE note names (E F G A B C D) are power chords in the key of E and lowercase are single notes, so case matters. Read skills/guitar-apparatus/SKILL.md for the full table before writing anything beyond chugs. Double tracking is two performances, not a copy: call this twice with DIFFERENT seeds for the left and right guitar. MUTATES the project (undo-block wrapped, one Ctrl/Cmd+Z reverts). Refuses in ~0 s when the bridge heartbeat is dead. The rendered .mid is kept under rendered-midi/, including on a dry run, because REAPER holds it by reference. |
| cut_bandA | Lay down or re-cut a whole four-track jam in ONE call: two double-tracked guitars, a bass locked to them, and drums. The two guitars get different seeds automatically, so the width is two performances rather than a stereo copy. By default it REPLACES what is on those four tracks from |
| humanize_takeA | Put a dynamic contour and micro-timing into a drum take that is ALREADY on a track — the take is read, planned, and written back in place through index-addressed note edits, so stacked hits (flams, double triggers) are humanized too. The contour is always applied; |
| verify_changeA | Run ONE mutating bridge command with MEASURED proof: capture the track, apply the command, capture the same frozen window again (track pinned by GUID), and report audio deltas (LUFS-I always; spectrum/peak/stereo with Post Mortem). This REALLY mutates the project (undo-block wrapped; one Ctrl/Cmd+Z reverts) — confirm intent first for destructive command types (delete_track, delete_items_in_range, remove_fx). Costs TWO renders; each blocks REAPER's UI for the capture duration. Statuses: VERIFIED (deltas are real measurements); REFUSED (refused before the mutation was sent, no mutation ran); UNVERIFIED (the project MAY have changed: applied, partial batch, rejected by the bridge with a possible mid-edit partial change, or unknown outcome; not measured either way; NOT rolled back; do NOT retry blindly). Relay the status honestly; never present UNVERIFIED as success. Needs allow_audio_writes (see capture_track_audio). |
| tune_paramA | Outcome-driven parameter search: iteratively set ONE FX parameter and re-measure until a target audio outcome is hit (e.g. bass LUFS-I down 3 dB), then report the measured result. Target: {"metric": "lufs_i"|"band_db", "delta": -3.0, "tolerance": 0.5, "band_hz": [lo,hi] for band_db (needs Post Mortem)}. delta is relative to the baseline measurement. ASSUMES the metric moves monotonically with the parameter (gain-like params); stops with NON_MONOTONE and restores the initial value when that is violated. EXPENSIVE: baseline + up to 5 iterations, each a render that blocks REAPER's UI — warn the user before calling. Each set is one undo point. On UNCONVERGED/UNREACHABLE the best-observed value stays applied and the result says so honestly; |
| analyze_trackA | Post Mortem (the separate post-mortem audio-analysis CLI that renders a track and measures it): capture one verified-isolated track and return MEASURED mix data (FX chain with values, routing, LUFS, true peak, crest, 1/3-octave spectrum, stereo image, silence fraction) for YOU to diagnose. Requires Post Mortem installed and capture enabled (see capture_track_audio gating). Full-mix fallbacks are refused. Park the edit cursor where the track is playing first. |
| compare_tracksA | Post Mortem cross-track masking: capture 2+ verified-isolated tracks and return their spectra plus a contested-band masking table for YOU to diagnose. Full-mix fallbacks are refused. Same requirements as analyze_track. Use analyze_track for one track's own mix problems; use this when two parts fight for the same frequencies. |
| complete_postmortem_onboardingA | After analyze_track, send the exact diagnosis you wrote to the Post Mortem panel. Requires a fresh matching 10-second single-track handoff; comparisons cannot complete first-run onboarding. |
| raw_commandA | Escape hatch: send any bridge command by type + payload (full reference: bridge/command_schema.md). Use when no dedicated tool covers it. |
| link_fx_midi_ccB | Map MIDI CC to a scanned FX parameter and verify native parameter-link readback. |
| get_midi_inputsA | Read-only: list the MIDI input devices REAPER can see. Takes no arguments. Returns {inputs: [{index, name, available, configurable}], all_devices: 63, virtual_keyboard: 62}. Call this before configure_midi_input to find a device index; configurable is false for indices above 63, which configure_midi_input cannot set. |
| configure_midi_inputA | Set one track's record input to a MIDI device and channel, optionally record-arm it and turn input monitoring on or off, then read the values back. Omitted arm/monitor are left unchanged; the record input is always set (device 63, channel 0 when omitted). Returns {track_guid, input, armed, monitoring}, where input is REAPER's I_RECINPUT code (4096 + device*32 + channel). Errors: NO_MIDI_INPUT (device index not present), BAD_PAYLOAD (value out of range), VERIFY_FAILED (REAPER did not keep the setting), NO_TARGET_TRACK / AMBIGUOUS_TARGET_TRACK. Undoable. Use get_midi_inputs first to find the device index. |
| insert_midi_eventsA | Create a new MIDI item on one track from a list of raw events (notes, CC, pitch bend, program change), with no humanizing. Use this for exact, hand-specified MIDI; use insert_midi_file when a .mid already exists, insert_groove for humanized drums, insert_riff for humanized guitar or bass, cut_band for a whole four-track jam. Event times are seconds from the item start. For drums, keep the golden rule yourself: no drum hits the same velocity twice in a row. Returns {track_guid, notes, controls, start_seconds, length_seconds}. Errors: BAD_PAYLOAD (an event is out of range; nothing is written), INSERT_FAILED / VERIFY_FAILED (the new item is deleted again). Undoable. |
| save_project_asA | Save to a NEW absolute .rpp path, or export explicitly named tracks as a media-free .RTrackTemplate. Existing files are refused. Requires project save gate. |
| get_fx_presetA | Read-only: report which REAPER host preset is loaded on one FX. Pick the track with one track selector and the FX with one FX selector (fx_guid, else fx_index + fx_scope, else fx_name_contains). Returns {name, valid, index, count, scope}; valid is false when the plugin reports no named preset. Only sees REAPER host presets, not a plugin's own preset browser. Errors: NO_FX / AMBIGUOUS_FX / AMBIGUOUS_SCOPE / NO_FX_SELECTOR, NO_TARGET_TRACK / AMBIGUOUS_TARGET_TRACK. Use set_fx_preset to change it. |
| set_fx_presetA | Load an exact REAPER host preset name and verify readback. Proprietary preset files may require plugin UI; saved chains use add_fx_chain. |
| instrument_inventoryC | Discover plugin cache entries and local preset files. Results do not prove plugins load or samples are available. |
| insert_performance_auditionB | Insert a repeatable 15-second melodic test of expression, modulation, sustain and octave range. Use a separate audition project. Render with capture_track_audio and audition; MIDI success does not prove controller response. |
| transcribe_drumsA | Start local audio-to-drum-MIDI analysis in a background worker. Uses one selected audio item or a named source track/item. Returns a job_id; poll get_drum_transcription, then use insert_drum_transcription. Needs the optional transcription environment and ffmpeg. May download model weights on first use; audio stays local. Does not change the project. Tom and cymbal articulations are estimates. |
| get_drum_transcriptionA | Read a drum transcription job's progress, failure, output files and insertion receipt. A completed analysis has not inserted anything into REAPER. |
| insert_drum_transcriptionA | Map a completed transcription to a drum kit and insert verified notes into REAPER. Requires the original source item and an empty destination range. Refuses source changes, duplicate jobs and active transport. Auto-discovers note names or accepts a catalog map_name. dry_run validates without writing. Keeps original audio, track mute state and project tempo unchanged. One undo reverts insertion. |
| drum_workshopA | Prepare separate composition requests, compare authored drum DSL candidates, export MIDI, or record explicit user audition feedback. Local files only; never changes REAPER. Fresh and wildcard requests omit reference patterns. The calling agent writes candidate.dsl and intent.json before evaluate. Comparisons measure structural similarity, not musical quality. No model is invoked and no winner is selected. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 44 tools
The tools cover distinct operations, but the sheer number (44) and overlapping verbs (get_, insert_, capture_) create ambiguity. For example, get_context, get_mix_snapshot, and get_status all provide different 'snapshots,' and several analysis tools (analyze_track, compare_tracks, profile_track) require careful reading of descriptions to distinguish. Descriptions are detailed and often clarify, but the risk of misselection is elevated.
Naming is inconsistent: most tools follow a verb_noun pattern (e.g., insert_riff, set_fx_param, get_midi_inputs), but several are bare nouns (transport, track, fx, markers, batch) that function as grouped commands. Additionally, there is variation like 'riff_grid' (noun_verb) and 'insert_groove' (verb) that breaks the expected pattern. While readable, the mixed conventions reduce predictability.
44 tools is far above the typical 3-15 range and even exceeds the 25+ threshold for 'too many.' While the domain is complex, the count suggests a lack of consolidation (e.g., separate tools for each FX parameter operation, multiple insertion methods). The server would benefit from grouping related functions or reducing granularity.
The tool surface covers a broad range of DAW operations: project context, mixing, FX, automation, MIDI insertion, audio capture, analysis, and more. It includes CRUD-like operations for tracks, FX, and markers, plus specialized tools for guitar/drum workflows. Minor gaps exist (e.g., no general MIDI editing tool, no explicit project load), but these are workable around given the existing tools.