{"version":"1.9.0","apiVersion":"v1","count":41,"tools":[{"name":"activate_track_version","title":"Activate track version","description":"Make an existing version the active one: the track then plays and shares that file. Use list_track_versions to find version IDs.","inputSchema":{"type":"object","properties":{"versionId":{"type":"string","description":"Version ID to activate"},"trackId":{"type":"string","description":"Track ID"}},"required":["versionId","trackId"],"additionalProperties":false},"annotations":{"title":"Activate track version","readOnlyHint":false,"destructiveHint":true}},{"name":"add_tracks_to_playlist","title":"Add tracks to playlist","description":"Add one or more tracks to an existing playlist","inputSchema":{"type":"object","properties":{"trackIds":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Track IDs to add"},"playlistId":{"type":"string","description":"The playlist ID"}},"required":["trackIds","playlistId"],"additionalProperties":false},"annotations":{"title":"Add tracks to playlist","readOnlyHint":false,"destructiveHint":false}},{"name":"apply_suggested_tags","title":"Apply suggested tags","description":"Overwrite ALL of a track's tags with the model's unreviewed guesses, contradictions included.\nPrefer update_track_tags with values the user has actually confirmed. Only use this when the\nuser has explicitly asked to accept everything as-is. If the track has no stored suggestions,\nanalysis is re-queued and nothing is applied.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID whose suggested tags should be applied"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Apply suggested tags","readOnlyHint":false,"destructiveHint":true}},{"name":"batch_auto_tag","title":"Batch auto-tag","description":"Queue AI auto-tagging for multiple tracks at once. Each track is processed asynchronously.","inputSchema":{"type":"object","properties":{"trackIds":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Array of track IDs to auto-tag"}},"required":["trackIds"],"additionalProperties":false},"annotations":{"title":"Batch auto-tag","readOnlyHint":false,"destructiveHint":false}},{"name":"create_composer","title":"Create composer","description":"Create a new composer / shareholder. fullName and email are required.","inputSchema":{"type":"object","properties":{"fullName":{"type":"string","description":"Full legal name of the composer"},"artistName":{"type":"string","description":"Stage / artist name"},"email":{"type":"string","format":"email","description":"Composer email address"},"publisher":{"type":"string","description":"Publisher name"},"pro":{"type":"string","description":"Performing rights organisation (e.g. ASCAP, BMI)"},"ipi":{"type":"string","description":"IPI / CAE number"}},"required":["fullName","email"],"additionalProperties":false},"annotations":{"title":"Create composer","readOnlyHint":false,"destructiveHint":false}},{"name":"create_playlist","title":"Create playlist","description":"Create a new playlist, optionally adding tracks to it","inputSchema":{"type":"object","properties":{"name":{"type":"string","maxLength":120,"description":"Playlist name"},"description":{"type":"string","maxLength":2000,"description":"Playlist description"},"trackIds":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Track IDs to include in the playlist"},"dedupe":{"type":"boolean","description":"Remove duplicate track IDs (default: false)"}},"required":["name","trackIds"],"additionalProperties":false},"annotations":{"title":"Create playlist","readOnlyHint":false,"destructiveHint":false}},{"name":"delete_composer","title":"Delete composer","description":"Delete a composer / shareholder by ID. This is permanent.","inputSchema":{"type":"object","properties":{"composerId":{"type":"string","description":"The composer ID to delete"}},"required":["composerId"],"additionalProperties":false},"annotations":{"title":"Delete composer","readOnlyHint":false,"destructiveHint":true}},{"name":"delete_track_version","title":"Delete track version","description":"Permanently delete an inactive version and its audio file. The active version cannot be deleted — activate another version first.","inputSchema":{"type":"object","properties":{"versionId":{"type":"string","description":"Version ID to delete"},"trackId":{"type":"string","description":"Track ID"}},"required":["versionId","trackId"],"additionalProperties":false},"annotations":{"title":"Delete track version","readOnlyHint":false,"destructiveHint":true}},{"name":"find_duplicate_tracks","title":"Find duplicate tracks","description":"Find exact-duplicate tracks in your library, grouped by content hash (cid). Duplicates means the same audio file bytes were uploaded more than once — renamed copies are still caught, re-encoded files are not. Tracks without a content hash (analysis not yet run) cannot be checked and are reported as missingCid; triggering auto-tag/analysis populates the hash.","inputSchema":{"type":"object","properties":{"offset":{"type":"number","minimum":0,"description":"Groups to skip, for paging (default: 0)"},"limit":{"type":"number","minimum":1,"maximum":100,"description":"Max duplicate groups to return (default: 20, max: 100)"}},"additionalProperties":false},"annotations":{"title":"Find duplicate tracks","readOnlyHint":true}},{"name":"get_brief_submissions","title":"Get brief submissions","description":"List all submissions a brief you own has received, including the submitted tracks (or external links) and who was invited.","inputSchema":{"type":"object","properties":{"briefId":{"type":"string","description":"The brief ID"}},"required":["briefId"],"additionalProperties":false},"annotations":{"title":"Get brief submissions","readOnlyHint":true}},{"name":"get_composer","title":"Get composer","description":"Get a single composer / shareholder by ID, including linked tracks. Compact by default; pass detail:\"full\" for the raw payload.","inputSchema":{"type":"object","properties":{"composerId":{"type":"string","description":"The composer ID"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"required":["composerId"],"additionalProperties":false},"annotations":{"title":"Get composer","readOnlyHint":true}},{"name":"get_composer_count","title":"Get composer count","description":"Get the total number of composers / shareholders for the authenticated user","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Get composer count","readOnlyHint":true}},{"name":"get_dashboard","title":"Get dashboard","description":"Get this week's activity summary: tracks uploaded, views and downloads received, recent activity, library totals, and your dominant genre/mood.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Get dashboard","readOnlyHint":true}},{"name":"get_entity_stats","title":"Get entity stats","description":"Get engagement stats (plays, views, downloads, saves, shares, comments) for specific tracks or playlists, aggregated from the activity log. Optionally limit to a date range.","inputSchema":{"type":"object","properties":{"entity":{"type":"string","enum":["track","playlist"],"description":"Entity type the IDs refer to"},"ids":{"minItems":1,"maxItems":50,"description":"Track or playlist IDs (max 50)","type":"array","items":{"type":"string"}},"since":{"type":"string","description":"Only count activity at/after this ISO date (e.g. 2026-01-01)"},"until":{"type":"string","description":"Only count activity at/before this ISO date"}},"required":["entity","ids"],"additionalProperties":false},"annotations":{"title":"Get entity stats","readOnlyHint":true}},{"name":"get_playlist","title":"Get playlist","description":"Get a single playlist with its tracks. Compact by default (track micro-summaries); pass detail:\"full\" for the raw payload including download links and full audio profiles.","inputSchema":{"type":"object","properties":{"playlistId":{"type":"string","description":"The playlist ID"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"required":["playlistId"],"additionalProperties":false},"annotations":{"title":"Get playlist","readOnlyHint":true}},{"name":"get_suggested_tags","title":"Get suggested tags","description":"The model's guesses for a track's tags, pending review, each with a confidence score, plus the\nanalysis status and intelligence data (BPM, key, energy). These are a first draft, not an answer:\npresent them to the user and get a yes before applying anything. `contradictions` lists pairs\nthat should not describe one track (an upbeat mood next to a regret lyric theme), each with\nboth scores and a reason — put those to the user as a question rather than passing both through.\nGenre is the one to check if you check only one. Piano is often missed, so its absence here is\nnot evidence it is not in the track — ask when it comes up.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Get suggested tags","readOnlyHint":true}},{"name":"get_tag_taxonomy","title":"Get tag taxonomy","description":"List all available tag values grouped by category: genres, moods, instruments, vocal types, lyric themes, audio types, tempos, eras, characters, and movements. Use this to discover valid tag values before tagging tracks. Vocal types such as Harmonies, Background vocals and Choir are for tracks where that feature defines the record, not where it appears once — see update_track_tags for the bar. Returns plain name arrays by default; pass detail:\"full\" for raw rows (ids, codes, ordering).","inputSchema":{"type":"object","properties":{"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"additionalProperties":false},"annotations":{"title":"Get tag taxonomy","readOnlyHint":true}},{"name":"get_top_tracks","title":"Get top tracks","description":"Rank your tracks by a single engagement metric (plays, views, downloads, saves, shares, or comments). Optionally limit to a date range.","inputSchema":{"type":"object","properties":{"metric":{"type":"string","enum":["plays","views","downloads","saved","shares","comments"],"description":"Metric to rank by"},"since":{"type":"string","description":"Only count activity at/after this ISO date"},"until":{"type":"string","description":"Only count activity at/before this ISO date"},"limit":{"type":"number","minimum":1,"maximum":50,"description":"Number of tracks to return (default: 10, max: 50)"}},"required":["metric"],"additionalProperties":false},"annotations":{"title":"Get top tracks","readOnlyHint":true}},{"name":"get_track","title":"Get track","description":"Get a single track with its audio profile, tags and placementStatus. Returns a compact object by default (about 1 KB; includes placementStatus and autotagModelVersion, the tagger build behind the applied auto-tags); pass detail:\"full\" for every field of the track record (a few KB: shareholders, versions, per-tag autotagged/accuracy/modelVersion). The audio analysis output is not included; use get_track_analysis for that.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Get track","readOnlyHint":true}},{"name":"get_track_analysis","title":"Get track analysis","description":"Get the raw audio analysis behind a track's auto-tags: the merged audioAnalysis summary and rawAudioAnalysis, the per-segment, timestamped classifier output (label/score/startSec/endSec per model). Large: typically several hundred KB to over 1 MB for one track. Only call this when you need the frame-level detail, such as auditing why a tag was suggested; get_track and get_suggested_tags cover the ordinary questions.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Get track analysis","readOnlyHint":true}},{"name":"get_track_count","title":"Get track count","description":"Get the total number of tracks in your library (a cheap count, no paging needed)","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Get track count","readOnlyHint":true}},{"name":"get_track_submissions","title":"Get track submissions","description":"Trace where a track has been submitted: lists every brief (opportunity) the track was submitted to, with brief status, deadline, and whether it went via an email invite.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID to trace"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Get track submissions","readOnlyHint":true}},{"name":"list_briefs","title":"List briefs","description":"List briefs (calls for submissions) you own, with submission and invite counts.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"List briefs","readOnlyHint":true}},{"name":"list_composers","title":"List composers","description":"List composers / shareholders for the authenticated user, including the tracks linked to each. Compact by default; pass detail:\"full\" for raw API payloads.","inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor (a composer ID from a previous page)"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"additionalProperties":false},"annotations":{"title":"List composers","readOnlyHint":true}},{"name":"list_playlists","title":"List playlists","description":"List playlists for the authenticated user with track counts. Compact by default; pass detail:\"full\" for raw API payloads.","inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor"},"limit":{"type":"number","minimum":1,"maximum":200,"description":"Number of results (default: 50)"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"additionalProperties":false},"annotations":{"title":"List playlists","readOnlyHint":true}},{"name":"list_track_versions","title":"List track versions","description":"List the audio versions (upload history) of a track: label, name, whether it is the active version, size, and a one-hour download link. Compact by default; pass detail:\"full\" for the raw payload.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"Track ID"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"List track versions","readOnlyHint":true}},{"name":"list_tracks","title":"List tracks","description":"Search and list tracks with optional filters (query, tags, placement status, date range, sorting). Returns compact track objects by default (tag names per category, placementStatus, and autotagModelVersion, the tagger build behind the applied auto-tags); pass detail:\"full\" for raw API payloads with per-tag autotagged/accuracy/modelVersion. Filter on placementStatus (e.g. [\"On hold\"]) to answer pipeline questions in one call.","inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor from previous response"},"limit":{"type":"number","minimum":1,"maximum":200,"description":"Number of results (default: 50, max: 200)"},"tags":{"description":"Filter by tag names (comma-separated in API)","type":"array","items":{"type":"string"}},"tagMode":{"type":"string","enum":["any","all"],"description":"Match any or all tags (default: any)"},"sort":{"type":"string","description":"Sort field: created_at, -created_at, name, -name"},"placementStatus":{"description":"Only tracks in any of these placement statuses (comma-separated in API): Unworked, Sent, Interest, On hold, Placed or Scheduled (case-insensitive; the API values UNWORKED, SENT, INTEREST, ON_HOLD, PLACED, SCHEDULED also work)","type":"array","items":{"type":"string"}},"query":{"type":"string","description":"Search query for track name or artist"},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"additionalProperties":false},"annotations":{"title":"List tracks","readOnlyHint":true}},{"name":"remove_track_from_playlist","title":"Remove track from playlist","description":"Remove a single track from a playlist","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID to remove"},"playlistId":{"type":"string","description":"The playlist ID"}},"required":["trackId","playlistId"],"additionalProperties":false},"annotations":{"title":"Remove track from playlist","readOnlyHint":false,"destructiveHint":true}},{"name":"reorder_playlist","title":"Reorder playlist","description":"Reorder tracks in a playlist by providing the track IDs in the desired order","inputSchema":{"type":"object","properties":{"trackIds":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Track IDs in the desired order"},"playlistId":{"type":"string","description":"The playlist ID"}},"required":["trackIds","playlistId"],"additionalProperties":false},"annotations":{"title":"Reorder playlist","readOnlyHint":false,"destructiveHint":true}},{"name":"search_tracks","title":"Search tracks","description":"Find tracks in your library by describing the music in plain language —\nmood, genre, energy, instrumentation, reference artist, or what the music is for\n(\"dark cinematic trap for a chase scene\", \"warm acoustic bed under a voiceover\").\nThe description is parsed into musical targets and the whole library is ranked against it,\nso results come back scored and ordered with a short reason for each.\n\nUse list_tracks instead when you already know the exact name, tag or date filter, or need\nto page through everything — that is a plain database filter and is much cheaper.\nThis tool runs an AI ranking pass over the library: it is slower and may consume account credits.\n\nAnything that must be strictly true (a BPM window, instrumental only, a key) belongs in the\ndedicated parameters rather than the query text — they are applied as hard filters, while the\nquery text is matched by similarity and cannot reliably express a negation.\nThe response echoes an `interpretation` block showing how the query was read; use it to correct\na bad reading and search again rather than guessing.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":2000,"description":"Plain-language description of the music you want"},"limit":{"type":"number","minimum":1,"maximum":50,"description":"Number of tracks to return (default: 20, max: 50)"},"bpmMin":{"type":"number","minimum":1,"maximum":300,"description":"Hard filter: minimum BPM"},"bpmMax":{"type":"number","minimum":1,"maximum":300,"description":"Hard filter: maximum BPM"},"durationMinSec":{"type":"number","minimum":0,"description":"Hard filter: minimum track duration in seconds"},"durationMaxSec":{"type":"number","minimum":0,"description":"Hard filter: maximum track duration in seconds"},"hasVocals":{"type":"boolean","description":"Hard filter: true for vocal tracks only, false for instrumentals only"},"key":{"type":"string","description":"Hard filter: musical key, e.g. \"F#m\", \"C\""},"language":{"type":"string","description":"Hard filter: sung language, e.g. \"english\""},"seedTrackIds":{"maxItems":50,"description":"Track IDs to steer toward — \"more like these\", combined with the query","type":"array","items":{"type":"string"}},"excludeTrackIds":{"maxItems":200,"description":"Track IDs to keep out of the results, e.g. everything already shortlisted","type":"array","items":{"type":"string"}},"detail":{"type":"string","enum":["compact","full"],"description":"Response detail: \"compact\" (default) returns trimmed objects for low token cost; \"full\" returns the raw API payload"}},"required":["query"],"additionalProperties":false},"annotations":{"title":"Search tracks","readOnlyHint":true}},{"name":"set_track_status","title":"Set track status","description":"Set the placement status of one or more tracks in your library: where each track stands in your pitching pipeline (Unworked, Sent, Interest, On hold, Placed, Scheduled; \"Clear\" resets to Unworked). Accepts the labels as shown in the app, in any case. Pass every track that should change in one call (up to 100). Each change is recorded on the track's status history with the optional note.","inputSchema":{"type":"object","properties":{"trackIds":{"minItems":1,"maxItems":100,"description":"IDs of the tracks to update (1–100). All must be in your library, or nothing changes.","type":"array","items":{"type":"string"}},"status":{"type":"string","description":"The new placement status: Unworked, Sent, Interest, On hold, Placed or Scheduled (case-insensitive; the API values UNWORKED, SENT, INTEREST, ON_HOLD, PLACED, SCHEDULED also work). \"Clear\" resets the tracks to Unworked."},"note":{"type":"string","maxLength":2000,"description":"Optional note stored on the status change, e.g. why a track is on hold"}},"required":["trackIds","status"],"additionalProperties":false},"annotations":{"title":"Set track status","readOnlyHint":false,"destructiveHint":true}},{"name":"trigger_auto_tag","title":"Trigger auto-tag","description":"Trigger AI auto-tagging for a single track. This starts an asynchronous analysis — use wait_for_auto_tag to block until it finishes, or check back with get_suggested_tags after a short wait.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID to auto-tag"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Trigger auto-tag","readOnlyHint":false,"destructiveHint":false}},{"name":"update_composer","title":"Update composer","description":"Update an existing composer / shareholder. Provide the composer ID plus any fields to change.","inputSchema":{"type":"object","properties":{"fullName":{"type":"string","description":"Full legal name"},"artistName":{"type":"string","description":"Stage / artist name"},"email":{"type":"string","format":"email","description":"Email address"},"publisher":{"type":"string","description":"Publisher name"},"pro":{"type":"string","description":"Performing rights organisation"},"ipi":{"type":"string","description":"IPI / CAE number"},"composerId":{"type":"string","description":"The composer ID to update"}},"required":["composerId"],"additionalProperties":false},"annotations":{"title":"Update composer","readOnlyHint":false,"destructiveHint":true}},{"name":"update_playlist","title":"Update playlist","description":"Update a playlist name or description","inputSchema":{"type":"object","properties":{"name":{"type":"string","maxLength":120,"description":"New playlist name"},"description":{"type":"string","maxLength":2000,"description":"New playlist description"},"playlistId":{"type":"string","description":"The playlist ID"}},"required":["playlistId"],"additionalProperties":false},"annotations":{"title":"Update playlist","readOnlyHint":false,"destructiveHint":true}},{"name":"update_track_details","title":"Update track details","description":"Update track metadata like title, artist, album, BPM, key, etc. Pass `name` to rename the track as the app shows it; `title` only sets the embedded metadata title.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name shown in the app (the uploaded filename by default). Distinct from `title`, which is the embedded metadata title."},"bpm":{"type":"number","description":"BPM (beats per minute)"},"key":{"type":"string","description":"Musical key (e.g. \"C#m\", \"G\")"},"title":{"type":"string","description":"Track title"},"album":{"type":"string","description":"Album name"},"year":{"type":"string","description":"Release year"},"isrc":{"type":"string","description":"ISRC code"},"composer":{"type":"string","description":"Composer name"},"artist":{"type":"string","description":"Artist name"},"cover":{"type":"string","description":"Cover art image URL"},"recordLabel":{"type":"string","description":"Record label"},"trackId":{"type":"string","description":"The track ID to update"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Update track details","readOnlyHint":false,"destructiveHint":true}},{"name":"update_track_tags","title":"Update track tags","description":"Set the tags on a track. Provide arrays of tag names or codes per category; each category you\ninclude REPLACES that category, categories you leave out are untouched. Send every category you\nwant recorded in a single call. Use get_tag_taxonomy first to see the valid values.\n\nCorrections are the tagger's training signal: what you write here teaches the model. Only set\ntags you are confident about — the user's confirmed answer, not a guess, and never a test value.\n\nVocal tags carry a bar. Harmonies and Background vocals are reserved for tracks where stacked\nvocals are a defining feature — a fully stacked chorus, stacked vocals throughout, a chant. A light\ndouble under the lead, or one harmony in one verse, does not qualify: an A&R filtering on Harmonies\nwants a harmony-led record. Apply the same standard to Choir, Aahs, Oohs, Whispering, Whistling,\nA cappella and Duet — tag them when they define the track, not when they appear once in passing.\nOver-tagging dilutes search for everyone.","inputSchema":{"type":"object","properties":{"genres":{"description":"Genre names/codes to set","type":"array","items":{"type":"string"}},"moods":{"description":"Mood names/codes to set","type":"array","items":{"type":"string"}},"types":{"description":"Audio type names/codes to set","type":"array","items":{"type":"string"}},"vocals":{"description":"Vocal type names/codes to set","type":"array","items":{"type":"string"}},"lyricThemes":{"description":"Lyric theme names/codes to set","type":"array","items":{"type":"string"}},"instruments":{"description":"Instrument names/codes to set","type":"array","items":{"type":"string"}},"eras":{"description":"Era names/codes to set (e.g. decade/period feel)","type":"array","items":{"type":"string"}},"characters":{"description":"Character names/codes to set (sonic character)","type":"array","items":{"type":"string"}},"movements":{"description":"Movement names/codes to set (energy/movement feel)","type":"array","items":{"type":"string"}},"additionalTags":{"description":"Freeform tag strings","type":"array","items":{"type":"string"}},"trackId":{"type":"string","description":"The track ID"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Update track tags","readOnlyHint":false,"destructiveHint":true}},{"name":"update_track_version","title":"Update track version","description":"Rename or relabel a version, or hide/show it in the app. Only the fields you pass change.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"New display name"},"label":{"type":"string","description":"New version label, e.g. \"v3\""},"visible":{"type":"boolean","description":"Show (true) or hide (false) the version in the app"},"versionId":{"type":"string","description":"Version ID"},"trackId":{"type":"string","description":"Track ID"}},"required":["versionId","trackId"],"additionalProperties":false},"annotations":{"title":"Update track version","readOnlyHint":false,"destructiveHint":true}},{"name":"upload_artwork","title":"Upload artwork","description":"Upload an image and set it as cover art for a track. Provide either a public image URL or base64-encoded image data.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID to set artwork for"},"url":{"type":"string","description":"Public URL of the image to use as cover art"},"base64":{"type":"string","description":"Base64-encoded image data (with or without data:image/... prefix)"},"filename":{"type":"string","description":"Optional filename for the image (default: cover.jpg)"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Upload artwork","readOnlyHint":false,"destructiveHint":false}},{"name":"upload_track_by_url","title":"Upload track by URL","description":"Upload one or more tracks into your library from public audio URLs. Each item can carry optional metadata (title, artist, etc.) and an audio profile. Returns the created track IDs plus any failures.","inputSchema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":25,"description":"Up to 25 tracks to upload from URLs","type":"array","items":{"type":"object","properties":{"fileUrl":{"type":"string","format":"uri","description":"Public URL of the audio file (must include protocol)"},"visible":{"type":"boolean","description":"Whether the track is visible (default: false)"},"audioProfile":{"type":"object","additionalProperties":{},"description":"Optional audio profile fields (bpm, key, etc.)"},"details":{"type":"object","properties":{"name":{"type":"string","description":"Display name shown in the app (the uploaded filename by default). Distinct from `title`, which is the embedded metadata title."},"bpm":{"type":"number","description":"BPM (beats per minute)"},"key":{"type":"string","description":"Musical key (e.g. \"C#m\", \"G\")"},"title":{"type":"string","description":"Track title"},"album":{"type":"string","description":"Album name"},"year":{"type":"string","description":"Release year"},"isrc":{"type":"string","description":"ISRC code"},"composer":{"type":"string","description":"Composer name"},"artist":{"type":"string","description":"Artist name"},"cover":{"type":"string","description":"Cover art image URL"},"recordLabel":{"type":"string","description":"Record label"}},"additionalProperties":false,"description":"Optional metadata applied after upload"}},"required":["fileUrl"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false},"annotations":{"title":"Upload track by URL","readOnlyHint":false,"destructiveHint":false}},{"name":"upload_track_version","title":"Upload track version","description":"Add a new audio version to an existing track from a public audio URL (replace the audio while keeping the track ID, tags, playlists and share links). By default the new file becomes the active version and analysis re-runs; pass activate:false to add it to the history only.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the version (default: the filename)"},"label":{"type":"string","description":"Version label shown in the app, e.g. \"v2\" or \"radio edit\" (default: v<n>)"},"activate":{"type":"boolean","description":"Make this the active version (default: true)"},"fileUrl":{"type":"string","format":"uri","description":"Public URL of the audio file (must include protocol)"},"trackId":{"type":"string","description":"Track ID to add the version to"}},"required":["fileUrl","trackId"],"additionalProperties":false},"annotations":{"title":"Upload track version","readOnlyHint":false,"destructiveHint":false}},{"name":"wait_for_auto_tag","title":"Wait for auto-tag","description":"Wait for a track's AI auto-tagging to finish, then return the suggested tags. Optionally triggers auto-tagging first. Polls until the analysis is completed or failed, or until the timeout is reached.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"The track ID to wait for"},"trigger":{"type":"boolean","description":"If true, trigger auto-tagging before waiting (default: false)"},"timeoutSeconds":{"type":"number","minimum":5,"maximum":300,"description":"Maximum time to wait in seconds (default: 90)"},"pollIntervalSeconds":{"type":"number","minimum":2,"maximum":30,"description":"How often to poll in seconds (default: 3)"}},"required":["trackId"],"additionalProperties":false},"annotations":{"title":"Wait for auto-tag","readOnlyHint":false,"destructiveHint":false}}]}