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
๐ต 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 installConfigure environment (
.dev.vars):LASTFM_API_KEY=your_api_key_here LASTFM_SHARED_SECRET=your_shared_secret_here JWT_SECRET=your_secure_jwt_secretStart development server:
npm run devTest 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 productionDeploy:
wrangler deploy --env productionTest 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 LICENSE 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