Skip to main content
Glama

yt-mcp

M8ven Score

A small Python CLI and MCP server I built to create YouTube Music radio mixes and private playlists from multiple seed songs.

I wanted something YouTube Music itself did not give me easily: start from several songs that define a mood, merge their radio queues, remove duplicates, and turn the result into a playlist I can actually keep.

What started as a recommendation problem quickly became an engineering problem around safe writes and recovery: OAuth, resumable playlist creation, deterministic mixing, validation, and explicit read/write boundaries.

How It Works

flowchart TD
    U[User or agent] --> E[yt CLI or yt-mcp]
    E --> O{Operation}
    O -->|Search| S[Search YouTube Music]
    O -->|Single-seed radio| R[Fetch song-radio queue]
    O -->|Multi-seed radio| M[Fetch queues and round-robin mix]
    S --> N[Normalize track metadata]
    R --> N
    M --> N
    N --> T[Structured CLI or MCP result]

    O -->|Create playlist| C[Build fresh radio or mix and exact track plan]
    C --> P[Create private playlist and save resumable state]
    P --> I[Insert planned tracks]
    O -->|Resume| L[Load saved plan and verify remote prefix]
    L --> I
    A[Google OAuth] -. authorizes .-> P
    A -. authorizes .-> L
    A -. authorizes .-> I

Related MCP server: ytmusic-mcp

Features

  • Search YouTube Music without authentication

  • Build a radio queue from one song

  • Mix radio queues from two to ten seed songs

  • Create private playlists

  • Resume interrupted playlist creation

  • Use the same functionality through MCP

Quick Start

Requires Python 3.10+ and uv.

uv sync --locked
uv run --locked yt search "Alan Sorrenti Figli delle stelle"
uv run --locked yt radio "Alan Sorrenti Figli delle stelle" --limit 30
uv run --locked yt radio-mix \
  "Tourist LeMC Adem" \
  "Brihang Steentje" \
  "Yong Yello Luchtkasteel" \
  --limit 50

radio uses the first playable search result and reports the selected seed. Pass --video-id VIDEO_ID to select a specific recording, or --json for structured output.

How Radio Mixing Works

radio-mix:

  1. Resolves every query to a playable seed.

  2. Fetches one ordered radio queue per seed.

  3. Takes one new track from each queue in seed order, then repeats.

  4. Removes all seed songs and duplicate video IDs across queues.

  5. Stops at the total --limit (default 50, maximum 100).

For fixed input queues, mixing is deterministic. YouTube Music can return different queues between calls, and exhausted queues produce a shortfall rather than filler tracks. Search and radio remain anonymous and never change an account.

Creating Playlists

Playlist writes use Google OAuth and the official YouTube Data API. Create a Google OAuth client of type TVs and Limited Input devices, save it as oauth-client.json, and authorize the account:

chmod 600 oauth-client.json
uv run --locked yt auth oauth

Then create a private playlist from a fresh multi-seed mix:

uv run --locked yt playlist create-mix "Belgian evening" \
  "Tourist LeMC Adem" \
  "Brihang Steentje" \
  --description "Warm Belgian mix" \
  --limit 50

Before inserting the first track, the command saves the exact write plan in an owner-only state file. If insertion is interrupted, resume the same playlist:

uv run --locked yt playlist resume PLAYLIST_ID

Resume verifies that the remote playlist is still private and matches the expected prefix before appending only the missing tracks. Completed retries are no-ops; concurrent resumes for the same playlist are not supported.

See OAuth and playlist recovery for complete setup, credential handling, and recovery details.

MCP Server

yt-mcp starts a local stdio MCP server with six focused tools:

Tool

Effect

search_songs

Read-only song search

get_song_radio

Read-only radio recommendations

get_multi_seed_radio

Read-only round-robin mix from two to ten song radios

create_private_radio_playlist

Creates one private playlist from a song radio

create_private_multi_seed_radio_playlist

Creates one private playlist from a multi-seed mix

resume_private_playlist

Reconciles and completes a playlist from its saved plan

Read tools are anonymous and do not load account credentials. Write tools require OAuth and are deliberately separated from read-only operations. The server exposes no generic method for arbitrary ytmusicapi calls.

If you want to run write tools without per-call approval, install a reviewed snapshot outside agent-writable workspaces rather than trusting a mutable checkout.

See MCP setup and MCP security and approvals.

Design Decisions

  • Reads stay anonymous where possible. Search and radio discovery do not need access to a Google account.

  • Writes are explicit. Playlist creation is separated from read-only operations in both the CLI and MCP interface.

  • Write plans are saved before mutation. An interrupted playlist can be resumed without recomputing a different radio mix.

  • Resume verifies remote state. It continues only when the existing playlist matches the expected prefix.

  • Tests don't touch real accounts. External clients are replaced with fakes during automated tests.

Development

uv run --locked pytest

Tests use fake clients and make no network or account changes. The implementation plan, multi-seed plan, and resume plan document scope and acceptance criteria.

Limitations

  • Search and radio depend on YouTube Music's unofficial internal API.

  • Results may change between calls and contain fewer tracks than requested.

  • Playlist writes use the official YouTube Data API and require Google OAuth.

  • Concurrent resume operations for the same playlist are not supported.

License

MIT. See LICENSE.

Available Tools

6 tools
create_private_multi_seed_radio_playlistCreate a private multi-seed radio playlistB

Create one private playlist from a fresh two-to-ten-seed radio mix.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
titleYes
queriesYes
descriptionNoCreated by yt-mcp.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
seedsYes
titleYes
tracksYes
requestedYes
playlistIdYes
trackCountYes
privacyStatusYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate that this is a non-read-only, non-idempotent, non-destructive operation. The description adds useful context by specifying that the playlist is private and the mix is 'fresh,' but it does not go beyond that into auth requirements, rate limits, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler and puts the core purpose first. It is concise, though it is also somewhat under-specified rather than fully informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists and annotations cover basic safety, the description omits important constraints such as the lower/upper seed bounds, the limit default, and how this creation flow behaves after invocation. The tool could be called incorrectly because key behavioral details are left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It only hints at the seed-count range for queries and does not address title, description, or limit. The 'two-to-ten-seed' constraint is useful but not tied explicitly to the queries parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Create one private playlist from a fresh two-to-ten-seed radio mix.' This clearly distinguishes it from sibling read-style tools like get_multi_seed_radio and search_songs, and from the likely single-seed variant create_private_radio_playlist.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'two-to-ten-seed radio mix' implies the tool is for creating a playlist from multiple seeds, but it never explicitly says when to use this tool versus create_private_radio_playlist or get_multi_seed_radio. No exclusions or alternative routing are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_private_radio_playlistCreate a private radio playlistB

Create a private playlist from a fresh song-radio queue in the connected account.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
titleYes
descriptionNoCreated by yt-mcp.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
seedYes
titleYes
tracksYes
requestedYes
playlistIdYes
trackCountYes
privacyStatusYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description adds little beyond confirming it creates a playlist. It does mention 'fresh song-radio queue,' which hints at creating a new queue, but it doesn't disclose other traits like whether the playlist is immediately visible or if it requires an existing radio queue. Since annotations cover the safety profile, the description meets the minimum but doesn't enrich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the action and the key context. It is efficient and free of filler. However, it could arguably be slightly more detailed without becoming verbose, but it does not waste words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters (2 required), no parameter descriptions, and an output schema, the description is far from complete. It doesn't explain how to construct the arguments, what the 'fresh song-radio queue' means in practice, or how it differs from the multi-seed variant. The presence of an output schema does not help with input construction. An agent would struggle to call this tool correctly without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning none of the parameters (title, query, limit, description) are documented in the schema. The description provides no information about what these parameters mean or how to use them. An agent would have to guess that 'query' is the seed song and 'title' is the playlist name, which is not obvious. The description completely fails to compensate for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Create') and a specific resource ('private playlist') and adds a distinguishing context: 'from a fresh song-radio queue in the connected account.' This clearly separates it from sibling create_private_multi_seed_radio_playlist, which implies a multi-seed radio. 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a use case (creating a private playlist from a single song-radio queue) but does not explicitly state when to choose this tool over the multi-seed sibling or get_song_radio. There is no mention of alternatives or exclusions. The context is present but not formalized, so an agent might need to infer the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_multi_seed_radioMix multiple YouTube Music song radiosA
Read-onlyIdempotent

Round-robin two to ten song radios into one deduplicated result.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queriesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
seedsYes
tracksYes
returnedYes
requestedYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so safety context is covered. The description adds meaningful behavioral detail beyond annotations: the round-robin combination strategy, the two-to-ten cardinality constraint, and deduplication of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact, front-loaded sentence with no wasted words. Every phrase adds useful information about the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent tool with an output schema, the description covers the essential invocation details: seed count range, combination method, and deduplication. It does not spell out the exact output shape, but the output schema handles that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for parameter meaning. It implies that 'queries' must contain two to ten song seeds, but it does not explicitly define what a query represents or explain how 'limit' controls the result size. This is adequate but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('round-robin'), the resource ('two to ten song radios'), and the outcome ('one deduplicated result'). It clearly distinguishes this multi-seed combination behavior from siblings like get_song_radio and create_private_multi_seed_radio_playlist.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is clear: combine multiple YouTube Music song radios into a single result. It does not explicitly state when to prefer this over create_private_multi_seed_radio_playlist or get_song_radio, but the behavior and sibling names make the intended context apparent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_song_radioGet a YouTube Music song radioA
Read-onlyIdempotent

Get YouTube Music's ordered radio recommendations around the first song match.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
seedYes
tracksYes
returnedYes
requestedYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior, so the description only needs to add selection and ordering semantics. 'Ordered' reveals result ordering, and 'around the first song match' explains how the query is resolved. This adds value beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no filler. It front-loads the key resource and operation before adding the qualifier, making it easy to scan and understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 an output schema and strong annotations, the description is largely sufficient. The remaining gaps—unexplained limit semantics and lack of explicit alternative guidance—are minor but prevent a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It implicitly clarifies that query is the song search whose first match seeds the radio, but it says nothing about limit, leaving its meaning—number of tracks, number of radio items, or search results—to inference from the default of 30.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a clear resource ('YouTube Music song radio'), and a precise behavior ('ordered radio recommendations around the first song match'). The single-seed 'first song match' phrasing distinguishes it from siblings like get_multi_seed_radio and search_songs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is provided. The phrase 'around the first song match' implies a single-song seed, which indirectly separates it from get_multi_seed_radio, but the description does not directly name alternatives or state selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_private_playlistResume a private yt-mcp playlistB

Resume one exact saved track plan; do not invoke concurrently.

ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
requestedYes
playlistIdYes
trackCountYes
privacyStatusYes
addedTrackCountYes
previousTrackCountYes
remainingTrackCountYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a non-readOnly, non-idempotent, non-destructive action. The description adds a useful concurrency warning that goes beyond the annotations, but it does not explain what resuming entails in practice, such as whether it activates the plan, starts playback, or mutates saved state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the core purpose and includes the important concurrency warning, so every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only one parameter and an output schema, a short description is acceptable. However, the lack of any playlist_id guidance and any explicit sibling differentiation leaves the definition minimally complete for an agent deciding when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions playlist_id or how to obtain it. The parameter name and 'saved track plan' give minimal implicit meaning, but the description does not compensate for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Resume') and a concrete resource ('one exact saved track plan'), and the title clarifies it applies to a private playlist. This distinguishes it from siblings like search_songs or create_private_radio_playlist, though it does not explicitly contrast itself with them and 'exact' is slightly vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage guidance is the negative constraint 'do not invoke concurrently.' There is no explicit statement about when to choose this tool over the search or create siblings, though the semantics imply it is for resuming an existing saved plan rather than creating or searching.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_songsSearch YouTube Music songsA
Read-onlyIdempotent

Find songs with IDs, artists, album titles, durations, and links.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
tracksYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, openWorld=true, idempotent=true, and destructive=false, covering safety and side effects. The description adds valuable context about the return fields (IDs, artists, album titles, durations, links), which is beyond what annotations provide. No contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tight sentence that states the core function and the data provided. No filler or redundancy; it is front-loaded with the action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple search tool with an output schema (present but not shown) and clear annotations, the description covers the essential purpose and returned data. It does not detail pagination or result count, but the presence of an output schema and annotations make this unnecessary. It is adequate for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description does not explain the meaning of 'query' or 'limit'. While 'query' is intuitively a search string, 'limit' is not described (e.g., max results). The description only lists output fields, not input semantics, so it fails to compensate for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb ('Find') and a defined resource ('songs') plus the key data returned (IDs, artists, album titles, durations, links). It unambiguously separates this from sibling tools that generate radios or playlists, so an agent knows exactly what this tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (searching for songs) and the sibling tools are so distinct (radio/playlist creation) that no explicit when-not guidance is necessary. An agent can infer this is the tool for song discovery without ambiguity, though it does not explicitly name alternatives.

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.

  1. 6 tool updatesv0.3.0
    • Addedcreate_private_multi_seed_radio_playlist
    • Changedcreate_private_radio_playlist3 fields changed
      • addedOutput schema / $defs / TrackResult / properties / album
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Album"
        +}
      • addedOutput schema / $defs / TrackResult / properties / duration_seconds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Duration Seconds"
        +}
      • changedOutput schema / $defs / TrackResult / required
        Previous value: -[
        -  "videoId",
        -  "title",
        -  "artists",
        -  "duration",
        -  "url"
        -]New value: +[
        +  "videoId",
        +  "title",
        +  "artists",
        +  "album",
        +  "duration",
        +  "duration_seconds",
        +  "url"
        +]
    • Addedget_multi_seed_radio
    • Changedget_song_radio3 fields changed
      • addedOutput schema / $defs / TrackResult / properties / album
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Album"
        +}
      • addedOutput schema / $defs / TrackResult / properties / duration_seconds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Duration Seconds"
        +}
      • changedOutput schema / $defs / TrackResult / required
        Previous value: -[
        -  "videoId",
        -  "title",
        -  "artists",
        -  "duration",
        -  "url"
        -]New value: +[
        +  "videoId",
        +  "title",
        +  "artists",
        +  "album",
        +  "duration",
        +  "duration_seconds",
        +  "url"
        +]
    • Addedresume_private_playlist
    • Changedsearch_songs3 fields changed
      • addedOutput schema / $defs / TrackResult / properties / album
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Album"
        +}
      • addedOutput schema / $defs / TrackResult / properties / duration_seconds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Duration Seconds"
        +}
      • changedOutput schema / $defs / TrackResult / required
        Previous value: -[
        -  "videoId",
        -  "title",
        -  "artists",
        -  "duration",
        -  "url"
        -]New value: +[
        +  "videoId",
        +  "title",
        +  "artists",
        +  "album",
        +  "duration",
        +  "duration_seconds",
        +  "url"
        +]
  2. 3 tool updatesv0.1.0
    • First observedcreate_private_radio_playlist
    • First observedget_song_radio
    • First observedsearch_songs

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

The core actions are mostly distinct: search_songs is clearly separate from the radio and playlist tools. However, get_song_radio vs get_multi_seed_radio and the two create_private_*_playlist tools are easy to confuse without reading the descriptions closely.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern, with descriptive prefixes like search_, get_, create_, and resume_. Even the longer playlist names remain predictable and readable.

Tool Count5/5

Six tools is well-scoped for a YouTube Music radio/playlist helper. Each tool covers a meaningful part of the workflow without unnecessary bloat or duplication.

Completeness3/5

The core search, radio generation, and private playlist creation flows are covered, but the surface has gaps: there is no way to list, delete, or otherwise manage existing private playlists, and resume_private_playlist implies a saved-track-plan lifecycle that is not fully supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server for YouTube Music that enables searching songs and artists, managing playlists, and authenticating via Google OAuth, using STDIO transport.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables searching YouTube Music and managing playlists: create/delete playlists, add/remove/reorder tracks, and more via natural language.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables searching YouTube Music and managing playlists through read and confirmation-gated write tools over STDIO. Supports identity checks, song search, playlist listing/retrieval, and previewed playlist creation, track addition, and exact track removal.
    MIT