Skip to main content
Glama

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 click

Permissions (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, state

  • logic_tracks — list (optionally with colors), select, mute, solo, arm, monitor, set_volume (dB), set_pan, set_color / get_color (96-swatch palette: index, name like dark green, or hex), palette, create_*, delete, rename

  • logic_midi — note, chord, sequence, cc, program, pitch_bend, aftertouch, sysex, mmc, mcu_button/strip/fader

  • logic_plugins — insert by name, describe/get/set parameters in real units (dB, Hz, %), switches, presets

  • logic_level — measure rendered audio (LUFS, true peak, crest, correlation, spectrum) and balance the mix from it

  • logic_export — bounce (several formats in one pass), stems, read bounce settings, dismiss stray dialogs

  • logic_deliver — upload to cloud storage, or the whole chain: bounce, verify, upload, return share links

  • logic_project — launch, activate, quit, open, save, save_as, new, close, undo, redo, info

  • logic_osc — control surface: transport, select, mute, solo, volume, pan, bank, channel strip, Channel EQ, plug-in parameters

  • logic_offline — rename tracks, folders and mixer groups inside the saved project file, Logic closed

  • logic_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 storage

See 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-mcp

The 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 readout

Delivery

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 links

Measured 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:

  • AXValue is settable and reports success, yet moves one internal unit per call whatever number you pass.

  • AXIncrement / AXDecrement move 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 dB

Values 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 first

The 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 dB

Gains 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-free

Detection 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 app

The 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 tools
logic_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.
NameRequiredDescriptionDefault
pathsNo
actionYes
folderNo
remoteNo
end_barNo
formatsNo
timeoutNo
filenameNo
directoryNo
start_barNo
make_linksNo

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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).
NameRequiredDescriptionDefault
modeNo
actionYes
end_barNo
formatsNo
timeoutNo
filenameNo
bit_depthNo
directoryNo
normalizeNo
start_barNo
sample_rateNo
include_tailNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
chordNo
commandNo

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.
NameRequiredDescriptionDefault
modeNorelative
pathsNo
actionYes
dry_runNo
apply_panNo
directoryNo
referenceNo
headroom_dbNo
max_move_dbNo
max_secondsNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
bpmNo
dataNo
noteNo
notesNo
stepsNo
stripNo
valueNo
actionYes
numberNo
channelNo
commandNo
durationNo
velocityNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
NameRequiredDescriptionDefault
actionYes
changesNo
projectYes
in_placeNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
NameRequiredDescriptionDefault
argsNo
bandNo
slotNo
waitNo
paramNo
stripNo
valueNo
actionYes
targetNo
addressNo
commandNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.
NameRequiredDescriptionDefault
onNo
trackNo
valueNo
actionYes
pluginNo
windowNo
parameterNo
toleranceNo
enable_bandNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
pathNo
actionYes

TDQS

C2.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
pathNo
roleNo
depthNo
actionYes
windowNo
containsNo
max_nodesNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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).

NameRequiredDescriptionDefault
dbNo
onNo
nameNo
colorNo
indexNo
valueNo
actionYes
colorsNo
new_nameNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
barNo
beatNo
tickNo
tempoNo
actionYes
divisionNo

TDQS

C2.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

  1. 12 tool updatesv0.1.1
    • First observedlogic_deliver
    • First observedlogic_export
    • First observedlogic_keys
    • First observedlogic_level
    • First observedlogic_midi
    • First observedlogic_offline
    • First observedlogic_osc
    • First observedlogic_plugins
    • First observedlogic_project
    • First observedlogic_system
    • First observedlogic_tracks
    • First observedlogic_transport

TDQS

B3.4/5.0

Scored across 12 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    AI 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.
    67
    51 PyPI
    96
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to control a browser-based digital audio workstation (openDAW) for music production, including track creation, effects, MIDI, automation, and rendering.
    100
    Apache 2.0