Logic Pro MCP
Drives Apple's Logic Pro on macOS — transport, tracks, mixer, plug-ins, bounce and delivery — by talking to Logic the way hardware does (OSC control surface, Mackie Control emulation over virtual CoreMIDI, Accessibility, CGEvent key commands, AppleScript and the Logic Pro Virtual In MIDI port). Sets tempo and playhead, creates/renames/colors/mutes/solos/arms tracks, inserts plug-ins such as Channel EQ and edits their parameters in real units, measures rendered audio (LUFS, true peak, spectrum) to balance a mix, bounces to several formats at once, and reads every result back from Logic as confirmed/uncertain/failed.
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., "@Logic Pro MCPplay the project, bounce it to mp3 and send me the mixdown"
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.
Logic Pro MCP
An MCP server that lets AI agents (Claude Code, Claude Desktop, Hermes, Cursor, any MCP client) drive Logic Pro
on macOS — transport, tracks, mixer, plug-ins, bounce, delivery — with every result read back from Logic, plus
hands-and-voice control of the faders. Works with both the desktop purchase and the Creator Studio subscription
build (com.apple.mobilelogic). Package name logic-pro-mcp; the Python module is logic_mcp.
Not affiliated with or endorsed by Apple. Logic Pro is a trademark of Apple Inc.
Apple ships no API, so this talks to Logic the way hardware does:
Channel | What it does | Readback |
OSC (a fake TouchOSC control surface) | mixer strips, pan, selection, transport, plug-in parameters, Channel EQ — the best path for anything with a value | Logic echoes its own state back |
MCU (Mackie Control emulation over virtual CoreMIDI) | transport, and per-strip mute/solo/arm/select/faders for the eight tracks Logic currently shows on the surface | LED echo, LCD text, fader echo |
Accessibility | control bar (Play/Record/Cycle/Count In, tempo, playhead), track headers, dialogs | live UI values |
CGEvent key commands | anything with a shortcut (new track, save, undo, editors) | via AX |
AppleScript | launch / activate / open / quit | – |
Logic Pro Virtual In MIDI | notes, chords, sequences, CC, program, pitch bend, SysEx, MMC | – |
Zero manual setup in Logic: Logic auto-scans new MIDI ports with Mackie Control device queries, we answer the handshake, and Logic installs the surface itself. Endpoints carry fixed CoreMIDI unique IDs so the binding survives restarts.
Install
Requires a local Mac with Logic Pro. Linux containers, including Glama's hosted Docker build environment, cannot run the CoreMIDI, Accessibility, and PyObjC integrations. The Glama directory listing is for discovery; it is not a hosted Logic Pro service. Use the local doctor command below to check your Mac's setup.
Directory inspection (Linux/CI)
LOGIC_MCP_INSPECT_ONLY=1 uv run logic-pro-mcp exposes the same tool and resource
schemas without importing any DAW backends. Every tool call and resource read
returns an explicit error in this mode, including health checks. It does not
simulate a connected Mac or provide remote control. Never enable this variable
in your normal Logic Pro client configuration.
For Glama, use Python 3.12, build step uv sync --frozen --no-dev, and command:
["mcp-proxy", "--", "env", "LOGIC_MCP_INSPECT_ONLY=1", "uv", "run", "--no-sync", "logic-pro-mcp"]The explicit environment setting in the command keeps hosted instances in
inspection mode. Dockerfile.inspection provides an equivalent local test image.
Run uv run python scripts/check_inspection.py to verify real stdio discovery and
that all 12 tools and 7 resources refuse execution. This is schema validation,
not live Logic Pro validation.
Local installation
cd "/path/to/logic-pro-mcp"
uv sync
uv run logic-pro-mcp-doctor # which channels are ready + what to clickPermissions (System Settings → Privacy & Security): Accessibility and Automation → System Events for the process that runs the server (Claude, Terminal, Hermes…).
Register
claude mcp add --scope user logic-pro-mcp -- uv run --directory "/path/to/logic-pro-mcp" logic-pro-mcp
hermes mcp add logic-pro-mcp --command uv --args run --directory "/path/to/logic-pro-mcp" logic-pro-mcp(logic-mcp and logic-mcp-doctor still work as aliases of the two commands.)
Related MCP server: Ableton Live MCP Ultra v2
Tools
logic_system— health/doctor, permissions, midi_ports, key_map,ax_dump/ax_find(explore Logic's UI tree)logic_transport— play, stop, record, go_to_beginning, rewind, fast_forward, toggle_cycle, toggle_count_in, toggle_metronome, set_tempo, goto, statelogic_tracks— list (optionally with colors), select, mute, solo, arm, monitor, set_volume (dB), set_pan, set_color / get_color (96-swatch palette: index, name likedark green, or hex), palette, create_*, delete, renamelogic_midi— note, chord, sequence, cc, program, pitch_bend, aftertouch, sysex, mmc, mcu_button/strip/faderlogic_plugins— insert by name, describe/get/set parameters in real units (dB, Hz, %), switches, presetslogic_level— measure rendered audio (LUFS, true peak, crest, correlation, spectrum) and balance the mix from itlogic_export— bounce (several formats in one pass), stems, read bounce settings, dismiss stray dialogslogic_deliver— upload to cloud storage, or the whole chain: bounce, verify, upload, return share linkslogic_project— launch, activate, quit, open, save, save_as, new, close, undo, redo, infologic_osc— control surface: transport, select, mute, solo, volume, pan, bank, channel strip, Channel EQ, plug-in parameterslogic_offline— rename tracks, folders and mixer groups inside the saved project file, Logic closedlogic_keys— escape hatch: any key chord or named Logic command
Resources: logic://health, logic://transport, logic://tracks, logic://app,
logic://markers, logic://mixer, logic://regions
Honest contract
Every write returns state: confirmed | uncertain | failed. Only confirmed means the change was read back from Logic.
Destructive track ops require an explicit index/name and a confirmed selection, or they refuse.
The MCU surface only ever addresses the eight tracks Logic is currently showing on it — its bank buttons do nothing here. Which track sits on which strip is read back from the surface's own display, never assumed, and anything it cannot prove is routed through Accessibility instead. An earlier version assumed the bank and silently moved faders on tracks nobody had asked for.
Layout
logic_mcp/
server.py MCPServer, tools, resources
doctor.py channel health + fix plan
target.py find Logic (desktop / Creator Studio), pid, version
result.py confirmed / uncertain / failed envelope
channels/
midi.py rtmidi + CoreMIDI: Logic Virtual In, MCU handshake/LEDs/LCD/faders/banks, MMC
ax.py generic Accessibility helpers (walk, find, press, set, dump)
ax_logic.py Logic-specific AX map (verified on 12.3 Creator Studio)
palette.py track color palette: swatch grid, names/hex, selection-ring readback
screen.py pixel readback (screen capture) for what AX can't see
dialogs.py macOS save panels, Logic alerts, popups, segmented bar/beat fields
mouse.py real HID clicks for controls whose AXPress is inert
keys.py CGEvent key posting + Logic default key commands
applescript.py osascript lifecycle helpers
plugins.py insert plugins, read/write parameters in real units
audio.py BS.1770 loudness, true peak, crest, correlation, spectral balance
leveling.py stem measurements -> gain and pan moves
export.py bounce / stem export, with completion proven on disk
upload.py rclone delivery to cloud storageSee FEATURES.md for the full matrix and PLAN.md for the research behind it.
Gesture and voice control
Hands and speech drive Logic through the same channels, via four small processes. Full write-up in
docs/gesture.md; research and decisions in GESTURE_VOICE_PLAN.md.
Voice carries the nouns and the verbs; the hand carries the value. Say "volume on strings" and your hand is that fader until you let go. A DAW has ~1000 commands and ~100 tracks; a hand has six poses you can hit without looking, so the hand never names anything.
handd (Swift, camera) --UDP--> gestured --unix sock--> logicpadd --> Logic
voiced (Python, mic) --UDP--> | ^
+--UDP--> hud +-- logic-mcpThe model is never in the gesture loop. gestured writes OSC directly at ~45 ms hand-to-fader; a
model only appears when the voice grammar misses, and then out-of-band on its own thread with a hard
timeout so it cannot stall the hand.
logicpadd exists because only one process can hold UDP 9000 plus the Bonjour advert, and Logic
segfaults if that advert disappears while it has the device bound. It owns the one surface and
serves both the MCP server and the gesture daemon. With no daemon running everything falls back to
binding directly, exactly as before.
The arbiter is a pure state machine with three rules: no target means no motion; poses are suppressed while the clutch is closed; and releasing the clutch freezes the value rather than resetting it — losing the hand is treated the same way.
logicpadd & # owns the OSC surface; start first
gestured --dry-run # decides everything, sends nothing
gesture-fakehand # synthetic hand, no camera needed
gesture-hud # always-on-top readoutDelivery
logic_deliver(action="bounce_and_upload", ...) runs the whole chain and hands back share links:
directory + filename + formats=["wav","mp3"] -> bounce (one pass, both formats)
-> verify sizes on disk
-> rclone copy to remote:folder
-> verify remote sizes match, return linksMeasured at 68 s for a 9-bar preview of an 8-track project, WAV + MP3, uploaded and linked.
Uploads go through rclone rather than a Drive API tool, because bounced audio is large and binary and
should stream from disk instead of passing through the model's context.
Uploads go to your own account. No credentials and no default remote ship with this server. Run
logic_deliver(action="setup") for the exact commands; you run them yourself, and the sign-in happens in
your browser under your own Google account — nothing is stored here. Pin a remote with $LOGIC_MCP_REMOTE
or pass remote=. With several remotes configured and none pinned, delivery refuses rather than guessing
which account your audio should land in.
Plugin control
Both reference projects declared plugin parameters unreachable. They are reachable, but the mechanics are odd:
AXValueis settable and reports success, yet moves one internal unit per call whatever number you pass.AXIncrement/AXDecrementmove ten.Internal units map non-linearly to real ones (frequency is logarithmic), so the engine steps, re-reads the plugin's own readout, learns what a step is worth locally, and repeats until it is inside tolerance.
logic_plugins("insert", track=1, plugin="Channel EQ")
logic_plugins("set", parameter="Low Cut Frequency", value="90 Hz") # -> confirmed, 20.0 Hz -> 90.0 Hz
logic_plugins("set", parameter="Peak 2 Gain", value="-2.5 dB") # -> confirmed, 0.0 dB -> -2.6 dBValues are checked for unit agreement first — a target in Hz aimed at a control that reads in percent is
refused rather than driven somewhere absurd. Ratio readouts (4:1) and signed infinities parse correctly.
Plugin editors are identified by structure (a bypass control plus a close button) rather than by "any window
that is not the arrange window", so an open Mixer is never mistaken for one.
Coverage varies by plugin, and the tool is honest about it. Channel EQ names every control, so all 26
parameters and 14 switches are exact. The Compressor leaves its sliders anonymous with the names in separate
text elements and readouts in percent; those are matched by on-screen position and marked labelled_by: "position". Any name that matches more than one control — Channel EQ has two sliders called Gain — is
refused rather than guessed at. A parameter whose EQ band is switched off reports AXEnabled: false, and is
either enabled first or refused.
Auto-leveling
Logic's meters report clipping only, with no numbers, so levels are measured from rendered audio instead — which is what a human engineer does anyway. Loudness follows ITU-R BS.1770-4 (K-weighting, 400 ms blocks, absolute and relative gating), alongside 4x-oversampled true peak, crest factor, stereo correlation and a seven-band spectral balance.
logic_level("plan", directory="~/stems") # measure and propose, nothing touched
logic_level("apply", directory="~/stems", dry_run=True)
logic_level("apply", directory="~/stems") # set the faders, verified in dB
logic_level("export_and_plan", directory="~/stems") # render stems out of Logic firstThe reference stem — the lead vocal when it can find one — defines the balance: everything else is placed relative to it by role, so the mix keeps its character instead of being flattened to a number. Roles are guessed from stem names. Peaks are checked against a headroom line and moves are pulled back if they would breach it, and if any stem wants a boost the whole set is shifted down instead so nothing is pushed into the ceiling.
That shift moves the reference's own fader too — it is fixed relative to the others, not pinned at 0 dB.
The plan reports it (global_shift_db, and shifted_by_db per move), and gain_uncapped_db keeps the
pre-shift intent visible, so "this stem wanted to be louder" is not lost. After a downward shift no
gain_db is positive; that is the design, not a clamp bug.
Measured on a real 5-stem session (460 s each): 6 s to analyse, 14 s to apply.
reference: VOX (vocal) at -17.3 LUFS
Other other -16.7 LUFS gain -6.6 dB pan +25
GTR guitar -18.3 LUFS gain -5.0 dB pan -40
Bass bass -15.1 LUFS gain -4.7 dB
Drums drums -15.3 LUFS gain -4.0 dB
VOX vocal -17.3 LUFS gain +0.0 dBGains land within about 0.2 dB and are confirmed against Logic's own fader readout. Pan goes over OSC when
the track is on the surface bank, where the readback is Logic's own value and the result is confirmed;
otherwise it falls back to the track-header slider, which only moves by Increment/Decrement and settles
within about 4 of 127, and that path stays uncertain rather than overstating itself.
Mix engine
Plain language in, stock plug-in settings out. "cut the mud in the strings" resolves the STRINGS family track, opens or creates its Channel EQ, and drives a recipe of parameter targets with readback.
34 recipes, each carrying synonyms, the plug-in it needs, per-source frequency overrides (vocals/strings/drums/bass/guitar/keys/mix), a caution, and cited sources. Third-party plug-ins work — FabFilter Pro-Q 3 lands on 300.00 Hz / −3.00 dB / Q 1.000 exactly. Targets are reached by bisection against the display string Logic echoes back, so the final number is Logic's own quantisation rather than ours.
Direction is never assumed: the DeEsser's Range runs backwards (0.0 = 25 dB), so the engine probes both endpoints, requires a fresh echo from each, works out which way the parameter runs, and refuses targets outside the achievable range.
Dialogue cues → markers
Finds where speech starts and stops in a mixed programme and writes the result into Logic as markers.
audio ──► detect_cues() ──► ASR (optional, pluggable) ──► cue-marker WAV ──► Logic markers
no model, language-freeDetection never looks at phonemes or words, so the same code works in any language: it combines formant-band energy concentration (300 Hz–3.4 kHz) with syllabic amplitude modulation (3–8 Hz), both as percentile ranks within the file rather than fixed dB, so it self-calibrates to any programme level. Put 132 Tamil dialogue markers into a real episode.
Cues are capped at max_duration and split at their least speech-like interior frame, so a marker never
covers half a scene. A measured music gate (off / safe / strict) drops cues whose spectrum is too
steady to be speech — safe removes about 42 % of music false positives at a cost of about 5 % of dialogue,
and rejected segments stay in the payload with their reason so a wrong call is auditable.
The gate is deliberately biased toward recall: a spurious marker is one click to delete, a missing one is a missed line. An earlier modulation-based gate that "obviously" made sense cut a real 132-cue run to 11.
Tests
uv sync --group dev
uv run pytest # runs with Logic CLOSED and no Accessibility grant
uv run pytest -m live # the few that need the appThe suite covers the parts that decide what is true: the result envelope, the OSC wire format and its measured address quirks, the ProjectData binary layout (against a synthetic file built independently to the documented format), dialogue detection, cue WAVs including UTF-8 Tamil labels, loudness maths, recipe resolution and which cloud account uploads go to.
Available Tools
12 toolslogic_deliverA
Get finished audio out of Logic and into cloud storage.
bounce_and_upload - the whole chain: render the project to `formats`, verify the files, upload them,
and return share links. Give directory + filename + formats + folder.
upload - push existing local `paths` to remote:folder.
remotes / list - what storage is configured, and what is already in a folder.
setup - how the user connects their OWN cloud account.
Uploads go to the user's own remote: this server ships no credentials and no default account. The
remote comes from `remote`, else $LOGIC_MCP_REMOTE, else the single configured remote; with several
configured and nothing pinned it refuses rather than guessing. Run `setup` for the exact commands —
the user runs them themselves, since the flow ends in a browser sign-in to their own account.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | ||
| action | Yes | ||
| folder | No | ||
| remote | No | ||
| end_bar | No | ||
| formats | No | ||
| timeout | No | ||
| filename | No | ||
| directory | No | ||
| start_bar | No | ||
| make_links | No |
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 uploads go to the user's own remote, that the server ships no credentials or default account, the remote resolution precedence and refusal on ambiguity, and that setup ends in a browser sign-in run by the user. Lacks details on overwrite behavior, rate limits, and upload failure handling.
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-loads the purpose, then gives a structured action breakdown, remote behavior, and setup note. The length is justified by five distinct actions, though the indented inline list and repeated framing could be tightened slightly.
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 tool is complex: eleven parameters, five actions, no annotations, no output schema, and no schema descriptions. The description covers action routing and some auth context, but leaves many parameters and most return/error behavior undocumented, making it insufficient for fully reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 11 parameters, so the description must compensate. It mentions directory, filename, formats, folder, paths, and remote, but leaves start_bar, end_bar, timeout, make_links, and the precise semantics/values of the named parameters unexplained. An agent must infer heavily from raw schema defaults and types.
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 finished audio out of Logic and into cloud storage.' The action list further distinguishes five concrete sub-purposes (bounce_and_upload, upload, remotes/list, setup). It does not explicitly differentiate itself from the sibling logic_export, which is the only missing element.
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?
Explains when to use each action: bounce_and_upload for the full render/upload chain, upload for existing local paths, remotes/list for inspecting configured storage, and setup for connecting the user's own cloud account. Also gives the remote resolution rule and refusal behavior. No explicit when-not guidance relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_exportA
Render audio out of Logic and verify it landed on disk.
bounce - one pass, several formats at once: formats=["wav","mp3"]. Optional start_bar/end_bar limit the range.
sample_rate like "44.1 kHz", bit_depth like "24-bit", normalize "Off", mode "Offline".
stems - File > Export > All Tracks as Audio Files, one file per track (the input for level analysis).
options - read the current bounce dialog settings without changing anything.
dismiss - close any stray Logic dialog (escape hatch).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| action | Yes | ||
| end_bar | No | ||
| formats | No | ||
| timeout | No | ||
| filename | No | ||
| bit_depth | No | ||
| directory | No | ||
| normalize | No | ||
| start_bar | No | ||
| sample_rate | No | ||
| include_tail | 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 bounce/stems write audio to disk and get verified, that options changes nothing, and that dismiss is a safe dialog closer. It does not cover overwrite behavior, where files land (directory/filename), long-run timeout behavior, or failure modes for a file-writing 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?
Front-loaded summary sentence, then a compact per-action list with no filler. The list blends usage guidance with parameter syntax, which slightly muddies scanning, 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 12-parameter, no-annotation, no-output-schema tool, the description covers action semantics and the most common render settings, but omits filename, directory, include_tail, and timeout, and gives no sense of what is returned beyond the implied on-disk verification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for over half the parameters: formats with an example, start_bar/end_bar range limiting, plus concrete formats for sample_rate ('44.1 kHz'), bit_depth ('24-bit'), normalize ('Off'), and mode ('Offline'). It leaves timeout, filename, directory, and include_tail unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Render audio out of Logic and verify it landed on disk') and then enumerates the four actions, each with a distinct meaning (bounce, stems, options, dismiss). An agent can tell exactly what capability this covers versus the other logic_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action gets a use case: bounce for one-pass multi-format renders, stems for per-track files and explicitly 'the input for level analysis' (routing to logic_level), options as a read-only settings check, dismiss as an escape hatch. No explicit when-not-to-use or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_keysB
Escape hatch: send any key chord ('cmd+shift+n') or a named Logic command from key_map to Logic.
| Name | Required | Description | Default |
|---|---|---|---|
| chord | No | ||
| command | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It reveals the input format and that input is injected into Logic, but says nothing about focus/window requirements, permission or automation-authorization needs, whether the injection is destructive or reversible, timing/rate behavior, or what a success/failure result looks like. For a tool that synthesizes arbitrary input into an external app, that is a substantial 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 the label and the primary mechanism front-loaded and no filler. It is efficiently sized, though the brevity is arguably too extreme for a tool whose parameters need disambiguation.
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 two undocumented optional parameters, no annotations, and no output schema, the description is the only source of guidance and it leaves the dual-input contract unresolved. An agent could reasonably guess to send a chord, but would not know how to choose between chord and command or how failures surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it partially does: it defines 'chord' by example ('cmd+shift+n') and defines 'command' as a named Logic command drawn from key_map. The critical ambiguity is left unaddressed: both parameters are optional with no stated mutual exclusivity or precedence, so an agent cannot tell whether to pass one, both, or neither, nor what happens in each case.
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 ('send') and two concrete resources ('any key chord' with a literal example 'cmd+shift+n', or 'a named Logic command'), which distinguishes it from transport/midi/tracks siblings that drive Logic through specific domains. The label 'escape hatch' clarifies it is the generic fallback rather than a domain tool. It stops short of explicitly naming which sibling covers which case.
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?
'Escape hatch' implies when to reach for it (when no dedicated tool exists), and the reference to 'key_map' implies a dependency on that resource for valid command names. However there is no explicit when-to-use statement, no alternative-tool routing, and no mention of whether the target app must be focused or accessibility permissions granted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_levelA
Measure rendered audio and balance the mix from it.
Logic's meters report clipping only, with no numbers, so levels are measured from audio rather than read
off the UI — which is what a human engineer does anyway.
analyse - loudness (gated LUFS per BS.1770), true peak, crest, stereo correlation and spectral
balance for each file in `paths`.
plan - the above, plus a proposed gain and pan per stem. Nothing is applied.
export_and_plan - render one stem per track out of Logic first, then plan.
apply - carry the plan out on the matching tracks, verified in dB. dry_run reports what it
would do without touching anything.
mode matters. "relative" adds each gain to the track's CURRENT fader, which is right when the stems were
rendered through those faders (export_and_plan). It is NOT idempotent — running it twice applies the move
twice. "absolute" treats each gain as the fader position itself, which is right for stems that came from
outside this project, and is safe to re-run.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | relative | |
| paths | No | ||
| action | Yes | ||
| dry_run | No | ||
| apply_pan | No | ||
| directory | No | ||
| reference | No | ||
| headroom_db | No | ||
| max_move_db | No | ||
| max_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that 'plan' applies nothing, that 'apply' mutates track faders and verifies in dB, that dry_run suppresses the write, and — critically — that relative mode is NOT idempotent and double-applies on a second run. That non-idempotency warning is exactly the kind of trait annotations could not convey. It stops short of saying whether fader moves are reversible or what the measurement output 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?
Well front-loaded: purpose first, then the action table, then the mode caveat that governs correctness. The action list is compact and scannable. The 'which is what a human engineer does anyway' aside is minor filler, but the rest earns its 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 10-parameter, four-action, no-annotation, no-output-schema tool, the description covers the behavioral decision surface well but leaves real gaps: six parameters undescribed and no indication of what analyse actually returns to the agent. An agent can choose the right action, but not confidently populate the tuning parameters or 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 0% across 10 parameters, so the description must compensate, and it only covers roughly half: action (all four values), mode (both values plus the default's implications), dry_run, and paths. apply_pan, directory, reference, headroom_db, max_move_db and max_seconds are never mentioned, leaving six numeric/path parameters completely undocumented in both schema and 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?
The opening sentence states a specific verb and resource: measuring rendered audio and balancing the mix. The four action values are enumerated with a one-line explanation each, so the tool's scope is unambiguous. It never names a sibling (logic_export, logic_offline or logic_tracks could plausibly overlap), so differentiation must be inferred from the action list rather than being 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?
Explicitly states when to pick each action: 'analyse' for measurement only, 'plan' when nothing should be applied, 'export_and_plan' when stems must first come out of Logic, 'apply' to commit. The mode section goes further, naming the exact condition that selects relative vs absolute ('right when the stems were rendered through those faders' vs 'stems that came from outside this project'). This is when-to-use guidance at the level of a decision tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_midiC
Send MIDI into Logic's Virtual In (lands on the record-armed track) or drive the MCU surface.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | ||
| data | No | ||
| note | No | ||
| notes | No | ||
| steps | No | ||
| strip | No | ||
| value | No | ||
| action | Yes | ||
| number | No | ||
| channel | No | ||
| command | No | ||
| duration | No | ||
| velocity | 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 MIDI lands on the record-armed track and that a second MCU mode exists, but it says nothing about real-time behavior, permissions, driver/port setup, or the differing side effects of the 13 actions, which is a large gap for a live-control 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?
A single front-loaded sentence with no wasted words, but it is under-sized for a 13-action, 13-parameter tool; brevity here reads as omission rather than discipline.
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 highly complex tool with no annotations, no output schema, an opaque 13-value action enum, and 0% schema description coverage, one sentence is grossly insufficient. The action-to-parameter contract is entirely 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 13 parameters, and the description explains none of them. Nothing tells the agent that action='mcu_fader' consumes strip/value, or that note/chord/sequence consume note, notes, steps, velocity and duration.
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 MIDI into Logic's Virtual In or drive the MCU surface. An agent can grasp the tool's two modes, but the description never differentiates it from siblings like logic_osc (another surface-control candidate), 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 parenthetical '(lands on the record-armed track)' hints at a precondition, but there is no when-to-use guidance, no explanation of which of the 13 actions fits which scenario, and no routing advice versus the other logic_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_offlineA
Read or rename track/folder/group names INSIDE a .logicx file, without driving Logic's UI.
list: every patchable name in the project (kind: track | folder | group), plus counts.
rename: apply changes [{"old","new","kind"?}] to the project's ProjectData. By default writes to an
APFS clone "<name> OFFLINE.logicx" next to the original (instant, no data copied); in_place
patches the original after saving ProjectData.bak, and is refused while Logic has that
document open (Logic would overwrite it on save). Returns uncertain: only Logic reopening
the file proves the edit, so open the result and read the names back.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| changes | No | ||
| project | Yes | ||
| in_place | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: default writes to an APFS clone next to the original, in_place patches the original only after saving ProjectData.bak and is refused while Logic holds the document, and the result is explicitly 'uncertain' until Logic reopens the file. These are exactly the mutation, backup, and verification behaviors 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?
Front-loaded core sentence followed by tight list:/rename: sections; every clause adds operational value (clone mechanics, backup, refusal condition, verification caveat). Slightly dense in the rename block but no wasted sentences.
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-annotations, no-output-schema mutation tool, the description covers actions, destination semantics, safety/backup behavior, failure conditions, and the limits of the return value. Nothing needed to invoke it correctly 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?
Schema description coverage is 0%, so the description must compensate; it documents the changes array shape ({"old","new","kind"?}), the in_place flag's effect, and the list/rename action split. The project parameter is only implied ('next to the original', 'inside a .logicx file') rather than stated as a file path, leaving a small 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?
States a specific verb pair (read/rename) and a precise resource (track/folder/group names inside a .logicx file) and immediately distinguishes itself from every sibling by noting it operates 'without driving Logic's UI.' An agent can tell this apart from logic_project/logic_tracks 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?
Clearly differentiates the two actions with 'list:' and 'rename:' labels and explains when in_place is appropriate (and when it is refused: while Logic has the document open), steering toward the safe clone default. It stops short of explicitly comparing to sibling tools, but the offline framing implies when it should be preferred over UI-driving tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_oscA
Drive Logic through its built-in TouchOSC "LogicPad" control surface over OSC (UDP), with feedback.
We advertise a Bonjour service in the TouchOSC Mk1 format, Logic binds it as a control surface (one-time
alert "OSC app TouchOSC wants to connect" -> Connect, pressed automatically), then Logic streams its state
(track names of the current 8-strip bank, select/mute/solo, volumes, meters, bar, SMPTE time, transport)
and accepts the fixed LogicPad address map. Faster and more reliable than Mackie emulation for transport,
selection and mixer moves; every result is read back from Logic's own OSC echo.
connect bind the device (idempotent). status snapshot of everything Logic last sent.
transport command=play|stop|record|cycle|rewind|forward|click|soloreset (record starts recording on
armed tracks -- only on explicit request).
bank command=bank+|bank-|track+|track- (move the 8-strip window; strips are 1..8 inside it).
select|mute|solo strip=1..8 (mute/solo toggle; readback says the new state).
volume strip=1..8 value=0..1 (fader, 0.75 ~ 0 dB). master_volume value=0..1.
send address=/1/... args=[...] raw message; feedback returns what Logic sent in the last `wait` s.
Selected-track pages (select a track first):
strip inserts (slot, name, bypassed), focused plug-in name + its 16 parameters (name, 0..1, display),
sends, pan, mute/solo/arm of the SELECTED track.
eq the Channel EQ on the selected track: 8 bands (1 high-pass, 2 low shelf, 3-6 peaks, 7 high shelf,
8 low-pass) with on/gain/freq/q (+slope on 1 and 8), each as 0..1 and Logic's display value.
present=false means the track has no Channel EQ (insert one via logic_plugins first).
eq_set band=1..8 param=gain|freq|q|slope|on, then EITHER value=0..1 (raw) OR target=<number in
Logic's units: dB, Hz, Q> which is reached by bisection on Logic's display value
("cut the mud": band=4 param=freq target=300; param=gain target=-3; param=q target=1).
plugin command=slot+|slot-|page+|page-|bypass|open (bypass/open take slot=1..12) on the selected track.
param list the focused plug-in's parameters (same as strip.params).
param_set param=<n or exact name> + value=0..1 or target=<number in the display unit>; read back.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| band | No | ||
| slot | No | ||
| wait | No | ||
| param | No | ||
| strip | No | ||
| value | No | ||
| action | Yes | ||
| target | No | ||
| address | No | ||
| command | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so richly: it discloses UDP/OSC transport, Bonjour advertising, the one-time connection alert, idempotent connect behavior, readback via Logic's OSC echo, record-on-armed-tracks behavior, and EQ bisection semantics. It also explains what happens when an EQ is absent and how raw send feedback works.
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 appropriately sized for a tool with 19 actions and 11 largely undocumented parameters. It is front-loaded with the core mechanism and then organized as a compact action reference, with each section earning its place through actionable syntax and 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 complex OSC control surface with no annotations and no output schema, the description is largely complete: it explains protocol setup, action semantics, prerequisites, and many readback behaviors. It stops short of specifying exact return shapes or error/timeout behavior, which leaves a small gap for an agent needing precise result handling.
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: action values, command values, strip ranges, 0..1 value ranges, target units, band/slot/param usage, address/args for raw send, and wait semantics are all explained. This gives an agent enough information to populate the otherwise undocumented parameters correctly.
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 mechanism: drive Logic through the TouchOSC LogicPad control surface over OSC/UDP with feedback. This clearly identifies the resource and transport, but it does not explain when this tool should be chosen over overlapping siblings such as logic_transport or logic_plugins.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list provides clear context for each operation, including prerequisites like selecting a track before using selected-track pages and using logic_plugins first when no Channel EQ is present. It also states that record should only be used on explicit request. However, it does not give overall guidance on choosing logic_osc versus sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_pluginsA
Read and write plugin parameters in real units (dB, Hz, %, ratios).
insert - add a plugin to a track by name, e.g. plugin="Channel EQ" (uses Mix > Search and Add Plug-in).
describe - every parameter, switch and menu in an open plugin window, with its current readout.
get - one parameter's current value.
set - drive a parameter to a target: value="+3 dB", "1.2 kHz", "80 Hz", 2.0. Verified by re-reading
the plugin's own readout. A parameter whose band is switched off is enabled first when
enable_band is true, otherwise it refuses rather than silently doing nothing.
switch - toggle a named switch (an EQ band, Analyzer, HQ...).
preset - read the current preset name.
windows / close - list or close open plugin editors.
| Name | Required | Description | Default |
|---|---|---|---|
| on | No | ||
| track | No | ||
| value | No | ||
| action | Yes | ||
| plugin | No | ||
| window | No | ||
| parameter | No | ||
| tolerance | No | ||
| enable_band | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: set is 'Verified by re-reading the plugin's own readout', and a parameter whose band is off is enabled first when enable_band is true, otherwise it 'refuses rather than silently doing nothing' – an explicit failure-mode disclosure. It omits preconditions (which action requires an open editor window), required permissions, and reversibility, keeping it out of 5 territory.
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 one-line scope statement is front-loaded, followed by a tight action-by-action list in terse fragments. Nearly every line earns its place; the only minor cost is that the tabular fragment style occasionally trades completeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-action, nine-parameter tool with no annotations and no output schema, the description covers most actions and the set failure path, but leaves the agent without preconditions, return/readout format, or the meaning of tolerance, on, and window. Adequate but with clear gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It usefully documents value formats ('+3 dB', '1.2 kHz', 2.0), the plugin name example ('Channel EQ'), the named parameter, and enable_band's behavior. However, 'tolerance', 'on', and 'window' are never explained, and 'track' is only implied by the insert sentence, leaving real gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the resource (plugin parameters, in real units) and the description then enumerates all eight actions (insert, describe, get, set, switch, preset, windows/close) with a concrete verb for each. An agent can tell exactly what each action does. It never names or distinguishes itself from the sibling tools (logic_level, logic_tracks, etc.), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the action list: use describe to see every parameter, get for one value, set to drive a value, insert to add a plugin. But there is no explicit when-to-use / when-not guidance, no statement of prerequisites (e.g. must an editor window be open before get/set/switch?), and no routing against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_projectC
Project lifecycle via AppleScript + key commands. save/new/close use key commands (need Accessibility).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| action | 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 behavioral burden. It usefully discloses AppleScript/key-command implementation and that save/new/close require Accessibility permission, but omits mutation/destructive implications, prerequisites for launch/open/quit, and error or return 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 with no filler, front-loaded with the implementation method and followed by the key permission caveat. The terseness reflects under-specification rather than structural verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-action project tool with no annotations, no output schema, and 0% schema description coverage, the description is too thin. It does not define action meanings, path usage, return values, or safety implications, covering only key-command actions and Accessibility.
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 mentions only save/new/close implementation details. It does not explain the action enum values (launch, activate, quit, open, save_as, undo, redo, info) or the optional path parameter, leaving most parameter semantics 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 domain ('Project lifecycle') and names three actions, but does not give a specific verb or enumerate the 11 capabilities in the action enum. It is distinguishable from siblings only by the word 'project,' not by explicit comparison.
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?
Provides no when-to-use guidance or alternatives among logic_keys, logic_system, or other siblings. Usage is only implied by the 'project lifecycle' framing; there are no exclusions or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_systemC
Health, permissions, MIDI ports, menu bar (menu/press_menu with path like ['Track','New Audio Track']), and Accessibility exploration (ax_dump / ax_find) of Logic's UI.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| role | No | ||
| depth | No | ||
| action | Yes | ||
| window | No | ||
| contains | No | ||
| max_nodes | 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, yet it discloses nothing about safety or side effects. Notably press_menu actually triggers menu actions (a mutation) and is presented identically to read-only actions like health or ax_dump, with no distinction of reversibility, permissions, or side effects.
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 compact sentence with no filler, but it reads as a run-on category list rather than a structured capability summary, and it omits several actions in the enum (key_map, app, windows).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-action dispatcher with no output schema, no annotations, and 0% parameter documentation, the description is far too thin. It does not explain what most actions return or do, so an agent cannot reliably invoke it beyond the few hinted actions.
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 7 parameters, so the description must compensate. It only clarifies the `path` parameter with a concrete example (['Track','New Audio Track']) and says nothing about role, depth, contains, max_nodes, or window, leaving most 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?
The description enumerates capability categories (health, permissions, MIDI ports, menu bar, accessibility exploration) for 'Logic's UI', which gives a rough sense of scope, but it never states a specific verb+resource for the tool as a whole. It also fails to differentiate from siblings like logic_midi (MIDI ports) or logic_keys (key_map), which overlap with actions exposed here.
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 guidance on when to use this dispatcher versus the many sibling tools, and no exclusions. The parentheticals hint at how to call menu/press_menu and ax_dump/ax_find, but no selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logic_tracksA
Track list + per-track ops. Target by index (1-based) or name. Writes go via MCU (mute/solo/arm/select/volume) with Accessibility readback, or AX nudging as fallback. set_volume takes db (-inf..+6) or raw value 0-233 (173 = 0 dB); set_pan takes value 0-127 (64 = center). set_color takes color = 1..96 | '#rrggbb' | 'blue' | 'dark green' | 'light rose' (see action='palette'); verified by the palette's selection ring. list with colors=true samples header icon tints (approx).
| Name | Required | Description | Default |
|---|---|---|---|
| db | No | ||
| on | No | ||
| name | No | ||
| color | No | ||
| index | No | ||
| value | No | ||
| action | Yes | ||
| colors | No | ||
| new_name | 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 write path (MCU) with an Accessibility readback and an AX-nudging fallback, plus verification semantics for set_color. It omits anything about destructive actions (delete/rename) or required permissions, so it falls short of 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?
Front-loaded with the core purpose, then packed with high-value numeric mappings and no filler sentences. The telegraphic style is dense but nearly every clause carries information; only slightly harder to scan than ideal.
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 9-parameter, 17-action tool with no output schema and no annotations, this covers the tricky numeric parameters well but leaves whole action families (create_instrument/audio/drummer/external_midi, delete, rename) and the list return format unexplained, and never flags delete as destructive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it partially does: index (1-based), name targeting, db range (-inf..+6) with raw 0-233 mapping (173 = 0 dB), pan 0-127 (64 = center), and color formats are all explained. However 'on', 'new_name', and most of the large action enum (create_*, delete, rename, monitor, get_color) are undocumented, leaving real gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Track list + per-track ops') and names the mechanisms (MCU writes, Accessibility readback, AX nudging), which cleanly distinguishes it from the sibling logic_transport/logic_mix-style tools. It stops short of explicitly contrasting with siblings by name, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives targeting rules ('Target by index (1-based) or name') and a routing hint for color lookup ('see action=palette'), but never says when to choose this tool over siblings or which of the 17 actions are appropriate in which situation. Usage is 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.
logic_transportC
Transport with verified readback (MCU LEDs + Accessibility). play/record via AX press; stop via MCU or Space.
| Name | Required | Description | Default |
|---|---|---|---|
| bar | No | ||
| beat | No | ||
| tick | No | ||
| tempo | No | ||
| action | Yes | ||
| division | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose one real behavioral trait: the action is verified via readback (MCU LEDs + Accessibility), implying post-action state confirmation. However, it omits critical operational context for an unannotated automation tool — Accessibility permission requirements, which actions route through which mechanism, and failure behavior when readback mismatches.
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 no padding, and the distinguishing claim ('verified readback') is front-loaded. The density of unexplained jargon costs a point but the structure is efficient.
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 a 12-action enum, six undocumented parameters, no output schema, and no annotations, the description is far too thin. It never explains the state/goto/set_tempo actions, what readback returns, or how position parameters are consumed — an agent cannot call this correctly without opening the schema and still guessing.
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?
Six parameters at 0% schema coverage, and the description documents none of them. It implies play/record/stop exist but says nothing about how bar/beat/tick/division/tempo relate to actions like goto or set_tempo, nor what the 'state' action does. For a 12-value action enum paired with five positional params, this leaves the caller guessing.
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 names the resource ('Transport') and gestures at playback actions (play/record/stop), so an agent can infer this controls Logic's transport. But the framing sentence is dominated by implementation jargon ('MCU LEDs + Accessibility') rather than a clear verb+resource statement, and it never differentiates itself from siblings like logic_keys or logic_offline that could plausibly also start/stop playback.
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 notes mechanisms ('play/record via AX press; stop via MCU or Space') but never says when to pick this tool over the other logic_* siblings, nor when not to use it. There is no decision guidance — only a hint about how two of the twelve actions are triggered.
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.
12 tool updates
v0.1.1- First observed
logic_deliver - First observed
logic_export - First observed
logic_keys - First observed
logic_level - First observed
logic_midi - First observed
logic_offline - First observed
logic_osc - First observed
logic_plugins - First observed
logic_project - First observed
logic_system - First observed
logic_tracks - First observed
logic_transport
TDQS
Scored across 12 tools
Several capabilities are duplicated across channels: transport appears in both logic_transport and logic_osc (play/stop/record), mixer moves in both logic_tracks and logic_osc (volume/mute/solo), and plugin parameters in both logic_plugins and logic_osc (eq_set/param_set). The detailed descriptions explain when each channel is preferable, which prevents total confusion, but an agent still faces genuine misselection risk between the MCU/AX path and the OSC path.
Every tool follows the same logic_<subsystem> pattern (logic_system, logic_tracks, logic_project, logic_plugins, etc.). The naming is highly predictable and the domain word cleanly signals the scope of each tool.
12 tools is well within a healthy range and each maps to a distinct subsystem (transport, tracks, MIDI, project, export, plugins, level, OSC, etc.). Nothing feels padded or missing at the count level.
The surface is remarkably broad, covering health/permissions, transport, tracks, MIDI, project lifecycle, offline .logicx edits, export, cloud delivery, plugin control, level analysis, and OSC. Minor gaps remain around timeline/region editing, marker management, and bus/aux routing, but core workflows are covered.
Maintenance
Related MCP Connectors
Music & audio for AI agents: 50+ AI instruments play your MIDI, stems, audio to MIDI, Logic/Ableton
Autonomous music production for AI agents with MIDI generation, QC and provenance.
- mozonicOAuthcom.mozonic
AI mixing and mastering: analyze your mixes, run DSP autofix, render stems, and master tracks.
AI music production assistant — audio profiling, AI mixing sessions, and service inquiries.
Related MCP Servers
- AlicenseAqualityBmaintenanceAI control for FL Studio via the Model Context Protocol — full in-DAW mixing (Mix Doctor diagnosis, gain staging, EQ/compression/reverb, reference matching), routing, and composition through Claude and any MCP client. 67 tools. Windows.6751 PyPI96MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control Ableton Live with full access to Live's object model, including clip creation, device control, automation, and audio signal capture for mixing and mastering tasks.1MIT
- AlicenseBqualityAmaintenanceEnables AI agents to control a browser-based digital audio workstation (openDAW) for music production, including track creation, effects, MIDI, automation, and rendering.100Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents like Claude and Cursor to control Logic Pro for music production, including creating tracks, writing MIDI, operating transport and mixer, and inspecting live project data.148MIT