An MCP (Model Context Protocol) server that integrates with Apple Music, allowing Claude and other MCP clients to search the catalog, manage playlists, and access your library.
- Search the Apple Music catalog (songs, albums, artists, playlists)
- List your playlists and browse their tracks
- Create new playlists with optional initial tracks
- Add tracks to existing playlists
- Browse your library songs
- View recently played tracks
- Get personalized recommendations
- Node.js 18+
- An Apple Developer Program membership
- A MusicKit identifier and private key
- Go to Apple Developer > Certificates, Identifiers & Profiles
- Click + to register a new identifier
- Select MusicKit IDs (or Media IDs)
- Enter a description (e.g., "MCP Server") and an identifier (e.g.,
com.yourname.musicmcp) - Click Continue and Register
- Go to Apple Developer > Keys
- Click + to create a new key
- Name it (e.g., "MusicKit MCP Key")
- Check MusicKit and configure it with your MusicKit identifier
- Click Continue and Register
- Download the .p8 file (you can only download it once!)
- Note the Key ID shown on the page
Your Team ID is visible at the top right of the Apple Developer portal, or under Membership Details.
git clone <this-repo>
cd AppleMusicMCP
npm install
npm run buildThe server is configured via environment variables:
| Variable | Required | Description |
|---|---|---|
APPLE_MUSIC_TEAM_ID |
Yes | Your Apple Developer Team ID |
APPLE_MUSIC_KEY_ID |
Yes | Your MusicKit Key ID (from the key you created) |
APPLE_MUSIC_PRIVATE_KEY_PATH |
Yes | Absolute path to your .p8 private key file |
APPLE_MUSIC_STOREFRONT |
No | ISO 3166 alpha-2 country code (default: us) |
APPLE_MUSIC_CONFIG_DIR |
No | Config directory path (default: ~/.apple-music-mcp/) |
APPLE_MUSIC_AUTH_PORT |
No | Port for auth server (default: 7829) |
Before using library features (playlists, library songs, recommendations), you need to authorize with your Apple Music account:
APPLE_MUSIC_TEAM_ID=YOUR_TEAM_ID \
APPLE_MUSIC_KEY_ID=YOUR_KEY_ID \
APPLE_MUSIC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8 \
node dist/index.js authThis will:
- Open your browser to a local authorization page
- You click "Authorize with Apple Music" and sign in with your Apple ID
- The Music User Token is captured and stored in
~/.apple-music-mcp/tokens.json - The token is valid for approximately 6 months
Note: Catalog search works without authorization. Only library/personal features require it.
Add this to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"apple-music": {
"command": "node",
"args": ["/absolute/path/to/AppleMusicMCP/dist/index.js"],
"env": {
"APPLE_MUSIC_TEAM_ID": "YOUR_TEAM_ID",
"APPLE_MUSIC_KEY_ID": "YOUR_KEY_ID",
"APPLE_MUSIC_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_XXXXXXXX.p8",
"APPLE_MUSIC_STOREFRONT": "us"
}
}
}
}Add to your Claude Code settings (.claude/settings.json or global settings):
{
"mcpServers": {
"apple-music": {
"command": "node",
"args": ["/absolute/path/to/AppleMusicMCP/dist/index.js"],
"env": {
"APPLE_MUSIC_TEAM_ID": "YOUR_TEAM_ID",
"APPLE_MUSIC_KEY_ID": "YOUR_KEY_ID",
"APPLE_MUSIC_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_XXXXXXXX.p8"
}
}
}
}Search the Apple Music catalog.
query(string, required): Search termtypes(array, optional):["songs", "albums", "artists", "playlists"](default: songs, albums, artists)limit(number, optional): 1-25 results per type (default: 10)storefront(string, optional): Country code
List your playlists.
limit(number, optional): 1-100 (default: 25)offset(number, optional): Pagination offset
Get tracks from a playlist.
playlist_id(string, required): Playlist IDlimit(number, optional): 1-100 (default: 100)offset(number, optional): Pagination offset
Create a new playlist.
name(string, required): Playlist namedescription(string, optional): Playlist descriptiontrack_ids(string[], optional): Song IDs to add initially
Add tracks to an existing playlist.
playlist_id(string, required): Playlist IDtrack_ids(string[], required): Song IDs to add (max 100)
Remove tracks from a playlist (limited Apple API support).
playlist_id(string, required): Playlist IDtrack_ids(string[], required): Song IDs to remove
Get songs from your library.
limit(number, optional): 1-100 (default: 25)offset(number, optional): Pagination offset
Get recently played tracks.
limit(number, optional): 1-10 (default: 10)
Get personalized music recommendations.
limit(number, optional): 1-30 recommendation groups (default: 10)
Once configured, you can ask Claude things like:
- "Search for Taylor Swift songs on Apple Music"
- "Show me my Apple Music playlists"
- "Create a new playlist called 'Road Trip' with some rock songs"
- "What have I been listening to recently?"
- "Get my music recommendations"
- "Add the song 'Bohemian Rhapsody' to my Road Trip playlist"
Run the auth flow: node dist/index.js auth
Your developer token may be invalid. Check your Team ID, Key ID, and private key path.
Your Music User Token may have expired (they last ~6 months). Re-run: node dist/index.js auth
Ensure port 7829 isn't in use. Set a different port with APPLE_MUSIC_AUTH_PORT.
This is a known Apple Music API limitation. The API has limited DELETE support for playlist tracks. Use the workaround: create a new playlist with the tracks you want to keep.
npm run dev # Run with tsx (no build needed)
npm run build # Compile TypeScript
npm start # Run compiled version- Transport: stdio (JSON-RPC over stdin/stdout)
- API: Direct REST calls to
api.music.apple.com/v1/ - Auth: ES256 JWT developer tokens + browser-based MusicKit JS for user tokens
- Caching: In-memory with per-endpoint TTLs
- Error handling: Typed errors with helpful messages and retry logic for rate limits
