Skip to main content
Glama
kylestratis

Spotify Playlist MCP Server

by kylestratis

spotify_get_playlist_tracks

Read-onlyIdempotent

Retrieve detailed track information from any Spotify playlist, including artists, albums, durations, and IDs, with pagination support for large collections.

Instructions

Get tracks from a specific Spotify playlist.

Retrieves tracks from a playlist with detailed information (artists, album, duration, IDs).
Results are paginated for large playlists.

Args:
    - playlist_id: Spotify playlist ID (get from spotify_get_user_playlists or playlist URL)
    - limit: Number of tracks to return, 1-50 (default: 20)
    - offset: Starting position for pagination (default: 0)
    - response_format: 'markdown' or 'json'

Returns:
    Markdown: Numbered list with track details (name, artists, album, duration, ID, URI, popularity)
    JSON: {"total": N, "count": N, "offset": N, "tracks": [{id, name, artists, album, duration_ms, popularity, uri, external_urls}], "has_more": bool}

Examples:
    - "Show me what's in my workout playlist" -> View playlist contents
    - "Get track IDs from this playlist" -> Extract IDs for operations

Errors: Returns "No tracks found" if empty, or error for invalid playlist (404), auth failure (401), rate limits (429).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The async handler function spotify_get_playlist_tracks that implements the core logic: makes API request to Spotify playlists/{id}/tracks, processes items, formats as markdown or JSON with pagination info.
    async def spotify_get_playlist_tracks(params: GetPlaylistTracksInput) -> str:
        """Get tracks from a specific Spotify playlist.
    
        Retrieves tracks from a playlist with detailed information (artists, album, duration, IDs).
        Results are paginated for large playlists.
    
        Args:
            - playlist_id: Spotify playlist ID (get from spotify_get_user_playlists or playlist URL)
            - limit: Number of tracks to return, 1-50 (default: 20)
            - offset: Starting position for pagination (default: 0)
            - response_format: 'markdown' or 'json'
    
        Returns:
            Markdown: Numbered list with track details (name, artists, album, duration, ID, URI, popularity)
            JSON: {"total": N, "count": N, "offset": N, "tracks": [{id, name, artists, album, duration_ms, popularity, uri, external_urls}], "has_more": bool}
    
        Examples:
            - "Show me what's in my workout playlist" -> View playlist contents
            - "Get track IDs from this playlist" -> Extract IDs for operations
    
        Errors: Returns "No tracks found" if empty, or error for invalid playlist (404), auth failure (401), rate limits (429).
        """
        try:
            query_params = {"limit": params.limit, "offset": params.offset}
    
            data = await make_spotify_request(
                f"playlists/{params.playlist_id}/tracks", params=query_params
            )
    
            items = data.get("items", [])
            total = data.get("total", 0)
    
            if not items:
                return "No tracks found in this playlist."
    
            # Format response
            if params.response_format == ResponseFormat.MARKDOWN:
                lines = ["# Playlist Tracks\n", f"Showing {len(items)} of {total} tracks\n"]
    
                for i, item in enumerate(items, 1):
                    track = item.get("track")
                    if track:
                        lines.append(f"## {i}. {format_track_markdown(track)}\n")
    
                has_more = total > params.offset + len(items)
                if has_more:
                    next_offset = params.offset + len(items)
                    lines.append(
                        f"\n*More tracks available. Use offset={next_offset} to see more.*"
                    )
    
                return "\n".join(lines)
            else:
                # JSON format
                tracks = [item.get("track") for item in items if item.get("track")]
                return json.dumps(
                    {
                        "total": total,
                        "count": len(tracks),
                        "offset": params.offset,
                        "tracks": tracks,
                        "has_more": total > params.offset + len(items),
                    },
                    indent=2,
                )
    
        except Exception as e:
            return handle_spotify_error(e)
  • server.py:360-369 (registration)
    The @mcp.tool decorator registering the tool with name 'spotify_get_playlist_tracks', title, and hints like readOnlyHint: True.
    @mcp.tool(
        name="spotify_get_playlist_tracks",
        annotations={
            "title": "Get Tracks from Spotify Playlist",
            "readOnlyHint": True,
            "destructiveHint": False,
            "idempotentHint": True,
            "openWorldHint": True,
        },
    )
  • Pydantic model GetPlaylistTracksInput defining input parameters: playlist_id (required str), limit (int 1-50 default 20), offset (int >=0 default 0), response_format (enum markdown/json default markdown).
    class GetPlaylistTracksInput(BaseModel):
        """Input model for getting playlist tracks."""
    
        model_config = ConfigDict(str_strip_whitespace=True, validate_assignment=True)
    
        playlist_id: str = Field(
            ..., description="Spotify playlist ID", min_length=1, max_length=100
        )
        limit: int | None = Field(
            default=20, description="Number of tracks to return", ge=1, le=50
        )
        offset: int | None = Field(default=0, description="Offset for pagination", ge=0)
        response_format: ResponseFormat = Field(
            default=ResponseFormat.MARKDOWN,
            description="Output format: 'markdown' or 'json'",
        )

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kylestratis/spotify-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server