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

TableJSON 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. 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."
  2. 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"
      +}
  3. Added

TDQS

A4.5/5.0
Behavior5/5

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

Adds far more than the annotations provide: 30-day retention, public unauthenticated viewing, that re-creating the same share refreshes expiry rather than duplicating, and a privacy warning. These detail the openWorld/idempotent implications concretely instead of restating the hints.

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-loads the action and the usage condition in the first sentence, and every clause carries information. It is dense with semicolon-joined clauses, which slightly hurts scannability, but nothing is wasted.

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?

No output schema exists, and the description compensates by describing the produced artifact (a short stored link) and its lifetime. The only mild gap is that it never says the link itself is the return value explicitly, but the meaning is recoverable.

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

Parameters3/5

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

Schema description coverage is 67%, and the description does add the key discriminator mapping: 'kind score with score, or kind play with pattern.' Beyond that it defers to play-sheet-music and play-live-pattern arguments, so the nested payload fields are not explained here. Useful but largely a pointer to sibling schemas.

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 scopes it against the sibling playback tools by noting playback does not require this tool. An agent can distinguish this from play-sheet-music and play-live-pattern 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') and an explicit alternative path (a play result's '▶ Play in browser' link already opens the piece). It also tells the agent which kind to use for which payload, closing off the main selection ambiguity.

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.