OffStereo

io.github.andzar22Published by GitHub account andzar22v3.0.0Updated Oct 25, 2026

Builds narrated, playable music stories, explores sample lineage, and saves verified playlists.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowMedia & Design

Overview

AI-generated overview

OffStereo builds narrated, playable music stories, explores documented sample lineage, and saves verified playlists into a listener's music service.

What you can do
Draft and review authored stories or intake pasted documents into editable drafts, and create playable cards for songs or narrated stories, including downloadable MP3 story audio and prepared Spotify episodes. Discover genre-aware releases and archive matches, get combined dated music-history results, and explore sourced sample lineage. Create playlists from an idea or track list, with an optional preview before committing. Control the active player: pause, resume, skip, queue a next song, adjust music level, or explain why a song is present. Save matched session music as a private playlist, and view or manage the signed-in listener's own stories and service playlists.
When to use it
Useful when a listener wants music discovery, narrated music stories, sample-lineage exploration, or playlists saved to Spotify or Apple Music, and wants to steer playback conversationally. Also suited to turning pasted articles or notes into a cited story draft for review.
Requirements
A remote streamable HTTP endpoint; no package, environment variables or headers are declared. Saving playlists and managing owned items require a signed-in listener and an active music service; Spotify or Apple Music is used only when the listener names it.
Before you install
Saving sessions and managing owned items change the listener's music library: playlists are added, stories are archived (restorable), and Spotify playlists are removed from the library. Prepared Spotify episodes are not published automatically. Story audio is returned as a downloadable MP3 link, so treat that link as shareable content.

Installation

In SourceWeft

  1. Open OffStereo in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.andzar22%2Foffstereo/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "offstereo": {
      "type": "http",
      "url": "https://www.offstereo.com/api/mcp"
    }
  }
}

Tools

13

create_authored_story

Create from your set list and notes

Use action=article with title, url and pasted text to draft a cited adaptation for review; this does not fetch the URL. Inspect its evidence and narration before action=review. Use action=intake with title and notes to organize a pasted document into an editable draft. Review all extracted identities and unassigned lines before action=review. Turn a supplied ordered set list and exact liner notes into a playable story without rewriting them. First use action=review with material, present the returned recordings, narration and issues for approval, then action=prepare with that reviewId after approval. To edit an owned story, action=revise takes sessionId and narration changes, returns a new review, and leaves the original unchanged. Reviews expire after 30 minutes. After preparation, export_video with sessionId and narration beatId creates a short narrated video; video_status with jobId reports progress and signed-in browser download links. Downloads require the same owner to sign in; these links are not public or bearer download URLs. Use credits with sessionId for the saved transcript, source credits, recording identities and owner-only return path. Does not publish or start playback. Music rights are not granted and narration export does not include music.

ParametersurltextjobIdnotestitleactionrequiredbeatIdchangesmaterialreviewIdsessionId

make_playable

Play music or a story

Create one playable OffStereo card for a direct standalone-song or narrated-story request. Discovery and Music Today already play their songs, so keep those results in their original card unless the listener asks for dedicated controls. experience=single_track returns exactly one recording with no narration or library save; pass artist plus track. experience=story progressively creates a sourced story; mode=fresh starts a new build. Pass artist plus album for an exact record and trackCount for an exact requested length. Spotify, Apple Music, and SoundCloud URLs are story seeds unless the listener requests only the recording. Playlist requests use create_playlist. existingSessionId opens a selected library story; get_session is reserved for card polling. The mounted card owns live progress and playback. Assistant prose should avoid restating transient stages such as building, recording, or still working because they become stale as the card updates, and should wait for Ready before stating final counts. A tool call opens the card without starting playback.

ParametersmodealbumtitletrackartistlengthprompttrackssourceUrlvideoModeexperiencesourceText+4 more

get_session

Refresh the player

Application polling for an already-mounted OffStereo card. It refreshes one PlayableSession in place. A selected library story opens through make_playable(existingSessionId), while playback and contextual follow-ups use steer_session.

ParameterssessionIdrequired

steer_session

Steer the listening session

Control and contextual follow-ups for the active player: pause, resume, skip, play the next song, append one exact next song, adjust the music level, explain why a song is present, open an explicitly requested documented sample lineage, or return to the story. The result updates the mounted card in place. For an AI-DJ transition to a newly chosen record, pass queueTrack with exact artist and title; OffStereo resolves it and appends it to this same widget so the current song can finish and auto-advance. Keeping the transition in this queue avoids a second make_playable call. Use instruction='Queue this as the next song without interrupting the current song' to queue ahead, or 'Play this next now' to append and immediately advance. A why-this-song question preserves the queue. sessionId identifies the active session, and activeItemId plus positionMs preserve exact continuity when the card supplies them.

ParameterssessionIdpositionMsqueueTrackinstructionrequiredactiveItemIdplaybackStateacknowledgeDirectiveId

discover

Discover music

Discover genre-aware new releases, strong public-archive matches, or popular OffStereo shows. Call exactly once per listener request: put every positive genre into the same genres array, use [] when none were requested, and avoid one call or card per genre. query carries the listener's full wording, exclusions, counts, and no-padding constraint. Results remain relevant rather than padding a requested genre or archive search with unrelated rows. Dated music-history requests use music_today and are not a discover mode. playableOnly limits results to music that plays in ChatGPT. allowBuild and allowSave preserve a read-only request. The result card already includes song playback; a separate one-song card is for an explicit request for a dedicated song card.

ParameterstyperequiredlimitquerygenresrequiredallowSaveallowBuildplayableOnlyperGenreLimit

music_today

Music today

Call exactly once for a 'today in music' or dated music-history request. One response already combines album anniversaries, artist birthdays and memorials, current releases, current US song-chart context, and related playable OffStereo stories; use that one combined call rather than separate history, releases, charts, or shows calls. dateMode=today uses the listener's current day and omits date; dateMode=explicit pairs with a named YYYY-MM-DD date. limit is the maximum total across the combined response, playableOnly limits rows to music that plays in ChatGPT, and allowBuild=false plus allowSave=false preserves a read-only request. This is the only dated-music tool in the current schema.

ParametersdatelimitdateModerequiredallowSaveallowBuildplayableOnly

explore_lineage

Explore sample lineage

Explore documented sample lineage. Pass artist + track for one song, or topic for one multi-song narrated lineage story. OffStereo only returns connections it can source and withholds uncertain matches rather than guessing.

Parameterstopictrackartist

create_playlist

Create a playlist

Create one playlist from a natural-language idea or explicit track list. Call exactly once per listener turn: do not inspect the result and make a corrective second call or stack another playlist card in the same response. previewOnly=true returns one authoritative playlist that can be heard before saving and needs no music-service connection. After explicit approval, previewOnly=false with the approved tracks and the same concise editorial name creates one private playlist in the listener's active music service. Pass service only when the listener explicitly names Spotify or Apple Music. requiredArtists carries every artist the listener named as required. allowSecondPlaylist is true only for an explicit request for a separate additional playlist. Sign-in recovery preserves the exact request and pendingActionId for a safe retry.

ParametersnamecountprompttracksservicepreviewOnlypendingActionIdrequiredArtistsallowSecondPlaylist

save_session

Save the story playlist

Explicitly save the matched music from one listening session as a private playlist in the listener's active music service. Pass service only when the listener explicitly names Spotify or Apple Music. Unmatched songs are excluded and reported. If sign-in is needed, OffStereo preserves the request for one safe retry.

ParametersnameservicesessionIdpendingActionId

prepare_episode

Prepare a Spotify episode

Prepare one finished OffStereo story to become a private Spotify episode after the listener explicitly asks. OffStereo packages its completed intro, ordered narration, sign-off, branded title, show notes, OffStereo cover, chapters, and song timeline, then returns an honest handoff: the episode is not in Spotify until the listener finishes with Spotify's Save to Spotify helper on their own computer. Use the active or selected story's sessionId. This is for a narrated story, not a playlist or an unfinished build.

ParameterssessionIdrequired

manage_owned_item

Manage my library

Manage the signed-in listener's own OffStereo stories or service playlists. Removing an OffStereo story is a recoverable archive operation, and restore brings it back. Removing an owned Spotify playlist means remove from library because Spotify does not permanently delete playlists; the operation follows an explicit confirmation turn. Apple Music's public API does not expose playlist deletion, so that case returns an honest unsupported handoff. confirm=true records explicit confirmation of the named item and operation.

ParametersidrequiredactionrequiredconfirmserviceitemTyperequired

get_story_audio

get story audio

Get a finished OffStereo story as ONE downloadable MP3 — the narrated story, without the records. Use this on any surface where a player card cannot render: send it as a WhatsApp or Telegram voice note, attach it to an email, play it over a phone or speaker, or hand it to someone as a file. The URL is public and needs no OffStereo account, so it can be forwarded to anyone. It is narration only, which is why it is freely shareable — say so rather than promising the songs; the songs are at webUrl. Prefer this over reading a summary aloud in your own synthetic voice: this is the produced story, already voiced. Only finished shows have audio — poll get_show until status is ready.

ParametersslugshowId

my_offstereo

My OffStereo

Call once to return the signed-in listener's OffStereo library overview, currently including their completed, unarchived shows. This is the primary personal-library tool.

Parameterslimit

Version history

1
  1. v3.0.0LatestSep 16, 2026

Score

83% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts

    Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.

  • LicenseNot applicable

    A hosted service is used under its provider's terms, so no license is expected here. This check is left out of the percentage.