diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 0000000..1c6a44b --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -0,0 +1,37 @@ +{ + "name": "ableton-mind", + "owner": { + "name": "Pantani" + }, + "description": "Claude Code plugin marketplace for Ableton Mind.", + "version": "0.1.1", + "plugins": [ + { + "name": "ableton-mind", + "displayName": "Ableton Mind", + "source": "./plugins/ableton-mind", + "description": "Control Ableton Live from Claude Code through the Ableton Mind MCP server.", + "version": "0.1.1", + "author": { + "name": "Pantani" + }, + "homepage": "https://pantani.github.io/ableton-mind/", + "repository": "https://github.com/Pantani/ableton-mind", + "license": "MIT", + "keywords": [ + "mcp", + "ableton", + "ableton-live", + "music", + "claude-code" + ], + "category": "creative-tools", + "tags": [ + "mcp", + "ableton", + "music-production", + "claude-code" + ] + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 38c8646..a92ada2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,13 @@ All notable changes go here. Format: [Keep a Changelog](https://keepachangelog.c - Harness extension for the local-copilot track plus `_workspace/tdmcp-compatible-features.md`, mapping portable `tdmcp` features to Ableton Mind priorities. - Phase 8 slice 1: read-only `device_inspect_patcher`, `device_inspect_plugin`, and `session_link_status` MCP tools backed by `device.inspect_patcher`, `device.inspect_plugin`, and `session.link_status` bridge methods. - Compact Phase 8 discovery metadata (`src/knowledge/discovery.json`) for plug-in formats, M4L capability labels, and Link status fields. +- Claude Code plugin marketplace catalog plus an `ableton-mind` plugin wrapper that starts the published npm MCP server through `npx`. ### Changed - Clarified status docs for Phase 8: slice 1 is read-only Max for Live/plug-in introspection and Link/remote status discovery only; broader M4L/VST3/remote DAW/mobile work remains pending. - Clarified Glama distribution docs: a Glama listing is not a Glama release, and the hosted release requires the Glama admin Deploy -> Make Release flow. +- Extended the version-sync release helper to keep Claude Code marketplace/plugin manifests pinned to the package version. ## [0.1.1] — 2026-06-10 — Release closure diff --git a/README.md b/README.md index 4a03e11..354c1ae 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Checks Node version, Remote Script install, bridge port, knowledge base integrit ## 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. diff --git a/docs/distribution.md b/docs/distribution.md index c575786..a9ba415 100644 --- a/docs/distribution.md +++ b/docs/distribution.md @@ -75,6 +75,29 @@ The bundle installs and runs the Node MCP server. It also includes the Remote Sc Live -> Preferences -> Link/Tempo/MIDI -> Control Surface -> AbletonMind. +## Claude Code plugin marketplace + +The Claude Code marketplace catalog lives at `.claude-plugin/marketplace.json`. +It lists a lightweight `ableton-mind` plugin in `plugins/ableton-mind/` that +starts the published npm MCP server with `npx -y ableton-mind@0.1.1`. + +Validate the catalog before sharing: + +```bash +claude plugin validate . +``` + +Add the GitHub-hosted marketplace and install the plugin: + +```bash +claude plugin marketplace add Pantani/ableton-mind +claude plugin install ableton-mind@ableton-mind +``` + +The plugin starts the Node MCP server only. Users still need to install the +Remote Script and activate `AbletonMind` in Live preferences before the MCP +tools can control Ableton Live. + ## MCP Registry `server.json` is the MCP Registry manifest. It uses `mcpName`/server name: diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 9d4670d..4d043f3 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -1,6 +1,6 @@ # Installation -The fastest install paths are now **npm global** or the GitHub Release `.mcpb`. Use source install when developing the repo or testing local changes. +The fastest install paths are now **npm global**, the GitHub Release `.mcpb`, or the Claude Code plugin marketplace. Use source install when developing the repo or testing local changes. ## 1. Source install @@ -45,7 +45,16 @@ npm run build:dxt Drag the generated `.mcpb` into Claude Desktop. -## 4. npm global +## 4. Claude Code plugin marketplace + +```bash +claude plugin marketplace add Pantani/ableton-mind +claude plugin install ableton-mind@ableton-mind +``` + +The plugin starts `npx -y ableton-mind@0.1.1`. Install and activate the Remote Script in Live before using the MCP tools. + +## 5. npm global ```bash npm install -g ableton-mind @@ -55,7 +64,7 @@ ableton-mind-doctor Current registry status: `ableton-mind@0.1.1` is published on npm. -## 5. Docker +## 6. Docker Build locally: @@ -72,7 +81,7 @@ docker run --rm -it \ ableton-mind ``` -## 6. Smithery +## 7. Smithery `smithery.yaml` is present for the listing path. Hosted Smithery indexing can lag the repository metadata. diff --git a/docs/pt/distribution.md b/docs/pt/distribution.md index 49c7cbb..f18bdef 100644 --- a/docs/pt/distribution.md +++ b/docs/pt/distribution.md @@ -75,6 +75,29 @@ O bundle instala e roda o MCP server Node. Ele tambem inclui os arquivos do Remo Live -> Preferences -> Link/Tempo/MIDI -> Control Surface -> AbletonMind. +## Claude Code plugin marketplace + +O catalogo do marketplace do Claude Code fica em `.claude-plugin/marketplace.json`. +Ele lista um plugin leve `ableton-mind` em `plugins/ableton-mind/`, que inicia +o MCP server publicado no npm com `npx -y ableton-mind@0.1.1`. + +Valide o catalogo antes de compartilhar: + +```bash +claude plugin validate . +``` + +Adicione o marketplace hospedado no GitHub e instale o plugin: + +```bash +claude plugin marketplace add Pantani/ableton-mind +claude plugin install ableton-mind@ableton-mind +``` + +O plugin inicia apenas o MCP server Node. O usuario ainda precisa instalar o +Remote Script e ativar `AbletonMind` nas preferencias do Live antes das tools +MCP conseguirem controlar o Ableton Live. + ## MCP Registry `server.json` e o manifesto do MCP Registry. Ele usa o nome: diff --git a/docs/pt/guide/installation.md b/docs/pt/guide/installation.md index b3f3904..1af285e 100644 --- a/docs/pt/guide/installation.md +++ b/docs/pt/guide/installation.md @@ -1,6 +1,6 @@ # Instalação -Os caminhos mais rapidos agora sao **npm global** ou o `.mcpb` da GitHub Release. Use instalacao via source para desenvolver o repo ou testar mudancas locais. +Os caminhos mais rapidos agora sao **npm global**, o `.mcpb` da GitHub Release ou o marketplace de plugin do Claude Code. Use instalacao via source para desenvolver o repo ou testar mudancas locais. ## 1. Instalacao via source @@ -45,7 +45,16 @@ npm run build:dxt Arraste o `.mcpb` gerado para o Claude Desktop. -## 4. npm global +## 4. Claude Code plugin marketplace + +```bash +claude plugin marketplace add Pantani/ableton-mind +claude plugin install ableton-mind@ableton-mind +``` + +O plugin inicia `npx -y ableton-mind@0.1.1`. Instale e ative o Remote Script no Live antes de usar as tools MCP. + +## 5. npm global ```bash npm install -g ableton-mind @@ -55,7 +64,7 @@ ableton-mind-doctor Estado atual do registry: `ableton-mind@0.1.1` esta publicado no npm. -## 5. Docker +## 6. Docker Build local: @@ -74,7 +83,7 @@ docker run --rm -it \ Util para CI e sandboxes; para uso interativo no desktop, source ou `.mcpb` tendem a ser mais simples. -## 6. Smithery +## 7. Smithery `smithery.yaml` existe para o caminho de listagem. A indexacao hospedada da Smithery pode atrasar em relacao ao metadata do repo. diff --git a/package.json b/package.json index a1f2f50..0c046d5 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", - "version": "node scripts/sync-manifest-version.mjs && git add dxt/manifest.json server.json safeskill.manifest.json", + "version": "node scripts/sync-manifest-version.mjs && git add dxt/manifest.json server.json safeskill.manifest.json .claude-plugin/marketplace.json plugins/ableton-mind/.claude-plugin/plugin.json", "prepublishOnly": "npm run typecheck && npm run lint && npm run test && npm run test:bridge && npm run docs:build && npm run build && npm run build:dxt:check && npm audit --omit=dev" }, "dependencies": { diff --git a/plugins/ableton-mind/.claude-plugin/plugin.json b/plugins/ableton-mind/.claude-plugin/plugin.json new file mode 100644 index 0000000..519eec7 --- /dev/null +++ b/plugins/ableton-mind/.claude-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "ableton-mind", + "displayName": "Ableton Mind", + "version": "0.1.1", + "description": "Control Ableton Live from Claude Code through the Ableton Mind MCP server.", + "author": { + "name": "Pantani" + }, + "homepage": "https://pantani.github.io/ableton-mind/", + "repository": "https://github.com/Pantani/ableton-mind", + "license": "MIT", + "keywords": [ + "mcp", + "ableton", + "ableton-live", + "music", + "claude-code" + ], + "mcpServers": { + "ableton-mind": { + "command": "npx", + "args": [ + "-y", + "ableton-mind@0.1.1" + ] + } + } +} diff --git a/plugins/ableton-mind/README.md b/plugins/ableton-mind/README.md new file mode 100644 index 0000000..be124a3 --- /dev/null +++ b/plugins/ableton-mind/README.md @@ -0,0 +1,17 @@ +# Ableton Mind Claude Code plugin + +This plugin installs the Ableton Mind MCP server into Claude Code through the +Ableton Mind marketplace. + +It starts the published npm package with: + +```bash +npx -y ableton-mind@0.1.1 +``` + +The npm server defaults to `127.0.0.1:9876` and `info` logging. Set +`ABLETON_MIND_HOST`, `ABLETON_MIND_PORT`, or `ABLETON_MIND_LOG_LEVEL` in the +Claude Code environment only when you need to override those defaults. + +The Ableton Live Remote Script still needs to be installed and enabled in Live. +See the main repository README and distribution docs for setup details. diff --git a/scripts/sync-manifest-version.mjs b/scripts/sync-manifest-version.mjs index c47403b..73dbc81 100644 --- a/scripts/sync-manifest-version.mjs +++ b/scripts/sync-manifest-version.mjs @@ -3,6 +3,8 @@ // - dxt/manifest.json // - server.json (top-level + packages[].version) // - safeskill.manifest.json +// - .claude-plugin/marketplace.json +// - plugins/ableton-mind/.claude-plugin/plugin.json // // Invoked by the npm `version` lifecycle (see package.json), so `npm version // patch` rewrites the satellite manifests before tagging. @@ -41,3 +43,24 @@ patch("server.json", (m) => { patch("safeskill.manifest.json", (m) => { m.version = version; }); +patch(".claude-plugin/marketplace.json", (m) => { + m.version = version; + if (Array.isArray(m.plugins)) { + for (const plugin of m.plugins) { + if (plugin?.name === "ableton-mind") { + plugin.version = version; + } + } + } +}); +patch("plugins/ableton-mind/.claude-plugin/plugin.json", (m) => { + m.version = version; + const server = m.mcpServers?.["ableton-mind"]; + if (server && Array.isArray(server.args)) { + server.args = server.args.map((arg) => + typeof arg === "string" && arg.startsWith("ableton-mind@") + ? `ableton-mind@${version}` + : arg, + ); + } +}); diff --git a/tests/distribution-validation.test.ts b/tests/distribution-validation.test.ts index 2c27faf..ace6841 100644 --- a/tests/distribution-validation.test.ts +++ b/tests/distribution-validation.test.ts @@ -157,6 +157,43 @@ describe("Dockerfile + smithery.yaml + .npmignore", () => { }); }); +describe("Claude Code plugin marketplace", () => { + it("has a marketplace catalog pointing to the bundled plugin wrapper", () => { + const marketplace = JSON.parse(read(".claude-plugin/marketplace.json")) as { + name: string; + owner?: { name?: string }; + plugins?: Array<{ name: string; source: string; version?: string }>; + version?: string; + }; + const pkg = JSON.parse(read("package.json")) as { version: string }; + const plugin = marketplace.plugins?.find((entry) => entry.name === "ableton-mind"); + + expect(marketplace.name).toBe("ableton-mind"); + expect(marketplace.owner?.name).toBe("Pantani"); + expect(marketplace.version).toBe(pkg.version); + expect(plugin?.source).toBe("./plugins/ableton-mind"); + expect(plugin?.version).toBe(pkg.version); + expect(existsSync(join(REPO_ROOT, "plugins/ableton-mind/.claude-plugin/plugin.json"))).toBe( + true, + ); + }); + + it("starts the published npm MCP server without install-time userConfig prompts", () => { + const plugin = JSON.parse(read("plugins/ableton-mind/.claude-plugin/plugin.json")) as { + version?: string; + userConfig?: unknown; + mcpServers?: Record; + }; + const pkg = JSON.parse(read("package.json")) as { version: string }; + const server = plugin.mcpServers?.["ableton-mind"]; + + expect(plugin.version).toBe(pkg.version); + expect(plugin.userConfig).toBeUndefined(); + expect(server?.command).toBe("npx"); + expect(server?.args).toEqual(["-y", `ableton-mind@${pkg.version}`]); + }); +}); + describe("hosted catalog release docs", () => { it("documents Glama release as separate from GitHub release", () => { const readme = read("README.md");