Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Your AI agent archives Discover Weekly, builds playlists from a list, removes duplicates and sets privacy. Sign in to Spotify once in your own Cloud Browser. No developer app and no Premium owner needed.
12 tools Read and write
Spotify has a Web API and, since 23 Apr 2026, an official connector for Claude (checked 6 Nov 2026). The connector has six tools and none adds songs to, removes songs from or deletes a playlist. Cotlet runs 12 Spotify tools hosted, over MCP for agents and REST for scripts, with no app to register.
| What you need | Spotify Web API | Spotify Claude connector | Cotlet |
|---|---|---|---|
| Search songs, artists and albums | Yes, 10 results a request | Yes | Yes |
| Read the songs of a playlist you follow | No, only your own | Not in its tools | Yes, Discover Weekly too |
| Add or remove songs in a playlist | Yes, your own playlists | Not in its tools | Yes |
| Make a playlist public or private | Yes, your own playlists | Not in its tools | Yes |
| Works without registering an app | No | Yes | Yes |
| Runs with your computer off | If you host it | Yes | Yes, hosted |
Checked 6 Nov 2026. Sources: Spotify for Developers: Quota modes · Spotify for Developers: February 2026 Web API Dev Mode changes · Spotify Newsroom: Spotify brings music and podcast recommendations to Claude (23 Apr 2026) · Claude connectors: Spotify · Spotify Premium plans · Spotify in ChatGPT (Spotify Newsroom, 6 Oct 2025)
One time, in a browser we keep for you.
One address in its settings.
Your agent edits your playlists.
Cotlet never stores your Spotify password, and edits other people could see wait for your OK. Who can see your session
Turn on Spotify for agents. Create a Cotlet account, sign in to Spotify in its Cloud Browser and press Enable for agents.
Add the Cotlet address. Put https://cotlet.dev/mcp/v1 in the MCP or connector settings of your agent.
Allow the connection. Chat apps open a Cotlet sign-in. Code editors, n8n and scripts take an API key from the console.
Spotify shares https://cotlet.dev/mcp/v1 with every other app you enable. Turned Spotify on after you connected? Refresh the connector to load its tools.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-spotify \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-spotify": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-spotify]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: spotify_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: spotify_write Songs, artists, albums, playlists and podcasts. Every result carries a link the other tools accept.
search returns the results Spotify shows for the query, with a link for each one that the other tools accept. With type set, it returns only that kind of result. Results are in the order Spotify ranks them, and next_cursor loads more. It reads only, so it asks no confirmation.
MCP callspotify_read → search
REST endpointGET https://cotlet.dev/api/v1/spotify/search/search
| Name | Type | Description |
|---|---|---|
| query string required | string | What to search for, as you would type it in the Spotify search box. |
| type string | string | Spotify search filter. One of song, artist, album, playlist, podcast. Omit it to search everything. |
| cursor string | string | Next page cursor from the previous call. |
{
"query": "query"
} {
"results": [
{
"type": "song",
"title": "Midnight City",
"artists": [
"M83"
],
"album": "Hurry Up, We're Dreaming",
"url": "https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp"
},
{
"type": "song",
"title": "Midnight City (Eric Prydz Private Remix)",
"artists": [
"M83",
"Eric Prydz"
],
"album": "Midnight City Remixes",
"url": "https://open.spotify.com/track/4ZmOtN4xV3cWk9QpAbT2Dm"
}
],
"next_cursor": null
} Edits work on playlists you made. New playlists start private. Changes to a public playlist are seen by its followers, so those calls ask first.
list_playlists returns each playlist with its name, owner, link, song count and whether it is public or private. It opens each playlist page to read the count and visibility, so a library with many playlists takes longer. The order is the one Your Library shows. It reads only, so it asks no confirmation.
MCP callspotify_read → list_playlists
REST endpointGET https://cotlet.dev/api/v1/spotify/playlists
| Name | Type | Description |
|---|---|---|
| owned_only boolean | boolean | Only playlists you made. Default false, which also lists playlists you follow, such as Discover Weekly. |
| cursor string | string | Next page cursor from the previous call. |
{
"playlists": [
{
"name": "Road trip",
"owner": "Maya Rivera",
"url": "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
"songs": 64,
"visibility": "private"
},
{
"name": "Focus",
"owner": "Maya Rivera",
"url": "https://open.spotify.com/playlist/5Hq0wF9xYtLmN2vKd8RjAe",
"songs": 112,
"visibility": "public"
},
{
"name": "Discover Weekly",
"owner": "Spotify",
"url": "https://open.spotify.com/playlist/37i9dQZEVXcJZyENOWUFo7",
"songs": 30,
"visibility": "public"
}
],
"next_cursor": null
} get_playlist_items returns each song with its position, title, artists, album, length, the date it was added and its link. It reads the playlist page you see in Spotify, so it also works on a playlist you only follow, such as Discover Weekly. Long playlists come back in pages: pass next_cursor to continue. It reads only, so it asks no confirmation.
MCP callspotify_read → get_playlist_items
REST endpointGET https://cotlet.dev/api/v1/spotify/playlist-items
| Name | Type | Description |
|---|---|---|
| playlist_url string required | string | Playlist link from list_playlists or search, like https://open.spotify.com/playlist/{id}. |
| cursor string | string | Next page cursor from the previous call. |
{
"playlist_url": "https://example.com"
} {
"playlist": "Road trip",
"items": [
{
"position": 1,
"title": "Midnight City",
"artists": [
"M83"
],
"album": "Hurry Up, We're Dreaming",
"length": "4:03",
"added_at": "2026-09-14",
"url": "https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp"
},
{
"position": 2,
"title": "Dog Days Are Over",
"artists": [
"Florence + The Machine"
],
"album": "Lungs",
"length": "4:12",
"added_at": "2026-09-14",
"url": "https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"
},
{
"position": 3,
"title": "Midnight City",
"artists": [
"M83"
],
"album": "Hurry Up, We're Dreaming",
"length": "4:03",
"added_at": "2026-10-02",
"url": "https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp"
}
],
"next_cursor": null
} create_playlist makes a new playlist the way Your Library > Create > Playlist does, and returns its link for add_to_playlist. The playlist is created private, so it reaches no one until you call set_playlist_visibility, and one delete_playlist call undoes it. For that reason it asks no confirmation by default.
MCP callspotify_write → create_playlist
REST endpointPOST https://cotlet.dev/api/v1/spotify/playlists
| Name | Type | Description |
|---|---|---|
| name string required | string | Playlist name. |
| description string | string | Optional description. |
{
"name": "Jane Doe"
} {
"name": "Friday setlist",
"url": "https://open.spotify.com/playlist/6KtB3yQmZd1WxPaN0cVhRs",
"visibility": "private",
"songs": 0
} add_to_playlist adds each song through the Add to Playlist menu and reports which songs it added and which it skipped because they were already in the playlist or could not be found. Compare with get_playlist_items first if you want to control duplicates. People who follow a public playlist see the change. By default you confirm each call; you can switch that off for this tool.
MCP callspotify_write → add_to_playlist
REST endpointPOST https://cotlet.dev/api/v1/spotify/playlists/add-to-playlist
| Name | Type | Description |
|---|---|---|
| playlist_url string required | string | Playlist link from list_playlists or search, like https://open.spotify.com/playlist/{id}. |
| song_urls string[] required | string[] | Song links from search, get_playlist_items or list_liked_songs, like https://open.spotify.com/track/{id}. |
{
"playlist_url": "https://open.spotify.com/playlist/6KtB3yQmZd1WxPaN0cVhRs",
"song_urls": [
"https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp",
"https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"
]
} {
"playlist": "Friday setlist",
"added": 3,
"skipped": [],
"songs_now": 3
} remove_from_playlist removes each listed song with Remove from this Playlist and returns how many it removed. When a song appears in the playlist more than once, the agent should say which copies to remove. People who follow a public playlist see the change. By default you confirm each call; you can switch that off for this tool.
MCP callspotify_write → remove_from_playlist
REST endpointDELETE https://cotlet.dev/api/v1/spotify/playlists
| Name | Type | Description |
|---|---|---|
| playlist_url string required | string | Playlist link from list_playlists or search, like https://open.spotify.com/playlist/{id}. |
| song_urls string[] required | string[] | Song links from search, get_playlist_items or list_liked_songs, like https://open.spotify.com/track/{id}. |
{
"playlist_url": "https://example.com",
"song_urls": [
"https://example.com"
]
} {
"playlist": "Road trip",
"removed": 1,
"songs_now": 63
} set_playlist_visibility uses Make public or Make private in the playlist menu. A private playlist cannot be opened by anyone else, even with its link, and it leaves your profile. A public playlist is shown on your profile. By default you confirm each call; you can switch that off for this tool.
MCP callspotify_write → set_playlist_visibility
REST endpointPUT https://cotlet.dev/api/v1/spotify/playlist-visibility
| Name | Type | Description |
|---|---|---|
| playlist_url string required | string | Playlist link from list_playlists or search, like https://open.spotify.com/playlist/{id}. |
| visibility string required | string | One of public, private. |
{
"playlist_url": "https://example.com",
"visibility": "visibility"
} {
"name": "Focus",
"visibility": "private"
} delete_playlist uses the Delete option of the playlist menu. A deleted playlist disappears from your profile and from the people who followed it. Spotify keeps a way to recover a deleted playlist, described in its help center, but the agent should not rely on it. By default you confirm each call; you can switch that off for this tool.
MCP callspotify_write → delete_playlist
REST endpointDELETE https://cotlet.dev/api/v1/spotify/playlists/delete-playlist
| Name | Type | Description |
|---|---|---|
| playlist_url string required | string | Playlist link from list_playlists or search, like https://open.spotify.com/playlist/{id}. |
{
"playlist_url": "https://example.com"
} {
"deleted": true,
"name": "Old workout mix"
} Your own library only. Recents shows the last 50 songs on desktop.
list_liked_songs returns each saved song with its title, artists, album, the date it was saved and its link, in the order Spotify shows them. Liked Songs sits under Playlists in Your Library. Pass next_cursor to continue through a long library. It reads only, so it asks no confirmation.
MCP callspotify_read → list_liked_songs
REST endpointGET https://cotlet.dev/api/v1/spotify/liked-songs
| Name | Type | Description |
|---|---|---|
| cursor string | string | Next page cursor from the previous call. |
{
"items": [
{
"title": "Dog Days Are Over",
"artists": [
"Florence + The Machine"
],
"album": "Lungs",
"added_at": "2026-11-02",
"url": "https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"
},
{
"title": "Midnight City",
"artists": [
"M83"
],
"album": "Hurry Up, We're Dreaming",
"added_at": "2026-10-28",
"url": "https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp"
}
],
"next_cursor": null
} like_songs saves each song to Liked Songs with the Add or Save button and returns how many it saved. It changes only your own library and one unlike_songs call undoes it, so it asks no confirmation by default.
MCP callspotify_write → like_songs
REST endpointPOST https://cotlet.dev/api/v1/spotify/songs/like
| Name | Type | Description |
|---|---|---|
| song_urls string[] required | string[] | Song links from search, get_playlist_items or list_liked_songs, like https://open.spotify.com/track/{id}. |
{
"song_urls": [
"https://example.com"
]
} {
"saved": 2,
"already_saved": 0
} unlike_songs removes each song from Liked Songs and returns how many it removed. It changes only your own library and one like_songs call undoes it, so it asks no confirmation by default.
MCP callspotify_write → unlike_songs
REST endpointPOST https://cotlet.dev/api/v1/spotify/songs/unlike
| Name | Type | Description |
|---|---|---|
| song_urls string[] required | string[] | Song links from search, get_playlist_items or list_liked_songs, like https://open.spotify.com/track/{id}. |
{
"song_urls": [
"https://example.com"
]
} {
"removed": 2,
"not_in_library": 0
} list_recent_plays returns the songs Spotify shows under Recents, with title, artists, album and link. On desktop Spotify shows the last 50 songs you listened to there. Songs you played earlier are not on the list, so run it often if you want a longer history. It reads only, so it asks no confirmation.
MCP callspotify_read → list_recent_plays
REST endpointGET https://cotlet.dev/api/v1/spotify/recent-plays
No parameters.
{
"items": [
{
"title": "Dog Days Are Over",
"artists": [
"Florence + The Machine"
],
"album": "Lungs",
"url": "https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"
},
{
"title": "Midnight City",
"artists": [
"M83"
],
"album": "Hurry Up, We're Dreaming",
"url": "https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp"
}
]
} Your signed-in Spotify profile, AES-256-GCM, kept in Finland. No password.
The 12 Spotify tools. Not the session cookie.
Your playlists, Liked Songs and Recents, and your profile.
Your plan, payment details, password and playback.
You type the code yourself. We never do.
Disable for agents, reset the browser or delete the API key. The next call stops.
cotlet.dev rates A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). We have no SOC 2 report or outside pentest so far.
Spotify renamed its playlist endpoints and cut search results to 10 for new developer apps in Feb 2026 (Spotify for Developers). Your Cloud Browser works in the web player, so those changes do not reach your prompts, and a broken tool is ours to fix. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Create a playlist | Delete it with delete_playlist |
| Add songs to a playlist | Remove the same songs with remove_from_playlist |
| Remove songs from a playlist | Add them back with add_to_playlist |
| Make a playlist public or private | Yes, same tool |
| Save or remove Liked Songs | Yes, the opposite tool |
| Delete a playlist | No tool brings it back, so it asks first |
4 of 12 tools ask first: song edits, deleting and privacy. Reads, new private playlists and Liked Songs run at once. Switch the wait off per tool for a scheduled run.
For duplicates, the agent shows which copy it would remove before it asks.
{
"name": "add_to_playlist",
"arguments": {
"playlist_url": "https://open.spotify.com/playlist/6KtB3yQmZd1WxPaN0cVhRs",
"song_urls": [
"https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp",
"https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"
]
}
} curl -X POST https://cotlet.dev/api/v1/spotify/playlists/add-to-playlist \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"playlist_url":"https://open.spotify.com/playlist/6KtB3yQmZd1WxPaN0cVhRs","song_urls":["https://open.spotify.com/track/1eyzqe2QqGZUmfcPZtt1xp","https://open.spotify.com/track/1VZt8sG4cRpWq3hJmYn0Lk"]}' {
"playlist": "Friday setlist",
"added": 2,
"skipped": [],
"songs_now": 2
} Scripts and cron jobs reach the same tools over REST at /api/v1/spotify, with the same key and price. A call that asks first answers 202 with a call ID, and a failed call costs nothing. The tools table shows the REST path of every tool.
About $13 a monthfor a listener who keeps playlists tidy, 2,240 credits. Your Spotify plan is billed by Spotify as before.
| Job | Calls | Credits |
|---|---|---|
| Copy Discover Weekly to an archive, weekly | 3 × 4 | 120 |
| Export one playlist to a spreadsheet, weekly | 3 × 4 | 120 |
| Build a playlist from a list of 18 songs | 20 × 2 | 400 |
| Remove duplicates from a playlist | 3 × 2 | 60 |
| Snapshot Liked Songs, monthly | 4 × 1 | 40 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,240 |
The month is our own example, since Spotify publishes no typical library numbers: one song search per title when building a playlist, a few reads for each weekly job. Premium costs $12.99 a month for one person in the US (Spotify, 6 Nov 2026). Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| varunneal/spotify-mcp | The most starred community server (614 stars), Python, MIT, last commit 11 Mar 2026. | You register a Spotify app, and since Feb 2026 its owner needs Premium. |
| marcelmarais/spotify-mcp-server | A lightweight server (497 stars), MIT, last commit 28 Oct 2026. | Same developer app, runs on your computer. |
| gupta-kush/spotify-mcp | Over 100 tools for playback, playlists and discovery (10 stars), MIT. | Same developer app and the Feb 2026 limits. |
| Spotify node in n8n | Search, playlists, liked tracks, queue and playback in a workflow. | No playlist delete or privacy operation in its list, and a Spotify app to register. |
| Zapier | A Spotify app with playlist and search steps for templates. | Fixed steps, no agent that decides which songs to move. |
Use Spotify's Claude connector when you want recommendations and playback inside Claude. Pick Cotlet when your agent should edit playlists and Liked Songs, in ChatGPT or Claude, without a developer app. Run a GitHub server if you want to host and update the code yourself.
Behind Cotlet is Take Group sp. z o.o., a software company registered in Poland, EU (VAT PL6342984273), in business since 2019 and founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the Spotify tools go to contact@cotlet.dev.
Sign up at cotlet.dev, log in to Spotify once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Spotify account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Spotify: archive Discover Weekly; build a playlist from a list of songs; remove duplicate songs from a playlist. You ask in plain words, and anything that reaches other people waits for your OK first.
Sign up free at https://cotlet.dev, find Spotify under Integrations in the console and sign in to Spotify in its Cloud Browser. The trial starts with your first app, and no card is asked.
Not by its published tool list. Claude's connector page lists search, create_playlist, get_currently_playing, add_to_library, fetch_tracks and a remove-from-library tool, and none adds songs to an existing playlist, removes songs from one or deletes one (checked 5 Nov 2026).
No. The tools search, read and edit playlists and your library. Spotify's own connector for Claude can play music in Claude and switch devices through Spotify Connect (Spotify Newsroom, 23 Apr 2026).
You can. A development-mode app allows 5 users, its owner needs an active Premium plan, and since Feb 2026 it reads the songs of only your own playlists. Cotlet works in your signed-in account instead, so none of that applies.
No, only the entry point. Both carry the same 12 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Spotify AB.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy