# Music Studio

> ABC sheet music + Strudel live coding: songs, videos and live jam sessions in ext-apps widgets.

- name: io.github.linxule/mcp-music-studio
- version: 0.13.0
- connection class: R0 (autonomous)
- trust: 96/100
- quality: 72/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.linxule%2Fmcp-music-studio
- tools: https://api.protogrid.dev/v1/servers/io.github.linxule%2Fmcp-music-studio/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "mcp-music-studio": {
      "type": "http",
      "url": "https://music-studio.linxule.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 98
- freshness: 100
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-95% +updated-1d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 72/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 10 of 10 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 4,596 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 19 tool changes in 30 days
- fail `stability.rug_pull`: 2 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: deps.dev does not know mcp-music-studio@0.13.0

- tools: 10, about 4,596 tokens to load them all
- tool set hash: 6341ea54d54db75e3469e100152ab51d
- tools last changed: 2026-10-05T10:20:28.778Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.linxule/mcp-music-studio.svg)](https://protogrid.dev/servers/io.github.linxule/mcp-music-studio)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-05 `get-strudel-guide` changed (inputSchema)
- 2026-10-04 `get-strudel-guide` changed (description, inputSchema)
  - before: Reference material for Strudel live coding (performance mode). Topics: mini-notation (pattern syntax), sounds (synths, 71 drum banks, 128 GM instruments, 128 vcsl orchestral/percussion samples), effects (filters, reverb, delay, FM synthesis, envelopes), patterns (transformations, probability, euclidean, arrangement), genres (complete templates: techno/house/dnb/ambient/jazz/lofi/synthwave), tips (tempo, common mistakes, ABC↔Strudel crossover), visuals (pianoroll/scope draw methods, the visuals presets and the theme parameter), hydra (WebGL shader backgrounds: initHydra, H(pattern), the audio-reactive a.fft object, recipes, cheat-sheet), advanced (sample loading, wavetables, ZZFX, continuous signals, chord voicings). Beyond music — pattern code is real browser JavaScript: stage (your own canvases into Hydra, an ASCII camera, cycle/onFrame/onEvent/onTap/say), film (music videos and short films: scenes on bars, typewriter text, letterbox, narration), interactive (taps become notes, call and response, a voice that speaks on the beat), craft (what makes a piece land), debugging (what the widget reports back), gallery (complete pieces — a short film, a spoken duet, a Game of Life composer; fetch one with `piece`).
  - after: Reference and recipes for Strudel live coding. Music: genres (complete templates: techno, house, dnb, ambient, jazz, lofi, synthwave), mini-notation, sounds (synths, 71 drum banks, 128 GM instruments, vcsl samples), effects, patterns, tips (tempo, common mistakes), advanced (samples, wavetables, signals, chord voicings). Visuals: visuals (draw methods, presets, themes), hydra (shader backgrounds, H(pattern), the audio-reactive a.fft). Optional modules — the code is real browser JavaScript: stage (your own canvases, onFrame/onEvent/onTap, say), film (scenes on bars, text, narration), interactive (taps into notes, faders/pads/xy, tilt/mic, remember() for controls you draw, live sessions), craft (what makes a piece land), debugging (what the player reports back), gallery (complete pieces; fetch one with `piece`).
- 2026-10-04 `get-music-guide` changed (description)
  - before: Returns detailed reference material for music composition. Topics: instruments (GM instrument list + combos), drums (patterns + percussion notes), abc-syntax (notation reference), arrangements (multi-voice patterns), genres (complete ABC templates for jazz/blues/folk/rock/bossa/classical), styles (what each style preset does), midi-directives (%%MIDI reference).
  - after: Reference for ABC sheet music. Topics: genres (complete templates: jazz, blues, folk, rock, bossa, a 3/4 minuet, a lullaby), styles (what each accompaniment preset does), instruments (GM list + combos), drums (patterns + percussion notes), abc-syntax (notation reference), arrangements (multi-voice patterns), midi-directives (%%MIDI reference).
- 2026-10-04 `update-session` changed (description)
  - before: Swap a new pattern into a live session's player — no new player, the music keeps playing. Send the WHOLE pattern, as you would to play-live-pattern. It takes over at the next bar (quantize 1, the default), at the next multiple of n cycles, or at once (0). Patterns run on the session's clock, so set quantize to your phrase length (an 8-bar phrase → 8) and the swap lands on its first bar. The code is syntax-checked first; the result says whether the player ran it, and its error if not, when the player answers within a few seconds. Edit a piece's remember() state with a merge, not a new start value (get-strudel-guide topic 'interactive').
  - after: Only for a live session. Swaps new code into the session's player while the music keeps playing. Send the WHOLE pattern, as for play-live-pattern. It lands on the next bar (quantize 1, the default), the next multiple of n bars, or at once (0): set quantize to your phrase length (8-bar phrase → 8). If the player answers within a few seconds, the result says whether it ran the code, or its error. To change a piece's remember() state, ship a merge, not a new start value (get-strudel-guide topic 'interactive').
- 2026-10-04 `get-session` changed (description, inputSchema)
  - before: Read a live session opened by play-live-pattern(session: true): whether the player is up and what it is playing, its runtime reports (errors, silence, missing sounds, a callback that threw), and what the human did since your last read — taps (cycle and position), changes to the piece's remember() state (with its current values), code they edited and ran, and when they passed the turn to you. Read it before assuming a piece played, and when the user says it's your turn. With wait: 'pass' it LISTENS — holds until the listener presses Pass — so you can play a whole back-to-back set in one turn: update-session, get-session(wait: 'pass'), answer, listen again. The listener can also End the session from the player; get-session then says so, and the player stops listening for updates.
  - after: Only for a live session (play-live-pattern session: true). Reads whether the player is up and what it played, its errors and silences, and what the human did since your last read: taps, changes to remember() state, code they ran, a Pass to you, or End. Read it before assuming a piece played. With wait: 'pass' it listens until the human presses Pass, so a whole back-and-forth set fits in one turn: update-session, get-session(wait: 'pass'), answer, listen again.
- 2026-10-04 `play-live-pattern` changed (description, inputSchema) **meaning changed**
  - before: Live-code music patterns using TidalCycles mini-notation in JavaScript. Layer drums, synths, and bass with stack(). Choose from 71 drum machine banks, 128 GM instruments, built-in synths, and a full effects chain. Patterns play in a REPL the user can edit directly. Add .pianoroll() to a pattern to show a live piano-roll animation in the widget (or .punchcard()/.scope()/.spectrum() — one draw method per pattern). For a custom animated background, start the code with `await initHydra()` and write Hydra shader code — H(pattern) locks it to the sequence, and `() => a.fft[0]` makes it react to the audio itself (Strudel's output, not the mic); see get-strudel-guide topic 'hydra'. Rather not hand-write one? `visuals` picks a ready-made animation for code that has none (pianoroll/punchcard/scope/spectrum, or hydra-kaleid/pulse/wash/feed). `theme` sets the code-editor colour scheme, which also tints the visuals — match it to the mood (teletext chiptune, sonicPink synthwave, nord ambient, gruvboxDark lofi). Beyond music: the code is real browser JavaScript — cycle(), onFrame, onEvent(pattern, fn), onTap and say(text) (a spoken line as a sample) build music videos, short films and interactive pieces, and fader('name') / pad('name') / xy('name') put controls on the player that the user performs (each is a pattern, e.g. .gain(fader('rain'))), and tilt() / mic() follow the device's motion and microphone where allowed (played by hand where not); see topics 'stage', 'film', 'interactive' and 'gallery'. Each call creates a NEW player. To keep one player going — iterating on a piece, or playing back-to-back with the user — pass session: true, then change it with update-session (it swaps on the next bar) and read what happened with get-session (runtime errors, the user's taps and edits). Use get-strudel-guide for genre templates, sound references, and advanced features like arrangement and sample loading. The Strudel REPL renders inline with an editable code editor, visualizations, and playback controls.
  - after: Live-code music in Strudel (TidalCycles mini-notation in JavaScript) and play it in a player the user can edit. Layer drums, bass and melody with stack(): 71 drum-machine banks, 128 GM instruments, synths and a full effects chain. Add .pianoroll() for a live piano roll (or .punchcard()/.scope()/.spectrum(), one per pattern), pass `visuals` for a ready-made animation and `theme` for the editor colours. Each call creates a NEW player. Optional, when you want more (get-strudel-guide topic in brackets): shader backgrounds that follow the music — start with `await initHydra()`, lock to the beat with H(pattern), react to the sound with () => a.fft[0] ('hydra'); canvases, scenes and spoken lines for music videos and films ('stage', 'film'); taps, faders, pads and controls you draw, played by the user; tilt and mic, which follow the phone on the browser player (a chat's frame usually blocks them) ('interactive'); complete pieces ('gallery'). To jam back and forth, or to change a piece while it plays, pass session: true, then use update-session and get-session. The Strudel REPL renders inline with an editable code editor, visualizations, and playback controls.
- 2026-10-04 `play-sheet-music` changed (description) **meaning changed**
  - before: Compose and play sheet music with visual notation, multi-instrument audio, and style presets. Write ABC notation for melodies, arrangements, harmonized pieces, or well-known tunes. Add a style (rock, jazz, bossa, waltz, folk...) for automatic drums, bass, and chord accompaniment. Returns a parse-status confirmation and renders the player; it does not return raw audio. Use get-music-guide for genre templates, instrument lists, and ABC syntax reference. The music player renders inline with interactive playback controls.
  - after: Write a score in ABC notation and play it as sheet music: a melody, a harmonized piece, a multi-voice arrangement or a well-known tune, on any of the 128 General MIDI instruments. Put chord symbols above the notes and add a style (rock, jazz, bossa, waltz, folk...) for drums, bass and chords. The user can edit the score in the player, change its style and instrument, and download WAV or MIDI. The result confirms the parse; it returns no audio. Start with get-music-guide topic 'genres'; 'abc-syntax' and 'instruments' for the rest. The music player renders inline with interactive playback controls.
- 2026-10-04 `create-share-link` changed (description, inputSchema)
  - before: Create a hosted music share link only when the user asks to share or store a piece online. Uploads the supplied score or pattern to MCP Music Studio for 30 days; anyone with the link can view and play it without signing in. Creating the same share again refreshes its expiry. Playback does not require this tool. Provide kind 'score' with score, or kind 'play' with pattern. Never include private information or secrets.
  - after: Create a hosted music share link only when the user asks to share or store a piece online. Uploads the supplied score or pattern to MCP Music Studio for 30 days; anyone with the link can view and play it without signing in. Creating the same share again refreshes its expiry. Playback does not require this tool, and a play result's '▶ Play in browser' link already opens the piece for anyone when it fit in the link; this tool gives a short stored link. Provide kind 'score' with score, or kind 'play' with pattern. Never include private information or secrets.
- 2026-10-03 `get-strudel-guide` changed (inputSchema)
- 2026-10-03 `update-session` changed (description)
  - before: Swap a new pattern into a live session's player — no new player, the music keeps playing. Send the WHOLE pattern, as you would to play-live-pattern. It takes over at the next bar (quantize 1, the default), at the next multiple of n cycles, or at once (0). Patterns run on the session's clock, so set quantize to your phrase length (an 8-bar phrase → 8) and the swap lands on its first bar. The code is syntax-checked first; the result says whether the player ran it, and its error if not, when the player answers within a few seconds.
  - after: Swap a new pattern into a live session's player — no new player, the music keeps playing. Send the WHOLE pattern, as you would to play-live-pattern. It takes over at the next bar (quantize 1, the default), at the next multiple of n cycles, or at once (0). Patterns run on the session's clock, so set quantize to your phrase length (an 8-bar phrase → 8) and the swap lands on its first bar. The code is syntax-checked first; the result says whether the player ran it, and its error if not, when the player answers within a few seconds. Edit a piece's remember() state with a merge, not a new start value (get-strudel-guide topic 'interactive').

Full history: https://api.protogrid.dev/v1/servers/io.github.linxule%2Fmcp-music-studio/changes

## Dependencies

- npm mcp-music-studio@0.13.0: unknown

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://music-studio.linxule.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.9456522)

## Packages

- npm mcp-music-studio@0.13.0

## Tools (10)

- `analyze-harmony`: Music theory helper: name a chord from notes, guess the key, get a progression, or list what fits a key. Returns both the ABC chord-symbol spelling (for play-sheet-music) and the Strudel form (for play-live-pattern). Tasks: detect-chord (notes -> chord name + what to play next), detect-key (notes or chords -> best key + diatonic chords), suggest-progression (key [+ romanNumerals] -> chord symbols), scale-for-chord (chords -> the scale to improvise over each), key-chords (key -> every diatonic triad, seventh, and chord scale). Use it before writing chord symbols for a style preset, or to check a harmonization.
- `convert-abc-to-strudel`: Turn an ABC melody into Strudel mini-notation so a scored piece can be remixed live. Returns runnable code — setcps() from the Q: tempo, one [...] bar group per bar inside note("<...>"), with a chord("<...>").voicing() layer stacked alongside it when the ABC has chord symbols (one stack(), because Strudel plays only the last expression) — then pass it to play-live-pattern. Durations become @ weights, rests become ~, triplets nest, the key signature is folded into the note names, and %%MIDI program picks the sound. Lists what was lost (grace notes, dynamics, repeats, lyrics, other voices, inline tempo changes, a short final bar, ABC's own gchord/drum accompaniment). Pick a single voice with `voice`; re-run per voice and stack() them for a full arrangement.
- `create-share-link`: Create a hosted music share link only when the user asks to share or store a piece online. Uploads the supplied score or pattern to MCP Music Studio for 30 days; anyone with the link can view and play it without signing in. Creating the same share again refreshes its expiry. Playback does not require this tool, and a play result's '▶ Play in browser' link already opens the piece for anyone when it fit in the link; this tool gives a short stored link. Provide kind 'score' with score, or kind 'play' with pattern. Never include private information or secrets.
- `get-music-guide`: Reference for ABC sheet music. Topics: genres (complete templates: jazz, blues, folk, rock, bossa, a 3/4 minuet, a lullaby), styles (what each accompaniment preset does), instruments (GM list + combos), drums (patterns + percussion notes), abc-syntax (notation reference), arrangements (multi-voice patterns), midi-directives (%%MIDI reference).
- `get-session`: Only for a live session (play-live-pattern session: true). Reads whether the player is up and what it played, its errors and silences, and what the human did since your last read: taps, changes to remember() state, code they ran, a Pass to you, or End. Read it before assuming a piece played. With wait: 'pass' it listens until the human presses Pass, so a whole back-and-forth set fits in one turn: update-session, get-session(wait: 'pass'), answer, listen again.
- `get-strudel-guide`: Reference and recipes for Strudel live coding. Music: genres (complete templates: techno, house, dnb, ambient, jazz, lofi, synthwave), mini-notation, sounds (synths, 71 drum banks, 128 GM instruments, vcsl samples), effects, patterns, tips (tempo, common mistakes), advanced (samples, wavetables, signals, chord voicings). Visuals: visuals (draw methods, presets, themes), hydra (shader backgrounds, H(pattern), the audio-reactive a.fft). Optional modules — the code is real browser JavaScript: stage (your own canvases, onFrame/onEvent/onTap, say), film (scenes on bars, text, narration), interactive (taps into notes, faders/pads/xy, tilt/mic, remember() for controls you draw, live sessions), craft (what makes a piece land), debugging (what the player reports back), gallery (complete pieces; fetch one with `piece`).
- `play-live-pattern`: Live-code music in Strudel (TidalCycles mini-notation in JavaScript) and play it in a player the user can edit. Layer drums, bass and melody with stack(): 71 drum-machine banks, 128 GM instruments, synths and a full effects chain. Add .pianoroll() for a live piano roll (or .punchcard()/.scope()/.spectrum(), one per pattern), pass `visuals` for a ready-made animation and `theme` for the editor colours. Each call creates a NEW player. Optional, when you want more (get-strudel-guide topic in brackets): shader backgrounds that follow the music — start with `await initHydra()`, lock to the beat with H(pattern), react to the sound with () => a.fft[0] ('hydra'); canvases, scenes and spoken lines for music videos and films ('stage', 'film'); taps, faders, pads and controls you draw, played by the user; tilt and mic, which follow the phone on the browser player (a chat's frame usually blocks them) ('interactive'); complete pieces ('gallery'). To jam back and forth, or to change a piece while it plays, pass session: true, then use update-session and get-session.

The Strudel REPL renders inline with an editable code editor, visualizations, and playback controls.
- `play-sheet-music`: Write a score in ABC notation and play it as sheet music: a melody, a harmonized piece, a multi-voice arrangement or a well-known tune, on any of the 128 General MIDI instruments. Put chord symbols above the notes and add a style (rock, jazz, bossa, waltz, folk...) for drums, bass and chords. The user can edit the score in the player, change its style and instrument, and download WAV or MIDI. The result confirms the parse; it returns no audio. Start with get-music-guide topic 'genres'; 'abc-syntax' and 'instruments' for the rest.

The music player renders inline with interactive playback controls.
- `search-music-docs`: Search detailed documentation for Strudel live coding or ABC/ABCJS notation. Returns relevant code examples and explanations from the official docs. Use this when the curated guides (get-strudel-guide, get-music-guide) don't cover what you need — for specific functions, advanced techniques, or when you're unsure about syntax. Powered by semantic search over strudel.cc and ABCJS docs.
- `update-session`: Only for a live session. Swaps new code into the session's player while the music keeps playing. Send the WHOLE pattern, as for play-live-pattern. It lands on the next bar (quantize 1, the default), the next multiple of n bars, or at once (0): set quantize to your phrase length (8-bar phrase → 8). If the player answers within a few seconds, the result says whether it ran the code, or its error. To change a piece's remember() state, ship a merge, not a new start value (get-strudel-guide topic 'interactive').
