SoundCloud MCP Server
An MCP server that gives an assistant access to the SoundCloud API — search anddiscovery, your library, playlist management, social actions, and messaging.
Runs locally over stdio. Public search works with app credentials alone;personal data and writes require a one-time browser login that persists andauto-refreshes its token.
Setup
Install dependencies:
npm installCreate a SoundCloud app at https://soundcloud.com/you/apps and note theClient ID and Client Secret. Set the app's Redirect URI to matchyour
.env(defaulthttp://localhost:8888/callback).Copy the example env and fill it in:
cp .env.example .envBuild:
npm run build
Authenticate (one time, for personal data)
npm run auth
This opens your browser, captures the OAuth callback automatically, and savestokens to ~/.soundcloud-mcp/tokens.json (mode 600). The token auto-refreshes,so you normally only do this once. Use npm run auth --no-browser to print theURL instead of opening it.
You can also log in from within a client by calling the connect_soundcloudtool, and check state with auth_status.
Run
npm start
Or point your MCP client at build/index.js and pass credentials via theclient's env block (no .env needed):
{
"mcpServers": {
"soundcloud": {
"command": "node",
"args": ["/absolute/path/to/soundcloud-mcp/build/index.js"],
"env": {
"SOUNDCLOUD_CLIENT_ID": "...",
"SOUNDCLOUD_CLIENT_SECRET": "...",
"SOUNDCLOUD_REDIRECT_URI": "http://localhost:8888/callback"
}
}
}
}
The npm scripts load a local .env natively via Node's --env-file-if-exists(no dotenv dependency). Requires Node 22+.
Tools
- Auth:
connect_soundcloud,auth_status,sign_out - Discovery:
search_tracks,search_playlists,search_users,get_track,get_user,get_playlist,get_related_tracks,get_stream_url,get_comments - Library (login):
get_profile,get_likes,get_playlists,get_recommended_tracks - Social (login):
like_track,unlike_track,follow_user,unfollow_user,add_comment - Playlists (login):
create_playlist,update_playlist,add_tracks_to_playlist,remove_track_from_playlist,delete_playlist - Messaging (login):
get_conversations,get_conversation,get_messages,send_message,start_conversation,mark_conversation_read
Environment variables
| Variable | Required | Description |
|---|---|---|
SOUNDCLOUD_CLIENT_ID |
yes | App client ID |
SOUNDCLOUD_CLIENT_SECRET |
yes | App client secret |
SOUNDCLOUD_REDIRECT_URI |
yes | Must match the app's redirect URI exactly (default http://localhost:8888/callback) |
SOUNDCLOUD_TOKEN_FILE |
no | Token storage path (default ~/.soundcloud-mcp/tokens.json) |
MCP_DEBUG |
no | Set true for verbose request logging to stderr |
Architecture
config.ts— env + constantstokenStore.ts— persists/refreshes user tokens on diskoauth.ts— OAuth flows (PKCE auth-code, client-credentials, refresh) + browser loginapi.ts— SoundCloud API client, fed an async token providertools.ts—registerAll(server, api): all tools/prompts/resources, transport-agnosticindex.ts— stdio entrypointauth.ts— one-time login CLI
Tool registration is decoupled from the stdio transport, so a future remote(Streamable HTTP) entrypoint can reuse registerAll without changes.
MCP conventions
Built against the MCP 2025-06-18 spec: tools carry title + behaviorannotations (readOnlyHint/destructiveHint/idempotentHint/openWorldHint),read tools return structuredContent alongside text, and track/playlist toolsemit resource_link blocks (permalink, artwork, audio stream) so clients can render them.OAuth is handled locally per the spec's guidance that stdio servers takecredentials from the environment rather than the transport-level OAuth flow(which is reserved for the future remote HTTP mode).
Notes
Unofficial integration, not affiliated with SoundCloud. Use within theSoundCloud API Terms of Use.The legacy /charts endpoint is no longer served by the public API and has been removed.