lastfm-mcp

rianvdm/lastfm-mcp

3.3

If you are the rightful owner of lastfm-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

The Last.fm MCP Server is a Model Context Protocol server that provides seamless access to Last.fm listening data and music information via AI assistants like Claude.

๐ŸŽต Last.fm MCP Server

A Model Context Protocol (MCP) server that provides seamless access to Last.fm listening data and music information via AI assistants like Claude.

A powerful, production-ready server that bridges AI assistants with Last.fm's comprehensive music database.

โœจ Features

  • ๐ŸŽง Personal Listening Data: Recent tracks, top artists, albums, loved tracks
  • ๐ŸŽต Music Information: Detailed track, artist, and album information
  • ๐Ÿ” Music Discovery: Similar artists/tracks, personalized recommendations
  • ๐Ÿ“Š Listening Statistics: Comprehensive stats and listening habits analysis
  • ๐Ÿ” Secure Authentication: Last.fm Web Authentication with JWT sessions
  • โšก Smart Caching: Intelligent caching with optimized TTLs for performance
  • ๐Ÿ›ก๏ธ Rate Limiting: Built-in rate limiting respecting Last.fm API limits
  • ๐ŸŒ Production Ready: Deployed on Cloudflare Workers with global edge and CI/CD

๐Ÿš€ Quick Start

Using with Claude Desktop

Add this configuration to your Claude Desktop settings (Settings / Developer / Edit config):

{
	"mcpServers": {
		"lastfm": {
			"command": "npx",
			"args": ["mcp-remote", "https://lastfm-mcp-prod.rian-db8.workers.dev/sse"]
		}
	}
}

๐Ÿ’ก Tip: This uses the hosted server via mcp-remote, which works reliably across all platforms and doesn't require local Node.js setup.

๐Ÿ› Platform-Specific Troubleshooting
If you get "spawn npx NOENT" error

For NixOS users:

{
	"mcpServers": {
		"lastfm": {
			"command": "/run/current-system/sw/bin/npx",
			"args": ["mcp-remote", "https://lastfm-mcp-prod.rian-db8.workers.dev/sse"],
			"env": {
				"PATH": "/run/current-system/sw/bin:$PATH"
			}
		}
	}
}

For other systems:

  1. Find your npx path: which npx
  2. Use the full path in your config:
{
	"command": "/usr/local/bin/npx", // Use your actual path
	"args": ["mcp-remote", "https://lastfm-mcp-prod.rian-db8.workers.dev/sse"]
}

๐Ÿ”‘ Authentication Flow

  1. Try any authenticated tool (like "Get my recent tracks")
  2. Claude will provide a Last.fm authentication URL
  3. Sign in with your Last.fm account and authorize the app
  4. Return to Claude - you're now authenticated!
  5. Enjoy access to your personal Last.fm data

๐Ÿ› ๏ธ Available Tools

๐Ÿ”“ Public Tools (No Authentication Required)

ToolDescription
get_track_infoGet detailed information about any track
get_artist_infoGet detailed artist information and bio
get_album_infoGet album details and track listings
get_similar_artistsFind artists similar to a given artist
get_similar_tracksFind tracks similar to a given track
pingTest server connectivity
server_infoGet server status and capabilities
auth_statusCheck your authentication status

๐Ÿ” Personal Tools (Authentication Required)

ToolDescription
get_recent_tracksYour recent listening history (supports pagination)
get_top_artistsYour top artists by time period
get_top_albumsYour top albums by time period
get_loved_tracksYour loved/favorite tracks
get_user_infoYour Last.fm profile information
get_listening_statsComprehensive listening statistics
get_music_recommendationsPersonalized music recommendations

๐Ÿ•ฐ๏ธ Temporal Query Tools (Authentication Required)

ToolDescription
get_weekly_chart_listGet available historical time periods for temporal analysis
get_weekly_artist_chartGet artist listening data for specific time periods
get_weekly_track_chartGet track listening data for specific time periods

Perfect for questions like:

  • "When did I start listening to Led Zeppelin?"
  • "What was I listening to in March 2023?"
  • "How has my music taste evolved over time?"

๐Ÿ“š MCP Resources

Access Last.fm data via standardized MCP resource URIs:

lastfm://user/{username}/recent          # Recent tracks
lastfm://user/{username}/top-artists     # Top artists
lastfm://user/{username}/top-albums      # Top albums
lastfm://user/{username}/loved           # Loved tracks
lastfm://user/{username}/profile         # User profile
lastfm://track/{artist}/{track}          # Track info
lastfm://artist/{artist}                 # Artist info
lastfm://album/{artist}/{album}          # Album info
lastfm://artist/{artist}/similar         # Similar artists
lastfm://track/{artist}/{track}/similar  # Similar tracks

๐Ÿค– MCP Prompts

Rich AI prompts for music analysis and discovery:

PromptDescriptionArguments
listening_insightsAnalyze user's listening habits and patternsusername, period?
music_discoveryDiscover new music based on listening historyusername, genre?
track_analysisGet detailed analysis of a specific trackartist, track
album_analysisGet detailed analysis of a specific albumartist, album
artist_analysisGet detailed analysis of a specific artistartist
listening_habitsAnalyze and summarize user's listening habitsusername, timeframe?

These prompts generate contextual messages that guide AI assistants to provide meaningful music insights using the available Last.fm tools and data.

๐Ÿ—๏ธ Development

Prerequisites

  • Node.js 18+
  • Cloudflare Workers account
  • Last.fm API credentials (Get them here)

Local Setup

  1. Clone and install:

    git clone https://github.com/rianvdm/lastfm-mcp.git
    cd lastfm-mcp
    npm install
    
  2. Configure environment (.dev.vars):

    LASTFM_API_KEY=your_api_key_here
    LASTFM_SHARED_SECRET=your_shared_secret_here
    JWT_SECRET=your_secure_jwt_secret
    
  3. Start development server:

    npm run dev
    
  4. Test locally:

    curl -X POST http://localhost:8787 \
      -H "Content-Type: application/json" \
      -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_track_info","arguments":{"artist":"The Beatles","track":"Yesterday"}}}'
    

๐Ÿš€ Deployment

  1. Set production secrets:

    echo "your_api_key" | wrangler secret put LASTFM_API_KEY --env production
    echo "your_shared_secret" | wrangler secret put LASTFM_SHARED_SECRET --env production
    echo "your_jwt_secret" | wrangler secret put JWT_SECRET --env production
    
  2. Deploy:

    wrangler deploy --env production
    
  3. Test production:

    curl https://your-worker.workers.dev
    

๐Ÿ“‹ Example Usage

๐ŸŽต Public Music Data (No Authentication)

Get track information:

curl -X POST https://lastfm-mcp-prod.rian-db8.workers.dev \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_track_info",
      "arguments": {
        "artist": "Radiohead",
        "track": "Paranoid Android"
      }
    }
  }'

Find similar artists:

curl -X POST https://lastfm-mcp-prod.rian-db8.workers.dev \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_similar_artists",
      "arguments": {
        "artist": "Pink Floyd",
        "limit": 10
      }
    }
  }'

๐Ÿ” Personal Data (Requires Authentication)

Get recent tracks with pagination:

curl -X POST https://lastfm-mcp-prod.rian-db8.workers.dev \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your_session_token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_recent_tracks",
      "arguments": {
        "username": "your_username",
        "limit": 500,
        "page": 2
      }
    }
  }'

๐Ÿ•ฐ๏ธ Temporal Queries

Get available historical periods:

curl -X POST https://lastfm-mcp-prod.rian-db8.workers.dev \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your_session_token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_weekly_chart_list",
      "arguments": {
        "username": "your_username"
      }
    }
  }'

Discover what you were listening to in a specific time period:

curl -X POST https://lastfm-mcp-prod.rian-db8.workers.dev \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your_session_token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_weekly_artist_chart",
      "arguments": {
        "username": "your_username",
        "from": 1577836800,
        "to": 1578441600
      }
    }
  }'

๐Ÿค– AI Assistant Examples

With Claude or other AI assistants, you can now ask natural language questions like:

  • "When did I start listening to Led Zeppelin?"
  • "What was I obsessed with in summer 2023?"
  • "Show me how my music taste has evolved over the years"
  • "Find artists similar to my current favorites"
  • "What tracks should I check out based on my listening history?"

๐Ÿ—๏ธ Architecture

  • ๐ŸŒ Runtime: Cloudflare Workers (global edge deployment)
  • ๐Ÿ“ก Protocol: Model Context Protocol (MCP) 2024-11-05
  • ๐Ÿ” Authentication: Last.fm Web Auth + JWT sessions
  • ๐Ÿ’พ Storage: Cloudflare KV (sessions, caching, rate limiting)
  • ๐ŸŽต API: Last.fm Web API v2.0
  • โšก Performance: Smart caching, rate limiting, retry logic

๐Ÿงช Testing

# Run tests
npm test

# Type checking
npm run typecheck

# Linting
npm run lint

# Build check
npm run build

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“ License

MIT License - see file for details.

๐Ÿ™ Acknowledgments


๐ŸŽต Built with โค๏ธ for music lovers and AI enthusiasts