A Model Context Protocol (MCP) server that provides seamless access to Last.fm listening data and music information via AI assistants like Claude.
- π§ 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
- π OAuth 2.0 Authentication: Industry-standard auth with session persistence
- β‘ 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
- Go to Settings β Integrations β Add Integration
- Enter the MCP server URL:
https://lastfm-mcp.com/mcp - Click Connect - your browser will open to Last.fm
- Sign in and authorize the app
- Done! Your session persists across conversations.
- Open Claude Desktop β Settings β Integrations
- Click Add Integration
- Enter the URL:
https://lastfm-mcp.com/mcp - Click Add - authenticate with Last.fm when prompted
claude mcp add --transport http lastfm "https://lastfm-mcp.com/mcp"When you first use a Last.fm tool, you'll be prompted to authenticate.
Add to your Windsurf MCP config (~/.codeium/windsurf/mcp_config.json):
{
"mcpServers": {
"lastfm": {
"serverUrl": "https://lastfm-mcp.com/mcp"
}
}
}npx @modelcontextprotocol/inspector https://lastfm-mcp.com/mcpContinue.dev (VS Code/JetBrains):
{
"mcpServers": {
"lastfm": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://lastfm-mcp.com/mcp"]
}
}
}Zed Editor:
{
"context_servers": {
"lastfm": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://lastfm-mcp.com/mcp"]
}
}
}This server uses OAuth 2.0 for authentication. When you connect from any supported client:
- The client detects the 401 response with OAuth metadata
- Your browser opens to Last.fm for authentication
- After authorizing, tokens are stored and persist across sessions
All major MCP clients (Claude.ai, Claude Desktop, Claude Code, Windsurf) support OAuth.
Note: Public tools (track info, artist info, similar artists, etc.) work without authentication. You only need to sign in to access your personal listening data.
| 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 |
lastfm_auth_status |
Check your authentication status |
| 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 |
| 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?"
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
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.
- Node.js 18+
- Cloudflare Workers account
- Last.fm API credentials (Get them here)
-
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 with MCP Inspector:
npx @modelcontextprotocol/inspector http://localhost:8787/mcp
-
Test authentication locally:
- Visit
http://localhost:8787/loginto authenticate - Use the session ID in your local testing
- Visit
-
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:
npm run deploy:prod
-
Verify deployment:
curl https://lastfm-mcp.com/
Get track information:
curl -X POST https://lastfm-mcp.com/mcp \
-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.com/mcp \
-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
}
}
}'For authenticated requests, use the session_id parameter:
curl -X POST "https://lastfm-mcp.com/mcp?session_id=YOUR_SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_recent_tracks",
"arguments": {
"limit": 10
}
}
}'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?"
- π Runtime: Cloudflare Workers (global edge deployment)
- π‘ Protocol: Model Context Protocol (MCP) 2024-11-05 / 2025-06-18
- π Authentication: OAuth 2.0 (RFC 9728) + Session ID fallback
- πΎ Storage: Cloudflare KV (sessions, OAuth tokens, caching)
- π΅ API: Last.fm Web API v2.0
- β‘ Performance: Smart caching, rate limiting, retry logic
| Endpoint | Purpose |
|---|---|
/mcp |
MCP JSON-RPC endpoint |
/login |
Manual authentication (legacy) |
/authorize |
OAuth 2.0 authorization |
/.well-known/oauth-authorization-server |
OAuth server metadata |
/.well-known/oauth-protected-resource |
OAuth resource metadata |
# Run tests
npm test
# Type checking
npm run typecheck
# Linting
npm run lint
# Build check
npm run build- 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
MIT License - see LICENSE file for details.
- 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