One audio queue across Spotify, the browser, local files and whatever is already playing.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
One queue over every audio source β including the ones you don't control.
A library your product imports so that whatever is driving β a model, a person clicking, a script β can control audio without knowing whether the sound is coming from Spotify, a browser tab, a podcast feed, or a file on disk.
Four sources, one list, in order. The first one is playing inside an app you do not own β and the queue waits for it to finish before taking over.
Add audio to your product without marrying one service. Write against one queue; swap or add backends later. An entry describes what to play, not where from, so it can bind to whichever source is available at the moment it plays.
Join what someone is already listening to instead of talking over it. The machine's current playback β a YouTube tab, a podcast in Safari, VLC β can be a queue entry like any other. Your track starts when theirs ends.
Know what you can do before you try it. runtime.can('seek') answers for the
backend that is actually loaded. No silent no-ops, no discovering at 2am that
one source quietly ignored a command.
Keep playing when a source fails. If a backend cannot load an entry, the same description is handed to the next one that can. A queue does not stop because one service is down.
Survive a restart. serialize() / restore() β and a queue saved on a
machine with Spotify reopens on one without it, then plays from somewhere else.
| package | plays |
|---|---|
upnext-core | nothing β the queue, state machine, capability model and events. Zero dependencies, no I/O. |
upnext-adapter-spotify | the Spotify desktop app on macOS with no credentials, or the Web API with a token you hold |
upnext-adapter-browser | any media element you control β browser, Electron renderer, webview, across a process boundary |
upnext-adapter-local | local files and streams via ffplay/afplay |
upnext-adapter-apple-music | your Apple Music library through the Music app β no credentials, and it can search |
upnext-adapter-nowplaying | whatever the machine is already playing, whichever app is playing it (macOS + Linux) |
upnext-adapter-process | an adapter written in any language, over a pipe |
upnext-desktop | all of the above wired for you, in one call β plus the upnext CLI |
upnext-mcp | the same, as an MCP server any agent can use |
upnext-http | the same, over HTTP with a live event stream |
The point of the capability model is that these differ, and say so:
| starts tracks | end of track | position | seek | pause | volume | search | someone else can change it | |
|---|---|---|---|---|---|---|---|---|
| browser | β | event | exact | β | β | β | β | no |
| local (ffplay) | β | event | estimated | β | β | β | β ΒΉ | no |
| local (afplay) | β | event | estimated | β | β | β | β ΒΉ | no |
| spotify desktop | β | event | exact | β | β | β | βΒ² | yes |
| spotify web | β | event | exact | β | β | β | β | yes |
| apple music | β | poll | exact | β | β | β | β | yes |
| nowplaying | βΒ³ | poll | exact | β | β | β | β | yes |
ΒΉ only when you point it at a music folder to index Β· Β² the AppleScript dictionary cannot search a catalogue Β· Β³ there is no way to ask macOS's Now Playing register to start a specific track
Every β there is a refusal rather than a silent failure. An adapter that claims it can seek and then doesn't is a bug you chase for an hour; these tell you first, and the runtime routes around them.
Not built yet: Now Playing on Windows, and controlling one specific browser tab (needs an extension). Details at the bottom.
Every audio integration today puts the queue in the wrong place.
That works right up until the next item isn't a Spotify track β and then there is
nowhere to put it. upnext inverts it: the runtime owns the queue, and Spotify's
queue, Apple Music's Up Next and a browser tab's <audio> element all become
places to send one item at a time.
The fast way β every source this machine can reach, one call:
It ships a CLI too:
That is a YouTube tab, read with no browser extension.
Twelve tools in Claude Desktop, Cursor or anything else that speaks MCP β
including media_adopt_current, which puts what someone is already listening to
into the queue so the agent adds to it rather than talking over it.
upnext-adapter-local needs ffplay (from ffmpeg) or afplay (built into macOS).
On a Mac with Spotify open, add a second source with nothing to sign up for:
Want to hear it right now, with no files of your own?
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/upnext)<a href="https://allmcps.com/mcp/upnext"><img src="https://allmcps.com/api/badge/upnext?style=directory" alt="Upnext on AllMCPs" /></a>