mcp-apple-music
This MCP server lets Claude search Apple Music and work with your library and playlists.
Search the Apple Music catalog and your personal library for songs, albums, artists, and playlists.
List saved library songs, albums, artists, and playlists with pagination/limits.
Inspect tracks in a specific playlist.
Create new playlists and add library or catalog tracks to existing playlists.
View recently played albums/playlists/stations and personalized recommendations.
Per the provided schema, it does not expose playback control, adding items to your library, or favorite/unfavorite tools.
Provides tools to search the Apple Music catalog, manage personal library (songs, albums, artists, playlists), create and modify playlists, and retrieve recently played items and recommendations.
mcp-apple-music šµ
mcp-name: io.github.Cifero74/mcp-apple-music
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 Apple Music catalog (songs, albums, artists, playlists) |
| Search within your personal library |
| List songs saved in your library (paginated) |
| List albums in your library (paginated) |
| List artists in your library |
| List all your playlists with IDs |
| Get tracks inside one of your playlists or an Apple Music catalog playlist ( |
| Create a new playlist |
| Add songs to a playlist (library or catalog tracks) |
| Save catalog songs, albums or playlists into your library |
| See recently played albums/playlists/stations |
| Get personalised Apple Music picks |
| Mark a catalog song as favorite (star) |
| Remove a catalog song from favorites |
| Check which catalog songs are favorited |
Related MCP server: Spotify MCP Server
Requirements
Python 3.10+
uv (recommended) or pip
A paid Apple Developer Program membership (99 USD/year) to create a MusicKit key. The free Apple Developer account can't create MusicKit keys.
An active Apple Music subscription
Setup
1. Create a MusicKit Key
Go to developer.apple.com ā Certificates, Identifiers & Profiles
Under Keys, click + to create a new key
Give it any name, enable MusicKit, and click Continue ā Register
Download the
.p8file ā you can only download it once, keep it safe!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
.p8file.
2. Clone and install
git clone https://github.com/Cifero74/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
# with uv
uv run mcp-apple-music-setup
# or directly
python -m mcp_apple_music.setupThe 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
{
"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
.p8private 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 ā a companion CLI that lets an MCP server drive a
music.apple.comtab 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 14 tools
ā āāā setup.py ā One-time setup wizard (browser-based OAuth)
āāā config.example.json ā Example config structure (no secrets)
āāā pyproject.toml
āāā README.mdExample 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 and Claude (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 ā use it, fork it, build on it.
Available Tools
15 toolsadd_to_libraryA
Save Apple Music catalog songs, albums or playlists into the user's library.
Use this when the user wants to keep something found with search_catalog, get_playlist_tracks or get_recommendations. Saved playlists then appear in get_library_playlists.
Args: song_ids: Comma-separated catalog song IDs (numeric). album_ids: Comma-separated catalog album IDs (numeric). playlist_ids: Comma-separated catalog playlist IDs (start with 'pl.').
| Name | Required | Description | Default |
|---|---|---|---|
| song_ids | No | ||
| album_ids | No | ||
| playlist_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It does disclose a postcondition ('Saved playlists then appear in get_library_playlists') and ID formats, which is real value, but it says nothing about required permissions, whether the operation is idempotent, or what happens when all three optional string params are left at their empty defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and usage guidance are front-loaded in the first two sentences, and the Args block is short and scannable. The formatting is slightly redundant with the schema titles, but every line carries usable information about formats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the parameter formats are well covered. However, for a mutation tool with no annotations, the absence of any statement about permissions, failure modes, or the empty-input case leaves real gaps an agent would want before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well: it explains that song and album IDs are numeric and comma-separated, and that playlist IDs use the 'pl.' prefix. The one gap is that it does not say whether at least one ID group must be supplied, which matters for a tool where all three params are optional with empty-string defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: saving catalog songs, albums, or playlists into the user's library. It distinguishes itself from read siblings by naming the upstream sources (search_catalog, get_playlist_tracks, get_recommendations), though it never explicitly contrasts itself with add_tracks_to_playlist, which is the closest functional neighbor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition: 'Use this when the user wants to keep something found with search_catalog, get_playlist_tracks or get_recommendations.' It also states the downstream consequence (saved playlists appear in get_library_playlists). It lacks any explicit when-NOT-to-use guidance, particularly versus add_tracks_to_playlist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tracks_to_playlistA
Add tracks to an existing playlist.
Args: playlist_id: The target playlist ID (starts with 'p.'). track_ids: List of track IDs to add. track_type: 'library-songs' for tracks from your library (default), 'songs' for catalog tracks (from search_catalog or a catalog 'pl.' playlist).
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes | ||
| track_type | No | library-songs | |
| playlist_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden for a mutation tool. It says nothing about required write permissions, duplicate-track handling, whether tracks are appended or replace existing entries, ordering, or what happens on invalid IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by compact per-parameter notes. Every line adds information; only the 'Args:' block formatting is slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and all parameters are described. However, for an unannotated mutation tool the description omits duplicate handling, permission requirements, and failure behavior, leaving real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description documents all three parameters: the 'p.' prefix format for playlist_id, the array of track IDs, and the two valid track_type values with their default. This is meaningfully more than the bare schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add tracks to an existing playlist'), making the operation immediately identifiable. The word 'existing' implicitly separates it from create_playlist, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The track_type explanation effectively routes the agent: use 'library-songs' for library content and 'songs' for catalog tracks obtained from search_catalog or a catalog 'pl.' playlist. It lacks explicit when-not-to-use guidance or error conditions, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_playlistC
Create a new playlist in your Apple Music library.
Args: name: Name for the new playlist. description: Optional short description.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Fails to disclose what the output schema contains, whether duplicate names are allowed, if the operation is idempotent, or what happens upon success/failure. 'Create' implies mutation but lacks safety/side-effect details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded action statement is good, but the 'Args:' section feels like mechanical schema documentation rather than narrative description. Appropriately brief but leaves significant gaps for a mutation tool with no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 0% schema coverage and no annotations, the description should provide more behavioral context. While output schema exists (relieving return-value burden), missing critical context: error conditions, uniqueness constraints, and relationship to sibling tools that populate playlists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates by documenting both parameters (name and description) with their purposes. However, lacks validation constraints (max length, allowed characters) or detailed semantics beyond basic labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb (Create) + resource (playlist) + scope (Apple Music library). However, fails to explicitly distinguish from sibling 'add_tracks_to_playlist' (creation vs. modification) or clarify that this creates an empty playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance, prerequisites (e.g., authentication requirements), or alternatives mentioned. The description does not indicate whether to use this before or after add_tracks_to_playlist, or how it relates to get_library_playlists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
favorite_songA
Mark a catalog song as favorite (the star in Apple Music).
Args: song_id: Catalog song ID (use search_catalog to find it).
| Name | Required | Description | Default |
|---|---|---|---|
| song_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations at all, so the description carries the full behavioral burden, and it discloses almost nothing about the write: no statement of idempotency (does re-favoriting error or no-op?), no mention that unfavorite_song is the reversible inverse, and no auth or failure-mode context. For a mutation tool with zero annotation coverage this is a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence states the effect, and the Args block is limited to the single parameter that matters with its provenance. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the lone parameter is sourced. What remains missing for a write tool with no annotations is any note on reversibility (unfavorite_song) or error/duplicate behavior, leaving the agent adequate but not fully prepared.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% ā song_id has no description in the input schema ā so the description must compensate, and it does: it labels the value a *catalog* song ID (distinct from a library song ID) and points at search_catalog as the source. It leaves out the expected format/example, keeping it just under full marks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Mark a catalog song as favorite") and adds a concrete analogy ("the star in Apple Music") that removes ambiguity about effect. It does not, however, name its obvious inverse sibling unfavorite_song or otherwise differentiate itself from that pair.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable pre-call guidance by naming search_catalog as the way to obtain the required song_id, which closes the loop on the only prerequisite the tool has. There is no explicit when-not guidance (e.g. for library vs catalog songs, or vs unfavorite_song), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_albumsA
List albums saved in your Apple Music library.
Args: limit: Number of albums to return, 1ā100 (default 25). offset: Pagination offset (default 0).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It implicitly conveys read-only behavior through the word 'List' and explains pagination via the offset parameter description. However, it lacks explicit safety declarations, rate limit warnings, auth requirements, or error behavior that would be critical for a tool accessing a user's personal library.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is optimally structured with a single clear sentence stating purpose, followed by a standard Args docstring block. No sentences are wasted; every line earns its place by providing essential parameter constraints immediately after the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (standard pagination pattern) and existence of an output schema, the description adequately covers the core functionality. However, with no annotations covering auth or safety, the description should have mentioned that this requires Apple Music authentication/authorization, which is missing. It meets minimum viability but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage (properties only have titles, no descriptions), the Args section compensates effectively by documenting the limit constraint (1ā100, default 25) and explaining offset as pagination context. This adds meaningful semantic value beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'List' followed by the resource 'albums' and clear scope 'saved in your Apple Music library'. It effectively distinguishes from siblings like get_library_songs, get_library_artists, and search_catalog by specifying this retrieves saved/library albums rather than catalog search or other media types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention when to prefer this over search_library for filtering, or how it relates to get_recently_played. The Args section documents parameters but does not constitute usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_artistsB
List artists in your Apple Music library.
Args: limit: Number of artists to return, 1ā100 (default 25). offset: Pagination offset (default 0).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds valuable behavioral context by documenting pagination constraints (limit 1ā100) and offset semantics in the Args section. However, it omits sorting order, whether results include only favorited artists or all library artists, and any rate limiting considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear single-sentence purpose followed by an Args docstring. No redundant filler. The information density is appropriate for the tool's complexity, though the 'Args:' header is slightly formal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple read tool with an output schema available, but gaps remain given zero annotations. It lacks disclosure on authentication requirements, sorting behavior, or the specific relationship between 'library artists' and catalog artists. Sufficient but not generous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Excellent compensation for 0% schema description coverage. The Args section adds specific constraints (1ā100 range), semantic meaning ('Number of artists', 'Pagination offset'), and default values that the bare schema lacks. Both parameters are fully documented in text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('List') and resource ('artists in your Apple Music library') scopes the operation specifically to the user's personal library. While it implicitly distinguishes from siblings like get_library_albums by specifying 'artists', it does not explicitly differentiate from search_library (search vs. enumeration) or other alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives like search_library (for searching) or get_library_songs (for individual tracks). No prerequisites (e.g., authentication requirements) or exclusion criteria are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_playlistsB
List all playlists in your Apple Music library.
Args: limit: Maximum number of playlists to return, 1ā100 (default 100).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While it identifies the scope as 'Apple Music library', it lacks crucial context: authentication requirements, whether results include collaborative/subscribed playlists, pagination behavior beyond the limit parameter, or rate limiting details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficiently structured with the core purpose front-loaded in the first sentence, followed by a concise Args section. No filler text; every line serves a specific informational purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple retrieval tool with output schema present. The single parameter is well-documented, but the description misses behavioral context and usage guidance expected when no annotations are present to carry that load.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Excellent compensation for 0% schema description coverage. The Args section fully documents the 'limit' parameter with its purpose (maximum to return), valid range (1ā100), and default value (100), adding substantial semantic value missing from the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb (List), resource (playlists), and scope (Apple Music library) clearly. However, it does not explicitly distinguish from sibling 'get_playlist_tracks' (which retrieves contents) or clarify when to use this versus 'search_library'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives like 'search_library' or 'get_playlist_tracks'. No prerequisites, pagination strategy (offset/cursor), or error handling guidance is mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_songsA
List songs saved in your Apple Music library.
Args: limit: Number of songs to return, 1ā100 (default 25). offset: Pagination offset for retrieving subsequent pages (default 0).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Explains the pagination mechanism (offset for subsequent pages) and default values, but omits read-only nature, rate limits, failure behaviors, or output format details (though output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient two-part structure: single declarative sentence for purpose, followed by concise Args documentation. No redundant text or unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Appropriate for a simple read operation with 2 optional parameters. Output schema exists to document return values. Minor gap: doesn't explicitly confirm read-only status or mention total result set availability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage (only titles and types). The Args section fully compensates by documenting semantics, valid ranges (1ā100), default values (25, 0), and purpose (pagination) for both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb (List) and specific resource (songs in Apple Music library). Implicitly distinguishes from siblings by specifying 'songs' versus albums/artists/playlists and 'library' versus catalog/recommendations, though it lacks explicit comparative guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to prefer this over search_library, get_recently_played, or get_playlist_tracks. No mention of pagination strategy or maximum result limits beyond the parameter range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playlist_tracksA
Get the tracks inside a playlist: one of the user's own playlists, or an Apple Music catalog playlist (editorial, themed, curator playlists).
Apple Music returns at most 100 tracks per request. Use offset to page
through a large playlist, or set fetch_all=True to automatically fetch
every page (up to max_tracks).
Args: playlist_id: Library playlist ID (starts with 'p.', from get_library_playlists) or catalog playlist ID (starts with 'pl.', from search_catalog or get_recommendations). limit: Maximum tracks to return for a single page, 1ā100 (default 100). Ignored when fetch_all is True (always uses page size 100). offset: Pagination offset for single-page requests (default 0). Ignored when fetch_all is True. fetch_all: If True, follow pagination and return every track in the playlist (up to max_tracks). Default False. max_tracks: Safety cap when fetch_all is True, 1ā5000 (default 2000).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| fetch_all | No | ||
| max_tracks | No | ||
| playlist_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does it well: it discloses Apple Music's 100-track-per-request ceiling, the paging semantics, the default page size, and the max_tracks cap that bounds fetch_all. It does not mention auth requirements, rate limiting, or error behavior for invalid IDs, which keeps it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded summary followed by a structured Args block, with no wasted preamble. Minor redundancy: the 'ignored when fetch_all is True' rule is repeated for both limit and offset, and the paging constraint is stated twice (prose and args).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers both playlist sources, pagination in both modes, defaults, hard limits, and parameter interactions; since an output schema exists, return-value shape need not be described. An agent has everything required to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the five parameters gets a meaning, accepted range, default, and in several cases an interaction rule ('Ignored when fetch_all is True'). The playlist_id prefixes are explained with the sibling tool each comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Get the tracks inside a playlist') and immediately narrows scope to two distinct playlist classes (library 'p.' vs catalog 'pl.'), which an agent cannot infer from the name alone. It also names the sibling tools that produce each ID type, tying the tool into the surrounding toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the two usage modes: single-page requests via offset/limit versus automatic full retrieval via fetch_all, including the max_tracks safety cap. It stops short of saying when to prefer this over alternatives like search_library or get_library_songs, but the mode selection guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recently_playedA
Get your recently played albums, playlists, and stations.
Note: Apple Music API returns recently-played containers (albums, playlists, stations) rather than individual tracks.
Args: limit: Number of items to return, 1ā10 (default 10). The /me/recent/played endpoint rejects anything above 10.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose a real behavioral constraint: the endpoint rejects limits above 10 and defaults to 10. The note that Apple Music returns containers rather than tracks is genuinely useful context for interpreting results. It stops short of mentioning auth/user-token requirements or ordering of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose, and the constraint note follows logically. The default value is stated twice (in prose and again in the args block), a minor redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes need not be explained, and the container-versus-track note adds the one behavioral wrinkle an agent would otherwise get wrong. For a single read-only parameter tool, this is essentially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it gives the valid range (1ā10), the default (10), and the reason for the cap (the endpoint rejects anything above 10). Nothing about the single parameter is left ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and a well-defined resource ('recently played albums, playlists, and stations'), which is inherently distinct from the library-oriented siblings (get_library_albums, get_library_songs). It does not explicitly name an alternative or scope boundary, but the qualifier 'recently played' does the disambiguating work on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is for playback history rather than library contents. There is no explicit statement of when to prefer this over get_library_* or search_catalog, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsA
Get personalised Apple Music recommendations.
Args: limit: Number of recommendation groups to return, 1ā10 (default 5).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It adds 'personalised' (indicating user-specific/history-based behavior) and 'recommendation groups' (indicating the return structure). However, it omits authentication requirements, rate limits, or caching behavior for the Apple Music API.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely efficient at two sentences. The first states purpose; the second documents the parameter. Every element earns its place, though the 'Args:' formatting is slightly informal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Appropriate for the tool's low complexity (one optional parameter) and presence of output schema. The description successfully bridges the schema coverage gap. Could be improved by noting the personalization/auth prerequisite, but sufficient for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Excellent compensation for 0% schema coverage. The Args section explicitly documents 'limit' as 'Number of recommendation groups to return', providing semantic meaning (groups vs tracks), valid range (1ā10), and default value (5) that the schema completely lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb 'Get' and resource 'personalised Apple Music recommendations', clarifying the tool fetches discovery content. However, it lacks explicit differentiation from siblings like 'search_catalog' or 'get_library_songs' to help the agent choose between discovery methods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidelines provided for when to use this tool versus alternatives. The agent cannot determine whether to use recommendations, search, or library retrieval for music discovery without external reasoning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_song_favorite_statusB
Check which catalog songs are marked as favorite.
Args: song_ids: Comma-separated catalog song IDs (e.g. "1276760751,123").
| Name | Required | Description | Default |
|---|---|---|---|
| song_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full disclosure burden. The word "Check" implies a read, but nothing is said about batch size limits, behavior for unknown or non-catalog song IDs, or whether favorites are scoped to the authenticated user. These are material gaps for a lookup tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by only the parameter format detail that the schema omits. The Python-docstring "Args:" framing is slightly verbose but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single-parameter surface is largely covered. Still, an agent cannot tell from this definition how large a batch is safe to send or how unknown IDs are reported, which matters for a batched lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% ā the property is just a bare string titled "Song Ids" ā so the description must compensate, and it does: it specifies comma-separated encoding and gives a concrete example ("1276760751,123"). It stops short of stating whether catalog IDs are numeric-only or whether there is a maximum batch size.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Check which catalog songs are marked as favorite") and implies batch scope via the plural song_ids. It is clearly distinguishable from the mutation siblings favorite_song/unfavorite_song by virtue of being a read, but it never names or contrasts with them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus get_library_songs or search_catalog, and no prerequisites are given. The only usage signal is implicit in the Args block, which shows the batching contract but not the decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogA
Search all of Apple Music (not just the user's library) for songs, albums, artists and playlists.
Use this whenever the user asks for music that may not be in their library. For moods, genres, activities or eras (e.g. "relax", "workout", "jazz anni 60") search with types="playlists" to find Apple's themed playlists, then open one with get_playlist_tracks.
Args: query: Search term (e.g. "Radiohead", "Bohemian Rhapsody", "relax"). types: Comma-separated resource types to include. Options: songs, albums, artists, playlists (default: all four). limit: Results per type, 1ā25 (default 5).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| types | No | songs,albums,artists,playlists |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the key behavioral trait: catalog-wide scope versus library scope, plus per-type result limits and defaults. It does not mention whether an Apple Music subscription is required or any rate-limit/throttling behavior, leaving a modest gap for a search against an external service.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope distinction, followed by usage strategy, then a compact Args block. Every sentence adds information the schema does not carry, so the length is earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary. Combined with the fully documented parameters and the explicit routing to get_playlist_tracks, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description fully compensates: it gives query examples, enumerates the four valid values for types with the default, and states the 1ā25 range and default of 5 for limit. Nothing needed to call the tool is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource (songs, albums, artists, playlists) and scope (all of Apple Music, not just the user's library). This immediately distinguishes it from the sibling search_library without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions ('whenever the user asks for music that may not be in their library') and a concrete strategy for mood/genre/era queries: search with types="playlists" then open results with get_playlist_tracks. It names the follow-up sibling tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_libraryA
Search only what the user has saved in their Apple Music library.
To search all of Apple Music, use search_catalog instead.
Args: query: Search term. types: Comma-separated types. Options: library-songs, library-albums, library-artists, library-playlists limit: Results per type, 1ā25 (default 10).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| types | No | library-songs,library-albums,library-artists,library-playlists |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the meaningful scoping constraint (results are restricted to the user's saved library) and caps result volume via the documented 1ā25 limit, but it says nothing about auth requirements, ordering/relevance of results, or behavior on empty matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope statement and the routing alternative, then the parameter block. Every line earns its place; the types enumeration and limit range are load-bearing, not padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter search with an output schema (so return shape needn't be explained), the definition covers scope, the alternative tool, and all parameter constraints. The only minor gap is result ordering/relevance behavior, which an agent might want when choosing between library and catalog search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% ā the schema only names the properties with a bare integer default for limit and no enum for types. The description fully compensates: it gives the valid comma-separated values for types (library-songs/albums/artists/playlists) and the 1ā25 bound with default 10 for limit, none of which appear in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus a precisely bounded resource (only content saved in the user's Apple Music library) and immediately contrasts it with search_catalog. An agent can distinguish this from the sibling catalog search without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: 'To search all of Apple Music, use search_catalog instead.' This is exactly the when-not-to-use guidance that differentiates the two search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfavorite_songA
Remove a catalog song from favorites (clears its rating).
Args: song_id: Catalog song ID.
| Name | Required | Description | Default |
|---|---|---|---|
| song_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses that this is a mutation and that it clears the song's rating, but it does not mention idempotency, permissions, or what happens if the song is not currently favorited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence followed by one argument line. Every part is relevant and there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so return values need not be described. However, without annotations, the description should do more to cover mutation semantics and usage context; the rating-clearing side effect is helpful but not enough for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully document the single parameter. It only says 'song_id: Catalog song ID,' which identifies the domain but does not explain the expected format or how to obtain a valid catalog song ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: removing a catalog song from favorites. It also states the notable side effect that the song's rating is cleared, which makes its purpose distinct from favorite_song and get_song_favorite_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied clearly by 'Remove a catalog song from favorites,' but the description gives no explicit when-to-use guidance, prerequisites, or alternatives such as favorite_song or get_song_favorite_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.3.0- Added
add_to_library - Added
favorite_song - Changed
get_playlist_tracks3 fields changed- added
Input schema / properties / fetch_allAdded value: +{ + "default": false, + "title": "Fetch All", + "type": "boolean" +} - added
Input schema / properties / max_tracksAdded value: +{ + "default": 2000, + "title": "Max Tracks", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "title": "Offset", + "type": "integer" +}
- Added
get_song_favorite_status - Changed
search_catalog1 field changed- changed
Input schema / properties / types / defaultPrevious value: -"songs,albums,artists"New value: +"songs,albums,artists,playlists"
- Added
unfavorite_song
11 tool updates
v0.1.0- First observed
add_tracks_to_playlist - First observed
create_playlist - First observed
get_library_albums - First observed
get_library_artists - First observed
get_library_playlists - First observed
get_library_songs - First observed
get_playlist_tracks - First observed
get_recently_played - First observed
get_recommendations - First observed
search_catalog - First observed
search_library
TDQS
Scored across 15 tools
Catalog vs library search is explicitly distinguished, and most tools target clearly distinct resources (playlists, favorites, recommendations, recently played). Minor overlap remains between get_library_songs and search_library with types=library-songs, and the three "add" tools (add_to_library, add_tracks_to_playlist, favorite_song) require reading descriptions to separate.
All names are snake_case and verb-first (search_, get_, add_, create_, favorite_/unfavorite_), with predictable prefixes (get_library_* for library listings, get_playlist_tracks for contents). The pattern is uniform across all 15 tools.
15 tools sits comfortably in the well-scoped range for a music service covering catalog, library, playlists, favorites and recommendations. The four get_library_* tools are slightly repetitive but each maps to a distinct resource type.
Read/create paths are well covered, but destructive and detail operations are absent: no remove_tracks_from_playlist, delete_playlist, remove_from_library, and no way to list the tracks of a saved library album (only playlist tracks). These gaps create dead ends for common library-management workflows.
Maintenance
Related MCP Connectors
Run Apple Search Ads from Claude: performance, recommendations, keywords, budgets, launches.
Search, read, create and edit your Memol notes from Claude. Team note-taking with AI search.
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Search and ask the podcasts you follow inside Claude, with the exact quote and timestamp.
Related MCP Servers
- FlicenseDqualityDmaintenanceEnables Claude to interact with Spotify by searching songs, creating playlists, getting recommendations, and managing your music through your Spotify account.73-
- AlicenseNot gradedqualityNot gradedmaintenanceConnects Claude to Spotify for music discovery, playlist creation, and collection analysis through natural language. Enables searching songs, analyzing music diversity, creating playlists, and getting recommendations using Spotify's API.-
- AlicenseAqualityDmaintenanceIntegrates Spotify with Claude to enable voice-controlled music playback, playlist management, and personalized recommendations through conversational AI. It provides comprehensive tools for searching tracks, managing liked songs, and analyzing listening habits.151MIT
- AlicenseNot gradedqualityDmaintenanceConnects Claude Code to Apple Music using only your Apple ID, without needing a developer account. Enables access to recently played, playlists, search, recommendations, and playlist creation.12 npmMIT