{
  "version": "1.8.0",
  "toolCount": 156,
  "tools": [
    {
      "name": "add_notes_to_clip",
      "group": "clips",
      "description": "REPLACES the clip's entire note content with the given notes. Use edit_notes\nto add or remove a subset without touching the rest.\n\nnotes: list of {\"pitch\": 0-127 (60 = C3 in Live's naming), \"start_time\": beats\nfrom clip start (float), \"duration\": beats, \"velocity\": 1-127, \"mute\": bool}.\nPrecondition: the clip must exist (create_clip first).\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "notes": {
            "items": {
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  }
                ]
              },
              "type": "object"
            },
            "title": "Notes",
            "type": "array"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "notes"
        ],
        "title": "add_notes_to_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "adg_analyze",
      "group": "offline",
      "description": "Full offline analysis of a .adg rack or .adv preset: named macros\n(name/value), the chain + device tree (recursive, incl. racks-inside-racks\nwith each device's kind/name/on-state and any sample), legacy macro->\nparameter mappings, every referenced sample (name + relative path), the\nrequired Live edition, and — for drum racks — the pad map (pad -> MIDI note,\nlabel, and sample). No Live required.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "adg_analyzeArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "adg_edition",
      "group": "offline",
      "description": "Classify the Live edition a saved .adg/.adv needs, offline: 'suite' if any\nSuite-only device is present (Operator, Wavetable, Echo, Drift, Meld,\nSampler, Collision, ...), else 'standard' if any Standard-only device is\npresent (EQ Eight, Compressor, Simpler, Impulse, Drum Rack, ...), else\n'intro'. Returns the verdict plus which devices drove it, so an agent can\ntell whether a preset will load on the user's edition before loading it.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "adg_editionArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "adg_summary",
      "group": "offline",
      "description": "Summarize a saved .adg rack or .adv device preset WITHOUT Live running:\nname, rack type, total device count, top-level chain count, named-macro\ncount, required Live edition (intro/standard/suite), and whether it is a drum\nkit (`is_drum_rack` is true when the preset is or wraps a Drum Rack — factory\nkits ship wrapped in an Instrument Rack). `path` is a filesystem path to a\n.adg or .adv file.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "adg_summaryArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_details",
      "group": "offline",
      "description": "Read mixing and arrangement detail from a saved .als, offline: the set's\nlocators (name + beat time) and each track's fader volume, pan, and number of\nautomation lanes. Complements als_summary for reviewing a mix without Live.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "als_detailsArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_detect_key",
      "group": "analysis",
      "description": "Detect the key/scale of a saved .als file WITHOUT Live running\n(Krumhansl-Kessler). Pools notes from every MIDI clip in the set, or only\none track when `track_index` is given. `weight` selects the histogram\nweighting (\"duration\", \"velocity\", \"product\", \"count\"). `path` is a\nfilesystem path to a .als file.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          },
          "track_index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Track Index"
          },
          "weight": {
            "default": "duration",
            "title": "Weight",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "als_detect_keyArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_diff",
      "group": "offline",
      "description": "Diff two saved .als files (e.g. song_v4.als vs song_v5.als) offline:\ntempo/time-signature changes, tracks added/removed by name, and per-track\ndeltas in device chain, clip count, note count, and mute state. Great for\nlogging what changed between versions.",
      "inputSchema": {
        "properties": {
          "path_a": {
            "title": "Path A",
            "type": "string"
          },
          "path_b": {
            "title": "Path B",
            "type": "string"
          }
        },
        "required": [
          "path_a",
          "path_b"
        ],
        "title": "als_diffArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_extract_midi",
      "group": "offline",
      "description": "Extract MIDI notes from a track in a saved .als file, as\n{pitch,start,duration,velocity} dicts per clip. `track_index` is the track's\nposition in the set (see als_summary). No Live required.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          },
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "path",
          "track_index"
        ],
        "title": "als_extract_midiArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_find_unfinished",
      "group": "offline",
      "description": "Lint a saved .als for likely-unfinished work, offline: no master\nlimiter/compressor, MIDI track with no instrument, MIDI clip with no notes,\nempty audio track, or muted tracks. Returns machine-readable issues so an\nagent can decide what to fix before rendering.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "als_find_unfinishedArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_list_tracks",
      "group": "offline",
      "description": "List every track in a saved .als file with its clips (name, MIDI/audio,\nstart, length, looping, sample path, note count). No Live required.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "als_list_tracksArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "als_summary",
      "group": "offline",
      "description": "Summarize a saved .als file WITHOUT Live running: version/creator, tempo,\ntime signature, and each track's kind, name, mute/solo, device names, clip\ncount, and note count. `path` is a filesystem path to a .als file.",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "als_summaryArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "analyze_audio_file",
      "group": "analysis",
      "description": "Measure local WAV (integer/float), AIFF/AIFF-C, FLAC, Ogg Vorbis, MP3,\nAAC or M4A/MP4 (AAC/ALAC) without Live: per-channel sample peak/RMS dBFS,\nDC offset, crest factor and full-scale samples. Analyzes the first max_seconds\n(default 30, maximum 120); marks partial results. Not LUFS or true peak. No upload.\nCompressed files are measured after decoding; this does not recover lost audio.\nFiles are read locally without modification, normalization or upload.\n",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          },
          "max_seconds": {
            "default": 30.0,
            "title": "Max Seconds",
            "type": "number"
          }
        },
        "required": [
          "path"
        ],
        "title": "analyze_audio_fileArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "analyze_mix",
      "group": "analysis",
      "description": "Heuristic session-state checks, NOT audio, peak, LUFS or headroom measurements.\nScan the current live set for inspection leads: several high faders, a muted\nor empty Session track, or a MIDI track without devices. External routing and\nArrangement audio may explain these states. Returns machine-readable\nfindings so you can decide what to fix. Reads the session; changes nothing.",
      "inputSchema": {
        "properties": {},
        "title": "analyze_mixArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "apply_recipe",
      "group": "recipes",
      "description": "Scaffold a genre starter in one call: set the tempo, add Drums, Bass, and\nChords MIDI tracks, try to load fitting instruments, and write generated\nparts. `name` is one from list_recipes (e.g. \"lofi_beat\", \"house_groove\").\ntempo/key/scale/bars override the recipe defaults. Adds new tracks; it does\nnot overwrite existing ones.",
      "inputSchema": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "tempo": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Tempo"
          },
          "key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Key"
          },
          "scale": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Scale"
          },
          "bars": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Bars"
          }
        },
        "required": [
          "name"
        ],
        "title": "apply_recipeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "back_to_arranger",
      "group": "session",
      "description": "Return playback control to the Arrangement (after Session clips have\noverridden arrangement content - the orange 'Back to Arrangement' state).",
      "inputSchema": {
        "properties": {},
        "title": "back_to_arrangerArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "batch_commands",
      "group": "session",
      "description": "Run several commands in ONE round-trip and ONE undo step (atomic-ish:\nstops at the first error; completed steps are a single undo away).\n\ncommands = [{\"type\": \"<command>\", \"params\": {...}}, ...]. Command names match\nthe MCP tool names (the few that differ are auto-translated), e.g.\n[{\"type\": \"set_tempo\", \"params\": {\"tempo\": 80}},\n {\"type\": \"create_midi_track\", \"params\": {\"index\": -1}}].\nComposite tools (record_section, load_drum_kit, apply_recipe, save_set, the\ngenerate_* tools) are NOT batchable - they orchestrate multiple commands\nserver-side. Prefer this for multi-step edits: fewer round-trips, one undo\nreverts all.\n",
      "inputSchema": {
        "properties": {
          "commands": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "title": "Commands",
            "type": "array"
          }
        },
        "required": [
          "commands"
        ],
        "title": "batch_commandsArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "capture_and_insert_scene",
      "group": "session",
      "description": "Snapshot the currently playing Session clips into a new scene - the\n'keep that combination' workflow.",
      "inputSchema": {
        "properties": {},
        "title": "capture_and_insert_sceneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "capture_midi",
      "group": "session",
      "description": "Grab recently played MIDI into a new clip (Live's Capture MIDI). Requires\nthat MIDI was recently played into an armed/monitored track.",
      "inputSchema": {
        "properties": {},
        "title": "capture_midiArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "clear_automation",
      "group": "arrangement",
      "description": "Delete one device parameter's entire automation envelope from a clip.\n\nResolve the device and parameter with get_device_parameters first. This\nremoves every automation point for that parameter, not a time range; manual\nparameter state remains. Use write_automation to replace the envelope with\nnew points, or undo immediately to recover an accidental clear.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          },
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Parameter name or zero-based parameter index returned by the matching get_*_device_parameters tool.",
            "title": "Parameter"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "device_index",
          "parameter"
        ],
        "title": "clear_automationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true
      }
    },
    {
      "name": "clip_operation",
      "group": "clips",
      "description": "Structural clip edits. op: \"duplicate_loop\" (double the loop, duplicating\nnotes - extend 2 bars to 4 before adding variation), \"crop\" (discard\nmaterial outside the loop), \"duplicate_region\" (copy notes from\nregion_start/region_length to destination_time, optionally transposing by\ntransposition_amount semitones; pitch=-1 means all pitches).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "op": {
            "title": "Op",
            "type": "string"
          },
          "region_start": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Region Start"
          },
          "region_length": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Region Length"
          },
          "destination_time": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Destination Time"
          },
          "pitch": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Pitch"
          },
          "transposition_amount": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Transposition Amount"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "op"
        ],
        "title": "clip_operationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "continue_playing",
      "group": "session",
      "description": "Resume playback from the current position (start_playback restarts from\nthe playhead's last start point instead).",
      "inputSchema": {
        "properties": {},
        "title": "continue_playingArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_audio_clip",
      "group": "clips",
      "description": "\nCreate a new audio clip in an audio track's clip slot by importing a file.\n\nRequires Ableton Live 12.0.5 or newer - the underlying\nClipSlot.create_audio_clip Live API was introduced in 12.0.5 and is not\navailable in earlier 12.0.x releases.\n\nParameters:\n- track_index: The index of the audio track to create the clip in\n- clip_index: The index of the clip slot to create the clip in\n- path: Absolute path to a supported audio file (e.g. a .wav). The target\n  track must be an audio track and the clip slot must be empty.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "path"
        ],
        "title": "create_audio_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_audio_track",
      "group": "tracks",
      "description": "Insert an empty audio track at a chosen position, or append with `-1`.\n\nNon-negative indices insert before the current track at that position and\nshift it and later track indices up. Use create_midi_track for instruments\nand MIDI clips, or create_return_track for a shared send-effect bus.\n",
      "inputSchema": {
        "properties": {
          "index": {
            "default": -1,
            "description": "Insertion position among regular tracks; -1 appends at the end.",
            "minimum": -1,
            "title": "Index",
            "type": "integer"
          }
        },
        "title": "create_audio_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "create_clip",
      "group": "clips",
      "description": "Create an empty MIDI clip in a Session slot. Fails if the slot already has\na clip (pick another clip_index or delete_clip first) or the track is an\naudio track. length is in beats (4.0 = one 4/4 bar).\nTypical chain: create_clip -> add_notes_to_clip -> fire_clip or\nduplicate_to_arrangement.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "length": {
            "default": 4.0,
            "title": "Length",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "create_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_locator",
      "group": "session",
      "description": "Create or rename an Arrangement locator at an absolute beat position.\n\nSIDE EFFECT: first moves the Arrangement playhead to `time`, because Live\ncreates cues at the playhead. If a locator already exists there, it is reused\nand renamed when `name` is provided. Use set_arrangement_time when only the\nplayhead should move, and get_locators to inspect existing markers.\n",
      "inputSchema": {
        "properties": {
          "time": {
            "description": "Position in beats from the start of the Arrangement.",
            "minimum": 0,
            "title": "Time",
            "type": "number"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional display name; omit it to keep Live's generated name.",
            "title": "Name"
          }
        },
        "required": [
          "time"
        ],
        "title": "create_locatorArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_midi_track",
      "group": "tracks",
      "description": "\nCreate a new MIDI track in the Ableton session.\n\nParameters:\n- index: The index to insert the track at (-1 = end of list)\n",
      "inputSchema": {
        "properties": {
          "index": {
            "default": -1,
            "title": "Index",
            "type": "integer"
          }
        },
        "title": "create_midi_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_return_track",
      "group": "tracks",
      "description": "Create a new return track (a send bus, e.g. for shared reverb or delay).",
      "inputSchema": {
        "properties": {},
        "title": "create_return_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_scene",
      "group": "session",
      "description": "Create a new scene (row of clip slots). index -1 appends at the end.",
      "inputSchema": {
        "properties": {
          "index": {
            "default": -1,
            "title": "Index",
            "type": "integer"
          }
        },
        "title": "create_sceneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "create_take_lane",
      "group": "tracks",
      "description": "Add a take lane to a track (for comping multiple recorded takes on one\ntrack). Returns the new take-lane count.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "create_take_laneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "delete_arrangement_clip",
      "group": "arrangement",
      "description": "Delete a clip from the Arrangement timeline by its position in\nget_arrangement_clips' list. NOTE: indices of later clips on the same track\nshift down by one after each delete - re-read get_arrangement_clips between\ndeletes.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "arrangement_clip_index": {
            "title": "Arrangement Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "arrangement_clip_index"
        ],
        "title": "delete_arrangement_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "delete_clip",
      "group": "clips",
      "description": "Delete the existing Session-view clip in a slot, including its content.\n\nThis leaves the slot empty and does not shift other slot indices. It fails\nfor an empty slot. Use stop_clip if the intent is only to stop playback;\nuse undo immediately if the deletion was accidental.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "delete_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "delete_device",
      "group": "tracks",
      "description": "Delete a device from a track's chain by its position (0-based). Shifts the\nindices of later devices, so re-read the chain afterwards.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index"
        ],
        "title": "delete_deviceArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "delete_return_track",
      "group": "tracks",
      "description": "Delete a return track by index (0 = Return A). Later returns shift down.",
      "inputSchema": {
        "properties": {
          "return_index": {
            "title": "Return Index",
            "type": "integer"
          }
        },
        "required": [
          "return_index"
        ],
        "title": "delete_return_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "delete_scene",
      "group": "session",
      "description": "Delete a scene (row). Later scene indices shift down by one.",
      "inputSchema": {
        "properties": {
          "scene_index": {
            "title": "Scene Index",
            "type": "integer"
          }
        },
        "required": [
          "scene_index"
        ],
        "title": "delete_sceneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "delete_track",
      "group": "tracks",
      "description": "Delete a track. NOTE: indices of all later tracks shift down by one.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "delete_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "describe_capabilities",
      "group": "analysis",
      "description": "A high-level map of this server: the tool groups and what each covers, plus\nthe conventions to follow, so you can orient before your first call. Set\nABLETON_TOOLSETS to load only some groups. For the current live state, call\nget_session_snapshot; for mix problems, analyze_mix.",
      "inputSchema": {
        "properties": {},
        "title": "describe_capabilitiesArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "describe_device",
      "group": "devices",
      "description": "Return curated guidance for a common Ableton native device: which parameters\nmatter, their units (note `curve` = perceptual, not proportional), sensible\nvalues, and mixing tips. `device_name` is case-insensitive (e.g. \"EQ Eight\",\n\"Compressor\", \"Glue Compressor\", \"Reverb\", \"Auto Filter\", \"Saturator\",\n\"Utility\", \"Limiter\", \"Delay\"). Pair with get_device_parameters for the live\nindices and ranges.",
      "inputSchema": {
        "properties": {
          "device_name": {
            "title": "Device Name",
            "type": "string"
          }
        },
        "required": [
          "device_name"
        ],
        "title": "describe_deviceArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "detect_clip_key",
      "group": "analysis",
      "description": "Detect the key/scale of one Session MIDI clip (Krumhansl-Kessler). Reads\nthe clip's notes and returns the best-fit key with a confidence (-1..1),\nmargin over the runner-up, and the runner-up key. `weight` is how notes are\nweighted into the pitch-class histogram: \"duration\" (default), \"velocity\",\n\"product\", or \"count\". Reads only; changes nothing.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "weight": {
            "default": "duration",
            "title": "Weight",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "detect_clip_keyArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "detect_session_key",
      "group": "analysis",
      "description": "Detect the overall key/scale of the whole set by pooling the notes of\nevery MIDI track's Session clips (Krumhansl-Kessler). Gives the harmonic\ncenter of the arrangement as a whole. `weight` selects the histogram\nweighting (\"duration\", \"velocity\", \"product\", \"count\"). Reads only.",
      "inputSchema": {
        "properties": {
          "weight": {
            "default": "duration",
            "title": "Weight",
            "type": "string"
          }
        },
        "title": "detect_session_keyArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "detect_track_key",
      "group": "analysis",
      "description": "Detect the key/scale of a whole track by pooling the notes of every\nSession clip it holds (Krumhansl-Kessler). Useful when a part is spread\nacross several clips. `weight` selects the histogram weighting (\"duration\",\n\"velocity\", \"product\", \"count\"). Reads only; changes nothing.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "weight": {
            "default": "duration",
            "title": "Weight",
            "type": "string"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "detect_track_keyArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "duplicate_clip_to",
      "group": "clips",
      "description": "Copy a Session clip to any other track/scene slot (overwrites the\ndestination slot). The cross-track way to build variations.",
      "inputSchema": {
        "properties": {
          "src_track": {
            "title": "Src Track",
            "type": "integer"
          },
          "src_scene": {
            "title": "Src Scene",
            "type": "integer"
          },
          "dst_track": {
            "title": "Dst Track",
            "type": "integer"
          },
          "dst_scene": {
            "title": "Dst Scene",
            "type": "integer"
          }
        },
        "required": [
          "src_track",
          "src_scene",
          "dst_track",
          "dst_scene"
        ],
        "title": "duplicate_clip_toArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "duplicate_scene",
      "group": "session",
      "description": "Insert a copy of one Session scene, including every clip in its row.\n\nThis creates new content and increases the scene count; later scene indices\nshift to make room. Use duplicate_track for a whole track or duplicate_clip_to\nfor one clip. Use the new scene as an editable section variation.\n",
      "inputSchema": {
        "properties": {
          "scene_index": {
            "description": "Zero-based Session-view scene (row) index.",
            "minimum": 0,
            "title": "Scene Index",
            "type": "integer"
          }
        },
        "required": [
          "scene_index"
        ],
        "title": "duplicate_sceneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "duplicate_to_arrangement",
      "group": "arrangement",
      "description": "\nCopy a Session-view clip into the Arrangement timeline.\n\nOVERWRITES whatever already occupies the destination range on that track\n(like recording over tape) - this is also the supported way to REPLACE a\nsection. Uses Live's track.duplicate_clip_to_arrangement() API (Live 11/12).\nThe clip is placed at destination_time beats from the start of the\narrangement on the same track it lives in.\n\nTypical workflow:\n  1. create_clip / add_notes_to_clip to build a Session clip\n  2. Call duplicate_to_arrangement once per bar/section you need\n  3. Call switch_to_arrangement_view to confirm the result in Live\n\nParameters:\n- track_index:       Index of the track that owns the Session clip\n- clip_index:        Index of the clip slot in that track (Session view)\n- destination_time:  Beat position in the arrangement to place the clip\n                     (e.g. 0.0 = start, 8.0 = bar 3 in 4/4)\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "destination_time": {
            "title": "Destination Time",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "destination_time"
        ],
        "title": "duplicate_to_arrangementArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "duplicate_track",
      "group": "tracks",
      "description": "Insert a copy of one regular track, including its devices and clips.\n\nThis creates new content and increases the track count; later track indices\nshift to make room. Use duplicate_scene for a Session row or duplicate_clip_to\nfor one clip. Rename or edit the copy to create a variation.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "duplicate_trackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "edit_notes",
      "group": "clips",
      "description": "Edit a subset of notes in a MIDI clip without rewriting all of them.\nadd = [{pitch,start_time,duration,velocity,mute}], remove = [{pitch,start_time}] (matched by pitch+start).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "add": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Add"
          },
          "remove": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Remove"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "edit_notesArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "fire_clip",
      "group": "clips",
      "description": "Launch one existing Session-view clip using Live's launch quantization.\n\nThe slot must contain a clip. Launching it takes Session control of that\ntrack and replaces any other playing Session clip on the same track; firing\nan already-playing clip may retrigger it according to its launch settings.\nUse fire_scene to launch a whole row, or continue_playing for transport only.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "fire_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "fire_scene",
      "group": "session",
      "description": "Launch a Session-view scene using Live's launch quantization.\n\nThis fires the row's clips together and can replace or stop clips currently\nplaying on the affected tracks according to each slot's launch behavior.\nUse fire_clip to launch only one track's clip, or start_playback when the\nintent is Arrangement transport rather than Session launching.\n",
      "inputSchema": {
        "properties": {
          "scene_index": {
            "description": "Zero-based Session-view scene (row) index.",
            "minimum": 0,
            "title": "Scene Index",
            "type": "integer"
          }
        },
        "required": [
          "scene_index"
        ],
        "title": "fire_sceneArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "generate_additive",
      "group": "generators",
      "description": "Write a Philip-Glass additive process into a Session clip. REPLACES the\nclip's notes if it already exists.\n\nBuilds a short one-voice motif (each pitch a ``note_length``-beat note, back\nto back) from ``pitches`` -- a space-/comma-separated list of MIDI numbers.\nThen plays the first 1 note, then the first 2, then the first 3 ...\nconcatenated end to end, so the phrase audibly grows one note per stage.\n``steps`` is how many stages to build (0 = use every note; capped at the\nnumber of pitches).\n\nIf ``source_clip_index`` is given, the motif is read from that clip on the\nsame track instead of built from ``pitches``. Returns a short summary.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "pitches": {
            "default": "60 62 64 65 67 69",
            "title": "Pitches",
            "type": "string"
          },
          "note_length": {
            "default": 0.5,
            "title": "Note Length",
            "type": "number"
          },
          "steps": {
            "default": 0,
            "title": "Steps",
            "type": "integer"
          },
          "velocity": {
            "default": 90,
            "title": "Velocity",
            "type": "integer"
          },
          "source_clip_index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Source Clip Index"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "generate_additiveArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_bassline",
      "group": "generators",
      "description": "Write a bassline following a chord progression. REPLACES existing notes.\n\nprogression: same syntax as generate_chord_progression.\nstyle: \"roots\" (long root notes), \"root_fifth\" (root + fifth bounce),\n\"walking\" (root, approach tones), \"eighth_pump\" (driving 8ths on the root).\noctave: 1 = very low (C1=24), 2 = typical bass (C2=36).\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "progression": {
            "title": "Progression",
            "type": "string"
          },
          "style": {
            "default": "roots",
            "title": "Style",
            "type": "string"
          },
          "octave": {
            "default": 2,
            "title": "Octave",
            "type": "integer"
          },
          "beats_per_chord": {
            "default": 4.0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "velocity": {
            "default": 88,
            "title": "Velocity",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "progression"
        ],
        "title": "generate_basslineArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_chord_progression",
      "group": "generators",
      "description": "Generate voiced chords and write them into one Session-view MIDI clip.\n\nDESTRUCTIVE: creates a clip when the slot is empty; otherwise resizes its loop\nand replaces every existing note. The track must accept MIDI. Progressions\naccept dash/comma/space-separated symbols such as `Am9-Fmaj7-Cmaj9-G13`;\nsupported qualities include maj7, m7, m9, 9, 13, 7#9, sus4, dim, and add9.\nUse add_notes_to_clip for exact notes or edit_notes to preserve existing ones.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          },
          "progression": {
            "description": "Dash-, comma-, or space-separated chord symbols, e.g. \"Dm7-G7-Cmaj7\".",
            "minLength": 1,
            "title": "Progression",
            "type": "string"
          },
          "beats_per_chord": {
            "default": 4.0,
            "description": "Positive number of beats allocated to each chord.",
            "exclusiveMinimum": 0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "center_pitch": {
            "default": 60,
            "description": "MIDI pitch around which chord voicings are centered.",
            "maximum": 127,
            "minimum": 0,
            "title": "Center Pitch",
            "type": "integer"
          },
          "velocity": {
            "default": 62,
            "description": "Base MIDI note velocity (1-127).",
            "maximum": 127,
            "minimum": 1,
            "title": "Velocity",
            "type": "integer"
          },
          "strum": {
            "default": 0.02,
            "description": "Beat offset between chord tones; 0 produces block chords.",
            "minimum": 0,
            "title": "Strum",
            "type": "number"
          },
          "rhythm": {
            "default": "held",
            "description": "Chord rhythm: held, two stabs per slot, or quarter-note hits.",
            "enum": [
              "held",
              "stabs",
              "quarters"
            ],
            "title": "Rhythm",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "progression"
        ],
        "title": "generate_chord_progressionArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false
      }
    },
    {
      "name": "generate_drum_pattern",
      "group": "generators",
      "description": "Write a genre drum pattern into a Session clip on a Drum Rack track.\nREPLACES the clip's notes if the clip exists.\n\nstyle: lofi | boom_bap | house | techno | trap | dnb | ambient.\nswing: beats to delay 8th-note offbeats (0.0-0.1; 0.06 ≈ MPC-ish).\nhumanize: max random velocity deviation (0 = machine-perfect).\nUses the standard Live drum map (36 kick, 38 snare, 42/46 hats...).\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "style": {
            "default": "lofi",
            "title": "Style",
            "type": "string"
          },
          "bars": {
            "default": 2,
            "title": "Bars",
            "type": "integer"
          },
          "swing": {
            "default": 0.06,
            "title": "Swing",
            "type": "number"
          },
          "humanize": {
            "default": 6,
            "title": "Humanize",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "generate_drum_patternArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_euclidean_drums",
      "group": "generators",
      "description": "Write a Euclidean (Bjorklund) rhythm for one drum voice into a Session clip.\nREPLACES the clip's notes if the clip exists.\n\nDistributes `pulses` hits as evenly as possible across `steps` slots spanning\none bar (steps=8 -> 8th notes, 16 -> 16th notes), repeated for `bars`.\npulses=3, steps=8 is the tresillo. `rotate` shifts the pattern left by that\nmany steps. instrument: a drum-map name (kick/snare/chat/ohat/clap/ride/...) or\na raw MIDI number. `humanize` is max +/- velocity jitter.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "instrument": {
            "default": "kick",
            "title": "Instrument",
            "type": "string"
          },
          "pulses": {
            "default": 3,
            "title": "Pulses",
            "type": "integer"
          },
          "steps": {
            "default": 8,
            "title": "Steps",
            "type": "integer"
          },
          "bars": {
            "default": 2,
            "title": "Bars",
            "type": "integer"
          },
          "rotate": {
            "default": 0,
            "title": "Rotate",
            "type": "integer"
          },
          "velocity": {
            "default": 100,
            "title": "Velocity",
            "type": "integer"
          },
          "humanize": {
            "default": 6,
            "title": "Humanize",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "generate_euclidean_drumsArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_genre_progression",
      "group": "generators",
      "description": "Build a genre-idiomatic chord progression and write it as voiced chords.\nREPLACES existing notes.\n\ngenre: lofi/boom_bap/hip_hop/trap/house/deep_house/techno/trance/dnb/rnb/\nneo_soul/jazz/bossa_nova/ambient/synthwave/pop/afrobeats/amapiano/... (fuzzy\nmatched). The genre's scale-degree grammar is transposed into key+scale, then\nvoiced (see generate_voiced_progression for the style options). bars = number\nof chords (the grammar loops). Returns the chord symbols it used.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "genre": {
            "title": "Genre",
            "type": "string"
          },
          "key": {
            "default": "C",
            "title": "Key",
            "type": "string"
          },
          "scale": {
            "default": "minor",
            "title": "Scale",
            "type": "string"
          },
          "bars": {
            "default": 4,
            "title": "Bars",
            "type": "integer"
          },
          "style": {
            "default": "rootless",
            "title": "Style",
            "type": "string"
          },
          "beats_per_chord": {
            "default": 4.0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "center_pitch": {
            "default": 60,
            "title": "Center Pitch",
            "type": "integer"
          },
          "velocity": {
            "default": 64,
            "title": "Velocity",
            "type": "integer"
          },
          "voices": {
            "default": 4,
            "title": "Voices",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "genre"
        ],
        "title": "generate_genre_progressionArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_groove",
      "group": "generators",
      "description": "Write a pocketed drum groove into a Session clip. REPLACES existing notes.\n\nstyle: lofi | boom_bap | house | trap | jazz | funk. pocket: beats to lay\nevery hit behind the beat (0.0-0.1). swing: off-beat hat delay (0.5 straight\n.. ~0.66). ghost: 0-1 probability of soft ghost snares between backbeats.\nhumanize: max +/- velocity deviation. Uses the standard Live drum map.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "style": {
            "default": "lofi",
            "title": "Style",
            "type": "string"
          },
          "bars": {
            "default": 2,
            "title": "Bars",
            "type": "integer"
          },
          "pocket": {
            "default": 0.02,
            "title": "Pocket",
            "type": "number"
          },
          "swing": {
            "default": 0.55,
            "title": "Swing",
            "type": "number"
          },
          "ghost": {
            "default": 0.3,
            "title": "Ghost",
            "type": "number"
          },
          "humanize": {
            "default": 8,
            "title": "Humanize",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "generate_grooveArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_melody",
      "group": "generators",
      "description": "Write a voice-led melody over a chord progression. REPLACES existing notes.\n\nNotes come from key+scale, biased to chord tones on strong beats, chosen by\nnearest-pitch voice-leading (small steps), with optional chromatic approach\nnotes. progression: dash-/comma-separated symbols. key: e.g. \"C\", \"F#\", \"Bb\".\nscale: major/minor/dorian/lydian/mixolydian/blues/bebop/minor_pentatonic/...\ndensity: low|medium|high (note rate). phrase_arc: rising|arch|ascend_descend|\nstatic (register contour). chromatic: 0-1 approach-note probability. low/high\nbound the register (MIDI). swing: 0.5 straight .. ~0.66.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "progression": {
            "title": "Progression",
            "type": "string"
          },
          "key": {
            "default": "C",
            "title": "Key",
            "type": "string"
          },
          "scale": {
            "default": "minor",
            "title": "Scale",
            "type": "string"
          },
          "beats_per_chord": {
            "default": 4.0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "density": {
            "default": "medium",
            "title": "Density",
            "type": "string"
          },
          "low": {
            "default": 60,
            "title": "Low",
            "type": "integer"
          },
          "high": {
            "default": 84,
            "title": "High",
            "type": "integer"
          },
          "phrase_arc": {
            "default": "arch",
            "title": "Phrase Arc",
            "type": "string"
          },
          "chromatic": {
            "default": 0.15,
            "title": "Chromatic",
            "type": "number"
          },
          "swing": {
            "default": 0.5,
            "title": "Swing",
            "type": "number"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "progression"
        ],
        "title": "generate_melodyArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_phase",
      "group": "generators",
      "description": "Write a Steve-Reich phasing pattern into a Session clip. REPLACES the\nclip's notes if it already exists.\n\nBuilds a short one-voice motif (each pitch a ``note_length``-beat note, back\nto back) from ``pitches`` -- a space-/comma-separated list of MIDI numbers,\ne.g. \"60 62 64 67 69\". Then stacks ``repeats`` copies of that motif, each copy\nstarting ``shift`` beats later than the last, so the copies drift against one\nanother. A ``shift`` smaller than the motif length (len(pitches)*note_length)\ngives the classic overlapping phase texture; ``shift`` == motif length is a\nplain loop.\n\nIf ``source_clip_index`` is given, the motif is read from that clip on the\nsame track instead of built from ``pitches``. Returns a short summary.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "pitches": {
            "default": "60 62 64 67 69",
            "title": "Pitches",
            "type": "string"
          },
          "note_length": {
            "default": 0.5,
            "title": "Note Length",
            "type": "number"
          },
          "repeats": {
            "default": 8,
            "title": "Repeats",
            "type": "integer"
          },
          "shift": {
            "default": 0.25,
            "title": "Shift",
            "type": "number"
          },
          "velocity": {
            "default": 90,
            "title": "Velocity",
            "type": "integer"
          },
          "source_clip_index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Source Clip Index"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "generate_phaseArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_voiced_progression",
      "group": "generators",
      "description": "Write voice-led jazz chord voicings into a Session clip. REPLACES existing notes.\n\nprogression: dash-/comma-separated symbols, e.g. \"Am9-Dm7-G13-Cmaj7\".\nstyle: rootless (3-7-9-13 stack, no root), quartal (stacked 4ths), shell\n(root-3-7), or block (close-position). Smooth voice-leading is applied between\nchords. center_pitch biases register (60 = C3 in Live). voices caps notes per\nchord; humanize is max +/- velocity jitter.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "progression": {
            "title": "Progression",
            "type": "string"
          },
          "style": {
            "default": "rootless",
            "title": "Style",
            "type": "string"
          },
          "beats_per_chord": {
            "default": 4.0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "center_pitch": {
            "default": 60,
            "title": "Center Pitch",
            "type": "integer"
          },
          "velocity": {
            "default": 64,
            "title": "Velocity",
            "type": "integer"
          },
          "voices": {
            "default": 4,
            "title": "Voices",
            "type": "integer"
          },
          "humanize": {
            "default": 4,
            "title": "Humanize",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "progression"
        ],
        "title": "generate_voiced_progressionArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "generate_walking_bass",
      "group": "generators",
      "description": "Write a quarter-note walking bass line under a progression. REPLACES notes.\n\nRoot on beat 1, chord/scale tones through the bar, chromatic approach into the\nnext chord's root on the last beat, with occasional soft ghost notes.\nprogression: dash-/comma-separated symbols. key/scale set the passing-tone\npool. octave: 1 = very low (C1), 2 = typical bass (C2). ghost: 0-1 offbeat\nghost-note probability.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "progression": {
            "title": "Progression",
            "type": "string"
          },
          "key": {
            "default": "C",
            "title": "Key",
            "type": "string"
          },
          "scale": {
            "default": "minor",
            "title": "Scale",
            "type": "string"
          },
          "beats_per_chord": {
            "default": 4.0,
            "title": "Beats Per Chord",
            "type": "number"
          },
          "octave": {
            "default": 2,
            "title": "Octave",
            "type": "integer"
          },
          "ghost": {
            "default": 0.15,
            "title": "Ghost",
            "type": "number"
          },
          "velocity": {
            "default": 90,
            "title": "Velocity",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "progression"
        ],
        "title": "generate_walking_bassArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "get_arrangement_clips",
      "group": "arrangement",
      "description": "\nList all clips placed in the Arrangement timeline for a track.\n\nReturns each clip's name, start_time, end_time, length, and type.\n\nParameters:\n- track_index: The index of the track to inspect\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "get_arrangement_clipsArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_browser_items_at_path",
      "group": "browser",
      "description": "\nGet browser items at a specific path in Ableton's browser.\n\nParameters:\n- path: Path in the format \"category/folder/subfolder\"\n        where category is one of the available browser categories in Ableton\n",
      "inputSchema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "get_browser_items_at_pathArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_browser_tree",
      "group": "browser",
      "description": "List the browser's top-level categories and their immediate entries.\nNOTE: returns a shallow listing (no deep hierarchy) - drill down with\nget_browser_items_at_path(\"instruments\"), ...(\"sounds/Piano & Keys\"), etc.,\nor skip straight to search_browser when you know a name.\ncategory_type: \"all\", \"instruments\", \"sounds\", \"drums\", \"audio_effects\", \"midi_effects\".\n",
      "inputSchema": {
        "properties": {
          "category_type": {
            "default": "all",
            "title": "Category Type",
            "type": "string"
          }
        },
        "title": "get_browser_treeArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_clip_info",
      "group": "clips",
      "description": "Full clip state: loop points, markers, playing position, per-clip time\nsignature; for audio clips also file path, gain display, and warp markers.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "get_clip_infoArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_clip_notes",
      "group": "clips",
      "description": "Return every MIDI note in an existing Session-view MIDI clip.\n\nEach note includes pitch, start time, duration, velocity, and mute state;\nnewer Live versions may add expression fields. This is read-only and fails\nfor an empty slot or audio clip. Use get_clip_info for clip properties.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "get_clip_notesArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "idempotentHint": true
      }
    },
    {
      "name": "get_device_parameters",
      "group": "devices",
      "description": "List all parameters of a device on a track: names, values, ranges, display strings.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index"
        ],
        "title": "get_device_parametersArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_device_routing",
      "group": "devices",
      "description": "Read a device's audio-input (sidechain) routing: current input type/channel\nand the available options. Only sidechain-capable devices (Compressor, Gate)\nhave this. Use the options with set_device_routing to pick a sidechain source.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index"
        ],
        "title": "get_device_routingArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_drum_pads",
      "group": "devices",
      "description": "List a Drum Rack's occupied pads (MIDI note, name, mute, solo).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index"
        ],
        "title": "get_drum_padsArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_grooves",
      "group": "clips",
      "description": "List grooves in the Groove Pool (index + name) and the global groove amount.",
      "inputSchema": {
        "properties": {},
        "title": "get_groovesArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_group_info",
      "group": "tracks",
      "description": "Report a track's group state: whether it is a foldable group track, whether\nit is inside a group, its fold state, and its parent group's name.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "get_group_infoArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_locators",
      "group": "session",
      "description": "List arrangement locators (index, name, beat time) for structure-aware\nnavigation. Jump with jump_to_locator.",
      "inputSchema": {
        "properties": {},
        "title": "get_locatorsArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_master_device_parameters",
      "group": "devices",
      "description": "List parameters of a device on the Master track.",
      "inputSchema": {
        "properties": {
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "device_index"
        ],
        "title": "get_master_device_parametersArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_master_meters",
      "group": "tracks",
      "description": "Read the Master track's output meters - values pinned near 1.0 during\nplayback mean the master is clipping; pull set_master_volume down.",
      "inputSchema": {
        "properties": {},
        "title": "get_master_metersArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_rack_chains",
      "group": "devices",
      "description": "List an Instrument/Effect Rack's chains and the devices inside each -\npreviously unreachable nested devices. Use set_chain_device_parameter to\ncontrol them.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index"
        ],
        "title": "get_rack_chainsArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_return_device_parameters",
      "group": "devices",
      "description": "List parameters of a device on a Return track: names, values, min/max,\ndisplay strings. Call before set_return_device_parameter.",
      "inputSchema": {
        "properties": {
          "return_index": {
            "title": "Return Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          }
        },
        "required": [
          "return_index",
          "device_index"
        ],
        "title": "get_return_device_parametersArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_return_tracks",
      "group": "tracks",
      "description": "List return tracks (index + name).",
      "inputSchema": {
        "properties": {},
        "title": "get_return_tracksArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_scale_info",
      "group": "session",
      "description": "Read the song's scale and tuning: scale name, root note, scale intervals, and\nthe active tuning system (microtonal, Live 12.3+) if any. Set the scale with\nset_song_scale; tune device parameters (e.g. Wavetable) with set_device_parameter.",
      "inputSchema": {
        "properties": {},
        "title": "get_scale_infoArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_session_info",
      "group": "session",
      "description": "Return global Live-set and transport state without modifying the set.\n\nIncludes tempo, song time signature, playback position/state, Arrangement\nloop, track/return/scene counts, scene names, key/scale, record mode, launch\nquantization, Master volume/pan, and Live version. Use get_track_info for a\nsingle track's clips/devices, or get_session_snapshot for a compact overview\nof every track.\n",
      "inputSchema": {
        "properties": {},
        "title": "get_session_infoArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "idempotentHint": true
      }
    },
    {
      "name": "get_session_snapshot",
      "group": "session",
      "description": "One-call overview of the whole set: tempo, time signature, play state, and\nfor every track its name, type, mute/solo/arm, volume, clip count, and device\nnames, plus return-track names. Prefer this over many get_track_info calls.",
      "inputSchema": {
        "properties": {},
        "title": "get_session_snapshotArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_track_info",
      "group": "tracks",
      "description": "Return detailed state for one regular track without modifying the set.\n\nIncludes name/type, mixer and arm/mute/solo state, sends, freeze/color state,\nplaying/fired slot indices, every Session slot's basic clip state, and the\ndevice-chain names/types. Use get_session_info for global transport state,\nget_device_parameters for parameter values, or get_clip_info for full clip\nproperties.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "get_track_infoArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "idempotentHint": true
      }
    },
    {
      "name": "get_track_meters",
      "group": "tracks",
      "description": "Read a track's output level meters (post-fader): left/right 0.0-1.0ish\n(0.85 ≈ 0 dB, like faders). Poll during playback to judge balance/clipping -\nthis is how you 'listen' without exporting.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "get_track_metersArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_track_routing",
      "group": "tracks",
      "description": "Read a track's input/output routing (current + all available options)\nand monitoring state (0=In, 1=Auto, 2=Off). Routing options are identified\nby display_name - use those strings with set_track_routing.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "get_track_routingArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "humanize_clip",
      "group": "generators",
      "description": "Read a MIDI clip, apply timing + velocity humanization, and write it back.\nREPLACES the clip's notes with the jittered version.\n\ntiming: max +/- start-time deviation in beats. velocity: max +/- velocity\ndeviation. Pitches are preserved; times stay non-negative. seed makes it\nreproducible.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "timing": {
            "default": 0.02,
            "title": "Timing",
            "type": "number"
          },
          "velocity": {
            "default": 8,
            "title": "Velocity",
            "type": "integer"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Seed"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "humanize_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "jump_by",
      "group": "session",
      "description": "Move the playhead by a relative number of beats (negative moves back).\nWorks during playback for on-the-fly navigation.",
      "inputSchema": {
        "properties": {
          "beats": {
            "title": "Beats",
            "type": "number"
          }
        },
        "required": [
          "beats"
        ],
        "title": "jump_byArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "jump_to_cue",
      "group": "session",
      "description": "Jump the playhead to the next locator/cue (direction >= 0) or the previous\none (direction < 0).",
      "inputSchema": {
        "properties": {
          "direction": {
            "default": 1,
            "title": "Direction",
            "type": "integer"
          }
        },
        "title": "jump_to_cueArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "jump_to_locator",
      "group": "session",
      "description": "Move the playhead to a locator (index from get_locators).",
      "inputSchema": {
        "properties": {
          "locator_index": {
            "title": "Locator Index",
            "type": "integer"
          }
        },
        "required": [
          "locator_index"
        ],
        "title": "jump_to_locatorArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "list_known_devices",
      "group": "devices",
      "description": "List the devices that describe_device has curated guidance for.",
      "inputSchema": {
        "properties": {},
        "title": "list_known_devicesArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "list_recipes",
      "group": "recipes",
      "description": "List the built-in composition recipes (name, description, and default\ntempo/key/scale/bars), for use with apply_recipe.",
      "inputSchema": {
        "properties": {},
        "title": "list_recipesArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "load_device_to_master",
      "group": "devices",
      "description": "Load a device/effect from the browser onto the Master/Main track (e.g. a limiter for mastering).",
      "inputSchema": {
        "properties": {
          "item_uri": {
            "title": "Item Uri",
            "type": "string"
          }
        },
        "required": [
          "item_uri"
        ],
        "title": "load_device_to_masterArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "load_device_to_return",
      "group": "devices",
      "description": "Append one loadable browser device or preset to a return track's chain.\n\nObtain `item_uri` from search_browser. Loading selects the return track in\nLive and creates a new device, so repeated calls add duplicates. Prefer audio\neffects on returns; use load_instrument_or_effect for a regular track or\nload_device_to_master for the Master chain.\n",
      "inputSchema": {
        "properties": {
          "return_index": {
            "description": "Zero-based return-track index; 0 is Return A.",
            "minimum": 0,
            "title": "Return Index",
            "type": "integer"
          },
          "item_uri": {
            "description": "Loadable browser-item URI returned by search_browser.",
            "title": "Item Uri",
            "type": "string"
          }
        },
        "required": [
          "return_index",
          "item_uri"
        ],
        "title": "load_device_to_returnArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "load_drum_kit",
      "group": "browser",
      "description": "Load a Drum Rack, then the first loadable kit at a browser path.\n\nUse search_browser to obtain the rack URI and get_browser_items_at_path to\nverify the kit path. This is a two-step mutation: it appends the rack first,\nthen loads the first loadable item found at `kit_path`. If path lookup fails,\nthe new empty rack remains on the track; repeated calls add more racks. Use\nload_instrument_or_effect when one known browser URI is sufficient.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "rack_uri": {
            "description": "Loadable browser-item URI returned by search_browser.",
            "title": "Rack Uri",
            "type": "string"
          },
          "kit_path": {
            "description": "Slash-separated Live browser path, such as \"drums/acoustic\".",
            "title": "Kit Path",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "rack_uri",
          "kit_path"
        ],
        "title": "load_drum_kitArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false
      }
    },
    {
      "name": "load_instrument_or_effect",
      "group": "devices",
      "description": "\nLoad an instrument or effect onto a track using its URI.\n\nParameters:\n- track_index: The index of the track to load the instrument on\n- uri: The URI of the instrument or effect to load (e.g., 'query:Synths#Instrument%20Rack:Bass:FileId_5116')\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "uri": {
            "title": "Uri",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "uri"
        ],
        "title": "load_instrument_or_effectArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "preview_browser_item",
      "group": "browser",
      "description": "Audition a browser item (a sample, instrument, or preset) through Live's\npreview tab WITHOUT loading it onto a track. `item_uri` comes from\nsearch_browser or get_browser_items_at_path. Use stop_browser_preview to stop.",
      "inputSchema": {
        "properties": {
          "item_uri": {
            "title": "Item Uri",
            "type": "string"
          }
        },
        "required": [
          "item_uri"
        ],
        "title": "preview_browser_itemArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "quantize_clip",
      "group": "clips",
      "description": "Quantize a MIDI clip. grid: quarter/eighth/eighth_triplet/sixteenth/sixteenth_triplet/thirtysecond.\namount 0.0-1.0 (use <1.0 to humanize toward the grid without full snap).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "grid": {
            "default": "sixteenth",
            "title": "Grid",
            "type": "string"
          },
          "amount": {
            "default": 1.0,
            "title": "Amount",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "quantize_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "rack_variation",
      "group": "devices",
      "description": "Rack macro snapshots. action: \"store\" (save current macros as a\nvariation), \"recall\" (restore variation `index`), \"randomize\" (randomize\nall macro knobs - instant sound-design exploration).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "action": {
            "title": "Action",
            "type": "string"
          },
          "index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Index"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "action"
        ],
        "title": "rack_variationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "re_enable_automation",
      "group": "session",
      "description": "Restore automation that was overridden by manual parameter changes.\nIMPORTANT: setting a device parameter that has an envelope overrides the\nenvelope until this is called.",
      "inputSchema": {
        "properties": {},
        "title": "re_enable_automationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "record_section",
      "group": "audio",
      "description": "Bounce a section of the arrangement to an audio file WITHOUT the Export\ndialog, so you can hear an internal signal. Creates a temporary audio track,\nroutes its input to `source` (\"Resampling\" = the master output, or a track's\nname for that track's output), arms it, and records from start_beat to end_beat\nin REAL TIME (a 4-bar section takes about 4 bars of wall-clock; capped at\n5 minutes). Returns the recorded WAV path. Set cleanup=False to keep the\nrecording track. Runs the transport and adds an arrangement clip.",
      "inputSchema": {
        "properties": {
          "start_beat": {
            "title": "Start Beat",
            "type": "number"
          },
          "end_beat": {
            "title": "End Beat",
            "type": "number"
          },
          "source": {
            "default": "Resampling",
            "title": "Source",
            "type": "string"
          },
          "cleanup": {
            "default": true,
            "title": "Cleanup",
            "type": "boolean"
          }
        },
        "required": [
          "start_beat",
          "end_beat"
        ],
        "title": "record_sectionArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "redo",
      "group": "session",
      "description": "Redo the last undone action in Live.",
      "inputSchema": {
        "properties": {},
        "title": "redoArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "replace_simpler_sample",
      "group": "devices",
      "description": "Replace a Simpler sample with an absolute local audio-file path. Requires Live 12.4+\nAND runtime API support; otherwise fails before writing. Replaces musical content:\nconfirm the target and preserve the original set. Readback is not an audio audition.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "path"
        ],
        "title": "replace_simpler_sampleArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true
      }
    },
    {
      "name": "save_set",
      "group": "session",
      "description": "Save the current Live set to its existing file, if the Live API supports it\n(it does not on most versions). Returns whether the API call is available and\nwhether the save succeeded. To save under a new name/path, use the GUI Save-As.",
      "inputSchema": {
        "properties": {},
        "title": "save_setArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "search_browser",
      "group": "browser",
      "description": "Search the Ableton browser by display name (case-insensitive substring).\nReturns loadable items with their URIs for load_instrument_or_effect /\nload_device_to_master / load_device_to_return.\n\ncategory: optionally limit to one of \"instruments\", \"sounds\", \"drums\",\n\"audio_effects\", \"midi_effects\", \"packs\" (default: search all of them).\nPrefer this over walking get_browser_items_at_path when you know a name.\n",
      "inputSchema": {
        "properties": {
          "query": {
            "title": "Query",
            "type": "string"
          },
          "category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Category"
          },
          "max_results": {
            "default": 25,
            "title": "Max Results",
            "type": "integer"
          }
        },
        "required": [
          "query"
        ],
        "title": "search_browserArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "session_diff",
      "group": "analysis",
      "description": "Report what changed in the set since the LAST time you called this tool:\ntempo/time-signature/play-state, tracks added, removed, renamed or reordered, and per-track volume,\nmute, solo, arm, clip-count, and device changes. The first call records a\nbaseline (no diff). Track IDs are scoped to the running bridge; older bridges\ncannot identify renames reliably. Call it before and after an edit to verify it took effect.",
      "inputSchema": {
        "properties": {},
        "title": "session_diffArguments",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "set_ableton_link",
      "group": "session",
      "description": "Enable or disable Ableton Link, which syncs tempo and phase with other\nLink-enabled apps and devices on the local network.",
      "inputSchema": {
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_ableton_linkArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_arrangement_overdub",
      "group": "session",
      "description": "Toggle arrangement overdub: recording layers MIDI onto existing\narrangement clips instead of replacing them.",
      "inputSchema": {
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_arrangement_overdubArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_arrangement_time",
      "group": "arrangement",
      "description": "\nMove the arrangement playhead to a specific position.\n\nParameters:\n- time: Position in beats from the start of the arrangement (e.g. 8.0 = bar 3 in 4/4)\n",
      "inputSchema": {
        "properties": {
          "time": {
            "title": "Time",
            "type": "number"
          }
        },
        "required": [
          "time"
        ],
        "title": "set_arrangement_timeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_chain_device_parameter",
      "group": "devices",
      "description": "Set a parameter on a device INSIDE a rack chain (indices from\nget_rack_chains). Values clamp to the parameter's native range.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "chain_index": {
            "title": "Chain Index",
            "type": "integer"
          },
          "chain_device_index": {
            "title": "Chain Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "title": "Parameter"
          },
          "value": {
            "title": "Value",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "chain_index",
          "chain_device_index",
          "parameter",
          "value"
        ],
        "title": "set_chain_device_parameterArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_clip_audio",
      "group": "clips",
      "description": "Set audio-clip properties. gain 0-1, pitch_coarse semitones (-48..48), pitch_fine cents,\nwarping on/off, warp_mode 0=Beats 1=Tones 2=Texture 3=Re-Pitch 4=Complex 6=Complex Pro.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "gain": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Gain"
          },
          "pitch_coarse": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Pitch Coarse"
          },
          "pitch_fine": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Pitch Fine"
          },
          "warping": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Warping"
          },
          "warp_mode": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Warp Mode"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "set_clip_audioArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_clip_color",
      "group": "clips",
      "description": "Set an existing Session clip's palette color without changing its content.\n\nThis is a visual organization change only. Use set_track_color to recolor\nthe track header instead. Repeating the same color has no additional effect.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          },
          "color_index": {
            "description": "Color index in Live's 70-color palette (0-69).",
            "maximum": 69,
            "minimum": 0,
            "title": "Color Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "color_index"
        ],
        "title": "set_clip_colorArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_clip_groove",
      "group": "clips",
      "description": "Attach a Groove Pool groove to a clip by index (swing/timing feel). Pass no groove_index to clear.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "groove_index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Groove Index"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "set_clip_grooveArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_clip_loop",
      "group": "clips",
      "description": "Update selected loop and launch markers on one existing Session clip.\n\nProvide at least one optional field; omitted fields stay unchanged. `start`\nand `end` are loop-brace positions in clip-relative beats and end must be\nafter start. `start_marker` controls where non-looped launch begins;\n`looping` enables or disables repetition. Use set_loop for the Arrangement's\nglobal loop region, not a clip, and get_clip_info to inspect current values.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          },
          "start": {
            "anyOf": [
              {
                "minimum": 0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional position in beats from the start of the clip.",
            "title": "Start"
          },
          "end": {
            "anyOf": [
              {
                "minimum": 0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional position in beats from the start of the clip.",
            "title": "End"
          },
          "start_marker": {
            "anyOf": [
              {
                "minimum": 0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional position in beats from the start of the clip.",
            "title": "Start Marker"
          },
          "looping": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional state change: true turns it on, false turns it off.",
            "title": "Looping"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "set_clip_loopArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_clip_name",
      "group": "clips",
      "description": "Rename an existing Session-view clip without changing its notes or audio.\n\nThe slot must contain a clip. Use this for the clip label; use set_track_name\nfor the track label. Repeating the same name has no additional effect.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "description": "Zero-based Session-view clip-slot index on the track.",
            "minimum": 0,
            "title": "Clip Index",
            "type": "integer"
          },
          "name": {
            "description": "New display name for the Live object.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "name"
        ],
        "title": "set_clip_nameArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_clip_signature",
      "group": "clips",
      "description": "Set a clip's own time signature (polymeter / odd-bar loops).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "numerator": {
            "title": "Numerator",
            "type": "integer"
          },
          "denominator": {
            "title": "Denominator",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "numerator",
          "denominator"
        ],
        "title": "set_clip_signatureArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_clip_trigger_quantization",
      "group": "session",
      "description": "Global launch quantization for firing clips/scenes. 0=None (instant,\ngood for auditioning), 4=1 bar (default), 7=1/4 note, 13=1/32.",
      "inputSchema": {
        "properties": {
          "value": {
            "title": "Value",
            "type": "integer"
          }
        },
        "required": [
          "value"
        ],
        "title": "set_clip_trigger_quantizationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_crossfade_assign",
      "group": "tracks",
      "description": "Assign one regular track to crossfader side A, neither side, or side B.\n\nThis configures which side affects the track; it does not move the crossfader\nor change track volume immediately. Use set_crossfader afterward to blend the\nA/B groups. Repeating the same assignment has no additional effect.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "assign": {
            "description": "Crossfader assignment: 0 is A, 1 is none, 2 is B.",
            "maximum": 2,
            "minimum": 0,
            "title": "Assign",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "assign"
        ],
        "title": "set_crossfade_assignArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_crossfader",
      "group": "tracks",
      "description": "Set the master crossfader (-1.0 = full A, 0 = center, 1.0 = full B).",
      "inputSchema": {
        "properties": {
          "value": {
            "title": "Value",
            "type": "number"
          }
        },
        "required": [
          "value"
        ],
        "title": "set_crossfaderArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_device_enabled",
      "group": "devices",
      "description": "Enable or bypass one device on a regular track.\n\n`true` turns the device on; `false` bypasses its processing while preserving\nthe device and parameter values. This changes audible signal flow but not\nclip content. Use set_track_mute to silence the whole track, or\nset_device_parameter to change one control.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "enabled": {
            "description": "True turns the requested state on; false turns it off.",
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "enabled"
        ],
        "title": "set_device_enabledArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_device_parameter",
      "group": "devices",
      "description": "Set a parameter after reading get_device_parameters. Numbers use the native range;\nstrings use display units ('250 Hz', '-6 dB') or exact enum labels. Unsupported\ndisplay mappings fail before writing. Returns Live's actual readback and warnings.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Parameter name or zero-based parameter index returned by the matching get_*_device_parameters tool.",
            "title": "Parameter"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "description": "Native number (clamped/quantized), exact enum label, or display text with Hz/kHz/ms/s/dB/% units, e.g. '250 Hz'. Unsupported mappings fail before writing.",
            "title": "Value"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "parameter",
          "value"
        ],
        "title": "set_device_parameterArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_device_routing",
      "group": "devices",
      "description": "Set a device's sidechain audio input. `field` is \"input_routing_type\" (the\nsource track/return) or \"input_routing_channel\" (Pre FX / Post FX / Post Mixer);\n`display_name` is one of the options from get_device_routing. For ducking, also\nenable the device's Sidechain parameter via set_device_parameter.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "field": {
            "title": "Field",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "field",
          "display_name"
        ],
        "title": "set_device_routingArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_drum_pad",
      "group": "devices",
      "description": "Mute/solo/rename a single Drum Rack pad by its MIDI note (e.g. 36=kick).\nPer-pad muting = instant beat variations without touching the notes.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "note": {
            "title": "Note",
            "type": "integer"
          },
          "mute": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Mute"
          },
          "solo": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Solo"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Name"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "note"
        ],
        "title": "set_drum_padArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_fold_state",
      "group": "tracks",
      "description": "Fold (collapse) or unfold a group track. Errors if the track is not a group\ntrack (see get_group_info).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "folded": {
            "default": true,
            "title": "Folded",
            "type": "boolean"
          }
        },
        "required": [
          "track_index"
        ],
        "title": "set_fold_stateArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_groove_amount",
      "group": "session",
      "description": "Set the global Groove Amount (0.0 to 1.0), which scales how strongly every\nclip's assigned groove is applied across the whole set.",
      "inputSchema": {
        "properties": {
          "amount": {
            "title": "Amount",
            "type": "number"
          }
        },
        "required": [
          "amount"
        ],
        "title": "set_groove_amountArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_loop",
      "group": "session",
      "description": "Set the global Arrangement loop region and its enabled state.\n\n`start` is an absolute beat and `length` is a positive beat duration. The\nregion is updated even when `enabled=false`; playback simply will not repeat\nit. Use set_clip_loop for a Session clip's loop braces, not the Arrangement.\n",
      "inputSchema": {
        "properties": {
          "start": {
            "description": "Position in beats from the start of the Arrangement.",
            "minimum": 0,
            "title": "Start",
            "type": "number"
          },
          "length": {
            "description": "Positive duration or region length in beats.",
            "exclusiveMinimum": 0,
            "title": "Length",
            "type": "number"
          },
          "enabled": {
            "default": true,
            "description": "True turns the requested state on; false turns it off.",
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "start",
          "length"
        ],
        "title": "set_loopArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_master_device_parameter",
      "group": "devices",
      "description": "Set one enabled parameter on a device in the Master track's chain.\n\nCall get_master_device_parameters first and use its parameter name/index and\nnative min/max; numeric out-of-range values are clamped. Display strings with\nsupported units or exact enum labels also work; unsupported mappings fail\nbefore writing. This affects the full mix. Read back the resulting display.\nUse set_device_parameter for a regular track or\nset_return_device_parameter for a return track.\n",
      "inputSchema": {
        "properties": {
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Parameter name or zero-based parameter index returned by the matching get_*_device_parameters tool.",
            "title": "Parameter"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "description": "Native number (clamped/quantized), exact enum label, or display text with Hz/kHz/ms/s/dB/% units, e.g. '250 Hz'. Unsupported mappings fail before writing.",
            "title": "Value"
          }
        },
        "required": [
          "device_index",
          "parameter",
          "value"
        ],
        "title": "set_master_device_parameterArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_master_volume",
      "group": "tracks",
      "description": "Set the Main/Master track volume. Range 0.0-1.0 where 0.85 = 0 dB.",
      "inputSchema": {
        "properties": {
          "volume": {
            "title": "Volume",
            "type": "number"
          }
        },
        "required": [
          "volume"
        ],
        "title": "set_master_volumeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_metronome",
      "group": "session",
      "description": "Turn Live's metronome click on/off.",
      "inputSchema": {
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_metronomeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_record_mode",
      "group": "session",
      "description": "Arm or disarm Live's global Arrangement Record state.\n\n`true` enables Arrangement recording; `false` disables it. Enabling alone\ndoes not record: arm the intended tracks with set_track_arm, then use\nstart_playback. Use set_session_record or trigger_session_record for Session\nslots instead. Repeating the current state has no additional effect.\n",
      "inputSchema": {
        "properties": {
          "enabled": {
            "description": "True turns the requested state on; false turns it off.",
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_record_modeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_return_device_parameter",
      "group": "devices",
      "description": "Set one enabled parameter on a device in a return track's chain.\n\nCall get_return_device_parameters first and use its parameter name/index and\nnative min/max; numeric out-of-range values are clamped. Supported display-unit\nstrings and exact enum labels also work; unsupported mappings fail before writing.\nUse set_device_parameter for\na regular track or set_master_device_parameter for the full-mix chain.\n",
      "inputSchema": {
        "properties": {
          "return_index": {
            "description": "Zero-based return-track index; 0 is Return A.",
            "minimum": 0,
            "title": "Return Index",
            "type": "integer"
          },
          "device_index": {
            "description": "Zero-based device position in the target track's device chain.",
            "minimum": 0,
            "title": "Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Parameter name or zero-based parameter index returned by the matching get_*_device_parameters tool.",
            "title": "Parameter"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ],
            "description": "Native number (clamped/quantized), exact enum label, or display text with Hz/kHz/ms/s/dB/% units, e.g. '250 Hz'. Unsupported mappings fail before writing.",
            "title": "Value"
          }
        },
        "required": [
          "return_index",
          "device_index",
          "parameter",
          "value"
        ],
        "title": "set_return_device_parameterArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_scene_name",
      "group": "session",
      "description": "Rename one Session-view scene without changing any clips in the row.\n\nUse set_clip_name for an individual clip. Repeating the same name has no\nadditional effect.\n",
      "inputSchema": {
        "properties": {
          "scene_index": {
            "description": "Zero-based Session-view scene (row) index.",
            "minimum": 0,
            "title": "Scene Index",
            "type": "integer"
          },
          "name": {
            "description": "New display name for the Live object.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "scene_index",
          "name"
        ],
        "title": "set_scene_nameArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_send",
      "group": "tracks",
      "description": "Set a track's send level (send_index 0 = Return A, 1 = Return B, ...). Range 0.0-1.0.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "send_index": {
            "title": "Send Index",
            "type": "integer"
          },
          "value": {
            "title": "Value",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "send_index",
          "value"
        ],
        "title": "set_sendArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_session_automation_record",
      "group": "session",
      "description": "Toggle recording of parameter changes into Session clip envelopes -\nan alternative to write_automation for captured knob rides.",
      "inputSchema": {
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_session_automation_recordArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_session_record",
      "group": "session",
      "description": "Toggle Session record (records into armed tracks' selected Session slots;\nalso enables MIDI overdub into playing clips).",
      "inputSchema": {
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "title": "set_session_recordArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_simpler_playback_mode",
      "group": "devices",
      "description": "Set a Simpler device's playback mode: 0 = Classic, 1 = One-Shot, 2 = Slicing.\nSlicing chops the sample into playable slices, central to lofi/hip-hop\nsampling. Errors if the device at that index is not a Simpler.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "mode": {
            "title": "Mode",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "device_index",
          "mode"
        ],
        "title": "set_simpler_playback_modeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_song_scale",
      "group": "session",
      "description": "Set the song's key context. root_note 0-11 (0=C, 2=D...), scale_name e.g.\n\"Major\", \"Minor\", \"Dorian\". Read current values via get_session_info.",
      "inputSchema": {
        "properties": {
          "root_note": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Root Note"
          },
          "scale_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Scale Name"
          }
        },
        "title": "set_song_scaleArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_swing_amount",
      "group": "session",
      "description": "Set the global swing amount (0.0 to 1.0) used when quantizing with swing.",
      "inputSchema": {
        "properties": {
          "amount": {
            "title": "Amount",
            "type": "number"
          }
        },
        "required": [
          "amount"
        ],
        "title": "set_swing_amountArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_tempo",
      "group": "session",
      "description": "\nSet the tempo of the Ableton session.\n\nParameters:\n- tempo: The new tempo in BPM\n",
      "inputSchema": {
        "properties": {
          "tempo": {
            "title": "Tempo",
            "type": "number"
          }
        },
        "required": [
          "tempo"
        ],
        "title": "set_tempoArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_time_signature",
      "group": "session",
      "description": "Set the Live set's global time signature, such as 4/4, 3/4, or 6/8.\n\nThis changes bar/grid and metronome interpretation but does not rewrite clip\nnotes. Use set_clip_signature instead when only one clip needs a different\nmeter for polymeter. Repeating the same signature has no additional effect.\n",
      "inputSchema": {
        "properties": {
          "numerator": {
            "description": "Number of beats per bar, such as 4 in 4/4.",
            "minimum": 1,
            "title": "Numerator",
            "type": "integer"
          },
          "denominator": {
            "description": "Beat-note denominator, such as 4 in 4/4 or 8 in 6/8.",
            "minimum": 1,
            "title": "Denominator",
            "type": "integer"
          }
        },
        "required": [
          "numerator",
          "denominator"
        ],
        "title": "set_time_signatureArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_track_arm",
      "group": "tracks",
      "description": "Arm or disarm a track for recording (fails on tracks that can't be armed,\ne.g. group/return tracks).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "arm": {
            "title": "Arm",
            "type": "boolean"
          }
        },
        "required": [
          "track_index",
          "arm"
        ],
        "title": "set_track_armArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_track_color",
      "group": "tracks",
      "description": "Set a track's color by index (0-69 in Live's palette).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "color_index": {
            "title": "Color Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "color_index"
        ],
        "title": "set_track_colorArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_track_monitoring",
      "group": "tracks",
      "description": "Set input monitoring: 0=In (always hear input), 1=Auto, 2=Off.\nRequired for resampling/bounce workflows.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "state": {
            "title": "State",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "state"
        ],
        "title": "set_track_monitoringArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_track_mute",
      "group": "tracks",
      "description": "Set one regular track's mute state (`true` mutes; `false` unmutes).\n\nMuting silences that track in Live but preserves its clips, devices, and\nmixer settings. Use set_track_solo to audition a track relative to the rest,\nor stop_clip when only Session clip playback should stop.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "mute": {
            "description": "True turns the requested state on; false turns it off.",
            "title": "Mute",
            "type": "boolean"
          }
        },
        "required": [
          "track_index",
          "mute"
        ],
        "title": "set_track_muteArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_track_name",
      "group": "tracks",
      "description": "\nSet the name of a track.\n\nParameters:\n- track_index: The index of the track to rename\n- name: The new name for the track\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "name"
        ],
        "title": "set_track_nameArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_track_pan",
      "group": "tracks",
      "description": "Set one regular track's stereo pan position; 0.0 is centered.\n\nLive clamps the value to the track's native range. This changes mixer state,\nnot the audio file or clip content. Use set_master_device_parameter for a\ndevice control, and set_crossfader for A/B crossfading.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "pan": {
            "description": "Pan position from -1.0 (left) to 1.0 (right).",
            "maximum": 1,
            "minimum": -1,
            "title": "Pan",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "pan"
        ],
        "title": "set_track_panArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_track_routing",
      "group": "tracks",
      "description": "Set track routing by display name. field: input_routing_type |\noutput_routing_type | input_routing_channel | output_routing_channel.\nEnables sidechain sources, bus routing, and resampling (route a track's\noutput into another track's input, arm, record). Get options from\nget_track_routing first.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "field": {
            "title": "Field",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          }
        },
        "required": [
          "track_index",
          "field",
          "display_name"
        ],
        "title": "set_track_routingArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "set_track_solo",
      "group": "tracks",
      "description": "Set one regular track's solo state (`true` solos; `false` unsolos).\n\nSolo changes monitoring relative to other tracks and does not alter clip or\ndevice content. Other tracks may remain soloed, so clear them separately when\nexclusive auditioning is required. Use set_track_mute to silence this track.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "description": "Zero-based index of a regular track in the Live set.",
            "minimum": 0,
            "title": "Track Index",
            "type": "integer"
          },
          "solo": {
            "description": "True turns the requested state on; false turns it off.",
            "title": "Solo",
            "type": "boolean"
          }
        },
        "required": [
          "track_index",
          "solo"
        ],
        "title": "set_track_soloArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true
      }
    },
    {
      "name": "set_track_volume",
      "group": "tracks",
      "description": "Set track volume. Range 0.0-1.0 where 0.85 = 0 dB (unity gain).",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "volume": {
            "title": "Volume",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "volume"
        ],
        "title": "set_track_volumeArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "setup_session",
      "group": "generators",
      "description": "Bootstrap a session in one call: set tempo and create named MIDI tracks,\noptionally loading an instrument found by name for each.\n\ntracks: [{\"name\": \"Drums\", \"instrument\": \"drum kit\"}, {\"name\": \"Bass\",\n\"instrument\": \"upright bass\"}, ...]. \"instrument\" is a search_browser query\n(best match is loaded); omit it to create an empty track.\nReturns a per-track report with the loaded item names.\n",
      "inputSchema": {
        "properties": {
          "tempo": {
            "title": "Tempo",
            "type": "number"
          },
          "tracks": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "title": "Tracks",
            "type": "array"
          }
        },
        "required": [
          "tempo",
          "tracks"
        ],
        "title": "setup_sessionArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "start_playback",
      "group": "session",
      "description": "Start Arrangement playback from the current song time. NOTE: the response\nreports the PRE-command state (may say playing=false right after starting) -\nconfirm with get_session_info.\n",
      "inputSchema": {
        "properties": {},
        "title": "start_playbackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "stop_all_clips",
      "group": "session",
      "description": "Stop every playing Session clip (does not stop the transport).",
      "inputSchema": {
        "properties": {},
        "title": "stop_all_clipsArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "stop_browser_preview",
      "group": "browser",
      "description": "Stop the browser preview started by preview_browser_item.",
      "inputSchema": {
        "properties": {},
        "title": "stop_browser_previewArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "stop_clip",
      "group": "clips",
      "description": "\nStop playing a clip.\n\nParameters:\n- track_index: The index of the track containing the clip\n- clip_index: The index of the clip slot containing the clip\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          }
        },
        "required": [
          "track_index",
          "clip_index"
        ],
        "title": "stop_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "stop_playback",
      "group": "session",
      "description": "Stop playback. NOTE: the response reports the PRE-command state - confirm\nwith get_session_info.\n",
      "inputSchema": {
        "properties": {},
        "title": "stop_playbackArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "switch_to_arrangement_view",
      "group": "arrangement",
      "description": "Switch Ableton's main window to the Arrangement view.\n\nParameters:\n",
      "inputSchema": {
        "properties": {},
        "title": "switch_to_arrangement_viewArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "tap_tempo",
      "group": "session",
      "description": "Tap the tempo once. Tapping repeatedly at a beat sets the tempo to that\nrate; a single tap nudges the transport. Returns the resulting tempo.",
      "inputSchema": {
        "properties": {},
        "title": "tap_tempoArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "transform_clip",
      "group": "generators",
      "description": "Read a MIDI clip's notes, apply a classical motif transformation, and write\nthe result. Overwrites the source clip unless ``dest_clip_index`` is given\n(in which case that destination slot is REPLACED instead).\n\nop (one of):\n  transpose  - shift every pitch by ``amount`` semitones (integer; may be\n               negative). Timing unchanged; out-of-range pitches clamped.\n  invert     - mirror pitches about the first note's pitch (up-motion becomes\n               down-motion). ``amount`` is ignored.\n  retrograde - play the motif backwards in time (onset order reversed,\n               durations preserved). ``amount`` is ignored.\n  augment    - scale start times and durations by ``amount`` (a factor > 1\n               stretches/slows, 0 < ``amount`` < 1 compresses/speeds up).\n               Requires ``amount`` > 0.\n\n``amount`` therefore means semitones for transpose and a time factor for\naugment. Returns a short summary of what was written.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "op": {
            "title": "Op",
            "type": "string"
          },
          "amount": {
            "default": 0.0,
            "title": "Amount",
            "type": "number"
          },
          "dest_clip_index": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Dest Clip Index"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "op"
        ],
        "title": "transform_clipArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    },
    {
      "name": "trigger_session_record",
      "group": "session",
      "description": "Start Session recording into armed tracks; record_length in beats records\na fixed-length loop (e.g. 16.0 = 4 bars) then auto-switches to playback.",
      "inputSchema": {
        "properties": {
          "record_length": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Record Length"
          }
        },
        "title": "trigger_session_recordArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "undo",
      "group": "session",
      "description": "Revert the most recent undoable Live-set action.\n\nThis mutates the set and may remove newly created content or restore deleted\ncontent. It has no target parameter: Live chooses the top undo-history entry.\nUse redo to reapply an accidental undo. Prefer batch_commands for related\nedits so one undo reverts the group.\n",
      "inputSchema": {
        "properties": {},
        "title": "undoArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "write_automation",
      "group": "arrangement",
      "description": "Write clip automation for a device parameter. points = [{\"time\": beats, \"value\": v}, ...].\nReplaces any existing envelope for that parameter on the clip.",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "device_index": {
            "title": "Device Index",
            "type": "integer"
          },
          "parameter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "title": "Parameter"
          },
          "points": {
            "items": {
              "additionalProperties": {
                "type": "number"
              },
              "type": "object"
            },
            "title": "Points",
            "type": "array"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "device_index",
          "parameter",
          "points"
        ],
        "title": "write_automationArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": false
      }
    },
    {
      "name": "write_drum_grid",
      "group": "generators",
      "description": "Write drums from an ASCII grid (16th-note steps). REPLACES existing notes.\n\ngrid: one line per instrument: \"name: pattern\" where pattern chars are\n'X' (accent, vel 105), 'x' (normal, 85), 'o' (soft, 55), '.' or '-' (rest).\nLine length = number of 16th steps (16 = one 4/4 bar; 32 = two bars...).\nInstruments: kick snare rim clap chat phat ohat ltom mtom htom crash ride perc shaker,\nor a raw MIDI number (\"36: x...\").\n\nExample (one bar of lofi):\n  kick:  X..x......X.....\n  snare: ....x.......x...\n  chat:  x.o.x.o.x.o.x.o.\n",
      "inputSchema": {
        "properties": {
          "track_index": {
            "title": "Track Index",
            "type": "integer"
          },
          "clip_index": {
            "title": "Clip Index",
            "type": "integer"
          },
          "grid": {
            "title": "Grid",
            "type": "string"
          },
          "swing": {
            "default": 0.0,
            "title": "Swing",
            "type": "number"
          }
        },
        "required": [
          "track_index",
          "clip_index",
          "grid"
        ],
        "title": "write_drum_gridArguments",
        "type": "object"
      },
      "annotations": {
        "destructiveHint": true
      }
    }
  ]
}
