rianvdm/lastfm-mcp
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:
- Find your npx path:
which npx
- 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
- Try any authenticated tool (like "Get my recent tracks")
- Claude will provide a Last.fm authentication URL
- Sign in with your Last.fm account and authorize the app
- Return to Claude - you're now authenticated!
- 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
-
Clone and install:
git clone https://github.com/rianvdm/lastfm-mcp.git cd lastfm-mcp npm install
-
Configure environment (
.dev.vars
):LASTFM_API_KEY=your_api_key_here LASTFM_SHARED_SECRET=your_shared_secret_here JWT_SECRET=your_secure_jwt_secret
-
Start development server:
npm run dev
-
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
-
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
-
Deploy:
wrangler deploy --env production
-
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
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
๐ License
MIT License - see file for details.
๐ Acknowledgments
- Last.fm for the comprehensive music API
- Model Context Protocol for the MCP specification
- Cloudflare Workers for the serverless runtime
๐ต Built with โค๏ธ for music lovers and AI enthusiasts