Skip to main content
Glama
Cifero74

mcp-apple-music

by Cifero74
README.md
# mcp-apple-music šŸŽµ

mcp-name: io.github.Cifero74/mcp-apple-music

[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![MCP](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io)

An **MCP (Model Context Protocol) server** that gives Claude full access to your Apple Music account — search the catalog, browse your personal library, manage playlists, and explore your listening history and recommendations.

> **Ask Claude things like:**
> - *"Based on what I've been listening to lately, recommend 15 songs I don't have yet and add them to a new playlist"*
> - *"Show me all my playlists and tell me which artists appear most"*
> - *"Search for albums by Nick Cave and add my three favourites to a playlist called Dark Picks"*

---

## Features

| Tool | Description |
|---|---|
| `search_catalog` | Search Apple Music catalog (songs, albums, artists, playlists) |
| `search_library` | Search within your personal library |
| `get_library_songs` | List songs saved in your library (paginated) |
| `get_library_albums` | List albums in your library (paginated) |
| `get_library_artists` | List artists in your library |
| `get_library_playlists` | List all your playlists with IDs |
| `get_playlist_tracks` | Get tracks inside a specific playlist |
| `create_playlist` | Create a new playlist |
| `add_tracks_to_playlist` | Add songs to a playlist (library or catalog tracks) |
| `get_recently_played` | See recently played albums/playlists/stations |
| `get_recommendations` | Get personalised Apple Music picks |

---

## Requirements

- Python 3.10+
- [uv](https://docs.astral.sh/uv/) (recommended) or pip
- An **Apple Developer account** (free tier is fine) with a MusicKit key
- An active **Apple Music subscription**

---

## Setup

### 1. Create a MusicKit Key

1. Go to [developer.apple.com](https://developer.apple.com) → **Certificates, Identifiers & Profiles**
2. Under **Keys**, click **+** to create a new key
3. Give it any name, enable **MusicKit**, and click **Continue → Register**
4. **Download** the `.p8` file — you can only download it once, keep it safe!
5. Note your **Key ID** (e.g. `ABC123DEF4`) and your **Team ID** (found under *Membership Details*)

> āš ļø The Key ID is the alphanumeric code shown next to the key name — **not** the filename of the `.p8` file.

### 2. Clone and install

```bash
git clone https://github.com/marioinghilleri/mcp-apple-music
cd mcp-apple-music

# with uv (recommended)
uv sync

# or with pip
pip install -e .
```

### 3. Run the one-time setup wizard

```bash
# with uv
uv run mcp-apple-music-setup

# or directly
python -m mcp_apple_music.setup
```

The wizard will ask for your **Team ID**, **Key ID**, and the path to your `.p8` file. It then opens a browser page where you click **"Authorise Apple Music"** — this uses Apple's official MusicKit JS to obtain your Music User Token, which is stored securely at `~/.config/mcp-apple-music/config.json` (file permissions: `600`).

### 4. Add to Claude Desktop

Open your Claude Desktop config:

**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "apple-music": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/mcp-apple-music",
        "mcp-apple-music"
      ]
    }
  }
}
```

Restart Claude Desktop — you should see the apple-music tools available in the toolbar.

---

## How it works

Apple Music requires two separate tokens:

- **Developer Token** — a JWT you sign locally with your `.p8` private key. Valid up to 6 months; the server regenerates it automatically before expiry. Your key never leaves your machine.
- **Music User Token** — obtained once via MusicKit JS OAuth in the browser (the setup wizard handles this). Stored locally at `~/.config/mcp-apple-music/config.json`.

```
Your .p8 key  ──►  Developer Token (JWT, auto-renewed)  ─┐
                                                           ā”œā”€ā”€ā–ŗ Apple Music API
Browser OAuth ──►  Music User Token (stored locally)    ā”€ā”˜
```

> āš ļø **Playback control** (play/pause/skip) is not available via Apple's REST API. It requires native MusicKit frameworks (iOS/macOS app) or MusicKit JS running in a browser context.
>
> For playback control, check out [chrome-relay](https://chrome-relay.kushalsm.com) — a companion CLI that lets an MCP server drive a `music.apple.com` tab already open in Chrome, enabling play/pause/skip without shipping a MusicKit JS shim.

---

## Project structure

```
mcp-apple-music/
ā”œā”€ā”€ src/
│   └── mcp_apple_music/
│       ā”œā”€ā”€ __init__.py
│       ā”œā”€ā”€ auth.py      — Developer Token generation + User Token management
│       ā”œā”€ā”€ client.py    — Async HTTP client for api.music.apple.com
│       ā”œā”€ā”€ server.py    — FastMCP server with all 11 tools
│       └── setup.py     — One-time setup wizard (browser-based OAuth)
ā”œā”€ā”€ config.example.json  — Example config structure (no secrets)
ā”œā”€ā”€ pyproject.toml
└── README.md
```

---

## Example prompts

Once connected, you can ask Claude:

```
"What have I been listening to this week? Based on that, find 10 songs
 I don't own yet that I'd probably enjoy and create a playlist with them."

"Search for all albums by Joni Mitchell and tell me which ones
 I already have in my library."

"List my playlists, pick the one that looks most like a workout mix,
 and add 5 high-energy songs from the catalog to it."

"Create a playlist called 'Rainy Sunday' with the 10 most mellow tracks
 you can find from my library."
```

---

## Authors

Built by **[Cifero74](https://github.com/Cifero74)** and **[Claude](https://claude.ai)** (Anthropic) as part of a personal MCP ecosystem for Claude Desktop.

This project was conceived, designed, debugged, and shipped entirely through a collaborative conversation between Mario and Claude — from API research and auth flow design, through the setup wizard, to live testing with a real Apple Music library.

Contributions, issues and PRs are welcome!

---

## License

[MIT](LICENSE) — use it, fork it, build on it.

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no ambiguity. The tools are well-organized around specific operations like adding tracks, creating playlists, retrieving different library entities, and searching catalog vs library. Even similar-sounding tools like get_library_songs and get_playlist_tracks have clearly different scopes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with perfect uniformity. The naming convention uses clear action prefixes (add, create, get, search) followed by specific resource identifiers, making the entire set predictable and easy to understand.

Tool Count5/5

With 11 tools, this server is well-scoped for Apple Music functionality. Each tool serves a distinct purpose that earns its place, covering library management, playlist operations, search capabilities, and personalization features without being overwhelming or insufficient.

Completeness4/5

The tool surface provides excellent coverage for core Apple Music operations including CRUD for playlists, comprehensive library browsing, and search capabilities. The only minor gap is the lack of update/delete operations for playlists or library items, but agents can still accomplish most workflows effectively.

Maintenance

ActivityInactive
ResponsivenessUnresponsive