cakewalkmcp
Summary: An MCP server that drives a running Cakewalk SONAR from an AI agent — menu commands, MIDI file/live-MIDI writes, CAL macros, UIA clicks on track strips, note-edit dialog plans, and a heavy "what actually works" honesty layer (CakeScript/T1 tools are present but non-functional on current builds).
Diagnose the host first —
cw_doctor,cw_status,cw_document_state,cw_save_state,cw_list_overlays/cw_close_overlays,cw_benchmark,cw_latency.Run SONAR menu commands by id —
cw_list_commands(live vs index),cw_run_command,cw_run_command_classified,cw_command_support,cw_command_evidence,cw_verify_commands,cw_view_commands,cw_insert_commands.Document lifecycle —
cw_project(new/open/save/saveAs/close/exportAudio/importMidi/revert, destructive ones needconfirm), pluscw_file_dialogfor driving the MFC file dialog.Transport & timing —
cw_transport_command(play/stop/record/loop/metronome/tempo & meter views),cw_transport,cw_timing(posture only; state changes aren't confirmable).Navigation & markers —
cw_navigate(selection, now-time, marker insert/remove),cw_markers(writable MFC dialog + table readback).Note/audio editing —
cw_edit(quantize, transpose, split, merge, gain, normalize, reverse, fade...), with plans/proofs:cw_quantize_plan,cw_transpose_plan,cw_check_quantize,cw_quantize_dialog,cw_note_edit_help.CAL macros (free licence) to create/delete/read notes and set track name, mute, routing —
cw_cal_plan,cw_cal_run,cw_cal_help,cw_cal_cleanup.Standard MIDI files as the data layer —
cw_write_midi_file(notes, programs, CC7/CC10 baked in),cw_read_midi_file(names, channels, notes, pan/volume).Live MIDI over a virtual cable —
cw_midi_note/chord/cc/send/panic,cw_set_pan/cw_set_volume/cw_apply_mix, plus port setup:cw_midi_status,cw_midi_devices,cw_midi_config,cw_enable_midi_port,cw_mixer_targets/cw_mixer_support.Track strip read/write via real UI clicks —
cw_get_track_control,cw_set_track_mute/solo/arm,cw_set_track_name,cw_list_track_templates+cw_insert_track_template(only practical route to a plug-in chain).Tracks & inserts —
cw_add_track,cw_add_song_tracks(slow, ~19s/insert),cw_track_controls(accessibility contract for computer-use agents).Plugins —
cw_plugins,cw_find_plugin,cw_song_instruments,cw_plugin_insert_recipe(discovery works; insertion into a track does not).Undo/redo —
cw_undo,cw_redo,cw_history,cw_history_help.Project-state observation cache for computer-use agents —
cw_probe_state,cw_report_state,cw_get_state,cw_list_state,cw_surfaces,cw_ui_recipe.Pure arithmetic & job control —
cw_convert/cw_convert_help(ticks ↔ bar:beat:tick ↔ seconds),cw_job,cw_jobs,cw_job_abandon,cw_job_clear,cw_job_help.Not usable on current builds:
cw_list_tracks,cw_get_track,cw_get_clips,cw_get_notes,cw_set_track_volume/cw_set_track_pan,cw_locate(all require CakeScript/T1, which is undispatchable); plug-in insertion and automation envelopes also have no scripting route.
Provides tools for controlling a running Cakewalk SONAR DAW via MCP, including transport, views, dialogs, CAL, MIDI files, real-time MIDI, track/mixer operations, and native menu commands.
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., "@cakewalkmcpstart playback in Cakewalk SONAR"
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.
cakewalkmcp
从介绍视频过来的朋友: 下载 0.2.1 便携包,
解压并运行 双击部署.cmd,然后打开 连接提示词,
只填安装路径,复制给支持本地 MCP 的 Agent。里面也有「四小节轻快旋律+和弦+低音」、
转调、力度/时值调整与轨道整理的可复制示例。
0.2.1 prerelease: start with QUICKSTART.md and the current release notes. The detailed measurements below include historical experiments; the release notes take precedence for current limits.
The 2026-10-23 acceptance report records actual SONAR MIDI import/export, CAL editing, real-time MIDI recording, track writes and WAV rendering. A Free License session exposed working track controls after loading a CWP, so earlier paid-only explanations below are historical observations, not a reliable availability rule. Inspect the current control tree.
For Chinese CP936 SONAR, choose textEncoding:"gbk" explicitly when writing or
reading track names; UTF-8 remains the default. Import a new arrangement into
an empty CWP or open its MIDI file directly. Import into an existing selected
track can merge content and override routing/mix. Select all before a whole
MIDI export. A synth template's created track name may differ from its filename;
inspect an unverified insert before retrying it.
Upgrade from 0.2.0: its cw_save_state can incorrectly call an imported MIDI
document safe to close. 0.2.1 reads the document tab, keeps positive dirty
evidence, and refuses close-safety when the state is unknown. This observation
does not authorize discarding work. Overlay results also distinguish attempted
closes from panels observed gone; track readiness reflects exposed controls.
Tests are offline by default: npm test or npm run test:full substitutes the
DAW/MIDI process boundary with a no-host fixture, while installer fixtures still
run in real PowerShell. Only node run-tests.mjs --full --live-host may send
commands to SONAR; use a disposable project. An offline pass is not a live-host
or audible-output certification.
The optional surface listener now requires the same 64-hex CW_SURFACE_TOKEN
in the SONAR and MCP process environments. With no valid token it does not
listen. Raw memory reads and vtable calls are permanently disabled, including
when authenticated. See release notes before enabling it.
MCP server that gives an AI agent control over a running Cakewalk SONAR — transport, views, dialogs, CAL, MIDI files and real-time MIDI. This adapter detects CakeScript (T1) but does not implement its IPC dispatch; T1-only tools return an explicit error and explain available alternatives.
SONAR's automation surface has changed between builds, so this server does not assume one mechanism. It probes the running build and uses the best transport that actually works, and when a tool cannot run it says why and what to use instead, rather than timing out.
阅读指南:想安装使用 → QUICKSTART.md(中文,3 分钟);是 AI agent → AGENTS.md(工具选择与恢复手册);要部署给别人 → deploy/README.md。本文件是完整技术参考。
Architecture
ZCode / Claude / etc. MCP (stdio, JSON-RPC)
│
▼
cakewalk-mcp.js ──┬── powershell bridge (user32) ──┬── Sonar.exe
│ │
│ ┌────────────┴────────────┐
│ │ │
│ T1 window-message T2 wm-command
│ XCDLLMSERVER + WM_COPYDATA GetMenuItemID + WM_COMMAND
│ │ │
│ ▼ ▼
│ CakeScript (Lua 5.4) native menu handlers
│
└── powershell shim (winmm) ──► loopMIDI cable ──► SONAR MIDI in
T4 realtime-midiTwo PowerShell shims run side by side, both long-lived so per-call cost is one JSON round trip rather than a process start: a user32 bridge for windows and menus, and a winmm shim that holds the MIDI port handle open so sends stay flat. The Node side never touches Win32 directly. Two details make this work on Windows where the obvious approaches fail:
Every
DllImportthat takes a string is declaredCharSet.Unicode. PowerShell 5.1'sAdd-Typedefaults to ANSI, and without the attributeFindWindowW("Sonar", "Cakewalk Sonar")silently returns 0.GetMenuTreereads ids from the live process. Hardcoding them would break on the next build; the ids differ between 32.08 and 32.10.
Related MCP server: FL Studio MCP Server
Transports
The server probes these in order and reports the result in cw_status.
T1 — window-message (fastest, richest)
SONAR's own embedded LLM agent talks to the app over IPC: a XCDLLMSERVER
window plus the registered messages --*LLM_INIT*-- and --*LLM_TOOL_CALL*--.
Commands arrive as write_cakescript / run_cakescript tool calls into the
embedded CakeScript (Lua 5.4) engine, and print() output comes back.
This is the only transport that returns structured results, so every track/note/mixer tool was designed around it.
This build detects T1 but does not dispatch it. The bridge implements
status,menu,runmenu,overlays,probeandmsgids— there is noinit/toolcalloperation, so thewrite_cakescript/run_cakescriptIPC is not wired. On a host that exposes the Assistant,runTemplatefails withT1_CHAIN_UNIMPLEMENTEDrather than pretending. Everything that works here works through T2 (menu commands), T4 (MIDI) and the editing dialogs.
It only exists when the build ships the Assistant panel. SONAR creates the window lazily when the panel is first opened. Present in 2026.08 (32.08.0.040). Removed in 2026.10 (32.10.0.021) — see below.
T2 — wm-command (version-independent, fire-and-forget)
SONAR's client area is JUCE/Direct2D drawing, but the menu bar is a real Win32
menu. GetMenuItemID reads the live ids and
PostMessage(hwnd, WM_COMMAND, id, 0) executes them. Because the ids come from
the running process rather than a hardcoded table, this works across versions.
Verified working on 32.10.0.021: 0x882D Preferences, 0xE140 About,
0xA798 Video Engine Settings, 0xA783 Assistant panel toggle.
cw_list_commands and cw_run_command use this. Two caveats, both learned
from testing:
Modal panels swallow menu commands. While the Assistant / command-palette panel is open,
WM_COMMANDposts are dropped. The bridge closes those panels first (cw_close_overlays, or automatically insidecw_run_command).Registering a command is not the same as handling it. A build can list a command in its menu and its command index while shipping no handler. Posting such an id succeeds and does nothing.
cw_run_commandtherefore diffs the window list before and after and reportsnone-observedwhen nothing opened, which is how you tell the two cases apart.
T3 — computer-use (not driven by this server)
An agent with a computer-use runtime can drive the GUI directly. This process cannot, so it only reports that the option exists.
T5 — uia-click (reads and writes the track strips)
This one is new, and it is what made three long-dead tools work.
SONAR's track strips expose every control to accessibility — with a project open,
a plain UIA client sees 139 elements, 82 of them track controls, each named
<label> on Track <N> and carrying a live value. Reading that way has always
worked. Writing did not:
controls advertise AXSetValue / AXToggle / AXPress
the runtime accepts the call ......... success
the value afterwards ................. unchangedThat is true, and it is only half the picture. A real mouse event at the control's own centre does change it, and the value then reads back changed. So T5 is three things together, and all three are needed:
Locate by name through accessibility —
手动静音 on Track 3.Act with a genuine click at the element's
BoundingRectanglecentre.Verify by re-reading the value from a freshly resolved element.
native/uia/cw_uia.ps1 does all three; lib/track-ui.js drives it. Proven on
mute, solo and arm, each toggled both ways and read back changed:
{ "control": "mute", "track": 2, "requested": "打开",
"before": "关闭", "after": "打开", "clicked": "922,642",
"changed": true, "alreadyThere": false, "verified": true }verified is the field to trust: it is true only when the value read back equals
the one requested. An idempotent write reports alreadyThere: true and
verified: true without clicking — changed: false there means "already right",
not "failed", and a caller that conflated the two would retry forever.
Two things it cannot do. A track scrolled out of the Track view is refused
rather than clicked, and the refusal explains why: SONAR still reports a
BoundingRectangle for a strip outside the view's clip region, and still reports
IsOffscreen = false for it, so a click at its centre lands on whatever the window
shows there. Measured on track 58 of a 71-track project — the button reported
[905,378,33,33] while the Track view's client area began at y=474. The guard
is therefore geometric, against the CTRACKVIEW container's own rectangle; an
IsOffscreen check alone is not enough and was tried first. And sliders
(音量 / 声像 / 增益) plus the routing buttons (输入 / 输出) are not driven here —
the sliders take a value through a pattern SONAR ignores, and the routing buttons
open a picker. Use cw_midi_* for volume and pan.
A coordinate trap worth naming, because it silently breaks every click: UIA
bounds and SetCursorPos are both physical screen pixels and agree as-is, but
only from a DPI-aware process. An unaware process gets virtualised coordinates
and every click lands 1.5x off on a 150% display — which is indistinguishable
from a control that ignores clicks. native/uia/Mouse.cs calls
SetProcessDPIAware, and boundsToClick returns the centre unchanged while
boundsToRaster is the one that divides.
The PowerShell file must keep its UTF-8 BOM. Strip it and PowerShell 5.1
reads the script as the ANSI codepage; the Chinese labels are then mis-decoded,
the clicks still work, and only the comparison against the requested state fails
— so verified comes back false on a write that actually succeeded.
Two more hardening rules found the hard way. First, a synthesised click has
no owner — it goes to whatever window sits at that screen point, and every early
success happened only because SONAR was in front. Mouse.cs now checks which
process owns the point, raises SONAR once if something else is on top, and
refuses rather than clicking into the wrong application (a misdirected click is
a wrong action elsewhere, worse than a failed one). Second, the first click of a
run can be consumed activating the window; the set verb retries once and
reports attempts, and its success test is the read-back, so a click that
already worked is never repeated.
Renaming (cw_set_track_name) rides the same mechanism but is not a single
click: double-click opens the strip's name editor, the text goes in through the
clipboard (SendKeys cannot type Chinese, and track names here usually are),
then Enter. Verified by reading the strip's name back — ASCII, Chinese, and
idempotent (a name already correct is reported alreadyThere: true without
touching anything).
Plug-in chains arrive via track templates. The Plug-ins pane shows all 275
plug-ins but is drawn, not exposed — with the browser open it contains no
accessibility elements at all, so clicking into it cannot confirm which plug-in
landed. A .cwx track template avoids that entirely: it carries a whole
pre-built strip (instrument, FX chain, sends, routing), SONAR names the new strip
after the template, and cw_insert_track_template finds that name in the strip
tree as its confirmation. 184 templates ship with the content installed —
instrument chains for Bass/Drums/Guitar/Vocals, multiband chains, Session
Drummer multi-outs. One limit, stated where the tool throws it: opening the
导入音轨模板 dialog is not scriptable (0x8536 dispatches unreliably and the
menu-bar element names do not match what is drawn), so the dialog is opened by
hand first and the tool drives everything after that point.
Hardening for SONAR updates, which is the difference between a demo and a tool you can keep:
cw_doctor— one command, five transport probes, a verdict and a remedy per channel. Run it FIRST after any SONAR upgrade: it names what degraded (label text changed? surface not re-added? modal dialog holding the menu?) and what to update. Its probes carry hard deadlines, so a hung path degrades tounavailableafter 20s instead of hanging the diagnosis.Label and state words are config, not code. The strip labels (手动静音 / 独奏 / 录制), the toggle words (打开 / 关闭) and the dialog confirm word live in one word-list block in
native/uia/cw_uia.ps1, with English fallbacks (Mute/Solo/Record, On/Off, Open) tried in order, each overridable throughCW_UI_*environment variables. A UI-text change across a SONAR version is a config override, not a code edit.The minimized-window trap is detected. A minimized SONAR reports element coordinates around −21000 (measured: strip at −21132 while the window rect was at −21333). Reads still work there; no click can land.
cw_doctorreportssonarMinimized: trueand says to restore the window, instead of leaving every write mysteriouslyverified: false.The "ghost frame" state is named. On 2026.10, after external foreground operations, the Sonar.exe process can stay alive while its main frame window is destroyed — audio and MIDI keep working, every UI path is dead, and the title probe used to read the HUD's caption.
Find-SonarMainnow refuses to fall back to HUD windows, andcw_doctorreportsframeGhost: truewith the one-sentence remedy: restart SONAR.
Deploying this for someone else is deploy/: install.ps1 (prerequisites,
npm, then cw_doctor so installed means verified) and uninstall.ps1 (removes
any registration, verifies the registry is clean). There is no per-session
manual step. See deploy/README.md for the ship list and for why the
control-surface DLL — formerly a required install step with a manual re-add
after every SONAR launch — is now opt-in and unused.
T4 — realtime-midi (works on every build)
A loopMIDI virtual cable is a real Windows MIDI device, so it does not depend on
SONAR's scripting engine or on any menu command being handled. The server opens
the cable's OUT port through winmm and SONAR reads its IN port. This is the
transport that still changes a project on builds where CakeScript is gone, and
its latency is the MIDI driver's — milliseconds, independent of PowerShell.
On this machine the cable is Studio One AI Notes (MIDI out index 4, MIDI in
index 3). cw_status selects it automatically; the server also looks for any
port named loopMIDI or Cakewalk before falling back.
The receive side is scriptable — no UI needed. SONAR keeps which ports are
enabled in %APPDATA%\Cakewalk\Sonar\TTSSEQ.INI, not in the registry and not in
the project file:
[MIDI Input Devices]
0=Steinberg UR22C-1
1=Studio One AI Notes
MaxInPort=1
[MIDI Output Devices]
0=Steinberg UR22C-1
1=Studio One AI Notes
MaxOutPort=1So cw_enable_midi_port writes that file (idempotent, keeps a .bak), and
cw_midi_config reads it back. This matters more than convenience: it is the
only way to verify the receive side. A send always returns rc=0 whether or
not anything is listening, so without reading this file cw_midi_status could
only report that a port is open, never that SONAR is tuned to it.
cw_midi_status now reports sonarReceives, derived from this file.
SONAR reads the file at startup and when its MIDI Devices dialog is applied, so a change here is not live in a running session until one of those happens.
Two limits to be honest about. MIDI cannot read project state, so there is no MIDI
equivalent of cw_get_track / cw_get_notes — see the next section for how that
gap is handled. And what a message does depends on the track or control that
receives it: a CC 7 moves a fader only where something is listening for it, which
means an armed track or an ACT assignment. Nothing in the message says which.
A note on testing this: loopMIDI does not loop a cable back to the same
process. Writing to Studio One AI Notes OUT delivers to other applications'
IN — and while SONAR is running it owns that IN, so a capture opened from here
gets nothing. bridge/loopback.js can capture a cable, but only one nothing else
holds. Do not read "0 messages captured" as a broken transport; check
sonarReceives instead.
The one condition that decides everything: is a project open?
This is the single most important finding in this project, and an earlier round of this work got it wrong. SONAR builds its menu bar and its track strips from the open document:
no project open | project open | |
Window title |
|
|
Menu entries | 43 | 270 |
Menus present | 文件 编辑 工具 帮助 | + 视图 插入 处理 工程 窗口 |
Accessibility elements | 33–37 | 173 |
Track controls | none | every strip, readable |
Commands that respond | app-level only | + view, document, transport, per-track |
An earlier measurement was taken with no document open. It saw 43 menu
entries, concluded the 视图 menu and the CakeScript group were "registered
without handlers", and wrote that CakeScript had been removed from the build.
All of that was an artifact of the empty state. With a 16-track project open,
视图 > CakeScript View, 处理 > 运行 CakeScript 程序 and 视图 > AI Assist all
respond — they open the membership panel on a free licence, which is a different
finding from "nothing happens".
cw_document_state reports which case you are in, read from the caption. It is
the first thing to check when a command appears to do nothing.
Reading tracks works; writing needs a different transport
With a project open, the accessibility tree exposes every track control under
the name "<label> on Track <N>":
slider "音量 on Track 1" = "101" actions=[AXSetValue]
slider "声像 on Track 1" = "0% 中" actions=[AXSetValue]
button "录制 on Track 1" = "关闭" actions=[AXToggle,AXPress]
button "输出 on Track 1" = "1-Steinberg UR22C-1"
button "输入 on Track 1" = "全通道"
button "手动静音 on Track 1" = "关闭"Reading is accurate. Writing through accessibility does nothing. A survey across 3 tracks and 15 controls (声像 / 音量 / 力度+ / 手动静音 / 独奏) attempted a write on each: every call was accepted, none changed the value, and a screenshot confirmed the button state was genuinely unchanged rather than a stale read. SONAR's accessibility layer reports mixer state for screen readers; it does not accept it.
So the working split on this build is:
Want | Use | Why |
read track/mixer state | accessibility ( | accurate snapshots |
change volume / pan |
| reaches the engine, not the UI |
change project structure |
| insert commands are dispatched |
write notes |
| no note-level element exists |
edit existing notes |
| the dialog accepts writes; the export proves it |
create / delete notes |
| CAL is a note-level API and is not paywalled |
read notes |
| no side effect; every field, every note |
Setting volume and pan: two verified paths
Path 1 — live CC over the cable (cw_set_pan, cw_set_volume, cw_apply_mix).
CC7 is volume, CC10 is pan (0 = hard left, 64 = centre, 127 = hard right). The
message is addressed to the MIDI channel the track listens on, which is not
its position — read it from the strip's MIDI 通道 on Track N value. A channel
message only applies where a track is listening (armed, channel-assigned, or
bound to ACT); without a destination it is delivered and dropped.
Path 2 — bake the values into a .mid and import it. This is the more reliable
of the two because it needs no live routing. cw_write_midi_file emits CC7/CC10
at tick 0, which SONAR adopts as the track's initial volume and pan.
Verified end to end. A file written with:
Melody ch1 program 0 volume 100 pan 64 (centre)
Bass ch2 program 33 volume 112 pan 33 (49% left)
Pad ch3 program 89 volume 86 pan 99 (56% right)imported into SONAR and read back from the track strips:
Track 1 声道=1 音色=Acoustic Grand Piano 声像=0% 中 音量=100
Track 2 声道=2 音色=Electric Bass (finger) 声像=48% 左 音量=112
Track 3 声道=3 音色=Pad 2 (warm) 声像=56% 右 音量=86Channel, GM patch name, pan position and volume all matched. SONAR routes a
CC to the track carrying that channel, so a track's notes, program change and
CCs must all share one channel — cw_write_midi_file checks this and warns
rather than writing a file whose mix lands on the wrong strip.
The data level
There are no note, clip or event elements anywhere in the accessibility tree
— verified across a live 3-track project. What is exposed is the track-control
layer, not the data layer. On a build with no CakeScript transport, a .mid file
is therefore the only way to move notes in or out:
Tool | Direction |
| compose notes and CCs, write a format-1 file, import it |
| parse a file — track names, channels, note counts, CC7/CC10 with the pan position spelled out |
Import is fully scriptable: 0xE101 (文件 > 打开) opens a standard MFC dialog,
and its filename field does accept AXSetValue — the contrast with the
track strips is what shows the limitation is in SONAR's drawn controls, not in
accessibility as such.
Two mechanics worth knowing:
Coordinate spaces differ. Element bounds come back in window pixels (1920×902 here) while a click needs render-frame pixels (1280×601). Divide by
windowWidth/frameWidth(1.5). Passing bounds straight through is refused asoutside 1280x601.Values go stale. A second read of the same element can return the old value after an action. Confirm changes from a fresh screenshot.
Driving SONAR's UI (measured)
Not everything is reachable, and the split is not obvious. What was actually tested on 32.10.0.021 with a computer-use runtime:
Surface | Reachable? | How |
Menu bar (文件/编辑/工具/帮助) | yes |
|
Standard MFC dialogs (Preferences, any | yes | read elements by index; |
Project views (track list, mixer, piano roll) | no | drawn with Direct2D; nothing in the tree — read from pixels |
JUCE dialogs (Quick Start, 新建工程文件, palette) | partial | only title + close button appear; click by screenshot coordinate |
Keyboard | no | synthetic key events are swallowed by SONAR |
Two of those are worth spelling out because they cost the most to discover.
The menu bar works even where WM_COMMAND does not. Expanding 文件 makes
every entry appear as a clickable element — including 新建(N)..., which opened
the new-project dialog. The 视图 menu and the CakeScript group are the same
kind of command that WM_COMMAND cannot reach, so this is the path to them.
Synthetic keystrokes do not reach SONAR. Alt+1, Ctrl+Shift+I, typing
into a panel — all swallowed, repeatedly, with the window verified foreground via
SetForegroundWindow and an input-thread attach. Do not script SONAR by
keystroke. Click elements, or click coordinates.
When the UI locks up
A JUCE modal dialog holds SONAR's UI thread. While one is open:
computer-use calls time out (observed repeatedly)
WM_COMMANDto the main frame is silently dropped
Recovering needs Win32, against the dialog's own hwnd — in this order, checking after each:
SendMessage(hwnd, WM_COMMAND, 2 /* IDCANCEL */, 0)
SendMessage(hwnd, WM_COMMAND, 1 /* IDOK */, 0)
SendMessage(hwnd, WM_CLOSE, 0, 0)WM_COMMAND/IDOK is what cleared the stuck dialog that was blocking everything.
WM_CLOSE alone did nothing to it.
Recipes for the operations that need the UI
cw_probe_state carries these alongside the read plan. They are written from
having done them, including what failed:
newProject — Quick Start's caret, or 文件 > 新建. The 新建工程文件 dialog is JUCE: read the form from a screenshot. Pick a multi-track template (16-Track, 4-Track) — an empty one leaves nothing to arm.
确定stays disabled until位置exists on disk, and the dialog does not always re-validate after the directory appears, so it may need a field re-touched.armTrackForMidi — enable the cable (
cw_enable_midi_port), then arm a MIDI track's R button, or assign the input to ACT. Without an armed destination the messages are delivered and valid but have nowhere to go.insertMidiTrack — needs the Track view open first.
Plugins: discovery works, insertion does not
Detection is accurate and covers three sources, because SONAR registers plugins in three different places and reading only one made searches disagree with SONAR's own plugin browser:
Source | Count | What it holds |
Registry inventory, named | 653 |
|
Registry inventory, scanned but unnamed | 293 | real and loadable — |
Menu layout only | 262 | the DX-era effects ( |
Searchable total | 1208 |
A spot check across formats returns 12/12: Archetype Mateus Asato (VST3),
EZdrummer 3, Kontakt 8, Massive X, Boost11 (DX), Compressor/Gate (DX),
Melodyne, Battery 4 and others — each with its format, kind, and whether the
file is still on disk.
Two read optimisations worth noting. The inventory read was 10 415 ms with
reg query /s (which recurses into all 946 subkeys for their values) and 74 ms
with the top-level query (which returns the subkey names, where the path and
plugin name already live). CLSIDs are now fetched per-plugin at ~10 ms when
actually needed.
What cannot be done: attaching a plugin to a track
Measured on 32.10.0.021, and this is a real limitation:
Step | Result |
Open the plugin browser ( | works — a JUCE panel docks on the right with a category tree |
Expand a category | works — Dynamics lists |
See each plugin's format | works — rows are tagged |
Read which plugin is selected | works — the status bar reports |
Insert it onto a track | does not work — single click, double click and drag all leave the FX bin empty |
The reason is consistent with everything else here: the plugin panel is drawn,
not laid out. The window reports 144 accessibility elements whether the browser
is open or closed — the category rows, plugin rows and the 音源架 / Fx Audio FX
tabs carry no elements at all. And the track strips expose no FX-slot element
either, so there is nothing to drop onto by name.
cw_plugin_insert_recipe reports this. The workarounds, in order of how well
they work:
Insert the plugin by hand — fastest and most reliable.
cw_add_track— inserts a track with SONAR's default instrument attached, which is enough to hear a MIDI part.Write the part as a .mid — the program change picks a GM sound, so a recognisable instrument plays without loading any plugin at all. This is how the song in this repo gets its piano, bass and pad.
Mixing: what is reachable
Track volume and pan are readable through accessibility and not writable (see the survey above). Two levers actually move them:
Lever | Status |
Live CC7/CC10 over the cable ( | reaches SONAR, but does not move the strip unless the track is monitoring that channel — and arming cannot be set through automation either |
CC7/CC10 baked into a .mid, then imported | works, verified end to end |
The distinction is not obvious and cost time to establish: a live CC is delivered
to SONAR and reported ok, so it looks like it worked. Reading the strip back
after sending a mix showed the old values still in place — the message had gone
nowhere because nothing was listening.
Measured end to end. A file written with:
Melody ch1 program 0 volume 100 pan 64 (centre)
Bass ch2 program 33 volume 112 pan 46 (29% left)
Pad ch3 program 89 volume 78 pan 82 (29% right)imported and read back from the strips:
Track 1 声像=0% 中 音量=100 音色=Acoustic Grand Piano
Track 2 声像=28% 左 音量=112 音色=Electric Bass (finger)
Track 3 声像=29% 右 音量=78 音色=Pad 2 (warm)Volume matched exactly on all three; pan matched to within SONAR's rounding.
A gotcha that will bite anyone iterating on a generated file: opening a
filename that is already the loaded document does nothing — SONAR treats it as
already open and skips the reload. Verified by rewriting song.mid with new
values and re-opening it (strips unchanged), then copying to song-mix-v2.mid
and opening that (new values appeared immediately). Write to a new filename each
time, or close the document first.
On the honest limits of "mixing" here: with no way to insert plugins, there is no
EQ, compression or reverb to dial. What remains is the balance — level and
placement of the parts. mix.mjs writes a full arrangement with that balance
baked in.
Coverage: what is exposed, and where the gaps really are
Measured by taking SONAR's own command index (1208 searchable entries, of which 257 appear in the live menu bar) and subtracting what the adapter exposes. The gaps fall into two very different kinds, and telling them apart is most of the work:
Area | Commands | Exposed | Why the rest is missing |
Transport / timing | 32 | 14 | the rest are transport buttons — no elements, no readback |
Project files | 28 | 9 | export and import need a selection; the rest are covered |
Track management | 64 | 11 | most are per-track menu items with no distinct capability |
Views | 84 | 9 | opening a view is one operation; the other 75 are layout variants |
Note / MIDI | 39 | 4 | note-level data has no accessibility surface at all |
Selection / navigation | 63 | 12 | added this round — see below |
Markers / arranger | 46 | 12 | markers added; the arranger is unprobed |
Mixing / routing | 22 | 2 | sends and buses are drawn — readable, not writable |
Editing | 30 | 3 | most need a selection first, and several are destructive |
Plugins | 24 | 0 | insertion cannot be driven — see the plugin section |
Two of those deserve spelling out, because "not covered" means something different in each case.
Note-level data has no surface — for READING. It does for WRITING. A
project's notes are drawn in the clip area and there is no Note element
anywhere in the tree — verified across a 3-track project. That is why
cw_write_midi_file / cw_read_midi_file exist: a .mid file is the only way
notes cross the boundary.
An earlier version of this section stopped there and implied notes could not be
edited either. That was wrong, and the cost of the mistake is worth recording:
the claim was copied from the reading limitation without being tested. Editing
notes works, through the dialog behind 处理 > 量化 — see
Editing notes. Reading
them still has no surface, so the only way to confirm an edit is to export and
parse the file, which is what the adapter does.
Editing commands are precondition-gated. 量化 / 移调 / 拆分 probed as
unconfirmed — but an edit command on an empty selection is expected to do
nothing, so unconfirmed here does not distinguish "broken" from "nothing was
selected". Satisfying the precondition turned all three into open dialogs; see
the next section.
What this round added
Markers, and the pattern behind them. 工程 > 插入标记 (0x807F) opens a
standard MFC dialog titled 标记, and accessibility can write to it:
// 13 textfield "名称(N):" => setValue "Intro"
// 10 textfield "时间(T):" => setValue "1:01:000"
// 5 button "确定"That created a marker, which was then read back from the marker list — 视图 > 标记 shows a table with columns 时:分:秒帧 / Lk / 小节:节拍:嘀嗒 / 音高 / 名称,
and a table is readable. So the round trip closes: write through a dialog, read
through a table.
That is the generalisable finding. SONAR's own controls are drawn and ignore writes; a dialog behind them is not. Whenever a drawn surface has a command that opens an MFC dialog, use the dialog — it is the one place writes land.
Selection and navigation. cw_navigate covers 19 commands across selection
(all / none / by time / from-now / to-now / to-end), now-time movement (next and
previous bar, next and previous marker) and markers (insert, project start/end,
remove). Each record says how it can be confirmed: dialog for the two that open
one, screenshot for the rest, with what to look at named — because a selection
and a now-time change are drawn and this process cannot see either.
cw_markers carries the dialog's element names, the readback path, and the limit:
deleting a named marker has no command and no dialog — only the project
start/end markers have remove commands. Removing an arbitrary marker needs the
list UI.
The editing layer, and why "nothing happened" has three causes
This round found the other half of the measurement problem. Probing 量化 / 移调 /
分割剪辑 with no selection reported unconfirmed for all three — and the tempting
reading was "these do not work". They work. An edit on an empty selection is
supposed to do nothing:
no selection 0x8061 处理>量化 unconfirmed
after 编辑 > 选择 > 全部:
0x8061 处理>量化 opens #32770 「量化」
0x8066 处理>移调 opens #32770 「移调」
0x8012 分割剪辑 opens #32770 「分割剪辑」All three dialogs are standard MFC, so their fields accept AXSetValue — the
same property that makes the file and marker dialogs writable. cw_edit
satisfies the selection precondition automatically, which is the difference
between a command that looks broken and one that opens its dialog.
So a probe result of "nothing happened" has three causes on this build, and only one of them is a limit of the adapter:
Cause | How to tell | What it means | What to do |
| it is a toggle, transport action, selection or fader | it worked; the result is pixels | confirm with a screenshot |
| it is an edit, an export, or acts on a selection | the command is fine, the state was not | satisfy the precondition and retry |
| a | needs a paid tier on this install | report it and stop |
cw_no_effect_causes carries this taxonomy. The third cause is new: two arranger
commands (添加编曲音轨 0xA63B, 复制编曲音轨 0xA63E) open the membership panel,
which is a licence gate rather than a missing feature — an arranger track
nonetheless appeared in the tree, so the arranger itself is present.
Destructive edits (split, merge, normalize, reverse, remove-silence, fade) require
the caller to name the command, on the same reasoning as cw_project:
cw_edit({command:'normalize'}) is refused; {confirm:'normalize'} runs.
Editing notes: the one round trip that proves itself
This is the only place in the adapter where a change to project data is both made and verified, so it is worth spelling out end to end.
Notes cannot be read through any automation surface. They can be edited, because the edit commands open real MFC dialogs and accessibility writes to those land. That splits the problem in two: make the change through the dialog, prove it from the file.
编辑 > 选择 > 全部 0x804C gives the edit something to act on
处理 > 量化 0x8061 opens #32770 「量化」 — 46 readable elements
AXSetValue 时值(U): 43/textfield "16 分音符" ← the textfield, NOT the combobox at 41
AXSetValue 强度(S): 31/textfield "100" ← must be set explicitly; it persists
AXSetValue 灵敏度(W): 25/textfield "100"
AXPress 确定 11/button commits; the close is ASYNCHRONOUS
文件 > 导出 > 标准 MIDI 文件 0xA659 writes 保存副本 → the tick positions are now data
cw_read_midi_file reads them backThe measurement, with a control group. A test file was written with eight notes deliberately off every grid:
ticks | on the 16th grid? | |
written by us | 30 530 935 1477 1877 2461 2862 3404 | no |
exported with no edit | 30 530 935 1477 1877 2461 2862 3404 | no |
quantized at 100% | 0 480 960 1440 1920 2520 2880 3360 | yes |
The middle row is the control, and it is what makes the bottom row mean
something: export alone moves nothing (zero drift), so every tick in the third
row is the edit. cw_check_quantize reproduces the third row from the first by
arithmetic alone.
Two mistakes, both recorded because both produced a wrong answer.
Measuring too early. AXPress on 确定 is accepted, the dialog closes, and the
window list is checked in the same breath — which still shows the dialog. The
obvious reading is "the press did nothing". It did. The close is asynchronous;
wait, then look.
No control group. The first run used the dialog's persisted default of 50% strength, which moves each note only part of the way to the grid: 30 → 16, 530 → 506, 935 → 948. Those deltas (10–30 ticks, mixed directions) look exactly like export rounding noise, and "quantize is broken" was the conclusion — until exporting the same file with no edit returned the source ticks unchanged. That control made the movement real, which pointed at the strength setting, which was the actual cause.
How well "half way" actually describes 50% is worth stating precisely, because
the model in predictQuantize is linear and the measurement is not quite:
source | measured @50% | model | difference |
30 530 935 1477 1877 2461 2862 3404 | 16 506 948 1460 1899 2432 2872 3383 | 15 505 948 1459 1899 2491 2871 3382 | 1 1 0 1 0 59 1 1 |
Seven notes agree to within a tick of rounding. One — the 2461 → 2432 case —
does not, by 59 ticks. One sample cannot say whether that is 灵敏度
interacting with strength, a grid-line tie, or something else, and fitting a
constant to it would be inventing precision. So the model is marked exact only
at 100% strength (where it matched all eight notes) and approximate otherwise.
That labelling is what keeps a mismatch at partial strength from being read as a
failure.
The general rule this leaves behind: when a change looks like noise, export a no-edit control before concluding anything. It costs one file write.
cw_note_edit_help carries the whole procedure, cw_quantize_plan states the
field writes for a given setting, and cw_check_quantize judges a result from
two tick lists.
What is still not established: only 量化 has been measured field by field. 移调 and 分割剪辑 open the same class of dialog and should behave identically, but their element indices are not recorded. Checkbox state inside the dialog is not exposed either — which boxes are ticked must be read from a screenshot.
A measurement trap worth knowing: the window diff is blind
cw_verify_commands decides a command worked by diffing the top-level window list.
That test cannot see a change that happens inside the existing frame — which is
most of SONAR's UI. Probing the uncovered commands showed the cost directly:
Command | Window diff | What actually happened |
| no change | a tempo track appeared ( |
| no change | the track view repainted |
| no change | it is a toggle — it can never open a window |
An earlier round read "no window change" as "nothing happened" and concluded several commands were unhandled. That was a measurement artefact, not a property of the build.
The fix is not a better heuristic — it is admitting the limit. From this process,
a non-window-changing command cannot be confirmed. cw_command_evidence
records which commands are confirmed and which are not, grouped by what kind of
change they make, and names the witness that would settle each unconfirmed one:
Evidence class | Who can observe it | Example |
| this process |
|
| computer-use runtime |
|
| computer-use runtime |
|
| nobody — posting is not confirming | any toggle with no readback |
cw_run_command_classified returns confirmed / did-nothing / unconfirmed
with the class behind it, instead of claiming success from "nothing errored".
Transport and timing
The transport buttons are the one surface no automation reaches: they are drawn, so they carry no elements, and computer-use key events need SONAR frontmost. What is reachable is the command layer:
Command | id |
播放/停止 / 停止 / 录制 |
|
循环开关 / 设置循环选区 |
|
节拍器(回放 / 录制) |
|
视图 > 速度 / 拍号调号 |
|
插入速度变更 / 拍号变更 |
|
Every one changes state without opening a window, so cw_transport_command
posts and reports intent — it does not claim the transport moved. It returns the
expectedVisibleEffect naming what a runtime should look at.
For tempo and time signature specifically, there are two routes and they are not
equivalent. Writing them into a .mid and importing sets the piece's tempo map
exactly with no interaction (verified: a file written at 120 BPM imported and the
transport reported 120.00 / 4/4). Inserting a change at the now-time is a
different operation and only affects the position it lands on.
Document lifecycle, with a guard on the destructive parts
cw_project runs new / open / save / saveAs / close / exportAudio / importMidi /
revert. The commands that discard work require the caller to name what it is
destroying:
cw_project({ command: 'close', confirm: 'close' }) // runs
cw_project({ command: 'close' }) // refused: NEEDS_CONFIRMATION
cw_project({ command: 'close', confirm: true }) // also refusedA bare boolean is deliberately not enough — the point is that the caller has to
say which command it means. This guard exists because probing closed the open
project with no prompt at all (a clean project closes silently) and there was no
undo. cw_save_state reports the modified flag first, so a caller can see what is
at stake before choosing.
Reading project state on 2026.10
This build exposes nothing about project content through any automation interface. Verified on 32.10.0.021:
Interface | Result |
| empty string — no track, clip or mixer text anywhere |
UIA | 19 elements, all containers ( |
MSAA | control bars only, ≤16 children |
computer-use on the main view | 31 elements: menu bar, toolbar captions, pane names — no project content |
computer-use inside the Preferences dialog | 136 elements, fully readable and clickable |
The split is the useful part: standard MFC dialogs are fully automatable — that is how the MIDI input port was enabled, by reading the checkbox rows and toggling them — while project views are drawn, not laid out as windows, so they are invisible to every accessibility client and only readable as pixels.
The server therefore does not pretend to read state. Three tools handle the gap:
Tool | What it does |
| A plan for a topic ( |
| Accepts what a computer-use agent observed and caches it, in the same shape the CakeScript tools returned ( |
| Read the cache back, with staleness (30 min) and an explanation when empty. |
| Reference: every surface that carries state and what can be read from each. |
This keeps the MCP server's job honest — it automates what is automatable — and leaves the pixel reading to whatever agent has a computer-use runtime, with the knowledge of where to look shipped from here.
Status as of SONAR 2026.10 (32.10.0.021)
Tested 2026-10-12. What is true, after correcting an earlier misreading:
The 助理 (Assistant) menu entry opens the command palette, not an AI chat panel.
XCDLLMSERVERis never created, so thewrite_cakescript/run_cakescriptIPC has nowhere to land. The T1 transport is gone.The CakeScript commands are not gone. They are absent from the menu bar only because no project was open at the time. Open one and
视图 > CakeScript View(0xA797) and处理 > 运行 CakeScript 程序(0xA78D) are both present and both respond — on a free licence they open the membership panel. Whether CakeScript would actually run on a paid licence could not be established on this machine.
Both halves of that were re-checked against the binary and the live UI later, and the picture is firmer than "the entry point is gone":
write_cakescript(6 hits),run_cakescript(5),get_project_summary(7) andCakeScript(3,704) are all present as string literals in Sonar.exe, together with their full tool descriptions (invalid_tool_call,permission_denied,script_write_failed, …) and anAnthropicAPI URL.The engine is bound via sol2: the binary is full of
sol::detail::ctti_get_type_name<CakeScript::ITrack>/IClip/IMIDIEventAdv/IAutomation/IArrangement/ITakeLane/IClipboardsymbols, plus the literalLua 5.4.XCDLLMSERVERstill appears once as a string, but no such window is ever created, andLLM_INIT/LLM_TOOL_CALLdo not appear as literals at all — they areRegisterWindowMessageids, which is why scanning for them finds nothing. (An earlier note in this project claimed "24--*LLM_*--registered window messages"; that was wrong and is corrected here.)Posting
0xA78Dwith a project open raises aJUCE_1a13a4b5ecfwindow titledPaywallWindow, whose rendered content is the Sonar Membership upsell ("Unlock Sonar's complete toolset and features with Membership" — unlimited samples, Pro guitar tools, Elastique Pro, POWR dithering, early access).
So the correct statement is gated, not removed. The distinction is not
pedantic: a licensing gate lifts with a subscription, while a removed engine
needs a new build. And it explains the shape of the rest of this adapter — the
whole reason the editing dialogs (AXSetValue on #32770) and the MIDI cable
carry the write path is that the one broad, structured API is behind that panel.
What the paywall actually blocks — and what it does not
The licence banner is visible in the app: Free License Upgrade your experience with Membership, with a Get Membership button. On that licence,
处理 > 运行 CakeScript 程序 opens the upsell instead of a file chooser. So the
question that matters is: which capabilities are lost with it?
The answer came from SONAR's own command index. cwsearch.dat (SQLite, at
%APPDATA%\Cakewalk\Sonar\) holds 1,315 rows; 481 carry a live CMD_ID
— a Win32 menu command id, postable with WM_COMMAND — and 186 of those are
on the running build's menu bar right now. The index also has a SCRIPT_CMD
column naming the CakeScript verb behind each id, so the paywalled API can be
matched, entry by entry, against what the menu can reach anyway.
Mining the 处理 (Process) menu for rows with a live id gives 30 commands,
and roughly a third of them are note-level processors. Every one of the nine
below was opened on 2026-10-15 and its field table recorded; four were driven end
to end and the result read back out of an exported file:
Command | id | What it does to notes | Measured |
量化 Quantize |
| start times → grid | round trip verified |
移调 Transpose |
| pitch by an interval (signed) | round trip verified |
力度 Scale Velocity |
| velocities, as a percentage ramp | round trip verified |
音长 Length |
| durations and/or start times, scaled | round trip verified |
倒置 Retrograde |
| mirrors the pitch contour in place | round trip verified |
时间匹配 Fit to Time |
| stretches the selection to a target end time | fields |
律动量化 Groove Quantize |
| timing/duration/velocity against a groove | fields |
移动 Slide |
| shifts events by a signed amount in a chosen unit | fields |
轻移 Nudge ×8 |
| pitch (up/down) and time (left/right) | no dialog; step sizes measured |
查找/更改 Find/Change |
| selects events by a filter — it does not edit | fields |
This corrects the project's earlier claim that note editing needs CakeScript. It does not. Note editing has been reachable all along through these commands.
The verified four, with the arithmetic that makes them proofs rather than
impressions. Source material was a generated C-major scale at
60,62,64,65,67,69,71,72, velocities 100, durations 400 ticks on a 480 grid:
量化 — source ticks
30 530 935 1477 1877 2461 2862 3404at 100% became0 480 960 1440 1920 2520 2880 3360; a no-edit control export showed zero drift.移调 — wrote
3into数量(A)(element 25), pressed 确定, exported:63,65,67,68,70,72,74,75— every note +3 semitones, control unchanged.力度 — wrote
50into both开始(B)(element 9) and结束(E)(element 7), pressed 确定, exported: every velocity100 → 50.音长 — wrote
50into按照(B)(element 24) and pressed 确定: every duration400 → 200and every start tick0,480,960… → 0,240,480…, because时值(D)and开始时间(S)are both ticked by default. A caller wanting only the durations to change must untick element 27 first.倒置 — no dialog at all. Afterwards the pitches read
75,74,72,70,68,67,65,63at the same ticks: it mirrors the pitch contour and leaves the rhythm alone. The earlier description ("reverses the order of the notes") was wrong, and 倒置 is fully automatable without any GUI runtime.
Two corrections the measurements forced
Both were plausible-sounding claims that survived review and were still wrong.
查找/更改 is a selector, not a replacer. The record said "batch-replaces event
properties". Opening it shows a dialog titled 事件过滤器 - 搜索 with 141
elements: per-event-type rows (音符, 控制器, RPN, 弯音轮, 音色 …) each carrying
包含/排除 checkboxes and min/max ranges for 音高, 力度, 时值, 通道, 拍 and 嘀嗒.
It narrows a selection for another command to act on. Nothing in it modifies an
event.
轻移 > 设置 is not a nudge dialog — it is the global preferences window.
Posting 0x8532 opens 参数设置 on its 轻移 page. The three steps are
independently configurable, not a small/medium/large ramp:
轻移 1 = 10 毫秒 轻移 2 = 1 帧 轻移 3 = 2 帧each with 绝对时间 / 音乐时间 / 使用对齐设置 radios. That explains something that had looked like a broken command: a nudge appears to do nothing because step 1 moves 10 ms, far below one MIDI tick at ordinary tempos. It is also a preference write, which undo does not cover and which outlives the project — so the command is marked destructive with that reason stated.
The one limit that shapes all of this
Every number in these dialogs is backed by SONAR's CC:SpinCtrl, and the
Edit beside it is a shadow control. A raw WM_SETTEXT on that Edit reads
straight back — and then GetWindowText on the same handle returns empty again,
because the value the dialog uses lives in the SpinCtrl. The write must go
through an accessibility runtime (AXSetValue, or computer-use's setValue),
which is exactly what the field tables are for, and why a pure-Win32 path cannot
replace one.
A companion finding that makes this cheap to exercise: these dialogs open regardless of whether the selection contains anything. Select-all on a project whose tracks are all empty still opens 量化 and 移调 with every field readable and writable. Only the commit needs real notes to be meaningful.
What each capability actually needs
Capability | Requirement |
Track / note / mixer tools ( | T1 — unavailable on 2026.10 |
Note editing with a dialog (quantize, transpose, velocity, length, fit, groove, slide) | a selection + an accessibility runtime — no CakeScript, no licence |
Note editing without a dialog (retrograde, nudge ×8) | a selection — posting the id is the whole operation |
Creating, deleting and reading notes | CAL — a selection + the file dialog. No licence. See below |
Selecting events by filter ( | a project open; it changes no data |
| a project open, for the view/document commands |
| the cable enabled as a SONAR input — verified via TTSSEQ.INI |
Reading track state | a project open + a computer-use runtime |
Changing track state | MIDI; the UI path is read-only |
Track rename, mute, channel/port routing | CAL's track builtins — no licence |
Solo / record-arm | selection-based menu commands ( |
Undo / redo / inspect the undo stack |
|
Plugin insertion | no scripting route; a control-surface COM plugin can set it by strip index |
Two rows carry the weight. Nine note operations are available on a free
licence through the edit dialogs, five verified end to end, and two of those
(倒置 and the nudges) need no GUI automation at all — they are plain
WM_COMMAND posts. And CAL closes the three gaps the dialogs cannot reach:
creating, deleting and reading notes. That is a far larger surface than "no note
editing", which is what this project claimed before measuring.
CAL — notes can be created, deleted and read on a free licence
The 处理 menu has a second macro language, and it is not behind the
paywall. 处理 > 运行 CAL 程序 (0x806A) opens an ordinary file dialog listing
*.CAL — not the membership panel that 0xA78D (CakeScript) opens — and the
interpreter behind it reads and writes note data directly.
Measured 2026-10-15, every result read back out of an exported .mid parsed by
cw_read_midi_file. Source material was a generated C-major scale,
60,62,64,65,67,69,71,72, velocities 100, durations 400 ticks:
Operation | CAL | Result |
modify |
| 8 notes, every velocity |
create |
| 8 → 32 notes; each new pitch exactly |
delete |
| 32 → 16; exactly the 16 above the threshold, none left |
read | summary written into the track name |
|
cw_cal_plan writes nothing and posts nothing; cw_cal_run writes the script
into the CAL folder, posts 0x806A, and reports the dialog steps for an
accessibility runtime; cw_cal_help carries the language reference.
The language, as far as the 37 shipped scripts establish it
There is no CAL documentation on this machine — no help file, no reference, and the CakeScript guide mentions CAL only as what CakeScript replaced. Everything below is read out of the scripts themselves, and where a thing is not observable there it says so rather than guessing.
Structure. A sequence of parenthesised expressions. The
prolog / body / epilogsplit in the shipped scripts is a convention, not grammar: the body slot is re-evaluated once per selected event, and a script may equally be one(do …)or one bare(if …).TICKINFO.CALproves the body slot is a slot — it putsNILthere with a comment saying this makes the routine run once instead of per event.(forEachEvent expr)is the explicit form;LEGATO.CALuses both.Variables.
(int name init),(dword …),(word …),(string …). A prolog variable persists across the walk — that is the only cross-event state, andSINGLE.CALuses it (with a-1sentinel) to reach the previous event's fields, which no builtin offers.Fields.
Event.Kind,Event.Time,Event.Chan,Note.Key,Note.Vel,Note.Dur,Control.Num,Control.Val,Wheel.Val,ChanAft.Val.Event.KindandEvent.Chanare read-only in every shipped usage;Event.Time,Note.Key,Note.Vel,Note.DurandControl.Valare written. Observed kinds:NOTE,CONTROL,WHEEL,CHANAFT;KEYAFTandPATCHare addressable through the filter API though no script branches on them.Arithmetic is integer —
/truncates, which is why every percentage in the shipped scripts is(* x pct)followed by(/ … 100).++ -- += -= *= /=return the new value, so they nest inside an expression.Reporting is the weak point. The only outputs are
message(status line) andpause(modal), and no shipped script writes a file. So a note list cannot come back as text: a string accumulated across the per-event walk does not survive it — measured, the count arrived and the data did not.
The trap that silently corrupts output
insert resets the in-flight event's fields. HARMONYZ.CAL says so in a
comment: "insertion reset Event.Time during the building of the same chord."
Any field read after the first insert is not the value that was there before it,
so a second and third insert land at the wrong time — with no error, just
misplaced notes. Every generated script copies Event.Time/Chan and
Note.Key/Vel/Dur into variables before its first insert, and a test
asserts that ordering (test/cal-script.test.mjs).
Two smaller ones: durations are 16-bit and wrap at 65535 (recorded in
STRUM-IT.CAL), and pause/getInt are modal, so no generated script prompts.
Reading notes back
Three options, in order of preference, and the reasons are not symmetric:
Export and parse —
0xA659thencw_read_midi_file. No side effect, already verified, and it returns every field of every note. This is the answer for reading note data.queryNotes— encodes a fixed-format summary into the track name, which is readable from an export. It works, but it renames the track, socw_cal_runrefuses it withoutallowRename: true.Returning a note list as text from CAL — measured to fail, and recorded as such rather than left as an implied possibility.
Two operational notes about running CAL
A run leaves a file behind. cw_cal_run writes MCP-<program>.CAL into the
real CAL folder — the same folder that holds the 37 shipped scripts. The name is
derived from the program, so a re-run with the same parameters overwrites rather
than accumulating, and identical content is detected and skipped
(changed: false). It still lands among the stock scripts, so anything listing
that folder will show it; delete it when done with removeScript or by hand.
The dialog's filename field index is not stable. Measured twice on the same
dialog: the 文件名(N): textfield was element 33 in one observation and
32 in the next, because a shell control appears or disappears while the
folder list loads. The 打开(O) button held at 26 both times. So the plan tells
a runtime to resolve the textfield by property — title 文件名(N):, kind
textfield, with a set-value action — rather than by the number, and a test
pins that instruction. Trusting the index would fail intermittently, which is
worse than failing outright.
The gaps the paywall really does hold
Three of the four things this section used to list turned out not to be gated, and the reasoning that put them here was wrong in a way worth recording, because it was wrong twice over.
The original argument was: every candidate command for these operations exists
in the index with no CMD_ID, therefore it is not on the menu and cannot be
posted. Both halves of that were unsound:
The premise about
CMD_IDwas a misgeneralisation. The index has 481 rows withACTION_TYPE_ID = 1(Execute Command), and all 481 carry a realCMD_IDthat matches the live menu exactly — verified against ids this adapter already posts (0x82A6insert MIDI track,0x806Arun CAL,0x804Cselect all,0xE101open…). What produced the "index ids are not WM_COMMAND ids" warning was a different set of rows: the view-menu mirrors (音轨视图->音轨->…,控制台视图->…) areACTION_TYPE 6/7/8withCMD_ID = 0and the real id inACTION_ID. Posting theirCMD_IDposts 0. The top-level rows do not have that problem.The conclusion ignored CAL entirely. Mute/solo/arm have postable ids that the adapter itself already listed as working in
commands.js.
So the list shrinks to one entry, and this is what it is now:
Plugin insertion. No indexed command inserts a plugin into a track's FX bin;
IncrementPluginPreset/DecrementPluginPresethave no id. CakeScript'sPlugins:InsertAtis the only in-process route. Two alternatives exist and neither is a scripting path: a control-surface plugin (the interface is real —IControlSurface/2/3inD:\CAKEWALK\Shared Surfaces\GenericSurface.dll, discovered throughHKCR\CakewalkControlSurfaces— note that this is notHKLM\SOFTWARE\Classes\CakewalkControlSurfaces, which is empty; an earlier revision of this file gave the wrong path and a round of work was built on it, see The control-surface bridge below), or authoring a.cwxtrack template, which is the same binary container as.cwp.
The control-surface bridge: what was built, and what it proved
This is worth reading in full, because the outcome is a negative result and the negative result is the useful part. The surface plugin was expected to be the key that unlocked mute, solo, record-arm, routing, patch and the FX bin on a free licence. It is not, and the reason is now measured rather than assumed.
What works, verified end to end:
Step | Result |
Find SONAR's real discovery key |
|
Register a sixth entry | works, no elevation — writing through |
Build a COM object of the right shape | works — 44-slot vtable ( |
Survive the deepest slot | works — slot 43 ( |
Appear in the picker | works — |
Get instantiated by SONAR | works — |
Why this adapter no longer uses the surface (the decision and its evidence).
The surface must be re-added once per SONAR launch, and that is now understood at function level rather than by observation:
Sonar.exeexportsCCtrlSurface::PersistSurfaces— the function that writesctrlsurface.dat— and contains noLoadSurfaces,RestoreSurfacesorInitSurfacessymbol anywhere. It persists the list and never reads it back at startup.Measured consequence:
ctrlsurface.datheld the bridge's CLSID (written 00:09), SONAR started at 00:16, and the resulting process module list did not containcw_surface.dll. The file listed the bridge while the new process had never loaded it.
So the surface exists only between "user presses 确定" and "SONAR exits". It can be re-added by automation — that walkthrough is below and every step in it is reachable, because these dialogs are MFC and expose accessibility (unlike the JUCE ones) — but doing so requires a computer-use runtime driving SONAR's foreground UI after every launch, which is exactly what a one-click deployment must not depend on. It also cannot be fixed from outside without patching the host, which this project does not do.
Nothing needs it any more. Exactly one tool (cw_surface_set) required it to
write, and every one of those writes now has a file-based path: volume and pan
through CC7/CC10 baked into an imported .mid (verified end to end), mute /
rename / channel+port through CAL, and mute/solo/record-arm through a real click
on the track strip. The eight cw_surface_* tools are hidden unless
CAKEWALK_MCP_SURFACE=1 is set, and install.ps1 leaves the DLL alone unless
-WithSurface is passed.
The scripted walkthrough below is kept because it is the measurement record, and
because it is what makes -WithSurface usable on a session where you want the
diagnostics:
cw_close_overlays PaywallWindow / Quick Start must go first,
or the menu is inert
cw_run_command 0x882D 编辑 > 参数设置
click the MIDI tree row expands it
click the 控制界面 row
click the second header button the 'a' button beside 已连接的控制器/界面
ComboBox 控制器/界面(C) setValue "Cakewalk MCP Surface Bridge"
确定, then 确定 commits and loads the pluginNo project needs to be open — verified by doing exactly this on a session with no document. The dialog's input-port combo only lists MIDI devices that are enabled in 参数设置 > MIDI > 设备, which is why setting it to a loopback port silently fails until that device is enabled first.
What the first sweep showed, and why its conclusion was wrong:
Connect: pUnknown=0000000008042F60 hwndApp=0000000000020E60
QI IDispatch -> 0x80004002 (E_NOINTERFACE)
probe IControlSurface -> 0x80004002
probe IControlSurface2 -> 0x80004002
probe IControlSurface3 -> 0x80004002For a while this was read as "the host object implements IUnknown and nothing
else", and that reading was wrong in a way worth recording: every E_NOINTERFACE
above is evidence about the IIDs I guessed, not about the object. A
QueryInterface failure only ever means "not this one", and four misses were
mistaken for a property of the host. The conclusion drawn from it — that
SetTargetParam was unreachable — was therefore premature.
What the object actually is (measured, and it was recoverable all along)
The way through was static analysis of Sonar.exe, not more guessing:
The log file gave absolute addresses, and the module base made the vtable RVA exact:
0x1433505D8 - 0x140000000 = 0x33505D8.On disk that RVA lands in
.rdata, and[vtable-8]is an MSVCRTTICompleteObjectLocator. Following it to the TypeDescriptor gave the class name:.?AVCCtrlSurface@@.Its
ClassHierarchyDescriptorlisted the bases — and they identify the object's role:CUnknown,INonDelegatingUnknown,CBaseObject,CMidiInputMonitor::CObserver,CCtrlSurfaceBase. It is a MIDI-input observer, i.e. the object that feeds MIDI to a surface.Disassembling its slot 0 showed it is
QueryInterface— the code doesmov rax,[rdx]and compares against IID pointers. That also explains the crash of the earlier blind probe: passing(1, 2)made the function dereference1as an IID.The three IID addresses it compares against were extracted from that disassembly, and all three now return
S_OK:
probe HOST_IFACE_1 -> 0x00000000 {ED0C14F0-40F3-4459-813C-CB5B5A5E4958}
probe HOST_IFACE_2 -> 0x00000000 {85F8BB17-75F8-497F-8319-EF33A632C380}
probe HOST_IFACE_3 -> 0x00000000 {55507DE1-C037-4682-A4EC-65B1D2E86B53}
accepted iface 0: vtable=0x14340ECF8 slots=5
accepted iface 1: vtable=0x14340EC98 slots=6
accepted iface 2: vtable=0x14340EC28 slots=8So the host object does expose usable interfaces. The plugin now captures
each accepted interface and its vtable, and cw_surface_diag / op:"probe"
report them. Nothing about the earlier four E_NOINTERFACE lines was wrong as a
measurement; only the generalisation from them was.
The question is now closed by disassembly — and the answer is that these methods were never there
Following the host object down to its vtable settled it, and closed the search
rather than leaving it open. The full analysis is in
native/surface/ANALYSIS.md; the finding is:
CCtrlSurface has exactly 13 slots, and they line up with IControlSurface:
slot 0 QueryInterface compares IIDs (mov rax,[rdx])
slot 1 AddRef lock inc [rcx+0x10]
slot 2 Release lock xadd [rcx+0x10]
slot 3 GetStatusText
slot 4 MidiInShortMsg
slot 5 MidiInLongMsg
slot 6 Connect
slot 7 Disconnect
slot 8 RefreshSurface
slot 9 GetNoEchoMask
slot 10 GetVersion
slot 11 GetNoEchoStatusMessages
slot 12 (IControlSurface2 begins)So the object SONAR hands to Connect is itself an IControlSurface
implementation with 13 slots — not the 44-slot IControlSurface3, and not the
59-slot CSonarMixer. SetBaseTrack and SetTargetParam are not in it at
all. No amount of guessing its IIDs could have found them, which is exactly
what the four earlier E_NOINTERFACE results were really saying.
Disassembling the shipped GenericSurface.dll then showed the interface runs in
the opposite direction from what the plan assumed:
Method | Shipped implementation | Meaning |
| reads | SONAR notifies the surface that a value changed, so it can move its fader |
|
| the surface does not declare a MIDI mapping |
| reads | the host asks the surface what it is displaying |
The surface interface is host → surface notification. A surface does not push
values into SONAR through it. cw_surface_set still refuses, and now for a
reason that is established rather than unknown.
What does work, and it is now exposed as a tool: MIDI
A surface's channel back into SONAR is MIDI, and it needs exactly one thing — the surface must be assigned the right input port. The default is the audio interface, which is why the first attempts saw nothing.
Measured, after setting 输入端口 to the loopback port:
before: 0
after : 11
0xB0 d1=7 d2=20 CC7 volume
0xB0 d1=7 d2=35
...
0xB0 d1=10 d2=64 CC10 pan
0xB0 d1=1 d2=10 CC1 modulation
0x90 d1=0 d2=100 Note On11 of 11 messages arrived, with status, data bytes and arrival tick. This is
a genuine, verified two-way link between a process inside SONAR and the adapter,
and it is available as cw_surface_midi_in.
What is still missing is the interpretation: mapping "CC7 on channel 1" to
"set volume on base track + N" needs mixer access, which lives in
CGenericSurfaceStrip (12 slots) behind an indexed global table — one of its
failure paths returns 0x8002000B = DISP_E_BADINDEX, an IDispatch error code,
which is evidence the lookup is by index rather than by name.
Closing that needs the SURFACEFRAMELib type library or more disassembly of the
strip's mixer path. The type library is confirmed unavailable: it is not on disk,
not registered, and no DLL in the set will load with LoadTypeLibEx — all
return 0x80029C4A (TYPE_E_CANTLOADLIBRARY) and LoadRegTypeLib returns
0x8002801D (TYPE_E_LIBNOTREGISTERED). It was a compile-time #import only.
The earlier probing attempt, and why calling was abandoned
Before accepting the above, three more attempts were made to identify the host object, and the last one crashed SONAR. All of it is recorded because the conclusion is stronger than "we did not find it":
Recover the interface from the binary.
GenericSurface.dlldoes contain the method-name strings —GetTargetParam,SetTargetParam,SetBaseTrack,GetTrackCount,SetBankWidth— but they are its own vtable entries, the ones SONAR calls on the surface. They name the parametermixerParamanddwParamNumfrom the callee side. Nothing there reveals what SONAR passes in, and the referenced typelib (SURFACEFRAMELib) has no resource table in the DLL and no.tlbanywhere on disk.Recover the class from RTTI. The vtable was attributed to
Sonar.exeand the first twelve slots all resolve into it, so the object is a real C++ class in the host. But the MSVCRTTICompleteObjectLocatorread back empty, and Sonar.exe is stripped — 7 symbols — so the class name could not be recovered that way.Identify the setter by behaviour. Call each vtable slot and see which one moves a track's mute state; no name needed. This was implemented and run twice:
First run deadlocked the bridge. Calling slot 0 from the bridge's own worker thread never returned, and every later request timed out. SONAR was fine — project intact, menu working, document not even modified — but the channel was dead until restart.
Second run isolated each call on its own thread with a timeout, which fixed that exactly as intended: nine slots reported "did not return" without touching the bridge, three returned values consistent with an
IUnknownprefix (slot 1 = 6, slot 2 = 5 — reference counts; slot 3 = a heap pointer), and the bridge answeredpingafterwards.And SONAR then raised its own crash dialog:
C0000005, access violation, dumped toMiniDumps\Untitled_10162026_020341.dmp.
Isolation protected the bridge, not the host. The harmful call happened inside SONAR on a thread that could not be recalled. Recovery was offered and declined, so no project file was written.
The general lesson, which is the real result here: an unknown C++ interface cannot be discovered by calling it. Every guard available from the caller — memory protection, thread isolation, timeouts — protects the caller and never the callee. A wrong-but-executable slot runs at full privilege inside the host, and this host crashes on the wrong guess rather than returning an error. All of that probing code has been removed rather than left switchable: an operation that can silently kill the host is worse than no operation.
What was kept, and why it is still worth having:
cw_surface_status/cw_surface_diag/cw_surface_params/cw_surface_help— the status separatesnot-installedfromneeds-user-setupfromready, and the diagnostics are what produced the measurement above. Anyone re-attempting this on a future build should start fromcw_surface_diag.The plugin source and build. If a later SONAR hands over a richer object, the sweep shows it immediately and the write path can be completed.
A JSON-escaping fix in the DLL, found because the first error message contained a bare
"and the client reported "unparseable JSON" instead of the error. A protocol that mangles its own error messages is worse than one that has none; there is now a regression test on both sides.
Two by-products that matter more than the negative result:
RefreshSurfaceis a real, configurable heartbeat — 75 ms default, set in 参数设置 > MIDI > 控制界面 → 刷新频率(毫秒). A surface that only needed to read or tick could use it.The accessibility path already covers what the surface was meant to give. The track strips expose
手动静音,独奏,录制,输出,输入,音色,音色库andMIDI 通道as named, settable elements — see Reading tracks works; writing needs a different transport. The surface was an attempt to reach these without a UI dependency, and it failed; the UI path is the one that works.
The operational cost, stated plainly: a registered surface is not remembered
for free. It appears in the picker persistently, but the DLL only loads once the
surface has been added in Preferences for that session, so a fresh SONAR has no
bridge listening. cw_surface_status reports that as not-installed, and
native/surface/install.ps1 is how it comes back.
What was wrong about rename, mute, solo and arm
Track rename is not gated — CAL has
(TrackName "string" idx), and it was measured end to end:(TrackName "MCP-VERIFY" 2)ran through0x806Aand the exported.midcame back with that track renamed. The index genuinely has no rename command, which is what made this look impossible; CAL has one anyway, because CAL is a language the index does not describe.Mute is not gated — CAL has
(TrackActive TRUE|FALSE idx). The semantics are pinned by a shipped comment rather than assumed:Split Channel to Tracks.cal:40reads; Un-mute the trackdirectly above(TrackActive TRUE nTrk), soTRUEis audible andFALSEis muted.Mute, solo and arm also have postable menu commands after all:
MuteSelectedTracks0x80E1(32993),SoloAllSelectedTracks0x809F(32927),ArmSelectedTracks0x80E2(32994), plus theToggle*AllTracksfamily at0x8202–0x8204, two of whichcommands.jsalready records as working. They act on the selection, so the precondition is a selected track, not a dialog. (They were never actually id-less: the index row carries the id.)CAL routing —
(TrackChannel chan idx)and(TrackPort port idx)are proven in the shipped scripts.
What CAL still does not have, as a clean negative from grepping every shipped
script: TrackSolo, TrackArm, TrackVolume, TrackPan, TrackPatch,
TrackBank, TrackOutput, TrackInput — zero hits each. So solo and record-arm
are reachable only through the menu commands above, and volume/pan through MIDI
or the COM surface interface.
The one structural rule that cost two failed runs
A top-level expression in a CAL file is the per-event body slot, not a
statement. A track builtin written loose there fails with
CAL Error 016: 无效的事件信息或主体表达式 naming the builtin. The shape that
works — and it is what every generated track program now emits — is:
(do ; prolog: declarations
(include "need20.cal")
(int trk 2)
)
NIL ; body: the event walk, empty here — REQUIRED
(TrackName "MCP-VERIFY" trk) ; epilog: runs once
(pause "...")Wrapping the prolog and the track call in a single (do …) fails too,
because then the call is no longer in the epilog position. Both mistakes were
made and measured; a test now pins the shape.
The two earlier entries that were withdrawn
Note add / delete / read was on this list because every note command in the
index is a piano-roll display toggle with CMD_ID = 0. The reasoning was sound
and the conclusion was still wrong: CAL is a note-level API the index does not
describe as one. Its menu entry is filed under 处理 as a macro runner, and
nothing in the index hints that the language behind it writes Note.Key. It was
found by reading the 37 shipped .CAL scripts, not by mining commands.
Track rename, mute and arm were on this list for the same structural reason — looked for in the index, not found there, declared absent. Rename genuinely has no command; CAL provides it anyway. Mute and arm turned out to have commands, and the search that missed them was reading the wrong column of the index.
So the honest summary, after measuring both layers: transformation of existing notes is available through the edit dialogs (nine operations, five verified end to end); creation, deletion and reading through CAL (four operations, four verified); and track rename, mute, routing, solo and arm through CAL builtins and selection-based menu commands. What the paywall actually holds, as far as this investigation reached, is plugin insertion — and even that has a non-scripting alternative in the control-surface COM interface.
Routes to CakeScript that were tried and do not work
Recorded so nobody spends the time again. Each was tested on 2026.10, and the negative result is the finding:
Command-line switches. The binary contains the literal strings
/cakeScriptand/script(one occurrence each), which looked like an unattended entry point. They are not. Five invocation forms were tried against the real script engine —/cakeScript <file>,/script <file>,-script <file>,/run <file>, and a bare<file>argument — each in a fresh process with a 15 s window, and the script was written to make a file as proof of execution (both via Luaio.openandcakeapp.filesystem, so either path would count). No form executed the script. SONAR starts to its normal frame and ignores the argument, so those strings belong to something other than argument parsing.File association.
.luahas noassoc/ftypeentry on this machine, so there is no shell verb to invoke and double-clicking a script is not wired up.Driving the dialog controls with
WM_SETTEXT. This looked promising and half worked. UIA cannot see the dialog fromRootElement(it is a child of the SONAR frame, not a desktop top-level), but it can be bound — enumerate the process's#32770windows, thenAutomationElement.FromHandle. That yields the real HWND of every control:331254|Edit(the 数量 field),2624150|Button|确定,7210576|Button|取消, and723106|CC:SpinCtrl. The catch is what those controls are: SONAR's number fields areCC:SpinCtrl, a custom control, and theEditbeside it is a shadow.WM_SETTEXT "7"on that Edit reads straight back as'7'— and a freshGetWindowTexton the same handle returns empty again, because the value the dialog uses lives in the SpinCtrl, not in the edit's text buffer. This is the same shape as the track strips: the control accepts the write and ignores it.WM_SETTEXTis therefore not a way in for these fields.XCDCakeServices. Appears once as a string in the binary, so the helper process the original plan went looking for is named there — but no process or window of that name is ever created, matching the earlier finding that the XCD/LLM surface is not running on this build.
What remains as the working path is the one already proven: post the menu
command, then drive the resulting MFC dialog with an accessibility runtime that
can set values on real controls — which is what cw_quantize_dialog and
cw_note_edit_help describe, and what computer-use does when it calls
setValue on element 25 of the 移调 dialog.
Working around the missing T1
MIDI for changes.
cw_midi_*sends are verified end to end, and the receive side is enabled and confirmed through TTSSEQ.INI. This is the path that actually alters a project on this build.Accessibility for reads. With a project open,
cw_track_controlsgives the exact element naming for volume, pan, routing and the mute/solo/arm flags. Reading is accurate; writing is a no-op (see the section above).Menu commands for navigation.
cw_run_commandopens views, inserts tracks and drives transport once a document exists.A build that restores the Assistant panel brings T1 back with no changes here. It was present in 32.08.0.040.
How this compares to other DAW/tool MCP surfaces
Measured 2026-10-15 against two mature references available on this machine: the
ACE Studio MCP (63 tools, enumerated live from ace-mcp-server.exe) and the
After Effects adapter (36 tools). The point of the comparison was to find
out whether this one is missing something a user would notice, rather than
assuming its coverage was adequate.
The honest summary
Coverage is the thinnest of the three; the honesty layer is the strongest.
That is not a consolation prize. This host hides almost everything — the broad scripting API is paywalled, the track strips are drawn rather than exposed, and most commands change state with no window to diff. The other two hosts expose real APIs, so their tools can simply return values. Here, a tool that cannot confirm its own effect is the default case, which is why so much of this adapter is about stating what could and could not be established.
What the comparison found missing, and what was done about it
Gap | Reference | Verdict |
Undo / redo / history | ACE | Closed — |
Clip CRUD | ACE | Partial — split and merge exist as dialogs ( |
Plugin insert → params → presets → editor UI | ACE (the richest surface of the three) | Blocked — no insertion path exists; |
Automation envelopes, sends/buses | ACE | Blocked — drawn, not writable, and CAL has no envelope builtin. |
Async job handles | ACE | Open — this adapter blocks and pushes budget management onto the caller ( |
Tick/time/bar conversion | ACE | Open — pure arithmetic, no host involvement needed. |
One docs index | ACE | Partial — this adapter has 12 measured help tools; discoverability is weaker than one index, correctness is stronger. |
Where this adapter is ahead
cw_run_command_classifiedreturnsconfirmed/did-nothing/unconfirmedwith the evidence class behind it. Neither reference does this — both report success from "the call returned", which on a drawn UI is a guess.cw_no_effect_causes— the three-cause taxonomy (drawn-not-exposed, precondition-missing, gated-by-licence) came from being wrong twice, and it is the cheapest guard against concluding "broken" when it is a toggle.cw_verify_commands— command ids change between builds (32.08 vs 32.10), so the ids are read from the live menu and can be re-measured.The
confirm: '<command-name>'guard — a destructive tool refuses a bare boolean, so the caller must name what it destroys.
Two design ideas worth copying from ACE
Pair read/edit per domain rather than a flat tool list. The split encodes a safety boundary and makes the surface discoverable one level down.
Return a job handle for slow work. This adapter already knows which operations are slow — it budgets them — and used to make the caller wait.
cw_job/cw_jobs/cw_job_abandon/cw_job_clearnow exist for it.
What is deliberately not attempted
Plugin insertion and automation envelopes. Each was investigated and the negative result is recorded, so nobody spends the time again.
Plugin insertion in particular now has a closed route rather than an
untried one. The control-surface COM interface was built, registered, loaded and
driven end to end — and the host object SONAR passes to Connect implements
IUnknown and nothing else, so SetTargetParam has no reachable vtable slot.
Details and the raw QueryInterface results are in
The control-surface bridge. The remaining non-scripting route is authoring a
.cwx track template, the same binary container as .cwp.
Tools
Tool | Transport | What it does |
| — | Health check across all five transports with verdicts and remedies — run first after a SONAR upgrade |
| — | Host, version, transports, real-time MIDI state, recommended path |
| — | Whether the open project has unsaved changes |
| T2 | newProject / open / save / saveAs / close / exportAudio / importMidi / revert |
| — | How to drive the file dialog, and why it IS scriptable |
| T2 | play / stop / record / loop / metronome / tempo & meter views |
| — | How to set and read tempo and time signature |
| T2 | Selection, now-time movement, and markers |
| T2 | quantize / transpose / split / merge / gain / normalize / reverse / fade |
| — | The editing layer, its preconditions and its dialogs |
| — | How notes are edited: the dialog route, the export check, and the two mistakes behind it |
| — | The exact dialog writes for a given quantize, and how to prove it landed |
| — | Judge a quantize from two tick lists — pure arithmetic, no SONAR needed |
| — | The 量化 dialog as measured: fields, element kinds, traps |
| — | The CAL language: fields, operators, builtins, the run procedure, and the traps |
| — | The exact plan for a CAL run — source, dialog write, verification. Pure |
| T2 | Write a CAL program, post 0x806A, and report the dialog steps. No licence needed — notes and track properties |
| — | Delete the CAL scripts |
| T2 | Rewind the last operation. Silent — it cannot be confirmed from the screen |
| T2 | Reapply the last undone operation |
| T2 | Open the undo stack (0x8044) and report how to read and rewind it |
| — | How undo works here, and the trap in verifying a rewind |
| — | Convert between ticks, bar:beat:tick and seconds. Pure arithmetic |
| — | The time units, the 1-based/0-based trap, and what conversions cannot do |
| socket | Opt-in ( |
| socket | Opt-in. The plugin's log, counters, and the interface sweep that established what the host object is |
| socket | Opt-in. The parameter vocabulary the plugin accepts, with each kind |
| socket | Opt-in. Set a mixer parameter. Refuses on this build — the host object has no |
| socket | Opt-in. MIDI that SONAR forwarded to the surface, decoded — needs the input port assigned |
| — | Opt-in. How the bridge works, how SONAR discovers a surface, and what it cannot do |
| — | Read one background job: state, elapsed, progress trail, result or error |
| — | List recent jobs, newest first, without payloads |
| — | Discard a job's result. Does not stop work already posted to SONAR |
| — | Forget finished jobs; running ones are kept |
| — | Why background jobs exist, and the one thing the API cannot do |
| — | Why a command can report nothing happened — three causes |
| — | The marker dialog (writable), its commands, and the readback path |
| — | Which commands are confirmed, which are unconfirmed and why |
| T2 | Run a command and report what could and could not be established |
| — | Which commands |
| — | Re-measure command ids against the running SONAR after an update |
| — | How to drive the UI, what is unreachable, and how to recover a lockup |
| T2 |
|
| T2 | Run a menu command by id; reports whether the window list changed |
| — | Modal panels currently blocking menu commands |
| — | Close those panels |
| T4 | Live MIDI ports, which is selected, whether SONAR is tuned to it |
| T4 | Set pan (CC10) / volume (CC7) on a channel |
| T4 | Pan and volume for several channels in one round trip |
| — | What a live mixer message can affect, and what is measurable |
| file | Compose notes and CCs into a format-1 .mid, with mixer values baked in |
| file | Parse a .mid — names, channels, notes, CC7/CC10 with pan spelled out |
| — | Registered plugin counts across all three sources, categories, missing files |
| — | Search 1208 plugins by name, with format (VST3/VST2/DX), kind and file presence |
| — | What plugin discovery can do and why insertion cannot be driven |
| — | Instruments grouped by songwriting role |
| T2 | Insert a track (midi / audio / bus / folder / aux) |
| T2 | Insert the tracks a simple arrangement needs |
| — | Every 插入 command with its id |
| — | Measure every capability, grouped by transport |
| — | Per-operation latency profile |
| — | SONAR's enabled MIDI ports, read from TTSSEQ.INI (verifies the receive side) |
| — | Enable a port by writing TTSSEQ.INI — no UI needed, idempotent |
| T4 | Every MIDI device Windows reports |
| T4 | Play one note (pitch / velocity / duration / channel) |
| T4 | Play several notes at once, released together |
| T4 | Control change — 7 volume, 10 pan |
| T4 | Batch of raw |
| T4 | All-notes-off and reset on every channel |
| — | Plan for reading project state via computer-use, per topic |
| — | Cache an observation from a computer-use agent |
| — | Read the observation cache, with staleness |
| — | Which SONAR surface carries which project fact |
| T1 | All tracks in the active project |
| T1 | One track's volume/pan/mute/solo/arm/sends/clips |
| T1 | Volume (0.0–4.0) |
| T1 | Pan (-1.0…+1.0) |
| T5 | Mute / unmute, by clicking the strip's 手动静音 button |
| T5 | Solo / unsolo, by clicking 独奏 |
| T5 | Arm / unarm for record, by clicking 录制 |
| T5 | Read any strip control as SONAR shows it (音量, 声像, 输入, 输出, …) |
| T5 | Rename, by editing the strip's name field (double-click + clipboard paste — handles Chinese) |
| — | The .cwx track templates on disk, with categories (184 on this machine) |
| T5 | Insert a template — instrument + FX chain + routing — and confirm the new track by name |
| T1 | Clips on a track |
| T1 | Notes from a clip (pitch/velocity/time/duration) |
| T1 | play / stop / record / pause |
| T1 | Move the now-time (Bars|Beats) |
The command index
SONAR keeps a SQLite database of every command, view, setting and help topic at
%APPDATA%\Cakewalk\Sonar\cwsearch.dat. It powers the command palette, and
cw_list_commands source="index" reads it: 1315 rows on this machine, each with
a label, the menu path it lives under (e.g. 处理(P)->运行 CakeScript 程序), and
a CMD_ID.
CMD_ID is not a WM_COMMAND id. Posting one is silently dropped. The
index is useful for finding what a build offers and for the human-readable
menu path — not for dispatching. Only ids read from the live menu via
GetMenuItemID are postable, and even then only for main-frame commands.
Which commands respond
Measured on 32.10.0.021; cw_verify_commands re-checks on demand and
cw_command_support reports the split for the current document state.
Always work — app-level commands the main frame owns:
id | command | effect |
| 编辑 > 参数设置 | opens Preferences |
| 帮助 > 关于 Sonar | opens About |
| Cakewalk 助理 | toggles the Assistant / palette panel |
| 工具 > 视频引擎设置 | opens the video engine panel |
| 重置 MIDI 和音频 | opens a confirmation dialog |
| 文件 > 新建 | opens the 新建工程文件 dialog |
| 文件 > 打开 | opens the file dialog |
Additional ones that respond once a project is open — verified against a live 16-track project:
id | command | observed |
| 视图 > 音轨视图 | opens the track view |
| 插入 > MIDI 轨 | inserts a MIDI track (title gains |
| 插入 > 音频轨 | inserts an audio track |
| 视图 > AI Assist | responds (membership panel on a free licence) |
| 处理 > 运行 CakeScript 程序 | responds |
| 视图 > CakeScript View | responds |
| 视图 > 事件列表 / 钢琴卷帘 / 控制台 | open the view |
| 录制 / 播放停止 / 停止 | transport |
| 静音 / 独奏 全部音轨 | track state |
A caution about the verification method. cw_verify_commands diffs the
window list, which cannot see a command that changes state without opening a
window. Transport, mute and solo all appear as unchanged even when they
worked. Read the blind-spot list in lib/commands.js before concluding a
command is dead.
Benchmarks
cw_benchmark runs every capability against the live SONAR and reports each
result with the method used to confirm it, because a PASS from "the window
title changed" and a PASS from "the element value changed" are not equally
strong. cw_latency profiles the individual operations.
Current state on 32.10.0.021 with a project open — 16 of 17 pass; the one failure is the expected absence of the CakeScript transport:
read/static pass 3 plugin inventory, plugin search, MIDI port config
read/win32 pass 4 bridge status, live menu tree, document detect, overlays
write/menu pass 4 assistant toggle, view command, insert command, transport
write/midi pass 4 port resolve, one note, one CC, a batch
read/config pass 1 SONAR tuned to the cable (from TTSSEQ.INI)
transport/T1 fail 1 no XCD*/LLM* window — expected on this buildLatency, median over repeated runs:
Operation | Median |
MIDI: send one message | 18 ms |
Plugins: inventory (warm) | 30 ms |
Bridge: menu tree | 283 ms |
Bridge: status | 362 ms |
Menu: post a command | 2404 ms |
Two notes on the numbers. The menu path is slow by design: cw_run_command
closes modal overlays first and then waits ~1.2 s to observe whether anything
opened, which is what makes none-observed meaningful. And the plugin inventory
was 28 s until the read was changed from reg query /s (which recurses into
all 946 subkeys for their values) to the top-level query (which returns the
subkey names only) — 10 415 ms → 74 ms. CLSIDs are now fetched per-plugin,
on demand, at ~10 ms each.
Project layout
<package>\
├── package.json
├── bin\cakewalk-mcp.js # entry point (starts the shims)
├── bridge\
│ ├── agent.js # PowerShell user32 bridge: status, menu, runmenu, overlays, probe
│ ├── midi.js # PowerShell winmm shim: devices, open, send, panic
│ └── loopback.js # winmm MIDI input capture (for verifying a cable nothing holds)
├── lib\
│ ├── sonar.js # host discovery (Sonar.exe, scripts folder)
│ ├── dispatch.js # transport probing + the "what to use instead" errors
│ ├── menu.js # command index + live menu + WM_COMMAND dispatch
│ ├── commands.js # measured command support + the UI recipe
│ ├── track-ui.js # the track-control contract, read/write split
│ ├── transport.js # transport, tempo, meter, loop — posture over confirmation
│ ├── navigate.js # selection, now-time, markers + the writable-dialog pattern
│ ├── edit.js # editing/processing + the precondition that makes them work
│ ├── note-edit.js # note-level editing: the quantize dialog and the export proof
│ ├── project.js # document lifecycle + the destructive-command guard
│ ├── verify.js # evidence classes: what this process can and cannot confirm
│ ├── mixer.js # volume/pan via CC — the path that works
│ ├── midi-file.js # read/write standard MIDI files (the data level)
│ ├── live.js # real-time MIDI transport (port picking + musical ops)
│ ├── midi-config.js # read/write TTSSEQ.INI — SONAR's enabled MIDI ports
│ ├── plugins.js # plugin detection (registry + menu layout + disk)
│ ├── tracks.js # insert tracks (menu commands + verification)
│ ├── project-state.js # probe plans, operation recipes, observation cache
│ ├── benchmark.js # capability measurement + latency profile
│ ├── convert.js # ticks <-> bar:beat:tick <-> seconds, and the note-value table
│ ├── surface.js # the control-surface bridge client (loopback TCP, JSON lines)
│ ├── jobs.js # background job handles for the slow operations
│ ├── run.js # CakeScript templates over T1
│ ├── cake_templates.js # parameterised CakeScript (Lua) programs
│ └── server.js # MCP tool definitions (89 tools; 97 with CAKEWALK_MCP_SURFACE=1)
├── native\surface\ # the control-surface plugin (C, mingw)
│ ├── cw_surface.c # IControlSurface3 + worker thread + loopback bridge + diagnostics
│ ├── build.cmd # mingw gcc build (no MSVC on this machine)
│ ├── install.ps1 # regsvr32 / folder-copy install, and -Unregister
│ ├── loadprobe2.c # off-line COM contract test: 5 IIDs, slots 10/14/26/43
│ ├── ANALYSIS.md # the full disassembly record: CCtrlSurface's 13 slots,
│ │ # the 3 real IIDs, why SetTargetParam is host->surface
│ └── build\cw_surface.dll # the built plugin
├── node_modules\ # @modelcontextprotocol/sdk + zod + ...
├── test\ # node:test, no new dependencies
│ ├── helpers.mjs # fixtures + shim teardown
│ ├── pure.test.mjs # 25 maths, encodings, coordinate conversion
│ ├── midi-file.test.mjs # 17 .mid write/read round trips
│ ├── parsers.test.mjs # 24 registry, INI, menu layout, document title
│ ├── navigate.test.mjs # 21 selection/marker records and their evidence classes
│ ├── edit.test.mjs # 26 the editing layer and the false-positive fixes
│ ├── note-edit.test.mjs # 50 quantize arithmetic vs a real measured run
│ ├── cal-script.test.mjs # CAL generators, the structural rule, and the write path
│ ├── history.test.mjs # undo/redo records and the rewind-verification trap
│ ├── convert.test.mjs # tick/bar/second conversions and their boundaries
│ ├── surface.test.mjs # the bridge protocol: framing, encoding, error
│ │ # classification, and MIDI-in decoding
│ ├── jobs.test.mjs # job lifecycle, late results, bounded progress trail
│ ├── capability.test.mjs # 23 the guards and the honest-reporting layers [--full]
│ ├── integration.test.mjs # 24 MCP protocol, tool schemas, bridge liveness [--full]
│ └── blackbox.test.mjs # 25 the whole adapter through MCP only, no internal imports [--full]
├── run-tests.mjs # one command, one number; --full for the slow tier
├── mix.mjs # compose the song with its mix baked in
├── song.mjs # perform it over the live MIDI cable
└── README.mdTests
Two tiers, no new dependencies (node:test).
node run-tests.mjs # fast tier — 0.6s, no processes
node run-tests.mjs --full # everything — several minutesThe counts are not written here on purpose. node run-tests.mjs prints a
per-suite block at the end of every run, and that block is the only source:
per-suite (runner counts):
edit.test.mjs 25
midi-file.test.mjs 17
...An earlier version of this file carried the numbers by hand, and an adversarial
audit caught it three separate times — the headline, the per-suite table and
the directory tree each disagreed with the others and with reality, because they
were written at different moments while the suite was still growing. The audit
also showed the "rule" I invented to reconcile them was itself wrong: I claimed
per-suite rows used top-level test() counts, but the gap between that and the
runner's figure varies per file (it depends on how many describe blocks a suite
has), so the rows could not be summed to the total. Both problems have one fix —
stop transcribing, start copying from the run.
The tier split exists because the full run was 7m35s, and almost all of it was waiting on processes. A suite that takes seven minutes to answer "did that edit break anything" stops being run. The tier is an explicit file list, not a timing heuristic — and the runner now refuses to start if a listed suite no longer exists, because renaming a slow suite used to promote it silently into the fast tier.
That split also exposed something the numbers had been hiding. Three suites
called themselves white-box and took 25s, 28s and 46s, because each reached
the PowerShell bridge from inside a unit test. Once the pure parts were extracted
(classifyTitle, classifyEditResult, describeNavigateResult) they run in
~200 ms each — the edit suite went from 46,316 ms to 83 ms. The
behaviour did not change; only which layer owned each assertion.
Reproduce it, per suite, in a shell:
for f in pure midi-file parsers navigate edit note-edit; do
t0=$(date +%s%N); node --test test/$f.test.mjs >/dev/null 2>&1; t1=$(date +%s%N)
printf "%-12s %6d ms\n" "$f" $(( (t1-t0)/1000000 ))
done
# pure 200 · midi-file 229 · parsers 277 · navigate 199 · edit 199 · note-edit 210An adversarial audit flagged the original claim as unverifiable — there was no artifact anywhere in the repo backing "46,316 ms", and no git history to check it against. That is a fair criticism of how the number was recorded, and the command above is the fix: the measurement is now a one-liner anyone can re-run rather than a figure copied out of a session. The old baseline cannot be re-measured (the code that was slow no longer exists in that form), so it is quoted as what it was: a single observation, not a standing guarantee.
Fast tier — the logic, importing the modules
Suite | Tests | What it protects |
pure | 25 | arithmetic with a plausible-but-wrong alternative — a 0-based channel, a 64-centred pan, a bit-shift off-by-one |
midi-file | 17 | the writer and reader are independent implementations of one spec, so a bad byte surfaces as a wrong note, channel or position |
parsers | 24 | external formats that cannot be regenerated — a |
navigate | 21 | selection/marker records and their evidence classes |
edit | 26 | the editing layer, the selection-honesty rule, and the false-positive fixes in |
note-edit | 50 | quantize arithmetic pinned against a real measured run, the half-strength outlier, note-count changes, and the record of how that run was misread twice |
Full tier — the suites that leave this process
Suite | Tests | What it protects |
capability | 23 | that a destructive command refuses, and that "nothing errored" is never reported as success |
integration | 24 | the MCP surface, the documented failure modes, and bridge liveness |
blackbox | 25 | the adapter through MCP only, importing no internal module; and that no tool hangs |
Black-box — the adapter, through MCP only
blackbox.test.mjs (count in the runner's per-suite block, not here) imports
no internal module. It spawns
bin/cakewalk-mcp.js as a client would, speaks JSON-RPC over stdio, and judges
only what comes back on the wire. It holds the adapter to five rules:
every tool is callable and answers within a bounded time
no tool raises an unhandled error at the protocol level
an error is a well-formed result with a readable message, never a timeout
a missing precondition is reported as such, with what to do about it
nothing that discards work happens without an explicit confirmation
This layer caught a defect the white-box suite could not. cw_verify_commands
surveyed 21 commands at roughly 2.5 s each with no cap, so a bare call left a
client waiting a minute. Every unit was fine; the composition was not. It now
takes a budgetMs and returns a partial result naming what it skipped. It is
also the only layer that can catch a wiring mistake — a module that works
perfectly but is never registered as a tool is invisible from inside.
Run everything with node run-tests.mjs, one suite with
node --test test/edit.test.mjs.
Twenty-seven real bugs came out of writing and auditing these, which is the argument for the suite. Eighteen came from auditing rather than from writing:
10–14 from the first adversarial pass (five lenses, each finding re-checked by a separate agent told to falsify it)
15–18 from attacking those fixes
19–24 from attacking the fixes again — the second pass found the most, because that is where the fixes had never been independently examined
25–27 from a third pass aimed at the crash paths and at the measurement habits themselves: the two findings that matter most there are that four tests were green only because they skipped, and that a repair made a test pass by making it unable to fail — caught only by mutating it
Pan was asymmetric.
Math.round(64 + n * 63)put hard-left at 1 instead of 0 (MIDI's halves are 64 and 63 steps, so one multiplier cannot be symmetric) and madedescribePan(0)read102% left. Fixed by scaling each side by its own span.CC.panvsCC.PAN. Three modules, two spellings, and an undefined controller masks to CC0 — so a cross-module call silently wrote a bank-select instead of a pan. Both spellings now resolve, and a non-numeric controller throws.Unterminated notes were dropped. A note-on with no note-off (a trimmed or truncated file) vanished entirely. They are now kept, flagged, and reported.
The test framework itself.
documentState()starts the PowerShell bridge, which is long-lived by design; four orphaned processes from one run slowed the next suite into a 60-second timeout. AddedshutdownShims().riskheld prose, disabling the guard. Three destructive commands hadrisk: 'destructive — the source events are replaced', and the guard compares=== 'destructive'. The confirmation check was silently off for all three. The test that caught it pins the canonical value and runs every destructive command to confirm each actually refuses — checking the field alone would not have.cw_editreported a dialog that had not opened.outcomefell back to the command's description when no window appeared, so a failed run read like a successful one. Measured:newWindowswas empty whileoutcomeclaimed a dialog. Nowoutcomecarries only what was seen andexpectedthe description.A stale modal made a working command look broken. With four leftover modal windows on screen,
cw_edit quantizereportedno-window-change; on a clean state the same call opened its dialog.likelySwallowednow says so and namescw_list_overlays/cw_close_overlays.preconditionSatisfiedclaimed an outcome nothing could observe. It read'selected all first', asserted unconditionally from theselectFirstflag. Select-all is a drawn change — no window, no element, just a highlighted ruler — so a modal that swallowed the menu command (which #7 shows happens) left the field claiming a selection it never made, sitting next to alikelySwallowed: truesaying the command had vanished. NowselectionRequestedreports the attempt,selectionConfirmedis alwaysfalse, andselectionEvidencesays a screenshot is what would settle it. This one is the same defect as #6 in a different field, which is why the fix came with a test asserting the old name is absent from the result.The measured "50%" row was described more confidently than it holds. The prose said 50% strength "moves each note half way to the grid". Recomputing
predictQuantizeagainst the recorded run: seven of eight notes agree to within a tick of rounding, but one (2461 → 2432) is 59 ticks off the linear model. One sample cannot say why, so the claim is now stated as a table with the outlier named, andpredictionConfidenceisexactonly at 100% strength.
The next five came out of an adversarial audit — five independent lenses, every finding re-checked by a separate agent whose instruction was to falsify it. They are listed separately because the failure mode is different: these were not reasoning errors but reporting errors, each of which would have led a reader to the wrong action.
judgeQuantizecould not tell "nothing moved" from "the commit failed". Withstrength: 0the prediction is also "no movement", sobefore == aftermatched the prediction and produced the reassuring "partially moved — this is a fractional strength result, not a failure". A quantize that never applied read exactly like a legitimate no-op. It also explained a changed note count as "the dialog may have applied different settings than were written" — sending a user back to the dialog instead of looking for the missing note. The verdict now branches on the count first, then on whether anything moved at all.describeNavigateResulthad the same false-positive shape as #6, unfixed.confirm === 'dialog'produced "A dialog should be open" while never consultingnewWindows— the evidence was in hand and unused. Worse,nexthad two branches for three evidence classes, soconfirm: 'elements'(onlyshowMarkerView) fell through to the drawn-change wording and emitted a sentence arguing with itself: "drawn, not exposed" followed by "is a TABLE — readable". Each class now has its own branch, and a test walks the real tables so a fourth class cannot be added without wording.Three zero-argument tools hung past a client's patience. Found when the black-box walk timed out at 60 s:
cw_add_song_tracks(six inserts at 2–4 s each),cw_benchmarkandcw_latency. The audit's first guess — the plugin inventory — was only part of it; profiling showed four write cases posting a command and then waiting for the UI account for ~55 s of the benchmark's 70 s. All three now take a budget or default to the cheap stages, and each says what it skipped.cw_latencyalso orders its stages cheapest-first, because the budget is consumed in order and the expensive stages were starving the 22 ms MIDI measurement.eventswas unreachable through MCP, so a guard could never fire.cw_write_midi_filedocumented a channel-mismatch warning, but its zod schema only exposednotes— and zod strips unknown keys, so a client sendingeventshad it silently dropped. The test "the writer warns when a track mixes channels" asserted only!isErrorand could not fail.eventsis now in the schema, and the test drives the path that can actually warn.The marker-removal commands had empty records.
removeProjectStart/End/Rangecarried an id and a name and nothing else — noeffect, noconfirm, noverified— sitting in a table of measured commands. They now state what they do, how they would be confirmed, that they are destructive, and that they were never probed.
Four more came from attacking the fixes themselves, which is the stage that found the most in the end:
judgeQuantizereported a SUCCESS as a suspected failure. "Nothing moved" has reasons that are not failure — the source notes may simply already be on the grid. The rewritten verdict only recognised a zero strength, so quantizing an already-quantized file produced "the commit most likely did not apply". The input decides this, so it is decided:beforeOnGridis computed and the case is labelled a success. (It also explains why quantizing a tidy file proves nothing about the round trip.)A boolean was accepted as a strength.
Number(true)is1andNumber(null)is0, so a bare coercion treatedstrength: trueas a valid 1% and reported no warning. Only a number or a numeric string is a strength now; anything else falls back to 100 and says so.whatToLookvanished on both dialog branches. A command that opens a dialog and names what to look at lost the second half — at exactly the two moments a caller needs it ("a dialog should be open", "no dialog appeared"). Every branch now carries it, and a test sweeps all commands in both window states for unfilled placeholders and doubled punctuation.Three tests that claimed to guard something and did not. The
cw_editwindow-list regression survived two rewrites of its test before the third caught it — see Mutation-test any test that claims to guard something. The one lesson worth repeating here: a test asserting that two values from the same function agree cannot detect an error they agree about.
The second verification pass attacked the fixes above and found six more. Every one is the same species — the record claiming more than was established:
Cost figures I invented. "Each insert costs roughly 2-4s, so six tracks need about 20s" — measured, one insert takes ~19s, so six need ~2 minutes. The same error appeared three times:
cw_latencysaid a menu post costs "~4s" (measured 11s), andcw_verify_commandssaid "~2.5s per command" (measured ~15s). The last one had consequences: the budget default was set from that estimate, so 12s bought one probe and 45s bought three, neither of which is a survey. The comment now carries the measurement and its date.A test that substituted its own arguments. The black-box "no tool hangs" check passed
budgetMs: 3000tocw_verify_commands— a value that existed nowhere in the product. The real default was 45s against a 58.7s workload, so a bare call in the wild blew the client timeout while the test stayed green. It now calls every tool with no arguments, because the defaults are the contract, and tools that are slow by nature get an explicit ceiling instead of an exemption.A fabricated witness. The three
removeProjectStart/End/Rangecommands were marked "not probed" and then givenconfirm: 'screenshot'plus awhatToLooksentence describing what probing would have found. Inventing a plausible witness for an unmeasured command is worse than admitting the gap, because it reads as knowledge. They now carryconfirm: 'unprobed', and the branch that handles it says NOT PROBED.A count change hid a success.
judgeQuantizefired its count-changed branch before any position comparison, so a legitimate count change (SONAR merges same-pitch overlaps on export) reported "not a quantize result" while every surviving note sat exactly on the grid. Both facts are now reported.Clamping was silent.
strength: 150became 100 andstrength: -10became 0, reported as valid with no warning.strengthAdjustedand a message now accompany any value that was not used as given.A whole table was exempt from the rule. The check "every command declares how it can be confirmed" skipped
ARRANGER_COMMANDSwholesale, so a command added there with an empty record would pass. The rule is now per-command:unprobedis a legitimate declaration, silence is not.
A third pass turned on the adapter's own crash path and on the measurement habits used to check it. Three findings, all the same shape — a conclusion that rested on an unverified assumption:
A crash on the most common state, hidden by tests that skipped themselves.
capabilities()returned early when SONAR was not running and lefttransportsan empty object, whilerunCommand()andcakeScriptBlocker()dereferencedtransports[...].availableunconditionally. Starting with SONAR closed — the single most likely way a user meets this adapter — producedCannot read properties of undefined (reading 'available')instead of the documentedCAKESCRIPT_UNAVAILABLEwith its alternatives. Four tests covered this path and all four opened withif (!r.result.isError) return;, so with SONAR running they asserted nothing. They were green because they never ran, not because the code was right. Fixed by populating every transport withavailable: falseand a reason; guarded by a test that asserts the invariant regardless of what SONAR is doing (mutation-checked: bug in → red).A verification that used the wrong command id, and nearly produced a wrong "bug". While checking why an edit test failed, I posted
0x8099to open the quantize dialog and it "worked". It is not 处理 > 量化. The real id is0x8061(lib/edit.jshad it right all along).0x8099happens to open a different#32770, and the resemblance was enough to build a whole chain of wrong conclusions on top of a control experiment that was never valid. The lesson: when a probe succeeds unexpectedly, confirm it is the same operation before using it as a control — a screenshot of the dialog, not just the window class.A test weakened to make it pass, caught by mutating it. The
cw_editend-to-end test asserts a dialog is on screen after a quantize. With an empty project open (tracks, no notes) quantize is legitimately silent, and the test failed on correct code — its third non-bug failure. The first repair relaxed the assertion to "the report should be honest about seeing nothing", which passed even with the plumbing regression injected: the two cases are indistinguishable. Fixed twice over — the regression now has a deterministic guard where it can be told apart (requireWindowList()raisingEDIT_WIRING_FAULTwhen the window list did not survivewithSelection, covered by three process-free tests), and the end-to-end branch ist.todo()rather than a green assertion it cannot earn. A silent pass for an unverifiable state is the same trap as finding 18.
Two conventions the tests pin that are not obvious from the code: parseInventoryKeyNames()
returns an array with a scannedOnly property attached, so deepEqual(result, [])
fails on it; and the pan round trip is asymmetric by one percent near the half
positions because of the 64/63 split — a fact about MIDI, not a bug.
A third is a habit rather than a convention: the note-edit suite runs its
arithmetic against ticks recorded from a real SONAR session, so a change to
the model of how quantize behaves has to argue with an observation rather than
with a plausible-looking formula.
Mutation-test any test that claims to guard something
Writing a regression test is not evidence that it works. The cw_edit window-list
bug is the cautionary case: it was "fixed", a test was written for it, and an audit
later showed the test was vacuous. Two rewrites failed too, and only the third
worked — and the third was believed only because it was checked by injecting the
bug back:
cp lib/edit.js /tmp/bak.js
sed -i 's/const { out: ran } = await withSelection(/const ran = await withSelection(/' lib/edit.js
node --test test/integration.test.mjs # MUST fail
cp /tmp/bak.js lib/edit.js
node --test test/integration.test.mjs # MUST passWhat the three attempts taught, in order:
A test built on the code's own output is a tautology. The first version asserted
outcomematchednewWindows— butoutcomeis computed fromnewWindows, and it has exactly two values. It could not fail.A consistency assertion cannot detect a consistent error. The second version asserted the two agreed. Injecting the bug, they agreed perfectly: both were empty. 24/24 green against broken code.
Assert against a fact from outside the code under test. The third version asks the overlay list whether a dialog is actually on screen. That is not derived from the thing being tested, so it can disagree with it.
Two smaller lessons came from getting even that right. The assertion must match on
the window class (#32770), not the title — SONAR's captions are GBK and
arrive as ��������, so a /量化/ match fails while the dialog sits plainly open.
And a test that drives the live app must reset the screen first and clear up
after, because a modal left by an earlier test swallows menu commands and makes
the next test fail for an inherited reason; integration.test.mjs and
blackbox.test.mjs both do this in test.after.
Registering with ZCode
Already done in C:\Users\molisaa\.zcode\cli\config.json:
"cakewalk": {
"type": "stdio",
"command": "<package>/runtime/node.exe",
"args": ["<package>/bin/cakewalk-mcp.js"],
"env": {}
}Available Tools
89 toolscw_add_song_tracksA
Add the tracks a simple arrangement needs: drums, bass, keys, guitar, strings, synth — in that order, one MIDI track each. Pass roles to add only some. Each track gets SONAR's default instrument; loading a specific plugin is a separate UI step. Cost, measured: one insert takes ~19s (a menu post plus a verification wait), so the full six-track skeleton needs roughly two minutes. Pass roles and a matching budgetMs together rather than asking for all six.
| Name | Required | Description | Default |
|---|---|---|---|
| roles | No | ||
| budgetMs | No | Stop adding after this long and report which roles were not attempted. One insert takes ~19s, so the default covers about two tracks; allow ~120s for all six. |
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 the ~19s per-insert cost (menu post plus verification wait), the ~2 minute total for six tracks, that each track gets SONAR's default instrument, that plugin loading is a separate UI step, and that budgetMs causes partial completion with unattempted roles reported.
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 core action and ordered role list, then cost, then the invocation advice. Four dense sentences, each carrying non-redundant information, though the timing rationale is restated once in both title-like prose and the closing recommendation.
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 two-param, no-annotation, no-output-schema mutation tool, it covers side effects, timing, partial-failure reporting and defaults. What it omits is what the call returns and how it behaves if matching tracks already exist, which matters for idempotency.
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 only 50% (roles is undescribed in-schema), but the description compensates by explaining that roles selects a subset and that ordering follows the canonical sequence. budgetMs's own schema text already covers its semantics well; the description adds the cost rationale behind the defaults.
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 and resource (add MIDI tracks) plus the exact role set and ordering, so the agent knows precisely what gets created. The only gap is that it never names cw_add_track or cw_insert_track_template, so the boundary against those siblings is left implicit.
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 real usage guidance: pass `roles` to add a subset, and pair `roles` with a matching `budgetMs` rather than requesting all six in one call. It stops short of stating when this tool should be chosen over cw_add_track, which it superficially overlaps with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_add_trackA
Add a track to the open project via SONAR's 插入 menu. kind: midi | audio | bus | folder | aux. Requires a project to be open — the 插入 menu does not exist without one. Reports whether the project title gained its modified marker, which is the only insert confirmation available without a computer-use runtime.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | midi | |
| name | No | Intended track name; applied only as a hint |
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 real work: it discloses that this is a mutation, that the operation is GUI-mediated, and critically that success confirmation is weak ('the only insert confirmation available without a computer-use runtime'). That is exactly the kind of caveat an agent needs. It stops short of saying whether the change is undoable or what failure looks like.
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 front-loaded sentences with the core action and prerequisite first, and no filler. Minor issues: the embedded Chinese menu name and the modified-marker sentence are dense, but both carry 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 2-param, 0-required mutation tool with no output schema, the description covers the prerequisite, the valid kinds, and the return/confirmation story. It is nearly complete, missing only how to verify afterwards (cw_list_tracks) and undo/irreversibility, which matter for an add operation.
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 50% and the description mostly restates what the schema already contains ('kind: midi | audio | bus | folder | aux'). It adds no semantics for 'name' beyond the schema's 'applied only as a hint' note, but it does surface the enum values prominently, so it earns the baseline rather than falling below it.
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 ('Add a track to the open project') and the mechanism (SONAR's 插入 menu), which an agent can act on. It does not differentiate from close siblings like cw_add_song_tracks or cw_insert_track_template, so naming alone won't route the agent among the several track-creation tools.
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 prerequisite ('Requires a project to be open — the 插入 menu does not exist without one'), which is useful when-not context. However it never points to alternatives (cw_add_song_tracks, cw_insert_track_template, cw_list_tracks for verification), leaving the agent to infer selection on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_apply_mixB
Set pan and volume for several channels in one round trip. mix is [{ channel, pan?, volume? }] with pan in -1..1 and volume in 0..1.
| Name | Required | Description | Default |
|---|---|---|---|
| mix | 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 for a mutation tool. It does disclose one useful trait — multiple channels are applied in a single round trip — but says nothing about atomicity (does a bad channel abort the whole batch?), permission/support requirements, or what is returned. The omission of panCC/volumeCC from the narrative also hides part of the mutation surface.
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?
Two short sentences with the action and the batch benefit front-loaded, then the payload shape. Dense and essentially waste-free, though the second sentence's shorthand notation is terse enough to require a careful read.
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 mutation tool with a nested array parameter, no annotations, no output schema, and 0% schema description coverage — the heaviest possible burden on the description. It leaves out the CC variants, error/partial-application behavior, and any return semantics, which is not sufficient for a batch write operation.
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 does partially: it gives the array shape, the required channel key, and the pan (-1..1) and volume (0..1) ranges. However, two of the five item properties (panCC and volumeCC) are never mentioned, so the semantics of the raw MIDI CC alternative path is left entirely to the schema's type constraints.
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 pairs a specific verb (set) with specific resources (pan and volume) and adds scope: several channels in one round trip. That scope implicitly separates it from the single-target siblings cw_set_pan and cw_set_volume, but the description never names those siblings or states the distinction 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?
The 'several channels in one round trip' phrasing implies batch usage versus the single-channel setters, but there is no explicit when-to-use/when-not guidance and no mention of cw_set_pan, cw_set_volume, or cw_mixer_targets as alternatives. An agent has to infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_benchmarkA
Measure what this adapter can actually do against the running SONAR, and how fast: every capability grouped by transport, with the confirmation method for each result. Use it after a SONAR update to re-establish the boundaries. Measured: a full sweep takes 70s+, and not only because of the plugin scan — the write cases post a command and then wait for the UI to settle, and four of them account for ~55s of it. So the default answers from the read half (a few seconds) and every expensive stage is opt-in and named in skipped. Pass full: true for everything. The write stages can start playback and send MIDI to the selected destination; they do not insert tracks or buses.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Run every stage: the write cases and the plugin inventory scan. Takes 70s+. The default read-only sweep answers in a few seconds and says which stages it skipped. | |
| includeWrites | No | Run the cases that post a command and wait for the UI. ~55s of the total. | |
| includeMidiSend | No | Only meaningful when the write cases run. | |
| includePluginScan | No | Explicit override for the plugin-inventory stage; implies nothing about writes. |
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: it discloses full-sweep runtime, default read-half speed, skipped-stage reporting, and the side effects of write stages (starting playback and sending MIDI, but not inserting tracks or buses). This gives the agent critical safety and cost context before invoking it.
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 usage, then gives performance and side-effect details that are relevant for a benchmark tool. It is somewhat long, but most sentences earn their place by clarifying cost or safety.
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 no output schema and no annotations, the description provides enough context to call the tool correctly: it explains default vs full behavior, skipped stages, timing, and write-stage side effects. It stops short of describing exact return values, but that is a minor gap.
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 100%, so the input schema already explains each parameter in detail. The description adds some framing around default behavior and full:true, but largely repeats what the schema provides, making the baseline 3 appropriate.
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: measuring what the adapter can do against the running SONAR, including speed and capability grouping by transport. It is clearly a benchmark/diagnostic tool, though it does not explicitly distinguish itself from nearby tools like cw_doctor or cw_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?
It gives clear usage context: run it after a SONAR update to re-establish boundaries, and use the default read-only sweep unless full coverage is needed. It also explains that expensive write stages are opt-in, but it does not name alternative tools or exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_cal_cleanupA
Delete the CAL script files cw_cal_run wrote, and their .bak copies. Running CAL leaves a file in the real CAL folder alongside the 37 shipped scripts, so this exists to put the folder back. Only names matching the generated MCP-.CAL pattern are removeable — this will not touch a script you wrote by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| program | No | Remove just this program's file. Omit to remove every generated script. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it declares this is destructive (delete), scopes exactly what is destroyed (generated .CAL files and .bak copies), and states a safety guarantee (won't touch your own scripts). Gaps remain: no mention of whether deletion is permanent/undoable, what happens when no matching files exist, or what the call 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?
Three tight sentences, front-loaded with the action, then the rationale, then the safety boundary. Every sentence earns its place; no 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 one-optional-param, no-output-schema tool, the description covers purpose, scope, and safety sufficiently to invoke correctly. It could go slightly further on outcome (return value, behavior when nothing matches), which keeps it off a 5.
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 100% and the single optional parameter's enum plus 'Omit to remove every generated script' semantics are already fully documented in the schema. The description adds no syntax or behavior beyond that, so baseline 3 applies.
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 (Delete) and the exact resource: the CAL script files written by cw_cal_run plus their .bak copies. The tie to cw_cal_run and the 'restore the folder to its 37 shipped scripts' framing makes it unmistakable against siblings like cw_cal_plan, cw_cal_run, and cw_cal_help.
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 clear context for when to reach for it (after running CAL leaves a stray file) and an explicit exclusion: only MCP-<program>.CAL names are touched, hand-written scripts are safe. It doesn't name an explicit alternative action or say what to do if nothing was generated, but the triggering condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_cal_helpA
CAL is SONAR's legacy macro language and it is NOT behind the membership paywall, unlike CakeScript. It reads and writes note data directly, so on a free licence it is the only way to CREATE, DELETE or READ notes — the dialogs can only transform existing ones. This returns the language reference (fields, operators, builtins), the run procedure, the generated programs, and the traps that cost real time to find.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it enumerates the returned sections (reference, run procedure, programs, traps) and discloses the licensing constraint that governs CAL versus CakeScript. It stops short of explicitly stating the call is side-effect-free and read-only, which is the one piece of behavioral clarity an agent still has to assume.
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 content is substantive but the ordering is off: the opening sentence is about paywall status and CakeScript, while what the tool actually returns appears only in the last sentence. Phrases like 'traps that cost real time to find' are persuasive rather than informative, and the em-dash clause about dialogs is tangential to invoking this tool.
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 zero-parameter, no-output-schema help tool, the description covers what an agent needs: what comes back, why it matters, and the CAL/CakeScript licensing distinction. It could go one step further and point to cw_cal_run as the follow-on action, but nothing essential to correct invocation is missing.
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?
The tool takes zero parameters, which sets the baseline at 4 per the rubric; there is nothing for the description to add or omit. The empty schema confirms no parameter semantics are needed.
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 final sentence names the resource concretely: the CAL language reference (fields, operators, builtins), run procedure, generated programs, and known traps. That tells an agent exactly what it gets back. It does not, however, explicitly position itself against the closely related cw_cal_plan / cw_cal_run / cw_cal_cleanup siblings, so the differentiation is implicit rather than stated.
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 strongly implied — the description explains that CAL is the only way to CREATE/DELETE/READ notes without a paid licence, which makes clear why an agent would reach for this reference. But it never says 'call this before cw_cal_run' or 'not needed if you already know CAL syntax', so the when-to-use step is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_cal_planA
The exact plan for a CAL run: the script source, the dialog field to write, and how to prove the result from data. Pure — it writes no file and posts no command, so it is safe to call speculatively. Use cw_cal_run to actually do it.
| Name | Required | Description | Default |
|---|---|---|---|
| mute | No | For setTrackMute: true mutes, false un-mutes. TrackActive TRUE means AUDIBLE — the shipped script comments it as "Un-mute the track". | |
| name | No | For renameTrack: the new track name. | |
| port | No | For setTrackRouting: output port. | |
| maxKey | No | For deleteNotes: high end of the pitch range to remove (inclusive). | |
| minKey | No | For deleteNotes: low end of the pitch range to remove (inclusive). | |
| channel | No | For setTrackRouting: forced MIDI channel, 1..16. | |
| percent | No | For scaleVelocity / setDuration: the percentage to scale by. | |
| program | Yes | Which generated program to plan. NOTES: setVelocity | scaleVelocity | addNotes | deleteNotes | transpose | setDuration | queryNotes | dumpNotes. TRACKS: renameTrack | setTrackMute | setTrackRouting. | |
| velocity | No | For setVelocity: the value to set every note to. | |
| intervals | No | For addNotes: semitone offsets to add above each source note, e.g. [12,16,19]. Negative values add below. | |
| semitones | No | For transpose: the interval. SIGNED. | |
| trackIndex | No | For the track programs: which track, 0-based. CAL counts project tracks from 0; an exported .mid puts the conductor first, so CAL track N is export track N+1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden well: it says the tool writes no file and posts no command, making it safe to call speculatively, and it describes the main returned plan components. It could be slightly richer about determinism or state dependence, but the safety profile and output nature are clearly disclosed.
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 tight sentences with no filler. It front-loads what the tool returns, then gives the key behavioral constraint, then routes to the sibling tool for execution.
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 12-parameter planning tool with a 100%-covered schema but no output schema, the description is largely complete: it explains what the plan contains and why the call is safe. It does not expand the domain term CAL or explain any possible state dependence, leaving minor 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 100%, so all 12 parameters are already well documented in the input schema, including program-specific meanings. The description does not add parameter-level meaning beyond the schema, which is acceptable for a high-coverage schema.
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 output and purpose: it returns the exact plan for a CAL run, including the script source, dialog field to write, and proof method. It also explicitly distinguishes itself from the sibling tool cw_cal_run by saying that cw_cal_run is for actually performing the 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?
It clearly frames the tool as a speculative, side-effect-free planning step and directly names the alternative cw_cal_run for actual execution. The when-to-use and when-to-use-the-other-tool distinction is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_cal_runA
Write a CAL program into the folder SONAR reads, select everything, and open 处理 > 运行 CAL 程序 (0x806A). CAL needs no licence, so this is how notes get CREATED, DELETED or READ on a free build — the edit dialogs cover only transformation. This process cannot click, so it stops at the open dialog and reports the exact steps an accessibility runtime must take. The script ends with a modal pause that has to be dismissed, and CAL reports only a count — prove the effect by exporting and parsing.
| Name | Required | Description | Default |
|---|---|---|---|
| mute | No | For setTrackMute: true mutes, false un-mutes. TrackActive TRUE means AUDIBLE — the shipped script comments it as "Un-mute the track". | |
| name | No | For renameTrack: the new track name. Quotes and backslashes are stripped, since CAL has no escape syntax in any shipped script. | |
| port | No | For setTrackRouting: output port. | |
| backup | No | Write a .bak beside the script file before overwriting it. | |
| maxKey | No | ||
| minKey | No | ||
| channel | No | For setTrackRouting: forced MIDI channel, 1..16. | |
| confirm | No | deleteNotes requires the exact token "deleteNotes". | |
| percent | No | ||
| program | Yes | Which generated program to run. queryNotes RENAMES the track as its output channel, so it needs allowRename. | |
| velocity | No | ||
| intervals | No | ||
| semitones | No | ||
| trackIndex | No | For the track programs: which track, 0-based. CAL counts project tracks from 0; an exported .mid puts the conductor first, so CAL track N is export track N+1. | |
| allowRename | No | queryNotes works by writing its summary into the track name, which modifies the project. Set this to accept that. For reading note data with no side effect, export to .mid and use cw_read_midi_file instead. | |
| selectFirst | No | Post 编辑 > 选择 > 全部 first. The CAL body runs once per selected event, so without a selection these programs do nothing. |
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: the process cannot click, it halts at the open dialog, an accessibility runtime must take over, a modal pause must be dismissed, and CAL returns only a count so the effect must be proven by export and parse. These are exactly the non-obvious traits an agent would otherwise discover by failing.
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 dense sentences, front-loaded with the mechanical action before the constraints and the verification strategy. Every sentence carries information, though the modal-pause and count-reporting points could be tightened into one clause.
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 16-parameter, no-output-schema tool this covers the essentials: the human-in-the-loop stop, the required dismissal step, and how to verify results without a return value. It leaves the overwrite/backup behavior and the destructiveness of deleteNotes to the schema rather than restating them.
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 63%, which is mid-range, and the description adds almost no parameter meaning of its own beyond implying the select-all step that maps to selectFirst. The important parameters (program enum, allowRename, confirm, backup) are documented in the schema, not here, so baseline 3 applies.
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?
Specific verb and resource: 'Write a CAL program into the folder SONAR reads, select everything, and open 处理 > 运行 CAL 程序 (0x806A)'. It also draws the boundary against the edit dialogs ('the edit dialogs cover only transformation'), so an agent can distinguish it from cw_edit and the cw_cal_* family without opening schemas.
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?
States a clear when-to-use: CAL is how notes get CREATED, DELETED or READ on a free build because the dialogs only transform. It does not explicitly name cw_cal_plan or cw_cal_help as the alternative for planning/diagnosis, and excludes nothing by name, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_check_quantizeA
Judge a quantize from actual data instead of guessing. Give it the note ticks before the edit and the ticks the exported file now holds, and it computes what the settings should have produced and says whether they match and whether the notes landed on the grid. Pass before and after as tick arrays, or pass file paths to read them. The judgement is pure arithmetic, so it works without SONAR running.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | The grid the quantize targeted | 16 分音符 |
| after | No | Note start ticks in the exported file | |
| swing | No | Swing that was set. 50 is straight; any other value means the verdict's on-grid test is straight-grid only and says so | |
| before | No | Note start ticks before the edit | |
| strength | No | The strength that was set. Must be the value actually written to the dialog, not the default — a stale 50 explains a half-moved result. | |
| afterFile | No | Read `after` from this .mid instead | |
| beforeFile | No | Read `before` from this .mid instead |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that the judgement is pure arithmetic, requires no SONAR, and reports match plus on-grid status. It implies a non-mutating read/verify operation, though it doesn't explicitly state that no project state is changed.
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 sentences, front-loaded with the core purpose, then input modes, then the no-SONAR context. Every sentence adds information without redundancy.
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 output schema, the description explains what the verdict covers (match and on-grid status) and the SONAR independence. It stops short of describing the exact return shape, but it is sufficient for an agent to call the tool and interpret the result.
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 100%, so the baseline is 3, but the description adds value by clarifying that `before`/`after` can be given as tick arrays or as file paths (`beforeFile`/`afterFile`). The swing and strength caveats live in the schema descriptions and are not repeated, which is appropriate.
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 ('judge'), resource ('quantize'), and the exact mechanism (compare before/after ticks against computed expectations). It is clearly distinguishable from sibling tools like cw_quantize_plan or cw_quantize_dialog, which plan or open dialogs rather than verify results.
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 explains how to supply data (tick arrays or file paths) and notes that it works without SONAR running, giving useful context for when it can be used. It does not explicitly name alternative sibling tools or state when not to use this one, but the input instructions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_close_overlaysA
Close transient panels. Standard dialogs, including unsaved-work prompts, are preserved by default. Dismissing them may discard work and requires closeDialogs:true and confirm:"closeDialogs".
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| closeDialogs | 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 the destructive risk ('may discard work'), the default preservation behavior, and the exact opt-in gate. It omits return behavior, reversibility (undo), and any failure modes, which keeps it from a 5.
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 sentences with the safe default front-loaded followed by the escalation path. No filler; every sentence adds behavioral or parameter information an agent needs.
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 2-parameter mutation tool with no annotations and no output schema, the description covers scope, default safety, and the opt-in mechanism adequately. It leaves undefined what 'transient panels' concretely are in this application and says nothing about the result or recoverability, which a careful agent might want.
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 compensation is required, and the description delivers the literal value the schema never states: confirm must equal "closeDialogs" and closeDialogs must be true. Both parameters are given meaning beyond their bare types, including the default-off semantics of closeDialogs.
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 and resource ('Close transient panels') and immediately clarifies what is out of scope, implying the boundary with cw_list_overlays. It does not name a sibling alternative, but the transient-vs-standard-dialog distinction makes the tool's target identifiable 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 a clear selection rule: use by default to close transient panels, and only escalate to dismissing dialogs when work loss is acceptable, gated behind two parameters. It stops short of naming alternatives like cw_list_overlays or cw_undo for recovery, so it is not a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_command_evidenceB
Which commands have been confirmed to work, which are unconfirmed and why. Unconfirmed does NOT mean broken: a toggle or a transport action never opens a window, so a window diff reports nothing. This says which witness would settle each one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 disclose a genuinely non-obvious trait: absence of confirmation is not evidence of breakage, because toggles and transport actions never open a window and so window-diff witnesses report nothing. That head-off-a-false-negative warning is the kind of context annotations could not provide. It stops short of stating that the call is read-only or what the output record contains.
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 sentences with no padding, and the core distinction (confirmed vs unconfirmed) is front-loaded. The closing clause about 'which witness would settle each one' is terse to the point of being slightly cryptic out of context.
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 exist, so the description must convey the return shape, and it does: per-command status, reasons for being unconfirmed, and a suggested witness. Missing is any statement of the operation's safety profile or scope (whole command set vs current context), but for a zero-argument diagnostic report this is close to sufficient.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description does not need to explain any argument semantics.
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 conveys the content of the report (confirmed vs unconfirmed commands and reasons), which is more than a restatement of the name. But it is framed as a question rather than a stated action, and it never distinguishes itself from close siblings like cw_verify_commands, cw_command_support, or cw_list_commands, which an agent could easily confuse with it.
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 when-to-use or when-not-to-use guidance, and no named alternative. The explanation of what 'unconfirmed' means helps interpret results but does not tell the agent under what circumstances to reach for this tool versus the verification siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_command_supportA
What WM_COMMAND can actually drive in this SONAR build, measured. Working commands are main-frame ones (Preferences, About, Assistant, Video Engine, Reset MIDI/Audio). The 视图 menu, CakeScript and per-track mixer commands are registered but not dispatched, so posting them does nothing — this tool says so up front instead of leaving you to discover it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it explains that some commands are registered but not dispatched, so posting them is a no-op. It does not explicitly state that the tool itself is read-only or side-effect-free, but the behavioral warning is the key information an agent needs.
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 core capability and then gives concrete examples of working and non-working command families. It is generally efficient, though the closing phrase about not leaving you to discover it is slightly 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 zero-parameter tool, the description gives enough context to know when to consult it and what categories it covers. However, there is no output schema and the description does not specify the return shape, such as whether it returns a list, mapping, or per-command status records, leaving some ambiguity about what the agent will receive.
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?
The tool has zero parameters, so the baseline is 4. There are no parameter semantics to compensate for, and the description correctly focuses on what the tool reports rather than input arguments.
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 capability: reporting which WM_COMMAND actions actually work in this SONAR build. It is clearly a support/capability lookup tool, not an executor or command lister, but it does not explicitly name close siblings such as cw_list_commands or cw_command_evidence to sharpen 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?
It gives clear usage context by saying this tool tells you up front what is supported and warns that posting unsupported commands does nothing. It does not name alternative tools or explicitly say when not to use this one, but the intended usage condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_convertA
Convert between ticks, bar:beat:tick and seconds. Pure arithmetic — it needs no project and works with SONAR closed, so a measurement already in hand can be converted without waking anything. Pass exactly one of: ticks | time ("1:01:000") | seconds | bar. Note the bases: bare numbers are BARS, and in bar:beat:tick only the final field is 0-based — 1:01:000 is the start of a project, which is what a freshly opened one reads.
| Name | Required | Description | Default |
|---|---|---|---|
| bar | No | A bar number (1-based). | |
| bpm | No | Tempo for the seconds conversion. Only seconds depend on it. | |
| time | No | A bar:beat:tick position as SONAR displays it, e.g. "1:01:000" or "5:02:120". Bar and beat are 1-based; the tick field is 0-based. | |
| ticks | No | A tick count to convert. | |
| seconds | No | A time in seconds, or as "mm:ss.mmm". | |
| timeSig | No | Time signature as [numerator, denominator]. Affects only bars and beats. |
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 disclose key traits: side-effect-free arithmetic, no project/SONAR dependency, and a mutually exclusive input rule. The 'bases' warning about 1-based bars vs 0-based ticks prevents a real class of mis-calls. It does not state the return shape, which matters given there is no output schema.
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 compact sentences: the operation, then the environment constraint, then the exclusivity rule, then the gotcha about bases. Nothing is wasted and the most decision-relevant fact (no project needed) is front-loaded.
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 6-param, all-optional, non-mutating utility with no annotations and no output schema, this covers the calling contract well: inputs, exclusivity, defaults implied by bpm/timeSig schema notes, and base conventions. The one material gap is the absence of any statement about what the tool returns (all representations? a single value?), which the missing output schema leaves entirely undisclosed.
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 100%, so the baseline is 3; the description earns extra by stating the exactly-one-of constraint that the schema's all-optional properties do not express, and by clarifying that bare numbers are BARS. The base-convention note largely duplicates the schema's own 'Bar and beat are 1-based; the tick field is 0-based' wording, which limits the added value.
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 and resource: 'Convert between ticks, bar:beat:tick and seconds', naming all three domains of the transformation. It is immediately distinguishable from every sibling, including cw_convert_help, because no other tool claims arithmetic conversion.
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 real usage context: 'Pure arithmetic — it needs no project and works with SONAR closed', which tells an agent to reach for this instead of any state-dependent tool. It also states the exclusivity rule 'Pass exactly one of: ticks | time | seconds | bar'. It stops short of naming an alternative sibling (e.g. cw_convert_help) for edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_convert_helpA
The time units this project uses, the 1-based/0-based trap in bar:beat:tick, the grid note values in ticks, and what the conversions cannot do (tempo changes).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It helpfully discloses the limitation that conversions cannot handle tempo changes, which is real behavioral context, but it never states that the tool is a pure read-only reference with no side effects or what form the returned text takes.
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?
A single tight sentence with no filler, listing the covered topics. The ordering is slightly list-like rather than front-loading the single most important point (the 1-based/0-based trap), but nothing is wasted.
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 zero-parameter help tool with no output schema, the description covers what an agent needs to decide to call it. A sentence clarifying that it returns static reference text and pairs with cw_convert would close the remaining gap.
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?
The tool takes zero parameters, so there is nothing to document and the schema is trivially complete; the baseline of 4 applies. The description correctly introduces no parameter-like guidance that would be misleading.
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 enumerates the exact topics the tool covers — time units, the 1-based/0-based bar:beat:tick trap, grid note values in ticks, and conversion limitations. The verb is only implied by the name (it returns reference documentation rather than performing a conversion), but the scope is specific enough to distinguish it from cw_convert.
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: an agent can infer this is the reference companion to cw_convert, but the description never says 'read this before calling cw_convert' or when this is preferable to cw_convert itself. No exclusions or sequencing guidance are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_doctorA
Run a health check across every transport channel (host / CakeScript / WM_COMMAND / surface bridge / realtime MIDI / UIA click), each with a verdict and a remedy. THE tool to run first after a SONAR upgrade: it names which paths degraded and what to update.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It usefully states the output shape ('each with a verdict and a remedy') and the scope, but never states that the check is read-only/non-destructive, nor whether the realtime MIDI and UIA click probes actively stimulate the host (potentially audible notes or synthetic clicks). That is a material undisclosed behavior for a diagnostic that touches live transports.
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?
Two sentences, no filler. The scope enumeration comes first, and the when-to-use guidance follows immediately. Every clause 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?
No output schema exists, and the description does supply the return shape informally (per-channel verdict plus remedy). For a zero-parameter diagnostic this is close to sufficient; the remaining gap is the absence of any note on side effects or runtime cost of the live MIDI/UIA probes.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a parameterless, whole-system sweep rather than a targeted check.
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 ('Run a health check') and enumerates the exact scope: host, CakeScript, WM_COMMAND, surface bridge, realtime MIDI, UIA click. It clearly distinguishes itself from state-reading siblings like cw_status or cw_midi_status by being a cross-channel diagnostic, though it never names those siblings 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?
'THE tool to run first after a SONAR upgrade' gives a concrete triggering condition, which is stronger than most usage guidance. However, no when-not conditions or explicit alternatives (e.g. cw_status, cw_benchmark, cw_latency for narrower checks) are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_document_stateA
Whether SONAR has a document open, read from the window title — the one piece of project state this process can see. This gates a lot: with no project the menu bar has only the application-level menus and the track controls do not exist, which makes view and document commands look broken. With a project open the menu tree is 270 entries and the track strips appear.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and provides substantial behavioral context: it reads the window title, discloses downstream effects (menu bar composition, track controls existing or not, menu tree size), and explains why commands can appear broken. It stops short of explicitly stating the tool is read-only or describing the exact boolean return format, but the critical operational behavior is disclosed.
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 sentences, front-loaded with the core definition, and every sentence earns its place by explaining why the state matters. There is no repetition or filler; the detail about menu tree size and track strips is directly useful for interpreting the output.
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, parameterless boolean state check with no annotations or output schema, the description is largely complete: it explains what is checked and why it matters. It could be improved by explicitly stating the return type and that the tool is read-only, but the gating context covers the main ambiguity.
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?
The tool has zero parameters, so there are no parameter semantics to document and the schema coverage is 100%. The description appropriately adds no parameter details, matching the baseline for parameterless tools.
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 clearly states that the tool reports whether SONAR has a document open, read from the window title, and explains its scope as the one piece of project state this process can see. It distinguishes itself from generic state tools through this specific framing, though it does not explicitly differentiate from siblings like cw_get_state or cw_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?
Usage is implied through the gating explanation: with no project, view and document commands look broken, so an agent can infer it should check this state before such commands. However, there is no explicit when-to-use guidance or named alternatives, leaving the agent to infer the correct sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_editB
Run an editing command: quantize | grooveQuantize | transpose | splitClips | splitAtNow | splitMidiNotes | mergeClips | gain | normalize | reverse | removeSilence | fadeEnvelope. Every one needs a selection, which this tool satisfies first — that precondition is the difference between "the command does nothing" and "it opens its dialog".
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| confirm | No | Required for the destructive ones, e.g. confirm: 'normalize' | |
| selectFirst | 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 helpfully discloses that every command requires a selection and that auto-selection determines whether the command does nothing or opens its dialog. It does not disclose which commands are destructive, whether confirmation is required, or what state changes occur.
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 verb and command list, and it avoids redundant padding. The selection sentence is slightly conversational but still earns its place by explaining non-obvious behavior.
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 multi-command editing tool with destructive operations, no annotations, no output schema, and low schema description coverage, the description is under-specified. It omits destructive/confirm behavior and sibling routing, even though those are central to invoking it safely and 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 coverage is only 33%, so the description should compensate. It explains the selection prerequisite behind selectFirst and lists the command values, but it does not explain confirm or identify which commands require it, leaving a meaningful gap.
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 gives a specific verb/resource ("Run an editing command") and enumerates the exact command set, so the tool's role is clear. However, it does not distinguish this dispatcher from nearby siblings such as cw_run_command, cw_quantize_dialog, or cw_transpose_plan.
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 a selection precondition, but gives no guidance on when to use cw_edit versus alternatives like cw_run_command or command-specific plan/dialog tools. There are no exclusions or routing rules beyond the selection note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_edit_helpC
The editing layer: the commands, their preconditions, the dialogs behind them, and the three-cause taxonomy for "a probe reported nothing happened".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does not disclose that the call is a side-effect-free documentation read, that it returns prose rather than state, or how large the payload is. It hints at internal structure (three-cause taxonomy) which is useful, but the safety/return profile is entirely unstated.
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?
A single compact sentence with no filler. However it opens with an abstract nominal phrase ('The editing layer:') rather than a front-loaded statement of what the tool does, so the most useful information arrives somewhat indirectly.
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?
The low-complexity shape (no params, no output schema) limits what is required, and enumerating the topics covered is a real contribution. Still missing are the two facts an agent most needs: that this returns documentation and is safe to call, and how it relates to cw_edit and cw_no_effect_causes.
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?
Zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. No parameter text is needed or expected here.
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 subject matter (the editing layer, its commands, preconditions, dialogs, and a failure taxonomy) but never uses a verb or states that this is a documentation/help endpoint that returns reference material rather than performing edits. It contrasts implicitly with the sibling cw_edit (which does the editing), but the 'three-cause taxonomy' overlap with cw_no_effect_causes is not addressed. An agent can guess the topic but not the 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?
There is no statement of when to call this versus cw_edit, cw_note_edit_help, cw_cal_help, or cw_no_effect_causes, and no prerequisite or sequencing guidance. The reader must infer that this is a 'read the manual first' tool from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_enable_midi_portA
Enable a MIDI port in SONAR by writing TTSSEQ.INI, so the MIDI transport reaches SONAR without touching the UI. Idempotent. SONAR applies it at startup or when its MIDI Devices dialog is applied — not live in the current session.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port name exactly as Windows reports it, e.g. "Studio One AI Notes" | |
| backup | No | Write a .bak beside the file before changing it | |
| section | No | input |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does so well: it discloses that the tool writes a config file, that it is idempotent, and that the effect is deferred until restart/dialog apply. It omits whether existing entries are preserved or how failure is reported, which would complete the picture for a file-mutating 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?
Two tight sentences with nothing wasted; the mechanism and the outcome are front-loaded and the deferral caveat follows immediately.
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 three-parameter file-writing tool with no annotations and no output schema, the description covers mechanism, safety-relevant idempotency, and timing of effect. Only minor gaps remain (validation of the port name, behavior on write failure) and none block a correct call.
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 67%: 'port' and 'backup' are documented in the schema, but 'section' has an enum with no description anywhere. The description adds no parameter-level meaning, so the baseline 3 for partially documented params is right.
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 and resource ('Enable a MIDI port in SONAR') and the exact mechanism ('by writing TTSSEQ.INI'), plus the outcome ('the MIDI transport reaches SONAR'). That mechanism clause implicitly separates it from UI-driven siblings like cw_midi_devices or cw_ui_recipe.
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 an explicit when-not: the change is not live in the current session and only applies at startup or when the MIDI Devices dialog is applied, which steers the agent away from expecting immediate effect. It stops short of naming a sibling to use instead when a live change is wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_file_dialogA
How to drive the file dialog a document command opens: the element names, and why this one IS scriptable when SONAR's own controls are not (it is standard MFC, not drawn).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 add meaningful context by explaining that this dialog is scriptable because it is standard MFC rather than drawn, but it does not describe return format, side effects, or how the element names should be used.
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 front-loaded sentence that immediately names the subject: driving the file dialog opened by a document command. The parenthetical rationale is useful context, though the sentence is slightly discursive.
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 zero-parameter reference/help tool with no output schema and no annotations, the description should make clear what the tool returns and how to use it. It says the tool covers element names and scriptability rationale, but it does not describe the shape of the returned guidance or how an agent should act on it.
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?
The tool takes zero parameters, so there are no parameter semantics to document. The empty schema is consistent with the description, and no compensating parameter explanation is needed.
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 a specific resource: the file dialog opened by a document command, and states that it covers element names and scriptability rationale. However, it never states the tool's own action—whether it returns guidance, lists elements, or explains behavior—and does not explicitly distinguish itself from siblings such as cw_ui_recipe or cw_navigate.
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 phrase 'a document command opens' implies the usage context, so an agent can infer this tool is relevant when a file dialog appears. But there is no explicit when-to-use guidance, no when-not-to-use conditions, and no named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_find_pluginB
Search registered plugins by name. Covers effects and instruments; instruments are the ones to load into a track. Each result carries its CLSID, its file path, and whether the file is still present.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| query | Yes | Substring to match against plugin name or file path, e.g. "bass" | |
| presentOnly | No | Hide plugins whose file is missing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load. It usefully discloses return content (CLSID, file path, file presence), which is valuable since there is no output schema, but it does not explicitly state read-only behavior, pagination/default-limit behavior, or what happens when results exceed the limit.
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 sentences, front-loaded with the core action and followed by scope clarifications and return-value hints. Every sentence adds information; the only blemish is the slightly imprecise 'by name' phrasing.
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 no annotations, no output schema, and 50% parameter coverage, the description does well to describe result fields and the instrument/effect distinction. However, it omits the limit parameter entirely and leaves search semantics (name vs. file path) and read-only safety implicit.
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 50%: query and presentOnly are described there, while kind and limit lack schema descriptions. The description adds real meaning for kind ('instruments are the ones to load into a track'), but says nothing about limit and loosely calls the search 'by name' even though the schema query matches name or file path.
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 (search registered plugins) and clarifies scope (effects and instruments, instruments are the ones to load into a track). This differentiates it reasonably from siblings like cw_plugins or cw_plugin_insert_recipe, though it does not name an alternative 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?
The remark that instruments are loadable into a track implies the tool's role in an insert workflow, but there is no explicit when-to-use/when-not guidance or named alternative. An agent must infer that this is the lookup step before cw_plugin_insert_recipe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_get_clipsB
List clips on a track. NEEDS CakeScript (T1), which this SONAR build cannot dispatch.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden, and it does disclose a critical trait beyond the schema: the tool depends on CakeScript (T1) and is non-functional in this build. It says nothing about permissions, return shape, or ordering, but the unavailability flag is the highest-value disclosure an agent needs.
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?
Two short sentences, front-loaded with the action and immediately followed by the blocking constraint. Nothing is padded, though the phrasing is telegraphic enough that the meaning of 'T1' is left unexpanded.
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 single-parameter tool with no annotations and no output schema, the description covers the critical unavailability constraint but omits what 'index' means and what a successful call would return. Adequate as a stop-sign, incomplete as a usage guide.
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% and the sole parameter 'index' (integer, minimum 1) is never explained. The description does not say whether index refers to a track index, a clip index, or whether the 1-based constraint matters — it should compensate for the empty schema and does not.
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 and resource ('List clips on a track'), which distinguishes it from clip-adjacent siblings like cw_get_notes and cw_list_overlays. The purpose is unambiguous, though the operative fact for an agent is that the tool cannot run in this build.
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 'which this SONAR build cannot dispatch' clause effectively tells the agent never to call it here, which is valuable exclusion guidance. However, it names no alternative for reading clip data, so the agent is left to guess which sibling to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_get_notesA
Get the notes of a clip on a track (default clip 1). NEEDS CakeScript (T1), which this SONAR build cannot dispatch. The export route is the verified way to read note data on this build.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| clipIndex | 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 discloses the critical behavioral limitation: this build cannot dispatch the required CakeScript call. It does not describe return format or permissions, but the key blocker is surfaced clearly.
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?
Two sentences with the purpose front-loaded and the key limitation immediately after. The CakeScript dependency is compactly stated, though the export-route reference could be more concrete.
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?
The description gives the essential warning that this tool cannot work on this build and suggests an export route, but it does not name the concrete alternative tool or explain the required index parameter. For a two-parameter, no-output-schema tool this is adequate but incomplete.
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%, and the description only explains the clip default (clip 1). It does not clarify the required index parameter, which likely identifies the track, leaving half the parameters 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?
States a specific verb and resource: get the notes of a clip on a track, with the default clip index. It clearly distinguishes note retrieval from clip listing, though it does not explicitly name a sibling.
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?
Explicitly warns that the tool needs CakeScript (T1), which this SONAR build cannot dispatch, and points to the export route as the verified alternative. The guidance is clear but the alternative route is not mapped to a specific sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_get_stateA
Read the most recent observation for a topic. Reports staleness and why it is empty when nothing has been observed yet.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | overview |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose two useful behaviors: it reports staleness, and it explains why the result is empty when nothing has been observed yet (implying an explanatory empty result rather than an error). It does not describe the shape of an observation payload, but this is meaningful behavioral context for a read-only lookup.
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?
Two short sentences with zero filler; the core action is front-loaded and the edge-case behavior follows. Nothing is redundant with the schema or restated.
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 one-parameter read tool with no output schema, the description covers the purpose and the empty-result edge case, but leaves the topic vocabulary and the returned observation content undocumented. An agent can call it, but cannot confidently pick the right topic value.
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 single 'topic' parameter, and it does not: it only restates that a topic is involved. The enum values (overview, tracks, mixer, notes, selection, all) are listed in the schema but their meaning and the difference between 'all' and the individual topics are unexplained anywhere.
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 and resource ('Read the most recent observation for a topic'), which distinguishes it from a list-style read like cw_list_state by emphasizing most-recent semantics. It never names its siblings (cw_list_state, cw_probe_state, cw_report_state), so the differentiation is implied rather than explicit.
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 word 'most recent' implies this is the single-value lookup as opposed to a listing, but there is no explicit when-to-use guidance and no mention of when to prefer cw_list_state or cw_probe_state. Usage is inferred from the phrasing rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_get_trackA
Get one track's properties. NEEDS CakeScript (T1), which this SONAR build cannot dispatch. cw_get_track_control reads a single strip control and works without it.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | 1-based track index |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral burden; it discloses the critical trait that the tool cannot be dispatched in this build, which is far beyond what the schema says. It stops short of describing the actual failure mode (error vs. empty result) or what 'properties' are returned, which would be needed for a 5.
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 sentences, zero waste, with the capability description first and the limitation/alternative immediately after. 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 tool that is effectively non-functional in this build, the description gives the essential context an agent needs: what it does, why it may not work, and where to go instead. It omits return-value shape and failure behavior, but with no output schema and a simple getter, that gap is minor.
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 100% and the single 'index' parameter is fully documented as a 1-based track index. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
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 and resource ('Get one track's properties') and explicitly differentiates itself from the sibling cw_get_track_control, which reads a single strip control. An agent can tell exactly what this tool returns versus its nearest alternative without opening either 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?
Explicitly says the tool needs CakeScript (T1) which 'this SONAR build cannot dispatch', and names cw_get_track_control as the working alternative. This is a clear when-not-to-use plus a direct routing instruction, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_get_track_controlA
Read one track-strip control as SONAR currently shows it — any label, e.g. 音量, 声像, 手动静音, 独奏, 录制, 输入, 输出, 存档. Reading is accurate; writing is only available for the three toggles (cw_set_track_mute / solo / arm).
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| label | Yes |
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 that reads are accurate/current and that writes aren't possible here, which is useful. However it says nothing about failure behavior for an unknown label, label matching rules, or the format/precision of the returned value.
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?
Two front-loaded sentences; the label example list earns its space by supplying the schema-missing vocabulary, and the write-scope caveat is the second thing the agent reads.
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 never describes the return value (units, ranges, raw vs. normalized text) — a notable omission for a tool whose sole job is returning a value. Label discovery guidance is also absent.
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. The label examples (音量, 声像, 手动静音, 独奏...) give real vocabulary the schema lacks, but the meaning of 'index' (track index? 1-based?) and label matching semantics are never explained.
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 and resource ('Read one track-strip control') plus a live-state qualifier ('as SONAR currently shows it'). It also distinguishes itself from the write-side siblings by naming cw_set_track_mute/solo/arm as the only writable controls.
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?
'Reading is accurate; writing is only available for the three toggles' clearly routes the agent to the setters when mutation is needed. It does not say how to discover valid labels (e.g., via cw_track_controls), so the agent may guess at label strings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_historyA
Open 编辑 > 历史 (0x8044) and report how to read and use the undo stack. The dialog lists every undoable operation as a row, OLDEST FIRST, which makes this the one place in this host where the write history is legible rather than inferred. Reading it changes nothing; choosing an older row and pressing 确定 rewinds TO that point and DISCARDS everything after it — so for a single step use cw_undo instead. Note the stack is depth-limited (measured 128) and old entries are dropped silently.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states that reading changes nothing, that selecting an older row and confirming rewinds to that point and DISCARDS everything after it, and that the stack is depth-limited (~128 entries) with silent drops. These are exactly the safety and side-effect facts an agent needs before touching an undo history.
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 tight sentences, front-loaded with the action (which dialog, which command ID) followed by ordering, destructive behavior, alternative, and limits. Every sentence adds information an agent would otherwise have to guess.
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, so the description should say what comes back; it explains the dialog contents and oldest-first row ordering, which lets an agent infer the report, but does not describe the result format explicitly. Given the tool has no parameters and rich safety/limit disclosures, the coverage is otherwise strong.
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?
The tool takes zero parameters, so the schema carries no semantic load and the baseline of 4 applies. The description appropriately spends no words on parameters.
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 and resource — open the Edit > History dialog (0x8044) and report how to read/use the undo stack — and immediately distinguishes it from its nearest sibling by naming cw_undo for single-step rewinds. An agent can tell exactly what this tool is for without opening any 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?
Explicitly routes single-step undo to cw_undo and frames this tool as the one place the write history is legible rather than inferred, which is a clear use case. It stops short of a full when/when-not rule set (e.g., no guidance on when inspecting history is warranted versus just redoing), but the alternative routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_history_helpA
How undo/redo work here, the undo-stack dialog as measured, why the stack is the backstop for every irreversible write path, and the trap in verifying a rewind (a window diff sees nothing, so "none-observed" reads like failure when it is success).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 add genuine domain substance — that the undo stack is the backstop for irreversible writes and that "none-observed" in a window diff is a false-failure signal — but it never states that the tool itself is read-only, side-effect-free, or what form the returned help takes.
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?
A single front-loaded sentence covering four named topics with no filler, though the nested parenthetical and quoted "none-observed" make it denser and harder to parse than necessary.
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 zero-parameter, no-output-schema help tool, the topic list is sufficient to decide whether to call it. The only missing piece is an explicit statement of what it returns and that it has no side effects, which is minor for a help resource.
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?
The tool takes zero parameters and the schema has full coverage, so parameter semantics carry no burden; the baseline of 4 applies.
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 concrete topic statement ("How undo/redo work here") plus a list of the specific subjects covered: undo-stack dialog, irreversibility backstop, and the rewind-verification trap. It is clearly a help/explanation resource, distinguishing it from the action-oriented siblings cw_undo, cw_redo, and cw_history, though it never explicitly says it returns documentation rather than performing history operations.
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: an agent can infer it should read this before relying on cw_undo/cw_redo or before concluding a rewind failed, but no explicit when-to-use statement or routing to/away from siblings is given. Sibling help tools (cw_edit_help, cw_job_help, cw_cal_help) are not referenced as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_insert_commandsA
Every 插入 (Insert) command SONAR exposes, with its id. Reference for cw_run_command when you need something cw_add_track does not cover, e.g. a track template.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It implies a safe read-only lookup and that entries carry ids, but says nothing about the return shape beyond 'with its id' — no mention of how many commands, whether they are grouped, or what the id format looks like for passing to cw_run_command.
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?
Two sentences, front-loaded with what the tool returns, followed by the routing condition. Zero filler and no repetition of the tool name.
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, and the description only loosely sketches the return value ('with its id'). For a zero-parameter reference-list tool this is close to sufficient, but it should say what a returned entry contains and how the id plugs into cw_run_command.
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?
The tool takes zero parameters and the schema has 100% coverage with an empty properties object, so there is nothing the description needs to disambiguate. Baseline 4 applies; no parameter-level guidance is required or missing.
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 resource and scope: 'Every 插入 (Insert) command SONAR exposes, with its id' — a scoped command reference rather than a general list. It does not name the nearest ambiguous sibling (cw_list_commands), so an agent must infer that this is the Insert-filtered subset, but the scope wording makes the distinction 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?
Explicitly routes usage: 'Reference for cw_run_command when you need something cw_add_track does not cover, e.g. a track template.' This names the downstream consumer and the fallback trigger, implying the negative case (if cw_add_track suffices, skip this). It omits any comparison to cw_list_commands / cw_view_commands, which is the one real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_insert_track_templateA
Insert a track template into the project by name (or full .cwx path), then confirm it by finding the new track in the strip accessibility tree. Needs a project open. Use cw_list_track_templates to see what is available.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Template name, e.g. "Bass Rock Rhythm", or a full .cwx path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description has to carry the behavioral burden; it does disclose a prerequisite and a verification behavior (confirming via the strip accessibility tree), which is genuinely useful. However, it says nothing about what happens when the template name is not found, whether the insert is undoable, or where the new track lands.
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?
Two compact sentences, front-loaded with the action and identifier forms, followed by the verification step and the discovery pointer. No 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 one-parameter mutation tool with no output schema, the description covers the action, input forms, prerequisite, and how success is confirmed. Failure behavior and undo semantics are the remaining 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 coverage is 100% and the schema already documents name with an example, so the description's "by name (or full .cwx path)" mostly restates it. Baseline 3 applies; no additional syntax or resolution rules are added beyond the schema.
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 (Insert) and resource (track template) plus the accepted identifier forms, and distinguishes itself from cw_list_track_templates and the generic cw_add_track. It also describes the post-insert confirmation step, so the agent knows exactly what the call accomplishes.
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 an explicit precondition ("Needs a project open") and routes the agent to cw_list_track_templates for discovery. It stops short of stating when to prefer cw_add_track or what to do if the project is closed, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_jobA
Read one background job by id: state, elapsed time, progress trail, result or error. Poll this after a slow tool returns a job id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Job id, as returned by a slow tool |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work: 'Read' establishes read-only semantics, and the enumerated return fields cover progress and terminal outcomes (result or error), which is the behavior an agent needs for a polling loop. It omits edge behavior such as an unknown/expired job id or how to detect completion and stop polling.
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?
Two sentences, zero filler. The identification of what is read comes first, followed by the polling instruction, so the actionable guidance is not buried.
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 one-parameter read tool with no output schema, describing the return contents inline is the right compensation, and the polling hint completes the async workflow. Minor remaining gap: no mention of terminal states or what to do if the job is gone.
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 100% and the single 'id' parameter is already documented as 'Job id, as returned by a slow tool', which the description essentially restates. No additional format, length, or sourcing guidance is added, so 3 is the appropriate baseline.
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?
"Read one background job by id" gives a specific verb and resource, and the colon-list (state, elapsed time, progress trail, result or error) tells the agent exactly what comes back. The singular 'one ... by id' implicitly separates it from the plural sibling cw_jobs, but no sibling is named outright.
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?
"Poll this after a slow tool returns a job id" is an explicit trigger condition tied to the async pattern, which is the main ambiguity for a job-inspection tool. It stops short of naming alternatives (cw_jobs, cw_job_abandon, cw_job_clear) or stating when not to poll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_job_abandonA
Mark a background job abandoned so its result is discarded. This does NOT stop the work: a menu command already posted to SONAR cannot be recalled. It only stops this adapter from reporting the result.
| Name | Required | Description | Default |
|---|---|---|---|
| id | 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 and does well: it explicitly says the work is not stopped, that a posted SONAR menu command cannot be recalled, and that only result reporting is suppressed. It does not cover idempotency, error behavior, or what happens if the job has already finished, but the critical non-obvious side effect is disclosed.
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?
Two sentences, front-loaded with the purpose and followed by the most important caveat. Every sentence earns its place with no repetition or 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?
The critical behavioral caveat is present and there is no output schema to explain. Still, for a job-manipulation tool, the description omits how to identify the job via id and what a successful or failed call returns. It is adequate but has clear gaps for an agent invoking it correctly the first time.
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?
There is one parameter, id, with 0% schema description coverage. The description refers only to 'a background job' and never explains what the id represents, where to obtain it, or its expected format. With low schema coverage, the description should compensate but does not.
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: 'Mark a background job abandoned so its result is discarded.' This is far more precise than the tool name alone. It does not explicitly distinguish itself from the sibling cw_job_clear, so sibling differentiation is left implicit.
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 by the warning that the work is not stopped and the result is simply not reported. That helps an agent understand when the tool is appropriate. However, no alternative is named and there is no explicit when-to-use or when-not-to-use guidance relative to cw_job_clear or cw_jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_job_clearA
Forget finished background jobs. Running jobs are kept so a caller does not lose track of them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 running jobs are preserved, which is meaningful beyond the tool name, but it does not explicitly state irreversibility, scope (all finished jobs vs. some subset), permissions, or what the caller gets back.
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 two short sentences with no waste. The core behavior is front-loaded, and the second sentence adds the important preservation rule without 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?
For a zero-parameter cleanup tool with no annotations or output schema, the description covers the essential selective-deletion behavior. It still leaves gaps around destructiveness, whether the operation is reversible, and what a caller should expect after clearing jobs.
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?
The tool takes zero parameters, so there are no parameter semantics for the description to explain. The baseline for a zero-parameter tool is 4, and the description does not introduce any conflicting parameter information.
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 communicates the resource (finished background jobs) and effect (forgetting/removing them), which is enough to distinguish this from general job inspection. However, the verb 'Forget' is metaphorical and it never names a sibling such as cw_job_abandon, so sibling differentiation remains implicit rather than explicit.
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 second sentence implies the key usage boundary: finished jobs are cleared while running jobs are retained. That is useful usage context, but the description gives no explicit when-to-use/when-not-to-use guidance or alternative tool call for abandoning or inspecting running jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_job_helpA
Why background jobs exist here, the states a job moves through, and the one thing the API deliberately cannot do (cancel work already sent to SONAR).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does surface a genuinely non-obvious behavioral fact: work already sent to SONAR cannot be cancelled. It also signals that the tool is explanatory rather than actionable. It does not say whether the content is static or state-dependent, which is the one remaining 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?
A single sentence with three concrete payload items and no filler, front-loaded with the primary topic (why jobs exist). Nothing repeats the name or the title.
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 zero-parameter, no-output-schema help tool this covers the essentials: subject matter, states, and the key hard constraint. What is missing is any pointer to the sibling tools that consume this knowledge, which would close the loop for an agent deciding whether to call it at all.
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?
The schema has zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies a no-argument lookup rather than suggesting any input is expected.
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 concretely what this documentation tool covers: the rationale for background jobs, the job state model, and a hard API limitation. That is more specific than a title restatement, but it never names an action ('read this before using cw_jobs') or contrasts itself with the operational siblings cw_jobs / cw_job / cw_job_abandon, which sit right next to it in the list.
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: an agent must infer that this is a conceptual companion to the job tools and should be consulted before submitting or trying to cancel work. There is no explicit 'use this when' or 'do not use this to inspect a running job – use cw_jobs instead' routing, which is the obvious sibling confusion here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_jobsB
List recent background jobs, newest first, without their payloads.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It usefully discloses ordering (newest first) and that payloads are omitted, but it does not state whether the operation is read-only, what "recent" means, or whether there is any pagination or retention behavior.
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 front-loaded sentence with no wasted words. Ordering and payload omission are stated efficiently.
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 list tool with no output schema and no annotations, the description covers the high-level purpose but omits how many jobs are returned, what fields are included when payloads are stripped, and how the record set is bounded. It is adequate but incomplete.
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?
There is one optional limit parameter, and schema description coverage is 0%. The description entirely omits the limit parameter, so it fails to compensate for the missing schema documentation even though the schema does provide min/max/default values.
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 gives a specific verb and resource ("List recent background jobs") plus ordering and a payload exclusion, so an agent can tell what it returns. It does not explicitly distinguish itself from siblings like cw_job or cw_job_help, but it does characterize the list view rather than detail, abandon, or 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?
Listing "recent" jobs implies a discovery or overview use case, but the description gives no explicit when-to-use or when-not-to-use guidance. It does not route the agent to cw_job for a single job or to cw_job_help for job semantics, leaving that inference to the caller.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_latencyA
Per-operation latency profile: bridge round trips, menu commands, MIDI sends, plugin reads. The plugin-read stage is the slow one, so it is skipped by default for the same reason cw_benchmark is — a bare call must return, not time out.
| Name | Required | Description | Default |
|---|---|---|---|
| includePluginReads | No | Include the plugin-inventory stage. Adds 10s+; skipped by default. |
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 disclose default behavior and the timeout rationale for skipping the plugin-read stage. However, it never states whether profiling 'MIDI sends' actually transmits MIDI (a side-effect question for a diagnostic tool) or whether the operation is safe and non-destructive.
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?
Two sentences, front-loaded with what is profiled and immediately followed by the one decision an agent must make. No filler and no repetition of the parameter name.
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 single-optional-parameter diagnostic with no output schema, the description covers purpose and the one behavioral trap (timeout). It is slightly short on what the returned latency figures look like, but an agent can call it correctly from what is here.
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 100% and the parameter already documents 'Adds 10s+; skipped by default.' The description reinforces which stage is slow and why it is off, but adds no syntax or interaction detail beyond the schema, so the baseline 3 applies.
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 precisely — a per-operation latency profile covering bridge round trips, menu commands, MIDI sends, and plugin reads — so the agent knows this measures timing, not state. It only indirectly differentiates itself from cw_benchmark by referencing it as an analogy rather than stating how the two split the workload.
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 default decision is well covered: plugin reads are off unless explicitly requested, with the reason given. But there is no explicit guidance on when to reach for cw_latency versus the many sibling diagnostics (cw_benchmark, cw_timing, cw_status, cw_doctor), leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_list_commandsA
List SONAR commands. source="live" (default) lists ids that cw_run_command can actually post, read from the running build's menu bar. source="index" searches SONAR's command-palette index (broader, but those ids are not postable).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Case-insensitive substring filter | |
| source | No | live |
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 key traits: live ids come from the running build's menu bar and are postable, while index ids are broader but not postable. It does not mention read-only safety, pagination behavior, or return shape, but the postability caveat is the most important behavioral distinction.
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 two tightly written sentences, front-loads the core action, and immediately explains the important source-mode distinction. Every clause adds useful information without repetition.
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 three-parameter list tool with no annotations and no output schema, the description covers the critical source-mode behavior but leaves the limit parameter and the exact return shape unaddressed. It is adequate but not fully complete for an agent relying on it 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 only 33%, and the description adds meaningful semantics for the source parameter by explaining postability consequences. The query parameter is already documented by the schema, but the limit parameter remains undocumented in both the schema and the description, so compensation for the coverage gap is partial.
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 lists SONAR commands, and it clarifies the two source modes. It also relates live-mode ids to cw_run_command, though it does not explicitly differentiate itself from other command-related siblings like cw_view_commands or cw_command_support.
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 guidance on choosing source="live" versus source="index", including the crucial caveat that index ids are not postable. It stops short of explicitly saying when to use this list tool instead of other sibling command-discovery tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_list_overlaysA
List modal windows (the Assistant / command-palette panel) that block menu commands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 usefully discloses the key behavioral trait of the resource — overlays block menu commands — but does not state that this is a safe read-only enumeration or describe what the returned entries look like.
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?
A single sentence with zero filler, and the defining noun plus its parenthetical clarification are front-loaded. Nothing could be removed without losing 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 zero-parameter read tool with no output schema, the description covers the essentials: what is listed and why it matters. The only mild gap is the shape of the returned list (identifiers vs. descriptions), which an agent must discover at call time.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a parameterless full listing with no filtering options.
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 and resource ("List modal windows") and goes further by defining what an overlay is ("the Assistant / command-palette panel") and its effect ("block menu commands"). It is distinguishable from siblings like cw_list_state, though it never names cw_close_overlays as the companion 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?
The phrase "that block menu commands" implies the situation in which to call it (menu commands failing), but usage is only implied. There is no explicit when-to-use statement or pointer to cw_close_overlays as the follow-up remediation step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_list_stateB
List which project-state topics have been observed, and when.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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. 'List' implies a read-only operation and the phrase 'observed, and when' indicates topics plus timestamps, but the description does not disclose output format, pagination, freshness, or whether state values are included.
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 front-loaded sentence with no wasted words. It states the operation and the returned content immediately.
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 zero-parameter read tool with no output schema, the description is adequate but thin. It says the tool returns observed topics and timestamps, but leaves 'project-state topics' undefined and does not clarify the response shape or how observations relate to sibling state tools.
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?
The tool has zero parameters, so the baseline is 4. The description adds no parameter semantics, but there are no parameters to explain.
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 uses a specific verb ('List') and resource ('project-state topics'), and adds that it returns observed topics and timestamps. It is clear what the tool does, but it does not explicitly distinguish itself from nearby siblings such as cw_get_state, cw_probe_state, or cw_document_state.
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 offers no explicit when-to-use guidance, no exclusions, and no named alternatives. An agent can infer that it is used to inspect observed project-state topics, but that is only implied and does not help choose between this and sibling state tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_list_tracksA
List all tracks in the active SONAR project. NEEDS CakeScript (T1), which this SONAR build cannot dispatch — on this build use the export route instead: cw_run_command 0xA659 (文件 > 导出 > 标准 MIDI 文件), then cw_read_midi_file on the result.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses the most important behavioral fact: the tool requires CakeScript (T1) and is undispatchable on this build. It does not describe error behavior or return format, but the unavailability disclosure is the critical trait for an agent deciding whether to call it.
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?
Two sentences that are front-loaded with the purpose and then the blocker/workaround. The Chinese menu path and command code are dense but necessary to make the workaround actionable, so they earn their 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 zero-parameter tool with no annotations and no output schema, the description supplies the essential operational context: it is unavailable and here is the substitute path. Minor gaps remain around what format the track list would take and how failures surface, but an agent has what it needs to act 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?
Zero parameters, so the baseline of 4 applies; there is no parameter semantics to add or omit.
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 and resource: 'List all tracks in the active SONAR project', which an agent can immediately understand. It does not differentiate itself from list-adjacent siblings such as cw_list_state or cw_get_clips, but its unavailability warning effectively redirects the agent anyway.
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?
Explicitly says this build cannot dispatch the tool and gives the exact alternative route: cw_run_command 0xA659 followed by cw_read_midi_file on the result. This is a textbook when-not-to-use plus named alternatives plus a concrete workaround sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_list_track_templatesA
List the .cwx track templates SONAR has available, with their category. A template is a whole pre-built strip — instrument, FX chain, sends, routing — and inserting one is the verifiable way this adapter puts a plug-in chain into a project.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Only templates whose name or category contains this |
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. "List" implies a safe read operation, and the second sentence adds useful domain context about templates and insertion, but it does not describe return format, pagination, permissions, or other listing behavior.
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 two sentences with no wasted text. It front-loads the listing purpose and then briefly clarifies the domain term "template," which earns its place by helping an agent understand the resource.
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 read-only listing tool with a fully documented schema parameter, the description is mostly complete: it says what is listed and that categories are returned, and it explains what a template is. Minor gaps remain because it does not mention the filter or return structure beyond category, but no output schema exists to require that.
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?
The single optional filter parameter is fully documented in the schema, which states that it matches name or category. The description does not add any further meaning about the filter, so the schema does the heavy lifting and the baseline 3 is appropriate.
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 lists the .cwx track templates SONAR has available and says the category is included. It is clearly different from insertion tools in practice, but it does not explicitly name or distinguish itself from the sibling cw_insert_track_template.
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 explains what a template is and that inserting one is a verifiable way to put a plug-in chain into a project, which implies this list is useful before insertion. However, it never explicitly says when to use this tool versus cw_insert_track_template or other track-listing tools, and it gives no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_locateA
Move the now-time to a Bars/Beats position, e.g. "1:01:000". NEEDS CakeScript (T1), which this SONAR build cannot dispatch, and no menu command performs an absolute jump: cw_navigate moves by whole measures (goToNextMeasure / goToPrevMeasure) only. cw_convert turns a position into ticks if you need the number itself.
| Name | Required | Description | Default |
|---|---|---|---|
| time | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full load — and it discloses the single decisive behavioral fact: the tool is undispatchable on this SONAR build. It does not state what an actual call returns or which error surfaces, which is what separates it from a 5.
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 tight sentences, front-loaded with capability, then blocker, then alternatives — zero filler. Minor deduction because "CakeScript (T1)" introduces an undefined internal term the agent must guess at.
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 single-param tool with no annotations and no output schema, everything an agent needs in order to not misuse it is present. Return/error behavior after a failed dispatch is the one remaining gap.
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 gives an example value ("1:01:000") that implies a bars:beats:ticks layout but never names the components, valid ranges, or padding rules. That is partial compensation, not full.
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 concrete verb+resource ("Move the now-time to a Bars/Beats position") with a literal position example, and explicitly separates it from cw_navigate (measure-level moves) and cw_convert (position→ticks). The only thing keeping this from a 5 is that the very next clause declares the tool non-dispatchable on this build, so its stated purpose is somewhat hypothetical.
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?
Explicitly says when NOT to use it ("NEEDS CakeScript (T1), which this SONAR build cannot dispatch"), notes no menu command performs an absolute jump, and routes to the two correct alternatives with their exact semantics. An agent never needs to open a schema to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_markersC
Everything about markers: the dialog (which IS writable, unlike SONAR's own controls), the commands, and how to read the marker list back. This is the working pattern for a drawn surface that has a command opening an MFC dialog behind it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 it only discloses that the dialog 'IS writable, unlike SONAR's own controls.' It does not say whether calling the tool opens a UI, runs a command, mutates the project, or what state is affected — the mutability hint is partial credit at best.
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?
Two sentences, no padding in length, but the lead clause 'Everything about markers' is vague and the second sentence is internal jargon about MFC dialogs and 'drawn surfaces' that does not help an agent act. Front-loading is fine; the substance is thin.
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 parameters, no annotations, no output schema — so the description must explain what a call does and what comes back. It only gestures at 'the dialog, the commands, and how to read the marker list back' without saying what the response contains or what side effects occur, which is not enough for a tool with this much framework-specific 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?
The tool takes zero parameters, so the schema carries all parameter meaning and the baseline of 4 applies. The description does nothing to obscure that, though it also adds nothing on invocation shape.
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 topic (markers: the dialog, the commands, reading the marker list back), so the resource is identifiable, but it never states a specific operation or what calling the tool returns. 'Everything about markers' plus a design-pattern aside reads more like documentation prose than a tool definition, and it does not distinguish it from siblings like cw_ui_recipe or cw_command_support.
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 statement of when to use this tool versus alternatives. The phrase 'this is the working pattern for a drawn surface that has a command opening an MFC dialog' hints at a use case but never says what the agent should call it for or when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_ccB
Send a MIDI control change on the live port. cc 7 = channel volume, 10 = pan.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| channel | No | ||
| controller | 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 does not disclose side effects, port requirements, real-time mutability, error behavior, or whether the live port must already be enabled.
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?
Two short sentences, front-loaded with the core action and immediately followed by useful CC examples. No wasted wording.
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 tool with no annotations, no output schema, and 0% schema description coverage, the description is too sparse. It leaves channel behavior, value meaning, and operational prerequisites undocumented.
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 explains controller examples like cc 7 and cc 10 but omits the channel parameter entirely and does not clarify value semantics beyond the schema's numeric range.
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 and resource: send a MIDI control change on the live port. It distinguishes itself from note/chord siblings by naming control change, but does not explicitly distinguish itself from cw_midi_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 live-port target and cc examples (7 = volume, 10 = pan) imply usage, but there is no explicit guidance on when to use this versus cw_midi_send, cw_set_volume, or cw_set_pan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_chordB
Play several notes at once on the live MIDI port, released together.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | ||
| pitches | Yes | ||
| velocity | No | ||
| durationMs | 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 usefully discloses that notes sound on the live MIDI port and are released together (simultaneous note-off), but says nothing about permissions, whether the call blocks for the duration, failure modes, or what happens on an unavailable port.
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?
A single tight sentence with the operation and its key behavioral trait front-loaded; nothing wasted and no 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?
A four-parameter mutation-style tool with no annotations, no output schema, and zero parameter documentation in the schema. The description should give more: defaults, timing behavior, and error conditions are all absent.
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 four parameters. The description only hints at the pitches array and that all notes share a single release (durationMs), leaving channel and velocity entirely undocumented by either source.
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 a specific verb and resource (play notes on the live MIDI port) and its scope (several notes at once, released together), which implicitly separates it from the single-note sibling cw_midi_note. It stops short of naming that sibling outright, so differentiation is inferable rather than explicit.
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?
"Play several notes at once" versus a single-note tool implies when to choose this one, and "live MIDI port" signals real-time output rather than file writing (cw_write_midi_file). However, no explicit when/when-not guidance or named alternative is given, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_configA
Read SONAR's MIDI port configuration (TTSSEQ.INI): which ports SONAR has enabled as inputs, outputs and echo. Use this to verify the receive side, which a send cannot confirm.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 disclose the data source (the TTSSEQ.INI file) and that it covers enabled inputs/outputs/echo, which implies a safe read. It does not say whether the result reflects persisted INI state versus live SONAR state (a real staleness risk), whether SONAR must be running, or anything about the response shape.
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?
Two sentences, zero waste: the first states what is read and from where, the second states when to use it. The identifying detail (TTSSEQ.INI) is front-loaded.
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 parameters, no annotations, and no output schema, the description does the necessary work: it names the source, enumerates the categories of ports returned, and gives the verification rationale. Only the persisted-vs-live distinction and the rough return shape are left unstated.
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?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies no arguments are needed and points to the config file as the implicit target.
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?
Specific verb ('Read') plus a specific resource ('SONAR's MIDI port configuration (TTSSEQ.INI)') and scope ('inputs, outputs and echo'). It implicitly separates itself from the send-side tools ('which a send cannot confirm') but does not name the near-siblings cw_midi_devices, cw_midi_status, or cw_enable_midi_port, so an agent still has to infer the boundary.
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?
'Use this to verify the receive side, which a send cannot confirm' gives a concrete situation that selects this tool over the MIDI send tools. There is no explicit when-not or named alternative (e.g., cw_midi_devices vs cw_midi_status), so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_devicesB
List every MIDI device Windows reports, in and out.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full disclosure burden. 'List' implies a read-only, side-effect-free enumeration, but the description never confirms that, says whether ports must be enabled or a host process running, or describes what an entry looks like (name, index, direction, availability).
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?
One short sentence, front-loaded with the verb and resource, with the 'in and out' qualifier adding useful scope. Nothing is wasted and nothing important is buried.
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, so the description is the only place a caller could learn what comes back; 'in and out' hints at direction but the identity of each device (name, index, enabled state) is left unspecified. Adequate for a trivial zero-param lister, but not fully 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?
With zero input parameters there is nothing to disambiguate, so the baseline of 4 applies; the description correctly implies a no-argument call.
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?
Specific verb 'List' plus resource 'MIDI device' with the scope 'every ... Windows reports, in and out', which clearly separates it from siblings like cw_midi_note, cw_midi_cc, or cw_midi_send. It does not explicitly name the neighbouring device-related tools (cw_midi_config, cw_enable_midi_port, cw_midi_status) it sits beside, keeping it at a 4.
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 never says when to call this instead of cw_midi_status, cw_midi_config, or cw_enable_midi_port, nor does it state a precondition such as 'call this before enabling a port'. Usage must be inferred entirely from the tool name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_noteB
Play a note on the live MIDI port. Use this to audition or to write into a record-armed track. millisecond latency; no CakeScript involved.
| Name | Required | Description | Default |
|---|---|---|---|
| pitch | Yes | MIDI note number, 60 = middle C | |
| channel | No | ||
| velocity | No | ||
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It usefully discloses latency ('millisecond latency') and that the CakeScript layer is bypassed, plus the record-armed write side effect — real value beyond a bare schema. But it omits whether the MIDI port must first be enabled (siblings cw_enable_midi_port / cw_midi_panic suggest a port lifecycle), whether the note is auto-released after durationMs, and whether output is anything at all.
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: action first, then use case, then a behavioral note. Nothing is padded, though the fragment style ('millisecond latency; no CakeScript involved.') is terse to the point of needing interpretation.
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 4-parameter, no-annotation, no-output-schema tool this is only partially sufficient: purpose and use case are covered, but port-enablement prerequisites, return behavior, and the semantics of three parameters are missing. An agent could invoke it but might do so before the port is open or with wrong velocity/channel assumptions.
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 only 25% — only pitch is documented, and channel and velocity have no descriptions anywhere. The description adds nothing about velocity, channel routing, or how durationMs controls note-off, so the undocumented parameters remain opaque to an agent.
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 and resource — 'Play a note on the live MIDI port' — which is precise enough to separate it from cw_midi_chord and cw_midi_cc by implication (singular note vs chord / controller data). It never names a sibling explicitly, so differentiation is inferred rather than stated.
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?
'Use this to audition or to write into a record-armed track' gives concrete when-to-use contexts, including the important prerequisite that a track must be record-armed for the write case to apply. No when-not conditions or named alternatives (e.g., cw_midi_chord for multi-note, cw_midi_send for raw messages) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_panicA
Send all-notes-off and reset controllers on every channel, then reset the port.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and clearly discloses the core behavior: all-notes-off, controller reset on every channel, then port reset. It does not mention potential interruptions or confirmation behavior, but the direct effects are transparent and sufficient for a no-parameter panic action.
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, front-loaded sentence with no redundant or filler content. Every clause describes a concrete action, and the sequence of operations is clear.
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 zero-parameter, no-output panic operation, the description covers what is sent and to which scope. The only minor gap is that 'the port' is not further specified, but overall the definition is complete enough for an agent to invoke 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?
The tool has zero parameters, so there is no parameter semantics to describe. The schema is empty and fully covered, and the description does not need to compensate for undocumented inputs.
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: send all-notes-off and reset controllers on every channel, then reset the port. This is a clear verb+resource operation that an agent can distinguish from siblings like cw_midi_note or cw_midi_cc. It does not explicitly contrast with another sibling tool, so it stops short of 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 panic semantics imply an emergency reset use case, but the description does not state when to use this tool instead of alternatives such as cw_midi_send or cw_midi_cc. There are no explicit exclusions or conditions, leaving usage to inference from the name and action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_sendA
Send a batch of raw MIDI messages in one round trip. Each message is [status, data1, data2]. Use this to lay down a phrase cheaply; pass channel to rewrite the low nibble of each status byte.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | ||
| messages | 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 the one-round-trip batching behavior, the message shape, and the channel nibble rewrite, but it omits what happens on invalid messages, whether/which errors are returned, and whether sending raw MIDI has side effects requiring recovery (e.g. cw_midi_panic).
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?
Two sentences, front-loaded with the verb and scope, followed by format and channel semantics. There is no filler or repeated 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?
There is no output schema and no annotations, and while the description covers the core invocation semantics, it leaves return behavior, validation/error behavior, and the 2048-message bound undocumented. For a raw MIDI mutation tool with zero annotation coverage, that is an important remaining gap.
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 carry parameter meaning, and it does: messages are explained as [status, data1, data2] and channel is explained as rewriting the low nibble of each status byte. It does not clarify that messages may be 2 bytes as well as 3, which slightly undersells the schema's minItems=2 allowance.
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 a specific verb and resource ('Send a batch of raw MIDI messages') and adds a scope detail ('in one round trip'). It implicitly differentiates itself from structured siblings like cw_midi_note and cw_midi_chord by emphasizing 'raw' messages, but does not name those alternatives 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?
'Use this to lay down a phrase cheaply' gives a clear usage context for bulk/raw MIDI, implying it is the efficient alternative to per-note helpers. However, it never names cw_midi_note, cw_midi_chord, or cw_midi_cc as alternatives, nor does it state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_midi_statusA
Report the real-time MIDI transport: available ports, which one will be used, and the one-time step needed in SONAR (Preferences > MIDI > Inputs) to receive it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and handles it reasonably: 'Report' establishes a read-only, observational operation, and it discloses that a manual SONAR setup step (Preferences > MIDI > Inputs) is required outside the tool. It does not say what happens when no ports exist or whether it reflects cached versus live state, but the core behavior is transparent.
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 front-loaded sentence with three distinct, useful clauses: what is reported, the port that will be used, and the manual SONAR step. No filler, though the setup-step clause is long enough that it could have been a separate sentence 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?
There are no parameters and no output schema, so the description must explain what comes back, and it does list the returned information. It is nearly complete for a simple status call, with only minor gaps around output shape and failure modes.
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?
The tool takes zero parameters, so there is no parameter semantics for the description to explain; the baseline for a parameterless tool applies. The schema being empty is consistent with the description, which correctly implies no inputs are needed.
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 uses a specific verb ('Report') and resource ('real-time MIDI transport'), then enumerates the three things returned: available ports, which port will be used, and the SONAR setup step. This is clear and actionable. It does not explicitly differentiate from related siblings like cw_midi_devices or cw_midi_config, 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?
Usage is implied: it's a diagnostic/reporting call useful before sending MIDI, and the mention of a one-time SONAR preference step signals troubleshooting. However, it never states when to call this versus cw_midi_devices, cw_midi_config, or cw_enable_midi_port, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_mixer_supportA
What can and cannot set a track's volume or pan on this build, measured, with the survey behind it. Accessibility reads mixer state but does not accept it; MIDI writes do.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does add genuine domain knowledge — accessibility reads mixer state but cannot write it, MIDI writes can — which is valuable beyond structured fields. However it never states whether the tool itself mutates state, whether it is a safe read, or that 'measured' implies active probing that may be slow or require a live session.
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?
Two tight sentences with the subject front-loaded and the key distinction (reads vs writes) at the end. 'With the survey behind it' is slightly cryptic phrasing but costs little space.
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 zero-arg capability tool with no annotations and no output schema, the description should at least hint at what the survey returns (per-surface verdicts, caveats). It gestures at this with 'with the survey behind it' but leaves the agent guessing about the response shape and whether the tool is side-effect free.
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?
Zero parameters and a fully-covered (empty) schema, so the baseline of 4 applies. Nothing in the description is needed to explain inputs.
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 specific subject (what can and cannot set a track's volume or pan on this build) and frames the output as a measured survey with evidence. It does not name the verb explicitly ('report'/'explain'), but the resource and scope are unambiguous and clearly distinct from the write siblings cw_set_track_volume and cw_set_track_pan.
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: the mention of 'this build' and of which paths work suggests checking before attempting a volume/pan write. There is no explicit when-to-use, no named alternative (e.g. cw_set_volume vs cw_set_track_volume vs MIDI CC), and no statement of when this tool is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_mixer_targetsB
What a live MIDI mixer message can affect right now, and why. A CC reaches SONAR but only applies where a track is listening (armed, channel-assigned, or bound to ACT) — without a destination it is delivered and dropped, which is invisible unless you check.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 that a CC reaches SONAR but only applies where a track is listening, and that messages without a destination are delivered and dropped. However, it does not state whether this is a read-only diagnostic, what the response looks like, or any permission or side-effect concerns.
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 two sentences with no filler, and the routing problem is introduced up front. It is slightly abstract and lacks an explicit action verb, but it does not waste space.
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, so the description would ideally explain what the tool returns. It explains the conceptual routing situation well but leaves the actual result format ambiguous, which is a meaningful gap for a diagnostic tool.
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?
The tool takes zero parameters, so there are no parameter semantics for the description to clarify. Baseline 4 is appropriate because parameter coverage is not a relevant gap here.
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 live MIDI mixer targets and explains the condition under which MIDI CC messages affect tracks. However, it never states the action the tool performs (e.g., 'reports' or 'lists') and does not explicitly distinguish itself from closely related siblings such as cw_mixer_support or cw_midi_cc.
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 phrase 'invisible unless you check' implies the tool is useful for diagnosing silently dropped MIDI messages, giving an implied usage context. But there is no explicit guidance on when to use this tool versus alternatives, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_no_effect_causesA
Why a command can report "nothing happened", with how to tell the three causes apart. Only one of them is a limit of this adapter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 discloses the content shape (three distinguishable causes, one being an adapter limit), which is genuine value, but it doesn't state that the tool is a read-only/costless lookup or what the response looks like, leaving the behavioral profile partially opaque.
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?
Two tight sentences with zero filler, and the core framing (why 'nothing happened', three causes, one is an adapter limit) is front-loaded. Every clause 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?
With no output schema and no annotations, the description must carry the explanation, and it supplies a useful summary of what the tool covers. It falls short of stating the return shape (a list of causes with differentiation?), but is adequate for a zero-parameter help topic.
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?
The input schema has zero parameters, so there is nothing for the description to disambiguate. The baseline of 4 applies; no parameter-level gaps exist.
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 a specific resource – the causes of a command reporting 'nothing happened' – and clarifies that three causes exist with only one being an adapter limitation. It's a diagnostic/explanation tool, which an agent can infer, though the description never explicitly frames it as an explanatory lookup versus an action tool alongside siblings like cw_doctor or cw_command_evidence.
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 (troubleshooting when a command appears to do nothing) but never stated. There is no explicit guidance on when to reach for this versus cw_doctor, cw_command_evidence, or cw_command_support, all of which plausibly overlap with no-effect diagnosis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_note_edit_helpA
How note-level editing actually works: notes cannot be READ through any automation surface, but they can be EDITED through the dialog behind 处理 > 量化, and the exported .mid file is what proves it. Carries the measured field labels, the two mistakes that produced wrong conclusions, and the full verification round trip.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the important behavioral facts: this is informational content, it names the concrete UI path (处理 > 量化 dialog), and it warns that omitting it previously produced wrong conclusions. It stops short of saying the output is prose documentation, which keeps it from a 5.
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 sentence with no wasted clause, but the lead is content ('How note-level editing actually works') rather than a front-loaded statement of purpose and return value. Phrases like 'is what proves it' and 'actually' add rhetoric without 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?
No output schema exists, so the description must signal what comes back, and it enumerates the payload (measured field labels, two documented mistakes, full verification round trip). That is sufficient for a zero-parameter knowledge tool, though stating explicitly that it returns reference text would close the gap.
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?
The tool has zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No credit above baseline since it adds no parameter guidance beyond what the empty schema already conveys.
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 conveys the topic (note-level editing behavior, including the fact that notes cannot be read by automation) but never states the tool's action or return type — an agent must infer it is a help/knowledge article rather than an editing operation. It does distinguish itself from cw_get_notes by declaring notes are unreadable through automation, but the verb+resource framing is absent.
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: consult this when you need to understand or verify note-level editing, and the line about notes being unreadable steers the agent away from read-oriented siblings like cw_get_notes. There is no explicit 'call before attempting X' or named alternative, so the routing signal is indirect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_plugin_insert_recipeA
How far plugin insertion can be driven on this build: discovery works (open the browser, list categories, read which plugin is selected), insertion does not (click, double-click and drag all leave the FX bin empty). Read this before promising a plugin can be attached.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 so well: it discloses that discovery paths work while click, double-click, and drag insertion all fail, leaving the FX bin empty. It does not explicitly state whether the tool itself is read-only or describe the exact response format, but the core limitation is unusually transparent.
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 definition is a single front-loaded sentence that immediately states the overall finding, then gives the supporting discovery/insertion breakdown. Every clause contributes to the point, and nothing is wasted.
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 no-parameter informational recipe, the description is sufficiently complete: it tells an agent what the tool documents and the key limitation to avoid overpromising. It does not spell out the return format or the exact structure of the recipe content, but no output schema exists and the core context is present.
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?
The tool has zero parameters, so the baseline is 4. The empty schema and the description are consistent, and there are no parameter semantics that need explaining.
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 clearly identifies the resource as plugin insertion capability and states the key distinction: discovery works but insertion does not. It does not use an explicit verb like 'returns' or 'describes', and it does not name a sibling tool, so it falls 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?
The phrase 'Read this before promising a plugin can be attached' gives a clear trigger for when to use the tool. It implies the tool should be consulted ahead of any claim about plugin attachment, but it does not name alternatives or explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_pluginsA
Summarise the plugins SONAR has registered: counts, categories, and any registered plugin whose file is missing. Reads SONAR's own scan result, so it works whether or not SONAR is running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description correctly carries the behavioral burden: it says the tool reads SONAR's own scan result and works independently of whether SONAR is running. The word 'Reads' also implies a safe read operation, though it does not explicitly discuss side effects or permissions.
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?
Two sentences with no wasted text. The purpose is front-loaded, followed by the key operational detail about reading SONAR's scan result.
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?
The description covers what the tool returns (counts, categories, missing plugins) and a key availability constraint (works whether SONAR is running). Given the absence of parameters, output schema, and annotations, this is complete enough for an agent to call it 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?
The tool has zero parameters, so there are no parameter semantics for the description to compensate for. The baseline score for a no-parameter tool is appropriate here.
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: summarising SONAR-registered plugins, including counts, categories, and missing-file detection. It is clear enough to distinguish this summary tool from plugin-action siblings, but it does not explicitly name alternatives such as cw_find_plugin.
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 context that the tool reads SONAR's own scan result and works whether or not SONAR is running. However, it does not explicitly say when to choose this over siblings like cw_find_plugin or cw_plugin_insert_recipe, leaving alternatives implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_probe_stateA
Get a plan for reading project state on this build. Lists which SONAR surface carries each fact (track list, mixer values, notes) and the steps to capture it. Use when cw_get_* tools report CAKESCRIPT_UNAVAILABLE.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | overview: project/tempo/tracks. tracks: names+states. mixer: fader and pan values. notes: note list (needs the Event List view). all: everything worth reading. | overview |
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 the key trait that the return is a plan/steps rather than live data. It does not state whether the tool is read-only (implied but unstated), what the plan looks like, or what happens on builds where CAKESCRIPT is available. Adequate but thin for an unannotated 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?
Three short sentences, front-loaded with what the tool returns, then what it contains, then the activation condition. No filler and no repetition of schema content.
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 single optional enum parameter with full schema documentation and no output schema, the description covers purpose, content, and trigger. The remaining gap is what the returned plan actually looks like and whether it is safe/read-only, which would matter since no annotations exist.
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 100% and the topic enum is documented in detail in the schema itself, so the description does not need to repeat it. The parenthetical fact list (track list, mixer values, notes) loosely mirrors the enum values but adds no syntax or behavioral detail beyond the schema. Baseline 3 is appropriate.
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 uses a specific verb ('Get a plan') plus the resource it covers ('reading project state on this build') and enumerates the facts it routes (track list, mixer values, notes). This makes clear it returns guidance rather than the state itself, which separates it from data-returning siblings like cw_get_state and cw_list_state. It does not explicitly contrast with cw_surfaces, which appears to be the closest neighbor.
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 names the exact trigger condition ('when cw_get_* tools report CAKESCRIPT_UNAVAILABLE') and the alternative family to try first, which implies the negative case as well. An agent can decide to call this without inspecting any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_projectA
Run a document command: newProject | open | save | saveAs | close | exportAudio | importMidi | revert. The destructive ones (close, revert) refuse unless confirm is set to the command's own key, because they discard the session with no undo.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| confirm | No | Must equal the command name for close/revert, e.g. confirm: 'close' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden, and it does disclose the most important hazard: close and revert discard the session with no undo and are gated behind a confirm key. It stops short of covering the other commands' side effects — whether open replaces the current session, whether save overwrites the file on disk, whether exportAudio writes output — which a mutation tool with no annotations should ideally state.
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?
Two tight sentences, with the command list and the destructive-confirm warning front-loaded; nothing is buried. The verbatim re-listing of the enum is mild duplication of the schema, but it is cheap and aids 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 two-parameter tool with no output schema and no annotations, the definition covers the safety story but leaves a conspicuous hole: open, saveAs, importMidi, and exportAudio presumably need a file target, yet the schema exposes only command and confirm and the description never explains how a file is selected (dialog?) or what state the tool returns. Adequate, but an agent could not confidently invoke the file-oriented commands from this text 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 50% and the confirm parameter's schema description already says it must equal the command name, so the description largely restates structured data. It does add the 'why' — that the confirm gate exists because these commands discard the session irreversibly — which is real value, but the command parameter itself gains no interpretation beyond the schema enum.
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 and resource ('Run a document command') and enumerates the eight supported commands, so the agent knows the exact operation set. It does not distinguish this from lookalike siblings such as cw_run_command, cw_save_state, or cw_document_state, leaving the agent to guess which entry point is canonical.
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 one explicit usage rule — close and revert refuse unless confirm is set to the command's own key — which is genuinely actionable. But it offers no guidance on when to reach for cw_project versus cw_run_command or the state-inspection siblings, and no prerequisites for commands like open or saveAs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_quantize_dialogA
The 量化 dialog as measured: every field, its accessible label, which element kind to write to, the values it accepts, and the traps. Kept separate from the plan so a caller can see the raw measurement the plan is built from.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 disclose the payload contents (fields, labels, element kinds, accepted values, and 'traps'), which is meaningful. However, it never says whether this is a read-only snapshot, whether the values are captured live from an open dialog or returned as static metadata, or whether any state is mutated — key behavioral facts for an unannotated 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?
Two compact sentences with no filler, and the payload contents come first. The second sentence is design rationale rather than invocation guidance, so it earns its place only partially, and the phrasing is slightly indirect.
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, so the description must describe the return value. It enumerates the kinds of content included but not the shape or granularity (one record per dialog field? a flat map?), and it leaves the live-vs-static question unresolved. Adequate to orient a caller, not enough to predict what comes back.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Nothing in the schema needs compensating for.
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?
It identifies the resource (the quantize dialog) and what it exposes: every field, accessible label, target element kind, accepted values, and traps. The trailing clause distinguishes it from cw_quantize_plan by explaining it is the raw measurement the plan is built from. The missing piece is a verb — 'as measured' is a noun phrase, and the untranslated CJK term adds friction — but an agent can still tell what it returns.
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 names its sibling indirectly ('kept separate from the plan') and gives the rationale that a caller can inspect the raw measurement rather than the derived plan. That implies the selection condition, but it never says explicitly 'call this before/after cw_quantize_plan' or states prerequisites such as whether the dialog must be open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_quantize_planA
The exact plan for a quantize: which dialog fields to write, with what values, and how to prove afterwards that it landed. This process cannot perform the accessibility writes itself — a computer-use runtime does that — so this states the plan rather than pretending to run it. Pass the settings you want to get the concrete values.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | The grid to snap to, as the dialog spells it: 4 分音符, 8 分音符, 16 分音符, ... | 16 分音符 |
| swing | No | 50 is straight | |
| offset | No | Ticks to shift the grid by | |
| strength | No | How far notes move toward the grid. 100 lands them on it; 50 moves them half way and is the dialog's persisted default, which makes a working quantize look broken. | |
| sensitivity | 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 meaningful work: it explicitly declares the tool is non-executing and returns a plan rather than performing accessibility writes. It also promises post-hoc proof of landing, which tells the agent the output is verifiable. It omits prerequisites (e.g., whether the quantize dialog must be open) and any failure modes.
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 core purpose and its output contents are front-loaded in the first sentence, and the second sentence removes a likely agent misconception. The third sentence is a small but useful call-to-action; the phrasing is slightly conversational but no sentence is 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?
There is no output schema, so the description must convey return semantics — it does so conceptually (fields, values, verification) but never describes the plan's shape or what the verification step requires. For a 5-parameter, zero-annotation planning tool, prerequisites and output structure remain 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 coverage is 80%, so grid, swing, offset, and strength are already well documented in the schema, and the description only adds the framing that supplied settings become concrete values in the plan. The undocumented 'sensitivity' parameter is not addressed at all, so the description does not compensate for the coverage gap. Baseline 3 applies.
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 produces the 'exact plan for a quantize', enumerating dialog fields, values, and verification. That is clearly distinct from execution-oriented siblings like cw_quantize_dialog or cw_check_quantize, though it never names those siblings 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?
It implicitly scopes usage ('Pass the settings you want to get the concrete values') and clarifies that actual writes are done by a computer-use runtime, which hints at a plan-then-execute workflow. However, it never says when to call this versus cw_quantize_dialog or cw_check_quantize, leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_read_midi_fileA
Parse a Standard MIDI File: per-track name, channels, note count, and any CC7/CC10 with the pan position spelled out. Use it to check what a file carries before importing it, or to read back a file SONAR exported.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .mid file | |
| includeNotes | No | Include the full note list (can be long) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full load. 'Parse' and 'read back' imply a read-only, non-mutating operation, but it never explicitly states that the file or project is untouched, nor does it describe failure behavior for missing or non-MIDI files. The output scope is reasonably disclosed.
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?
Two tight sentences, front-loaded with what the parse produces, then the usage scenarios. Nothing is wasted, though the second clause is slightly packed.
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, so the description does the work of explaining returns, and it does so well by listing track name, channels, note count, and CC/pan detail. Missing only error/prerequisite context (missing file, non-MIDI input) that an annotation-free tool should supply.
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 100%, so the schema already documents both 'path' and 'includeNotes' (including the 'can be long' caveat). The description adds no parameter-level detail beyond that, so the baseline 3 applies.
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 (Parse) and resource (Standard MIDI File) and enumerates the returned content (track names, channels, note count, CC7/CC10 with pan). It implicitly contrasts with the sibling cw_write_midi_file, but never names it or another alternative outright.
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 two concrete when-to-use scenarios: inspecting a file before import and reading back a SONAR export. It stops short of saying when not to use it (e.g., use cw_get_notes for the open project, or cw_write_midi_file for creating files).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_redoA
Reapply the operation most recently undone. Same silent behaviour as cw_undo — no window, no element change, so the result cannot be confirmed from the screen.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and discloses a genuinely useful trait: the operation is 'silent' and its result 'cannot be confirmed from the screen.' That is exactly the kind of non-obvious behavior an agent needs. It stops short of describing failure modes (e.g., empty redo stack) or what is returned, so it is not fully exhaustive.
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?
Two sentences, front-loaded with the action and followed by the critical behavioral caveat. Every sentence earns its place with no 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 zero-parameter, no-output-schema tool, the description covers purpose and the key silent-operation caveat. It could still mention edge cases such as an empty undo/redo history, but the essential context is present.
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?
The tool takes zero parameters, so the baseline is 4. There is nothing additional for the description to document, and it correctly does not invent parameter behavior.
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 a specific verb ('Reapply') and resource ('the operation most recently undone'), making the action unambiguous. It references the sibling cw_undo for contrast, though it does not explicitly route between them.
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: the agent must infer that this is the inverse of cw_undo and should follow an undo. There is no explicit statement of when to use this versus alternatives, or of any preconditions (e.g., an undo history must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_report_stateC
Send back what a computer-use agent observed, so later calls reuse it instead of re-probing. Shape the state like the CakeScript tools did: { tracks: [{index,name,type,volume,pan,mute,solo,arm,clips}], notes: [{track,pitch,velocity,time,duration}], now, tempo, loop, project }.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Anything that limits confidence in the reading | |
| state | Yes | The observation, as JSON | |
| topic | No | overview | |
| source | No | computer-use |
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 falls short: it doesn't say whether the reported state persists, overwrites prior state, expires, or how conflicts/partial views are handled. It also references "the CakeScript tools" as an external, unspecified precedent, adding no verifiable behavior for an agent that lacks that history.
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?
Two sentences, front-loaded with the purpose and followed by the payload contract; the shape spec is dense but every field listed is load-bearing. Only the "like the CakeScript tools did" aside is wasted words.
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?
The description covers the hardest part, the state payload, but with no annotations and no output schema it should also explain persistence semantics, what the topic enum scopes, and how this differs from cw_save_state/cw_probe_state. As written an agent can build a plausible payload but not predict the tool's effect.
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 50%: note and state are documented, so baseline would be 3, and the description genuinely earns its place by spelling out the internal shape of the otherwise free-form state object (tracks/notes/now/tempo/loop/project). But the two undocumented parameters, topic (a 6-value enum) and source, get no explanation of what they select or override.
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 does convey a specific action (reporting an agent observation back so later calls can reuse it) and adds scope with "instead of re-probing." However, the verb "send back" is vague about what actually happens to the payload, and nothing distinguishes this from near-identical siblings such as cw_save_state, cw_document_state, or cw_list_state.
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 a rationale for use — report once so subsequent calls avoid re-probing — which implies when to call it. But it never names an alternative (cw_probe_state, cw_save_state, cw_get_state) or states when not to call it, so the routing decision against those siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_run_commandA
Run a SONAR menu command by numeric id via WM_COMMAND. Version-independent: works on any build whose menu exposes the command. Get ids from cw_list_commands. Returns whether the window list changed, so a registered-but-unhandled command is distinguishable from a working one.
| Name | Required | Description | Default |
|---|---|---|---|
| cmdId | Yes | Menu command id, e.g. 34861 (0x882D Preferences) | |
| confirm | No | Required for destructive ids (0xE102 File > Close, 0x853D Revert). Pass "close" or "revert" to acknowledge | |
| keepOverlays | No | Do not close modal panels first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden and does well: it discloses the WM_COMMAND dispatch mechanism, the version-independence limit, and a meaningful return signal (whether the window list changed) that lets the caller detect a registered-but-unhandled no-op. It does not mention modal/dialog blocking, side effects of destructive ids, or the confirm gate, which the schema covers but the prose does not reinforce.
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 tight sentences, front-loaded with the mechanism, then the id source, then the return-value caveat. Nothing is repeated and every sentence carries information an agent would otherwise have to discover empirically.
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 output schema, the description correctly takes on the return-value explanation (window-list-changed as a success signal), which is the most important unknown for this tool. It stops short of describing what happens with destructive commands or whether the call blocks, leaving a small gap for a mutation tool with zero annotations.
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 100% and the cmdId/confirm/keepOverlays descriptions already explain the enum-like acknowledge strings and the modal-closing flag in detail. The description adds only 'numeric id' and the version-independence framing, which is marginal beyond the schema, so baseline 3 applies.
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 SONAR menu command by numeric id via WM_COMMAND) and names cw_list_commands as the id source, which separates it from the listing tools. It does not differentiate itself from siblings like cw_run_command_classified or cw_insert_commands, so an agent must infer the boundary.
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 precondition (obtain ids from cw_list_commands) and a clear context of use (version-independent, works only where the menu exposes the command). It offers no explicit 'use X instead when...' guidance against the other command-execution siblings, so the selection rule is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_run_command_classifiedB
Run a menu command and report what this process could and could not establish, instead of claiming success from "nothing errored". Returns status confirmed | did-nothing | unconfirmed, with the evidence class behind it.
| Name | Required | Description | Default |
|---|---|---|---|
| cmdId | Yes | ||
| confirm | No | Exact command name required for a destructive command. | |
| keepOverlays | 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 usefully discloses the return statuses (confirmed | did-nothing | unconfirmed) and evidence class, but it omits that destructive commands require an exact confirm name and says nothing about side effects, permissions, or keepOverlays behavior.
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?
Two sentences, front-loaded with purpose and output contract, with no filler. The quoted contrast is purposeful and the status list is compact.
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?
The description covers the output contract, but with no annotations, low schema coverage, and no output schema, it leaves critical invocation details missing—especially parameter meaning and destructive-command confirmation requirements.
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 only 33%, and the description mentions none of the three parameters. It does not explain cmdId, confirm, or keepOverlays, so it fails to compensate for the undocumented 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?
States a specific verb ('Run') and resource ('menu command'), plus the reporting contract. However, it does not distinguish itself from sibling tools such as cw_run_command, cw_verify_commands, or cw_command_evidence, so an agent cannot tell from this description alone when the classified variant is preferred.
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 phrase 'instead of claiming success from "nothing errored"' hints at an evidence-focused use case, but there is no explicit when-to-use or when-not-to-use guidance. It never names cw_run_command or other alternatives, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_save_stateA
Whether the open project has unsaved changes, in the terms that matter before closing or opening something else. Read from the title's modified marker.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 usefully discloses that the check is read from the title's modified marker and implies a boolean query, but it does not explain the return value, side effects, permissions, or whether the marker can be stale.
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 short and front-loads the core condition. The phrase 'in the terms that matter before closing or opening something else' is slightly vague but still adds useful context without excess.
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 no annotations and no output schema, the description explains the data source but not the return shape or how the result should be interpreted. Given the many state-related siblings, it also does not provide enough routing information to confidently choose this tool over cw_get_state, cw_document_state, or cw_status.
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?
The tool takes zero parameters, so there is nothing for the description to document. The schema is empty and fully self-explanatory, making the baseline score of 4 appropriate.
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 clearly states the specific condition being queried: whether the open project has unsaved changes, and it names the data source (the title's modified marker). It does not distinguish this tool from state-related siblings such as cw_get_state or cw_document_state, and the tool name 'cw_save_state' could be misread as a write operation, though the description clarifies it is a read check.
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 implied usage context: checking before closing or opening something else. However, it does not explicitly say when to use this tool versus alternatives, nor does it name any sibling tool or exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_panA
Set a track's pan through the live MIDI cable (CC10). This is the path that actually works: the track strips' pan slider is read-only through accessibility on this build. channel is the MIDI channel the track listens on, not its position — read it from the strip's "MIDI 通道 on Track N" value.
| Name | Required | Description | Default |
|---|---|---|---|
| value | No | Raw CC10 value; overrides position | |
| channel | No | ||
| position | No | -1 hard left, 0 centre, +1 hard right |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does meaningful work: it discloses the transport (live MIDI CC10), documents a build-specific limitation that explains the tool's existence, and warns that channel must be read from the strip rather than guessed. Gaps remain on failure modes (wrong channel, MIDI port disabled) and whether the change persists, but the core behavioral picture is solid.
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 sentences, front-loaded with what the tool does, followed by why it exists and the parameter caveat. No filler, though the middle justification clause is slightly long relative to its routing value.
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 mutation with no annotations, no output schema, and zero required parameters, the description covers mechanism, rationale, and the ambiguous parameter, which is enough to invoke correctly. It could still say what the caller observes afterward or how errors 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 coverage is 67% and the one undocumented parameter, `channel`, is exactly the one the description clarifies: it is the MIDI channel the track listens on, not its track position, plus where to read the value. This preempts the most likely invocation error, which is precisely the description's job.
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 ("Set a track's pan") and immediately identifies the mechanism ("through the live MIDI cable (CC10)"), which distinguishes it from the accessibility-based sibling cw_set_track_pan. An agent knows exactly what this call does and via which path.
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 selection context by ruling out the competing path: the track strip's pan slider is read-only through accessibility on this build, so this MIDI route "actually works." It does not explicitly name cw_set_track_pan or state when-not conditions, keeping it a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_armB
Arm or unarm a track for recording, through the track strip's 录制 button. Reports verified from the value read back. Needs a project open and the track visible.
| Name | Required | Description | Default |
|---|---|---|---|
| arm | Yes | ||
| index | 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 and does disclose meaningful traits: it drives the track-strip record button rather than an internal API, and it reports a `verified` flag read back from the resulting state. It does not say what happens on failure, whether the arm state persists, or how errors surface.
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 sentences, front-loaded with the action, followed by the read-back behavior and the preconditions. Nothing is redundant, though the embedded Chinese button label is ambiguous to a reader unfamiliar with the UI.
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 two-parameter mutation with no annotations and no output schema, the description covers action, mechanism (UI button), return signal (`verified`), and prerequisites. The main hole is that it never defines `index`, which the schema also leaves bare.
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 doesn't. 'arm or unarm' maps loosely to the boolean `arm`, but `index` is never explained (the schema only hints at 1-based via minimum 1) and nothing says how a track is identified.
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 (arm/unarm) and resource (a track, for recording), and even names the UI affordance that is acted on. It is naturally distinct from the mute/solo/volume/pan siblings, but the description never explicitly contrasts with them.
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 two concrete preconditions (a project must be open, the track must be visible), which is real guidance. It offers no guidance on when to prefer this over any alternative or what to do if the precondition fails, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_muteA
Mute or unmute a track. Works by driving the track strip's own 静音 button (a real click — SONAR's accessibility actions are inert), and reports verified from the value read back. Needs a project open and the track visible in the Track view.
| Name | Required | Description | Default |
|---|---|---|---|
| mute | Yes | ||
| 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 does so well: it discloses the implementation mechanism (a real click on the track strip's mute button), explains why (SONAR's accessibility actions are inert), and says `verified` is derived from reading the value back. Those details materially affect whether an agent can trust the result and what preconditions matter.
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?
Two sentences, no filler, with the action stated first and the mechanism/preconditions after it. Every clause 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?
No output schema or annotations exist, and the description covers mechanism, trust signal (`verified`), and preconditions, which is nearly everything needed. The remaining gap is that it does not define how to identify the target track via `index`.
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 implies the `mute` boolean through the verb, but never explains `index` — not that it is a track index, nor that it is 1-based per the schema minimum. The most important parameter for calling this correctly is left to guesswork.
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 first sentence gives a specific verb+resource pair (mute/unmute a track), which is immediately distinguishable from other track-state siblings like cw_set_track_solo or cw_set_track_arm. It does not explicitly name a sibling or contrast with one, so it falls 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?
The final sentence states concrete preconditions: a project must be open and the track must be visible in the Track view. That is clear usage context, but there are no exclusions or named alternatives for when another tool (e.g. a command-based path) would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_nameA
Rename a track by editing its strip's name field (double-click, paste, Enter), and report verified from the name read back. Handles Chinese, unlike the CakeScript route this replaces. Needs a project open and the track visible in the Track view.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load well: it discloses the UI-level mechanism (double-click, paste, Enter), the Unicode/Chinese handling that motivates the tool, and that the result is verified by reading the name back. It doesn't say what happens when verification fails or whether a failed rename leaves a partial edit, which keeps it from a 5.
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?
Two dense, front-loaded sentences: the action first, then preconditions. Minor cost is jargon ("the CakeScript route this replaces") that an agent may not decode, 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 2-param mutation tool with no annotations, no output schema, and 0% schema coverage, the description covers mechanism and prerequisites but leaves the parameter meaning (index semantics) and the exact shape/meaning of the `verified` result unspecified. Adequate but with clear 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% and neither parameter is documented in the schema, so the description must compensate — but it never explains that `index` is the 1-based track index, nor mentions the 128-character name limit or non-empty constraint. Only "name field" loosely hints at the `name` parameter.
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 ("Rename a track") and even the mechanism (editing the strip's name field), which distinguishes it cleanly from cw_list_tracks, cw_get_track, and the cw_set_track_* siblings that change volume/pan/mute rather than identity.
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 concrete preconditions ("Needs a project open and the track visible in the Track view") and notes it replaces the CakeScript route, implicitly steering away from cw_run_command for this task. It doesn't explicitly name an alternative tool or a when-not-to-use case, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_panA
Set a track's stereo pan (-1.0 = full left, 0 = centre, +1.0 = full right). NEEDS CakeScript (T1), which this SONAR build cannot dispatch — same limits as cw_set_track_volume. cw_set_pan sends live CC10 on a MIDI channel instead.
| Name | Required | Description | Default |
|---|---|---|---|
| pan | Yes | ||
| 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 discloses the critical behavioral trait: the required dispatch mechanism is unavailable in this build. It also cross-references cw_set_track_volume for the same limitation. It stops short of saying what actually happens on invocation (error vs. silent no-op) or the return shape.
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 sentences, front-loaded with the action and scale, then the blocking constraint, then the alternative. No wasted words and the most decision-relevant fact (it may not work here) arrives early.
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 2-param, no-annotation, no-output-schema mutation tool, the description covers the semantics that matter and the environment limitation. The gap is the undefined 'index' parameter and the absence of any statement about failure behavior or confirmation of effect, which matter given the dispatch caveat.
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 does well for 'pan', giving the full scale with endpoints and centre, but says nothing about 'index' (presumably the track index, minimum 1 in schema). Half the parameters gain meaning beyond the schema, half do not.
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 ('Set a track's stereo pan') and immediately disambiguates from the closest sibling by naming cw_set_pan as the live-CC alternative. An agent can distinguish this from cw_set_track_volume and cw_set_pan without opening any 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?
Explicitly says the tool NEEDS CakeScript (T1) and that this SONAR build cannot dispatch it, then names the alternative path (cw_set_pan sending live CC10 on a MIDI channel). This is effectively a when-not-to-use rule plus a redirect, which is the strongest form of guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_soloB
Solo or unsolo a track, through the track strip's 独奏 button. Reports verified from the value read back. Needs a project open and the track visible.
| Name | Required | Description | Default |
|---|---|---|---|
| solo | Yes | ||
| 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 two useful traits: the prerequisite state and that it reports a `verified` value read back from the DAW. It does not say whether the change is reversible/undoable or what happens if the track index is invalid.
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 sentences, front-loaded with the action, then the verification behavior, then the precondition. No filler, though the embedded Chinese button label '独奏' is a minor clarity oddity.
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 two-param mutation tool with no annotations and no output schema, the description covers prerequisites and the `verified` readback, but leaves the `index` parameter and the shape of the reported result under-explained.
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 should compensate. The verb implies the meaning of `solo` (true=solo, false=unsolo), but `index` — presumably a 1-based track index — is never explained, and neither param is clarified.
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 (solo/unsolo) and resource (track), clearly distinct from sibling setters like cw_set_track_mute and cw_set_track_arm. It does not explicitly contrast itself with those siblings, but the action 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?
It gives prerequisites ("Needs a project open and the track visible"), which is real usage context, but it offers no when-to-use vs alternatives guidance or exclusions relative to the mute/arm siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_track_volumeA
Set a track's volume (0.0 to 1.0+; 1.0 = unity). NEEDS CakeScript (T1), which this SONAR build cannot dispatch, and there is no drop-in replacement: SONAR's accessibility actions are inert on the fader (measured) and CAL has no volume builtin. cw_set_volume sends live CC7 on a MIDI channel instead — it reaches the engine but only moves a track that is listening to that channel. See cw_mixer_support for the survey.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| volume | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well by disclosing that the tool cannot actually dispatch in this build, that accessibility actions are inert on the fader, and that CAL has no volume builtin. It does not describe return values, but the critical operational limitation is made explicit.
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 purpose is front-loaded and the caveat follows immediately. The text is dense but every sentence adds materially useful context for a tool that is not dispatchable in this build.
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 two-parameter tool with no annotations or output schema, the description supplies essential context about failure mode and alternatives. It is slightly incomplete because it does not explain the index parameter or what a successful call would return.
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 useful meaning for volume ('0.0 to 1.0+; 1.0 = unity') but gives no explanation of the required index parameter, leaving one of two parameters semantically 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 specific verb and resource ('Set a track's volume') and clarifies the value range. It also names cw_set_volume as a different mechanism, though it does not fully differentiate this tool from every sibling such as cw_set_volume until the caveat.
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 says the tool needs CakeScript (T1) and that this SONAR build cannot dispatch it, states there is no drop-in replacement, and points to cw_set_volume and cw_mixer_support as alternatives. This gives clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_set_volumeB
Set a track's volume through the live MIDI cable (CC7). level is 0.0-1.0, or pass a raw CC value.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | ||
| value | No | ||
| channel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It discloses the MIDI CC7 mechanism and parameter format, but omits critical traits: whether a live MIDI connection is required, whether changes are real-time or undoable, error behavior, and what happens if the channel is invalid. These gaps make it insufficient for a mutation 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 two concise sentences, front-loaded with the core action and no wasted words. It efficiently conveys the essential purpose and parameter hint.
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 the simple mutation tool with no annotations, no output schema, and zero schema description coverage, the description is too sparse. It lacks behavioral context (connection requirements, side effects), does not explain the 'channel' parameter, and provides no guidance on error conditions or return values.
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 explains the relationship between 'level' (0.0–1.0) and 'value' (raw CC), which is helpful, but it completely omits 'channel' (default 1, range 1–16), leaving one parameter 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 specific verb (set) and resource (track's volume), and adds the mechanism (live MIDI cable CC7). It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools like cw_set_track_volume or cw_midi_cc.
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 provides clear context by specifying 'through the live MIDI cable (CC7)', implying usage when MIDI CC control is desired. However, it does not state when to use this tool versus alternatives or any exclusions, leaving sibling differentiation to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_song_instrumentsB
Instruments available for songwriting, grouped by the role each suits (drums, bass, keys, guitar, strings, synth), best pick first. Derived from the registered instruments.
| Name | Required | Description | Default |
|---|---|---|---|
| limitPerRole | 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 usefully disclose ordering ('best pick first') and provenance ('derived from the registered instruments'), which are real behavioral traits. But it never states the operation is read-only, what happens when no instruments are registered, or whether the output is filtered by project state.
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?
Two tight sentences, front-loaded with what it returns and the role taxonomy, with no filler. Only minor waste in the redundant 'instruments ... derived from the registered instruments' echo.
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, so the description must explain the return shape; it does so partially (grouped by role with an enumerated role list, best pick first). It omits the parameter contract and any indication of result size or empty-state behavior, which leaves gaps for an agent planning a call.
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% and the sole parameter limitPerRole is never mentioned, so an agent cannot learn from the description that per-role result counts are capped or default to 4. The phrase 'grouped by the role' gives partial context for why per-role limits exist, but the parameter itself is undocumented in both places.
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 resource (instruments available for songwriting) and its grouping structure by role, which no sibling tool offers. The action verb is only implied (it's a noun phrase), but an agent can immediately tell this is a read-only instrument catalog rather than a MIDI/track tool.
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 when-to-use guidance at all — nothing says to call it before creating tracks or writing MIDI, and no alternatives or exclusions are named. The only hint of usage is the implicit 'available for songwriting' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_statusA
Check SONAR host, which automation transports this build supports, and what to use. Run this first.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Re-probe now instead of using the 3 s cache |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it implies a read-only probe by 'Check' and indicates it reports host, supported transports and a recommendation. It does not state that it is side-effect-free, cheap, or cached (the 3 s cache is only visible in the schema), nor does it sketch the shape of the response.
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?
Two short sentences with the core check front-loaded and the imperative 'Run this first' closing it out; there is essentially no filler. The phrase 'and what to use' is slightly vague but not wasteful.
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 no-annotation, no-output-schema discovery tool the description does say what information comes back (host, transport support, recommendation), which is the essential part. It leaves the agent guessing about safety, cost, and the exact result format, which matters when there is no output schema to lean on.
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 100% with a single optional 'refresh' flag already documented in the schema, so the structured field does the work. The description never mentions the refresh/cache behavior, adding nothing beyond the schema — baseline 3.
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 ('Check') and resource ('SONAR host, which automation transports this build supports'), which is more than a restatement of the name. It does not explicitly differentiate itself from nearby diagnostic siblings such as cw_doctor, cw_command_support, or cw_mixer_support, so an agent must infer the split.
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?
'Run this first' is a concrete ordering instruction that tells the agent when to reach for this tool relative to everything else. It offers no explicit exclusions or named alternatives (e.g. when to prefer cw_doctor or cw_midi_status instead), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_surfacesB
Every SONAR UI surface that carries project state, and what can be read from each. Reference for writing a probe.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It identifies the tool as a reference but does not disclose whether the list is static or live, whether it requires authentication, or any other behavioral trait. The mention of 'what can be read' is a start but insufficient.
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?
Two sentences, front-loaded with the core resource description. The second sentence efficiently states the tool's purpose for the agent. No wasted words.
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 zero parameters and no output schema, the description should explain what the reference returns. It says 'every SONAR UI surface... and what can be read from each,' which hints at the return content, but lacks detail on format or static/live nature. Adequate but with clear 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?
There are zero parameters, so the baseline is 4. The description adds no parameter information, which is appropriate since none exist.
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 resource (every SONAR UI surface that carries project state) and what it provides (what can be read from each), which distinguishes it from action-oriented siblings like cw_probe_state or cw_get_state. The verb is implicit ('reference'), but the intent is 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 implies usage ('Reference for writing a probe') but does not explicitly state when to use this versus alternatives such as cw_probe_state or cw_list_state. No exclusions or conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_timingB
How to set and read tempo and time signature. Writing them into a .mid and importing is the reliable route; inserting a change at the now-time is a different operation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full disclosure burden, yet it never says whether calling this tool mutates project state or just returns documentation, nor what the response looks like. The advisory tone implies a read-only help topic, but that is inference rather than disclosure.
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?
Two short sentences, front-loaded with the topic before the routing caveat, with no filler. The second sentence is a little compressed (".mid" route vs. "now-time" insert) and could be slightly plainer, but nothing is wasted.
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 zero-parameter, annotation-free tool with no output schema, the description should at minimum state the nature of the return value (guidance text vs. state change). It conveys the domain scope adequately but leaves that contract unstated, so an agent can't fully predict the outcome of a call.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Schema coverage is reported at 100% with an empty properties object, consistent with a parameterless call.
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 (tempo and time signature) and the operations (setting and reading), but frames it as "How to...", leaving it ambiguous whether the tool performs the operation or returns guidance about it. It also does not distinguish itself from related siblings such as cw_write_midi_file or cw_insert_commands that it implicitly references.
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 second sentence offers a genuine routing hint — prefer writing tempo/time signature into a .mid and importing it, while inserting an at-now-time change is a separate operation. However, it never names which sibling tool implements either route, nor states the condition under which an agent should call cw_timing itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_track_controlsA
How to read and change tracks through SONAR's accessibility tree, which is the working path on builds with no CakeScript. Gives the element naming ("音量 on Track 17"), which controls each strip type has, and which action each takes. The elements are only reachable from a computer-use runtime — this server ships the contract, it cannot read them itself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the server only ships the contract and cannot read elements itself, and that actual access requires a computer-use runtime. The remaining gap is the shape of what comes back, though this is largely implied by 'the contract'.
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 tight sentences, front-loaded with the what and followed by the capability caveat. The quoted element-naming example earns its place by making the contract concrete.
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 zero-parameter contract/knowledge tool with no output schema, it covers purpose, applicability, and the hard limitation on who can act on the returned elements. A brief note on what the returned contract contains would close the last gap.
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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No parameter-level detail is needed here.
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 resource and intent: reading and changing tracks via SONAR's accessibility tree, delivering element naming and per-strip controls. It is clearly distinct from direct setters like cw_set_track_volume, though it never explicitly says it is a reference/contract tool rather than an actor, which would sharpen the verb.
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 concrete condition for use: builds with no CakeScript, driven from a computer-use runtime. It does not explicitly compare against siblings such as cw_ui_recipe or cw_get_track_control, so the agent must infer which one to reach for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_transportA
Send a transport command (play | stop | record | pause). Tries CakeScript first and falls back to SONAR's own menu commands, so it works on builds where T1 cannot be dispatched.
| Name | Required | Description | Default |
|---|---|---|---|
| cmd | 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 the CakeScript-first, SONAR-menu fallback behavior, which is non-obvious and affects reliability, but it does not describe return values, failure behavior, or any side effects of commands like record.
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 two tightly written sentences with zero waste. The core action is front-loaded, followed immediately by the fallback behavior that adds useful context.
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 command tool with no output schema and no annotations, the description covers purpose and backend fallback sufficiently. It could be stronger by mentioning whether the command reports success or failure, but the essential information for calling it correctly is present.
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%, but the single cmd parameter is a self-explanatory enum. The description repeats the allowed values without adding semantics such as what happens on record versus play, so it only minimally compensates for the schema gap.
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: send a transport command, with the allowed commands spelled out. It does not explicitly distinguish this tool from the closely related sibling cw_transport_command, so it falls short of full sibling differentiation.
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 by the command list and the fallback note, which suggests this tool is useful on builds where T1 cannot be dispatched. However, it never states when to prefer this over alternatives such as cw_transport_command or cw_run_command.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_transport_commandB
Send a transport or timing command: play | stop | record | toggleLoop | setLoopSelection | metronomePlayback | metronomeRecord | showTempoView | showMeterView | insertTempoChange | insertMeterChange. Every one of these changes state WITHOUT opening a window, so this tool can post but not confirm — it returns what a computer-use runtime should look at.
| Name | Required | Description | Default |
|---|---|---|---|
| command | 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 the critical trait that these commands mutate state without opening a window and the call cannot confirm the result. That is genuinely valuable. It stops short of covering per-command behavior (does toggleLoop toggle?, does record need armed tracks?, does setLoopSelection require an existing selection?) or why the return value is unusable as confirmation.
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?
Two sentences, front-loaded with the action and the full command list, then the key behavioral caveat. The list is long but unavoidable given the enum; no filler text.
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 the description says only that the tool "returns what a computer-use runtime should look at" without describing the response shape or how to tell success from failure. For a state-mutating tool with zero annotation coverage, that leaves the agent guessing about the return contract and about verification steps.
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 only repeats the enum values already present in the schema. It adds no per-command semantics such as what setLoopSelection operates on, where insertTempoChange lands, or whether metronomePlayback toggles or sets.
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 a concrete verb ("Send") and resource (transport/timing commands) and enumerates every supported command, so an agent knows exactly what this tool does. It does not distinguish itself from close siblings like cw_transport, cw_run_command, or cw_view_commands, which keeps it below 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 phrase "returns what a computer-use runtime should look at" implies the agent must verify the post-hoc state itself, which is a usable usage cue. But there is no explicit when-to-use vs. cw_transport / cw_run_command / cw_insert_commands guidance and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_transpose_planA
The exact plan for a transpose: which 移调 dialog fields to write, with what values, and how to prove the commit landed. Transpose is the one note operation that changes PITCH, and it works on a free licence — no CakeScript needed. This process cannot perform the accessibility writes itself (a computer-use runtime does that), so this states the plan rather than pretending to run it.
| Name | Required | Description | Default |
|---|---|---|---|
| semitones | No | The interval to transpose by. SIGNED: negative transposes down. 0 is the dialog default and means "shift by nothing". | |
| wholeTones | No | When true, the interval counts whole tones instead of semitones (ticks 全音数(D) in the dialog). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description must carry the behavioral load, and it does the most important part: it explicitly declares non-execution ('...rather than pretending to run it') and names the actor responsible for the actual writes. It also discloses that transpose needs no CakeScript/free licence and that the plan includes a commit-verification step. It does not say what the plan object looks like concretely, though it sketches its contents.
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 tight sentences, front-loaded with what the tool produces, followed by the differentiator and the non-execution caveat. No filler; the licence remark earns its place because it tells the agent no CakeScript is required.
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 two-parameter, no-output-schema planning tool with no annotations, the description covers what matters: it is a plan generator, what the plan contains, that it does not execute, and how success is proven. The only real gap is the concrete shape of the returned plan, which an agent will discover on first call.
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 100%, so both parameters (semitones sign semantics, wholeTones/全音数) are already fully documented in the schema. The description adds only a loose reference to 'which 移调 dialog fields to write' and no interval formatting or validation guidance beyond the schema. Baseline 3 applies.
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?
Clear verb+resource: it produces "the exact plan for a transpose" — which dialog fields to write and with which values. It also carves out a niche against the many other note tools by noting transpose is the pitch-changing note operation. It stops short of naming a specific sibling (e.g. cw_midi_note or cw_quantize_plan) as the contrasting alternative.
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 makes the key usage point that the caller is not to expect execution — a computer-use runtime performs the writes, this tool only states the plan. But it gives no explicit trigger condition ('call this before X') and no named alternative such as the corresponding run/execute tool, so the agent must infer when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_ui_recipeA
How to drive SONAR's own UI with a computer-use runtime: which parts are reachable, which are not, and how to recover when a JUCE modal dialog blocks the app. Measured, not guessed — notably, synthetic keystrokes do not reach SONAR and the menu bar is reachable via AXExpand.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does real work: it warns that synthetic keystrokes do not reach SONAR, that the menu bar is reachable via AXExpand, and that JUCE modals can block the app with a recovery path. These are non-obvious, empirically grounded constraints that materially change agent behavior. What it does not disclose is the shape of the response — whether it returns prose guidance, a checklist, or structured steps.
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?
Two sentences, front-loaded with the capability and followed by the sharpest practical caveats (keystrokes, AXExpand, modals). The phrase 'Measured, not guessed' is a small piece of framing flavor rather than an operational fact, but it does signal that these claims are empirically verified, which is useful trust 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 zero-parameter reference tool with no output schema and no annotations, the description covers scope, key gotchas, and recovery adequately. The remaining gap is that it never says what invoking it actually yields or how comprehensive the recipe is, so an agent cannot judge whether one call suffices or whether it should be called repeatedly as the UI state changes.
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?
The tool takes zero parameters and the schema is an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly does not waste words on parameter discussion.
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 specific verb and subject — driving SONAR's own UI via a computer-use runtime — and scopes it to reachability plus JUCE modal-dialog recovery. That is clearly distinct from the command-execution siblings (cw_run_command, cw_navigate, cw_file_dialog), though it never names those alternatives explicitly. An agent can tell this is a knowledge/recipe tool rather than an action tool, but only by inference from the content.
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 rather than stated: you consult this when automating SONAR's GUI, especially when a modal blocks the app. There is no explicit 'use this instead of X' routing, no statement about when UI automation is the wrong choice (e.g. prefer cw_run_command when a command exists), and no note on when to re-read it. The 'how to recover when a JUCE modal dialog blocks the app' clause is the closest thing to a triggering condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_undoA
Rewind the most recent operation. Undo opens no window and changes no element, so this process CANNOT confirm it — expect effect "none-observed", which is the SUCCESS case, not a failure. To check it worked, look at the data the operation had changed (a note count, an export), never at the screen. This is the adapter's only rewind, and it is what makes an uncertain write safe.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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: it discloses that undo opens no window, mutates no element, that the observable effect is "none-observed" and that this is the success case rather than a failure. That is exactly the counterintuitive behavior an agent would otherwise misread as an error.
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 constraint (expect "none-observed", that is success) is front-loaded and every sentence adds new information. Capitalized emphasis is slightly heavy-handed and the closing sentence is a touch promotional, but nothing is redundant 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?
A zero-parameter, no-output-schema mutation with no annotations is fully covered: what it does, that its observable result is silence, and how to independently confirm the effect. Nothing an agent needs to call it correctly is absent.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No missing parameter meaning is possible here.
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 and resource ("Rewind the most recent operation") and scopes it with "the adapter's only rewind," which implicitly separates it from the redo/history siblings. An agent knows exactly what this does without opening a 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?
It gives a clear usage context (undoing an uncertain write) and a verification procedure (inspect note count or export, not the screen), which is the real 'how to use' guidance. It stops short of explicit when-not-to-use routing to cw_redo/cw_history, so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_verify_commandsA
Re-measure which command ids do something on the running SONAR, by posting each and watching the window list. Use after a SONAR update to refresh the working/inert split. Defaults to the two safe view commands when a project is open; nothing without a project. Only a fixed view/dialog allowlist is probed, even for explicit ids. A modal stops the survey and is left open. No insert, recording, mute, solo or document lifecycle probes. Cost, measured: each probe takes about 15s (two bridge round trips plus a settle delay), so the full 21-command survey is roughly five minutes and NO budget makes it quick — a short budget buys one or two probes, which is a much weaker claim than a complete survey. probed says how many were actually measured; give it time if you want the measurement.
| Name | Required | Description | Default |
|---|---|---|---|
| cmdIds | No | Ids from the safe view/dialog allowlist; other ids are reported as notProbed | |
| budgetMs | No | Cap the survey. At ~15s per probe this buys about one probe; the default is a bound for a caller who wants a sample, not a useful survey. Allow ~300000 for all 21. | |
| background | No | Return a job id immediately and run the survey in the background; poll cw_job |
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: it discloses that commands are posted, a modal stops the survey and is left open, only a fixed view/dialog allowlist is probed, and no insert/record/mute/solo/document-lifecycle probes occur. It also explains the measured cost per probe, the effect of a short budget, and that `probed` reports how many commands were actually measured.
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, then proceeds to usage, safety constraints, and cost. It is somewhat long and repeats the budget/cost warning, but the repetition serves an important caveat rather than adding empty prose.
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-step probing tool with no output schema, yet the description covers purpose, when to use it, safety boundaries, side effects, cost, budget behavior, and how to interpret `probed`. An agent has enough context to call it correctly and understand the trade-offs.
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 100%, so the baseline is 3, but the description adds meaningful semantics: explicit `cmdIds` are still limited to the safe allowlist, and `budgetMs` is framed against the ~15s-per-probe cost and the weakness of a short sample. It does not add detail on `background`, but the schema already documents that well.
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 first sentence gives a specific verb and resource: re-measuring which command ids do something on the running SONAR by posting each and watching the window list. It clearly explains the working/inert split, but it does not explicitly distinguish itself from nearby siblings such as cw_command_support or cw_command_evidence.
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 a clear triggering context: use after a SONAR update to refresh the working/inert split. It also sets boundary conditions such as defaulting to two safe view commands only when a project is open, and doing nothing otherwise, but it does not name alternative tools for related needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_view_commandsA
Commands that open SONAR views, with the caveat that matters: a view opening inside the existing frame produces NO new window, so cw_run_command reports "none-observed" for all of them even when they worked. Verify a view by reading the accessibility tree or a screenshot.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 the key behavioral trait that view-opening commands produce no new window, which explains a false-negative from cw_run_command. What's missing is what this tool itself returns (a plain list, docs, or command ids) and whether it is read-only.
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?
Two sentences, the diagnostic caveat front-loaded ahead of the verification advice, with no filler. The phrasing 'with the caveat that matters' is a touch informal but costs only a few words.
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, so the description should say what a caller gets back (a list of command names? descriptions?) and roughly how to use the result. It fully covers the important false-negative caveat and verification path but leaves the return contract unstated.
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?
The tool takes zero parameters, so the schema imposes nothing and there is no parameter semantics to add. Baseline 4 applies; the description correctly does not clutter itself with argument talk.
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 first clause names the resource and scope ('Commands that open SONAR views'), so an agent can tell it apart from cw_run_command or cw_list_commands. It never states explicitly that the tool returns a reference list of those commands, leaving the output shape implicit.
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?
Implies usage by contrasting with cw_run_command's 'none-observed' reporting and by suggesting verification via the accessibility tree or a screenshot. It does not explicitly say 'use this to discover which commands to run instead of cw_list_commands' or state any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cw_write_midi_fileA
Generate a Standard MIDI File (format 1) from note and CC events. Each track needs a MIDI channel; CC7/CC10 written at tick 0 become that track's initial volume and pan when SONAR imports the file. This is the reliable way to set mixer values and place notes, because the in-app controls are read-only through automation on this build.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | ||
| path | Yes | Where to write the .mid | |
| tracks | Yes | ||
| overwrite | No | Replace an existing file. Without this, writing over a path that already exists is refused |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries real weight and does disclose non-obvious behavior: format 1 output, a required channel per track, and the SONAR import rule that CC7/CC10 at tick 0 become initial volume/pan. It omits what a successful call returns and how failures are surfaced, so the mutation/write profile is only partially covered.
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 sentences, front-loaded with the artifact produced, followed by the key semantic constraint and the usage rationale. No filler; the only mild redundancy is restating the mixer-value use case after the CC7/CC10 explanation.
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 file-writing tool with no annotations and no output schema, the description should say what the call returns or how to confirm the file was written. It covers purpose and import semantics well but leaves success/failure signaling and the overwrite-refusal behavior entirely to the schema.
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 50%, so the description must compensate. It adds genuine meaning for 'channel' ('Each track needs a MIDI channel') and for volumeCC/panCC (tick-0 CC7/CC10 becoming mixer values on import), but leaves bpm, the -1..+1 pan alternative, raw 'events' bytes, and program unexplained in prose.
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 and artifact: 'Generate a Standard MIDI File (format 1) from note and CC events.' That is precise enough to separate it from the note/CC senders (cw_midi_note, cw_midi_cc) and from cw_read_midi_file, but it never names a sibling or explicitly contrasts the write path with the read path.
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 final sentence gives a clear when-to-use rule: this is 'the reliable way to set mixer values and place notes, because the in-app controls are read-only through automation on this build.' That effectively routes the agent away from cw_set_track_volume/cw_set_track_pan, though those tools are never named and no explicit 'do not use this when...' boundary is drawn.
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.
89 tool updates
v0.2.0- First observed
cw_add_song_tracks - First observed
cw_add_track - First observed
cw_apply_mix - First observed
cw_benchmark - First observed
cw_cal_cleanup - First observed
cw_cal_help - First observed
cw_cal_plan - First observed
cw_cal_run - First observed
cw_check_quantize - First observed
cw_close_overlays - First observed
cw_command_evidence - First observed
cw_command_support - First observed
cw_convert - First observed
cw_convert_help - First observed
cw_doctor - First observed
cw_document_state - First observed
cw_edit - First observed
cw_edit_help - First observed
cw_enable_midi_port - First observed
cw_file_dialog - First observed
cw_find_plugin - First observed
cw_get_clips - First observed
cw_get_notes - First observed
cw_get_state - First observed
cw_get_track - First observed
cw_get_track_control - First observed
cw_history - First observed
cw_history_help - First observed
cw_insert_commands - First observed
cw_insert_track_template - First observed
cw_job - First observed
cw_job_abandon - First observed
cw_job_clear - First observed
cw_job_help - First observed
cw_jobs - First observed
cw_latency - First observed
cw_list_commands - First observed
cw_list_overlays - First observed
cw_list_state - First observed
cw_list_track_templates - First observed
cw_list_tracks - First observed
cw_locate - First observed
cw_markers - First observed
cw_midi_cc - First observed
cw_midi_chord - First observed
cw_midi_config - First observed
cw_midi_devices - First observed
cw_midi_note - First observed
cw_midi_panic - First observed
cw_midi_send - First observed
cw_midi_status - First observed
cw_mixer_support - First observed
cw_mixer_targets - First observed
cw_navigate - First observed
cw_no_effect_causes - First observed
cw_note_edit_help - First observed
cw_plugin_insert_recipe - First observed
cw_plugins - First observed
cw_probe_state - First observed
cw_project - First observed
cw_quantize_dialog - First observed
cw_quantize_plan - First observed
cw_read_midi_file - First observed
cw_redo - First observed
cw_report_state - First observed
cw_run_command - First observed
cw_run_command_classified - First observed
cw_save_state - First observed
cw_set_pan - First observed
cw_set_track_arm - First observed
cw_set_track_mute - First observed
cw_set_track_name - First observed
cw_set_track_pan - First observed
cw_set_track_solo - First observed
cw_set_track_volume - First observed
cw_set_volume - First observed
cw_song_instruments - First observed
cw_status - First observed
cw_surfaces - First observed
cw_timing - First observed
cw_track_controls - First observed
cw_transport - First observed
cw_transport_command - First observed
cw_transpose_plan - First observed
cw_ui_recipe - First observed
cw_undo - First observed
cw_verify_commands - First observed
cw_view_commands - First observed
cw_write_midi_file
TDQS
Scored across 89 tools
Many tools have overlapping or closely related purposes: cw_transport vs cw_transport_command, cw_set_volume vs cw_set_track_volume, cw_status/cw_doctor/cw_benchmark/cw_latency, and numerous state/help/plan tools. The descriptions often clarify the distinctions, but an agent must read deeply to avoid choosing a reference/plan tool instead of the actionable one.
All tools share a cw_ snake_case prefix, which is predictable. However, the naming convention is mixed: some are verb_noun (cw_get_track), some are nouns/references (cw_mixer_support, cw_doctor), and near-duplicates like cw_transport vs cw_transport_command and cw_set_volume vs cw_set_track_volume create inconsistency.
89 tools is far beyond a well-scoped set for this purpose, especially because many are help, planning, diagnostic, benchmark, and reference tools rather than distinct operations. The surface is heavy and fragmented, making discovery and selection burdensome.
The surface covers project lifecycle, tracks, MIDI, commands, editing plans, undo/history, jobs, and state reporting, with documented workarounds for CakeScript limitations. But several core operations remain unavailable or indirect on this build—native track listing, note reading, absolute locate, and plugin insertion—so there are notable gaps despite the breadth.
Maintenance
Related MCP Connectors
Control Unreal Engine to browse assets, import content, and manage levels and sequences. Automate…
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Open-source AI agent control plane and software factory: govern every tool and model call.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI-powered music composition and control for REAPER DAW through OSC and ReaScript integration. Supports transport control, MIDI generation, track management, and music theory operations like scales, chords, and rhythm patterns.17-
- AlicenseNot gradedqualityDmaintenanceReal-time AI-assisted music production, advanced composition, mixing, and VST coordination for FL Studio via bidirectional MIDI & WebSockets, exposing over 100 tools for comprehensive DAW control.9MIT
- FlicenseAqualityCmaintenanceEnables AI assistants to control a live REAPER DAW session on macOS in real time, including track creation, MIDI writing, FX management, and transport control.20-
- AlicenseCqualityAmaintenanceEnables Claude or any AI agent to operate Live 12 Intro end to end: creating tracks and scenes, writing and quantizing MIDI clips, loading audio onto the Arrangement timeline, setting device parameters in real units, drawing clip automation, mixing with real sidechain, and rendering or analyzing audio so the agent can check its own work. It exposes 57 tools over MCP or a local JSON socket, working within the stock Intro edition's 16-track, 16-scene limits.57MIT