lastfm-mcp

lastfm-mcp is a TypeScript library that utilizes the Last.fm API to fetch music data and integrate it into applications. It allows for the analysis of user music preferences and provides recommendation features. The library simplifies interactions with the API, enabling developers to implement functionalities quickly.

GitHub Stars

10

User Rating

Not Rated

Favorites

0

Views

26

Forks

0

Issues

0

README
๐ŸŽต Last.fm MCP Server

License: MIT
TypeScript
Cloudflare Workers
Last.fm
MCP
CI

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)
Tool Description
get_track_info Get detailed information about any track
get_artist_info Get detailed artist information and bio
get_album_info Get album details and track listings
get_similar_artists Find artists similar to a given artist
get_similar_tracks Find tracks similar to a given track
ping Test server connectivity
server_info Get server status and capabilities
auth_status Check your authentication status
๐Ÿ” Personal Tools (Authentication Required)
Tool Description
get_recent_tracks Your recent listening history (supports pagination)
get_top_artists Your top artists by time period
get_top_albums Your top albums by time period
get_loved_tracks Your loved/favorite tracks
get_user_info Your Last.fm profile information
get_listening_stats Comprehensive listening statistics
get_music_recommendations Personalized music recommendations
๐Ÿ•ฐ๏ธ Temporal Query Tools (Authentication Required)
Tool Description
get_weekly_chart_list Get available historical time periods for temporal analysis
get_weekly_artist_chart Get artist listening data for specific time periods
get_weekly_track_chart Get 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:

Prompt Description Arguments
listening_insights Analyze user's listening habits and patterns username, period?
music_discovery Discover new music based on listening history username, genre?
track_analysis Get detailed analysis of a specific track artist, track
album_analysis Get detailed analysis of a specific album artist, album
artist_analysis Get detailed analysis of a specific artist artist
listening_habits Analyze and summarize user's listening habits username, 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 LICENSE file for details.

๐Ÿ™ Acknowledgments

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