agent-routing
Decide which model, effort level, and cascade shape each subagent gets, and how to keep improvement loops safe…
Control Spotify playback and manage playlists via MCP server. Use when user requests playing music, controlling Spotify, creating playlists, searching songs, or managing their Spotify library.
$ npx -y skills add oaustegard/claude-skills --skill controlling-spotify --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/controlling-spotifyContext preview
The summary Claude sees to decide when to auto-load this skill.
Control Spotify playback and manage playlists via MCP server. Use when user requests playing music, controlling Spotify, creating playlists, searching songs, or managing their Spotify library.
name: controlling-spotify description: Control Spotify playback and manage playlists via MCP server. Use when user requests playing music, controlling Spotify, creating playlists, searching songs, or managing their Spotify library. credentials: - SPOTIFY_CLIENT_ID - SPOTIFY_CLIENT_SECRET - SPOTIFY_REFRESH_TOKEN domains: - api.spotify.com - accounts.spotify.com - raw.githubusercontent.com - github.com metadata: version: 0.1.0
Control Spotify playback, search for music, and manage playlists using the Spotify MCP Server with full user account access.
Invoke this skill when users request:
**CRITICAL**: This skill requires user-provided credentials. The user must complete a one-time setup:
1. **Create Spotify Developer Application**
2. **Obtain Refresh Token**
3. **Configure Credentials**
**Alternative**: Credentials can also be provided via a **Project Knowledge** file. Ensure the file contains a `.env` style block with the keys above.
**Without these credentials, the skill cannot function.** If credentials are missing, guide the user through the setup process detailed in `references/setup-guide.md`.
The Spotify MCP Server must be installed in the compute environment. Use the provided installation script which handles cloning, patching, and building the server.
# Run the installation script bash scripts/install-mcp-server.sh
Configure the MCP client to connect to the Spotify MCP server. Note the logic to support credentials from Project Knowledge.
from mcp import Client
import asyncio
import re
# 1. Try to get credentials from skill configuration
env_vars = {
"SPOTIFY_CLIENT_ID": credentials.get("SPOTIFY_CLIENT_ID"),
"SPOTIFY_CLIENT_SECRET": credentials.get("SPOTIFY_CLIENT_SECRET"),
"SPOTIFY_REFRESH_TOKEN": credentials.get("SPOTIFY_REFRESH_TOKEN")
}
# 2. If missing, look in Project Knowledge / Context for .env style block
if not all(env_vars.values()):
# Heuristic: Scan context/files for VAR=VALUE patterns
# (Pseudo-code: Implement based on available context access)
pass
# Server configuration
mcp_config = {
"command": "node",
"args": ["/home/claude/spotify-mcp-server/build/index.js"],
"env": env_vars
}
# Initialize client
async def initialize_spotify_mcp():
client = Client()
await client.connect_stdio(
mcp_config["command"],
mcp_config["args"],
mcp_config["env"]
)
return client1. **searchSpotify** - Search for tracks, albums, artists, or playlists
result = await client.call_tool("searchSpotify", {
"query": "bohemian rhapsody",
"type": "track",
"limit": 10
})2. **getNowPlaying** - Get currently playing track information
result = await client.call_tool("getNowPlaying", {})3. **getMyPlaylists** - List user's playlists
result = await client.call_tool("getMyPlaylists", {
"limit": 20,
"offset": 0
})4. **getPlaylistTracks** - Get tracks from a playlist
result = await client.call_tool("getPlaylistTracks", {
"playlistId": "37i9dQZEVXcJZyENOWUFo7"
})5. **getRecentlyPlayed** - Get recently played tracks
result = await client.call_tool("getRecentlyPlayed", {
"limit": 10
})6. **getUsersSavedTracks** - Get user's liked songs
result = await client.call_tool("getUsersSavedTracks", {
"limit": 50,
"offset": 0
})1. **playMusic** - Start playing track/album/artist/playlist
# Play by URI
result = await client.call_tool("playMusic", {
"uri": "spotify:track:6rqhFgbbKwnb9MLmUQDhG6"
})
# Or by type and ID
result = await client.call_tool("playMusic", {
"type": "track",
"id": "6rqhFgbbKwnb9MLmUQDhG6"
})2. **pausePlayback** - Pause current playback
result = await client.call_tool("pausePlayback", {})3. **skipToNext** - Skip to next track
result = await client.call_tool("skipToNext", {})4. **skipToPrevious** - Skip to previous track
result = await client.call_tool("skipToPrevious", {})5. **addToQueue** - Add track/album to playback queue
result = await client.call_tool("addToQueue", {
"uri": "spotify:track:6rqhFgbbKwnb9MLmUQDhG6"
})1. **createPlaylist** - Create new playlist
result = await client.call_tool("createPlaylist", {
"name": "My Workout Mix",
"description": "High energy tracks",
"public": False
})2. **addTracksToPlaylist** - Add tracks to existing playlist
result = await client.call_tool("addTracksToPlaylist", {
"playlistId": "3cEYpjA9oz9GiPac4AsH4n",
"trackUris": [
"spotify:track:4iV5W9uYEdYUVa79Axb7Rh",
"spA collection of Claude skills distributed as a Claude Code plugin marketplace. Skills are primarily designed for the Claude.ai PaaS skill compute environment; mileage will vary if used as Claude Code Agent Skills.
Decide which model, effort level, and cascade shape each subagent gets, and how to keep improvement loops safe…
Cross-context adversarial review for deliverables before shipping. Use when producing blog posts, technical recommendations,…
Convenes expert panels for problem-solving. Use when user mentions panel, experts, multiple perspectives, MECE, DMAIC, RAPID, Six…
Routes, triages, flags and rates a piece of text with a probability for every option: which department or queue a ticket goes to,…
Delegates work to a subagent or spawned session by writing only the task, while a PreToolUse hook pages the parent transcript…
Chooses how to launch subagents from Claude Code (the Agent tool, a Workflow script, or headless claude -p children) and runs a…