@kentcdodds/spotify
Spotify playback, playlist, search, library, and device helpers.
AGENTS.md
120 lines · 4.6 KB · Markdown@kentcdodds/spotify — agent notes
Human setup and intent live in README.md. This file is for
agents: imports, smoke snippets, and edge cases. Integration ids by name
only — never paste token values. Do not disable live webhooks or jobs.
Auth / accounts
| Alias | Integration | Notes |
|---|---|---|
personal (default) | spotify | Kent’s personal playback / library |
family | spotify-family | Dodds Kids / household Sonos |
Every export accepts optional account: 'personal' | 'family' (or the
integration name). Reconnect:
/connect/oauth?provider=spotify / ...?provider=spotify-family.
Hosted app: https://kentcdodds.kody.run/packages/spotify.
Import paths
| Export | Import |
|---|---|
| accounts | kody:@kentcdodds/spotify/accounts |
| add-to-queue | kody:@kentcdodds/spotify/add-to-queue |
| add-tracks-to-playlist | kody:@kentcdodds/spotify/add-tracks-to-playlist |
| create-playlist | kody:@kentcdodds/spotify/create-playlist |
| follow-playlist | kody:@kentcdodds/spotify/follow-playlist |
| get-all-playlist-tracks | kody:@kentcdodds/spotify/get-all-playlist-tracks |
| get-devices | kody:@kentcdodds/spotify/get-devices |
| get-playlist | kody:@kentcdodds/spotify/get-playlist |
| get-queue | kody:@kentcdodds/spotify/get-queue |
| get-recently-played | kody:@kentcdodds/spotify/get-recently-played |
| get-recommendations | kody:@kentcdodds/spotify/get-recommendations |
| get-top-items | kody:@kentcdodds/spotify/get-top-items |
| get-track | kody:@kentcdodds/spotify/get-track |
| list-playlists | kody:@kentcdodds/spotify/list-playlists |
| play-context | kody:@kentcdodds/spotify/play-context |
| play-pause | kody:@kentcdodds/spotify/play-pause |
| playback-state | kody:@kentcdodds/spotify/playback-state |
| remove-tracks-from-playlist | kody:@kentcdodds/spotify/remove-tracks-from-playlist |
| save-tracks | kody:@kentcdodds/spotify/save-tracks |
| search | kody:@kentcdodds/spotify/search |
| seek | kody:@kentcdodds/spotify/seek |
| set-repeat | kody:@kentcdodds/spotify/set-repeat |
| set-shuffle | kody:@kentcdodds/spotify/set-shuffle |
| set-volume | kody:@kentcdodds/spotify/set-volume |
| skip | kody:@kentcdodds/spotify/skip |
| transfer-playback | kody:@kentcdodds/spotify/transfer-playback |
Prefer static kody:@kentcdodds/spotify/... imports from execute.
Smoke / read checks
No dedicated smoke-test export. Prefer read-only calls:
import accounts from 'kody:@kentcdodds/spotify/accounts'
import playbackState from 'kody:@kentcdodds/spotify/playback-state'
import getDevices from 'kody:@kentcdodds/spotify/get-devices'
export default async function main() {
const catalog = accounts()
const state = await playbackState({ account: 'personal' })
const devices = await getDevices({ account: 'personal' })
return { catalog, state, deviceNames: devices.map((d) => d.name) }
}import search from 'kody:@kentcdodds/spotify/search'
export default async function main() {
return await search({ query: 'radiohead', types: ['track'], limit: 5 })
}Playback / device targeting
Prefer deviceName (and optional deviceType) over opaque deviceId:
import getDevices from 'kody:@kentcdodds/spotify/get-devices'
import playContext from 'kody:@kentcdodds/spotify/play-context'
import transferPlayback from 'kody:@kentcdodds/spotify/transfer-playback'
export default async function main() {
const devices = await getDevices()
await transferPlayback({ deviceName: devices[0]?.name, play: true })
return await playContext({
contextUri: 'spotify:playlist:37i9dQZF1DX0XUsuxWHRQd',
deviceName: 'Living Room',
})
}import createPlaylist from 'kody:@kentcdodds/spotify/create-playlist'
export default async function main() {
return await createPlaylist({ account: 'family', name: 'Road Trip', public: false })
}Mutating helpers (play, queue, playlist edits, library saves, transfer) have
no package-level dryRun / confirm — get explicit user approval before
changing playback or library state. Prefer read checks first.
Edge cases
- Family account:
fallbackDeviceIdanddefaultCollectionUriare null — require an active device or explicitdeviceName/deviceId. - Personal account may fall back to a configured default device/collection when nothing is playing.
search: prefertypes(array);typeis accepted as an alias.skip:directionis'next'(default) or'previous'.set-volume:volumePercent0–100.- Never paste Spotify device ids into chat or across safety-sensitive tool
boundaries — pass
deviceNameinstead. - Do not disable the hosted package app or any related jobs/webhooks.