reaper-mcp
This MCP server lets an agent inspect and control a running REAPER project through grouped tools, arbitrary ReaScript calls, and Lua snippets.
Check project/bridge status, tempo, play state, tracks, solo/mute and dirty state.
Control playback and recording: play, stop, pause, record, repeat, go to start.
Manage tracks: list, add, delete, update name/volume/pan/mute/solo, create submix buses.
Edit MIDI items: create, add, get, replace, update, delete notes and CC/program changes.
Manage track FX: list, add, inspect params, set params by normalized or displayed value, delete, bypass, move, load presets.
Manage sends: list, add, delete, update levels/pan/mute/mode and stereo channel routing incl. sidechain.
Manage media items: list, update fades/gain/position/length/loop/mute, import files from the REAPER host.
Read and write track envelopes, including volume envelopes in dB.
Edit project-level settings: tempo, time signature, time selection, markers/regions, save/open-path project.
Render master mixes or stems with loudness/peak measurement, solo handling and overwrite protection.
Run any REAPER command by numeric command ID.
Call arbitrary ReaScript functions by name.
Execute Lua code inside REAPER for multi-step work.
Batch many operations in one IPC round trip, with per-slot results/errors.
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 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:]. When a Gamut agent asks a question or needs an approval, the panel jumps to 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. 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, 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); see Revert a reply.
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. Each call is {func, args} or {func, code} or {func, arguments} for a grouped tool name (track/midi/fx/...). Each slot is the inner result, or {error}. One failure does not abort the rest. Handles from earlier calls work later.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is extremely transparent, detailing critical behaviors like the multiple syntax options for a single call object ({func, args} or {func, code}), the non-abortive error handling ('One failure does not abort the rest'), and its asynchronous nature ('Handles from earlier calls work later'). This is vital since annotations are absent.
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 packs a significant amount of technical detail into a compact paragraph. While slightly dense, every sentence adds value by defining the tool's core functionality and limitations.
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?
Given that there are no annotations or output schemas, this definition is highly complete. It addresses the 'how' (IPC hop), the 'what' (nested structure), and the 'under what conditions' (non-abortive failures), leaving no major gaps for the agent.
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?
With 0% schema description coverage, the description must explain the complex payload structure. It successfully details the available structures within the `calls` array items (e.g., 'Each call is {func, args} or {func, code} or {func, arguments}'), providing necessary meaning to the schema fields.
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?
Clearly defines the tool's function as grouping 'Many operations in one IPC hop.' While clear, it doesn't explicitly name the category of operations (e.g., 'macro-execution' or 'bulk command execution') compared to its siblings.
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 usage is implied—use it when you need to run multiple related operations together for efficiency. However, it doesn't explicitly state *when* to choose this over a sequential series of calls to the listed sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
envelopeB
Track envelopes. action: list | get | set. name is REAPER envelope name (Volume, Pan, Mute, ...). set replaces all 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 | ||
| 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 full behavioral burden. It does disclose important mutation semantics: set replaces all points and re-activates an inactive envelope. However, it omits other relevant behavior such as what list/get return, whether set requires the envelope to exist, and how track_index/envelope_index interact.
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 and front-loads the action modes, then moves into parameter-specific notes. It is appropriately sized, though the phrase 'value is the envelope's value' is tautological and the order of notes is somewhat ad hoc.
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 mutable 6-parameter tool with no annotations, no output schema, and no schema parameter descriptions, the description covers domain semantics well but leaves key gaps: track vs envelope indexing, list/get return behavior, and nested point fields. An agent could call set, but list/get usage remains 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 explain all six parameters. It adds useful meaning for action, name, unit, value, and points, including gain/dB scaling, but never explains track_index (including the -1 minimum) or envelope_index, both of which are critical for locating the envelope.
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 as REAPER envelopes and names the three operations (list, get, set). 'Track envelopes' alone is slightly ambiguous as a verb, but the action enumeration makes the tool's purpose clear enough to distinguish it from siblings like item, fx, 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 action modes and notes on unit=db and set behavior imply when each mode is appropriate, but there is no explicit guidance on choosing list vs get vs set, nor any statement of when to use this tool instead of sibling tools. Usage is inferable rather than spelled out.
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. 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 | ||
| 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?
With no annotations the description carries the full burden, and it does disclose useful behavior: track_index -1 addresses the master, set accepts normalized 0..1 or a display-formatted value resolved by text search, and set returns the formatted value actually applied. However, it says nothing about destructive semantics of delete, what preset does (save vs load vs recall), or whether bypass/move are idempotent or error-prone.
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?
Extremely dense telegram-style prose; every clause carries information, with the action enum front-loaded and the value-formatting rule following immediately. It reads tersely rather than bloated, though the run-on formatting of the set semantics could be split for readability.
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 eight-action, ten-parameter tool with no annotations and no output schema, the description covers the core mechanics but omits the parameter-to-action mapping, the meaning of the preset action, and any error behavior. An agent could probably invoke list or set correctly but would be guessing on move, preset, and bypass.
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 ten parameters, and the description documents only the highest-value ones: action, track_index (-1 = master), value (REAPER normalized 0..1), and formatted (unit number or label like "3.2k"). Six parameters — param, preset, enabled, fx_name, fx_index, dest_index — are left entirely to name inference, which is a real gap even if most are guessable.
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?
Names the resource (track FX) and enumerates all eight actions in a compact action: list | add | params | set | delete | bypass | move | preset, so an agent immediately knows the surface area. Sibling tools are other domains (track, item, envelope), so the resource name does most of the differentiation work, but there is no explicit statement distinguishing when this belongs to track vs item FX.
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 implies modes but there is no guidance on when to use this tool versus track, envelope, or run_lua, and no prerequisites (e.g. that an FX must be added before params/set/b bypass can target it). Nothing tells the agent which parameters are required for which action, leaving ten parameters to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itemB
Media items on a track. action: list | update | import. fade_in / fade_out are seconds (REAPER native). position/length are beats. import uses a path already on the REAPER host; as_new_track=true makes new tracks.
| Name | Required | Description | Default |
|---|---|---|---|
| loop | No | ||
| mute | No | ||
| path | No | ||
| action | Yes | ||
| fade_in | No | ||
| gain_db | No | ||
| fade_out | No | ||
| item_index | No | ||
| start_beats | No | ||
| track_index | No | ||
| as_new_track | No | ||
| length_beats | No | ||
| position_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 disclosure burden. It does valuable work by clarifying non-obvious units (fades in seconds, positions/lengths in beats) and the host-path requirement for import, but it says nothing about what update mutates, whether changes persist/are undoable, or what list returns.
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?
Dense and front-loaded: the resource and action set come first, followed by unit clarifications and the import constraint. The telegraphic style wastes no words, though the sentence fragments make it slightly harder to parse than a fully formed brief.
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, multi-action tool with no annotations and no output schema, the description never says which parameters apply to which action (does list require track_index? does update require item_index?), leaving the agent to guess at the action/parameter matrix. It also omits any description of what list returns.
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?
With 0% schema coverage across 13 parameters, the description explains the most confusing ones: fade_in/fade_out units, position/length in beats, path, and as_new_track. However, mute, loop, gain_db, track_index, item_index, and start_beats are undocumented, and the distinction between start_beats and position_beats is left ambiguous.
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 (media items on a track) and enumerates the three supported operations (list | update | import), so an agent can tell this apart from siblings like track, midi, or fx. It lacks an explicit 'this is not X' comparison, but the scope is unambiguous.
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 only implied through the action enum; there is no statement of when to choose item vs track or midi, nor prerequisites such as needing an existing track before importing. It does give one useful conditional hint (as_new_track=true makes new tracks) and a constraint for import (path must already exist on the REAPER host).
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. replace rewrites the whole take in one undo step; add only appends. cc inserts CC (cc+value) or program change (program) via ccs[]. 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 must carry the behavioral burden. It usefully discloses that times are absolute project beats, that 'replace' rewrites the whole take in one undo step, and that 'add' only appends. It still omits return format, failure behavior, and permission or track-index prerequisites.
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 compact and front-loaded: the resource and action list come first, followed by key behavioral distinctions. The telegraphic style packs a lot into a few lines without wasted sentences, though some phrasing is terse enough to be slightly cryptic.
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, seven-action tool with no annotations and no output schema, the description covers the most important action semantics and a few behavioral traits. It is not complete enough to guide correct use of many parameters or to explain return values, leaving meaningful 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 all 13 parameters. It explains the 'action' enum values, gives partial meaning to 'ccs' (cc + value, program) and 'start_beats' (absolute project beats), and notes 'get' defaults for index/channel/muted. But it leaves 'pitch', 'velocity', 'length_beats', 'item_index', 'note_index', 'note_indices', and 'track_index' unexplained.
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 ('MIDI on a track item') and enumerates all seven supported actions, so an agent can understand the tool's domain. It does not explicitly differentiate itself from siblings like item or track, but the MIDI-specific scope is clear enough.
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 provides useful guidance for choosing between 'replace' and 'add' (replace rewrites the whole take, add only appends), and explains how 'cc' inserts controller or program-change data. However, it gives no guidance on when to use this tool versus the sibling 'item' tool, nor any prerequisites or excluded scenarios.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| stems | No | ||
| bounds | No | ||
| measure | No | ||
| pattern | No | ||
| channels | 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: it discloses that there is no undo, a long timeout, that media is set online (action 40101) first, and two refusal conditions with their cause (overwrite prompt hanging the bridge, soloed tracks). The return payload and warnings are also described, including measure=false skipping the loudness scan.
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 critical facts (no undo, long timeout) are front-loaded, and almost every clause carries operational information. The middle sentences are long and stacked with parentheticals, which slightly hurts scannability, but there is very little filler.
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 14-parameter render tool with no output schema and no annotations, the description covers the mutation risk, failure modes, return shape and most parameters. The remaining gap is the four unexplained audio-format/range parameters, which an agent would have to guess at from the schema alone.
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, and it explains roughly ten of the fourteen parameters: path (output folder), pattern (file name), bounds enum, stems + track_indices, media_online, allow_solo, solo_indices/mute_indices, and measure. channels, sample_rate, start_beats and end_beats are left entirely unexplained, which keeps it from 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?
The opening 'Render.' is nearly tautological, but the following sentences make the operation concrete: rendering the master mix (or stems) to files in a folder. The distinction from siblings is implicit via 'stems=true' and 'track_indices', but no sibling tool is named, so it lands at a solid 4 rather than 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?
It states defaults ('Default: the master mix'), variants ('stems=true renders the selected tracks as stems'), and workarounds for the two documented refusals (allow_solo=true, media_online=false). It doesn't position itself against siblings like batch or action, so there is no explicit alternative routing.
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) is for slow work; REAPER is frozen meanwhile, 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 burden and does well: it discloses that REAPER is frozen during execution, the timeout default (10) and ceiling (600), that errors carry the failing line, and a concrete io.popen background-and-poll workaround. It stops short of stating that arbitrary code runs with full host privileges and can mutate or destroy project state, which is the main omission for a code-execution 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?
Four tight sentences with no filler, and the most load-bearing facts (what it runs, how to return a value, when to prefer it) are front-loaded before the timeout and freezing caveats.
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 and no annotations, yet the description covers the return channel, error reporting shape, execution blocking behavior, timeout bounds, and an escape hatch for long operations. That is essentially everything an agent needs to invoke this correctly.
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 it largely does: it explains that `code` runs with `reaper` in scope and that `return` emits a value, and it spells out `timeout` semantics (seconds, default 10, max 600, intended for slow work). It doesn't say what return types serialize cleanly or name the `code` parameter explicitly, so it isn't exhaustive.
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 a specific verb+resource ('Run a Lua snippet inside REAPER') and immediately scopes the environment ('reaper in scope') and result channel ('Use return to send a value'). The clause 'Best for multi-step work that would otherwise be many round-trips' distinguishes it from single-call siblings like reaper_call and action.
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 a clear selection rule: use for multi-step work that would otherwise require many round-trips, implying single operations should use the narrower sibling tools. It also prescribes a pattern for slow work (launch in background and poll) and states the timeout's intended use. No explicit 'do not use for X' exclusion is given, which keeps it below a 5.
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, tracks, any_solo, master_mute and dirty (unsaved changes). Call first; clear a lingering solo before rendering. detail=true adds arrangement facts (time signature, 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?
No annotations are provided, so the description carries the full behavioral burden. It discloses returned fields, clarifies that dirty means unsaved changes, and explains that detail=true adds arrangement facts, but it does not explicitly state read-only behavior, side effects, or error handling for a broken bridge.
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 and dense: it states the core status check first, then usage guidance, then parameter behavior. Every sentence contributes useful information without unnecessary padding.
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?
With no annotations and no output schema, the description must explain enough about returned data, and it does list the key status fields and the extra detail fields. It could be more complete by specifying the default detail behavior or failure mode for an unavailable bridge, but it is sufficient for correct 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?
Schema description coverage is 0% for the single optional detail parameter, so the description must compensate. It does so by explaining that detail=true adds time signature, length in beats, markers, and per-track MIDI/audio facts, though it omits the default when detail is omitted.
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, checking the Lua bridge, and enumerates exactly what state is returned: tempo, play state, tracks, any_solo, master_mute, and dirty. This makes its role distinct from sibling tools such as project, transport, and render.
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 the prerequisite 'clear a lingering solo before rendering.' It does not name alternative tools or explain when not to use this one, but the operational guidance is specific.
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.
transportC
Playback control. action: play, stop, pause, record, toggle_repeat, goto_start.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It names actions but does not describe their effects (e.g., whether 'record' starts or toggles recording, what 'goto_start' does to playback state, or side effects like project state 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 exceptionally brief and front-loads the purpose, with no fluff or redundant prose. The action list is redundant with the schema but arranged clearly.
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 simple one-parameter control tool, the description still leaves critical gaps: no explanation of action semantics, no output/return expectations, and no preconditions (e.g., whether a project must be open). An agent cannot reliably decide which action to invoke without more context.
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 merely repeats the enum values from the schema without adding meaning—'toggle_repeat' and 'goto_start' are left to the agent's inference, and the description does not explain the purpose or expected behavior of each 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 states 'Playback control' and lists six transport actions, giving a general sense of purpose. However, it is vague about the resource (e.g., DAW transport, project) and does not differentiate from siblings like 'action' or 'status'.
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 provided on when to use this tool versus the listed siblings. There is no mention of alternatives, preconditions, or scenarios where a different tool would be more appropriate.
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.
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
Most tools are grouped by clear resource domains, but several advanced tools overlap conceptually: run_lua, reaper_call, action, and batch all provide ways to execute commands or snippets. There is also mild overlap between item/midi creation and track.bus/send routing, though the descriptions generally clarify the intended use.
Tool names consistently use lower_snake_case and mostly follow a resource-oriented pattern with an action parameter. The exceptions (run_lua, reaper_call, status, batch, action, transport) are readable but prevent a perfect verb_noun-style consistency score.
Fourteen tools is well-scoped for a DAW control server. The grouped action-based tools keep the surface compact while covering tracks, items, MIDI, FX, sends, envelopes, project settings, rendering, and transport.
The surface covers the major project lifecycle operations, including status inspection, track and item editing, MIDI, FX, routing, automation, rendering, saving, and transport. The presence of run_lua, reaper_call, action, and batch provides escape hatches for operations not exposed directly, avoiding dead ends.
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 — 964 synthesizers and DAWs. A MIDI MCP and OSC MCP for controlling them.
2619MCP 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.4729 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.1801,283 PyPI86MIT
- 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