spotify-mcp-web 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spotify_mcp_web-1.0.0/.env.sample +11 -0
- spotify_mcp_web-1.0.0/.gitignore +61 -0
- spotify_mcp_web-1.0.0/LICENSE.md +21 -0
- spotify_mcp_web-1.0.0/PKG-INFO +150 -0
- spotify_mcp_web-1.0.0/README.md +97 -0
- spotify_mcp_web-1.0.0/pyproject.toml +55 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/__init__.py +20 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/app.py +56 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/cli.py +73 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/server.py +4116 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/templates/guide.html +2109 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/templates/index.html +5276 -0
- spotify_mcp_web-1.0.0/spotify_mcp_web/templates/tools.html +2694 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Spotify Developer API Credentials (PKCE Flow - No Secret Required!)
|
|
2
|
+
# Get your Client ID from https://developer.spotify.com/dashboard
|
|
3
|
+
SPOTIPY_CLIENT_ID=
|
|
4
|
+
SPOTIPY_REDIRECT_URI=http://127.0.0.1:8888/callback
|
|
5
|
+
|
|
6
|
+
# TMDB (The Movie Database) API Credentials
|
|
7
|
+
# Get from https://www.themoviedb.org/settings/api
|
|
8
|
+
# Provide ANY ONE (either TMDB_API_KEY or TMDB_READ_ACCESS_TOKEN):
|
|
9
|
+
TMDB_API_KEY=
|
|
10
|
+
TMDB_READ_ACCESS_TOKEN=
|
|
11
|
+
TMDB_BASE_URL=https://api.themoviedb.org/3
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Environment & Secrets
|
|
2
|
+
.env
|
|
3
|
+
.env.*
|
|
4
|
+
!.env.sample
|
|
5
|
+
**/.env
|
|
6
|
+
**/.env.*
|
|
7
|
+
!.env.sample
|
|
8
|
+
.spotipyoauthcache
|
|
9
|
+
**/.spotipyoauthcache
|
|
10
|
+
.cache
|
|
11
|
+
**/.cache
|
|
12
|
+
.cache-*
|
|
13
|
+
*.token
|
|
14
|
+
|
|
15
|
+
# Python bytecode & runtime
|
|
16
|
+
__pycache__/
|
|
17
|
+
**/__pycache__/
|
|
18
|
+
*.py[cod]
|
|
19
|
+
*$py.class
|
|
20
|
+
*.so
|
|
21
|
+
build/
|
|
22
|
+
dist/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
|
|
25
|
+
# Virtual environments
|
|
26
|
+
.venv/
|
|
27
|
+
env/
|
|
28
|
+
venv/
|
|
29
|
+
ENV/
|
|
30
|
+
|
|
31
|
+
# Testing & Coverage
|
|
32
|
+
.pytest_cache/
|
|
33
|
+
**/.pytest_cache/
|
|
34
|
+
.coverage
|
|
35
|
+
htmlcov/
|
|
36
|
+
|
|
37
|
+
# Logs & temporary files
|
|
38
|
+
*.log
|
|
39
|
+
out.txt
|
|
40
|
+
*.tmp
|
|
41
|
+
*.bak
|
|
42
|
+
|
|
43
|
+
# OS & Editor files
|
|
44
|
+
.DS_Store
|
|
45
|
+
Thumbs.db
|
|
46
|
+
Desktop.ini
|
|
47
|
+
.vscode/
|
|
48
|
+
.idea/
|
|
49
|
+
.cursor/*
|
|
50
|
+
!.cursor/rules/
|
|
51
|
+
!.cursor/rules/**
|
|
52
|
+
|
|
53
|
+
# Cloud & Deployment Infrastructure
|
|
54
|
+
terraform/
|
|
55
|
+
scripts/
|
|
56
|
+
.gcloudignore
|
|
57
|
+
Procfile
|
|
58
|
+
.github/workflows/
|
|
59
|
+
|
|
60
|
+
#PYPI
|
|
61
|
+
Pypi/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Chiru144
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: spotify-mcp-web
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Soundtrack Curator & Staging Studio — a self-hosted FastAPI web app for Spotify playlist curation, TMDB filmography, and MCP tools management.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server
|
|
6
|
+
Project-URL: Repository, https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server/issues
|
|
8
|
+
Author: Chiru144
|
|
9
|
+
License: MIT License
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2024 Chiru144
|
|
12
|
+
|
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
in the Software without restriction, including without limitation the rights
|
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
furnished to do so, subject to the following conditions:
|
|
19
|
+
|
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
copies or substantial portions of the Software.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
SOFTWARE.
|
|
30
|
+
License-File: LICENSE.md
|
|
31
|
+
Keywords: fastapi,mcp,playlist,soundtrack,spotify,studio,tmdb,web
|
|
32
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
35
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
36
|
+
Classifier: Programming Language :: Python :: 3
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
40
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
|
|
41
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
42
|
+
Requires-Python: >=3.10
|
|
43
|
+
Requires-Dist: beautifulsoup4>=4.13.0
|
|
44
|
+
Requires-Dist: ddgs>=9.0.0
|
|
45
|
+
Requires-Dist: fastapi>=0.115.0
|
|
46
|
+
Requires-Dist: pydantic>=2.0.0
|
|
47
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
48
|
+
Requires-Dist: requests>=2.32.0
|
|
49
|
+
Requires-Dist: spotify-soundtrack-mcp>=1.0.0
|
|
50
|
+
Requires-Dist: spotipy>=2.26.0
|
|
51
|
+
Requires-Dist: uvicorn>=0.30.0
|
|
52
|
+
Description-Content-Type: text/markdown
|
|
53
|
+
|
|
54
|
+
# spotify-mcp-web
|
|
55
|
+
|
|
56
|
+
[](https://pypi.org/project/spotify-mcp-web/)
|
|
57
|
+
[](https://pypi.org/project/spotify-mcp-web/)
|
|
58
|
+
[](LICENSE.md)
|
|
59
|
+
|
|
60
|
+
> **Soundtrack Curator & Staging Studio** — a self-hosted FastAPI web application for Spotify playlist curation, TMDB filmography browsing, and MCP tools management. Pairs with [spotify-soundtrack-mcp](https://pypi.org/project/spotify-soundtrack-mcp/).
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Installation
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install spotify-mcp-web
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Quick Start
|
|
73
|
+
|
|
74
|
+
### 1. Configure credentials
|
|
75
|
+
|
|
76
|
+
Create a `.env` file in your working directory:
|
|
77
|
+
|
|
78
|
+
```env
|
|
79
|
+
# Spotify Developer App credentials (PKCE — no secret needed!)
|
|
80
|
+
SPOTIPY_CLIENT_ID=your_spotify_client_id_here
|
|
81
|
+
SPOTIPY_REDIRECT_URI=http://127.0.0.1:8888/callback
|
|
82
|
+
|
|
83
|
+
# TMDB (optional, enables cinema/filmography features)
|
|
84
|
+
TMDB_API_KEY=your_tmdb_api_key_here
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
> **Important:** In your [Spotify Developer Dashboard](https://developer.spotify.com/dashboard), add `http://127.0.0.1:8888/callback` as a Redirect URI.
|
|
88
|
+
|
|
89
|
+
### 2. Start the Studio
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
soundtrack-studio
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This starts the web app at **http://127.0.0.1:8000** and opens it in your browser automatically.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Features
|
|
100
|
+
|
|
101
|
+
- 🎬 **Cinema Filmography** — Search actors/movies via TMDB and build soundtracks automatically
|
|
102
|
+
- 🎵 **Playlist Curation** — Create, merge, deduplicate, sort, split, and export Spotify playlists
|
|
103
|
+
- 🎚️ **Playback Controls** — Control Spotify Connect devices, queue management, volume/shuffle/repeat
|
|
104
|
+
- 📊 **Taste Analytics** — Top tracks, artists, listening patterns, playlist comparisons
|
|
105
|
+
- 📚 **Library Management** — Saved tracks & albums, library browsing
|
|
106
|
+
- 🔍 **Catalog Browsing** — Artist, album, and track lookup
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Environment Variables
|
|
111
|
+
|
|
112
|
+
| Variable | Required | Description |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `SPOTIPY_CLIENT_ID` | ✅ | Spotify app Client ID |
|
|
115
|
+
| `SPOTIPY_REDIRECT_URI` | ✅ | Must match Spotify dashboard (default: `http://127.0.0.1:8888/callback`) |
|
|
116
|
+
| `TMDB_API_KEY` | Optional | TMDB v3 API key |
|
|
117
|
+
| `TMDB_READ_ACCESS_TOKEN` | Optional | TMDB v4 Bearer token (alternative to API key) |
|
|
118
|
+
| `HOST` | Optional | Bind host (default `127.0.0.1`) |
|
|
119
|
+
| `PORT` | Optional | Bind port (default `8000`) |
|
|
120
|
+
| `OPEN_BROWSER` | Optional | Set to `false` to suppress auto-open |
|
|
121
|
+
| `SOUNDTRACK_TEMPLATES_DIR` | Optional | Custom path to HTML templates directory |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Running as a Remote Server
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
HOST=0.0.0.0 PORT=8080 OPEN_BROWSER=false soundtrack-studio
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Pairing with the MCP Agent
|
|
134
|
+
|
|
135
|
+
Install both packages to get the full experience:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
pip install spotify-soundtrack-mcp spotify-mcp-web
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- `spotify-mcp` — starts the agent (for Claude Desktop / Cursor)
|
|
142
|
+
- `soundtrack-studio` — starts the web UI
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Links
|
|
147
|
+
|
|
148
|
+
- [GitHub Repository](https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server)
|
|
149
|
+
- [MCP Agent Package (spotify-soundtrack-mcp)](https://pypi.org/project/spotify-soundtrack-mcp/)
|
|
150
|
+
- [Report Issues](https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server/issues)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# spotify-mcp-web
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/spotify-mcp-web/)
|
|
4
|
+
[](https://pypi.org/project/spotify-mcp-web/)
|
|
5
|
+
[](LICENSE.md)
|
|
6
|
+
|
|
7
|
+
> **Soundtrack Curator & Staging Studio** — a self-hosted FastAPI web application for Spotify playlist curation, TMDB filmography browsing, and MCP tools management. Pairs with [spotify-soundtrack-mcp](https://pypi.org/project/spotify-soundtrack-mcp/).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install spotify-mcp-web
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### 1. Configure credentials
|
|
22
|
+
|
|
23
|
+
Create a `.env` file in your working directory:
|
|
24
|
+
|
|
25
|
+
```env
|
|
26
|
+
# Spotify Developer App credentials (PKCE — no secret needed!)
|
|
27
|
+
SPOTIPY_CLIENT_ID=your_spotify_client_id_here
|
|
28
|
+
SPOTIPY_REDIRECT_URI=http://127.0.0.1:8888/callback
|
|
29
|
+
|
|
30
|
+
# TMDB (optional, enables cinema/filmography features)
|
|
31
|
+
TMDB_API_KEY=your_tmdb_api_key_here
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> **Important:** In your [Spotify Developer Dashboard](https://developer.spotify.com/dashboard), add `http://127.0.0.1:8888/callback` as a Redirect URI.
|
|
35
|
+
|
|
36
|
+
### 2. Start the Studio
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
soundtrack-studio
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This starts the web app at **http://127.0.0.1:8000** and opens it in your browser automatically.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
- 🎬 **Cinema Filmography** — Search actors/movies via TMDB and build soundtracks automatically
|
|
49
|
+
- 🎵 **Playlist Curation** — Create, merge, deduplicate, sort, split, and export Spotify playlists
|
|
50
|
+
- 🎚️ **Playback Controls** — Control Spotify Connect devices, queue management, volume/shuffle/repeat
|
|
51
|
+
- 📊 **Taste Analytics** — Top tracks, artists, listening patterns, playlist comparisons
|
|
52
|
+
- 📚 **Library Management** — Saved tracks & albums, library browsing
|
|
53
|
+
- 🔍 **Catalog Browsing** — Artist, album, and track lookup
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Environment Variables
|
|
58
|
+
|
|
59
|
+
| Variable | Required | Description |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `SPOTIPY_CLIENT_ID` | ✅ | Spotify app Client ID |
|
|
62
|
+
| `SPOTIPY_REDIRECT_URI` | ✅ | Must match Spotify dashboard (default: `http://127.0.0.1:8888/callback`) |
|
|
63
|
+
| `TMDB_API_KEY` | Optional | TMDB v3 API key |
|
|
64
|
+
| `TMDB_READ_ACCESS_TOKEN` | Optional | TMDB v4 Bearer token (alternative to API key) |
|
|
65
|
+
| `HOST` | Optional | Bind host (default `127.0.0.1`) |
|
|
66
|
+
| `PORT` | Optional | Bind port (default `8000`) |
|
|
67
|
+
| `OPEN_BROWSER` | Optional | Set to `false` to suppress auto-open |
|
|
68
|
+
| `SOUNDTRACK_TEMPLATES_DIR` | Optional | Custom path to HTML templates directory |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Running as a Remote Server
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
HOST=0.0.0.0 PORT=8080 OPEN_BROWSER=false soundtrack-studio
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Pairing with the MCP Agent
|
|
81
|
+
|
|
82
|
+
Install both packages to get the full experience:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install spotify-soundtrack-mcp spotify-mcp-web
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- `spotify-mcp` — starts the agent (for Claude Desktop / Cursor)
|
|
89
|
+
- `soundtrack-studio` — starts the web UI
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Links
|
|
94
|
+
|
|
95
|
+
- [GitHub Repository](https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server)
|
|
96
|
+
- [MCP Agent Package (spotify-soundtrack-mcp)](https://pypi.org/project/spotify-soundtrack-mcp/)
|
|
97
|
+
- [Report Issues](https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server/issues)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "spotify-mcp-web"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Soundtrack Curator & Staging Studio — a self-hosted FastAPI web app for Spotify playlist curation, TMDB filmography, and MCP tools management."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { file = "LICENSE.md" }
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [{ name = "Chiru144" }]
|
|
13
|
+
keywords = ["spotify", "fastapi", "soundtrack", "tmdb", "playlist", "web", "mcp", "studio"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 5 - Production/Stable",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Intended Audience :: End Users/Desktop",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.10",
|
|
21
|
+
"Programming Language :: Python :: 3.11",
|
|
22
|
+
"Programming Language :: Python :: 3.12",
|
|
23
|
+
"Topic :: Multimedia :: Sound/Audio",
|
|
24
|
+
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
|
|
25
|
+
]
|
|
26
|
+
dependencies = [
|
|
27
|
+
"fastapi>=0.115.0",
|
|
28
|
+
"uvicorn>=0.30.0",
|
|
29
|
+
"spotipy>=2.26.0",
|
|
30
|
+
"python-dotenv>=1.0.0",
|
|
31
|
+
"requests>=2.32.0",
|
|
32
|
+
"beautifulsoup4>=4.13.0",
|
|
33
|
+
"ddgs>=9.0.0",
|
|
34
|
+
"pydantic>=2.0.0",
|
|
35
|
+
"spotify-soundtrack-mcp>=1.0.0",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.urls]
|
|
39
|
+
Homepage = "https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server"
|
|
40
|
+
Repository = "https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server"
|
|
41
|
+
"Bug Tracker" = "https://github.com/Chiru144/Spotify-MCP-Web-MCP-Server/issues"
|
|
42
|
+
|
|
43
|
+
[project.scripts]
|
|
44
|
+
soundtrack-studio = "spotify_mcp_web.cli:run"
|
|
45
|
+
|
|
46
|
+
[tool.hatch.build.targets.wheel]
|
|
47
|
+
packages = ["spotify_mcp_web"]
|
|
48
|
+
|
|
49
|
+
[tool.hatch.build.targets.sdist]
|
|
50
|
+
include = [
|
|
51
|
+
"spotify_mcp_web/",
|
|
52
|
+
"README.md",
|
|
53
|
+
"LICENSE.md",
|
|
54
|
+
".env.sample",
|
|
55
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
spotify-mcp-web
|
|
3
|
+
===============
|
|
4
|
+
Soundtrack Curator & Staging Studio — self-hosted FastAPI web app.
|
|
5
|
+
|
|
6
|
+
Quick start::
|
|
7
|
+
|
|
8
|
+
pip install spotify-mcp-web
|
|
9
|
+
soundtrack-studio
|
|
10
|
+
# → Opens http://127.0.0.1:8000 in your browser
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from importlib.metadata import version, PackageNotFoundError
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
__version__ = version("spotify-mcp-web")
|
|
17
|
+
except PackageNotFoundError:
|
|
18
|
+
__version__ = "0.0.0"
|
|
19
|
+
|
|
20
|
+
__all__ = ["__version__"]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
app.py — FastAPI application factory for the Soundtrack Studio.
|
|
3
|
+
|
|
4
|
+
This module wraps the existing mcp-soundtrack-app/server.py logic,
|
|
5
|
+
resolving template paths relative to the installed package rather than
|
|
6
|
+
the source tree.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
# ---------------------------------------------------------------------------
|
|
14
|
+
# Resolve template directory: prefer the package-bundled templates,
|
|
15
|
+
# then fall back to a user-provided path via env var.
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
_PKG_DIR = Path(__file__).parent
|
|
18
|
+
_TEMPLATES_DIR = _PKG_DIR / "templates"
|
|
19
|
+
|
|
20
|
+
if not _TEMPLATES_DIR.exists():
|
|
21
|
+
# Allow overriding with SOUNDTRACK_TEMPLATES_DIR env var
|
|
22
|
+
_env_dir = os.getenv("SOUNDTRACK_TEMPLATES_DIR")
|
|
23
|
+
if _env_dir:
|
|
24
|
+
_TEMPLATES_DIR = Path(_env_dir)
|
|
25
|
+
else:
|
|
26
|
+
raise RuntimeError(
|
|
27
|
+
f"[spotify-mcp-web] Templates directory not found at {_TEMPLATES_DIR}.\n"
|
|
28
|
+
"Reinstall the package or set SOUNDTRACK_TEMPLATES_DIR to your templates folder."
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Make the templates path available to the server module
|
|
32
|
+
os.environ.setdefault("SOUNDTRACK_TEMPLATES_DIR", str(_TEMPLATES_DIR))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def create_app():
|
|
36
|
+
"""
|
|
37
|
+
Create and return the Soundtrack Curator & Staging Studio FastAPI application.
|
|
38
|
+
|
|
39
|
+
The app is loaded from the bundled server module. Template paths are
|
|
40
|
+
resolved relative to this installed package.
|
|
41
|
+
"""
|
|
42
|
+
import importlib.util
|
|
43
|
+
|
|
44
|
+
server_path = _PKG_DIR / "server.py"
|
|
45
|
+
spec = importlib.util.spec_from_file_location("spotify_mcp_web_server", server_path)
|
|
46
|
+
if not spec or not spec.loader:
|
|
47
|
+
raise RuntimeError(f"[spotify-mcp-web] Could not load server module from {server_path}")
|
|
48
|
+
|
|
49
|
+
module = importlib.util.module_from_spec(spec)
|
|
50
|
+
spec.loader.exec_module(module)
|
|
51
|
+
|
|
52
|
+
app = getattr(module, "app", None)
|
|
53
|
+
if app is None:
|
|
54
|
+
raise RuntimeError("[spotify-mcp-web] 'app' not found in bundled server module.")
|
|
55
|
+
|
|
56
|
+
return app
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
cli.py — Entry point for the spotify-mcp-web package.
|
|
3
|
+
|
|
4
|
+
Console script: `soundtrack-studio`
|
|
5
|
+
Launches the Soundtrack Curator & Staging Studio FastAPI app with Uvicorn.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
import webbrowser
|
|
11
|
+
import threading
|
|
12
|
+
import time
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _setup_env():
|
|
17
|
+
"""Load .env from cwd or home config dir."""
|
|
18
|
+
from dotenv import load_dotenv
|
|
19
|
+
|
|
20
|
+
cwd_env = Path.cwd() / ".env"
|
|
21
|
+
home_env = Path.home() / ".spotify-mcp" / ".env"
|
|
22
|
+
|
|
23
|
+
if cwd_env.exists():
|
|
24
|
+
load_dotenv(dotenv_path=cwd_env)
|
|
25
|
+
elif home_env.exists():
|
|
26
|
+
load_dotenv(dotenv_path=home_env)
|
|
27
|
+
else:
|
|
28
|
+
load_dotenv()
|
|
29
|
+
|
|
30
|
+
client_id = os.getenv("SPOTIPY_CLIENT_ID") or os.getenv("SPOTIFY_CLIENT_ID")
|
|
31
|
+
if not client_id:
|
|
32
|
+
print(
|
|
33
|
+
"\n[soundtrack-studio] ⚠️ No SPOTIPY_CLIENT_ID found.\n"
|
|
34
|
+
"Create a .env file in your working directory:\n\n"
|
|
35
|
+
" SPOTIPY_CLIENT_ID=your_client_id_here\n"
|
|
36
|
+
" SPOTIPY_REDIRECT_URI=http://127.0.0.1:8888/callback\n\n"
|
|
37
|
+
"Get yours at https://developer.spotify.com/dashboard\n",
|
|
38
|
+
file=sys.stderr,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def run():
|
|
43
|
+
"""
|
|
44
|
+
Console script: `soundtrack-studio`
|
|
45
|
+
|
|
46
|
+
Starts the Soundtrack Curator & Staging Studio web application on
|
|
47
|
+
http://127.0.0.1:8000 (or the port specified by the PORT env var)
|
|
48
|
+
and opens it in your default browser.
|
|
49
|
+
"""
|
|
50
|
+
_setup_env()
|
|
51
|
+
|
|
52
|
+
import uvicorn
|
|
53
|
+
from spotify_mcp_web.app import create_app
|
|
54
|
+
|
|
55
|
+
host = os.getenv("HOST", "127.0.0.1")
|
|
56
|
+
port = int(os.getenv("PORT", "8000"))
|
|
57
|
+
open_browser = os.getenv("OPEN_BROWSER", "true").strip().lower() not in ("0", "false", "no")
|
|
58
|
+
|
|
59
|
+
app = create_app()
|
|
60
|
+
|
|
61
|
+
url = f"http://{host}:{port}"
|
|
62
|
+
print(f"\n[Soundtrack Studio] Starting at {url}\n", file=sys.stderr)
|
|
63
|
+
|
|
64
|
+
if open_browser:
|
|
65
|
+
def _open():
|
|
66
|
+
time.sleep(1.2)
|
|
67
|
+
try:
|
|
68
|
+
webbrowser.open(url)
|
|
69
|
+
except Exception:
|
|
70
|
+
pass
|
|
71
|
+
threading.Thread(target=_open, daemon=True).start()
|
|
72
|
+
|
|
73
|
+
uvicorn.run(app, host=host, port=port, log_level="warning", access_log=False)
|