MCP Music Studio
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Music Studioplay a jazz piano melody with drums"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Music Studio
Two-mode creative music studio for AI: scored composition (ABC notation with sheet music) and live performance (Strudel live coding with TidalCycles). Interactive UI renders inline in Claude Desktop, claude.ai, and other MCP clients.
One continuous live set through the widget — every section a hot-swapped re-evaluation on the same clock. Full video: 16:9 1080p60 · 3:4 for phones. Made with dev/perform.html and an OBS Browser Source (see scripts/showcase/).
Quick Start — No Install Required
Paste this URL into any MCP client that supports remote servers:
https://music-studio.linxule.com/mcpClaude Desktop / claude.ai: Settings → Connectors → Add Connector → paste the URL above → done.
Claude Code:
claude mcp add --transport http music-studio https://music-studio.linxule.com/mcpThat's it — ask Claude to play a song or create a beat.
Related MCP server: Filopastry
What You Get
Scored Composition (ABC Notation)
Write sheet music → see it rendered → hear it played with multi-instrument audio.
8 style presets — rock, jazz, bossa, waltz, march, reggae, folk, classical — one parameter adds drums + bass + chord accompaniment
All 128 General MIDI instruments — named and fuzzy-matched (
"sax"→ Soprano Sax); the result text says what it actually resolved to when that isn't what you asked for. When the score picks its own instrument (%%MIDI program), the Instrument menu shows it, and choosing another really swaps the melody's instrumentVisual sheet music — notes highlight as they play (on the swung beat when
swingis set), and the score scrolls to keep the playing line in view. Scroll by hand at any time and the follow steps asideStreaming render — sheet music appears as the AI types
Edit in place — open the ABC source pane in the widget, fix a bar, re-render without another tool call
Real transposition —
transposerewrites the notation and the key signature, so the printed score matches what playsSwing and count-in —
swingis the share of the beat given to its first half (50 = straight, 66 = triplet, 75 = max; ≤50 is no swing),drumIntroadds up to 8 bars of count-in from the style's drum kitSelectable sound banks — FluidR3 (default), MusyngKite (fuller), or a lightweight dry bank, switched live from the toolbar. Changing instrument, sound, style or tempo keeps your Loop and tempo settings and never starts a paused tune
Notes that ring out — each note fades naturally instead of stopping dead, and a light Room echo (on by default, one toolbar toggle) gives the synth a space to play in. WAV downloads and share links sound the same
WAV download — export audio as WAV files directly from the UI
MIDI download — export a standard MIDI file straight from the score, no playback needed first. It is the score: abcjs applies swing during playback only, so the exported file has none
get-music-guide— 7 reference topics (instruments, drums, ABC syntax, arrangements, genres, styles, MIDI directives)
Live Performance (Strudel)
Write code → hear it play → edit in a live REPL.
TidalCycles mini-notation in JavaScript
71 drum machine banks + 128 GM instruments + 128 VCSL orchestral/world/percussion samples + built-in synths
Full effects chain — filters, reverb, delay, FM synthesis
Editable REPL — users can tweak the code and hear changes instantly
Live visuals — add
.pianoroll()/.punchcard()/.scope()/.spectrum()/.spiral()/.pitchwheel()to animate behind the code (native strudel.cc overlay)Layered and hand-drawn visuals — give each visual its own canvas with
ctx: getDrawContext('name')so several play at once, or draw anything yourself with.onPaint((ctx, time, haps) => …), reacting to the notes and the soundInline visuals and sliders —
._pianoroll(),._scope()and friends draw under their own line of code;slider(value, min, max)puts a knob in the code to drag while it playsHydra shader backgrounds —
await initHydra()+ Hydra code for fully custom, music-synced WebGL visuals.H(pattern)locks a shader parameter to the sequence — notes arrive as MIDI numbers, so a melody can steer a shader — andfeedStrudelpost-processes the piano rollAudio-reactive shaders —
a.fft[0],a0(),a.setBins(6)and the rest of Hydra's audio API work verbatim, driven by Strudel's own output rather than the microphone (no permission prompt, no room noise)visualspreset — one enum value (pianoroll,punchcard,scope,spectrum,hydra-kaleid,hydra-pulse,hydra-wash,hydra-feed) gives a bare pattern something to paint. Never overrides code that already visualises itselftheme— 39 CodeMirror colour schemes; the visuals stage and its readability scrim are derived from the active theme, so light themes stay readableStage mode — hide the code and let the visuals fill the frame (composes with the host's fullscreen)
Honest runtime feedback — evaluation errors, unknown sound names, and stops the user triggered are reported back to the model as they happen, so it never answers about a silent widget as if the music were still playing
Beyond music: a stage for audiovisual pieces — pattern code is real browser JavaScript, and the widget gives it five primitives:
cycle()(the cycle you're hearing),onFrame(fn)(a managed animation loop),onEvent(pattern, fn)(fires as each note becomes audible, with its MIDI pitch),onTap(fn)(taps on the stage, withnext(16)— the first 16th the scheduler can still play) andsay(text, { voice })(a spoken line rendered by the server, returned as a pattern, so it lands on the beat, mixes, and records). Draw your own canvases into Hydra, re-render them as ASCII, cut between scenes on bar lines. Each belongs to the evaluation that made it: re-running replaces the old loop instead of stacking anotherA gallery of finished pieces — a short film, a spoken duet you play along with, a Game of Life that composes, a glitch piece about memory:
get-strudel-guide({ topic: "gallery", piece: "first-light" }). Made in claude.ai by a Claude model with a personServer-side validation — the local server evaluates every Strudel pattern headlessly before answering: the tool result reports layers, events per cycle, tempo, and which sound names are registered (or a syntax error with line:column), and runs each
onFrame/onEventcallback once to catch a draw loop that throws. The hosted worker can't run Strudel (Cloudflare forbids dynamic code generation), but it parses the JavaScript and every mini-notation string, so a typo still comes back with its line and columnRecord & download — capture live audio and export as WAV (recordings longer than about two minutes download in the recorder's own compressed format, so the file stays a sensible size)
get-strudel-guide— 15 reference topics: mini-notation, sounds, effects, patterns, genres, tips, visuals, hydra, advanced — and for audiovisual work stage, film, interactive, craft, debugging, gallery
Shared
analyze-harmony— chord detection, key detection, progressions, chord scales; answers in both ABC chord symbols and Strudelchord()/note()formconvert-abc-to-strudel— take a scored melody into the live REPL: bars become mini-notation groups, durations become@weights, chord symbols become achord().voicing()linesearch-music-docs— semantic search over strudel.cc and ABCJS documentationClick-to-play links — short pieces include a self-contained browser link; the music is encoded in the URL, not encrypted. Playback never stores a composition in the share database. For longer pieces, use the inline widget, a local browser render, or explicitly ask for a stored share
Explicit sharing —
create-share-linkuploads a score or pattern for 30 days. Anyone with the link can view and play it; creating the same share again refreshes its expiry. Standalone Strudel pages wait for Play or an intentional editor evaluation shortcut, including older autoplay linksWidgets that fit the host — both widgets size themselves from the host's container (inline, fixed or fullscreen), respect safe-area insets and the host's fonts, and never pan sideways on a phone. If the browser holds audio back until a tap, the widget says "Tap Play to start audio" instead of pretending to play. Scrolling past a widget never starts it, and a tune autoplays once — not again every time the host rebuilds the widget
Local Install (Optional)
The remote URL above works without any local setup. If you prefer running locally (offline use, lower latency), install via npm:
CLI One-Liners
# Claude Code
claude mcp add music-studio -- npx -y mcp-music-studio --stdio
# Codex CLI
codex mcp add -- npx -y mcp-music-studio --stdio
# Gemini CLI
gemini mcp add -- npx -y mcp-music-studio --stdio
# OpenCode
opencode mcp add music-studio -- npx -y mcp-music-studio --stdioJSON Config (Claude Desktop, Cursor, Windsurf, etc.)
OS | Path |
macOS |
|
Windows |
|
Linux |
|
{
"mcpServers": {
"music-studio": {
"command": "npx",
"args": ["-y", "mcp-music-studio", "--stdio"]
}
}
}Add to .vscode/mcp.json — note: uses "servers" not "mcpServers":
{
"servers": {
"music-studio": {
"command": "npx",
"args": ["-y", "mcp-music-studio", "--stdio"]
}
}
}Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"music-studio": {
"command": "npx",
"args": ["-y", "mcp-music-studio", "--stdio"]
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"music-studio": {
"command": "npx",
"args": ["-y", "mcp-music-studio", "--stdio"]
}
}
}On Windows, npx is a .cmd file and requires a shell wrapper:
{
"mcpServers": {
"music-studio": {
"command": "cmd",
"args": ["/c", "npx", "-y", "mcp-music-studio", "--stdio"]
}
}
}Clients that support ext-apps render the interactive UI inline automatically (auto mode). For clients that don't (Cherry Studio, CLI environments), use --render-mode:
Mode | Behavior |
| Inline UI for Claude Desktop, VS Code |
| Saves HTML and opens in system browser |
| Returns HTML as embedded resource |
{
"mcpServers": {
"music-studio": {
"command": "npx",
"args": ["-y", "mcp-music-studio", "--stdio", "--render-mode", "browser"]
}
}
}Clients without a widget also get a click-to-play link in the tool result, served by the hosted worker — no local render mode needed.
Without --stdio the server listens over Streamable HTTP. That endpoint is unauthenticated, so it binds 127.0.0.1:3001 by default and only accepts browser requests from loopback origins.
Flag | Default | Purpose |
|
| Bind address. A non-loopback value prints a warning and turns off the SDK's DNS-rebinding protection — put a proxy that authenticates in front of it |
| loopback pages only | Extra CORS origins (comma-separated, repeatable; |
|
| Listen port |
Tools
Tool | Description | Parameters |
| ABC notation → visual sheet music + multi-instrument audio |
|
| Strudel code → live-coded patterns with synthesis + effects |
|
| ABC reference (7 topics: instruments, drums, syntax, genres...) |
|
| Strudel reference (15 topics: sounds, effects, visuals, hydra, genres, stage, film, interactive, craft, gallery...) |
|
| Semantic search over strudel.cc and ABCJS docs |
|
| Name a chord, guess the key, get a progression or chord scale — in ABC and Strudel spellings |
|
| Turn a scored ABC melody into a Strudel mini-notation pattern |
|
| Explicitly store a piece and return a 30-day link accessible to anyone holding it |
|
visuals — none, pianoroll, punchcard, scope, spectrum, hydra-kaleid, hydra-pulse, hydra-wash, hydra-feed.
theme — any of the 39 schemes the Strudel REPL ships (strudelTheme, nord, sonicPink, teletext, gruvboxDark, githubLight, …).
style — rock, jazz, bossa, waltz, march, reggae, folk, classical.
Prompts
Slash-command / menu entry points, in clients that surface MCP prompts:
Prompt | What it does |
| Generate + play a Strudel pattern in a genre (args: |
| Add chords/accompaniment to an ABC melody and play it (args: |
| Turn a melody/idea into a multi-voice arrangement (args: |
0.7.0 — October 1, 2026
From sound toy to audiovisual instrument. A day of making things in claude.ai — a short film, a duet with speech, a Game of Life composer — showed that the widget already was one, and that its worst bugs were silent. This release fixes those and gives the pieces a runtime, a voice and a guide.
Stage runtime:
cycle(),onFrame,onEvent,onTap(+next(16)) andsay()in the widget and on share pages. New guide topicsstage,film,interactive,craft,debugging, and agalleryof complete pieces.Voice:
say(text, { voice })returns a pattern playing the words, rendered once by the hosted service (Cloudflare Workers AI, 40 synthetic voices, cached) — so it is on the beat and identical on every device. Browser speech never played in the Claude mobile app.Fixed — frozen clocks:
H(signal(t => t))returned 0 forever (a Strudel Fraction it misread), freezing any visual built on it at bar 1.Fixed — 22 silent sounds in Chrome, Edge and Electron hosts: kalimba, steinway, kawai, ocarina, the VCSL snares and more. GitHub serves them with a header Chromium rejects; they now load from jsDelivr.
Fixed — the local validator rejected working audiovisual code ("window is not defined") and the hosted server checked nothing; the hosted server now reports syntax errors with their position, and error line numbers point at the code the model sent even when
bpmorvisualsadded lines.Taps that land:
tap.next(16)is past what the scheduler has already committed, so a tapped note always sounds.The privacy policy covers spoken lines.
0.6.0 — September 26, 2026
The canonical endpoint is now https://music-studio.linxule.com/mcp. Existing
mcp-music-studio.linxule.workers.dev connections and shared links continue to work.
Playback no longer stores compositions automatically. Use the new
create-share-link tool when you explicitly want to upload a composition for a
30-day link. The hosted privacy policy explains storage, retention, and external
providers. Standalone Strudel pages start only after an intentional Play action.
This release corrects ABC pitch/drum guidance and harmony error reporting, adds real browser audio and export checks to CI and publishing, and updates development dependencies. The combined application is now AGPL-3.0-or-later, with the original MIT notices preserved and editable source/build inputs included in the npm package. Earlier releases retain their original notices. See SOURCE.md.
0.5.14 — September 25, 2026
The local server's pattern check rejected every Strudel pattern written with
$: blocks — Strudel's everyday way to run several patterns — as "failed to
evaluate" while the widget played it fine. It now follows the REPL: blocks play
stacked, _$: mutes, S$: solos, and the result counts the blocks as layers.
A pattern ending in a Hydra line no longer hangs the check. The release film,
Rest, was made with the studio itself — the score drawn by abcjs, the song a
single Strudel file with its arrangement in the code — and the tools that shot
it are in scripts/showcase/film/.
0.5.14
0.5.13 — September 25, 2026
The sheet widget's Room button showed as a blank blue box while on: its label was drawn in the same blue as its pressed background (0.5.10–0.5.12). It now reads like the Edit toggle, white on blue. 0.5.13
0.5.12 — September 25, 2026
Tested on a phone, then opened up. Scrolling a conversation no longer starts
music, and a tune autoplays once per tool call instead of on every rebuild;
Strudel code wraps. Sheet music rings out — a softer note release and a light
Room echo, in the widget, WAV downloads and share links. Strudel visuals gain
layers, hand-drawn onPaint art, inline visuals and sliders, and pitch-driven
Hydra shaders, and share links now match the widget. Details:
0.5.9 ·
0.5.10 ·
0.5.11 ·
0.5.12.
0.5.6 — September 14, 2026
Dependency and compatibility maintenance: audited dependency locks, ext-apps v2 widgets, the SDK v1-compatible worker adapter, and validated worker startup. The seven tools, music features and UI controls retain their existing behavior. Builds now synchronize the MCP Registry metadata with the package version, and publishing waits for the npm package to propagate before registry registration.
Development
Use Bun 1.4.2 and Node 24 for development and CI. Dependency updates use the Bun ecosystem so both package manifests and lockfiles stay consistent. The server retains SDK v1 and the worker uses Agents' legacy MCP handler; widgets use ext-apps v2. CI checks both locks for vulnerabilities and exercises the real worker HTTP transport as well as the local/worker parity suite. The worker entry module exports only its fetch handler; test helpers stay in the implementation module because workerd rejects constants as runtime entry points.
bun install
bun run dev # watch + serve (hot reload)
bun run build # production build (widgets must be built before the tests)
bun run test # run tests
bunx playwright install chromium # one-time browser install
bun run test:audio # real browser audio, visuals, WAV and MIDI exports
bun run test:package # check source and license contents of the npm packagedev/ is a local ext-apps host harness for driving the widgets outside a real client — see dev/README.md.
The browser audio gate starts that harness automatically and tests the built widgets using Chromium and the real MCP Apps bridge. It measures rendered audio samples, checks silence after stopping, and inspects exported WAV/MIDI bytes. It needs network access to the pinned Strudel runtime and ABC soundfont provider. CI and tag publishing both run it; failed runs retain traces and screenshots. The harness does not enforce a client's CSP or reproduce every client's sandbox and audio policy.
Privacy policy
Read the hosted privacy policy (source) for composition sharing, analytics, browser storage, Context7 search, external sample/script providers, retention, and contact details. Playback and persistent sharing are separate operations. Short browser links contain the composition itself; do not include sensitive information in them.
For example, explicitly creating a stored pattern link uses:
{
"kind": "play",
"pattern": { "code": "s(\"bd sd\")", "title": "My beat" }
}Call create-share-link only when the user asks to share or store the piece.
It also uploads to the hosted service when called through the local server.
Attribution
Forked from the Sheet Music Server example from MCP ext-apps by Anthropic, licensed under MIT.
Live coding is powered by Strudel — canonical repo at codeberg.org/uzu/strudel (the project moved off GitHub, so the GitHub mirror can be stale). Notation and playback use abcjs; shader backgrounds use hydra-synth.
License
The combined application is licensed under AGPL-3.0-or-later. The original MIT notices and grants are preserved in LICENSES/MIT.txt. This change does not revoke the licenses of earlier releases. See SOURCE.md for corresponding source and build instructions, and THIRD_PARTY_NOTICES.md for dependency and audio-asset licensing. Music you create is not automatically licensed under the application’s software license.
This server cannot be deployed
Maintenance
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Creative workspace. Public MCP: outline previews for Codex and Claude Code; media in the web app.
Autonomous music production for AI agents with MIDI generation, QC and provenance.
Deterministic music theory for agents: analyze, voice, reharmonize, conduct — computed, not guessed
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI-powered music generation and live coding by providing direct control over Strudel.cc through browser automation. Supports pattern creation, audio analysis, and pattern storage for TidalCycles/Strudel music patterns.42738 npm242AGPL 3.0
- FlicenseCqualityDmaintenanceEnables AI agents to generate, manipulate, and perform algorithmic music using Strudel.cc live coding environment. Provides 46+ tools for pattern generation across multiple genres, music theory operations, real-time audio analysis, and AI-powered composition.50-
- AlicenseNot gradedqualityBmaintenanceConnects Claude Code to SuperCollider for AI-driven music composition, supporting real-time playback and non-realtime audio rendering at 50-150x realtime speed.MIT
- AlicenseAqualityDmaintenanceEnables conversational live coding with Claude AI and TidalCycles, allowing users to create and manipulate algorithmic music patterns through natural language.717MIT