mcp-apple-music
This server gives AI assistants (like Claude) full access to your Apple Music account, enabling catalog search, personal library management, playlist control, and music discovery.
Search the Apple Music catalog — Find songs, albums, artists, or playlists from the entire Apple Music catalog by keyword.
Search your personal library — Search within your own saved songs, albums, artists, and playlists.
Browse your library — List songs, albums, and artists saved in your library (with pagination support).
List all playlists — Retrieve all your playlists along with their IDs.
View playlist tracks — Get the full track listing of any specific playlist.
Create a new playlist — Create a named playlist in your library with an optional description.
Add tracks to a playlist — Add songs (from your library or the catalog) to an existing playlist.
See recently played — View your recently played albums, playlists, and stations.
Get personalized recommendations — Fetch Apple Music's personalized recommendations tailored to your listening habits.
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 a specific playlist |
| Create a new playlist |
| Add songs to a playlist (library or catalog tracks) |
| See recently played albums/playlists/stations |
| Get personalised Apple Music picks |
Related MCP server: Spotify MCP Server
Requirements
Python 3.10+
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
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/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
# 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 11 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
11 toolsadd_tracks_to_playlistB
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 found via search_catalog.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist_id | Yes | ||
| track_ids | Yes | ||
| track_type | No | library-songs |
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 full disclosure burden. While 'Add' indicates a write operation, it lacks critical behavioral details such as duplicate handling (whether adding existing tracks creates duplicates), idempotency, or partial failure behavior.
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?
Uses an 'Args:' structure to document parameters, which is appropriate given the complete lack of schema descriptions. Information is front-loaded with the action summary, and every line provides necessary parameter constraints.
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?
Adequately documents inputs given the output schema exists, covering parameter formats and valid values. However, for a mutation tool with no annotations, it should disclose edge case behaviors (e.g., duplicate handling) to be 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?
Effectively compensates for 0% schema description coverage by adding the 'p.' format hint for playlist_id and detailed semantic explanations for track_type (distinguishing library-songs vs songs sourced from search_catalog).
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 (Add) and resource (tracks) with scope (to existing playlist). The word 'existing' implicitly distinguishes from the sibling create_playlist tool, though it does not explicitly name the alternative.
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 parameter-level guidance by referencing sibling tool search_catalog for the 'songs' track_type value. However, lacks tool-level guidance on when to use this versus create_playlist or prerequisites like playlist ownership.
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.
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 specific playlist.
Args: playlist_id: Library playlist ID (starts with 'p.'). Use get_library_playlists to find IDs. limit: Maximum tracks to return, 1–100 (default 100).
| Name | Required | Description | Default |
|---|---|---|---|
| playlist_id | Yes | ||
| 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 full disclosure burden. It provides operational constraints (limit range 1-100, default 100, ID format 'p.'), but lacks explicit safety confirmation (read-only nature), error behaviors, or pagination details for large playlists.
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 clear purpose statement followed by Args block. No redundant information; every line provides specific value. Appropriate length for tool complexity.
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 presence of output schema, simple parameter structure (2 primitives), and clear behavioral anchors, the description is complete. Prerequisites, constraints, and sibling relationships are adequately covered.
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. Provides format pattern for playlist_id ('p.'), cross-reference for ID lookup, and complete constraint documentation for limit (valid range and default), adding substantial meaning beyond the bare 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?
Description uses specific verb 'Get' with clear resource 'tracks' and scope 'inside a specific playlist'. Clearly distinguishes from sibling get_library_playlists which retrieves playlists rather than tracks within them, and from add_tracks_to_playlist which modifies.
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 clear prerequisite guidance by referencing sibling tool get_library_playlists to find valid IDs. However, lacks explicit 'when not to use' guidance compared to alternatives like get_library_songs or search_catalog.
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–50 (default 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?
No annotations are provided, so the description carries the full burden. It successfully discloses the key behavioral trait that the API returns containers rather than tracks. However, it omits the time window for 'recently', pagination behavior, and authentication requirements beyond the implied 'your'.
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 front-loaded with purpose, followed by the important behavioral Note, then parameter details. The structure is logical and appropriately sized for a single-parameter tool. The 'Args:' formatting is slightly informal but clear and wastes no space.
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 presence of an output schema, the description appropriately avoids duplicating return value structure. It covers the essential Apple Music-specific context (container behavior). Minor gap: the timeframe for 'recently' is undefined.
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?
The schema has 0% description coverage (no 'description' field on the limit property). The description fully compensates by documenting the limit parameter with its semantic meaning ('Number of items to return'), constraints ('1–50'), and default value ('default 10') in the Args section.
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 a specific verb ('Get') and resource ('recently played albums, playlists, and stations'). The Note explicitly distinguishes this from track-returning siblings like get_playlist_tracks or get_library_songs by clarifying it returns containers, satisfying sibling differentiation.
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 Note about containers vs tracks provides implied usage guidance (don't use for individual tracks), but lacks explicit when-to-use recommendations or named alternatives. It does not explicitly contrast with get_library_* tools for history vs full-library access.
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.
search_catalogA
Search the Apple Music catalog for songs, albums, artists, or playlists.
Args: query: Search term (e.g. "Radiohead", "Bohemian Rhapsody"). types: Comma-separated resource types to include. Options: songs, albums, artists, playlists (default: songs,albums,artists) limit: Results per type, 1–25 (default 5).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| types | No | songs,albums,artists | |
| limit | No |
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. It clearly states the search scope but lacks details on rate limits, authentication requirements, or pagination behavior beyond the 'limit' parameter. Defaults are documented, which provides some behavioral context.
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 uses an efficient structure: a single summary sentence followed by a structured Args section. Every line provides specific constraints, examples, or defaults. No redundant or filler text is present.
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 presence of an output schema, the description appropriately focuses on input parameters and search scope. It adequately covers the 3 parameters despite zero schema coverage. A brief note explicitly contrasting 'catalog' vs 'library' search would improve contextual completeness given the sibling tool.
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 fully compensates by documenting all three parameters: 'query' includes concrete examples (Radiohead, Bohemian Rhapsody), 'types' specifies valid options and default value, and 'limit' provides the valid range (1-25) and default.
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 provides a specific verb (Search) and resource (Apple Music catalog) with clear scope (songs, albums, artists, playlists). However, it does not explicitly distinguish from the sibling tool 'search_library', though the use of 'catalog' vs 'library' in the names provides implicit differentiation.
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 implies usage by specifying 'Apple Music catalog', suggesting public content vs personal library, but provides no explicit guidance on when to choose this over 'search_library' or other alternatives. No when-not-to-use or prerequisite information is included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_libraryA
Search within your personal Apple Music library.
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 |
|---|---|---|---|
| query | Yes | ||
| types | No | library-songs,library-albums,library-artists,library-playlists | |
| 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. It successfully documents pagination limits (1-25) and available type options, but omits critical behavioral context like authentication requirements, rate limits, or search scope (which fields are indexed).
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?
Information is efficiently organized with the purpose statement first, followed by Args documentation. The 'Args:' header format is slightly informal but every sentence earns its place; no redundant text or tautology.
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 output schema exists and parameters are documented in the description, the essentials are covered. However, for a search tool with zero annotations, the description should ideally address authentication requirements and the relationship to sibling 'get_library_*' tools (when to search vs. list).
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?
The schema has 0% description coverage (only titles). The description compensates effectively by documenting all three parameters: 'Search term' for query, comma-separated type options with the four valid values for types, and range constraints with defaults for limit.
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 'Search within your personal Apple Music library'—a specific verb-plus-resource statement that clearly distinguishes this from the sibling 'search_catalog' tool by emphasizing the personal library scope versus the public catalog.
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 phrase 'personal Apple Music library' provides implicit context for when to use this tool (vs. 'search_catalog'), but lacks explicit guidance on prerequisites (e.g., requiring Apple Music subscription/library access) or conditions when this might return empty results.
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. Dates show when Glama detected each change.
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
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.
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.
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.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search, read, create and edit your Memol notes from Claude. Team note-taking with AI search.
Your professional network in Claude — search contacts, log notes, and send warm intros.
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.-
- FlicenseAqualityDmaintenanceIntegrates 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.151-
- 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.12MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Cifero74/mcp-apple-music'
If you have feedback or need assistance with the MCP directory API, please join our Discord server