Skip to main content
Glama

Create Music Share Link

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.

Input Schema

NameRequiredDescriptionDefault
kindYes
scoreNoThe arguments you gave play-sheet-music.
patternNoThe arguments you gave play-live-pattern (theme and session are not carried).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. Changed17 schema fields changed
    • addedInput schema / properties / pattern / description
      Added value: +"The arguments you gave play-live-pattern (theme and session are not carried)."
    • removedInput schema / properties / pattern / properties / autoplay / description
      Removed value: -"Start playing immediately (default: true). May require user click due to browser autoplay policy."
    • removedInput schema / properties / pattern / properties / bpm / description
      Removed value: -"Tempo in BPM (40-300). Converts to setcps() automatically."
    • changedInput schema / properties / pattern / properties / code / description
      Previous value: -"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])."New value: +"The Strudel code, as for play-live-pattern."
    • removedInput schema / properties / pattern / properties / session
      Removed value: -{
      -  "description": "Open a LIVE SESSION: this player stays open as one performance. update-session swaps in new code on the next bar without a new player and says whether it ran; get-session reads the player's runtime reports and what the user did (taps, code edits, handing you the turn). Use it to iterate on a long piece, to check that a piece really played, or to jam back-to-back. Its log (reports, taps, edits, your updates) is kept on the server until 2 hours idle.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / pattern / properties / theme
      Removed value: -{
      -  "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.",
      -  "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"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / pattern / properties / title / description
      Removed value: -"Pattern title displayed in the widget header (e.g. 'Midnight Rain')."
    • removedInput schema / properties / pattern / properties / visuals / description
      Removed value: -"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')."
    • addedInput schema / properties / score / description
      Added value: +"The arguments you gave play-sheet-music."
    • addedInput schema / properties / score / properties / abcNotation / description
      Added value: +"The ABC notation, as for play-sheet-music."
    • removedInput schema / properties / score / properties / drumIntro / description
      Removed value: -"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."
    • changedInput schema / properties / score / properties / instrument / description
      Previous value: -"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."New value: +"General MIDI instrument name, as for play-sheet-music."
    • removedInput schema / properties / score / properties / style / description
      Removed value: -"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."
    • removedInput schema / properties / score / properties / swing / description
      Removed value: -"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."
    • removedInput schema / properties / score / properties / tempo / description
      Removed value: -"Tempo in BPM (40-240). Overrides Q: in ABC notation."
    • removedInput schema / properties / score / properties / title / description
      Removed value: -"Piece title (overrides T: in ABC). Shown in the widget header and used as the filename stem for the WAV/MIDI downloads."
    • removedInput schema / properties / score / properties / transpose / description
      Removed value: -"Transpose by semitones (-12 to 12). Positive=higher, negative=lower. Rewrites the notation and the key signature, so the printed score matches what plays."
  3. Changed1 schema field changed
    • addedInput schema / properties / pattern / properties / session
      Added value: +{
      +  "description": "Open a LIVE SESSION: this player stays open as one performance. update-session swaps in new code on the next bar without a new player and says whether it ran; get-session reads the player's runtime reports and what the user did (taps, code edits, handing you the turn). Use it to iterate on a long piece, to check that a piece really played, or to jam back-to-back. Its log (reports, taps, edits, your updates) is kept on the server until 2 hours idle.",
      +  "type": "boolean"
      +}
  4. Added

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), it discloses the crucial behavioral facts: 30-day hosting, public unauthenticated access by anyone with the link, and that re-creating the same share refreshes expiry rather than duplicating. That refresh semantics is a meaningful complement to idempotentHint=false. It stops short of stating what happens at expiry or whether a share can be revoked/deleted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the usage condition, then the storage/public-access facts, then the parameter contract, ending on a safety caveat. Every sentence carries information, though the play-in-browser sentence is dense and slightly convoluted ('when it fit in the link'), costing a little readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-branch nested-input creation tool with no output schema, the description covers when to call it, side effects, lifetime, and public exposure well. The remaining gap is that it never says the call returns the share URL or what the agent should do with it, and expiry/revocation behavior is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the description adds the conditional mapping the schema only implies: kind 'score' goes with score, kind 'play' goes with pattern. That is genuine disambiguation beyond the property list. It does not explain the nested fields (ABC notation vs Strudel code) or the autoplay/visuals options, which the schema descriptions partially cover.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (create a hosted music share link) and immediately bounds the scope: it uploads a score or pattern to MCP Music Studio and yields a short stored link. It also names the sibling behaviors it is not (play-sheet-music / play-live-pattern playback) so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('only when the user asks to share or store a piece online') plus an explicit when-not: playback does not require this tool, and a play result's '▶ Play in browser' link already opens the piece for anyone. It also clarifies the value-add case (a short stored link) versus the inline play link, which is exactly the routing decision an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.