reaper-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REAPER_HOST | No | HTTP bridge host | localhost |
| REAPER_PORT | No | HTTP bridge port | 9000 |
| REAPER_COMM_MODE | No | Communication mode (`file` or `http`) | file |
| REAPER_BRIDGE_DIR | No | File bridge directory | %APPDATA%\REAPER\Scripts\mcp_bridge_data |
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 | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_track_countA | Get the total number of tracks in the current REAPER project (excluding master track). |
| get_trackB | Get information about a track. Returns: Object with 'info': guid, name, volume, volume_db, pan, muted, soloed, has_midi, has_audio, fx_names, role. |
| get_all_tracksB | Get information about all tracks in the project. |
| get_master_trackC | Get information about the master track. |
| insert_trackA | Insert a new track at the specified index. Args: index: Position to insert track (0-based). If not specified, adds at end. name: Optional name for the new track. Returns: Info about the created track. |
| delete_trackB | Delete a track. Args: track_index: Track index to delete (0-based). Cannot delete master track (-1). |
| set_track_nameC | Set the name of a track. Args: name: New name for the track. |
| set_track_volumeB | Set the volume of a track in decibels. Args: volume_db: Volume in dB (0 = unity gain, -inf to +12 typical range). |
| set_track_panC | Set the pan position of a track. Args: pan: Pan position from -1.0 (full left) to 1.0 (full right). 0 = center. |
| set_track_muteC | Set the mute state of a track. Args: mute: True to mute, False to unmute. |
| set_track_soloC | Set the solo state of a track. Args: solo: True to solo, False to unsolo. |
| track_fx_get_countB | Get the number of FX plugins on a track. Returns: Object with 'ret' field containing count. |
| track_fx_get_listA | Get list of all FX plugins on a track. Returns: Object with 'fx' array, one entry per FX with index, name, enabled and offline, plus fx_count. 'enabled' is False when the FX is bypassed. Normal FX chain only, not input/record FX or master monitoring FX. |
| track_fx_add_by_nameA | Add an FX plugin to a track by name. Args: fx_name: Name of the FX plugin to add (e.g., "ReaEQ", "ReaComp", "ReaLimit"). Use the exact plugin name as it appears in REAPER's FX browser. position: Optional insertion position (0-based) in the FX chain. Default -1 adds at the end; 0 inserts at the beginning. Returns: Info about the added FX including its index. |
| track_fx_moveB | Move an FX plugin to a new position within the same track's FX chain. Args: fx_index: Current FX index (0-based) in the FX chain. new_position: Target position (0-based). 0 = beginning of the chain. |
| track_fx_deleteC | Remove an FX plugin from a track. |
| track_fx_get_nameC | Get the name of an FX plugin. |
| track_fx_get_enabledC | Get the enabled state of an FX plugin. Returns: Object with 'ret' field (boolean). |
| track_fx_set_enabledC | Enable or disable an FX plugin. Args: enabled: True to enable, False to bypass. |
| track_fx_get_num_paramsC | Get the number of parameters for an FX plugin. |
| track_fx_get_param_nameC | Get the name of an FX parameter. |
| track_fx_get_paramB | Get a specific parameter value of an FX plugin. Returns: Object with value, min, max for the parameter. |
| track_fx_set_paramC | Set a parameter value on an FX plugin. Args: value: New value for the parameter (typically normalized 0-1, check min/max). |
| take_fx_get_countB | Get the number of FX plugins on a take. Returns: Object with 'ret' field containing the FX count. |
| take_fx_get_listB | Get a list of all FX plugins on a take. Returns: Object with 'fx' array, each entry having index, name, and enabled state. |
| take_fx_add_by_nameB | Add an FX plugin to a take by name. Args: fx_name: Name of the FX plugin to add (e.g., "ReaEQ", "ReaComp"). Use the exact plugin name as it appears in REAPER's FX browser. Returns: Object with 'ret' field containing the new FX index (or -1 if it could not be added). |
| take_fx_deleteC | Remove an FX plugin from a take. Args: |
| take_fx_get_nameC | Get the name of an FX plugin on a take. Args: |
| take_fx_get_enabledB | Get the enabled (not bypassed) state of an FX plugin on a take. Args: Returns: Object with 'ret' field (boolean). |
| take_fx_set_enabledC | Enable or bypass an FX plugin on a take. Args: enabled: True to enable, False to bypass. |
| take_fx_get_num_paramsC | Get the number of parameters for an FX plugin on a take. Args: |
| take_fx_get_param_nameC | Get the name of a parameter on a take's FX plugin. Args: |
| take_fx_get_paramC | Get a parameter value on a take's FX plugin. Args: Returns: Object with 'value', 'min', and 'max' for the parameter. |
| take_fx_set_paramB | Set a parameter value on a take's FX plugin. Args: value: New value (typically normalized 0-1; check min/max via take_fx_get_param). |
| get_takesB | List all takes of a media item. Returns: Object with 'takes' array (each entry: index, name, is_active) and 'ret' = take count. |
| get_active_takeA | Get the index of the active take of a media item. Returns: Object with 'ret' = active take index (-1 if the item has no active take). |
| set_active_takeC | Set the active take of a media item (which take plays). Args: |
| explode_takesC | Explode all takes of a media item in place (each take becomes its own overlapping item). |
| crop_to_active_takeB | Crop a media item to its active take, discarding all other takes. |
| delete_takeB | Delete a specific take from a media item. Args: take_index: Take index to delete (0-based). The take is activated first, then removed. |
| select_comp_laneA | Make a fixed lane play exclusively on a track (REAPER 7 lane-based comping). The track must be in fixed-lane mode (right-click track -> Track lanes). Returns a clear error if it is not, or if the lane index is out of range. Args: lane_index: Fixed lane index to play exclusively (0-based). |
| create_sendB | Create a send from one track to another. Args: src_track: Source track index (0-based). dest_track: Destination track index (0-based). Returns: Object with send_index. |
| delete_sendA | Delete a send from a track. Args: track_index: Source track index (0-based). send_index: Send index (0-based) to delete. |
| set_send_volumeC | Set the volume of a track send. Args: track_index: Source track index (0-based). volume_db: Send volume in dB. |
| get_track_num_sendsC | Get the number of sends from a track. |
| set_send_dest_channelsB | Set the destination channels for a send (used for sidechain routing). Args: track_index: Source track index (0-based). dest_chan: Destination channel pair (0=1-2 main, 2=3-4 sidechain, 4=5-6, etc.). For sidechain compression, use 2 to route to channels 3-4. |
| set_send_source_channelsC | Set the source channels for a send. Args: track_index: Source track index (0-based). src_chan: Source channel (-1=none, 0=stereo 1-2, 1024+n=mono from channel n). |
| setup_sidechain_sendA | Create a sidechain send from one track to another track's FX sidechain input. This creates a send routed to channels 3-4 of the destination track, which is the standard sidechain input for compressors like ReaComp. Args: src_track: Source/trigger track index (e.g., kick drum). dest_track: Destination track index (e.g., bass with compressor). volume_db: Send volume in dB (default 0dB = unity). Returns: Object with send_index and routing info. |
| configure_reacomp_sidechainB | Configure ReaComp to use sidechain input for detection. Args: track_index: Track index (0-based) where ReaComp is located. fx_index: FX index (0-based) of ReaComp in the FX chain. use_sidechain: True to use auxiliary input (channels 3-4), False for main input. Returns: Object with configuration status. |
| setup_sidechain_compressionA | Complete sidechain compression setup: creates send and configures compressor. This is the all-in-one function for setting up sidechain compression. It creates a send from the trigger track to the target track's sidechain input and configures ReaComp to listen to that sidechain. Args: trigger_track: Track that triggers compression (e.g., kick drum = track 0). target_track: Track to be compressed (e.g., bass = track 1). compressor_fx_index: Index of ReaComp in target track's FX chain. send_volume_db: Sidechain send volume in dB (default 0dB). Returns: Object with complete setup info. Example: For kick-triggered bass compression where: - Drums are on track 0 - Bass is on track 1 with ReaComp at FX index 2 Call: setup_sidechain_compression(0, 1, 2) |
| playA | Start playback in REAPER. |
| stopA | Stop playback in REAPER. |
| get_play_stateC | Get the current playback state. Returns: Object with play state info. |
| get_cursor_positionA | Get the edit cursor position. Returns: Object with cursor position in seconds. |
| set_cursor_positionB | Set the edit cursor position. Args: position: Position in seconds from project start. |
| save_projectB | Save the current REAPER project. |
| get_project_pathC | Get the project path. |
| get_project_nameC | Get the project name. |
| get_tempoB | Get the project tempo. |
| get_time_signatureB | Get the project time signature. |
| add_mastering_chainA | Add a standard mastering chain to the master track. Adds the following plugins in order:
Returns: Object with list of added FX indices. |
| add_parallel_compressionA | Set up New York style parallel compression for a track. Creates a new bus track with heavy compression, fed by a send from the source track. Args: track_index: Source track index (0-based). blend_db: Send level in dB for the compressed signal (default -6dB). Returns: Object with bus_track_index, send_index, and compressor_fx_index. |
| create_busB | Create a submix/stem bus and route specified tracks to it. Args: name: Name for the bus track. source_track_indices: List of track indices to route to this bus. Returns: Object with bus_track_index and routing info. |
| add_eqC | Add ReaEQ to a track. Returns: Object with fx_index. |
| add_compressorC | Add ReaComp to a track. Returns: Object with fx_index. |
| add_limiterC | Add ReaLimit (brickwall limiter) to a track. Returns: Object with fx_index. |
| create_midi_itemC | Create an empty MIDI item on a track. Args: position: Start position in seconds. length: Length in seconds. Returns: Object with item info including the new item_index. |
| get_midi_itemB | Get information about a MIDI item. Returns: Object with item info including position, length, note count. |
| add_midi_noteB | Add a MIDI note to an item using musical timing (beats). Args: pitch: MIDI note number (0-127, 60 = middle C). velocity: Note velocity (1-127). start_beat: Start position in beats from the item start (0 = first beat). length_beats: Note length in beats (0.25 = sixteenth, 0.5 = eighth, 1.0 = quarter). Example: Four-on-the-floor kick: add_midi_note(0, 0, 36, 110, start_beat=0, length_beats=0.25) then start_beat=1, 2, 3. |
| add_midi_notes_batchB | Add multiple MIDI notes to an item in one call, using musical timing (beats). Args: notes: List of note dicts with keys: pitch, velocity, start_beat, length_beats, channel (optional). Returns: Object with count of notes added. |
| get_midi_notesC | Get all MIDI notes from an item. Returns: Object with list of notes. |
| delete_midi_noteC | Delete a MIDI note from an item. |
| clear_midi_itemC | Delete all MIDI notes from an item. Returns: Object with count of notes deleted. |
| set_midi_note_velocityC | Set the velocity of a MIDI note. Args: velocity: New velocity (1-127). |
| transpose_midi_notesC | Transpose MIDI notes by a number of semitones (12 = an octave). A note that would land outside pitch 0-127 keeps its original pitch and is counted in
Args: semitones: Signed shift; positive is up, negative is down. 0 = no-op. Returns:
{ok, notes_changed, clamped, skipped, out_of_bounds, notes:[...]}, where |
| nudge_midi_notesB | Shift MIDI notes in time by a number of beats (+ = later, - = earlier). Start and end move together, so note lengths are preserved. A note pushed before the
item start clamps to it and one pushed past the item end is left there; both count in
Args: amount_beats: Signed beat shift (0.25 = a 16th later, -1.0 = a beat earlier). 0 = no-op. |
| get_selected_midi_notesA | Read the MIDI notes currently SELECTED in REAPER's editor for the active take. The escape hatch for "operate on what I've selected": select notes by hand in REAPER, call this to see which they are, then translate that into an explicit value filter (pitch range / beat window / channel) for the transform tools. Read-only, no undo. Returns:
{ok, notes:[...], ret} - the selected notes, same shape as get_midi_notes (each note
carries item-relative start_beat/end_beat). |
| set_midi_noteA | Edit one existing MIDI note in place: pitch, start, length and/or channel. Only the fields you pass change, and at least one is required. (Velocity: set_midi_note_velocity.) note_index is REAPER's PPQ-sorted index from get_midi_notes / get_selected_midi_notes and is unstable - re-read after the edit, since the returned list reflects the new order. Args: pitch: New pitch (0-127). start_beat: New start in beats from item start; length is preserved. A start before the item start clamps there and is counted in out_of_bounds, not clamped. length_beats: New length in beats (> 0), resized from the current start. channel: New MIDI channel (0-15). Returns: {ok, notes_changed, clamped, skipped, out_of_bounds, notes:[...]}, or {ok:false, error} for a bad index, an empty edit, or an out-of-range value (nothing is written). |
| ramp_midi_note_velocitiesC | Apply a linear velocity ramp (crescendo / decrescendo) across MIDI notes. Velocities interpolate by onset: the earliest note in the filtered set gets start_velocity, the latest gets end_velocity, everything between is linear. Notes sharing an onset (a chord) get the same velocity. Results clamp to 1-127. Args: start_velocity: Velocity at the earliest onset (1-127; out of range clamps, not an error). end_velocity: Velocity at the latest onset (1-127). |
| scale_midi_note_velocitiesA | Scale MIDI note velocities: multiply, set to a fixed value, or compress toward a pivot. Results clamp to 1-127. Args:
mode: "multiply" (velocity * ratio), "set" (velocity becomes Returns: {ok, notes_changed, clamped, skipped, out_of_bounds, pivot_used, notes:[...]}. |
| strum_midi_notesB | Strum chords: stagger the onsets of simultaneous notes so each chord rolls out. Only onsets move; note lengths are preserved. Args: spread_beats: Total first-to-last onset span within each chord (>= 0; 0 = no-op). direction: "up" strikes the lowest note of a chord first, "down" the highest. chord_window_beats: Onset tolerance for grouping notes into one chord (0 = exact same onset). |
| snap_midi_notes_to_scaleA | Snap off-key MIDI notes onto a scale (fix a wrong note, force a part into a key). Notes already in the scale are left alone; each off-scale note moves to the nearest
in-scale pitch, and under Args: root: Root pitch class, 0-11 (0=C, 1=C#, 2=D ... 11=B). mode: Scale name: major, minor, harmonic_minor, melodic_minor, dorian, phrygian, lydian, mixolydian, locrian, major_pentatonic, minor_pentatonic, blues, whole_tone, chromatic (aliases: ionian, aeolian, natural_minor). Or a custom list of semitone intervals from the root, each 0-11 (e.g. [0,2,4,7,9]). direction: "nearest" (closest scale tone), "up" or "down" (that way only, skipping a note rather than falling back to the other direction). Returns:
{ok, notes_changed, clamped, skipped, out_of_bounds, notes:[...]}; |
| quantize_midi_notesA | Quantize MIDI note onsets onto the grid (tighten sloppy timing, add swing). Onsets snap to the PROJECT bar/beat grid, not to an offset from the item's own start,
and note lengths are preserved: start and end move together. Notes that land past the
item end are kept, and one that would land before the item start is placed at it; both
are counted in Args: grid: Grid spacing in beats: 0.25 = 1/16, 0.5 = 1/8, 1.0 = 1/4. Must be > 0. strength: 0.0-1.0. 1.0 snaps exactly onto the grid, 0.5 moves each note halfway there, 0.0 is a no-op. swing: 0.0-1.0. 0.0 = straight, 1.0 = full triplet feel (off-beats at 66.7%), scaling linearly between. Only the off-beat (odd) grid cells are delayed. |
| stretch_midi_notesA | Stretch or compress MIDI timing (half-time, double-time, or any ratio). Each targeted note scales as a rigid unit about one fixed pivot: its distance from the
pivot and its own length both multiply by Args: factor: Time scale ratio, must be > 0. 2.0 = twice as long (half-time), 0.5 = half as long (double-time). pivot_beat: The fixed point, in beats from the item start; may be negative. None = the earliest targeted onset. |
| legato_midi_notesA | Close the gaps in a MIDI line (legato), or set every note to one length. Only note ends move; starts are never touched. "connect" extends each note's end to the next onset and never shortens anything; a gap wider than max_gap_beats is left as a rest and counted in gaps_preserved, and the last note is left alone. "fixed" instead sets every targeted note's length to length_beats. Notes whose new end passes the item end are kept and reported in out_of_bounds. Args: mode: "connect" (extend each end to the next onset) or "fixed" (set every length). voice: connect only. "chordal" extends to the next onset of any note, so a chord's notes move together; "per_pitch" extends to the next note of the SAME pitch and channel, keeping interleaved voices independent. max_gap_beats: connect only. Gaps wider than this are left as rests (>= 0). length_beats: fixed only. The length every targeted note is set to (> 0). Returns: {ok, notes_changed, clamped, skipped, out_of_bounds, gaps_preserved, notes:[...]}. |
| humanize_midi_notesA | Humanize MIDI: nudge timing and velocity by small random amounts, reproducibly. Each note gets its own timing and velocity offset drawn from a bell curve. Note lengths are preserved (start and end move together) and pitches are never touched. The randomness is seeded, so the same take with the same seed and settings gives identical results every time. Velocities are clamped to 1-127 and counted in clamped; notes pushed past the item end are kept and reported in out_of_bounds. Unlike the other timing tools, a note pushed before the item start is placed at the item start and counted in out_of_bounds, not clamped; clamped here counts only the velocity clamp. Args: timing: Timing spread in beats (standard deviation); 0.02 is a subtle human feel, 0.0 leaves timing alone. velocity: Velocity spread (standard deviation, in velocity units); 0.0 leaves velocity alone. seed: Any integer. The same seed, settings and take give the same result. max_sigma: Cap on how far one note may stray, in multiples of the spread. |
| remove_overlapping_midi_notesA | Clean up overlapping MIDI notes (same pitch stacked on itself). Two notes conflict only if they share a pitch AND a channel AND overlap in time, so a chord is never a conflict and notes that merely touch are left alone. "trim" shortens the earlier note to stop where the next begins, losing nothing; "delete" drops one note of each overlapping pair, keeping the louder (ties go to the longer note). Either mode can remove notes: notes stacked on the exact same onset collapse to the loudest, since there is nothing to trim between them, and a trim left shorter than min_length_beats is removed rather than left as a click. Args: mode: "trim" (shorten the earlier note) or "delete" (drop the quieter note). min_length_beats: A trimmed note left shorter than this is removed instead. Default 1/128 of a beat; 0 disables it. pitch_low, pitch_high: Notes outside the filter are invisible: never touched, and never counted as an overlap partner. Returns: {ok, mode, notes_changed, clamped, skipped, out_of_bounds, notes_removed, trimmed, deduped, deleted, notes:[...]} where notes_removed = deduped + deleted. |
| insert_audio_fileC | Insert an audio file onto a track. Args: file_path: Full path to the audio file. position: Position in seconds. Returns: Object with track_index, item_index of the created item, and position. |
| get_track_itemsC | Get all media items on a track. Returns: Object with list of items. |
| get_item_infoC | Get information about a media item. Returns: Object with item properties (position, length, take info, etc.). |
| set_item_positionC | Set the position of a media item. Args: position: New position in seconds. |
| set_item_lengthC | Set the length of a media item. Args: length: New length in seconds. |
| delete_itemC | Delete a media item. |
| duplicate_itemC | Duplicate a media item. Returns: Object with new item info. |
| split_itemC | Split a media item at a position. Args: position: Split position in seconds (absolute project time). Returns: Object with info about both resulting items. |
| set_item_muteC | Mute or unmute a media item. Args: mute: True to mute, False to unmute. |
| set_item_volumeC | Set the volume of a media item. Args: volume_db: Volume in dB. |
| set_item_fade_inC | Set the fade-in length of a media item. Args: length: Fade-in length in seconds. |
| set_item_fade_outC | Set the fade-out length of a media item. Args: length: Fade-out length in seconds. |
| set_tempoB | Set the project tempo. Args: bpm: Tempo in beats per minute. |
| set_time_signatureB | Set the project time signature. Args: numerator: Beats per measure (e.g., 4 for 4/4). denominator: Beat unit (e.g., 4 for quarter note). |
| create_projectA | Create a new REAPER project. Note: REAPER has no API to name a project that has never been saved, so this server
has no way to name one either. The removed |
| open_projectB | Open a REAPER project file. Args: path: Full path to the .rpp file. |
| render_projectA | Render the project's master mix to an audio file (uses REAPER's last render settings for format details; a .wav extension selects WAV output). If the target file already exists, this returns an error unless overwrite=True (which deletes the existing file first). This is explicit because REAPER's own behavior on existing files (prompt vs auto-increment) is a user preference, and the overwrite prompt blocks unattended rendering. Args: output_path: Full path for output file (extension determines format). start_time: Start time in seconds (None = project start). end_time: End time in seconds (None = project end). tail_seconds: Extra seconds to render at end for reverb tails. overwrite: True to replace an existing file at output_path. Returns: Object with render status and REAPER's computed output target(s). |
| render_regionA | NOT IMPLEMENTED. Use render_project with the region's start/end from get_regions. Args: output_path: Full path for output file. |
| add_markerB | Add a marker at a position. Args: position: Position in seconds. name: Marker name. color: Marker color (0 = default). Returns: Object with marker index. |
| add_regionB | Add a region. Args: start: Start position in seconds. end: End position in seconds. name: Region name. color: Region color (0 = default). Returns: Object with region index. |
| get_markersB | Get all markers in the project. Returns: Object with list of markers (position, name, index). |
| get_regionsB | Get all regions in the project. Returns: Object with list of regions (start, end, name, index). |
| delete_markerC | Delete a marker by index. |
| delete_regionC | Delete a region by index. |
| go_to_markerC | Move the edit cursor to a marker. |
| go_to_regionB | Move the edit cursor to a region start. |
| get_track_envelopeC | Get a track envelope by name. Args: envelope_name: Envelope name (e.g., "Volume", "Pan", "Mute"). Returns: Object with envelope info. |
| get_envelope_point_countC | Get the number of points in an envelope. Args: envelope_name: Envelope name. Returns: Object with point count. |
| add_envelope_pointB | Add a point to an envelope. Args: envelope_name: Envelope name. time: Time position in seconds. value: Envelope value (0.0-1.0 for most envelopes). shape: Point shape (0=linear, 1=square, 2=slow start/end, 3=fast start, 4=fast end, 5=bezier). Returns: Object with point index. |
| get_envelope_pointsC | Get all points from an envelope. Args: envelope_name: Envelope name. Returns: Object with list of points (time, value, shape). |
| delete_envelope_pointC | Delete an envelope point. Args: envelope_name: Envelope name. |
| clear_envelopeC | Delete all points from an envelope. Args: envelope_name: Envelope name. |
| set_track_automation_modeC | Set the automation mode for a track. Args: mode: 0=trim/read, 1=read, 2=touch, 3=write, 4=latch. |
| arm_track_envelopeC | Arm or disarm an envelope for recording. Args: envelope_name: Envelope name. arm: True to arm, False to disarm. |
| get_fx_envelopeB | Get or create an automation envelope for an FX parameter. This enables automation of any FX parameter (e.g., a flanger knob in Guitar Rig). The envelope is created if it doesn't exist. Args: param_index: Parameter index (0-based). Use track_fx_get_num_params() to find available parameters. Returns: Object with envelope_name, param_name, point_count, and indices. |
| add_fx_envelope_pointC | Add an automation point to an FX parameter envelope. Args: time: Time position in seconds. value: Parameter value (typically 0.0-1.0, normalized). shape: Point shape (0=linear, 1=square, 2=slow start/end, 3=fast start, 4=fast end, 5=bezier). Returns: Object with point_index and confirmation. |
| get_fx_envelope_pointsC | Get all automation points from an FX parameter envelope. Returns: Object with list of points (time, value, shape, tension, selected). |
| delete_fx_envelope_pointC | Delete an automation point from an FX parameter envelope. Args: point_index: Point index (0-based) to delete. |
| clear_fx_envelopeB | Clear all automation points from an FX parameter envelope. Returns: Object with deleted_count. |
| undoB | Undo the last action in REAPER. Returns: Object with undo description. |
| redoB | Redo the last undone action in REAPER. Returns: Object with redo description. |
| get_undo_stateA | Get the current undo/redo state. Returns: Object with undo and redo descriptions. |
| select_trackC | Select a track. Args: exclusive: If True, deselect other tracks first. |
| select_all_tracksC | Select all tracks. |
| unselect_all_tracksC | Unselect all tracks. |
| get_selected_tracksB | Get indices of all selected tracks. Returns: Object with list of selected track indices. |
| select_all_itemsC | Select all media items. |
| unselect_all_itemsB | Unselect all media items. |
| get_selected_itemsB | Get all selected media items. Returns: Object with list of selected items. |
| copy_selected_itemsB | Copy selected items to clipboard. |
| cut_selected_itemsB | Cut selected items to clipboard. |
| paste_itemsA | Paste items from clipboard at edit cursor. |
| delete_selected_itemsB | Delete all selected items. |
| set_time_selectionC | Set the time selection. Args: start: Start time in seconds. end: End time in seconds. |
| get_time_selectionB | Get the current time selection. Returns: Object with start and end times. |
| clear_time_selectionC | Clear the time selection. |
| set_track_phaseC | Set the phase inversion of a track. Args: invert: True to invert phase, False for normal. |
| set_track_widthC | Set the stereo width of a track. Args: width: Width value (0=mono, 1=stereo, 2=200% width). |
| set_track_as_folderC | Set a track as a folder parent or child. Args: folder_depth: 0=normal, 1=folder parent, -1=end of folder. |
| arm_trackC | Arm or disarm a track for recording. Args: arm: True to arm, False to disarm. |
| set_track_inputB | Set the record input for a track. Args: input_index: Input index (-1=no input, 0+=hardware inputs, 4096+=virtual MIDI). |
| set_track_monitorB | Set the monitor mode for a track. Args: monitor: 0=off, 1=normal, 2=not when playing. |
| set_track_colorC | Set the color of a track. Args: r: Red component (0-255). g: Green component (0-255). b: Blue component (0-255). |
| get_track_peakB | Get the current peak level of a track. Args: channel: Channel (0=left, 1=right). Returns: Object with peak value in dB. |
| get_track_peak_holdA | Get the peak hold level of a track (highest peak since meters were last reset). Returns the max peak from a previous playback without needing to be actively playing - play the project, stop, then call this for gain staging. Args: channel: Channel (0=left, 1=right). Returns: Object with peak hold value in dB. |
| clear_all_peak_indicatorsA | Clear the peak hold indicators on all tracks (including master). Resets the held peak values that accumulate during playback. Use before a fresh playback pass when you want clean readings for gain staging. |
| get_track_master_sendA | Get the master/parent send state of a track. Returns: Object with 'ret' field (1 = enabled, 0 = disabled). |
| set_track_master_sendA | Enable or disable the master/parent send on a track. When enabled, the track's audio routes to its parent folder track (or the master if it has no parent). Disable it when a track should only output through its sends (e.g., routed exclusively to a bus). Args: enabled: True to enable, False to disable. |
| run_actionB | Run a REAPER action by command ID. Args: action_id: REAPER action/command ID number. |
| run_action_by_nameA | Run a REAPER action by its named command id. Named commands (e.g. ReaScripts "_RS12345" or SWS "SWS...") are resolved to a numeric command id via NamedCommandLookup before firing. A purely numeric string (e.g. "40297") is treated as a built-in command id and run directly; prefer run_action(action_id) for built-ins. Args: action_name: Named command id (e.g. "_RS12345") or a numeric command id string. Returns: If the named command cannot be resolved, returns {"ok": False, "error": ...} without firing any action. |
| get_fx_presetsB | Get list of presets available for an FX. Returns: Object with list of preset names. |
| get_fx_presetB | Get the current preset name of an FX. Returns: Object with current preset name. |
| set_fx_presetD | Set the preset of an FX. Args: preset_name: Preset name. |
| save_fx_presetC | Save the current FX settings as a preset. Args: preset_name: Name for the new preset. |
| get_eq_bandsB | Get all ReaEQ band settings in one structured call. Args: fx_index: FX index (0-based) of ReaEQ in the FX chain. Returns: Object with a 'bands' list. Each band has band_index, bandtype, bandtype_name, bandidx, paramtype, paramtype_name, normval, the REAPER-formatted value, and (for gain params) the computed gain_db. |
| set_eq_bandA | Set a ReaEQ band parameter. Pass real values by default: frequency in Hz (paramtype 0), gain in dB (paramtype 1), or Q (paramtype 2). Gain is converted to ReaEQ's normalized curve internally; freq and Q are sent raw. Args: fx_index: FX index (0-based) of ReaEQ. bandtype: -1=master gain, 0=hipass, 1=loshelf, 2=band, 3=notch, 4=hishelf, 5=lopass, 6=bandpass, 7=parallel bandpass. bandidx: Band index within that type (0=first). Ignored for master gain. paramtype: 0=frequency (Hz), 1=gain (dB), 2=Q. Ignored for master gain. value: The value, in real units unless is_normalized=True. is_normalized: If True, value is a raw 0-1 normalized value written directly. |
| get_eq_band_enabledA | Check whether a ReaEQ band is enabled. Args: fx_index: FX index (0-based) of ReaEQ. bandtype: Band type (0=hipass, 1=loshelf, 2=band, 3=notch, 4=hishelf, 5=lopass). bandidx: Band index within that type (0=first). Returns: Object with 'ret' boolean (true=enabled). |
| set_eq_band_enabledB | Enable or disable a ReaEQ band. Args: fx_index: FX index (0-based) of ReaEQ. bandtype: Band type (0=hipass, 1=loshelf, 2=band, 3=notch, 4=hishelf, 5=lopass). bandidx: Band index within that type (0=first). enabled: True to enable, False to disable. |
| find_eqB | Find ReaEQ on a track, optionally adding it if absent. Args: instantiate: If True and ReaEQ is not present, add it. Returns: Object with 'ret' = the FX index of ReaEQ, or -1 if not found. |
| get_track_fx_chunkB | Get the raw state chunk from an FX plugin (includes preset/state data). Useful for reading VSTi state data like Toontrack EZkeys chord progressions. The chunk contains the full serialized state of the plugin. Returns: Object with 'chunk' containing the FX state data string. |
| get_project_lengthB | Get the length of the project (end of last item). Returns: Object with project length in seconds. |
| get_project_summaryA | Get a comprehensive summary of the current REAPER project. Returns everything needed to understand the project state and give useful mixing/production advice in a single call. Returns: Object with: - project_name: Name of the project file - project_path: Full path to the project - tempo: Project tempo in BPM - time_signature: {numerator, denominator} - project_length: Length in seconds - track_count: Total number of tracks - tracks: List of track info objects, each containing: - index: Track index (0-based) - name: Track name - volume_db: Volume in decibels - pan: Pan position (-1 to 1) - mute: Boolean mute state - solo: Boolean solo state - fx_count: Number of FX plugins - fx_names: List of FX plugin names - master: Master track info {volume_db, fx_count, fx_names} - markers: List of {index, position, name} - regions: List of {index, start, end, name} |
| get_play_positionB | Get the current playback position. Returns: Object with play position in seconds. |
| recordB | Start recording in REAPER. |
| pauseB | Pause playback in REAPER. |
| toggle_repeatA | Toggle repeat/loop mode. Returns: Object with new repeat state. |
| get_repeat_stateA | Get the current repeat state. Returns: Object with repeat state (true/false). |
| zoom_to_selectionB | Zoom the arrange view to the time selection. |
| zoom_to_projectA | Zoom the arrange view to show the entire project. |
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 176 tools
Most tools target distinct actions/resources, but overlapping convenience wrappers (add_eq vs track_fx_add_by_name, setup_sidechain_send vs setup_sidechain_compression) and a dead render_region tool create confusion. With 176 tools, high misselection risk exists even though descriptions are detailed.
Almost all names use snake_case and a verb_noun/resource_verb pattern, with consistent families (track_fx_*, take_fx_*, midi_*). Minor deviations like get_track_num_sends vs track_fx_get_count and get_track_count keep it from perfect consistency.
176 tools is an extreme over-expansion for any MCP server; each tool may be useful but the set is far beyond a well-scoped 3-15 tool surface.
The surface covers tracks, items, MIDI, FX, sends, automation, envelopes, project lifecycle, markers/regions, and rendering extensively. However, render_region is explicitly unimplemented and project save-as/close operations are absent, leaving minor dead ends.