Ardour Ultra MCP
Provides typed tools for controlling and inspecting Ardour sessions, including track/bus/group management, mixer and transport control, region editing and copying, internal MIDI editing, plugin and parameter handling, automation, routing, undo, and master export with offline audio analysis.
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., "@Ardour Ultra MCP set track 3 fader to -6 dB and arm it for recording"
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.
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.
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-shellOpen a new terminal, then run ardour-ultra-mcp --version. The analysis extra includes local audio metrics.
2. Install the Ardour bridge.
ardour-ultra-mcp installThe 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 doctorContinue 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 toolsadd_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_fileBRead-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_automationBDestructive
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_filesCRead-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_positionBRead-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_groupBDestructive
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_notesCDestructive
Remove guarded notes in one diff; model fingerprint and explicit delete intent required.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
delete_regionCDestructive
Remove a region from active playlist with native undo and explicit delete intent.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
delete_trackADestructive
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
doctorCRead-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_busBIdempotent
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_automationBRead-onlyIdempotent
Inspect automation points and mode for gain, pan, plugin or send.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_capabilitiesCRead-onlyIdempotent
Return truthful per-command backend capability status.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_meter_stateBRead-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_parametersCRead-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_regionCRead-onlyIdempotent
Read region ID, playlist, source offset, timeline position and length.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_server_infoBRead-onlyIdempotent
Server version, MCP SDK, platform and protocol details.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_session_infoBRead-onlyIdempotent
Read session UUID, name, sample rate and observed revision scope.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_trackBRead-onlyIdempotent
Inspect a route by persistent Ardour ID.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
get_transportBRead-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_pluginsCRead-onlyIdempotent
Query Ardour inventory; filter names/categories; formats are runtime dependent.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_groupsCRead-onlyIdempotent
Paginate native route groups, stable IDs, properties and member route IDs.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_midi_notesCRead-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_presetsBRead-onlyIdempotent
List loaded plugin's available presets.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_portsCRead-onlyIdempotent
Paginate engine port names and connections; port IDs are backend-qualified names.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_regionsCRead-onlyIdempotent
Paginate active-playlist regions by route ID and kind.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_sendsCRead-onlyIdempotent
List sends with stable processor and target route IDs.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_track_pluginsCRead-onlyIdempotent
Paginate plugin instances with stable processor IDs.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
list_tracksCRead-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
pingCRead-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_pluginBDestructive
Remove plugin processor with explicit intent; not natively undoable.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
remove_sendCDestructive
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_modeCIdempotent
Set native off/play/write/touch/latch mode.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_group_propertiesCIdempotent
Set explicit group linkage booleans; returns before/after state; no grouped undo.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_loopCIdempotent
Update an existing Ardour loop location and enable loop.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_monitoringCIdempotent
Set track monitoring: auto/input/disk.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_plugin_enabledCIdempotent
Set plugin processor active state.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_plugin_parametersCIdempotent
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_fadesBIdempotent
Set audio fade durations in samples; preserve current fade shapes.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_region_gainCIdempotent
Set audio-region amplitude in dB nondestructively.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_region_lockCIdempotent
Set region lock state with native undo.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_region_muteCIdempotent
Set region mute with native undo.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_send_gainCIdempotent
Set send level in dB.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_tempoCIdempotent
Insert constant quarter-note BPM point at a typed position.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_time_signatureCIdempotent
Insert a time signature point through TempoMap.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_track_gainCIdempotent
Set route gain in dB (-193..+6), ignoring group linkage.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_track_muteDIdempotent
Set route mute explicitly.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_track_panCIdempotent
Set stereo azimuth in signed normalized units -1..+1.
Inputs: request (required). Returns: data, error, success, warnings, +3 more
set_track_soloCIdempotent
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
Scored across 80 tools
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.
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.
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.
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
Related MCP Connectors
Read and edit DAW projects as an agent, save native Logic projects, convert projects between DAWs
Create, co-edit, analyze, publish, and export collaborative step-sequencer sessions through MCP.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
Related MCP Servers
- AlicenseBqualityBmaintenanceMCP server for headless, agent-native control of openDAW, enabling programmatic music production with tracks, instruments, effects, MIDI, automation, and rendering via 543 tools.100Apache 2.0
- AlicenseBqualityBmaintenanceControl 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.122MIT
- AlicenseBqualityCmaintenanceEnables 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.501MIT
- AlicenseNot gradedqualityCmaintenanceAn 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.2MIT