{"name":"io.github.wstierhout/ableton-live-mcp","slug":"wstierhout-ableton-live-mcp","title":"Ableton Live MCP Server","description":"Control Ableton Live with 156 typed tools for music production and offline .als analysis.","url":"https://mcp.market/server/wstierhout-ableton-live-mcp","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":44,"stars":17,"forks":4,"downloads_week":665,"last_push_at":"2026-09-17T13:55:20.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/wstierhout/ableton-live-mcp","website":"https://abletonmcp.com","version":"1.8.1","remotes":[],"packages":[{"registryType":"pypi","identifier":"mcp-server-ableton-live","version":"1.8.1","transport":{"type":"stdio"}}],"tools":[{"name":"_mute_of","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_notes_to_clip","description":"REPLACES the clip's entire note content with the given notes. Use edit_notes to add or remove a subset without touching the rest.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adg_analyze","description":"Full offline analysis of a .adg rack or .adv preset: named macros (name/value), the chain + device tree (recursive, incl. racks-inside-racks with each device's kind/name/on-state and any sample), legacy macro-> parameter mappings, every referenced sample (name + relative path), the required Live edition, and — for drum racks — the pad map (pad -> MIDI note, label, and sample). No Live required.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adg_edition","description":"Classify the Live edition a saved .adg/.adv needs, offline: 'suite' if any Suite-only device is present (Operator, Wavetable, Echo, Drift, Meld, Sampler, Collision, ...), else 'standard' if any Standard-only device is present (EQ Eight, Compressor, Simpler, Impulse, Drum Rack, ...), else 'intro'. Returns the verdict plus which devices drove it, so an agent can tell whether a preset will load on th","write_action":false,"price_micros":0,"input_schema":null},{"name":"adg_summary","description":"Summarize a saved .adg rack or .adv device preset WITHOUT Live running: name, rack type, total device count, top-level chain count, named-macro count, required Live edition (intro/standard/suite), and whether it is a drum kit (`is_drum_rack` is true when the preset is or wraps a Drum Rack — factory kits ship wrapped in an Instrument Rack). `path` is a filesystem path to a .adg or .adv file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_details","description":"Read mixing and arrangement detail from a saved .als, offline: the set's locators (name + beat time) and each track's fader volume, pan, and number of automation lanes. Complements als_summary for reviewing a mix without Live.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_detect_key","description":"Detect the key/scale of a saved .als file WITHOUT Live running (Krumhansl-Kessler). Pools notes from every MIDI clip in the set, or only one track when `track_index` is given. `weight` selects the histogram weighting (\"duration\", \"velocity\", \"product\", \"count\"). `path` is a filesystem path to a .als file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_diff","description":"Diff two saved .als files (e.g. song_v4.als vs song_v5.als) offline: tempo/time-signature changes, tracks added/removed by name, and per-track deltas in device chain, clip count, note count, and mute state. Great for logging what changed between versions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_extract_midi","description":"Extract MIDI notes from a track in a saved .als file, as {pitch,start,duration,velocity} dicts per clip. `track_index` is the track's position in the set (see als_summary). No Live required.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_find_unfinished","description":"Lint a saved .als for likely-unfinished work, offline: no master limiter/compressor, MIDI track with no instrument, MIDI clip with no notes, empty audio track, or muted tracks. Returns machine-readable issues so an agent can decide what to fix before rendering.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_list_tracks","description":"List every track in a saved .als file with its clips (name, MIDI/audio, start, length, looping, sample path, note count). No Live required.","write_action":false,"price_micros":0,"input_schema":null},{"name":"als_summary","description":"Summarize a saved .als file WITHOUT Live running: version/creator, tempo, time signature, and each track's kind, name, mute/solo, device names, clip count, and note count. `path` is a filesystem path to a .als file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"analyze_audio_file","description":"Measure local WAV (integer/float), AIFF/AIFF-C, FLAC, Ogg Vorbis, MP3, AAC or M4A/MP4 (AAC/ALAC) without Live: per-channel sample peak/RMS dBFS, DC offset, crest factor and full-scale samples. Analyzes the first max_seconds (default 30, maximum 120); marks partial results. Not LUFS or true peak. No upload. Compressed files are measured after decoding; this does not recover lost audio. Files are re","write_action":false,"price_micros":0,"input_schema":null},{"name":"analyze_mix","description":"Heuristic session-state checks, NOT audio, peak, LUFS or headroom measurements. Scan the current live set for inspection leads: several high faders, a muted or empty Session track, or a MIDI track without devices. External routing and Arrangement audio may explain these states. Returns machine-readable findings so you can decide what to fix. Reads the session; changes nothing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_recipe","description":"Scaffold a genre starter in one call: set the tempo, add Drums, Bass, and Chords MIDI tracks, try to load fitting instruments, and write generated parts. `name` is one from list_recipes (e.g. \"lofi_beat\", \"house_groove\"). tempo/key/scale/bars override the recipe defaults. Adds new tracks; it does not overwrite existing ones.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_automation","description":"Delete one device parameter's entire automation envelope from a clip.","write_action":true,"price_micros":0,"input_schema":null},{"name":"clip_operation","description":"Structural clip edits. op: \"duplicate_loop\" (double the loop, duplicating notes - extend 2 bars to 4 before adding variation), \"crop\" (discard material outside the loop), \"duplicate_region\" (copy notes from region_start/region_length to destination_time, optionally transposing by transposition_amount semitones; pitch=-1 means all pitches).","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_audio_clip","description":"Create a new audio clip in an audio track's clip slot by importing a file.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_clip","description":"Create an empty MIDI clip in a Session slot. Fails if the slot already has a clip (pick another clip_index or delete_clip first) or the track is an audio track. length is in beats (4.0 = one 4/4 bar). Typical chain: create_clip -> add_notes_to_clip -> fire_clip or duplicate_to_arrangement.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_locator","description":"Create or rename an Arrangement locator at an absolute beat position.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_scene","description":"Create a new scene (row of clip slots). index -1 appends at the end.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_arrangement_clip","description":"Delete a clip from the Arrangement timeline by its position in get_arrangement_clips' list. NOTE: indices of later clips on the same track shift down by one after each delete - re-read get_arrangement_clips between deletes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_clip","description":"Delete the existing Session-view clip in a slot, including its content.","write_action":true,"price_micros":0,"input_schema":null},{"name":"describe_capabilities","description":"A high-level map of this server: the tool groups and what each covers, plus the conventions to follow, so you can orient before your first call. Set ABLETON_TOOLSETS to load only some groups. For the current live state, call get_session_snapshot; for mix problems, analyze_mix.","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_device","description":"Return curated guidance for a common Ableton native device: which parameters matter, their units (note `curve` = perceptual, not proportional), sensible values, and mixing tips. `device_name` is case-insensitive (e.g. \"EQ Eight\", \"Compressor\", \"Glue Compressor\", \"Reverb\", \"Auto Filter\", \"Saturator\", \"Utility\", \"Limiter\", \"Delay\"). Pair with get_device_parameters for the live indices and ranges.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_clip_key","description":"Detect the key/scale of one Session MIDI clip (Krumhansl-Kessler). Reads the clip's notes and returns the best-fit key with a confidence (-1..1), margin over the runner-up, and the runner-up key. `weight` is how notes are weighted into the pitch-class histogram: \"duration\" (default), \"velocity\", \"product\", or \"count\". Reads only; changes nothing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_session_key","description":"Detect the overall key/scale of the whole set by pooling the notes of every MIDI track's Session clips (Krumhansl-Kessler). Gives the harmonic center of the arrangement as a whole. `weight` selects the histogram weighting (\"duration\", \"velocity\", \"product\", \"count\"). Reads only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_track_key","description":"Detect the key/scale of a whole track by pooling the notes of every Session clip it holds (Krumhansl-Kessler). Useful when a part is spread across several clips. `weight` selects the histogram weighting (\"duration\", \"velocity\", \"product\", \"count\"). Reads only; changes nothing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_clip_to","description":"Copy a Session clip to any other track/scene slot (overwrites the destination slot). The cross-track way to build variations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_to_arrangement","description":"Copy a Session-view clip into the Arrangement timeline.","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_notes","description":"Edit a subset of notes in a MIDI clip without rewriting all of them. add = [{pitch,start_time,duration,velocity,mute}], remove = [{pitch,start_time}] (matched by pitch+start).","write_action":false,"price_micros":0,"input_schema":null},{"name":"fire_clip","description":"Launch one existing Session-view clip using Live's launch quantization.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fire_scene","description":"Launch a Session-view scene using Live's launch quantization.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_additive","description":"Write a Philip-Glass additive process into a Session clip. REPLACES the clip's notes if it already exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_bassline","description":"Write a bassline following a chord progression. REPLACES existing notes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_chord_progression","description":"Generate voiced chords and write them into one Session-view MIDI clip.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_drum_pattern","description":"Write a genre drum pattern into a Session clip on a Drum Rack track. REPLACES the clip's notes if the clip exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_euclidean_drums","description":"Write a Euclidean (Bjorklund) rhythm for one drum voice into a Session clip. REPLACES the clip's notes if the clip exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_genre_progression","description":"Build a genre-idiomatic chord progression and write it as voiced chords. REPLACES existing notes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_groove","description":"Write a pocketed drum groove into a Session clip. REPLACES existing notes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_melody","description":"Write a voice-led melody over a chord progression. REPLACES existing notes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_phase","description":"Write a Steve-Reich phasing pattern into a Session clip. REPLACES the clip's notes if it already exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_voiced_progression","description":"Write voice-led jazz chord voicings into a Session clip. REPLACES existing notes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"generate_walking_bass","description":"Write a quarter-note walking bass line under a progression. REPLACES notes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_arrangement_clips","description":"List all clips placed in the Arrangement timeline for a track.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_browser_items_at_path","description":"Get browser items at a specific path in Ableton's browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_browser_tree","description":"List the browser's top-level categories and their immediate entries. NOTE: returns a shallow listing (no deep hierarchy) - drill down with get_browser_items_at_path(\"instruments\"), ...(\"sounds/Piano & Keys\"), etc., or skip straight to search_browser when you know a name. category_type: \"all\", \"instruments\", \"sounds\", \"drums\", \"audio_effects\", \"midi_effects\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_clip_info","description":"Full clip state: loop points, markers, playing position, per-clip time signature; for audio clips also file path, gain display, and warp markers.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_clip_notes","description":"Return every MIDI note in an existing Session-view MIDI clip.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_device_parameters","description":"List all parameters of a device on a track: names, values, ranges, display strings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_device_routing","description":"Read a device's audio-input (sidechain) routing: current input type/channel and the available options. Only sidechain-capable devices (Compressor, Gate) have this. Use the options with set_device_routing to pick a sidechain source.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_drum_pads","description":"List a Drum Rack's occupied pads (MIDI note, name, mute, solo).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_grooves","description":"List grooves in the Groove Pool (index + name) and the global groove amount.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_master_device_parameters","description":"List parameters of a device on the Master track.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_rack_chains","description":"List an Instrument/Effect Rack's chains and the devices inside each - previously unreachable nested devices. Use set_chain_device_parameter to control them.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_return_device_parameters","description":"List parameters of a device on a Return track: names, values, min/max, display strings. Call before set_return_device_parameter.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_session_info","description":"Return global Live-set and transport state without modifying the set.","write_action":false,"price_micros":0,"input_schema":null},{"name":"humanize_clip","description":"Read a MIDI clip, apply timing + velocity humanization, and write it back. REPLACES the clip's notes with the jittered version.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_known_devices","description":"List the devices that describe_device has curated guidance for.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_recipes","description":"List the built-in composition recipes (name, description, and default tempo/key/scale/bars), for use with apply_recipe.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_device_to_master","description":"Load a device/effect from the browser onto the Master/Main track (e.g. a limiter for mastering).","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_device_to_return","description":"Append one loadable browser device or preset to a return track's chain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_drum_kit","description":"Load a Drum Rack, then the first loadable kit at a browser path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_instrument_or_effect","description":"Load an instrument or effect onto a track using its URI.","write_action":false,"price_micros":0,"input_schema":null},{"name":"preview_browser_item","description":"Audition a browser item (a sample, instrument, or preset) through Live's preview tab WITHOUT loading it onto a track. `item_uri` comes from search_browser or get_browser_items_at_path. Use stop_browser_preview to stop.","write_action":false,"price_micros":0,"input_schema":null},{"name":"quantize_clip","description":"Quantize a MIDI clip. grid: quarter/eighth/eighth_triplet/sixteenth/sixteenth_triplet/thirtysecond. amount 0.0-1.0 (use <1.0 to humanize toward the grid without full snap).","write_action":false,"price_micros":0,"input_schema":null},{"name":"rack_variation","description":"Rack macro snapshots. action: \"store\" (save current macros as a variation), \"recall\" (restore variation `index`), \"randomize\" (randomize all macro knobs - instant sound-design exploration).","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_section","description":"Bounce a section of the arrangement to an audio file WITHOUT the Export dialog, so you can hear an internal signal. Creates a temporary audio track, routes its input to `source` (\"Resampling\" = the master output, or a track's name for that track's output), arms it, and records from start_beat to end_beat in REAL TIME (a 4-bar section takes about 4 bars of wall-clock; capped at 5 minutes). Returns","write_action":false,"price_micros":0,"input_schema":null},{"name":"replace_simpler_sample","description":"Replace a Simpler sample with an absolute local audio-file path. Requires Live 12.4+ AND runtime API support; otherwise fails before writing. Replaces musical content: confirm the target and preserve the original set. Readback is not an audio audition.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_browser","description":"Search the Ableton browser by display name (case-insensitive substring). Returns loadable items with their URIs for load_instrument_or_effect / load_device_to_master / load_device_to_return.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_diff","description":"Report what changed in the set since the LAST time you called this tool: tempo/time-signature/play-state, tracks added, removed, renamed or reordered, and per-track volume, mute, solo, arm, clip-count, and device changes. The first call records a baseline (no diff). Track IDs are scoped to the running bridge; older bridges cannot identify renames reliably. Call it before and after an edit to verif","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_arrangement_time","description":"Move the arrangement playhead to a specific position.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_chain_device_parameter","description":"Set a parameter on a device INSIDE a rack chain (indices from get_rack_chains). Values clamp to the parameter's native range.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_clip_audio","description":"Set audio-clip properties. gain 0-1, pitch_coarse semitones (-48..48), pitch_fine cents, warping on/off, warp_mode 0=Beats 1=Tones 2=Texture 3=Re-Pitch 4=Complex 6=Complex Pro.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_clip_color","description":"Set an existing Session clip's palette color without changing its content.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_clip_groove","description":"Attach a Groove Pool groove to a clip by index (swing/timing feel). Pass no groove_index to clear.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_clip_loop","description":"Update selected loop and launch markers on one existing Session clip.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_clip_name","description":"Rename an existing Session-view clip without changing its notes or audio.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_clip_signature","description":"Set a clip's own time signature (polymeter / odd-bar loops).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_device_enabled","description":"Enable or bypass one device on a regular track.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_device_parameter","description":"Set a parameter after reading get_device_parameters. Numbers use the native range; strings use display units ('250 Hz', '-6 dB') or exact enum labels. Unsupported display mappings fail before writing. Returns Live's actual readback and warnings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_device_routing","description":"Set a device's sidechain audio input. `field` is \"input_routing_type\" (the source track/return) or \"input_routing_channel\" (Pre FX / Post FX / Post Mixer); `display_name` is one of the options from get_device_routing. For ducking, also enable the device's Sidechain parameter via set_device_parameter.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_drum_pad","description":"Mute/solo/rename a single Drum Rack pad by its MIDI note (e.g. 36=kick). Per-pad muting = instant beat variations without touching the notes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_loop","description":"Set the global Arrangement loop region and its enabled state.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_master_device_parameter","description":"Set one enabled parameter on a device in the Master track's chain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_return_device_parameter","description":"Set one enabled parameter on a device in a return track's chain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_scene_name","description":"Rename one Session-view scene without changing any clips in the row.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_simpler_playback_mode","description":"Set a Simpler device's playback mode: 0 = Classic, 1 = One-Shot, 2 = Slicing. Slicing chops the sample into playable slices, central to lofi/hip-hop sampling. Errors if the device at that index is not a Simpler.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_tempo","description":"Set the tempo of the Ableton session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_time_signature","description":"Set the Live set's global time signature, such as 4/4, 3/4, or 6/8.","write_action":false,"price_micros":0,"input_schema":null},{"name":"setup_session","description":"Bootstrap a session in one call: set tempo and create named MIDI tracks, optionally loading an instrument found by name for each.","write_action":false,"price_micros":0,"input_schema":null},{"name":"start_playback","description":"Start Arrangement playback from the current song time. NOTE: the response reports the PRE-command state (may say playing=false right after starting) - confirm with get_session_info.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_browser_preview","description":"Stop the browser preview started by preview_browser_item.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_clip","description":"Stop playing a clip.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_playback","description":"Stop playback. NOTE: the response reports the PRE-command state - confirm with get_session_info.","write_action":false,"price_micros":0,"input_schema":null},{"name":"switch_to_arrangement_view","description":"Switch Ableton's main window to the Arrangement view.","write_action":false,"price_micros":0,"input_schema":null},{"name":"transform_clip","description":"Read a MIDI clip's notes, apply a classical motif transformation, and write the result. Overwrites the source clip unless ``dest_clip_index`` is given (in which case that destination slot is REPLACED instead).","write_action":false,"price_micros":0,"input_schema":null},{"name":"undo","description":"Revert the most recent undoable Live-set action.","write_action":false,"price_micros":0,"input_schema":null},{"name":"write_automation","description":"Write clip automation for a device parameter. points = [{\"time\": beats, \"value\": v}, ...]. Replaces any existing envelope for that parameter on the clip.","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_drum_grid","description":"Write drums from an ASCII grid (16th-note steps). REPLACES existing notes.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T19:20:11.729Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:20:11.704Z","components":{"code":{"score":25,"max":25,"notes":["34 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"mcp-server-ableton-live","version":"1.8.1","found":true,"weeklyDownloads":665,"license":"MIT","dependencyCount":11,"publishedAt":"2026-09-17T13:56:03.724616Z","repositoryUrl":"https://github.com/wstierhout/ableton-live-mcp"}],"repo":{"found":true,"owner":"wstierhout","repo":"ableton-live-mcp","archived":false,"pushedAt":"2026-09-17T13:55:20Z","stars":17,"forks":4,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/6319664?v=4","ownerCreatedAt":"2014-01-04T20:32:52Z","license":"MIT"},"icon":{"url":"https://abletonmcp.com/favicon.svg","source":"registry"},"presence":{"stars":17,"forks":4,"downloadsWeek":665,"license":"MIT","lastPushAt":"2026-09-17T13:55:20.000Z","score":44}}}},"grade_history":[{"kind":"restore","fromGrade":"B","toGrade":"A","reason":"score 92","createdAt":"2026-09-19T00:27:02.321Z"}],"reviews":[]}