MCP server for Apple Music — cross-platform library, playlists, and playback; no Apple Developer account required
Apple Music MCP shows competent tool coverage (42 tools) with consistent naming patterns (verb_noun structure: get_, create_, add_, remove_, delete_, set_, play, pause, etc.). Most tools have descriptions and parameter types visible in schema declarations. However, significant gaps exist: (1) Output schemas are not documented, we cannot see what these tools return, only what they accept; (2) Parameter descriptions are present but many are generic or lack detail about format/constraints; (3) No evidence of error handling patterns or recovery guidance; (4) Some tools lack clear composition, duplicate functionality (search_library vs search_library_applescript, get_playlists_applescript vs get_library_playlists) without clear distinction; (5) Many AppleScript-dependent tools (26+ tools) are platform-gated but lack clear documentation of platform requirements in descriptions; (6) Security concern: no visible evidence of secret injection for API tokens, auth appears to be handled at server init, but tool descriptions don't clarify. Baseline: production A+ tools average 194 chars for descriptions; many here are 50-100 chars, providing minimal context. Schema completeness: input schemas are present for all tools, but output schemas (critical for LLM planning) are completely absent from visible code.
Add songs, albums, or playlists to the user's library
Add songs to a playlist
Check authentication status and connection to Apple Music API
Create a new playlist in the user's library
Delete a playlist from the user's library (AppleScript on macOS only)
Get available AirPlay devices (AppleScript on macOS only)
Get all tracks in an album (library or catalog)
Output schemas completely undocumented. No visible specification of what fields any tool returns. LLMs cannot predict response structure or plan downstream tool chains. Pattern baseline: 100% of A+ tools have documented return types.
Duplicate/overlapping tool names without clear distinction. 'get_library_playlists' vs 'get_playlists_applescript', 'search_library' vs 'search_library_applescript', 'get_playlist_tracks' vs 'get_playlist_tracks_applescript'. LLMs conflate similar names. Pattern baseline: overlapping names significantly increase tool selection errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Get detailed information about a specific artist
Get top songs for a specific artist
Get current Apple Music charts
Get information about the currently playing track (AppleScript on macOS only)
Get songs in heavy rotation
Get all albums from the user's library
Get all artists from the user's library
Get all playlists from the user's library
Get all songs from the user's library
Get statistics about the Music.app library (AppleScript on macOS only)
Get the current playback state (AppleScript on macOS only)
Get all tracks in a specific playlist
Get tracks in a playlist from Music.app (AppleScript on macOS only)
Get all playlists from Music.app (AppleScript on macOS only)
Get recently added songs to the library
Get recently played songs
Get personalized recommendations
Get the current repeat mode (AppleScript on macOS only)
Get the current shuffle state (AppleScript on macOS only)
Get artists similar to a specified artist
Get detailed information about a specific song
Get the current playback volume (AppleScript on macOS only)
Skip to the next track (AppleScript on macOS only)
Pause playback (AppleScript on macOS only)
Play a song or playlist (AppleScript on macOS only)
Go to the previous track (AppleScript on macOS only)
Rate a song (love, dislike, or remove rating)
Remove songs, albums, or playlists from the user's library
Remove songs from a playlist
Search the Apple Music catalog for songs, albums, artists, videos, etc.
Search the user's library for songs, albums, artists, or playlists
Search the local library with AppleScript (macOS only)
Set repeat mode (AppleScript on macOS only)
Enable or disable shuffle mode (AppleScript on macOS only)
Set playback volume (AppleScript on macOS only)
Platform gating not clearly documented in tool descriptions. 26+ tools are AppleScript-only (macOS) but descriptions do not state '(macOS only)' upfront. LLMs may attempt these tools on non-macOS systems causing failures. Descriptions should clearly indicate platform constraints.
Generic getter descriptions lack context. 'Get the current playback volume', 'Get the current repeat mode', 'Get available AirPlay devices' tell LLM WHAT but not WHEN to use or what happens next. Baseline: production descriptions average 194 chars; these are ~50-65 chars. Include: when to call, what to do with result, any dependencies.
No visible error handling patterns or recovery guidance. No indication of what errors tools can raise, whether they're retryable, or what the agent should do if they fail. Pattern baseline: 100% of A+ tools include recovery guidance in descriptions.
Destructive operations (remove_from_library, remove_from_playlist, delete_playlist, rate_song dislike) lack confirmation/dry-run guidance. No tool accepts a --dry-run or --confirm parameter. Pattern: irreversible operations should support confirmation to prevent accidental data loss.
Identifiers are not consistently normalized. Many tools accept 'song name', 'album name', 'artist name', 'playlist name' but also 'catalog ID', 'library ID', 'API ID starting with p.', 'persistent ID'. This flexibility is good (matches chat data model), but descriptions don't explain priority/precedence: does passing both a name and an ID cause conflict? Which is tried first?
No pagination/limit enforcement visible. Tools like 'get_library_songs', 'get_library_albums', 'search_catalog' accept limit parameters but no maximum is specified. LLMs could pass limit=999999 causing context exhaustion. Baseline: tools should cap results 20-50 and enforce that cap.
Parameter descriptions don't clarify format/constraints. E.g., 'rating' in rate_song says '(love, dislike, remove)' but should specify it's an enum. 'chart_type' and 'genre' in get_charts lack enum constraints. Descriptions should include: format, range, valid values, and what happens on invalid input.
Composition issue: 'play' tool accepts a generic 'target' (song/playlist/album/artist name) but no indication of what it returns, whether playback state is verified, or how to know if playback actually started. Response should confirm current_track, playback_state, timestamp.