diff --git a/skills/spotify/scripts/run_spotify_mcp.py b/skills/spotify/scripts/run_spotify_mcp.py index 3e5f238..6859569 100755 --- a/skills/spotify/scripts/run_spotify_mcp.py +++ b/skills/spotify/scripts/run_spotify_mcp.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 """ Spotify MCP Server Launcher for OpenClaw. -Ensures credentials.json is configured from SPOTIFY_REFRESH_TOKEN, then executes uvx mcp-server-spotify. +Ensures credentials.json is configured from SPOTIFY_REFRESH_TOKEN in a writable HOME, +pins mcp<2 to avoid FastMCP renaming breakage in mcp 2.x, then executes uvx mcp-server-spotify. """ import json @@ -10,12 +11,30 @@ import sys from pathlib import Path +def get_writable_home() -> Path: + candidates = [ + Path("/home/node/.openclaw/spotify-home"), + Path("/tmp/spotify-home"), + ] + for p in candidates: + try: + p.mkdir(parents=True, exist_ok=True) + test_file = p / ".write_test" + test_file.write_text("ok") + test_file.unlink() + return p + except Exception: + continue + return Path("/tmp") + + def main(): refresh_token = os.environ.get("SPOTIFY_REFRESH_TOKEN") - client_id = os.environ.get("SPOTIFY_CLIENT_ID") - client_secret = os.environ.get("SPOTIFY_CLIENT_SECRET") - creds_dir = Path.home() / ".spotify-mcp" + spotify_home = get_writable_home() + os.environ["HOME"] = str(spotify_home) + + creds_dir = spotify_home / ".spotify-mcp" creds_file = creds_dir / "credentials.json" if refresh_token: @@ -34,8 +53,8 @@ def main(): except Exception as e: print(f"[run_spotify_mcp] Warning: Could not write credentials file: {e}", file=sys.stderr) - # Launch mcp-server-spotify via uvx - os.execvp("uvx", ["uvx", "mcp-server-spotify"]) + # Launch mcp-server-spotify via uvx with pinned mcp<2 + os.execvp("uvx", ["uvx", "--with", "mcp<2", "mcp-server-spotify"]) if __name__ == "__main__":