Skip to main content
Glama
Ardour Ultra MCP
by Elias02345

Ardour Ultra MCP

Precise, local control of Ardour for MCP clients. Inspect a session, edit MIDI, adjust plugins, build automation and measure rendered audio through Ardour's real scripting APIs.

CI License: GPL v3+ Python: 3.11+

Deutsch: Installation Schritt für Schritt · Installation · MCP client setup · All documentation

The server is free, open source and local. It needs no API key, cloud service or proprietary model. Your choice of MCP client and model is separate. Control uses a reviewed Lua hook and optional native OSC; no mouse coordinates or image recognition.

Status: development release 0.1.0. Linux Ardour 9.8 has native integration evidence; 8.12 has a smaller tested feature set. The Python/MCP layer passes CI on Linux, macOS and Windows. Native macOS/Windows Ardour integration is unverified, with Windows heartbeat/file-replacement and permission hardening still open. Read compatibility before choosing a platform. The full production brief is not yet complete.

Get connected in five steps

Use a terminal on Linux/macOS, or PowerShell on Windows. You need Ardour installed and uv installed. You do not need Git or a separately installed Python for this route.

1. Install the server from GitHub. There is no PyPI release yet.

uv tool install --python 3.12 "ardour-ultra-mcp[analysis] @ https://github.com/Elias02345/ardour-ultra-mcp/archive/refs/heads/main.zip"
uv tool update-shell

Open a new terminal, then run ardour-ultra-mcp --version. The analysis extra includes local audio metrics.

2. Install the Ardour bridge.

ardour-ultra-mcp install

The command prints the script location and next steps. If it cannot detect Ardour, it selects major version 9 and says so. Use install --ardour-major 8 for an Ardour 8 installation.

3. Activate the hook in Ardour. Restart Ardour, open a disposable session, then choose Edit → Lua Scripts → Script Manager → Action Hooks → New Hook → Ardour Ultra MCP. These are Ardour 9.8 English labels; older versions/manuals may use Scripted Actions → Manage. The hook needs Lua file I/O, allowed by default in Ardour 9.8. If sandboxing was enabled, follow troubleshooting.

4. Check the connection. Keep Ardour and the session open.

ardour-ultra-mcp test-connection
ardour-ultra-mcp doctor

Continue when test-connection reports Connection OK and doctor exits successfully. Resolve a connection error before asking an agent to edit.

5. Connect your MCP client. Choose one client setup: Claude Desktop, Claude Code, Codex or generic STDIO. configure prints a ready-to-copy snippet with an absolute executable path. Your client launches the server; you normally do not run serve yourself.

Try this first:

Use Ardour Ultra MCP to inspect the connection, session and capabilities. List the tracks and report unsupported features. Make no changes.

The quick start continues with the first safe edit. Full installation instructions cover updates, uninstalling and custom paths.

Related MCP server: Logic Pro MCP

What it can do

There are 80 typed MCP tools, 7 read-only resources and 1 workflow prompt. Runtime capability discovery reports what your Ardour build supports; registration alone does not guarantee availability.

Area

Implemented scope

Session and mixer

Inspection, save/snapshot, tracks/buses/groups, gain/pan/mute/solo, transport and recording controls

MIDI

Internal region creation on 9.8, dense note batches, guarded edit/delete, copy and native undo

Plugins and routing

Generic inventory, parameters/presets, instruments, sends and backend ports

Regions and automation

Move/trim/split/copy/delete, gain/fades, bounded automation curves and modes

Render and analyze

Experimental preset-based master/range export; offline peak, RMS, LUFS, estimated true peak, spectrum, stereo and silence metrics

Safety and verification

Stable IDs, explicit units, preflight, destructive intent, structured changes/errors and scoped revision checks

MIDI controller events, audio import/stretch/pitch shift, crossfades, stems, sidechain pins and complete session lifecycle control remain gaps. See the generated tool reference, implementation status and gap analysis.

How it works

flowchart LR
  Client[MCP client / STDIO] --> Python[Typed Python control layer]
  Python --> Lua[Private mailbox / allowlisted Lua EditorHook]
  Lua --> Ardour[Ardour session and model APIs]
  Python --> OSC[Optional loopback OSC]
  Python --> Analysis[Local offline audio analysis]

The default server uses STDIO and opens no public listening service. Media/export paths are denied until explicitly permitted. There are no arbitrary Lua or shell execution tools. Undo grouping and compensated batches have different guarantees; revision checks do not observe every human edit. Read the security model.

You can explore without Ardour using ardour-ultra-mcp serve --backend fake. Results are labelled simulated; this backend cannot execute plugins or render audio.

Develop and contribute

Start with development, testing and contributing. CI checks Python 3.11–3.14 on Ubuntu, macOS and Windows. Native test evidence is reported separately from simulated tests.

Original implementation, licensed under GPL-3.0-or-later. See dependency and license notices, research and architecture decisions.

Available Tools

80 tools
add_pluginC

Load inventory-selected plugin ID/format and insert at processor index.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

add_track_to_groupB

Add a route to a group; reject implicit transfer from another group.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

analyze_audio_fileB
Read-onlyIdempotent

Offline peak/RMS/LUFS/spectrum/stereo/silence and estimated true peak; allowed roots only.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

arm_trackC

Set recording arm on a recordable track.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

clear_automationB
Destructive

Clear target automation with explicit delete intent and native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

clear_loopC

Disable loop playback.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

compare_audio_filesC
Read-onlyIdempotent

Compare two measured passes; no subjective quality score.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

connect_portsB

Connect valid output to input with matching data type.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

convert_positionB
Read-onlyIdempotent

Convert a typed position using Ardour's current tempo/meter map.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

copy_regionC

Copy to a compatible active playlist; fork MIDI source independently; audio shares source; native playlist undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_automation_pointsC

Batch exact points with explicit native units; replace requires delete intent; native memento undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_groupC

Create an empty route group; returns actual native linkage defaults.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_midi_regionC

Create a blank internal MIDI region in Editor context.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_sendC

Create an internal aux send to a bus; reject routing feedback cycles.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_snapshotC

Save a named snapshot without replacing an existing snapshot.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

create_trackC

Create an audio/MIDI track or audio bus using Session APIs.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

delete_groupB
Destructive

Remove a nonempty group without deleting its routes; explicit intent; Ardour cannot remove empty groups through this binding.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

delete_midi_notesC
Destructive

Remove guarded notes in one diff; model fingerprint and explicit delete intent required.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

delete_regionC
Destructive

Remove a region from active playlist with native undo and explicit delete intent.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

delete_trackA
Destructive

Delete a non-singleton route; explicit confirm_delete required; not natively undoable.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

disconnect_portsB

Disconnect one exact existing port connection.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

doctorC
Read-onlyIdempotent

Inspect runtime, bridge, paths and optional analysis dependencies.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

edit_midi_notesC

Replace guarded notes atomically in one native diff; pitch/time/length/velocity/channel.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

ensure_busB
Idempotent

Ensure one exact-name/channel-count audio bus exists; refuse ambiguous collisions; return creation changes and stable ID.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

execute_batchC

Prevalidate compensable control edits and apply with rollback; no general ACID promise.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_automationB
Read-onlyIdempotent

Inspect automation points and mode for gain, pan, plugin or send.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_capabilitiesC
Read-onlyIdempotent

Return truthful per-command backend capability status.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_meter_stateB
Read-onlyIdempotent

Read route peak meter values in dBFS; no audio analysis in realtime.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_plugin_parametersC
Read-onlyIdempotent

Inspect parameter ordinal/port ID, native value, range/default and available display metadata.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_regionC
Read-onlyIdempotent

Read region ID, playlist, source offset, timeline position and length.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_server_infoB
Read-onlyIdempotent

Server version, MCP SDK, platform and protocol details.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_session_infoB
Read-onlyIdempotent

Read session UUID, name, sample rate and observed revision scope.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_trackB
Read-onlyIdempotent

Inspect a route by persistent Ardour ID.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

get_transportB
Read-onlyIdempotent

Read playhead in samples, speed, loop and recording state.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

insert_midi_notesC

Insert up to 10000 exact internal notes in one native note-diff undo command.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_available_pluginsC
Read-onlyIdempotent

Query Ardour inventory; filter names/categories; formats are runtime dependent.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_groupsC
Read-onlyIdempotent

Paginate native route groups, stable IDs, properties and member route IDs.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_midi_notesC
Read-onlyIdempotent

Paginate internal notes with source-relative 1920-quarter ticks and guarded model references.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_plugin_presetsB
Read-onlyIdempotent

List loaded plugin's available presets.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_portsC
Read-onlyIdempotent

Paginate engine port names and connections; port IDs are backend-qualified names.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_regionsC
Read-onlyIdempotent

Paginate active-playlist regions by route ID and kind.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_sendsC
Read-onlyIdempotent

List sends with stable processor and target route IDs.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_track_pluginsC
Read-onlyIdempotent

Paginate plugin instances with stable processor IDs.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

list_tracksC
Read-onlyIdempotent

Paginate routes with stable Ardour IDs and mixer state.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

load_plugin_presetB

Load an existing plugin preset by exact label.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

locateC

Locate using typed samples, seconds, quarter ticks or BBT.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

move_regionC

Move a region nondestructively; named native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

pingC
Read-onlyIdempotent

Check backend heartbeat and current session.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

playA

Request playback. Inspect get_transport to confirm asynchronous state.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

redoC

Invoke Editor native redo once.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

remove_pluginB
Destructive

Remove plugin processor with explicit intent; not natively undoable.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

remove_sendC
Destructive

Remove send with explicit delete intent.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

remove_track_from_groupC

Remove exact membership without deleting the route; Ardour automatically deletes an ordinary group when its last member leaves.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

rename_trackC

Rename a stable-ID route.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

render_and_analyzeC

Render one preset-based master file, then analyze locally; preserve export and report stage/error if analysis fails; no atomic file rollback.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

render_rangeC

Export master range using actual Ardour preset into a new isolated directory.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

save_sessionC

Save current session through Ardour save_state.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_automation_modeC
Idempotent

Set native off/play/write/touch/latch mode.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_group_propertiesC
Idempotent

Set explicit group linkage booleans; returns before/after state; no grouped undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_loopC
Idempotent

Update an existing Ardour loop location and enable loop.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_monitoringC
Idempotent

Set track monitoring: auto/input/disk.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_plugin_enabledC
Idempotent

Set plugin processor active state.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_plugin_parametersC
Idempotent

Validate and set a batch of native parameter values; rollback supported values on failure.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_region_fadesB
Idempotent

Set audio fade durations in samples; preserve current fade shapes.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_region_gainC
Idempotent

Set audio-region amplitude in dB nondestructively.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_region_lockC
Idempotent

Set region lock state with native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_region_muteC
Idempotent

Set region mute with native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_send_gainC
Idempotent

Set send level in dB.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_tempoC
Idempotent

Insert constant quarter-note BPM point at a typed position.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_time_signatureC
Idempotent

Insert a time signature point through TempoMap.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_track_gainC
Idempotent

Set route gain in dB (-193..+6), ignoring group linkage.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_track_muteD
Idempotent

Set route mute explicitly.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_track_panC
Idempotent

Set stereo azimuth in signed normalized units -1..+1.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

set_track_soloC
Idempotent

Set route solo explicitly.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

split_regionB

Split inside a region using its owning playlist; native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

start_recordingB

Enable session recording and request roll; arm tracks first.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

stopC

Request transport stop.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

stop_recordingC

Stop transport and disable session recording.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

trim_regionC

Trim to absolute timeline bounds within original region; native undo.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

undoB

Invoke Editor native undo once; only native undoable edits are guaranteed.

Inputs: request (required). Returns: data, error, success, warnings, +3 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 80 tools

    Disambiguation4/5

    Most tools target a distinct resource/action pair, and descriptions clearly delimit nearby operations such as track gain vs. send gain vs. region gain. The very large surface creates some risk of misselection among similar setter/getter families, but the naming and descriptions generally keep boundaries clear.

    Naming Consistency4/5

    The tool set overwhelmingly follows a verb_noun snake_case convention, with predictable list/get/create/delete/set families. Minor deviations like ping, doctor, play, stop, undo, and redo are conventional command names and do not seriously break consistency.

    Tool Count2/5

    Eighty tools is far beyond a practical, well-scoped MCP surface and will burden agent selection even though the DAW domain is broad. Many capabilities are legitimate, but the set is too large to be easily discoverable or safely composed without strong grouping.

    Completeness4/5

    Coverage is extensive across session, track, group, transport, region, MIDI, plugin, send, port, automation, undo, rendering, and analysis workflows. Some minor DAW lifecycle gaps remain, such as tempo-map inspection, marker management, and richer track routing operations, but core workflows are well represented.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      MCP server for headless, agent-native control of openDAW, enabling programmatic music production with tracks, instruments, effects, MIDI, automation, and rendering via 543 tools.
      100
      Apache 2.0
    • A
      license
      B
      quality
      B
      maintenance
      Control Logic Pro locally on macOS through MCP: transport, tracks, mixer, plug-in parameters, audio analysis, bounce and delivery, with optional gesture and voice control. Uses OSC, CoreMIDI and macOS Accessibility. Actions report confirmed, uncertain or failed outcomes. Actual control requires a local Mac with Logic Pro. Hosted/Linux builds are schema inspection only; all operations are disabled.
      12
      2
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables MCP-capable AI agents to control REAPER through typed tools and a Lua escape hatch for project creation, track management, recording and editing, MIDI writing, mixing, rendering, and batch operations.
      50
      1
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      An unofficial MCP server that lets an agent control Fender Studio Pro / PreSonus Studio One — transport playback, Mackie Control mixer moves, shortcut-driven track and session editing, plug-in listing and insert-macro generation, and DAW command discovery and dispatch from an exported key scheme. It also ships audio-to-MIDI workflows for drafting drums or a hummed melody from rehearsal recordings before arranging them in the DAW.
      2
      MIT