01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 11%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
19.4 / 30
16.6 / 20
11.9 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
25 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
track_list |
params_unexplained |
Read-only list of regular, return, and master tracks in the current Live set. Use before addressing tracks by index or deciding where to create content; returns counts and the requested track sections without mutating the session. include_returns (default true) controls whether return tracks are included in the result; include_master (default true) controls whether the master track is included. |
track_get_info |
params_unexplained |
Read-only details for one regular track by index. Use before track-scoped edits to inspect name, type, volume, panning, sends, clip slots, clips, and device counts; returns verified state without mutating the session. index is the zero-based position of the regular track in the session (0 = first track). |
track_create |
params_unexplained |
Create a new MIDI or audio track, optionally at a specific position. Use when the user explicitly wants another track. NOT idempotent: every call creates a track; returns the created track and verifies that its type matches the request. type is 'midi' or 'audio' and selects the track kind; index (optional) is the zero-based position at which to insert the new track; name (optional) sets the new track's name. |
track_upsert |
params_unexplained |
Find or create a track with a matching name and type. Use when a workflow needs a named target track but should avoid duplicates. Idempotent: returns changed=false when the track already exists; verified by returned name/type. name is the name the track must match or be created with; type is 'midi' or 'audio'; index (optional) is the zero-based position used when creating a new track. |
track_set_name |
params_unexplained |
Rename a regular track by index. Use after track_list or track_get_info has confirmed the target track. Idempotent: unchanged names return changed=false; verified via read-after-write and returns before/after names. index is the zero-based position of the regular track; name is the new track name to apply. |
track_set_volume |
params_unexplained |
Set a regular track's mixer volume as a normalized 0..1 value. Use for mix balance changes after confirming the track index. Idempotent within 1e-4; returns linear and dB before/after values with verification diff on mismatch. index is the zero-based position of the regular track. |
create_midi_clip |
params_unexplained |
Create an empty MIDI clip in a session clip slot. Use when the target MIDI track and clip slot are known and a new clip is needed. NOT idempotent for occupied slots; wrapped in an undo step and verified by returned clip length/name. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track; length_beats is the clip's length in beats; name (optional) is the new clip's name. |
clip_add_notes |
params_unexplained |
Add MIDI notes to an existing session clip. Use after creating or locating the target clip. NOT idempotent: repeated calls append notes; returns added count and verification diff if the count does not match. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track; notes is an array of MIDI note objects with pitch (0-127), start (beats from clip start), duration (beats), plus optional velocity (0-127) and mute. |
clip_fire |
params_unexplained |
Trigger a session clip slot. Use when the user wants to launch a specific clip in Session view. Idempotent for already-playing clips, returning changed=false; playback state is async, so verification is marked unverified. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track. |
clip_stop |
params_unexplained |
Stop playback for a specific session clip slot. Use to halt one clip without stopping the global transport. Idempotent for already-stopped clips; returns changed=false when no launch state changed and marks async playback verification unverified. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track. |
clip_set_name |
params_unexplained |
Rename a session clip by track and slot index. Use after confirming the target clip exists. Idempotent: unchanged names return changed=false; verified via read-after-write and returns before/after names. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track; name is the new clip name to apply. |
clip_set_loop |
params_unexplained |
Configure a clip's loop_start, loop_end, and/or looping flag while preserving omitted fields. Use for clip loop edits after locating the clip. Idempotent within 1e-4 and verified against only the fields provided by the caller. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track; loop_start (optional, beats) sets the loop start point; loop_end (optional, beats) sets the loop end point; looping (optional) enables or disables looping. |
clip_set_envelope |
params_unexplained |
Replace all automation points for one clip envelope. Use when the user wants a complete envelope rewrite for mixer or device parameters. NOT idempotent for partial edits; returns written point count and verification diff after hold-curve expansion. track_index is the zero-based track position; clip_slot_index is the zero-based session clip slot position within that track; points is an array of automation points with time (beats from clip start), value, and optional curve_type ('linear'|'ramp'|'hold'). |
scene_fire |
params_unexplained |
Fire a Session view scene by index, triggering all clips on that row. Use for arrangement-style playback from scenes. NOT idempotent: re-triggering restarts clips; returns scene name and marks async transport verification unverified. index is the zero-based scene position in the Session view (0 = top scene). |
device_get_parameters |
params_unexplained |
Read-only list of parameters for a device by track/device index. Use before parameter automation or value changes; returns value/range/automation state and knowledge-base unit/description metadata when the device matches bundled schemas. track_index is the zero-based track position holding the device; device_index is the zero-based device position within that track. |
device_inspect_patcher |
params_unexplained |
Read-only Max for Live patcher discovery for a device. Use when deciding whether a device exposes inspectable M4L patcher metadata. Returns available=false with a reason when the target is not inspectable or the runtime lacks patcher access. track_index is the zero-based track position holding the device; device_index is the zero-based device position within that track. |
device_inspect_plugin |
params_unexplained |
Read-only VST/AU plug-in discovery for a device. Use when identifying third-party plug-ins without relying on user-edited device names. Returns plug-in identity and parameters, or available=false with a reason for native devices or unsupported runtimes. track_index is the zero-based track position holding the device; device_index is the zero-based device position within that track. |
arrangement_add_automation_point |
params_unexplained |
Add one automation point in the Arrangement view for a mixer or device parameter path. track_index selects the mixer/device track, parameter_path selects the parameter (e.g. mixer.volume or device.<i>.parameter.<n>), time is the beat position from song start, value is the parameter value to write at that time, and curve_type chooses the connecting curve shape: 'linear', 'ramp', or 'hold'. Use for incremental arrangement automation edits. NOT idempotent: repeated calls add more points; returns the written time/value/curve after the bridge accepts it. |
session_snapshot |
params_unexplained |
Read-only deep snapshot of the Live session. Set include_clips to capture per-track clip slots (name/length/playing state) and include_devices to capture per-track devices (name/class_name); omit these to exclude that detail. Use before and after mutating tools to verify changes with session_diff; returns tracks with optional clips/devices and top-level session state without changing playback or session state. |
session_diff |
params_unexplained |
Compare a previous session_snapshot with the current Live state. previous must be the full snapshot object returned by session_snapshot. Use after a mutation batch to verify what actually changed; returns added/removed/changed paths with before/after values and a change count. |
render_preview |
params_unexplained |
Preview the current Live set state. mode selects the preview type: 'snapshot' returns deep state without audio, while 'bounce' is reserved for future audio export; bars is the number of bars to preview (positive integer). Use when an agent needs a lightweight result check; returns the preview result for the requested mode and bar count. |
list_recipes |
params_unexplained |
Read-only list of embedded music recipes, optionally filtered by category to one of: drums, bass, chords, racks, arrangements, mixing, or live_performance. Use before apply_recipe to choose a valid recipe id; returns recipe metadata, tags, version, category, and total count without touching Live. |
push_set_pad_color |
params_unexplained |
Set the color of one Ableton Push 2/3 pad. pad is the grid position 0..63 (8x8) and color is the pad LED color value 0..127. Use for visual feedback or performance layouts after hardware detection. Requires Push 2/3; returns sent=true with the pad and color accepted by the bridge. |
push_set_button_led |
params_unexplained |
Set the LED color and mode for a Push transport or utility button. button selects the control to light (e.g. Play, Record, Stop, Metronome, Session, Browse), color is the LED color value 0..127, and mode is the blink behavior: 'solid', 'blink', or 'pulse'. Use for hardware feedback after Push detection. Requires Push 2/3; defaults mode to solid and returns sent=true with the accepted button/color/mode. |
push_set_mode |
params_unexplained |
Switch Ableton Push 2/3 to note, session, drum, or step mode. mode selects the pad layout/workspace: note entry, session clip launching, drum rack pads, or step sequencer. Use when preparing a performance or editing workflow on Push hardware. Requires Push 2/3; returns sent=true with the mode accepted by the bridge. |
Selection evidence
14 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
device_inspect_patcher |
device_inspect_plugin |
high | Identical read-only schema and both are 'inspect the device' tools; a task like 'inspect the device on track 0' doesn't specify patcher vs plugin, so either is a plausible wrong pick. |
device_get_parameters |
device_set_parameter |
medium | A task phrased around 'the device parameter' without an explicit get/set verb (e.g. 'change that parameter', 'look at the parameter') can be routed to the read tool when a write was intended or vice versa, since both share the device/parameter vocabulary. |
stop |
clip_stop |
medium | Both halt audio and share stop/playback language; a task like 'stop that clip' or just 'really stop it' is ambiguous between global transport stop and per-slot clip stop. |
track_get_info |
session_get_info |
medium | Both are read-only 'get info' tools with identical tokens; a vague request like 'get info about the current set' or 'tell me what's going on' could select either, since only the track-vs-session qualifier disambiguates. |
track_set_name |
clip_set_name |
medium | Both rename by index and share rename/set/name tokens; 'set this name' or 'rename that' referencing a slot inside a track can be routed to the clip tool instead of the track tool or vice versa. |
push_set_button_led |
push_set_mode |
medium | Both have a 'mode' concept, so 'set the push mode' / 'put the push in pulse mode' is ambiguous between LED button mode and note/session/drum/step layout mode. |
clip_fire |
scene_fire |
medium | Both use fire/launch/trigger language on session slots; a task like 'fire that slot' or 'launch that row' doesn't clearly distinguish a single clip from a whole scene. |
session_snapshot |
session_diff |
medium | Both are read-only session state tools built around snapshots; 'snapshot the session' vs 'show me what changed' can be conflated, especially when a user asks to capture state then see changes as one request. |
track_create |
track_upsert |
medium | track_create also accepts a name, so 'create a track called Drums' is ambiguous with the idempotent find-or-create upsert; a non-idempotent create can be chosen when dedup was intended. |
session_get_info |
session_snapshot |
medium | Both read-only snapshots of the session; 'show me the current session/live set state' could route to the lightweight info tool or the deep snapshot tool since neither request is specific. |
list_recipes |
list_prompts |
medium | Both are read-only 'what's available' listers; 'show me the available workflows/options' is ambiguous between bundled music recipes and MCP prompt workflows. |
device_get_parameters |
device_inspect_plugin |
medium | Both are read-only device inspection returning parameters; 'inspect the plugin on this device' could be routed to the generic parameter tool instead of the plugin discovery tool. |
create_midi_clip |
clip_add_notes |
medium | Both operate on MIDI clips by slot; 'create a MIDI clip with these notes' is ambiguous because one tool creates an empty clip and the other adds notes, so a single-step selection can pick the wrong one. |
list_prompts |
list_resources |
medium | Both are MCP discovery listers with identical tokens; 'list what this server exposes' / 'what's available here' doesn't specify whether prompts or resource URIs are wanted. |
Compare the field