{"name":"io.github.linxule/mcp-music-studio","slug":"linxule-mcp-music-studio","title":"Music Studio","description":"ABC sheet music + Strudel live coding studio with ext-apps widgets, harmony tools, and share links.","url":"https://mcp.market/server/linxule-mcp-music-studio","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":53,"stars":71,"forks":9,"downloads_week":311,"last_push_at":"2026-09-14T11:16:51.000Z","license":"MIT"},"uptime":{"percent":100,"checks":2,"ok":2,"last_checked_at":"2026-09-19T23:31:05.044Z","last_ok_at":"2026-09-19T23:31:05.044Z","latency_ms":422},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/linxule/mcp-music-studio","website":"https://mcp-music-studio.linxule.workers.dev","version":"0.5.6","remotes":[{"type":"streamable-http","url":"https://mcp-music-studio.linxule.workers.dev/mcp"}],"packages":[{"registryType":"npm","identifier":"mcp-music-studio","version":"0.5.6","transport":{"type":"stdio"}}],"tools":[{"name":"analyze-harmony","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task":{"type":"string","enum":["detect-chord","detect-key","suggest-progression","scale-for-chord","key-chords"],"description":"What to work out. detect-chord/detect-key need notes or chords; suggest-progression/key-chords need a key."},"notes":{"description":"Note names, e.g. [\"c4\",\"e4\",\"g4\",\"b4\"] or [\"C\",\"Eb\",\"G\"]. For detect-chord/detect-key.","maxItems":64,"type":"array","items":{"type":"string"}},"chords":{"description":"Chord symbols, e.g. [\"Dm7\",\"G7\",\"Cmaj7\"]. For detect-key/scale-for-chord.","maxItems":64,"type":"array","items":{"type":"string"}},"key":{"description":"Key, e.g. \"C\", \"A minor\", \"F# major\". For suggest-progression/key-chords.","type":"string"},"romanNumerals":{"description":"Roman numerals to render in the key, e.g. [\"ii7\",\"V7\",\"Imaj7\"] or [\"I\",\"V\",\"vi\",\"IV\"]. Optional for suggest-progression — omit it to get common progressions instead.","maxItems":64,"type":"array","items":{"type":"string"}}},"required":["task"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"convert-abc-to-strudel","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"abcNotation":{"type":"string","maxLength":65536,"description":"ABC notation to convert (the same string you'd pass to play-sheet-music)."},"voice":{"description":"Which voice to convert, 1-based, counted across all staves (default 1). Multi-voice tunes report how many voices there are.","type":"integer","minimum":1,"maximum":9007199254740991},"sound":{"description":"Strudel sound for the melody (defaults to the tune's %%MIDI program, else \"gm_piano\"). Use a GM soundfont name like gm_flute or gm_epiano1 — see get-strudel-guide topic 'sounds'.","type":"string"}},"required":["abcNotation"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get-music-guide","description":"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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["instruments","drums","abc-syntax","arrangements","genres","styles","midi-directives"],"description":"Reference topic. Start with 'genres' for complete examples, 'styles' to understand presets, or 'instruments' for the full instrument list."}},"required":["topic"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get-strudel-guide","description":"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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["mini-notation","sounds","effects","patterns","genres","tips","visuals","hydra","advanced"],"description":"Reference topic. Start with 'genres' for working templates, 'sounds' for instruments, 'visuals' for draw methods and presets, 'hydra' for shader backgrounds, 'advanced' for sample loading."}},"required":["topic"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"play-live-pattern","description":"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). Each call creates a NEW player rather than updating the last one — for a tweak, send the whole revised pattern and ask the user to stop the previous one. Use get-strudel-guide for genre templates, sound references, and advanced features like arrangement and sample loading.\n\nThe Strudel REPL renders inline with an editable code editor, visualizations, and playback controls.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"type":"string","maxLength":65536,"description":"Strudel pattern code. Uses TidalCycles mini-notation in JavaScript. Use stack() to layer drums, bass, and melody. Set tempo with setcps(bpm/60/4) or use the bpm parameter. The REPL plays the LAST expression: setup lines (await initHydra(), all(), setcps()) go BEFORE the pattern. Double quotes are mini-notation — use single quotes for plain strings and URLs. One draw method per pattern; pass a.fft values as functions (() => a.fft[0])."},"title":{"description":"Pattern title displayed in the widget header (e.g. 'Midnight Rain').","type":"string"},"bpm":{"description":"Tempo in BPM (40-300). Converts to setcps() automatically.","type":"number","minimum":40,"maximum":300},"autoplay":{"description":"Start playing immediately (default: true). May require user click due to browser autoplay policy.","type":"boolean"},"visuals":{"description":"Ready-made visual, for when the code has none of its own. pianoroll/punchcard/scope/spectrum draw onto the 2D canvas behind the code; hydra-kaleid (rotating kaleidoscope), hydra-pulse (shape driven by a rhythm), hydra-wash (slow ambient noise) and hydra-feed (the piano roll mirrored and trailed) are WebGL shader backgrounds. A preset fills the MISSING layer: a hydra preset is skipped only if the code already calls initHydra(), a 2D preset only if the code already has a draw method — so hydra-wash layers happily under your own .pianoroll(). Hydra presets are dropped for viewers who prefer reduced motion. Writing your own visual is still the better result (draw methods: topic 'visuals'; shaders: topic 'hydra').","type":"string","enum":["none","pianoroll","punchcard","scope","spectrum","hydra-kaleid","hydra-pulse","hydra-wash","hydra-feed"]},"theme":{"description":"Editor colour theme; the visuals stage and its readability scrim are derived from it, so it also decides whether a shader sits on a dark or light ground — prefer a dark one when the visual is the point (e.g. 'nord', 'sonicPink', 'tokyoNight'). Not carried into share links or the browser fallback.","type":"string","enum":["strudelTheme","algoboy","archBtw","androidstudio","atomone","aura","bbedit","blackscreen","bluescreen","bluescreenlight","CutiePi","darcula","dracula","duotoneDark","eclipse","fruitDaw","githubDark","githubLight","greenText","gruvboxDark","gruvboxLight","sonicPink","materialDark","materialLight","monokai","noctisLilac","nord","redText","solarizedDark","solarizedLight","sublime","teletext","tokyoNight","tokyoNightDay","tokyoNightStorm","vscodeDark","vscodeLight","whitescreen","xcodeLight"]}},"required":["code"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"play-sheet-music","description":"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.\n\nThe music player renders inline with interactive playback controls.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"abcNotation":{"default":"X:1\nT:Twinkle, Twinkle Little Star\nM:4/4\nL:1/4\nK:C\nC C G G | A A G2 | F F E E | D D C2 |\nG G F F | E E D2 | G G F F | E E D2 |\nC C G G | A A G2 | F F E E | D D C2 |","description":"ABC notation string. Include chord symbols (\"C\", \"Am7\") above notes for auto-accompaniment with style presets.","type":"string","maxLength":65536},"title":{"description":"Piece title (overrides T: in ABC). Shown in the widget header and used as the filename stem for the WAV/MIDI downloads.","type":"string"},"instrument":{"description":"Default instrument for the main voice — any of the 128 General MIDI names (e.g. 'Flute', 'Cello', 'Banjo', 'Alto Sax'). Matching is fuzzy and picks the lowest GM program among the hits, so 'sax' gives Soprano Sax; the result text names what you actually got whenever it isn't what you asked for. Use get-music-guide with topic 'instruments' for the full list, or %%MIDI program N in the ABC to set a program per voice.","type":"string"},"style":{"description":"Accompaniment style. Adds drums, bass, and chord patterns automatically. Your ABC needs chord symbols (\"C\", \"Am\") for accompaniment to work. Options: rock, jazz, bossa, waltz, march, reggae, folk, classical.","type":"string","enum":["rock","jazz","bossa","waltz","march","reggae","folk","classical"]},"tempo":{"description":"Tempo in BPM (40-240). Overrides Q: in ABC notation.","type":"number","minimum":40,"maximum":240},"swing":{"description":"Swing as the share of the beat given to its first half. 50 = straight, 60 ≈ 3:2, 66 = triplet swing, 75 = maximum (dotted eighth + sixteenth). Anything at or below 50 is treated as no swing. Only takes effect in an x/4 or x/8 meter.","type":"number","minimum":0,"maximum":75},"drumIntro":{"description":"Bars of count-in before the melody starts (0-8). Needs a style preset — the count-in is played by that style's drum kit, so without a style you get silent bars instead.","type":"integer","minimum":0,"maximum":8},"transpose":{"description":"Transpose by semitones (-12 to 12). Positive=higher, negative=lower. Rewrites the notation and the key signature, so the printed score matches what plays.","type":"integer","minimum":-12,"maximum":12}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"search-music-docs","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"description":"What you want to know. Be specific. Good: 'how to use FM synthesis with envelope' or 'chop and slice sample manipulation'. Bad: 'effects' or 'help'."},"library":{"default":"strudel","description":"Which library to search: 'strudel' for live coding patterns, 'abcjs' for sheet music notation.","type":"string","enum":["strudel","abcjs"]}},"required":["query"],"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-19T21:08:23.445Z","report":{"scannerVersion":"0.1.8","scannedAt":"2026-09-19T21:08:23.429Z","components":{"code":{"score":15,"max":25,"notes":["26 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 984ms"]},"poisoning":{"score":15,"max":15,"notes":["7 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 5 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/index.js: ….name = fn.name; var deprecatedfn = new Function(\"fn\", \"log\", \"deprecate\", \"message\", \"si…"},{"id":"obf.hex-density","severity":"medium","component":"code","title":"Heavily hex-escaped string (obfuscation)","evidence":"dist/index.js: …00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b \\v\\f\\r\\x0E\\x0F\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1A\\x1B\\x1C\\x1D\\x1E\\x1F !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFG…"}],"inputs":{"probes":[{"url":"https://mcp-music-studio.linxule.workers.dev/mcp","reachable":true,"authRequired":false,"latencyMs":984,"serverInfo":{"name":"Music Studio","version":"0.5.6"}}],"packages":[{"registryType":"npm","identifier":"mcp-music-studio","version":"0.5.6","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":13,"publishedAt":"2026-09-14T11:20:33.696Z","repositoryUrl":"git+https://github.com/linxule/mcp-music-studio.git","weeklyDownloads":311}],"repo":{"found":true,"owner":"linxule","repo":"mcp-music-studio","archived":false,"pushedAt":"2026-09-14T11:16:51Z","stars":71,"forks":9,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/43122877?v=4","ownerCreatedAt":"2018-09-10T00:59:12Z","license":"MIT"},"icon":{"url":"https://raw.githubusercontent.com/linxule/mcp-music-studio/main/assets/logo.png","source":"registry","width":1024,"height":1024},"presence":{"stars":71,"forks":9,"downloadsWeek":311,"license":"MIT","lastPushAt":"2026-09-14T11:16:51.000Z","score":53}}}},"grade_history":[],"reviews":[]}