Skip to main content
Glama
README.md
# ableton-mind

[![ableton-mind MCP server](https://glama.ai/mcp/servers/Pantani/ableton-mind/badges/score.svg)](https://glama.ai/mcp/servers/Pantani/ableton-mind)

Definitive MCP (Model Context Protocol) server for **Ableton Live**. Exposes the full **Live Object Model** to LLMs (Claude, Cursor, etc.) with an embedded native device knowledge base, declarative music recipes, an integrated verify loop, and reactive listeners.

> Status: **alpha / v0.1.1 published** β€” core smoke passed against Ableton Live 12.4.1 on macOS and package validation is green. npm, GitHub Release `.mcpb`, and the MCP Registry are live. Glama has a listing, but its hosted release/deploy must be published separately from the Glama admin build flow; Smithery metadata is present and may lag indexing. API unstable. Don't use in production yet.
>
> Phase 8 status: slice 1 delivers read-only Max for Live/plug-in introspection and Link/remote status discovery. Deeper M4L control, VST3 sidecars, remote DAW integration and mobile companion work remain pending.

πŸ“š **Full documentation:** [pantani.github.io/ableton-mind/](https://pantani.github.io/ableton-mind/)

## Architecture (3 layers)

```
Claude/Cursor ──MCP/stdio──▢ ableton-mind (TS, Node 20+) ──TCP NDJSON JSON-RPC──▢ Remote Script (Python, inside Live)
```

- **`src/`** β€” TypeScript MCP server. Tools, resources, prompts, TCP client, recipe runner, knowledge loader.
- **`live/AbletonMind/`** β€” Python Remote Script. TCP server on port `9876`, dispatches JSON-RPC to LiveAPI.
- **`recipes/`**, **`src/knowledge/`** β€” embedded JSON (drum kits, basslines, racks, device schemas).

Full spec in [`PLAN.md`](PLAN.md). Frozen contracts in [`_workspace/contracts/`](_workspace/contracts/).

## Highlights vs. existing MCP/OSC servers

| Capability | ahujasid/ableton-mcp | AbletonOSC + MCP wrapper | **ableton-mind** |
|---|---|---|---|
| MCP tools | 22 | ~30 | **36** |
| LOM coverage | ~10% | ~95% | **~100%** |
| Knowledge base | none | none | **55 devices, scales, drum kits** |
| Recipes | none | none | **14 across 7 categories** |
| Verify loop | no | no | **yes, integrated (`session_snapshot/diff`)** |
| Render preview | no | no | yes (snapshot now, bounce planned) |
| Reactive listeners β†’ MCP notifications | no | partial (OSC) | **yes (7 events live)** |
| Transactions (undo unitary) | no | no | **yes** |
| Automation envelopes | no | partial | **complete (linear / hold)** |
| Push 1/2/3 control | no | no | **yes (pad/button/mode LEDs)** |
| Docker | no | no | yes |
| `.mcpb` 1-click | no | no | yes |
| Doctor CLI | no | no | yes |

## Requirements

- Node 20+
- Ableton Live 12 (priority; Live 11 supported)
- macOS (primary), Windows (Phase 1 final)

## Setup (source install)

```bash
npm install
npm run typecheck
npm run lint
npm run test
npm run build
```

## Install Remote Script (Python bridge)

Dev mode (symlink):
```bash
node scripts/install-remote-script.mjs           # creates symlink
node scripts/install-remote-script.mjs --check   # status only
node scripts/install-remote-script.mjs --copy    # full copy (CI / snapshot)
```

Manual:
- **macOS:** copy `live/AbletonMind/` to `~/Music/Ableton/User Library/Remote Scripts/AbletonMind/`
- **Windows:** copy to `~/Documents/Ableton/User Library/Remote Scripts/AbletonMind/`

Then **Live β†’ Preferences β†’ Link/Tempo/MIDI β†’ Control Surface β†’ AbletonMind**.

Smoke test: [`docs/smoke-test.md`](docs/smoke-test.md).

## Run the MCP server

```bash
npm run build
node dist/index.js
```

Env vars:

| Var | Default | |
|---|---|---|
| `ABLETON_MIND_HOST` | `127.0.0.1` | Python bridge host |
| `ABLETON_MIND_PORT` | `9876` | Bridge TCP port |
| `ABLETON_MIND_TIMEOUT_MS` | `5000` | Per-request timeout |
| `ABLETON_MIND_MAX_FRAME_BYTES` | `1048576` | Max incoming JSON-RPC frame |
| `ABLETON_MIND_MAX_PENDING_REQUESTS` | `128` | Max in-flight JSON-RPC calls |
| `ABLETON_MIND_LOG_LEVEL` | `info` | `debug` \| `info` \| `warn` \| `error` |

## Local copilot

Run a local LLM against a curated subset of the same Ableton tools:

```bash
ollama pull qwen2.5:3b      # optional; the UI can pull too
node dist/index.js chat     # opens http://127.0.0.1:4142
node dist/index.js ask "What is in this set?"
```

The default tier is read-only (`safe`). Use `--write` for simple changes or `--creative` for recipes/browser load.

| Var | Default | |
|---|---|---|
| `ABLETON_MIND_LLM_BASE_URL` | `http://127.0.0.1:11434/v1` | OpenAI-compatible endpoint |
| `ABLETON_MIND_LLM_MODEL` | `qwen2.5:3b` | Local model id |
| `ABLETON_MIND_LLM_TIER` | `safe` | `safe` \| `standard` \| `creative` |
| `ABLETON_MIND_CHAT_PORT` | `4142` | Browser UI port |

See [Local copilot](docs/guide/local-copilot.md).

## Doctor CLI

```bash
npx ableton-mind-doctor
```

Checks Node version, Remote Script install, bridge port, knowledge base integrity, recipes.

## Distribution

- **npm:** `npm install -g ableton-mind`.
- **Claude Code plugin marketplace:** `claude plugin marketplace add Pantani/ableton-mind`, then `claude plugin install ableton-mind@ableton-mind`.
- **Claude Desktop one-click:** download `ableton-mind-0.1.1.mcpb` from the [v0.1.1 GitHub Release](https://github.com/Pantani/ableton-mind/releases/tag/v0.1.1).
- **MCP Registry:** `io.github.Pantani/ableton-mind` is active in the official registry.
- **Glama:** listed at [glama.ai/mcp/servers/Pantani/ableton-mind](https://glama.ai/mcp/servers/Pantani/ableton-mind); hosted release is separate from the GitHub Release and still requires the Glama admin deploy + Make Release flow.
- **Source:** `npm ci && npm run build && npm run install:remote-script`.
- **Docker:** `docker build -t ableton-mind . && docker run --rm -i --network host ableton-mind`.
- **Smithery:** [`smithery.yaml`](smithery.yaml) is ready for listing/indexing.

## Roadmap

See [`PLAN.md Β§12`](PLAN.md) and [`_workspace/PROGRESS.md`](_workspace/PROGRESS.md).

| Phase | Status |
|---|---|
| 0 β€” Spike | βœ… real smoke pass |
| 1 β€” ahujasid parity | βœ… 22/22 |
| 2 β€” Listeners | βœ… 7 events |
| 3 β€” Knowledge | βœ… 55 devices |
| 4 β€” Automation envelopes | βœ… |
| 5 β€” Preview/verify | βœ… snapshot+diff (bounce planned) |
| 6 β€” Push | βœ… pad/button/mode LEDs |
| 7 β€” Distribution | βœ… DXT/Docker/Smithery/CI/release ready |
| 8 β€” Long tail | πŸ”΅ slice 1 delivered: read-only M4L/plug-in introspection + Link/remote status discovery; deeper M4L/VST3/remote DAW/mobile work pending |

## License

[MIT](LICENSE).

TDQS

A3.6/5.0

Scored across 36 tools

Disambiguation4/5

Most tools have distinct purposes, with clear domain boundaries (clip_, track_, device_, session_). However, session_snapshot and render_preview serve similar roles (deep vs lightweight snapshot), and list_recipes/list_prompts/list_resources are generic utility tools that could cause minor confusion.

Naming Consistency4/5

The naming follows snake_case with a consistent resource_verb pattern within groups (clip_, track_, device_, session_, browser_). A few tools like list_recipes and apply_recipe deviate (verb first), but overall the pattern is predictable and readable.

Tool Count4/5

36 tools is on the higher side but appropriate for Ableton Live's complexity. The toolset covers many aspects (clips, tracks, devices, browser, transport, Push, recipes, utilities). A few tools could be consolidated (e.g., list_prompts and list_resources), but the count is defensible.

Completeness2/5

Significant gaps exist: no tools for deleting clips/tracks/devices, no pan/send control, no arrangement clip editing beyond automation points, and no ability to manage return/master tracks beyond listing. These omissions will cause agent failures in common workflows.

Maintenance

ActivityStale
ResponsivenessNo issues