waveform-MCP
Waveform MCP
Tracktion WaveformをLLMエージェントが制御できるようにするMCPサーバーです。Claudeに曲の作成、ミックスのバランス調整、MP3へのレンダリングを依頼すれば、Waveformがそれを実行します。
MCPツール呼び出しによって作曲された64小節のシンセウェーブのインストゥルメンタル — ドラム、ベース、2つのパッド、カウンター、アルペジオ、リード。セクションマーカー、テンポオートメーション、サイドチェーンポンプ、プレートリバーブ、クリップレベルのフェード、フルマスターチェーン。
このツールでできること
107種類のMCPツール:編集ライフサイクル、トラック、MIDI、オーディオクリップ、プラグイン、オートメーション、音楽理論、ミックスバランス、レンダリング、ループライブラリ、VST検出、スキーマキャプチャ、Waveform UI制御など
2つのエンドツーエンド作曲ツール —
compose_lofi_trackおよびcompose_synthwave_track— 完全にアレンジ、ミックス、レンダリングされた楽曲を作成1つのアンビエント作曲ツール —
compose_rainstorm— 雨、風、雷のサウンドスケープ用音楽理論知識レイヤー — スケール、コード進行、カデンツ、楽曲形式、ボイスリーディングのルール、ジャンルごとのミックスバランス基準レベル
メモリ内モデルとWaveformの
.tracktioneditXML間の検証済みラウンドトリップクリップレベルのフェード、ゲイン、オフセット、オートメーションカーブ — LLMが音楽的に反復するために使用できる実証済みのプリミティブ
信頼性の高いワークフローサイクル —
作曲 → 書き込み → ファイル経由で再読み込み → 保存状態へ戻す → 試聴 → 微調整
Related MCP server: ableton-mind
ステータス
Windows + Waveform 13でエンドツーエンドで動作します。macOS / Linuxのパスはコンテンツ検出(プリセット、ループライブラリ、VSTリスト)には存在しますが、UI制御は現時点ではUIA / pywinautoを使用したWindows専用です。
Claudeとの約30時間のヒューマン・イン・ザ・ループ反復を通じて構築およびテストされました。両方の作曲ツールでMP3へのレンダリングが複数回行われ、ユーザーが完成したトラックを確認済みです。
クイックスタート
インストール
cd "C:\path\to\waveform MCP"
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -e .Claudeへの接続(Code、Desktop、または任意のMCPクライアント)
~/.claude.json またはクライアントのMCP設定:
{
"mcpServers": {
"waveform": {
"command": "waveform-mcp"
}
}
}試してみる
Open Waveform, then ask Claude:
"Use compose_synthwave_track to make a synthwave song,
save it to my Documents/Waveform folder, and reload it
in Waveform so I can hear it."LLMが compose_synthwave_track → waveform_revert_to_saved を呼び出し、再生ボタンを押します。その後、反復します:「ベースの音量を下げて」 → LLMが MIX_BALANCE["synthwave"]["bass"] を更新し、再読み込みします。
アーキテクチャ
4つのレイヤーがあり、それぞれ明確な契約があります:
┌──────────────────────────────────────────────────────────────┐
│ LLM (Claude / any MCP client) │
└────────────────────────────┬─────────────────────────────────┘
│ MCP stdio
┌────────────────────────────▼─────────────────────────────────┐
│ MCP server (server.py) — 107 tools │
└────────────────────────────┬─────────────────────────────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ Edit model │ │ Knowledge│ │ Waveform │
│ (in-memory) │ │ (data) │ │ UI control │
├──────────────┤ ├──────────┤ ├──────────────┤
│ Tracks │ │ Scales │ │ pywinauto + │
│ Clips │ │ Chords │ │ UIA + ffmpeg │
│ Notes │ │ Forms │ │ │
│ Plugins │ │ Mix │ │ Menu invoke │
│ Automation │ │ Velocity │ │ Revert │
│ Markers │ │ Rhythm │ │ Render→MP3 │
└──────┬───────┘ └──────────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────────┐ ┌────────────────────┐
│ xml_writer.py │ │ Waveform 13 │
│ xml_reader.py │ ◀──────▶ │ (the running app) │
│ ↓ .tracktionedit │ └────────────────────┘
└──────────────────┘重要な設計上の選択: モデルはTracktion ValueTreeの1:1のコピーではありません。LLMが操作したい形状であり、保存時にXMLに投影され、読み込み時に戻されます。これにより、LLMにJUCEの内部構造を考えさせるのではなく、ツールをシンプルに保つことができます(audio_clip_import(track_id, file_path, start_beats, length_beats, fade_in_beats, ...)など)。
ツールカタログ
編集ライフサイクル (edit.py)
edit_create · edit_open · edit_save · flush · edit_summary · edit_inspect · undo · narrate
トラック + ミックス (tracks.py)
track_add · track_remove · mix_set · mix_apply_reference · send_add · marker_add · tempo_set · key_set
mix_apply_reference(track_id, genre, role) は、キュレーションされたミックスバランス表(MIX_BALANCE[genre][role])からdBターゲットを検索します。「キックがアンカー、ベースはその5-6dB下」といったリファレンスを呼び出し可能な形式に凝縮しています。
MIDI (midi.py)
midi_clip_add · midi_notes_add · midi_notes_clear · midi_clip_quantize
オーディオクリップ (audio.py, clips.py)
audio_clip_import ( gain_db, fade_in_beats, fade_out_beats, offset_in_source_beats を含む)
clip_list · clip_set · clip_move · clip_resize · clip_duplicate · clip_remove
プラグイン (plugins.py, preset_library.py)
plugin_list · plugin_add · plugin_set_param · plugin_remove
plugin_add_reverb (適切なデフォルト設定を持つプレート / ナチュラル / 非線形)
plugin_add_drum_kit (サンプラーベース、パッドごとに1つのSOUND)
plugin_add_modifier (LFO / エンベロープ / サイドチェーン — Waveformの完全サポート時にスキーマを決定)
plugin_discover (knownPluginList64.settings を解析してインストール済みVSTをリストアップ)
waveform_preset_list · waveform_preset_read · waveform_plugin_types
オートメーション (automation.py)
automation_add · automation_envelope · automation_clear · automation_list
ターゲット: pan および plugin/<plugin_id>/<param>。ボリュームターゲットはAPIレベルで無効になっています。Waveformのボリュームプラグインは <AUTOMATIONCURVE> スキーマを尊重せず、トラックを無音にしてしまうためです。静的なレベルには mix_set/mix_apply_reference を、フェードには clip_set(fade_in_beats|fade_out_beats) を使用してください。(MCPは target="volume" を拒否し、代替案を示す明確なエラーを返します。)
音楽理論知識 (music_theory.py, music_theory_data.py)
17のクエリツール: theory_scale · theory_modes · theory_diatonic_chords · theory_chord_progression · theory_cadences · theory_song_form · theory_section · theory_genre · theory_arrangement_layers · theory_velocity · theory_rhythm · theory_voice_leading_rules · theory_heuristics · theory_surprise_devices · theory_borrowed_chords · theory_mix_balance · theory_search
これらを支えるデータ:
13のスケール(メジャーモード、ハーモニックマイナー、ペンタトニック、ブルースなど)
25以上のコード進行(axis_pop, ii_V_I, andalusian, lament_bassなど)
カデンツ、楽曲形式、役割/密度/ダイナミックプロファイルを持つセクション
一般的なBPM、キーの傾向、楽器、特徴的な進行を持つ14のジャンル
ベロシティ / リズムマップ(スウィング比、アクセントの強弱、ゴーストノートの範囲)
13の作曲ヒューリスティック(3の法則、コントラストの必要性、サプライズの割り当てなど)
7つのサプライズデバイス(トラックドライバー変調、偽終止など)
ミックスバランスリファレンステーブル — 7ジャンル × 14役割、完全に注釈付き
作曲ツール (composer.py)
compose_lofi_track— ドラム、ベース、キーボード、パッド、メロディ、カウンターを備えた32小節のローファイ。セクションを意識したベロシティエンベロープ、テンポオートメーション、ローファイマスターチェーンcompose_synthwave_track— 7トラックを備えた64小節のシンセウェーブ。9セクション形式(イントロ/Aメロ/サビ/Aメロ/サビ/ブリッジ/ビルドアップ/大サビ/アウトロ)、セクションごとのベースのフィーリング(ハーフタイム / 8分ポンプ / ウォーキング)、セクションごとのアルペジオテーマ、サイドチェーンスタイルのフィルターポンプ、セクションマーカー、クリップフェードcompose_rainstorm— 雨 + 風 + ローパスされた遠くの雷鳴を備えたアンビエントサウンドスケープ。クリップごとのゲインランダム化、オフセットトリム、トラックFX
レンダリング (render.py, waveform_workflows.py)
waveform_render_export · waveform_render_to_mp3 (バンドルされたffmpeg + libmp3lameを使用)
Waveform UI制御 (waveform_workflows.py)
waveform_new_project · waveform_save · waveform_revert_to_saved (反復ループの鍵) · waveform_close_active_tab · waveform_active_tab · waveform_project_loaded · waveform_menu_invoke · waveform_add_track · waveform_select_track · waveform_insert_clip_on_track · waveform_build_skeleton
アプリライフサイクル (waveform_app.py)
waveform_locate · waveform_status · waveform_launch · waveform_focus · waveform_quit · waveform_settings_dir
ループライブラリ (loops.py)
loop_search (テンポ / 小節数 / 名前で検索) · loop_drop (自動長さ調整、テンポへのフィット)
スキーマキャプチャ (schema_capture.py)
schema_snapshot_current_edit · schema_diff_snapshots · schema_list_snapshots
低レベルUI / デスクトップ (win_input.py, desktop.py)
ウィンドウ管理、UIA検査、キー/クリック送信、スクリーンショットのための18のプリミティブ。
レイアウト
waveform-mcp/
├── src/waveform_mcp/
│ ├── server.py MCP server entry (stdio)
│ ├── model.py Edit / Track / Clip / Note / AutomationLane dataclasses
│ ├── xml_writer.py Edit → .tracktionedit
│ ├── xml_reader.py .tracktionedit → Edit
│ ├── audio_convert.py ffmpeg-backed MP3→WAV cache for Sampler sources
│ ├── music_theory_data.py SCALES, PROGRESSIONS, GENRES, MIX_BALANCE, ...
│ ├── events.py event bus + JSONL log
│ ├── diff.py Edit-diff for change events
│ ├── tools/
│ │ ├── edit.py Edit lifecycle
│ │ ├── tracks.py Tracks + mix balance
│ │ ├── midi.py MIDI clips/notes
│ │ ├── audio.py Audio clip import
│ │ ├── clips.py Clip mutators (move, resize, duplicate, set)
│ │ ├── plugins.py Plugin add + reverb / drum kit / modifier helpers
│ │ ├── automation.py Automation lanes (pan + plugin params)
│ │ ├── preset_library.py Factory preset browser
│ │ ├── loops.py Loop library search + drop
│ │ ├── render.py Render stubs
│ │ ├── waveform_app.py App lifecycle
│ │ ├── waveform_workflows.py UI workflows (revert, render-to-mp3, etc.)
│ │ ├── desktop.py Generic desktop primitives
│ │ ├── win_input.py Windows UIA + keystroke primitives
│ │ ├── schema_capture.py Hand-fixture capture for schema reverse-engineering
│ │ ├── music_theory.py Theory query tools
│ │ ├── composer.py compose_lofi_track, compose_synthwave_track, compose_rainstorm
│ │ └── common.py @op decorator (apply + diff + event)
│ └── preview/
│ ├── app.py FastAPI + websocket
│ └── static/ HTML / JS piano-roll
├── tests/
├── docs/
│ ├── img/synthwave_arrangement.png
│ ├── ARCHITECTURE.md
│ ├── EVENT_SCHEMA.md
│ └── EDIT_MODEL.md
├── pyproject.toml
└── README.md実際に機能する反復ループ
多くの失敗を経て、Waveformを毎回再起動することなく、LLMとユーザーがトラックで共同作業できるループは以下の通りです:
1. Compose / mutate → composer.compose_* or clip_set / mix_apply_reference
2. Save to disk → edit_save / flush (writes .tracktionedit)
3. Reload in Waveform → waveform_revert_to_saved
(File → Revert to saved state, auto-confirms popup)
4. User listens → "turn the arp up"
5. Update MIX_BALANCE or run a clip mutator
6. → goto 2決定打となったのは、Waveformの ファイル → 保存状態へ戻す メニュー項目の発見でした。これにより、開いている編集内容がディスクから強制的に再読み込みされるため、プロジェクトを閉じたり開いたりすることなく外部からの変更を反映できます。waveform_revert_to_saved はそのパスをリトライ付きで自動化します。
ミックスバランスリファレンス
mix_apply_reference は、「キックがアンカー、ベースはその5-6dB下、リードはベースと同程度、パッド/アルペジオはリードの6-9dB下、アンビエンスは最も深く」というキュレーションされた表から読み取ります。これはジャンルのチュートリアル、マスタリングブログ、耳による調整の反復から抽出されたものです:
MIX_BALANCE["synthwave"] = {
"drums": -7, "kick": -6, "snare": -10, "hat": -16,
"bass": -25, "sub_bass": -28, # background-level texture
"lead": -15, "pad": -19, "arp": -8, # arp-driven mix
"counter": -14, ...
}作曲ツールはトラックごとに1回 tracks.mix_apply_reference({track_id, genre, role}) を呼び出します。表を一度微調整すれば、すべての作曲ツールが再バランスされます。
表のソース:
既知の制限
トラックボリュームの
AUTOMATIONCURVEは無効です。 Waveformのvolumeプラグインは私たちのカーブスキーマを尊重せず、影響を受けるトラックを無音にします。MCPは明確なエラーでターゲットを拒否し、代替案(クリップフェード、クリップごとのゲインを持つ複数のクリップ、静的なmix_set)を提示します。プラグインモディファイアマトリックスは実験的です。
plugin_add_modifierは汎用的なモッドマトリックスの形状を書き込みます。4OSCなどでLFO変調を確実に機能させるには、プラグインごとのスキーマを確認するための手動編集されたフィクスチャが必要です。ヘッドレスレンダリングはまだ構築されていません。
waveform_render_to_mp3はWaveformのUIエクスポートを駆動します。動作はしますが、Waveformが実行されている必要があります。tracktion_engineをリンクするC++ヘルパーが最終的な解決策となります。Linux/macOSのUI制御は存在しません。 コンテンツ検出(プリセット、ループライブラリ、VSTリスト)はOSを認識しますが、UI自動化はWindows専用です。
次の反復に向けたビルディングブロック
<AUTOMATIONCURVE paramID="volume">のための実際のWaveformフィクスチャをキャプチャし、ボリュームオートメーションを再有効化するtracktion_engine上のC++ヘッドレスレンダリングヘルパードラムサンプラー / マイクロドラムサンプラーの実際のフィクスチャ(現在は通常のサンプラーにフォールバック)
サイドチェーンモディファイアのキャプチャ
クリップランチャー (v13) のサポート
UIAが唯一のパスでなくなった後の
xdotool/wmctrlによるLinux UI制御
ライセンス
GPL-3.0-or-later (C++レンダリングヘルパーがリンクする場合、tracktion_engine に準拠します)。
Available Tools
129 toolsarp_patternB
Generate an arpeggio over a chord. Returns notes for the given length. direction ∈ {up, down, up_down, down_up, random, octave_alternate}. rate ∈ {quarter, eighth, sixteenth, triplet}. octaves controls how many octaves the cycle spans.
Inputs: length_beats (required), chord_pitches (required), rate, octaves, +4 more.
arrangement_planA
Produce a section list for a song. genre selects characteristic form; target_length_seconds + tempo set total bars; energy_curve shapes the intensity pattern. Returns sections with bar counts, roles, and an energy 0..1 the composer can use to gate layers / set velocities.
Inputs: genre (required), tempo (required), target_length_seconds (required), energy_curve, +2 more.
audio_clip_importA
Place an audio file as a clip on a track. warp_mode controls time-stretch behavior. Optional clip-level gain (dB), fade in/out (beats), and offset_in_source (beats — skip the first N beats of the source file, useful for trimming silent intros).
Inputs: track_id (required), file_path (required), start_beats (required), length_beats (required), +6 more.
audio_compareA
Compare two audio files: returns LUFS / peak / DR diffs and a per-band spectrum diff in dB. Positive numbers mean file_a is louder/brighter than file_b in that dimension.
Inputs: file_a (required), file_b (required), bands.
audio_detect_keyA
Detect the musical key of an audio file. Returns root note + mode (major/minor) with confidence 0..1. Uses chromagram + Krumhansl-Schmuckler key profiles. Reliable on tonal pop/jazz; less reliable on percussion-heavy or atonal material.
Inputs: file_path (required).
audio_detect_tempoA
Detect the BPM of an audio file via onset autocorrelation. bpm_range bounds the search (default 60..180). Returns a single BPM with confidence 0..1. Works well on EDM/pop loops with a kick on every beat; less reliable on free-tempo or sparse music.
Inputs: file_path (required), bpm_max, bpm_min.
audio_loudness_lufsA
Measure integrated LUFS, true peak (dBTP), and dynamic range (LRA) for an audio file using ffmpeg's loudnorm filter. Reference targets: Spotify -14 LUFS, Apple -16, broadcast -23. True peak should stay under -1.0 dBTP.
Inputs: file_path (required).
audio_spectrumA
Return RMS energy per frequency band. bands defaults to a 10-band log-spaced layout (sub, low, low-mid, mid, hi-mid, presence, brilliance, air). Useful for 'compared to my reference, this song is 4 dB heavier in the low-mid region.'
Inputs: file_path (required), bands.
automation_addA
Add an automation lane to a track. target ∈ {'volume', 'pan', 'plugin/<plugin_id>/'}. points = [{beat, value, curve?}]. Replaces any existing lane on the same target.
Inputs: points (required), target (required), track_id (required).
automation_clearA
Remove all automation lanes from a track, or just the lane on a given target.
Inputs: track_id (required), target.
automation_envelopeA
Convenience: ramp a target from start_value to end_value between start_beat and end_beat. shape ∈ {'linear', 'exp_in', 'exp_out', 'sine'}. exp_in starts slow then speeds up; exp_out is the inverse; sine is a smooth S-curve. Appends to an existing lane on the same target if one exists, otherwise creates a new lane.
Inputs: target (required), end_beat (required), track_id (required), end_value (required), +4 more.
automation_listA
List automation lanes on a track (or all tracks if track_id omitted).
Inputs: track_id.
aux_return_addA
Add an auxreturn plugin to a track so it receives audio from the given bus number (0..15). Pair with send_add(bus_num=N) on source tracks for parallel routing — e.g. drum tracks all send to bus 0, aux-return track applies a single reverb.
Inputs: track_id (required), bus_num.
bassline_generateB
Generate a bassline under a chord progression. feel ∈ {pump, walking, half_time, sub, octave_jumps, dub}. Each chord lasts chord_duration_beats. Roots are the chord-root MIDI pitches (typically octave 2-3).
Inputs: roots (required), chord_duration_beats (required), feel, start_beats, +1 more.
bus_createC
Create a submix / aux track other tracks can route to. kind ∈ {submix, folder}.
Inputs: name (required), kind.
bus_routeA
Route a track's output to a bus instead of master. Stack drums onto a 'Drum Bus' for one comp/EQ.
Inputs: dest_bus_id (required), src_track_id (required).
clip_duplicateA
Clone a clip onto the same track at start_beats + offset_beats. Returns the new clip_id. Notes are deep-copied for MIDI clips.
Inputs: clip_id (required), offset_beats (required).
clip_listA
List clips on a track (or all tracks). Returns id, kind, name, start, length, plus per-clip gain/fade/offset for audio clips.
Inputs: track_id.
clip_moveA
Shorthand: change a clip's start_beats. Length unchanged.
Inputs: clip_id (required), new_start_beats (required).
clip_removeB
Delete a clip by id.
Inputs: clip_id (required).
clip_resizeA
Change a clip's length. anchor='start' (default) keeps start_beats fixed and moves the right edge. anchor='end' keeps the right edge fixed and moves start_beats so total duration changes from the left.
Inputs: clip_id (required), new_length_beats (required), anchor.
clip_setB
Modify any field on an existing clip. Pass only fields you want changed. For AudioClip: name, start_beats, length_beats, gain_db, fade_in_beats, fade_out_beats, offset_in_source_beats, warp_mode. For MidiClip: name, start_beats, length_beats, gain_db.
Inputs: clip_id (required), name, gain_db, warp_mode, +5 more.
compose_and_reloadB
Dispatch one of jazz/synthwave/lofi generative composers AND revert in Waveform with one call. Avoids the compose-then-manually-revert dance during iteration.
Inputs: composer (required), out_path (required), seed, tempo, +3 more.
compose_djent_realA
Djent track using REAL VST3 instruments + amp/cab simulators (sforzando + Karoryfer Emilyguitar SFZ → The Anvil drive → Mercuriall Metal Area amp → TSC cab) instead of synthetic 4OSC. Returns a manual_step_required note explaining you must load the SFZ in sforzando once after opening the project — sforzando state isn't preserved in our .tracktionedit writer yet.
Inputs: out_path (required), seed, tempo.
compose_djent_trackB
Generate a progressive metal / djent instrumental in B minor. Form: intro → riffA → riffB → breakdown → riffA2 → buildup → solo (8 bars) → riffFinal → outro. Tracks: drums (polyrhythmic 3-3-2 kicks), bass, dual rhythm guitars panned hard L/R for the wall, lead solo over solo section, atmospheric pad. ~140 seconds at 110 BPM.
Inputs: out_path (required), seed, tempo.
compose_from_primitivesB
Build a song bottom-up from composition primitives — the recipe demonstrating arrangement_plan + progression_generate + voice_lead + drum_pattern + bassline_generate + arp_pattern + melody_generate + motif_develop wired together. Genre selects drum patterns, bass feels, and mix-balance reference. energy_curve drives velocity scaling per section.
Inputs: out_path (required), mode, root, seed, +4 more.
compose_jazz_generativeA
Generate a jazz/jaunty track with authentic walking bass (7-pattern Paul Chambers vocabulary), Charleston-rhythm Rhodes comping, and Salamander Grand Piano lead treated like a vocal (call/response motifs, vocal range, dynamic phrasing). Drums comp for the soloist (ghost rim shots on piano off-beats, phrase-end fills, sparse ride on solo phrases). Section-wide ensemble dynamics and per-section bass feels (two-feel for heads, walking for blowing, anticipations into the bridge).
Inputs: no named parameters.
compose_lofi_generativeA
Generate a UNIQUE lofi track on every call. Unlike the old compose_lofi_track which hardcoded everything, this one uses progression_generate, arrangement_plan, drum_pattern, melody_generate, and bassline_generate primitives. Each seed produces a meaningfully different song: different chords, section layout, drum density, melody contour, bass feel, and tempo (within lofi range).
Inputs: no named parameters.
compose_lofi_trackB
Generate a complete lofi track .tracktionedit file: 4 tracks (drums, bass, keys, pad), Fmaj7-Am7-Dm7-Cmaj7 progression, real 808 drum samples, master FX bus. Bass / keys / pad presets are configurable so you can A/B sounds without editing the composer. Saves to the given path.
Inputs: out_path (required), bars, seed, tempo, +4 more.
compose_rainstormA
Generate a rainstorm ambient .tracktionedit: continuous rain bed, tiled wind/breeze layer, occasional distant-muffled thunder rumbles (lowpass + EQ + low gain). 60 BPM (1 beat = 1 second). No music.
Inputs: out_path (required), seed, length_seconds.
compose_synthwave_generativeA
Generate a UNIQUE synthwave track on every call. Drives progression_generate / arrangement_plan / drum_pattern / melody_generate primitives with seed-driven variation across tempo (100-128 BPM), key, form, chord progression, drum density, melody contour, and bass feel. Different seeds = meaningfully different songs.
Inputs: no named parameters.
compose_synthwave_trackC
Generate a 64-bar synthwave instrumental .tracktionedit at 110 BPM in A minor. Properly developed song form: intro → verseA → chorus → verseB (variation) → chorus2 (with counter) → bridge (new chord set + walking bass + descending arp) → chorusFinal (peak) → outro (progressive instrument drop with pad chord ring-out). Per-section chord progressions, bass feels (verse=half-time, chorus=8th pump, bridge=walking), and arp themes (verse / verseB syncopated / chorus pump / bridge descending). Showcases the full MCP toolset.
Inputs: out_path (required), seed, tempo.
compose_variationsA
Run a composer N times with different seeds, saving each output to a numbered file. Returns the list of paths so you can render all and pick the best.
Inputs: count (required), composer_name (required), out_path_prefix (required), extra_args.
compress_glueB
Gentle bus 'glue' compressor. amount 0..1 (0=barely-there, 1=noticeable).
Inputs: track_id (required), amount.
compress_smashC
Aggressive parallel-style compressor for drum-bus / NY-style smash. No params — preset values.
Inputs: track_id (required).
desktop_clickA
Click at screen coordinates. Use desktop_screenshot first to know what's where. button ∈ {left, right, middle}.
Inputs: x (required), y (required), button, clicks.
desktop_keyA
Press a single key or chord. Examples: 'enter', 'esc', 'ctrl+s', 'ctrl+shift+n', 'f5'. Sent to whatever window currently has focus.
Inputs: keys (required), presses, interval.
desktop_moveA
Move the mouse to (x, y) without clicking.
Inputs: x (required), y (required), duration.
desktop_screenshotA
Capture the current screen (or a region) to a PNG file under state/screenshots/. Returns the path. Use this to verify that a UI action had the expected effect before sending the next.
Inputs: name, region.
desktop_screen_sizeA
Return current screen resolution.
Inputs: no named parameters.
desktop_typeC
Type a string of text into the focused window.
Inputs: text (required), interval.
desktop_waitA
Sleep for seconds seconds. Use sparingly; prefer screenshot-then-act.
Inputs: seconds (required).
drum_patternA
Generate drum notes for a section. (genre, role) selects from a library of 50+ named patterns. role ∈ {verse, chorus, fill, intro, breakdown, outro, buildup}. density 0..1 scales note count (0.5 drops half the hats; 1.0 is the full pattern). length_bars tiles the pattern. Returns notes ready to drop on a Sampler track.
Inputs: role (required), genre (required), length_bars (required), seed, +4 more.
drum_pattern_listA
List all available (genre, role) patterns in the library.
Inputs: no named parameters.
edit_createA
Create a new empty Edit (song). Sets tempo, time signature, and key. Replaces the in-memory Edit; does not write to disk until edit_save or flush.
Inputs: name, tempo, key_mode, key_root, +3 more.
edit_export_chord_chartA
Export a chord-chart text file from the markers + tempo of the current Edit. format ∈ {lead_sheet, nashville}. Markers should be named with section labels (e.g. 'verse', 'chorus').
Inputs: out_path (required), format.
edit_export_midiB
Export all MIDI clips in the current Edit to a Standard MIDI File (.mid). One MIDI track per Edit MIDI track. Format-1 SMF with the Edit's tempo + time signature in track 0. Drop into any DAW for editing/printing/learning.
Inputs: out_path (required).
edit_inspectA
Detailed structural dump of the current Edit. Heavier than edit_summary — includes every plugin's params, clip gain/fade/offset, automation lane counts, master chain. Use after edit_open to understand a song before mutating it.
Inputs: no named parameters.
edit_openB
Load an existing .tracktionedit file from disk into the model.
Inputs: path (required).
edit_saveA
Serialize the current Edit to a .tracktionedit file. Sets the flush target.
Inputs: path (required).
edit_save_stemA
Save a stem-mix copy of the current Edit: only named tracks audible, all others muted. Pass track_ids or track_names (list). Use in a loop to produce per-track stems for rendering.
Inputs: out_path (required), track_ids, track_names.
edit_set_tempoB
Change the project tempo. preserve_pitch is informational (audio clips don't get pitch-shifted by this tool).
Inputs: bpm (required), preserve_pitch.
edit_summaryA
Return a JSON summary of the current Edit (tracks, clips, markers, tempo).
Inputs: no named parameters.
edit_transposeA
Transpose every MIDI note in the Edit by semitones. Audio clips are NOT pitch-shifted.
Inputs: semitones (required).
ensemble_dynamicsA
Return per-section velocity multipliers for a sections_plan. Apply uniformly to drums, bass, keys, lead notes so the whole ensemble breathes together (quiet intro, building verses, peak chorus/bridge, soft outro).
Inputs: no named parameters.
eq_high_passA
Add a high-pass filter at freq Hz to a track. slope is dB/oct (12, 18, 24).
Inputs: track_id (required), freq, slope.
eq_low_passA
Add a lowpass filter at freq Hz to a track for darkening/muffling.
Inputs: track_id (required), q, freq.
eq_tiltB
Single-knob bright/dark EQ. brightness -1=dark, 0=neutral, +1=bright.
Inputs: track_id (required), brightness.
flushA
Write the current Edit to the previously-opened/saved .tracktionedit path. Use this between batches of mutations so Waveform (when open) sees a single, coherent update instead of mid-edit flicker.
Inputs: no named parameters.
key_setD
Set the project key.
Inputs: mode (required), root (required).
loop_dropA
Drop a loop onto a track. mode='fit' time-stretches to song tempo, 'original' uses natural tempo. start_beats defaults to end of existing clips on that track. Auto-detects file duration.
Inputs: track_id (required), loop_path (required), mode, start_beats.
loop_searchA
Search Waveform's loop library. Optional filters: tempo (BPM, with tolerance), name (substring), bars (exact), min_bars, max_bars.
Inputs: bars, name, tempo, max_bars, +2 more.
marker_addB
Drop a marker (verse, chorus, drop, etc.) at a beat position.
Inputs: name (required), start_beats (required), length_beats.
master_chain_applyA
Replace the master chain with a named template. template ∈ {clean_pop, loud_edm, lofi_warm, cinematic_dynamic, podcast_voice, no_processing}. Each is an EQ + Comp + Limiter chain tuned for its target use case.
Inputs: template (required).
melody_generateB
Generate a melody from a scale and contour. Returns notes (pitch/start_beats/length_beats/velocity) ready to drop into a MIDI clip. contour ∈ {arch, descending, ascending, wave, question_answer, static}. density ∈ {sparse, medium, busy}. Notes are rhythmically diverse — quarter, eighth, dotted, with rests — humanized for natural feel.
Inputs: mode (required), root (required), length_beats (required), seed, +3 more.
midi_clip_addC
Create an empty MIDI clip on a track.
Inputs: track_id (required), start_beats (required), length_beats (required), name.
midi_clip_quantizeA
Snap note start times in a clip to the nearest grid division. Grid is in beats: 0.25 = 16th notes, 0.5 = 8ths, etc. Strength 0..1.
Inputs: clip_id (required), grid_beats (required), strength.
midi_notes_addB
Add notes to an existing MIDI clip. Pass an array of {pitch, start_beats, length_beats, velocity?, colour?}. Pitch is MIDI 0-127. Channel is per-clip, set when the clip is created (not per-note).
Inputs: notes (required), clip_id (required).
midi_notes_clearB
Remove all notes from a MIDI clip.
Inputs: clip_id (required).
mix_apply_referenceB
Set a track's volume_db (and optional pan) to the genre+role reference from the MIX_BALANCE table. Use this once per track after creating it instead of hand-tuning levels. Genres: synthwave, lofi, edm, pop, hip_hop, cinematic, ambient. Roles: drums, kick, snare, hat, bass, sub_bass, lead, pad, keys, arp, counter, melody, ambience, fx. Returns the dB value applied.
Inputs: role (required), genre (required), track_id (required), pan, +1 more.
mix_match_referenceA
Compare a rendered file against a genre's reference spectrum and return a per-band diff in dB plus a plain-English diagnosis ('low end is +4 dB hot vs synthwave reference; consider HP filter on bass'). Use after render to inform mix adjustments.
Inputs: genre (required), file_path (required).
mix_setA
Set track volume (dB), pan (-1..1), mute, solo. Pass only the fields to change.
Inputs: track_id (required), pan, mute, solo, +1 more.
motif_developB
Transform a motif (set of notes) into a variation. transformation ∈ {transpose, invert, retrograde, augment, diminish, sequence_up, sequence_down}. transpose: shift by semitones. invert: mirror around axis_pitch. retrograde: reverse note order. augment: stretch durations by factor. sequence_up/down: transpose by semitones AND repeat.
Inputs: notes (required), transformation (required), factor, semitones, +2 more.
narrateA
Tell the user (via the event stream / preview UI) what the agent is about to do, in plain English. Call this before a batch of mutations so the user can follow along.
Inputs: text (required).
plugin_addA
Add a plugin to a track's chain. For built-ins, pass the type name (e.g. '4OSC', 'Wavetable'). For external VSTs, also pass preset_path.
Inputs: type (required), track_id (required), name, preset_path.
plugin_add_drum_kitA
Add a Sampler-backed drum kit to a track. pads is a list of {midi_note, sample_path, name?, gain_db?, pan?, decay?}. Each pad becomes one SOUND mapped to a single MIDI note. Replaces the manual Sampler+sounds boilerplate in compose_lofi_track.
Inputs: pads (required), track_id (required), name.
plugin_add_macroA
Add a MacroParameter (single 0..1 knob) to a plugin. Macros are the canonical Tracktion way to expose a single control that drives multiple underlying params via assignments.
Inputs: name (required), track_id (required), plugin_id (required), value, +1 more.
plugin_add_modifierA
Add a TRACK-LEVEL modifier (LFO/envelope/random/step_lfo) and assign it to a plugin parameter. Real Tracktion schema — wires both on the track AND on the plugin. depth: 0..1 (modulation amount). rate: Hz when rate_type=0, beat multiplier when rate_type=1 (default = beat-synced). shape ∈ {sine, triangle, square, saw}.
Inputs: track_id (required), target_param (required), target_plugin_id (required), rate, +5 more.
plugin_add_reverbA
Add a built-in reverb to a track. type ∈ {plate, natural, non_linear}. All other params are normalized 0..1: size, decay, mix (wet amount), pre_delay, diffusion, definition, high_damp, low_damp, high_cut. Defaults to a tasteful 25% wet plate.
Inputs: track_id (required), mix, name, size, +8 more.
plugin_discoverA
List third-party VST/AU plugins Waveform has scanned. Optional filters: kind ('instrument'|'effect'), format ('VST3'|'VST'|'AU'), manufacturer (substring), name (substring). Use the returned uniqueId as the type arg to plugin_add for VST3 instantiation.
Inputs: kind, name, format, manufacturer.
plugin_listA
Return the curated list of built-in instruments and effects available by name.
Inputs: no named parameters.
plugin_removeB
Remove a plugin from a track's chain by id.
Inputs: track_id (required), plugin_id (required).
plugin_set_paramC
Set a named parameter on a plugin in a track's chain.
Inputs: param (required), value (required), track_id (required), plugin_id (required).
plugin_set_vst_stateA
Apply a base64 VST state blob (from plugin_state_capture) to an existing plugin in the in-memory Edit. Lets you copy one configured VST onto every other instance.
Inputs: state (required), track_id (required), plugin_id (required).
plugin_state_captureA
Read a saved .tracktionedit file and extract a VST plugin's base64 state blob by plugin_name (substring match) or unique_id. Used to copy a manually-loaded plugin's configuration (e.g. an SFZ loaded into sforzando) for re-use programmatically.
Inputs: unique_id, plugin_name, edit_file_path.
progression_generateA
Invent a chord progression in a key and mode. Returns a list of chord dicts ({roman, root_note, root_midi, chord_pitches, quality}). Constraints: end_cadence ∈ {authentic, plagal, deceptive, half}; allow_borrowed enables modal interchange (bIII/bVI/bVII in major, V/VII for minor); style ∈ {pop, jazz, modal, synthwave, sad, uplifting} biases the chord palette.
Inputs: mode (required), root (required), length_chords (required), seed, +4 more.
reference_song_listA
List all known reference songs in the curated database.
Inputs: no named parameters.
reference_song_lookupA
Look up musical hints for a song. Pass name (one of the keys in REFERENCE_SONGS) OR genre to list all references in that genre. Returns BPM, key, form, energy curve, signatures the composer can use as inputs.
Inputs: name, genre.
reference_spectrum_lookupA
Get the target spectral profile (RMS dB per log-spaced band) for a genre — a mastering-engineer-cheat-sheet target for what a well-mixed track in this genre should look like spectrally. Bands: 60 / 133 / 296 / 657 / 1460 / 3243 / 7204 / 16000 Hz.
Inputs: genre (required).
renderA
Render the current Edit to a WAV file. NOT YET IMPLEMENTED — requires the wf-engine-helper binary which is not built. Use this tool to check status; it will return ok=False with a clear message so the agent can fall back to telling the user to render from inside Waveform.
Inputs: out_path (required), bit_depth, sample_rate.
render_and_auditC
Render the active edit to MP3, run the analyzer, and return both paths plus a balance/rhythm summary in one call. Replaces the manual revert→render→analyze chain.
Inputs: bitrate, mp3_path, revert_first, trim_trailing_silence.
render_stemsB
Render per-track stems. NOT YET IMPLEMENTED.
Inputs: out_dir (required).
send_addA
Add an aux send (parallel routing) on a track. Tracktion routes via numbered buses 0..15 — pass bus_num explicitly, or pass dest_track_id to auto-pick a bus. Pair with aux_return_add on the receiving track. Emits a real element with proper slider position from amount_db.
Inputs: src_track_id (required), bus_num, pre_post, amount_db, +1 more.
snapshot_listA
List all saved snapshots in this session.
Inputs: no named parameters.
snapshot_recallC
Restore a previously-saved snapshot as the active Edit.
Inputs: name (required).
snapshot_saveA
Save the current Edit as a named snapshot for later A/B compare or recall.
Inputs: name (required).
step_clip_addB
Add a step clip (drum-machine grid) to a track. channels is a list of {midi_note, name?, velocity?} dicts — one per drum row. patterns is a list of pattern dicts: each pattern has rows parallel to channels, where each row has a pattern string of '0'/'1' steps and optional velocities list. step_length is duration of each step in beats (0.25 = 16th notes). Way cleaner than 80 individual MidiClip notes.
Inputs: channels (required), patterns (required), track_id (required), start_beats (required), +4 more.
tempo_setA
Set the project tempo in BPM (currently single global tempo; per-bar curves later).
Inputs: bpm (required).
theory_arrangement_layersA
Return arrangement layers: foundation, harmonic_glue, lead, counter_melody, atmosphere, ear_candy. Optional section returns per-section presence values for each layer (0..1) from LAYER_PRESENCE_BY_SECTION — drives the 'which layers should be active' decision.
Inputs: section.
theory_borrowed_chordsA
Return the borrowed-chord (modal interchange) palette for major keys with usage notes.
Inputs: no named parameters.
theory_cadencesB
Return cadence types — pattern, feel, and use. Optional name for one specific cadence.
Inputs: name.
theory_chord_progressionA
Look up a named chord progression. Returns the Roman-numeral sequence + tags + examples. Without args, lists all 24 named progressions.
Inputs: tag, name.
theory_diatonic_chordsB
Return the 7 diatonic chords for a key/mode. Set sevenths=true for 7th-chord qualities (Imaj7, ii7, etc.) instead of triads (I, ii, etc.). Returns Roman numerals + the actual chord pitches (MIDI) for each.
Inputs: mode (required), root (required), octave, sevenths.
theory_genreA
Return genre conventions: BPM range, time signature, key tendency, instruments, form, hallmark progressions. Without args, lists all 22 genres.
Inputs: name.
theory_heuristicsA
Return the 13 songwriting heuristics (rule_of_3, contrast_required, etc.).
Inputs: no named parameters.
theory_mix_balanceA
Return reference track-volume dB targets for a genre. Without args, returns the full table of (genre, role) → dB. With genre, returns the role→dB map for that genre. With genre AND role, returns the single dB value with a brief rationale. Roles: drums, kick, snare, hat, bass, sub_bass, lead, pad, keys, arp, counter, melody, ambience, fx. Genres: synthwave, lofi, edm, pop, hip_hop, cinematic, ambient.
Inputs: role, genre.
theory_modesB
List the 7 church modes with their characteristic degree, vibe, and typical use.
Inputs: mode.
theory_rhythmA
Return rhythm/meter info: time signatures, syncopation patterns, swing ratios. Pass time_sig for one specific time signature, syncopation for one pattern, or neither for the full reference.
Inputs: time_sig, syncopation.
theory_scaleA
Return the notes of a scale starting at a root. Returns MIDI numbers, note names, and interval pattern. mode is one of: major, natural_minor, harmonic_minor, melodic_minor_asc, ionian, dorian, phrygian, lydian, mixolydian, aeolian, locrian, major_pentatonic, minor_pentatonic, blues, whole_tone, half_whole_dim, whole_half_dim, chromatic, hungarian_minor, phrygian_dominant.
Inputs: mode (required), root (required), octave.
theory_searchA
Search across all theory data by substring. Returns hits across scales, progressions, cadences, sections, forms, genres, heuristics. Useful for fuzzy questions like 'find anything related to lofi' or 'what mentions Phrygian'.
Inputs: q (required).
theory_sectionA
Return song section info: typical bar counts, role, dynamic level, valid next sections. Without args, lists all 15 section types (intro, verse, chorus, bridge, drop, etc.).
Inputs: name.
theory_song_formA
Return a macro song form layout. Without args, lists all 14 forms. With name, returns the section sequence, applicable genres, and total bar range.
Inputs: name.
theory_surprise_devicesC
Return the 7 surprise devices (truck_driver_modulation, deceptive_cadence, etc.).
Inputs: no named parameters.
theory_velocityA
Convert dynamic markings (ppp/pp/p/mp/mf/f/ff/fff) to MIDI velocity values, or look up all of them. Includes ACCENT_BUMP and GHOST_NOTE_MAX_VEL constants.
Inputs: dynamic.
theory_voice_leading_rulesA
Return the 10 codified voice-leading rules + scoring guidance.
Inputs: no named parameters.
tool_historyA
Return the last N tool calls made in this session for self-audit.
Inputs: last_n.
track_addB
Add a new track. kind ∈ {audio, midi, folder, submix, automation}.
Inputs: name (required), pan, kind, volume_db.
track_removeB
Delete a track by id.
Inputs: track_id (required).
undoB
Roll back the most recent mutation.
Inputs: no named parameters.
voice_leadA
Voice the next chord with minimal voice motion from the previous voicing. Standard SATB-style voice leading: each voice moves the smallest interval to a target chord tone. Returns the new voicing as a list of MIDI pitches (same length as prev_voicing).
Inputs: next_chord (required), prev_voicing (required).
waveform_focusA
Bring Waveform's main window to the foreground. Required before desktop_key / desktop_type send keystrokes to the app.
Inputs: no named parameters.
waveform_launchA
Launch Waveform, optionally opening a .tracktionedit file. If Waveform is already running and a file path is provided, opens the file in the existing instance via OS file association (Waveform registers itself as the handler for .tracktionedit on install).
Inputs: exe_path, file_path.
waveform_locateA
Find the installed Waveform binary on disk. Returns the path. Searches running processes first, then well-known install locations. Run this before launch/focus tools so the rest of the chain has a path to use.
Inputs: no named parameters.
waveform_plugin_typesA
Return the friendly-name → Tracktion-type-code map for built-in plugins. These codes are what the .tracktionedit XML expects in .
Inputs: no named parameters.
waveform_preset_listA
List available factory presets. Without args, returns the plugin category folders (4OSC, Compressor, etc.). With category, lists individual .trkpreset files in that category.
Inputs: category.
waveform_preset_readA
Read a .trkpreset XML and return its element contents — the type, parameters, and any nested elements. Use this to grab a known-good instrument or effect configuration to drop into a generated edit.
Inputs: path (required).
waveform_quitA
Politely close Waveform (sends WM_CLOSE to the main window).
Inputs: no named parameters.
waveform_settings_dirA
Return the path to Waveform's settings directory (where Waveform.settings, knownPluginList64.settings, Templates/, etc. live). Useful for the planned settings-file editor surface.
Inputs: no named parameters.
waveform_statusA
Is Waveform currently running? Returns pid + exe path if so.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 129 tools
Most tools have clearly distinct purposes, but several near-duplicates exist (tempo_set vs edit_set_tempo, compose_lofi_track vs compose_lofi_generative, audio_clip_import vs loop_drop). Some descriptions reference flows (e.g. 'revert→render→analyze' in render_and_audit) that don't map to explicit tools, which could confuse an agent.
The dominant snake_case verb_noun / domain_action pattern is consistent (midi_clip_add, automation_clear, waveform_launch, theory_scale). However, a few outliers break the pattern: tempo_set and key_set lack the domain prefix that edit_set_tempo has for the same concept, and verbs are mixed (list/lookup/get/add/create) without a strict rule.
With 129 tools, this is far beyond the 3-15 well-scoped range and even beyond the 50+ 'extreme' threshold. The breadth spans DAW control, music theory, generation, audio analysis, and desktop automation, but the sheer count makes it unwieldy for an agent to navigate; many tools (e.g. the numerous compose_*_track variants, granular desktop_* actions) could be consolidated behind parameters.
Coverage is broad across edit, clip, MIDI, audio, plugin, automation, rendering, theory, generation, and analysis domains. However, notable gaps exist: there is no way to list tracks (only track_add/remove), no bus listing, no marker add/list management, no plugin chain reorder/bypass, and no way to change time signature after edit creation.
Maintenance
Related MCP Connectors
MCP server for Producer/Riffusion AI music generation
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI agents the ability to listen to and understand music/audio files, enabling semantic analysis, stem separation, lyrics transcription, and signal processing via tool calls.1MIT
- AlicenseAqualityCmaintenanceMCP server for Ableton Live that exposes the Live Object Model to LLMs, enabling natural language control of music production.3684 npm11MIT
- AlicenseNot gradedqualityCmaintenanceA music MCP server enabling multi-agent collaboration where AI agents jam together in real-time, with 20 tools, conductor mode, and zero dependencies.141 npm39AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables your LLM to generate and play music through SuperCollider.7 npm62MIT