MCPAvailable tools

Available tools

The MCP server exposes 56 tools across 10 areas. Tools that read public catalog data work without authentication. Tools that touch a user’s library, upload media, or issue a licence need an authenticated caller.

Authenticated in the tables below means either path works — the OAuth browser flow from Quickstart, or a partner token sent server-to-server. There is no separate tool set for either: the same 56 tools are exposed both ways. What changes is how you authenticate and, for a partner, that usage is attributed per end user via X-User-ID. See Server-to-server.

Tools marked UI return an interactive widget alongside their data. MCP-Apps hosts render it inline; everywhere else the same payload arrives in structuredContent, so nothing is lost. See Rendering widgets.

Start here

ToolWhat it doesAuth
getting_startedThe capability menu for a user who doesn’t know what to ask for. Returns what Slipstream can do and an example prompt per capability.Public

Search and discovery

ToolWhat it doesAuth
search_tracksNatural-language search via Slipstream’s AI ranking, with optional genre, mood, vocals, BPM, and duration filters. UIPublic
search_similar_by_urlFind tracks similar to a reference link — YouTube, Spotify, Apple Music, TikTok, or Instagram. Accepts a start_seconds offset. UIPublic
search_by_idFind tracks similar to a Slipstream track the user already picked. UIPublic
playlist_from_briefTurn a creative brief into a shortlist. Pass cues for a multi-cue brief and every cue comes back in one consolidated result. UIPublic
get_search_filtersValid genres, subgenres, moods, vocals, and the BPM/duration ranges the filters accept.Public
list_genresAll genres with slugs and descriptions.Public
list_moodsAll moods with slugs and descriptions.Public
search_sfxSearch the sound effects catalog by text, genre, and duration.Authenticated
get_sfx_filtersValid sound effect genres and the duration range the filters accept.Authenticated

Filter values are matched against the catalog’s own labels case-insensitively, so hip-hop lands on Hip Hop. An unrecognized value is dropped rather than applied. If a filter stack matches nothing, the search retries once without filters and reports which constraints it dropped in relaxed_filters.

search_sfx reads a different catalog. Sound effects are not tracks: search_tracks never returns one, search_sfx never returns a track, and a sound effect has genre and duration only — no mood, tempo, vocals, or BPM. Its two genre fields are independent assignments, not a hierarchy, and both match exactly, so take the values from get_sfx_filters rather than passing a guess. The REST equivalent is Sound effects.

Tracks

ToolWhat it doesAuth
get_trackFull details for one track by ID. UIPublic
get_track_stemsStems (isolated drums, bass, melody, vocals) and alternate versions of a track. Only tracks with has_stems: true have these. UIPublic
get_track_download_urlA download link for a track, stem, or sound effect. Works for audio_type of track, stem, or soundfx.Authenticated
⚠️

get_track_download_url returns a download, not a licence. To clear a track for use, go through Licensing.

The URL is an MCP-hosted alias (https://mcp.slipstreammusic.com/dl/<token>), not a raw S3 link. The bucket, key, and signature stay server-side, and the partner’s download quota is consumed when the link is opened — not when the tool is called.

User and library

ToolWhat it doesAuth
get_current_userThe signed-in user’s profile, including user_type, subscription_active, and is_enterprise_member.Authenticated
get_liked_tracksThe user’s liked tracks.Authenticated
like_trackLike (favorite) a track.Authenticated
unlike_trackRemove a like from a track.Authenticated

Playlists

ToolWhat it doesAuth
list_my_playlistsPlaylists owned by the user. UIAuthenticated
create_playlistCreate a playlist, optionally with initial tracks.Authenticated
get_playlistPlaylist details by slug.Authenticated
get_playlist_tracksList the items in a playlist. Pass public=true to read a public one. UIPublic if public=true, otherwise authenticated
add_tracks_to_playlistAdd tracks to an existing playlist.Authenticated
remove_tracks_from_playlistRemove items. Playlists hold tracks, sound effects, and stems — pass each id in the matching argument (track_ids, soundfx_ids, stem_ids).Authenticated
update_playlistRename a playlist or change its description.Authenticated
reorder_playlist_tracksMove items up or down by a relative offset.Authenticated
delete_playlistDelete a playlist. Cannot be undone.Authenticated
download_playlistDownload the whole playlist as one ZIP (mp3 or wav, optionally with stems). Built in the background and emailed when ready.Authenticated
share_playlistCreate a public, view-only share link. Requires an enterprise plan.Authenticated
search_playlistsSearch public playlists by name, description, track keywords, or artist. UIPublic
like_playlistLike someone else’s playlist. You can’t like your own.Authenticated
unlike_playlistRemove a like from a playlist.Authenticated

Playlist tools key on the slug, except like_playlist, unlike_playlist, and download_playlist, which take the playlist UUID (id). Both come back on every playlist result.

Editing: clips and extend

Two opposite workflows on the same track. Clip makes it shorter, extend makes it longer.

ToolWhat it doesAuth
create_track_clipCut a [start, end] section into a downloadable clip with automatic fade in/out. mp3 or wav.Authenticated
open_clip_editorOpen an interactive waveform where the user drags handles to pick the section, previews, and exports. UIAuthenticated
extend_trackLoop a track at seamless musical points to reach a target duration (max 900s). Strategy auto/loop preserves structure; remix rearranges via beat jumps.Authenticated
open_extend_editorOpen the interactive Audio Extender — set a target length, pick the loop section, preview, export. UIAuthenticated
get_extend_loopsThe seamless-loop candidates for a track, each {start, end, quality}. The extender widget uses this; you rarely call it directly.Authenticated

create_track_clip, extend_track, and get_extend_loops render asynchronously. The first call returns ready: false — call again with identical arguments to poll (same arguments means the same render job), then hand the user download_url.

Soundtrack a video

Upload a video, get tracks that fit it, render the mix. The REST equivalent is documented in Soundtrack a video.

ToolWhat it doesAuth
soundtrack_a_videoOpen the upload widget. Use only when the user has not already attached a video. UIAuthenticated
prepare_video_uploadGet an upload URL for a video. Use this when the user already attached a file — PUT the bytes yourself, no widget needed.Authenticated
register_videoRegister the video from a storage_key (uploaded file) or a youtube_url. Returns the soundtrack id.Authenticated
recommend_tracksAI-recommended tracks for a registered video. Supports exclude_track_ids for a fresh set and pinned_track_id to pre-select an earlier pick. UIAuthenticated
render_soundtrackMerge the chosen track into the video and return a preview + download. Defaults to a 40% video / 60% music mix. UIAuthenticated

Only uploaded files can be rendered. A YouTube URL supports recommendations only. render_soundtrack is asynchronous — poll it with identical arguments until ready: true.

The flow, end to end. In a chat client the agent chains these for you. Calling the server directly, you make each call yourself:

1. prepare_video_upload(filename)          -> upload_url, storage_key
2. PUT the bytes to upload_url
3. register_video(storage_key)             -> soundtrack id
4. recommend_tracks(soundtrack_id)         -> ranked tracks
5. render_soundtrack(soundtrack_id, track_id)
   -> poll with identical arguments until ready: true

Step 3 also accepts a youtube_url instead of a storage_key, which skips steps 1–2 but rules out step 5.

AudioVerify

Identify the music used in a video and flag licensing risk. AudioVerify informs, it does not enforce. See the AudioVerify guide for the full flow and the REST equivalent.

ToolWhat it doesAuth
start_video_compliance_checkOpen an inline widget where the user drops a video; it shows every track it finds. UIAuthenticated
prepare_compliance_uploadGet a one-time upload URL so you can upload an already-attached video yourself.Authenticated
check_video_complianceSubmit an uploaded video by storage_key and poll for ~20s. Returns status plus segments.Authenticated
get_compliance_resultFetch the status and result of a job by job_id — call it until the status is terminal.Authenticated

A video can use several songs one after another, so the result is segments: every stretch of music in timeline order, each with its timerange, title, artist, isrc, score, cleared (true when the user’s subscription covers it) and external_label (the registered library, e.g. Epidemic Sound, when known). Report all of them, not just the first. track repeats the longest one for a single-line summary.

A segment with identified: false is music that could not be named — its other fields are null. Report it by its timerange and say it cannot be called cleared. When cleared is false, suggestions offers catalog tracks the user can actually use instead.

Empty segments on a completed job means no music was detected — a valid result, not an error. A status of error means the check itself failed.

The flow, end to end:

1. prepare_compliance_upload(filename)  -> upload_url, storage_key
2. PUT the bytes to upload_url
3. check_video_compliance(storage_key)  -> polls ~20s, returns status + segments
4. while status is "timeout":
   get_compliance_result(job_id)        -> keep waiting on the same job

Step 4 is the normal path, not an error branch: the tools return early on purpose so a host can’t cut the call off mid-wait, and a video carrying several songs takes a couple of minutes to finish.

start_video_compliance_check replaces steps 1–3 with a widget the user drops the file into — use it when you can’t upload the file yourself.

Channels and allowlist

Content ID can flag a creator’s own upload even when the Slipstream track in it is licensed. The allowlist is how that gets prevented: register the channel (or a single video) and claims stop firing on licensed use.

Channels

ToolWhat it doesAuth
search_youtube_channelsSearch YouTube channels by keyword, or resolve one from its URL. Use it to get the channel_id before adding.Authenticated
list_my_channelsThe channels currently on the user’s allowlist.Authenticated
add_channelAdd a channel to the allowlist.Authenticated
remove_channelRemove a channel from the allowlist.Authenticated

Supported providers: youtube (default), instagram, tiktok, facebook, website, rss.

Only YouTube needs a lookup. For every other provider, pass the profile handle or URL straight in as channel_id — an Instagram/TikTok/Facebook profile URL, a website, or an RSS feed URL.

The YouTube flow:

search_youtube_channels(query: "Acme Studios")
  -> { channels: [{ channel_id: "UCxxxx…", title: "Acme Studios", thumbnail_url: … }] }

add_channel(channel_id: "UCxxxx…", provider: "youtube")
  -> { success: true, channel: { id: "…", name: "Acme Studios", provider: "youtube" } }

Any other provider skips step one:

add_channel(channel_id: "https://instagram.com/acmestudios", provider: "instagram")
⚠️

remove_channel takes the Slipstream channel id — the id from list_my_channels — not the YouTube channel_id you passed to add_channel.

Adding a channel that is already on the user’s own allowlist returns success: true with already_added: true, since the desired end state holds. A channel registered to a different Slipstream account is a real rejection and surfaces as an error.

Individual videos

ToolWhat it doesAuth
list_allowed_videosThe individual YouTube videos on the allowlist.Authenticated
add_allowed_videoAllowlist one specific YouTube video by its full URL.Authenticated
remove_allowed_videoRemove a video from the allowlist, by the id from list_allowed_videos.Authenticated

add_allowed_video requires a commercial or enterprise account with an active subscription. Check user_type and subscription_active from get_current_user before offering it.

Like channels, re-adding a video already on the user’s own allowlist reports success: true with already_allowed: true.

Licensing

Turn a chosen track into a filled Slipstream licence, priced from the enterprise’s negotiated rate card. This is a different product from the partner Licensing API, which clears a track for an end user’s video.

ToolWhat it doesAuth
list_license_optionsNarrow down what the rate card covers, one step at a time — placements, then territories, then term and fee.Authenticated
prepare_licenseCollect what a licence needs and price it. Read-only, issues nothing. Returns ready: true with a one-line confirm once it has everything.Authenticated
generate_licenseIssue the draft agreement. Mints a contract number, so call it only after prepare_license came back ready and the user approved the fee. UIAuthenticated
list_my_licensesLicences generated for the enterprise, newest first.Authenticated

The flow, end to end:

1. prepare_license(track_ids, …)  -> ready: false + `ask` (what's still missing)
   ask the user for what `ask` lists, then call again — repeat until ready: true
2. show the one-line `confirm` and get the user's yes
3. generate_license(same values)  -> contract_number, download_url

Step 1 is read-only and safe to call early with whatever you already know. Step 3 mints a contract number, so it runs once, after the user has approved the fee.

Pricing, media, and term are resolved server-side from the caller’s identity and rate card — they are never sent as inputs, so a caller cannot license against another enterprise’s card or name its own fee.

A usage that isn’t on the card returns a clear “needs a custom quote” message rather than a nearby price. Multiple track_ids produce one agreement listing them all in Schedule A, priced at the rate times the number of tracks.

Enterprises without a rate card on file get a message saying so instead of an error.

Which tools open a widget

WidgetTools that open it
Track playersearch_tracks, search_similar_by_url, search_by_id, playlist_from_brief, get_track, get_track_stems, list_my_playlists, search_playlists, get_playlist_tracks
Soundtrack studiosoundtrack_a_video, recommend_tracks, render_soundtrack
AudioVerify uploaderstart_video_compliance_check
Clip editoropen_clip_editor
Audio Extenderopen_extend_editor
Licence previewgenerate_license

To render these in your own product, see Rendering widgets. Call resources/list for the current set of widget URIs rather than hard-coding them.

Prompts

The server also registers six prompts — ready-made starting points a client can browse without knowing any tool names:

  • Find music for a project
  • Build a playlist from a creative brief
  • Soundtrack my video
  • Protect my channel from copyright claims
  • License a track for a campaign
  • Check a video for music rights issues

Notes

  • Every tool is a thin wrapper around the Slipstream REST API. When the catalog improves, MCP gets the same improvement at the same time.
  • Tool inputs and outputs are typed. Most clients show the full schema in their settings UI when you click a tool.
  • Tools carry MCP behavior hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so a host can, for example, confirm before a destructive call.
  • Download and media links are opaque MCP-hosted aliases (/dl/…, /sv/…). The raw S3 URL never reaches the client.
  • Partner caps. On a server-to-server token, limits and catalog entitlements apply at the partner level, not per X-User-ID. Downloads consume the partner’s quota when the link is opened, and render_soundtrack is metered by its own render cap. A call that exceeds a cap comes back with a clear message rather than a generic failure.