OffStereo
Server Details
Builds narrated, playable music stories, explores sample lineage, and saves verified playlists.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 11 tools
Most tools target distinct actions (creating, discovering, saving, managing), and the detailed descriptions explicitly differentiate overlapping cases like create_playlist vs save_session and make_playable vs discover. A few pairs, such as make_playable and discover or get_session and steer_session, could still be confused at a glance, but the tool guidance resolves them.
Most tools follow a verb_noun pattern (create_playlist, save_session, steer_session, prepare_episode), but discover, music_today, and my_offstereo break the pattern with bare verbs or noun phrases. The names are clear individually but not fully consistent as a set.
11 tools is a reasonable size for a music assistant covering playlist creation, discovery, lineage, playback session management, library management, and export. It is toward the upper-middle range but each tool has a defined purpose.
The surface covers creation, discovery, playback session control, saving, managing owned items, and exporting to Spotify. Minor gaps exist, such as no explicit playlist editing or search tool, but the described flows handle the core lifecycle.
Available Tools
11 toolscreate_playlistCreate a playlistAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A concise editorial playlist title. Omit it when the listener did not supply a title; OffStereo derives one from the prompt. | |
| count | No | Target song count for prompt-generated playlists (1-50, default 20). | |
| prompt | No | A conceptual playlist request, e.g. 'connect A Tribe Called Quest to Steely Dan'. | |
| tracks | No | ||
| service | No | Destination service. Pass only when the listener explicitly names one; otherwise OffStereo uses the active service on their account. | |
| previewOnly | No | Resolve one unified playlist preview without saving or requiring a music-service connection. True when the listener asks to hear, inspect, or approve the songs before saving. | |
| pendingActionId | No | Retry token returned by a prior auth_required result. | |
| requiredArtists | No | Every artist the user explicitly requires, especially endpoints in a request such as 'from Minnie Riperton to Solange'. OffStereo validates these before creating anything. | |
| allowSecondPlaylist | No | True only when the listener explicitly requests another separate playlist. Omit or pass false otherwise; this does not authorize a second create_playlist call in the same response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| title | No | |
| object | Yes | Always 'playlist'. |
| status | Yes | preview, created, partial, auth_required, or failed. |
| tracks | No | |
| webUrl | No | |
| actions | No | |
| message | No | |
| privacy | No | Requested vs. confirmed privacy state. |
| service | No | |
| spotify | No | |
| warnings | No | |
| retryTool | No | |
| appleMusic | No | |
| authReason | No | |
| connectUrl | No | Sign-in URL when status is auth_required. |
| unresolved | No | Songs that could not be confidently matched. |
| connections | No | |
| pendingActionId | No | Retry token for a safe re-call after sign-in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already indicating readOnlyHint=false, the description adds critical behavioral context: the two-phase preview-then-save flow, the requirement for explicit approval, the sign-in recovery mechanism, and the exact-once constraint. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense; it front-loads the core purpose and then packs behavioral rules. No filler. Slightly long, but each sentence adds operational guidance, so it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 89% parameter coverage, the description fills the remaining gaps: the two-phase flow, approval requirement, retry semantics, and exact-once rule. For a 9-parameter tool with a complex lifecycle, this is comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, but the description enriches the meaning of key parameters: it explains that requiredArtists carries every artist the user names, that allowSecondPlaylist is strictly gated on explicit request, and that service should only be set when the user names a provider. These are non-obvious semantics not fully captured by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource statement ('Create one playlist') and immediately distinguishes two modes (natural-language idea vs explicit track list). It also clarifies the tool's scope versus siblings by specifying it's a single call per turn, which differentiates it from other tools that might add multiple items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage rules: call exactly once, use previewOnly for preview, switch to previewOnly=false after explicit approval, pass service only when explicitly named, and allowSecondPlaylist only on explicit request. These are concrete when-to and when-not-to instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discoverDiscover musicARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Discovery mode. search aliases archive; dated music-history requests use music_today. | |
| limit | No | Maximum total results (1-20). | |
| query | No | Archive query, or the listener's release-discovery wording when it contains genres, balance, count, or no-padding constraints. | |
| genres | Yes | Every positively requested genre; [] when the request is not genre-filtered. Results do not pad with unrelated genres. | |
| allowSave | No | False preserves an explicit request not to create or save anything. | |
| allowBuild | No | False preserves an explicit request not to create or build a story. | |
| playableOnly | No | True limits results to music with audio that plays inside ChatGPT. | |
| perGenreLimit | No | Maximum results from each named genre for a balanced new-release request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| date | No | ISO date for music-today results. |
| note | No | |
| exact | No | Strong archive matches (show_search). |
| query | No | |
| shows | No | Related playable OffStereo shows. |
| title | No | |
| events | No | Dated music-history events (music-today). |
| object | Yes | discovery or show_search. |
| recent | No | |
| status | Yes | |
| webUrl | No | |
| actions | No | |
| related | No | |
| releases | No | New releases (new_releases mode). |
| sections | No | |
| allowSave | No | |
| allowBuild | No | |
| archiveUrl | No | |
| playableOnly | No | |
| matchedGenres | No | |
| requestedGenres | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, idempotentHint, and destructiveHint=false, the description still adds valuable behavioral nuance: it states results 'remain relevant rather than padding a requested genre or archive search with unrelated rows', explains that playableOnly limits to ChatGPT-playable audio, and notes the result card already includes playback. These disclosures go beyond the annotation flags and help the agent set expectations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place—it front-loads the core purpose, then packs usage constraints, alternatives, and parameter semantics without redundancy. The structure flows from high-level action to specific rules to edge cases, and the wording is tight with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, 4 modes, and an output schema, the description is exceptionally complete. It covers invocation patterns, mode selection, parameter semantics, exclusions (dated history), and behavioral guarantees. Since an output schema exists, not detailing the return structure is acceptable; nothing an agent needs to call correctly is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the schema covering 100% of parameters, the description enriches several: it clarifies that 'query carries the listener's full wording, exclusions, counts, and no-padding constraint', explains genres as 'every positively requested genre; [] when not genre-filtered', and links allowBuild/allowSave to preserving read-only semantics. This transforms raw schema fields into actionable instructions, raising the value above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb–object pairing ('Discover genre-aware new releases, strong public-archive matches, or popular OffStereo shows'), naming the three concrete output categories and making the tool's scope immediately obvious. It also contrasts with sibling tools by explicitly routing dated music-history requests to music_today, so an agent can distinguish it without inspecting sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit invocation rules: 'Call exactly once per listener request', instructs to consolidate all positive genres into one array, and forbids per-genre calls. It also names the alternative (music_today) for dated history and clarifies when to use a separate one-song card. These are concrete when/when-not guidelines, not just vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explore_lineageExplore sample lineageAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Artist/topic request such as 'notable samples used by Nas'. | |
| track | No | Track title for a track-level lineage. | |
| artist | No | Artist for a track-level lineage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable session id, reused for get_session and steer_session. |
| mode | No | |
| queue | No | Ordered narration and track items. |
| title | Yes | |
| object | Yes | playable_session, lineage, or lineage_show. |
| status | Yes | Lifecycle: building, partial, ready, failed, and similar. |
| thesis | No | |
| webUrl | No | |
| actions | No | |
| chapters | No | |
| progress | No | Current build stage and message. |
| warnings | No | |
| webLabel | No | |
| citations | No | |
| storyScope | No | Count-level result assessment. |
| description | No | |
| queueUpdate | No | Most recent model-authored queue change. |
| resumeStack | No | |
| activeBranch | No | |
| nowPlayingContext | No | |
| playbackDirective | No | One-shot transport request the mounted card applies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
All three annotations are false, contributing no behavioral hints, so the description carries the full disclosure burden. It does well by stating the conservative sourcing behavior ('only returns connections it can source and withholds uncertain matches rather than guessing'), which is genuinely useful context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first front-loads the purpose and scope; the second packs the usage modes and the behavioral caveat into tight, purposeful language. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and the two usage modes plus the sourcing caveat give an agent what it needs to call the tool. A minor gap is the lack of guidance on what happens when both topic and artist/track are supplied, and whether any parameter is effectively required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful grouping semantics beyond the schema by tying artist+track together for track-level queries and topic for story-level queries, clarifying how the otherwise-independent parameters relate. It stops short of specifying precedence or exclusivity if both forms are passed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Explore documented sample lineage') that is unambiguous and clearly distinct from all siblings, none of which touch lineage (they cover playlists, sessions, discovery, and owned items). The two modes (track-level and topic-level) are explicitly spelled out, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit parameter-selection guidance ('Pass artist + track for one song, or topic for one multi-song narrated lineage story'), which defines when each input combination applies. It does not, however, name alternative tools or state when NOT to use this tool over a sibling, leaving sibling routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sessionRefresh the playerARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable session id, reused for get_session and steer_session. |
| mode | No | |
| queue | No | Ordered narration and track items. |
| title | Yes | |
| object | Yes | playable_session, lineage, or lineage_show. |
| status | Yes | Lifecycle: building, partial, ready, failed, and similar. |
| thesis | No | |
| webUrl | No | |
| actions | No | |
| chapters | No | |
| progress | No | Current build stage and message. |
| warnings | No | |
| webLabel | No | |
| citations | No | |
| storyScope | No | Count-level result assessment. |
| description | No | |
| queueUpdate | No | Most recent model-authored queue change. |
| resumeStack | No | |
| activeBranch | No | |
| nowPlayingContext | No | |
| playbackDirective | No | One-shot transport request the mounted card applies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile with readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral context: the session must already be mounted, the refresh happens in place, and get_session does not open library stories or drive playback. The output schema covers return-shape details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, each earning its place: the polling scope, the refresh action, and the sibling routing. It is front-loaded with the core purpose and contains no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only, idempotent polling tool with an output schema, the description covers purpose, usage context, parameter semantics, and alternative tools. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single sessionId parameter. It does by referring to existingSessionId and an already-mounted PlayableSession, making clear that sessionId must reference an existing active session rather than a story or arbitrary string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: it refreshes one PlayableSession in place for an already-mounted OffStereo card. It also distinguishes itself from siblings by assigning story-opening to make_playable(existingSessionId) and playback/contextual follow-ups to steer_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames get_session as application polling for an already-mounted card, giving an explicit when-to-use context. It names make_playable and steer_session as the tools for opening and steering, respectively, which clearly routes the agent away from get_session for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_playablePlay music or a storyAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | fresh starts an explicitly new story; auto may reuse an exact strong match. | |
| album | No | Exact album or EP title, paired with artist when the listener names or shows a specific record. | |
| title | No | Short canonical artist, track, album, or subject title for the card, especially useful for an identified image or a prompt that also contains workflow instructions. | |
| track | No | Exact song title, paired with artist for reliable single_track matching. | |
| artist | No | Exact artist, paired with track for a one-song card or with album for an album-focused story. | |
| length | No | short fits an explicitly quick, brief, or concise narrated story and targets three narration-and-record chapters; standard keeps the full editorial arc. | |
| prompt | No | What the listening experience should explain. | |
| tracks | No | Optional: exact records the story should always include as playable tracks — e.g. every song a paired video names. They are pinned into the show in this order and curation fills the remaining slots up to trackCount, so a companion keeps the records the video discusses. Leave unset for normal curation. | |
| sourceUrl | No | An http(s) article or source URL to adapt. | |
| videoMode | No | When true, the story opens on a third-person editorial hook with no DJ greeting or time-of-day welcome — for a companion story paired with a video. Pair with an explicit `title` so page title, URL, and register all match the video. | |
| experience | No | single_track means one immediate song card with no narration or story creation; story means the full progressive narrated experience. | |
| sourceText | No | Source text or conversation context to adapt. | |
| trackCount | No | Exact number of songs requested for a narrated story (2-12). Use 1 with experience=single_track. | |
| personalization | No | library uses connected-listener taste as retrieval seeds; none is the default. | |
| existingSessionId | No | The chosen library story id for opening through the canonical player contract; get_session remains application polling. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable session id, reused for get_session and steer_session. |
| mode | No | |
| queue | No | Ordered narration and track items. |
| title | Yes | |
| object | Yes | playable_session, lineage, or lineage_show. |
| status | Yes | Lifecycle: building, partial, ready, failed, and similar. |
| thesis | No | |
| webUrl | No | |
| actions | No | |
| chapters | No | |
| progress | No | Current build stage and message. |
| warnings | No | |
| webLabel | No | |
| citations | No | |
| storyScope | No | Count-level result assessment. |
| description | No | |
| queueUpdate | No | Most recent model-authored queue change. |
| resumeStack | No | |
| activeBranch | No | |
| nowPlayingContext | No | |
| playbackDirective | No | One-shot transport request the mounted card applies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses significant behavioral details beyond the minimal annotations: the tool call opens a card without starting playback, the card owns live progress, single_track returns exactly one recording with no narration or library save, and story progressively creates a sourced story. It also advises assistant prose to avoid stale statements, which is non-obvious context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but tightly packed; every sentence carries distinct guidance, and the core purpose is front-loaded. While not as terse as ideal, it remains structured and avoids redundancy, earning a slight penalty for length relative to the 10% weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 15 parameters, 4 enums, a rich output schema, and many sibling tools, the description covers routing, parameter combinations, behavioral expectations, and assistant-specific instructions. An agent has all necessary context to call it correctly without external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds meaningful interplay: explains artist+track pairing for single_track, album pairing for exact records, trackCount usage, how source URLs act as seeds, and the videoMode requirement for a title. This goes beyond the individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create one playable OffStereo card for a direct standalone-song or narrated-story request.' It also distinguishes from siblings by noting Discovery and Music Today already play their songs and that playlist requests use create_playlist, so an agent can clearly tell when this tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: for direct standalone-song or narrated-story requests, keeps results from Discovery/Music Today in original cards unless dedicated controls are requested, routes playlist requests to create_playlist, assigns get_session to polling, and details how existingSessionId works. Conditions are spelled out precisely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_owned_itemManage my libraryADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | OffStereo session id or saved playlist id. | |
| action | Yes | ||
| confirm | No | Records the listener's explicit confirmation of the named destructive operation. | |
| service | No | Required for playlists. | |
| itemType | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| title | No | |
| action | No | |
| object | Yes | Always 'item_management'. |
| status | Yes | confirmation_required, archived, restored, removed_from_library, unsupported, or auth_required. |
| webUrl | No | |
| message | No | |
| service | No | |
| itemType | No | |
| authReason | No | |
| connectUrl | No | |
| recoverable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses much more than the destructiveHint annotation alone: archive is recoverable, restore is the inverse, Spotify playlist removal is non-permanent, Apple Music returns an unsupported handoff, and confirm=true records explicit confirmation. This genuinely informs the agent about side effects and external constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries distinct information: core scope, recoverable archive behavior, Spotify semantics, Apple limitation, and confirmation semantics. It is front-loaded with the main purpose and keeps the service-specific caveats to exactly the needed detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive nature, service-specific behaviors, and confirmation requirement, the description covers the non-obvious aspects an agent needs to invoke this tool correctly. The presence of an output schema means return values do not need to be explained in the description, and no substantive gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 60% schema description coverage, the description compensates by explaining the meaning of archive/restore/remove, the role of confirm, and service-specific behavior. The mapping of actions to itemType is somewhat inferential rather than explicit, but an agent can still understand which action applies to stories versus playlists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource ('Manage the signed-in listener's own OffStereo stories or service playlists') and then details the available operations. It distinguishes the tool's scope from siblings, though it doesn't explicitly name alternative tools such as create_playlist or my_offstereo to sharpen differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete service-specific guidance: OffStereo story removal is a recoverable archive, Spotify removal is a library removal requiring confirmation, and Apple Music deletion is unsupported. It does not explicitly state 'use this instead of sibling X,' but the 'own items' scope and the service caveats provide a clear application context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
music_todayMusic todayARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date YYYY-MM-DD for dateMode=explicit; absent for dateMode=today. | |
| limit | No | Maximum total results across the already-combined response (1-20, default 8). Honor an explicit result count. | |
| dateMode | Yes | today represents the listener's current day; explicit represents one named calendar date. | |
| allowSave | No | False preserves an explicit request not to create or save anything. | |
| allowBuild | No | False preserves an explicit request not to create or build a story. | |
| playableOnly | No | True limits music-history results to rows with audio playable in ChatGPT. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| date | No | ISO date for music-today results. |
| note | No | |
| exact | No | Strong archive matches (show_search). |
| query | No | |
| shows | No | Related playable OffStereo shows. |
| title | No | |
| events | No | Dated music-history events (music-today). |
| object | Yes | discovery or show_search. |
| recent | No | |
| status | Yes | |
| webUrl | No | |
| actions | No | |
| related | No | |
| releases | No | New releases (new_releases mode). |
| sections | No | |
| allowSave | No | |
| allowBuild | No | |
| archiveUrl | No | |
| playableOnly | No | |
| matchedGenres | No | |
| requestedGenres | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context beyond this: the response combines multiple types of music-history data, limit applies across the combined response, playableOnly restricts rows to ChatGPT-playable audio, and allowBuild=false plus allowSave=false preserves a read-only request. No contradiction with the annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, beginning with the most important instruction ('Call exactly once') before moving into parameter behavior. The sentence enumerating the combined payload is informative rather than filler, and there is little redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. The description covers all invocation-relevant context: exact call count, date modes, limit scope, playableOnly behavior, read-only flag combinations, and how this tool relates to other calls. An agent has enough information to call music_today correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter info in the description. The description mainly restates what the schema already says, such as dateMode=today omitting date and limit being the combined maximum. It adds no fundamentally new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a precise directive ('Call exactly once for a 'today in music' or dated music-history request') and lists the combined payload components: anniversaries, birthdays, releases, chart context, and stories. It closes by positioning the tool as 'the only dated-music tool in the current schema,' clearly distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use trigger and an explicit when-not-to-split instruction: use one combined call rather than separate history, releases, charts, or shows calls. It also provides parameter-level usage direction (dateMode=today vs explicit, limit caps, playableOnly filtering, and read-only flags), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_offstereoMy OffStereoARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Shows to return (1-50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| shows | Yes | |
| title | No | |
| object | Yes | Always 'library'. |
| status | No | |
| actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context like 'currently including' (implies the content may change) and 'Call once' (suggests it's not meant for repeated polling). This adds some value beyond annotations but does not describe the return format or pagination, which is acceptable given an output schema exists. The description is consistent with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The first sentence front-loads the core purpose and scope, and the second sentence reinforces its primary role. Every word earns its place, and it is easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and an output schema, the description is fully adequate. It tells the agent what the tool returns, its scope, and that it is the primary library tool. The existence of an output schema covers return structure, and the limit parameter covers pagination. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the only parameter 'limit' is described with a range). The tool description does not add any parameter-specific details beyond what the schema already provides. Since the schema fully documents the parameter, the baseline of 3 is appropriate; the description adds no extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('return'), a specific resource ('OffStereo library overview'), and a defined scope ('completed, unarchived shows'). It also distinguishes itself by calling out 'primary personal-library tool', which differentiates it from sibling tools like discover or music_today. The purpose is unambiguous and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says 'Call once' and labels itself as the primary personal-library tool, giving clear context that this is the go-to for a listener's own library. However, it does not explicitly state when to avoid this tool or name alternatives, such as when archived or in-progress shows are needed. The guidance is clear but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_episodePrepare a Spotify episodeAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The completed OffStereo story id from the active player or the listener's library. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| show | No | The finished episode: id, title, description, coverUrl, episodeAudioUrl, durationMs, and audio metadata. |
| object | Yes | Always 'spotify_episode'. |
| status | Yes | Always 'prepared'. |
| chapters | No | Final reconciled chapter markers. |
| requires | No | External dependencies the caller provides: the save-to-spotify CLI and network access, with install and source details. |
| timeline | No | Ordered timeline items plus completeness and chapter status. |
| howToPublish | No | Editorial, audio, safety, and step-by-step publish guidance. |
| publishState | No | Idempotent publish receipt location and resume rules. |
| omittedTracks | No | Songs disclosed as omitted from the timeline. |
| spotifyTarget | No | Target Spotify show identity and settings. |
| desktopHandoff | No | A ready-to-forward request for a desktop agent to finish the private save. |
| includedTracks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false, so the description doesn't repeat those. It adds crucial context that the episode is not in Spotify immediately and that the listener must complete the save on their own computer, which is a non-obvious behavioral trait. It also states that the tool returns an 'honest handoff,' providing expected output behavior beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, three sentences that front-load the core action and immediately specify the key prerequisite and the non-obvious outcome. It avoids repetition of the schema and annotations, with each sentence providing new information. The structure is logical: action, key constraint, then clarification of an alternative use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a multi-step packaging process) and the single parameter, the description covers the essential aspects: what it does, the precondition (explicit request), the non-blocking handoff, and the exclusion of playlists or unfinished builds. The output schema exists, so the return structure is handled separately. Minor gaps include not specifying what 'honest handoff' returns in detail, but the output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of a single parameter (sessionId) with a minimal but clear description. The tool description adds context that the sessionId should be from the active or selected story, which is slightly more specific than the schema's 'from the active player or the listener's library.' However, since the schema is fully covered and the parameter is simple, the description adds only marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (prepare), the resource (a finished OffStereo story to become a private Spotify episode), and the context (after the listener explicitly asks). It distinguishes itself from related actions like 'make_playable' by emphasizing the handoff to Spotify's helper and the condition of a narrated story, not a playlist or unfinished build.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: 'after the listener explicitly asks' and 'for a narrated story, not a playlist or an unfinished build.' It also implies that the listener must finish the process with Spotify's own helper, setting a clear boundary. No alternative tools are named, but the context signals are strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_sessionSave the story playlistBInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| service | No | ||
| sessionId | No | ||
| pendingActionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| title | No | |
| object | Yes | Always 'playlist'. |
| status | Yes | preview, created, partial, auth_required, or failed. |
| tracks | No | |
| webUrl | No | |
| actions | No | |
| message | No | |
| privacy | No | Requested vs. confirmed privacy state. |
| service | No | |
| spotify | No | |
| warnings | No | |
| retryTool | No | |
| appleMusic | No | |
| authReason | No | |
| connectUrl | No | Sign-in URL when status is auth_required. |
| unresolved | No | Songs that could not be confidently matched. |
| connections | No | |
| pendingActionId | No | Retry token for a safe re-call after sign-in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-readonly, non-destructive operation. The description adds meaningful behavior: unmatched songs are excluded and reported, and sign-in triggers a preserved request with one retry. These details go beyond the annotations and clarify side effects, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the core purpose and then present conditions. No fluff or redundancy; it efficiently conveys the essential action and constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main action and constraints, and the output schema handles return values. However, it does not explain the pendingActionId parameter or specify prerequisites like an active session. For a tool with four parameters and no required ones, more detail is needed for an agent to call it reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description must compensate for parameter documentation. It explains the service parameter's conditional use and hints at sessionId via 'one listening session', but leaves name and pendingActionId unexplained. This is a significant gap given the schema provides no descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (save), resource (matched music from one listening session), and result (private playlist in active music service). It implies a distinction from create_playlist by focusing on a session's matched songs, but does not explicitly name the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance for the service parameter (only pass when the listener explicitly names Spotify or Apple Music) and mentions a safe retry on sign-in. However, it does not state when to use this tool versus siblings like create_playlist, leaving that decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steer_sessionSteer the listening sessionAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | ||
| positionMs | No | ||
| queueTrack | No | One exact new record to append to the active widget queue. Use this instead of opening another one-song widget when the listener asks the AI DJ to choose what comes next. | |
| instruction | Yes | ||
| activeItemId | No | ||
| playbackState | No | ||
| acknowledgeDirectiveId | No | Mounted-card acknowledgement for the exact one-shot playback directive it has finished applying. Periodic cursor syncs omit this field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable session id, reused for get_session and steer_session. |
| mode | No | |
| queue | No | Ordered narration and track items. |
| title | Yes | |
| object | Yes | playable_session, lineage, or lineage_show. |
| status | Yes | Lifecycle: building, partial, ready, failed, and similar. |
| thesis | No | |
| webUrl | No | |
| actions | No | |
| chapters | No | |
| progress | No | Current build stage and message. |
| warnings | No | |
| webLabel | No | |
| citations | No | |
| storyScope | No | Count-level result assessment. |
| description | No | |
| queueUpdate | No | Most recent model-authored queue change. |
| resumeStack | No | |
| activeBranch | No | |
| nowPlayingContext | No | |
| playbackDirective | No | One-shot transport request the mounted card applies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses key behaviors: it updates the mounted card in place, appends queueTrack to the same widget so the current song can finish and auto-advance, and explains the difference between queueing ahead and immediate interruption. It also mentions that periodic cursor syncs omit acknowledgeDirectiveId. It stops short of describing failure modes or permission requirements, but the disclosed behavior is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core purpose ('Control and contextual follow-ups for the active player') and then covers queueing specifics. While long, every sentence adds a distinct piece of information (card update behavior, queueTrack resolution, instruction variants, queue preservation). It could be more scannable with bullets, but it is not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, nested queueTrack object, and an output schema), the description addresses the main workflows: queueing ahead vs playing now, why-this-song behavior, lineage opening, and story return. It mentions the result updates the mounted card, and since an output schema exists, it need not detail the return format. It covers the essential scenarios for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 29% schema description coverage, the description carries significant parameter meaning. It explains sessionId identifies the active session, activeItemId and positionMs preserve exact continuity, and queueTrack must include exact artist and title for AI-DJ transitions. It also gives two valid instruction values. It does not explicitly address playbackState or acknowledgeDirectiveId, but the schema provides descriptions for those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as controlling the active listening session with a specific verb 'Control' and resource 'active player', followed by a concrete list of actions (pause, resume, skip, play next, append, adjust level, explain, open lineage, return to story). It distinguishes itself from sibling make_playable by explicitly stating that using queueTrack 'avoids a second make_playable call' and by calling out the difference from 'opening another one-song widget'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: for AI-DJ transitions it instructs to pass queueTrack with exact artist and title, and gives two concrete instruction strings ('Queue this as the next song without interrupting the current song' vs 'Play this next now') with their behavioral consequences. It also notes that a why-this-song question preserves the queue, helping the agent decide when to use this tool versus alternatives like make_playable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
- First observed
create_playlist - First observed
discover - First observed
explore_lineage - First observed
get_session - First observed
make_playable - First observed
manage_owned_item - First observed
music_today - First observed
my_offstereo - First observed
prepare_episode - First observed
save_session - First observed
steer_session
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Create, co-edit, analyze, publish, and export collaborative step-sequencer sessions through MCP.
Create music promotion campaigns, Smart Links, analytics, and music distribution applications.
Find independent music by how it sounds: similar tracks and playlists from a track link.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables DJs to retrieve BPM, key/Camelot, energy, and other track metadata with provider provenance, score transitions, plan setlists, and control Spotify playlists and playback with staged, revalidated writes for safety.MIT
- AlicenseNot gradedqualityAmaintenanceAnalyze listening patterns, create custom playlists, discover missing albums, validate radio streams, and provide personalized recommendations through natural language.28585AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables natural-language inquiries about personal listening history and playlist creation with enforced hard constraints and automated repair.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search, play, queue, pause, resume, and skip tracks in a shared music room via stdio MCP tools, while a synchronized PWA mini/full player serves human listeners.MIT