spotify
Original:🇺🇸 English
Translated
Spotify: play, search, queue, manage playlists and devices.
2installs
Added on
NPX Install
npx skill4agent add nousresearch/hermes-agent spotifyTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Spotify
Control the user's Spotify account via the Hermes Spotify toolset (7 tools). Setup guide: https://hermes-agent.nousresearch.com/docs/user-guide/features/spotify
When to use this skill
The user says something like "play X", "pause", "skip", "queue up X", "what's playing", "search for X", "add to my X playlist", "make a playlist", "save this to my library", etc.
The 7 tools
- — play, pause, next, previous, seek, set_repeat, set_shuffle, set_volume, get_state, get_currently_playing, recently_played
spotify_playback - — list, transfer
spotify_devices - — get, add
spotify_queue - — search the catalog
spotify_search - — list, get, create, add_items, remove_items, update_details
spotify_playlists - — get, tracks
spotify_albums - — list/save/remove with
spotify_librarykind: "tracks"|"albums"
Playback-mutating actions require Spotify Premium; search/library/playlist ops work on Free.
Canonical patterns (minimize tool calls)
"Play <artist/track/album>"
One search, then play by URI. Do NOT loop through search results describing them unless the user asked for options.
spotify_search({"query": "miles davis kind of blue", "types": ["album"], "limit": 1})
→ got album URI spotify:album:1weenld61qoidwYuZ1GESA
spotify_playback({"action": "play", "context_uri": "spotify:album:1weenld61qoidwYuZ1GESA"})For "play some <artist>" (no specific song), prefer and play the artist context URI — Spotify handles smart shuffle. If the user says "the song" or "that track", search and pass to play.
types: ["artist"]types: ["track"]uris: [track_uri]"What's playing?" / "What am I listening to?"
Single call — don't chain get_state after get_currently_playing.
spotify_playback({"action": "get_currently_playing"})If it returns 204/empty (), tell the user nothing is playing. Don't retry.
is_playing: false"Pause" / "Skip" / "Volume 50"
Direct action, no preflight inspection needed.
spotify_playback({"action": "pause"})
spotify_playback({"action": "next"})
spotify_playback({"action": "set_volume", "volume_percent": 50})"Add to my <playlist name> playlist"
- to find the playlist ID by name
spotify_playlists list - Get the track URI (from currently playing, or search)
- with the playlist_id and URIs
spotify_playlists add_items
spotify_playlists({"action": "list"})
→ found "Late Night Jazz" = 37i9dQZF1DX4wta20PHgwo
spotify_playback({"action": "get_currently_playing"})
→ current track uri = spotify:track:0DiWol3AO6WpXZgp0goxAV
spotify_playlists({"action": "add_items",
"playlist_id": "37i9dQZF1DX4wta20PHgwo",
"uris": ["spotify:track:0DiWol3AO6WpXZgp0goxAV"]})"Create a playlist called X and add the last 3 songs I played"
spotify_playback({"action": "recently_played", "limit": 3})
spotify_playlists({"action": "create", "name": "Focus 2026"})
→ got playlist_id back in response
spotify_playlists({"action": "add_items", "playlist_id": <id>, "uris": [<3 uris>]})"Save / unsave / is this saved?"
Use with the right .
spotify_librarykindspotify_library({"kind": "tracks", "action": "save", "uris": ["spotify:track:..."]})
spotify_library({"kind": "albums", "action": "list", "limit": 50})"Transfer playback to my <device>"
spotify_devices({"action": "list"})
→ pick the device_id by matching name/type
spotify_devices({"action": "transfer", "device_id": "<id>", "play": true})Critical failure modes
403 Forbidden — No active device foundspotify_devices list403 Forbidden — Premium required204 No Contentget_currently_playingis_playing: false429 Too Many Requests401 Unauthorizedhermes auth spotifyURI and ID formats
Spotify uses three interchangeable ID formats. The tools accept all three and normalize:
- URI: (preferred)
spotify:track:0DiWol3AO6WpXZgp0goxAV - URL:
https://open.spotify.com/track/0DiWol3AO6WpXZgp0goxAV - Bare ID:
0DiWol3AO6WpXZgp0goxAV
When in doubt, use full URIs. Search results return URIs in the field — pass those directly.
uriEntity types: , , , , , . Use the right type for the action — with a expects album/playlist/artist; expects an array of track URIs.
trackalbumartistplaylistshowepisodespotify_playback.playcontext_uriurisWhat NOT to do
- Don't call before every action. Spotify accepts play/pause/skip without preflight. Only inspect state when the user asked "what's playing" or you need to reason about device/track.
get_state - Don't describe search results unless asked. If the user said "play X", search, grab the top URI, play it. They'll hear it's wrong if it's wrong.
- Don't retry on or
403 Premium required. Those are permanent until user action.403 No active device - Don't use to find a playlist by name — that searches the public Spotify catalog. User playlists come from
spotify_search.spotify_playlists list - Don't mix with album URIs in
kind: "tracks"(or vice versa). The tool normalizes IDs but the API endpoint differs.spotify_library