Skip to main content
Glama

BulkTranscripts YouTube

List a playlist's videos

get_playlist_videos
Read-onlyIdempotent

List every video in a YouTube playlist, in playlist order (courses and series keep their sequence). Accepts a playlist URL or bare playlist id (13, 18, 26 or 34 characters — all valid). Public and unlisted playlists only: YouTube reports a private playlist as nonexistent (error playlist_private) until its owner sets Visibility to Unlisted. Costs 1 credit.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax videos to list, default 100.
playlistYesPlaylist URL or id (the list= value).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
countYes
titleNo
billingYes
resultsYes
has_moreNoTrue when the listing stopped at `limit`.
playlistYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "billing": {
      +      "properties": {
      +        "creditsCharged": {
      +          "description": "Credits this call cost (0 on cache hits).",
      +          "type": "integer"
      +        },
      +        "enabled": {
      +          "type": "boolean"
      +        },
      +        "freeLimit": {
      +          "type": "integer"
      +        },
      +        "granted": {
      +          "type": "integer"
      +        },
      +        "kind": {
      +          "description": "anon (free tier), license (paid) or admin.",
      +          "type": "string"
      +        },
      +        "remaining": {
      +          "description": "Credits left on this account.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "unlimited": {
      +          "type": "boolean"
      +        },
      +        "used": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "enabled"
      +      ],
      +      "type": "object"
      +    },
      +    "count": {
      +      "type": "integer"
      +    },
      +    "has_more": {
      +      "description": "True when the listing stopped at `limit`.",
      +      "type": "boolean"
      +    },
      +    "playlist": {
      +      "type": "string"
      +    },
      +    "results": {
      +      "items": {
      +        "properties": {
      +          "channel": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "channel_url": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "duration": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "published": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "type": {
      +            "enum": [
      +              "video",
      +              "channel",
      +              "playlist"
      +            ],
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "view_count": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "title": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "playlist",
      +    "results",
      +    "count",
      +    "billing"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description adds material context they cannot carry: a cost of 1 credit, the specific failure code playlist_private, and the visibility prerequisite that produces it. This is exactly the behavioral context that goes beyond structured fields.

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?

Four tight sentences, all front-loaded: what it does, accepted input forms, visibility constraint with error code, then cost. Nothing is padding or redundant restatement of the title.

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

Completeness5/5

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

With only 2 params, full schema coverage and an output schema, the description needs to supply access constraints, error semantics and cost — and it does all three. An agent can invoke this correctly and anticipate the private-playlist failure mode without further inference.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics the schema lacks: that 'playlist' accepts either a full URL or a bare id, and that valid id lengths are 13, 18, 26 or 34 characters. The 'limit' parameter is left to the schema, which documents it adequately.

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?

States a specific verb+resource ('List every video in a YouTube playlist') and pins the scope to a single playlist, which cleanly separates it from channel-wide siblings like get_channel_videos and get_latest_videos. The ordering guarantee further distinguishes its output from a generic search.

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?

Gives clear preconditions: public and unlisted playlists only, with an explanation of what happens for private ones (reported as nonexistent, error playlist_private). It does not name a sibling alternative or state when to prefer another tool, so it stops short of full when/when-not routing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources