reaper-mcp
One-line summary: reaper-mcp is an MCP server that lets an agent inspect and fully edit a running REAPER project over a Lua bridge — tracks, MIDI, FX, sends, items, automation, rendering and arbitrary ReaScript.
Inspect the session with
status: tempo, play state, cursor, tracks/selection, time selection, selected items, solo/mute/dirty, plus optional arrangement facts (time signature, tempo map, length, markers, MIDI vs audio).Control transport: play, stop, pause, record, toggle repeat, jump to start or to a beat/marker/region.
Manage tracks: list, add, delete, rename, set volume/pan/mute/solo, and build submix buses that reroute sources.
Edit MIDI: create items, add/replace/update/delete notes, and insert CC, program changes and pitch bend.
Work with FX: list, add, delete, bypass, reorder, load presets, inspect parameters (with name filter) and set values either normalized or as displayed (
formatted).Route sends: add/update/delete sends with volume, pan, mute, pre/post-fader/pre-FX mode, and channel-pair routing for sidechains.
Arrange media items: list, import from host paths, split, delete, duplicate, move, trim edges, fades and shapes, take selection.
Automate envelopes: list, read and write points (whole or by beat range), in gain or dB.
Edit project level: tempo, time signature, time selection, markers/regions, and save without a dialog.
Render audio: master mix, time selection, custom range or stems; WAV (16/24/32f) or MP3; loudness/peak measurement, with warnings and solo/file-overwrite guards.
Escape hatches: run any REAPER action by command id, call any ReaScript function by name, or execute arbitrary Lua inside REAPER with a timeout.
Batch everything: many calls in one IPC hop and one undo point, with optional stop-on-error.
Every mutating call becomes a single labelled undo point, so edits stay reversible.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@reaper-mcpRender the project to MP3"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Hibiki
Hibiki is the agent inside your music editor, built for professionals. Talk to it about what you're working on, let it edit, arrange and mix alongside you, and bring the AI agents you already use. It runs in REAPER today.
Path | What |
| MCP server ( |
| Hibiki — chat panel docked in REAPER (ReaImGui) for Gamut, Codex and other ACP agents |
| Starts the bridge and the chat panel whenever REAPER launches |
| Agent gateway: one local API for the panel in front of Gamut and ACP agents (Codex, …) |
| Remote-host bootstrap (Cloudflare Tunnel) and hot-swap deploy of the bridge — see |
MCP client --stdio JSON-RPC--> reaper_mcp/server.py --JSON mailbox--> reaper_mcp/bridge.lua (inside REAPER)Fourteen grouped tools. Multi-step edits go through batch; anything else through reaper_call / run_lua. Track index -1 is the master. Time is project quarter notes. Call status first; on a new project pass detail=true for arrangement facts (time signature, length in beats, markers, MIDI vs audio) — not chords. midi cc is CC and program change; item import takes a path on the REAPER host; project save writes without a dialog (pass path if the project is unsaved). midi get omits default fields; batch slots are the inner result or {error}.
Just want the MCP? For Claude Desktop, Claude Code or Cursor with no panel, no gateway and no background services, see MCP only.
Install (macOS)
REAPER first. Download it from reaper.fm, drag it to Applications and open it once. The package (and
hibiki setup) refuses to install on a Mac without REAPER.Hibiki. Download
Hibiki-<version>.pkgfrom Releases and open it. The package brings its own Python, so it doesn't need the Xcode command line tools. To upgrade, install a newer package.Restart REAPER. The Hibiki panel opens docked on the right; click the agent name at its top to pick a provider and model.
Connect an agent — Gamut or a CLI agent: see Connect an agent.
The package isn't signed yet. If macOS says it can't verify the developer, open System Settings → Privacy & Security and click Open Anyway.
What it sets up for the logged-in user (hibiki setup runs the same steps; safe to re-run):
Piece | Where |
Lua bridge, Hibiki panel |
|
ReaImGui (if missing, pinned + sha256-checked), and its |
|
Startup hook: starts both with REAPER | a marked block in |
MCP over HTTP on | LaunchAgent |
Agent gateway on | LaunchAgent |
MCP registration | Gamut (as REAPER), plus Claude Desktop, Claude Code and Cursor when they're installed |
hibiki doctor # what's installed, what's running, what's wrong
hibiki recover # restart the MCP + gateway, drop stuck panel streams (REAPER untouched)
hibiki connect gamut|claude-desktop|claude-code|cursor [--remove]
hibiki agents add codex claude kimi # ACP agents for the panel (Node goes in ~/.local/node)
hibiki watchdog on|off # relaunch REAPER after crashes, for an unattended Mac
hibiki stop # turn the background services off; they stay off after login
hibiki start # turn them back on (setup does too)
hibiki update # newer release on GitHub? (--channel stable|dev, --json; dev builds default to dev)
hibiki update --install # download it, verify its sha256, open the installer (you finish it); source clones: git pull
hibiki uninstall [--purge] # --purge also deletes tokens and gateway config
hibiki use dev [--path ~/reaper-mcp] # testing unreleased code: run everything from a git checkout (no admin)
hibiki use release # back to the installed package
hibiki use [status] [--json] # which one is live: release version, or checkout path @ commithibiki use dev records the checkout in ~/.config/reaper-mcp/mode.json and runs the checkout's setup with the
package's Python, so the LaunchAgents, the bridge and the panel come from the checkout; every hibiki command
(including the panel's Recover and update) then runs the checkout's code. Restart REAPER to load the new bridge and
panel. hibiki update --install refuses in dev mode, and installing a package switches back to release.
From a clone instead (the LaunchAgents then run from the clone, so keep it; re-run after git pull):
git clone https://github.com/yiw190/hibiki.git ~/hibiki
sh ~/hibiki/install.sh # WITH_AGENTS=1 also adds Codex, Claude Code and KimiRelated MCP server: reaper-reapy-mcp
Install (Windows)
Release candidate: tested in CI on Windows Server, not yet on a desktop REAPER. Windows 10 1803+ (64-bit).
REAPER first. Download the 64-bit installer from reaper.fm, install it and open REAPER once. The installer (and
hibiki setup) refuses to install on a PC without REAPER.Hibiki. Download
Hibiki-<version>-setup.exefrom Releases and run it. It installs for your Windows user only (%LOCALAPPDATA%\Programs\Hibiki, no administrator rights), brings its own Python and addshibikito your PATH. To upgrade, run a newer installer; to remove, use Settings → Apps.Restart REAPER. Same as on macOS: the panel opens docked on the right.
Connect an agent — see Connect an agent.
The installer isn't signed yet: if SmartScreen stops it, click More info → Run anyway.
Differences from macOS: the REAPER resource path is %APPDATA%\REAPER; instead of LaunchAgents one background
supervisor (hibiki run, windowless) keeps the MCP and the gateway running, started at logon from
HKCU\...\CurrentVersion\Run; logs are in %LOCALAPPDATA%\Hibiki\logs; Open in Claude Code / Kimi opens a
cmd window; the watchdog is macOS only. From a clone: py -m reaper_mcp setup (Python 3.9+).
Connect an agent (step 4)
The panel talks to an agent; Hibiki doesn't ship one. Pick either route — or both, they show up side by side in the panel's Agent settings → Provider.
Route A — Gamut (desktop app, agents with skills, dashboards, connected accounts):
Download Gamut — macOS (Apple Silicon) · Windows · all releases (source, gamut.so).
Open it and sign in with your Gamut account. Gamut sets up its own agent containers and models; your own API keys (Anthropic, OpenRouter, Bedrock, OpenAI) are optional.
Create an agent.
In the Hibiki panel pick Gamut and the agent under Agent details. Gamut gives MCP servers to agents one by one, so the panel offers Enable REAPER for until that agent has it (one click; it also registers the MCP in Gamut if setup ran before Gamut was installed). From a terminal instead:
hibiki connect gamut --agent "<name>"(or--all-agents, or no flag to pick from a list).
Route B — a coding-agent CLI (each uses its own login / subscription): click Install next to it on the panel's
"Connect an agent" card or in Agent settings → Provider — it installs Node and the CLI into ~/.local/node (no admin
rights) and loads it without a restart — then Connect to log in once. The REAPER MCP is wired in automatically.
Agent | Package | Login |
Claude Code |
| your Claude login |
Codex |
| ChatGPT / OpenAI |
Kimi |
| kimi.ai or kimi.com (one button each) |
MiniMax |
| global or mainland account (one button each) |
Grok |
| browser sign-in; SuperGrok or X Premium+ (beta) |
Gemini |
| Google sign-in in the browser; Google AI Pro / Ultra |
Copilot |
|
|
Same from a terminal: hibiki agents add claude kimi minimax grok gemini copilot codex. Not one-click yet: Qwen Code (ACP only offers
an OpenAI-compatible API key set through environment variables) and DeepSeek (its harness's ACP server is
automation-only; DeepSeek models work through an ACP agent such as OpenCode with an API key).
MCP only
On macOS or Windows, from a clone:
git clone https://github.com/yiw190/hibiki.git ~/hibiki
sh ~/hibiki/install.sh --mcp-only # Windows: python -m reaper_mcp setup --mcp-onlyWhat it does:
Installs the bridge and a startup hook that starts it with REAPER.
Registers the MCP in Claude Desktop, Claude Code and Cursor, if they're installed.
Nothing else: no panel, no background services, no token.
Keep the cloned folder: those apps run reaper_mcp/server.py from it. Check the install with
hibiki doctor --mcp-only.
Gamut needs the full install instead: it reaches REAPER through the background HTTP service, which this mode leaves out.
For other MCP clients or operating systems, see the next section.
Manual setup (any MCP client, any OS)
python3 -m reaper_mcp install-bridgeThen in REAPER: Actions → Load ReaScript → reaper_mcp_bridge.lua → Run. It starts silently (no console window); hibiki doctor shows the bridge version and heartbeat. Set REAPER_MCP_DEBUG=1 to log to the ReaScript console.
MCP client config (any client that runs stdio servers):
{
"mcpServers": {
"reaper": {
"command": "python3",
"args": ["/absolute/path/to/hibiki/reaper_mcp/server.py"]
}
}
}On Windows use native Python, not WSL (they don't share the mailbox).
REAPER_MCP_IPC_DIR mailbox override (must match on both sides)
REAPER_MCP_TIMEOUT default 10s
REAPER_MCP_DEBUG=1 Lua request logMailbox: ~/Library/Application Support/reaper-mcp/ipc on macOS, %APPDATA%/reaper-mcp/ipc on Windows,
$XDG_DATA_HOME/reaper-mcp/ipc on Linux. Time is beats. Indices are 0-based.
Hibiki panel (macOS, Windows)
Needs ReaImGui ≥ 0.10 and an agent: Gamut or one of the CLI agents (see
Connect an agent). The panel talks to the agent gateway
on 127.0.0.1:47892; for Gamut it uses the desktop app's local REST + SSE API (127.0.0.1:47891), the same one
Gamut's own UI uses.
The installer puts it in place. By hand: 1. Copy panel/Hibiki.lua, panel/context.lua, panel/markdown.lua and panel/studio.lua to <REAPER resource path>/Scripts/Hibiki/
(and panel/Hibiki_Meter.jsfx to <REAPER resource path>/Effects/Hibiki/), then Actions → Load ReaScript and run Hibiki.lua.
2. Optional: run panel/restart_apply.sh while REAPER is open and quit REAPER — it docks the panel on the right,
binds Cmd+L to toggle it, and relaunches REAPER.
What it does: the header shows the agent and the model in effect (Gamut, Claude Code, Kimi, …); click it for
Agent settings, a Routing-style window with the provider, the Gamut agent, model / effort / mode, the context
switch and the live REAPER selections; the clock lists recent chats, + starts one. For Claude Code and Kimi,
Open in … reopens the chat in the agent's own CLI in Terminal. Replies stream with a markdown renderer; tool calls
collapse into one line per run. Every message carries a [REAPER context] block: project, tempo, cursor and nearby
markers, then each selection kind — time selection, razor areas, tracks, items, MIDI notes, envelope, FX — with how
long ago it was set and, for time/razor ranges, the chord markers and what plays there. Pills above the input show
the same selections, newest first. Enter sends, Shift+Enter is a newline. Drag to select message text and Cmd+C to
copy. Attach files with + File or by dropping them on the panel: they're uploaded to the agent (Gamut's
upload-file; for ACP agents the gateway stores them and sends images as image blocks) and listed in the message as
[Attached files:] (for Gamut, whose copies live in the agent's container, followed by the files' paths on the
REAPER host, which item import needs). A Gamut agent's questions, secrets, script runs and approvals are answered in
the panel; connecting an account or MCP server, uploading a requested file, a browser step or computer use opens that
chat in Gamut (superagent://agent/<slug>/sessions/<id>). Scrolling follows Gamut's own follow engine. Chinese/Japanese IME:
ReaImGui passes keys to both the IME and ImGui, so the panel undoes ImGui's half of Backspace / arrows / Esc / Enter
while a composition is open and shows the pending pinyin under the input.
Gamut's local API has no auth in desktop mode and listens on all interfaces. Block port 47891 in the macOS firewall if the Mac is on a network you don't trust.
Around the chat (panel/studio.lua)
Version history. After every agent reply that changed the project, a copy of it (saved or not;
Main_SaveProjectExto another path leaves the open project's path and dirty state alone) goes to<project folder>/.hibiki/history/<name>/<stamp>.RPP.gzwith a line inindex.jsonl: about 40 KB each, no media, the newest 200 kept. Each version is titled with the reply's own first sentence; hover lists what changed. The bridge knows what changed because it runs every request that can change the project in one undo block labelledHibiki <reply>: <what changed>and lists the changes in ExtStateHibiki/receipts; forrun_luaand raw API calls it diffs the project before and after (tracks, volume, pan, mute, FX added / removed / bypassed / offline, items, lanes, sends, tempo), and a first-line-- commenttitles the script. Agent settings → Version history: Current (with Save version when it isn't in the history yet), then the 10 newest versions with the time to the second and Go to, which saves Current as a version first, then makes this tab that version.Measure playback.
Hibiki_Meter.jsfxsits on the master's monitoring FX (never rendered) and writes a frame every 100 ms of playback to gmemHibiki: LUFS-M/S (BS.1770 K-weighting), 4× oversampled true peak, sample peak, correlation, side vs mid and eight mid bands. The next message's context gets the last playback: bars, gated LUFS-I, the loudest LUFS-S and true peak with their bar.beat, correlation minimum, band levels and a per-bar LUFS-M / true-peak row. Switch it in Agent settings → Context → Measure playback.Audition rack. An agent offers audible alternatives (sounds, parts, effects; not levels) preferably as fixed lanes of one track tagged
P_EXT:hibiki_lanes = "<group>"(one lane playing, lane names as labels), or by tagging tracksP_EXT:hibiki_var = "<group>/<n>"(one unmuted) or FX on one track withP_EXT:hibiki_fxvarlines"<group>/<n>\t<fx GUID>"(one enabled). The panel shows a row of numbered buttons per group above the input with the playing variant's name. Click or press 1–9 (panel focused) to switch (no undo point); when stopped, a click also loops the time selection, which the agent sets to the section where the variants differ, so a click is a listen. Hover = the loudness each variant measured while it played. Keep n deletes the other variants and their tags in one undo step.Ears. With a time selection or razor area, Ears renders it from the master (≤ 30 s, 24-bit WAV in the panel's private folder, your render settings restored afterwards), reads REAPER's LUFS-I / LUFS-S max / true peak, runs
hibiki ears(stdlib spectrum: 1/3-octave mid and side, tilt, bands over/under the tilt, stereo, level over time →.png+.md) and attaches the picture, the summary and the audio to your next message.Agent rules.
/remember <rule>saves a line to yourrules.md(/remember off: <id>switches a convention off). Agent settings → Context → Agent rules showsN defaults (M off) · K yours; Edit opensdefaults.mdandrules.md. See Rules for agents.
Rules for agents
Every agent gets one text: Hibiki conventions from your defaults.md followed by your rules from
rules.md, both in ~/.config/hibiki/brain/ (HIBIKI_BRAIN overrides the folder; the same path on Windows, under
your profile).
defaults.mdstarts as a copy of the shippedbrain/defaults.md(general know-how such as one DLSMusicDevice per project, never rendering onto an existing file), made byhibiki setupor the first read. It is yours: rewrite or delete any rule. Rules are bullets with a stable id,- [single-dls] ....On every install or upgrade,
hibiki setupmerges the new shipped file in per id: a rule you left untouched gets the new text, one you edited keeps your wording, one you deleted stays deleted, a new id is added at the end; lines without an id are never touched (brain/.defaults-state.jsonremembers what was last shipped).hibiki rules reset <id>(or--all) brings the shipped text back.rules.mdis free text, one rule per line (/remember <rule>in the panel adds one). It also understandsoff: <id>(leave a default out) and[<id>] <text>(replace its text), but editingdefaults.mdis simpler.<!-- comments -->are not sent.Delivered two ways: the MCP server appends the composed text to its
initializeinstructions (read at every session start, so edits apply to the next chat without a restart; Gamut agents and any MCP client see it), and the gateway writes it intoAGENTS.md,CLAUDE.mdandGEMINI.mdin the ACP agents' working folder (a marked block; your own text in those files stays) before each new chat. Capped at 12,000 characters.hibiki rulesprints what agents get,hibiki rules --paththe rules.md path,hibiki rules edit [defaults|mine]opens both files (or one),hibiki rules off <id>/on <id>toggle a default from rules.md. The panel's Agent rules → Edit opens both files.
Start with REAPER
The installer merges reaper/__startup.lua into <REAPER resource path>/Scripts/__startup.lua as a marked block. It starts the
MCP bridge and opens the chat panel on every launch, registering either script if REAPER doesn't know it yet.
Agent gateway: Codex, Claude Code, Kimi, … in the same panel
gateway/agent_gateway.py is a small local server (127.0.0.1:47892, stdlib Python) that the panel talks to first.
It proxies Gamut agents unchanged and adds ACP agents — Codex via
@agentclientprotocol/codex-acp, Claude Code via @agentclientprotocol/claude-agent-acp, Kimi Code CLI (kimi acp),
and anything else that speaks ACP — under the same API. Subscriptions work: Codex logs in with ChatGPT, Claude Code
reuses the local claude login, Kimi's login button opens kimi login (device code) in Terminal. An agent's
loginVariants turn its terminal login into one button per variant, each appending its args to the login
command (the Kimi entry ships kimi.ai = --region global and kimi.com = --region mainland-cn). Each ACP session gets this
repo's MCP server, so every backend can drive REAPER. The panel shows model / effort / mode pickers for both kinds
(Gamut's model catalog, ACP config options), permission buttons when an ACP agent asks before a tool call, and a
login button when the agent needs one. If the gateway isn't running the panel falls back to Gamut directly.
Every request except /health needs Authorization: Bearer <token> from ~/.config/agent-gateway/token (created
with mode 0600 on first start; the panel reads it). Docker and Lima forward host.docker.internal /
host.lima.internal to the Mac's loopback, so without the token any container on the Mac could start a host agent.
hibiki agents add codex claude kimi # Node (~/.local/node) + the ACP adapters, restarts the gateway
python3 gateway/test_gateway.py # fake Gamut + fake ACP agent, no networkAgents are listed in ~/.config/agent-gateway/config.json (acp: [{slug, name, command, env, cwd}],
mcpServers: [...]). Transcripts of ACP sessions are kept in ~/.config/agent-gateway/sessions/.
hibiki agents add installs each adapter at a pinned npm version with install scripts off (MiniMax keeps them: its
SQLite binding and ripgrep are fetched by them).
An ACP agent starts on first use (a message, its config, or /status?probe=<slug>; probe=1 only checks that the
binary is there and returns the last-known login state). After 10 minutes with no running turn and no open stream
(AGENT_GATEWAY_IDLE, seconds) the gateway stops it and the MCP servers it started; the next message restarts it and
reloads the chat.
Gamut desktop on the same Mac: install.sh registers the MCP as http://localhost:8787/mcp (no tunnel). Agent running somewhere
else and need to reach REAPER over the internet? See docs/remote-host.md.
Troubleshooting
hibiki recover (also the Recover button in the panel's settings) restarts the MCP front and the gateway (their
ACP agents go with it), kills leftover panel stream curls, puts back a missing bridge script / panel / token, waits
up to 10 s for both services and reports the bridge heartbeat. It never touches REAPER: a stale heartbeat means
REAPER is busy or hung, and the watchdog restarts a hung one. --json prints {"ok", "steps": [{"name", "ok", "detail"}]}; exit 0 when the MCP and the gateway answer. hibiki doctor lists everything else.
Security notes
The HTTP front (
127.0.0.1:8787) refuses to start with a bearer shorter than 32 characters;hibiki setupandscripts/macos-host-bootstrap.shgenerate one with a CSPRNG when none is given.Exposed through a Cloudflare tunnel, the bearer is the only gate in front of
run_lua, i.e. a shell on the Mac. Only run the tunnel while an agent outside the Mac needs it, and put a Cloudflare Access policy (service token or identity) in front of the tunnel hostname so requests are filtered before they reach the Mac.
Tools
status transport track midi fx send item envelope project render action reaper_call run_lua batch
Behaviour worth knowing (all optional parameters; older calls work unchanged):
statusalso returnsany_solo(REAPER's own solo state, which can differ from a track'sI_SOLO),master_muteanddirty.renderruns action 40101 (set all media online) first (media_online=falseskips it), refuses when a target file already exists (REAPER's overwrite prompt would block the bridge) and when tracks are soloed (allow_solo=true, orsolo_indices/mute_indicesto solo/mute tracks for this render only; they are restored afterwards). It returnsfiles: [{path, bytes, length_sec, peak_db, lufs_i}]andwarnings(near-silent, file not written, master muted, stems that came out as the master).measure=falseskips the loudness scan.fx settakesformattedinstead ofvalue: the value as the plugin shows it (-18for dB,4for 4:1,inf, or a label such as3.2k). It searches the display text and returns theformattedvalue it actually set.send add|updatetakemode(post_fader/pre_fader/pre_fx) andsrc_channel/dst_channel, the first channel of a stereo pair counted from 0 (dst_channel=2= channels 3/4, a compressor's sidechain input). The destination track gets more channels if it needs them.envelope get|settakeunit=dbfor volume-type envelopes.setturns an inactive (ACT 0) envelope back on and rejects points that have novalue.run_luatakestimeout(seconds, default 10, at most 600). Errors quote the failing source line. REAPER is frozen while a snippet runs, so start long host commands in the background and poll their log.Every call that can change the project is one undo point labelled
Hibiki <reply>: <what changed>(abatchis one point for all its calls, with no rollback:stop_on_error=trueskips the rest after a failure); see Version history.A reply works on the project tab that was in front when it first changed something: if another tab comes to the front, writes and renders are refused (from the panel, until the reply ends; without the panel the first refusal re-pins to the new tab).
statusalways returnscursor_beats,time_selection, selected tracks (selected) andselected_items;detail=trueaddstempo_map(tempo and meter changes).itemarranges:split(at_beats),delete,duplicate(an unpooled copy), andupdatewithleft_edge_beats(trim the start, content stays put),dest_track_index,active_take,fade_in_sec/fade_out_secandfade_*_shape. Item indices follow position, so list again after a move.envelope get|settakestart_beats/end_beats:setthen replaces only the points in that range.transport gotomoves the edit cursor toposition_beatsor a marker/region (number or name); transport returnsposition_secandposition_beats.rendertakesformat(wavwithbit_depth16 / 24 / 32 float, ormp3at 320 kbps) for that render only.fx paramstakesfilter;midi get_ccreads CC, program and pitch bend.run_lua'stimeoutstops a snippet that is still running Lua (what it did until then stays done); a call blocked inside REAPER (ExecProcess, a render, a dialog) can't be stopped.One REAPER serves the mailbox: a second REAPER's bridge waits until the first one's heartbeat goes stale, and a request is claimed by renaming it, so it never runs twice.
Tests
python3 tests/test_server.py # MCP server + fake bridge, versions in step
uv run --with lupa python tests/test_bridge_lua.py # bridge.lua against a fake ReaScript API
uv run --with lupa python panel/test_panel.py # chat panel events, sends and cards, fake reaper/ImGui
python3 gateway/test_gateway.py # agent gateway against fake Gamut + fake ACP agent
python3 tests/test_suite.py # setup / doctor / connect / uninstall on a fake HOME
python3 tests/test_ears.py # `hibiki ears` on synthetic WAVs
uv run --with lupa python scripts/check_syntax.py # every .lua compiles under Lua 5.4, every .sh parsesCI runs all of these on every push: the Python suites on 3.9 (the macOS host's /usr/bin/python3) and 3.12.
None of these need REAPER. The Lua-based ones need lupa (CI installs it).
Contributing
See CONTRIBUTING.md. Report security issues privately: SECURITY.md.
License
MIT
Available Tools
14 toolsactionB
Run a REAPER Main_OnCommand by numeric command id.
| Name | Required | Description | Default |
|---|---|---|---|
| command_id | Yes |
TDQS
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 states the action (run a command) but doesn't disclose side effects, whether the command may be destructive, require specific REAPER state, or return any output. For a tool that can execute arbitrary REAPER commands, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the action and resource. Every word earns its place, and it avoids unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that executes arbitrary REAPER commands, the description is thin. It lacks information about return values, error handling, side effects, and prerequisites. The output schema is absent, and the description doesn't explain what happens after the command runs. An agent would need external knowledge to use this tool safely and effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that command_id is a numeric command id, which adds meaning beyond the bare integer type. However, it doesn't provide details like valid ranges, how to find command IDs, or whether the command ID is a native REAPER ID or a custom one. The description adds some value but leaves gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run') and resource ('REAPER Main_OnCommand by numeric command id'), which clearly identifies the tool's function. It distinguishes itself from siblings like run_lua and reaper_call by specifying the exact REAPER API function and input type, though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this tool when you need to invoke a REAPER command by its numeric ID. It doesn't explicitly state when not to use it or mention alternatives like run_lua for scripts, but the context of sibling tools and the specific API reference provide some guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchA
Many operations in one IPC hop and one undo point. Each call is {func, args} or {func: 'run_lua', code, timeout} or {func, arguments} for a grouped tool name (track/midi/fx/...). Each slot is the inner result, or {error}. There is no rollback: by default one failure does not abort the rest; stop_on_error=true skips the slots after the first failure ({skipped: true}). Handles from earlier calls work later.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes | ||
| stop_on_error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meets it: it discloses there is no rollback, that failures do not abort the remaining calls by default, that stop_on_error=true skips later slots and marks them {skipped: true}, and that handles from earlier calls remain valid later. These are exactly the non-obvious traits an agent needs before composing a multi-call batch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the value proposition (one hop, one undo point) before the grammar details; nearly every sentence carries distinct information. It is dense but not padded, with only slight redundancy between the call-shape and handle-reuse statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multiplexer with no annotations and no output schema, the description covers call shapes, per-slot return values, error/skip behavior and cross-call handle reuse. The remaining gap is that valid 'func' values and the 'action' field are only gestured at rather than specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the parameters, and it does for most: the three call shapes ({func, args}, {func: 'run_lua', code, timeout}, {func, arguments} for grouped names), plus stop_on_error semantics. It omits the 'action' property present in the schema, leaving one field undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource: it runs many tool operations in one IPC hop and one undo point, and names the grouped sibling namespaces (track/midi/fx) it can dispatch into. That differentiates it from calling those sibling tools individually, though the generic name 'batch' alone would not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The benefit (single IPC hop, single undo point) implies when to prefer it over individual calls, but the description never says so explicitly and gives no when-not guidance or named alternative. Usage must be inferred from the stated benefits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
envelopeA
Track envelopes. action: list | get | set. name is REAPER envelope name (Volume, Pan, Mute, ...). set replaces all points, or with start_beats / end_beats only the points in that range (ends included; every new point must lie inside it); get with a range returns only those points. value is the envelope's value; Volume is linear gain (1.0 = 0 dB, 0.5 = -6 dB), also on fader-scaled envelopes. unit=db reads/writes volume-type envelopes (Volume, Trim Volume, send Volume) in dB. set re-activates an envelope left inactive (ACT 0).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| unit | No | ||
| action | Yes | ||
| points | No | ||
| end_beats | No | ||
| start_beats | No | ||
| track_index | Yes | ||
| envelope_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose important side effects: set replaces all points or only points in a range, every new point must lie inside that range, and set re-activates an inactive envelope. It does not cover every possible behavior, such as permission needs or return shapes, but it is substantially transparent for a mutation-capable tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the action modes and key semantic details. Every sentence carries useful information, though the long run-on style makes it slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested point objects, no annotations, no output schema, and no schema descriptions, the definition covers the most important operational semantics. It remains incomplete because it leaves required track_index, envelope_index, and several point-level fields unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It adds useful meaning for name, value, unit, start_beats, and end_beats, including gain/dB semantics and range inclusion rules, but it omits explanation of required track_index and envelope_index and does not describe the point object fields such as shape, tension, or selected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (track envelopes) and the three operations (list, get, set), with additional detail about point replacement and ranges. It is clear enough to distinguish the tool from unrelated siblings, but it does not explicitly differentiate it from nearby tools such as track or send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the modes of action=list/get/set and clarifies how set and get behave with start_beats/end_beats ranges. However, it gives no explicit guidance on when to choose this tool over sibling tools like track, send, or item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fxB
Track FX. action: list | add | params | set | delete | bypass | move | preset. params takes filter (case-insensitive part of the parameter name) to list only matching ones. track_index -1 is the master. set takes value 0..1 (REAPER normalized) or formatted: the value as the plugin displays it (number in its unit, e.g. -18 for dB, 4 for 4:1, 120 for ms; or a label like "3.2k"), resolved by searching the display text. set returns the formatted value actually set.
| Name | Required | Description | Default |
|---|---|---|---|
| param | No | ||
| value | No | ||
| action | Yes | ||
| filter | No | ||
| preset | No | ||
| enabled | No | ||
| fx_name | No | ||
| fx_index | No | ||
| formatted | No | ||
| dest_index | No | ||
| track_index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does a good job on 'set' semantics — normalized 0..1 vs formatted display-text values, and that set returns the formatted value actually set. But for mutations like delete, add, bypass and move it says nothing about required permissions, reversibility, or side effects, which is a meaningful gap for a tool with destructive capabilities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably compact with no filler, and it front-loads the action list. But it is a single dense run-on paragraph with no separation between action enumeration, per-action notes, and set semantics, which makes it harder to scan than a structured multi-line definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 parameters, 8 dispatched actions and no output schema or annotations, the description is not complete enough. It never maps parameters to actions, so an agent cannot tell from the description that add needs fx_name or move needs fx_index/dest_index, and the absence of any delete/bypass transparency is a real risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 11 parameters, so the description must compensate and only partly does. It clarifies the trickiest ones well — filter (case-insensitive part of parameter name), track_index (-1 = master), value (0..1 normalized) and formatted (display string like '3.2k'). It leaves preset, enabled, fx_name, fx_index, dest_index and the action-specific parameter requirements undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (Track FX) and enumerates all eight actions, which makes the tool's scope clear and distinguishes it from siblings like item, envelope, track and send. It isn't a full verb+resource statement like 'manage effects on a track' but the enumeration is functional. An agent can identify it as the FX tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives some action-specific usage: 'params takes filter' to narrow results, 'track_index -1 is the master', and how 'set' resolves values. However, it never explains when to use a given action, what each of add/delete/bypass/move/preset requires, or when an agent should prefer this tool over siblings. Usage is implied by the action enum rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itemA
Media items on a track. action: list | update | import | split | delete | duplicate. Times are beats except fade_in_sec / fade_out_sec (seconds, REAPER native). update: gain_db, fades and fade_*_shape, loop, mute, position_beats (move), length_beats (trim the end), left_edge_beats (trim or extend the start; the content stays in place), dest_track_index (move to another track; returns the new indices), active_take. list shows take name, source file and take count. split cuts at at_beats (inside the item) and returns the pieces' item_indices. delete takes item_index or item_indices. duplicate copies the item (unpooled) to position_beats (default: right after it), optionally on dest_track_index. import uses a path already on the REAPER host; as_new_track=true makes new tracks. Item indices follow position, so re-list after edits that move items.
| Name | Required | Description | Default |
|---|---|---|---|
| loop | No | ||
| mute | No | ||
| path | No | ||
| action | Yes | ||
| gain_db | No | ||
| at_beats | No | ||
| item_index | No | ||
| active_take | No | ||
| fade_in_sec | No | ||
| start_beats | No | ||
| track_index | No | ||
| as_new_track | No | ||
| fade_out_sec | No | ||
| item_indices | No | ||
| length_beats | No | ||
| fade_in_shape | No | ||
| fade_out_shape | No | ||
| position_beats | No | ||
| left_edge_beats | No | ||
| dest_track_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it states split returns piece item_indices, duplicate is unpooled, dest_track_index returns new indices, import requires a host-local path, and item indices follow position so re-listing is needed after moves. It stops short of covering permissions, error behavior, or destructive warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but appropriately sized for 20 parameters and six actions, and it is front-loaded with the resource and action list. It would be easier to scan as a bulleted action list, but every sentence adds actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter, multi-action tool with no annotations and no output schema, the description is largely complete, covering action semantics, units, side effects, and index behavior. The main gaps are the undocumented start_beats and track_index parameters, plus no mention of error or permission behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does: it explains units (beats vs seconds for fades), update fields (gain_db, fades, loop, mute, position_beats, length_beats, left_edge_beats, dest_track_index, active_take), split's at_beats, delete's item_index/indices, duplicate's position_beats, and import's path/as_new_track. It omits start_beats and track_index, leaving two parameters with no semantic explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Media items on a track' and enumerates the six supported actions (list, update, import, split, delete, duplicate), giving a specific resource and action set. It clearly distinguishes this tool from track-level siblings by scope, though it never names an alternative tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action has clear usage context: split cuts at at_beats, delete takes item_index or item_indices, duplicate copies the item to position_beats by default, and import uses a path on the REAPER host. It lacks explicit when-not-to-use guidance or sibling-tool routing, but the per-action context is strong enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
midiB
MIDI on a track item. Times are absolute project beats. action: create_item | add | get | replace | update | delete | cc | get_cc. replace rewrites the whole take in one undo step; add only appends. cc inserts CC (cc+value) or program change (program) via ccs[]; get_cc reads CC, program and pitch_bend back in that shape. get omits index (use array offset), channel if 0, muted/selected if false.
| Name | Required | Description | Default |
|---|---|---|---|
| ccs | No | ||
| muted | No | ||
| notes | No | ||
| pitch | No | ||
| action | Yes | ||
| channel | No | ||
| velocity | No | ||
| item_index | No | ||
| note_index | No | ||
| start_beats | No | ||
| track_index | Yes | ||
| length_beats | No | ||
| note_indices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two valuable traits the schema cannot: replace's whole-take rewrite in one undo step, and get's omission of zero/false fields in the response. It says nothing about delete being destructive/irreversible, permission or track-item preconditions, or failure modes, which is a meaningful gap for a mutation 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense block with the action list front-loaded and no filler sentences; the replace/add and cc/get_cc contrasts each earn their place. It is terse to the point of being terse over telegraphic, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, 8-action tool with no annotations, no output schema, and 0% schema coverage, the description is far from sufficient: an agent cannot learn the per-action parameter contract or the response shape for notes/CC reads. What is present is high value but covers a minority of the calling surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document the 13 parameters; it only clarifies that times are absolute project beats and explains the ccs[] shape (cc+value or program). notes[], pitch, velocity, length_beats, note_index, note_indices, item_index and track_index go entirely undocumented, and it never says which parameters are required per action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('MIDI on a track item') and enumerates all eight actions supported by the action enum, so an agent can see this is a multi-op MIDI note/CC manipulation tool. It does not disambiguate against siblings (e.g. item), but no sibling appears to overlap in MIDI domain, so the boundary is reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts replace vs add ('replace rewrites the whole take in one undo step; add only appends') and pairs cc with get_cc, which are real usage choices. However, nothing tells the agent when to choose create_item vs add vs update, or what preconditions exist (item must already exist, track must have a MIDI item), leaving the biggest routing decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projectB
Project-level edits. action: tempo | time_signature | time_selection | marker | save. save with path creates missing folders and writes a copy (no dialog); an untitled project adopts that path. save without path needs an already-named project.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | ||
| name | No | ||
| path | No | ||
| action | Yes | ||
| end_beats | No | ||
| is_region | No | ||
| numerator | No | ||
| denominator | No | ||
| start_beats | No | ||
| position_beats | No | ||
| region_end_beats | No |
TDQS
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 does this well for save — creating missing folders, writing a copy with no dialog, an untitled project adopting the path, and the precondition that save-without-path needs a named project — but the other four actions receive no behavioral disclosure at all (no indication of whether they overwrite existing tempo/markers or how they fail).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler; the action list appears before the save caveats. The telegraphic style ('save with path...') is dense but every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multiplexed tool with five actions and eleven parameters, no annotations, and no output schema, the description covers only the save path. It leaves which parameters belong to which action and what each non-save action returns entirely to inference, which is inadequate for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 11 parameters, and the description explains only the action enum and the role of path for save. It never maps bpm, numerator/denominator, start_beats/end_beats, position_beats, region_end_beats, is_region, or name to their actions, so the agent must guess the action-to-parameter association.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title-like sentence 'Project-level edits' is weak on its own, but the action enumeration (tempo, time_signature, time_selection, marker, save) precisely delimits what this tool touches, so an agent can tell it edits project-level attributes rather than items, tracks, or fx. It never names a sibling to differentiate against, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the action list rather than stated: an agent must infer that this is the tool for setting tempo, time signature, time selection, and markers. Conditional guidance exists only for save ('with path' vs 'without path'), and there is no statement of when to prefer a sibling such as transport or action instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reaper_callB
Call any ReaScript function by name. Pointers come back as {"__handle":"hN"} and can be passed back in. Example: func=CountTracks args=[0].
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| func | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. While the description does explain pointer return format ({"__handle":"hN"}) and hints that handles can be passed back in, it omits key behavioral details: what happens if the function doesn't exist, whether calls are synchronous, whether they mutate project state, or error behavior. Since this can execute arbitrary ReaScript functions, the lack of safety/behavioral disclosure is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Highly concise: two sentences plus an example. The core purpose and pointer format are front-loaded, and the example is illustrative without extraneous content. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic function-calling tool, the description gives the essential call pattern and pointer handling, but it lacks crucial operational context: no error handling, no mention of argument serialization rules, no discussion of side effects, and no differentiation from sibling tools like run_lua. With no annotations and no output schema, the description should do more to cover these gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the bare schema. It does explain func as a ReaScript function name and args as the argument list, with an example (CountTracks with arg 0). However, it doesn't clarify what argument types are supported, how args map to ReaScript parameters, or what the pointer handle string structure means beyond an example. It adds some meaning but leaves ambiguity for arbitrary functions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (call any ReaScript function by name) and resource (ReaScript functions in REAPER). It also shows an example invocation with func and args. However, it doesn't explicitly differentiate from sibling tools like run_lua, which also executes scripts, leaving some ambiguity about when to use reaper_call over run_lua.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool vs alternatives such as run_lua or project tools. The sibling context includes run_lua, which could overlap significantly, and the description provides no criteria for choosing between them. It also doesn't mention constraints on function names, argument types, or error behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderA
Render. No undo. Long timeout. bounds: project | time_selection | custom | items. Default: the master mix. stems=true renders the selected tracks as stems instead (pass track_indices to select them). path is the output folder; the file name comes from pattern. Sets all media online (action 40101) first unless media_online=false. Refuses when a target file already exists (REAPER's overwrite prompt would hang the bridge) and when tracks are soloed (pass allow_solo=true, or solo_indices / mute_indices to solo/mute tracks for this render only; they are restored afterwards). Returns files [{path, bytes, length_sec, peak_db, lufs_i}] and warnings (near-silent, missing file, master muted); measure=false skips the loudness scan. format wav (bit_depth 16 | 24 | 32 = float) or mp3 (320 kbps) sets the file type for this render only; without it the project's render format is used.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| stems | No | ||
| bounds | No | ||
| format | No | ||
| measure | No | ||
| pattern | No | ||
| channels | No | ||
| bit_depth | No | ||
| end_beats | No | ||
| allow_solo | No | ||
| sample_rate | No | ||
| start_beats | No | ||
| media_online | No | ||
| mute_indices | No | ||
| solo_indices | No | ||
| track_indices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: no undo, long timeout, media brought online first unless media_online=false, refusal on existing files because REAPER's overwrite prompt would hang the bridge, and solo/mute restored afterward. The only gap is that it doesn't quantify the timeout or describe failure/timeout behavior beyond the hang rationale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the critical facts ('Render. No undo. Long timeout.') followed by bounds and output mapping. Dense but nearly every sentence carries a distinct behavior; the parenthetical stacking around solo/mute and format makes it slightly harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return shape itself (files with path, bytes, length_sec, peak_db, lufs_i, plus warnings) and enumerates warning types. For a 16-param mutation tool this is close to complete; the unaddressed channels/sample_rate/beat-range params are the only shortfall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate across 16 params, and it does for most: path, pattern, bounds (all four enum values), stems, track_indices, media_online, allow_solo, solo_indices, mute_indices, measure, format, and bit_depth (with 32=float and mp3=320 kbps). It leaves channels, sample_rate, and start_beats/end_beats unexplained beyond the 'custom' bounds hint, which is why this is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific operation (offline render of the master mix, or stems with track_indices) and the artifacts it produces (files written to `path` using `pattern`). It is clearly distinguishable from siblings like action, run_lua, or project, which would not describe render-bound/stem semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit branch conditions: stems=true plus track_indices for stems; allow_solo/solo_indices/mute_indices when tracks are soloed; measure=false to skip the loudness scan; format to override the project format for this render only. It also states when the tool refuses (existing target file, soloed tracks) and how to proceed in each case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_luaA
Run a Lua snippet inside REAPER (reaper in scope). Use return to send a value. Best for multi-step work that would otherwise be many round-trips. Errors carry the failing line. timeout (seconds, default 10, max 600): a snippet still running Lua after it is stopped with an error (what it did until then stays done); a call blocked inside REAPER (ExecProcess, a render, a dialog) can't be stopped. REAPER is frozen while it runs, so start long host commands in the background (io.popen('cmd > log 2>&1 &')) and poll instead.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: errors carry the failing line, the timeout stops a still-running Lua snippet but cannot interrupt a call blocked inside REAPER, work completed before the timeout remains done, and REAPER is frozen while the snippet runs. These are exactly the operational facts an agent needs before invoking arbitrary code execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and use case, then covers return values, errors, timeout behavior, and the REAPER-frozen caveat without filler. The longer timeout sentence is dense but every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-annotated arbitrary code execution tool with no output schema, the description is nearly complete: it covers scope, return mechanism, error reporting, timeout limitations, and host freezing. A minor gap is that it does not specify how returned values are serialized or whether there are restrictions on return types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters, and it does. It explains that `code` is a Lua snippet with `reaper` in scope and that `return` sends a value; for `timeout` it adds the default (10), maximum (600), and non-obvious semantics about what can and cannot be interrupted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: running a Lua snippet inside REAPER with `reaper` in scope. It also signals the tool's niche as multi-step work that avoids many round-trips, though it never names the sibling tools (e.g., reaper_call or action) it is meant to replace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the best use case as multi-step work that would otherwise be many round-trips, and gives a concrete pattern for long host commands (start in background with io.popen and poll). It does not explicitly say when not to use this tool or name the dedicated sibling tools for single-step operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sendB
Track sends. action: list | add | delete | update. track_index is the source (-1 master). dest_index is the destination track. add/update take volume_db, pan, mute, mode (post_fader | pre_fader | pre_fx) and channel routing: src_channel / dst_channel = first channel of the stereo pair, 0-based (dst_channel 2 = channels 3/4, a compressor's sidechain input; the destination's channel count is raised to fit).
| Name | Required | Description | Default |
|---|---|---|---|
| pan | No | ||
| mode | No | ||
| mute | No | ||
| action | Yes | ||
| volume_db | No | ||
| dest_index | No | ||
| send_index | No | ||
| dst_channel | No | ||
| src_channel | No | ||
| track_index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses source/destination semantics and that the destination channel count is raised to fit routing, but it does not state that delete is destructive, permission/error behavior, or exactly what update changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the resource and action set, then follows with routing details. It is dense but efficient, with little wasted text, though it could be structured more clearly for scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no annotations and no output schema, the description omits `send_index` entirely and says nothing about list output or error behavior. It provides valuable routing context but leaves material gaps for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 0% schema description coverage, the description must compensate, and it does explain action, `track_index`/master, `dest_index`, volume_db, pan, mute, mode, and src/dst channel routing. However, `send_index` is never mentioned and ranges/defaults are left implicit, so the compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (track sends) and enumerates the supported actions, so an agent can tell it manages send routing rather than tracks, items, or FX. It does not explicitly contrast itself with sibling tools, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action enum supplies operation-level guidance and `track_index` is clarified with `-1 master`, but there is no explicit when-to-use vs alternatives or prerequisites for add/delete/update. Usage is implied by action names rather than actively guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
Check the Lua bridge and return project tempo, play state, cursor_beats, tracks (selected=true on selected ones), time_selection {start_beats, end_beats} when there is one, selected_items [{track_index, item_index}], any_solo, master_mute and dirty (unsaved changes). Call first; clear a lingering solo before rendering. detail=true adds arrangement facts (time signature at the start, tempo_map of tempo/meter changes, length in beats, markers, MIDI vs audio per track) without guessing chords.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the returned fields and the extra detail mode, but it does not explicitly say this is read-only, whether the call has side effects, what happens if the Lua bridge is unavailable, or whether detail=true has performance costs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with the core action and then adding operational guidance and detail-mode behavior. The long list of returned fields is useful, though the single packed sentence makes it slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description needs to explain what the tool returns, and it does list the key fields and the expanded detail fields. It is reasonably complete for a status tool, though it omits error behavior and the default for detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the single optional parameter, and it does: detail=true adds arrangement facts and lists what those facts include. It could be slightly stronger by stating the default value explicitly, but the meaning is clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it checks the Lua bridge and returns a concrete set of project, transport, selection, and dirty-state fields. It is clearly not a tautology, but it does not explicitly differentiate itself from sibling tools such as transport or project, so it falls just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context with 'Call first' and a specific operational caveat about clearing a lingering solo before rendering. It does not name alternatives or state when not to use this tool, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trackB
Track operations. action: list | add | delete | update | bus. update uses name, volume_db, pan (-1..1), mute, solo. bus creates a submix named name and routes source_indices through it (their direct send to the master/parent is turned off).
| Name | Required | Description | Default |
|---|---|---|---|
| pan | No | ||
| mute | No | ||
| name | No | ||
| solo | No | ||
| index | No | ||
| action | Yes | ||
| volume_db | No | ||
| source_indices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It valuably discloses that bus disables the source tracks' direct send to the master/parent, but it does not warn that delete is destructive, describe return behavior, or state permissions/constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, front-loads the purpose and action list, then adds only the non-obvious update and bus details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex multi-action tool with eight parameters, no annotations, and no output schema. The description adequately covers update and the tricky bus action, but leaves list, add, delete, and index semantics under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for update fields, pan's -1..1 range, and bus's source_indices routing, but leaves 'index' unexplained and does not clarify parameter usage for add, delete, or list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear resource ('Track operations') and enumerates the five supported actions, so an agent can tell what the tool does. It does not differentiate the tool from siblings such as item, send, or fx, which is the main remaining gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists actions but gives no explicit guidance on when to use this tool versus alternatives like send or fx, and no when-not conditions. The bus explanation is behavioral detail, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transportB
Playback control. action: play, stop, pause, record, toggle_repeat, goto_start, goto (edit cursor to position_beats, or to a marker/region by number or name; moves playback too when playing). Returns play_state, position_sec and position_beats.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| marker | No | ||
| position_beats | No |
TDQS
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 an important side effect (goto moves playback when playing) and names the returned fields. However, it omits whether stop/record reset position or arm tracks, permission or project-state prerequisites, and error behavior for invalid markers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then compact action semantics in a single pass with no filler. The deeply nested parenthetical makes the goto rules dense but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-annotation, no-output-schema tool it covers the return shape and the trickiest parameter interaction, which is good. Gaps remain around action/parameter pairing, precedence when both targeting params are given, and failure modes, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate; it does explain goto's two targeting modes (position_beats vs marker by number or name), which is the most confusing part. It still doesn't state that marker and position_beats are only meaningful for goto, what happens if both are supplied, or that position_beats is non-negative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear domain statement ("Playback control") and then enumerates the exact actions available, so an agent knows this drives play/stop/pause/record and cursor navigation. It clearly is not the same as siblings like status, action, or render, though it never names those siblings to reinforce the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this tool versus adjacent tools (status vs action vs transport), and no conditions or exclusions. The action list implies usage, but the only real guidance is about goto's targeting options, not about tool selection.
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.
7 tool updates
v0.6.0- Changed
batch2 fields changed- added
Input schema / properties / calls / items / properties / timeoutAdded value: +{ + "maximum": 600, + "minimum": 1, + "type": "number" +} - added
Input schema / properties / stop_on_errorAdded value: +{ + "type": "boolean" +}
- Changed
envelope2 fields changed- added
Input schema / properties / end_beatsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / start_beatsAdded value: +{ + "minimum": 0, + "type": "number" +}
- Changed
fx1 field changed- added
Input schema / properties / filterAdded value: +{ + "type": "string" +}
- Changed
item12 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "update", - "import" -]New value: +[ + "list", + "update", + "import", + "split", + "delete", + "duplicate" +] - added
Input schema / properties / active_takeAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / at_beatsAdded value: +{ + "items": { + "minimum": 0, + "type": "number" + }, + "type": "array" +} - added
Input schema / properties / dest_track_indexAdded value: +{ + "minimum": 0, + "type": "integer" +} - removed
Input schema / properties / fade_inRemoved value: -{ - "minimum": 0, - "type": "number" -} - added
Input schema / properties / fade_in_secAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / fade_in_shapeAdded value: +{ + "enum": [ + "linear", + "fast_start", + "fast_end", + "fast_start_steep", + "fast_end_steep", + "s_curve", + "s_curve_steep" + ], + "type": "string" +} - removed
Input schema / properties / fade_outRemoved value: -{ - "minimum": 0, - "type": "number" -} - added
Input schema / properties / fade_out_secAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / fade_out_shapeAdded value: +{ + "enum": [ + "linear", + "fast_start", + "fast_end", + "fast_start_steep", + "fast_end_steep", + "s_curve", + "s_curve_steep" + ], + "type": "string" +} - added
Input schema / properties / item_indicesAdded value: +{ + "items": { + "minimum": 0, + "type": "integer" + }, + "type": "array" +} - added
Input schema / properties / left_edge_beatsAdded value: +{ + "minimum": 0, + "type": "number" +}
- Changed
midi1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create_item", - "add", - "get", - "replace", - "update", - "delete", - "cc" -]New value: +[ + "create_item", + "add", + "get", + "replace", + "update", + "delete", + "cc", + "get_cc" +]
- Changed
render2 fields changed- added
Input schema / properties / bit_depthAdded value: +{ + "enum": [ + 16, + 24, + 32 + ], + "type": "integer" +} - added
Input schema / properties / formatAdded value: +{ + "enum": [ + "wav", + "mp3" + ], + "type": "string" +}
- Changed
transport3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "play", - "stop", - "pause", - "record", - "toggle_repeat", - "goto_start" -]New value: +[ + "play", + "stop", + "pause", + "record", + "toggle_repeat", + "goto_start", + "goto" +] - added
Input schema / properties / markerAdded value: +{ + "type": [ + "string", + "integer" + ] +} - added
Input schema / properties / position_beatsAdded value: +{ + "minimum": 0, + "type": "number" +}
9 tool updates
v0.5.0- Changed
envelope1 field changed- added
Input schema / properties / unitAdded value: +{ + "enum": [ + "gain", + "db" + ], + "type": "string" +}
- Changed
fx1 field changed- added
Input schema / properties / formattedAdded value: +{ + "type": [ + "string", + "number" + ] +}
- Changed
item5 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "update" -]New value: +[ + "list", + "update", + "import" +] - added
Input schema / properties / as_new_trackAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / pathAdded value: +{ + "type": "string" +} - added
Input schema / properties / start_beatsAdded value: +{ + "minimum": 0, + "type": "number" +} - changed
Input schema / requiredPrevious value: -[ - "action", - "track_index" -]New value: +[ + "action" +]
- Changed
midi2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create_item", - "add", - "get", - "replace", - "update", - "delete" -]New value: +[ + "create_item", + "add", + "get", + "replace", + "update", + "delete", + "cc" +] - added
Input schema / properties / ccsAdded value: +{ + "items": { + "properties": { + "cc": { + "maximum": 127, + "minimum": 0, + "type": "integer" + }, + "channel": { + "maximum": 15, + "minimum": 0, + "type": "integer" + }, + "program": { + "maximum": 127, + "minimum": 0, + "type": "integer" + }, + "start_beats": { + "type": "number" + }, + "value": { + "maximum": 127, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "start_beats" + ], + "type": "object" + }, + "type": "array" +}
- Changed
project2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "tempo", - "time_signature", - "time_selection", - "marker" -]New value: +[ + "tempo", + "time_signature", + "time_selection", + "marker", + "save" +] - added
Input schema / properties / pathAdded value: +{ + "type": "string" +}
- Changed
render5 fields changed- added
Input schema / properties / allow_soloAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / measureAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / media_onlineAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / mute_indicesAdded value: +{ + "items": { + "minimum": 0, + "type": "integer" + }, + "type": "array" +} - added
Input schema / properties / solo_indicesAdded value: +{ + "items": { + "minimum": 0, + "type": "integer" + }, + "type": "array" +}
- Changed
run_lua1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "maximum": 600, + "minimum": 1, + "type": "number" +}
- Changed
send3 fields changed- added
Input schema / properties / dst_channelAdded value: +{ + "maximum": 62, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / modeAdded value: +{ + "enum": [ + "post_fader", + "pre_fader", + "pre_fx" + ], + "type": "string" +} - added
Input schema / properties / src_channelAdded value: +{ + "maximum": 62, + "minimum": 0, + "type": "integer" +}
- Changed
status1 field changed- added
Input schema / properties / detailAdded value: +{ + "type": "boolean" +}
14 tool updates
v0.1.0- First observed
action - First observed
batch - First observed
envelope - First observed
fx - First observed
item - First observed
midi - First observed
project - First observed
reaper_call - First observed
render - First observed
run_lua - First observed
send - First observed
status - First observed
track - First observed
transport
TDQS
Scored across 14 tools
Resource tools (track, item, midi, fx, envelope, send, project, transport, render) are mostly distinct, but four generic escape hatches—action, reaper_call, run_lua, and batch—all execute arbitrary commands and could easily be misselected. The descriptions offer guidance on when to use each, but the boundaries between 'run a Main_OnCommand', 'call a ReaScript function', 'run a Lua snippet', and 'batch these together' remain fuzzy.
All names are lowercase snake_case and predominantly resource-oriented nouns, which makes the set readable and predictable. Minor deviations: a few generic names (action, status, batch) and a couple of verb forms (render, run_lua) break the pure noun convention.
14 tools is within a reasonable scope for a DAW control server covering tracks, items, MIDI, FX, envelopes, sends, rendering, and project settings. The count is slightly inflated by redundant abstraction layers (action/reaper_call/run_lua/batch) that could arguably be consolidated.
Coverage is broad: arrangement state, transport, MIDI, FX, items, envelopes, sends, routing buses, project tempo/markers, rendering, and raw escape hatches. Minor gaps remain—no explicit undo/redo control, limited take management beyond active_take, and marker/region lifecycle is only partially exposed (creation via project, deletion unclear).
Maintenance
Related MCP Connectors
Create, co-edit, analyze, publish, and export collaborative step-sequencer sessions through MCP.
Remote MCP server for audio stem separation, denoise, and reverb.
OSC ↔ MIDI bridge for synthesizers and DAWs, with the SynthHub catalogue. A MIDI MCP and OSC MCP.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables users to control and edit REAPER projects through a Python-based interface and a Lua bridge. It supports managing tracks, controlling transport, manipulating MIDI and audio items, and adjusting FX parameters within the digital audio workstation.57GPL 3.0
- AlicenseCqualityBmaintenanceEnables AI assistants to control REAPER DAW via the Model Context Protocol, including track, FX, MIDI, and audio operations.4746 PyPI87MIT
- AlicenseCqualityAmaintenanceA comprehensive MCP server that enables AI assistants to control REAPER DAW for mixing, mastering, MIDI composition, and full music production workflows with 130 tools.1802,055 PyPI97MIT
- AlicenseBqualityDmaintenanceThis MCP server enables AI assistants to control a live REAPER DAW instance, including transport, tracks, FX, MIDI, media, markers, rendering, and project state, with an escape hatch for arbitrary ReaScript commands.40MIT