# Reported issues for Spotify MCP by NovaLux12

Pod holds 24 of 316 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [Spotify MCP by NovaLux12](/mcp/spotify-mcp-by-novalux12).

## Most discussed

### bug(episodes): mark_episode_played is a phantom tool — nonexistent endpoint, swallows 404s, reports ok:true

## Summary

`mark_episode_played` is a phantom tool: it calls an endpoint that does not exist in the Spotify Web API, swallows every failure, and reports `ok: true` — so agents believe episodes were marked played when nothing happened at all.

## Evidence

`src/tools/episodemgmt.ts` (shipped in v1.22.0, tracked as completed issue #187):

```ts
// Primary attempt: PUT /me/episodes/{id} is not documented; try POST to mark via player
for (const id of ids) {
  try {
    await client.put(`/me/episode

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/230) · 2026-08-26 · closed · 2 comments

### distribution: trusted-publishing cutover + GitHub App release tokens + Glama/metadata optimization

## Context
NpmReleaseResearch + RegistryOptimization sweeps. Maintainer decisions needed:

### npm (research recommendation)
- Migrate NPM_TOKEN secret → **npm trusted publishing** (OIDC): eliminates the long-lived secret, adds SLSA provenance automatically; requires one-time config on npmjs.com (package settings → Publishing access → GitHub Actions, repo/workflow pinning). Then remove NODE_AUTH_TOKEN and add --provenance to publish.
- Replace GITHUB_TOKEN in release.yml with an **actions/create

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/113) · 2026-08-25 · closed · 2 comments

### mcp-patterns port: resource templates, completions, scope-aware hiding, elicitation confirmations

## Context
McpPatterns survey (provenance URLs in session report). Ranked portable patterns:

1. **RFC-6570 resource templates** over single-get endpoints (spotify://artist/{id}, /show/{id}/episodes, /audiobook/{id}/chapters...) — S. ResourceExpansion report has the full template table + TTL-cache notes.
2. **Argument/resource completions** — playlist names→IDs, device names→IDs (SDK ResourceTemplate complete callbacks) — S.
3. **Scope-aware tool hiding + SPOTIFY_READONLY=1** (GitHub MCP pattern

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/111) · 2026-08-25 · closed · 2 comments

### feat: collab_mix_from_followed — exhaust2 candidate (P1)

**Domain:** Playlists/Library · **Bucket:** P1 · **Quota:** 🔴 per-artist album fan-out (disclosure; chunk 50, capped by artists_cap) · **Part of the exhaust2 feature swarm**

**Pitch:** Build a collaborative-style mix playlist from followed artists' recent releases: ≤N tracks per artist, newest first, mixed round-robin. local-compute composition.

**Endpoint(s):** GET /me/following + GET /artists/{id}/albums (chunked, conc 5) + POST

**Params:** artists_cap?, per_artist=1–5, days=30, name

Ships

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/397) · 2026-08-27 · closed · 1 comment

### feat: library_to_playlist — exhaust2 candidate (P1)

**Domain:** Playlists/Library · **Bucket:** P1 · **Quota:** 🟡 getAllPages + chunked adds · **Part of the exhaust2 feature swarm**

**Pitch:** Export saved tracks (added-asc order) into a real, shareable playlist — "my library as a link".

**Endpoint(s):** GET /me/tracks + POST /playlists + POST uris

**Params:** name?, order=added_asc/desc, limit?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint polic

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/396) · 2026-08-27 · closed · 1 comment

### feat: saved_library_delta — exhaust2 candidate (P1)

**Domain:** Playlists/Library · **Bucket:** P1 · **Quota:** 🟡 snapshot load + getAllPages · **Part of the exhaust2 feature swarm**

**Pitch:** "What changed in my library since snapshot X": new saves, un-saves, per type — reads stored backup snapshots + fresh getAllPages diff.

**Endpoint(s):** GET /me/{type} + stored snapshot

**Params:** snapshot_id or date, type=all/tracks/albums

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoint

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/395) · 2026-08-27 · closed · 1 comment

### feat: saved_tracks_by_artist — exhaust2 candidate (P1)

**Domain:** Playlists/Library · **Bucket:** P1 · **Quota:** 🟡 getAllPages + filter · **Part of the exhaust2 feature swarm**

**Pitch:** Library filter family: all saved tracks by one artist (getAllPages + client filter). The saved-shelf complement to artist discographies.

**Endpoint(s):** GET /me/tracks (getAllPages)

**Params:** artist_id or name, market?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endp

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/394) · 2026-08-27 · closed · 1 comment

### feat: playlist_overlap_matrix — exhaust2 candidate (P1)

**Domain:** Playlists/Library · **Bucket:** P1 · **Quota:** 🟢 N GETs (≤10) · **Part of the exhaust2 feature swarm**

**Pitch:** local-compute: pairwise overlap % + Jaccard for up to 10 playlists at once — finds near-duplicate playlists before a cull.

**Endpoint(s):** GET /playlists/{id}/items ×N

**Params:** playlist_ids[2–10], min_overlap?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/393) · 2026-08-27 · closed · 1 comment

## Most recent

### eng: gated_surface_selfflag — graceful gating for app-registration-403 surface

**Domain:** Catalog/Search · **Bucket:** P1 · **Quota:** — · **Part of the exhaust2 feature swarm**

**Pitch:** Tools over the #329 gated class self-declare gating in their description and short-circuit with the graceful 403 contract (pairs with #330 gauntlet SKIP set)

**Endpoint(s):** —

**Params:** —

**Engineering card** — closes part of the #328/#329/#330 gating trio.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/429) · 2026-08-27 · closed · 0 comments

### eng: browse_403_graceful — graceful gating for app-registration-403 surface

**Domain:** Catalog/Search · **Bucket:** P0 · **Quota:** — · **Part of the exhaust2 feature swarm**

**Pitch:** Apply the existing graceful-403 wrapper to get_categories/get_category/get_category_playlists — raw "Forbidden" today

**Endpoint(s):** —

**Params:** —

**Engineering card** — closes part of the #328/#329/#330 gating trio.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/428) · 2026-08-27 · closed · 0 comments

### feat: device_sync_state — exhaust2 candidate (P2)

**Domain:** Portability/Analytics · **Bucket:** P2 · **Quota:** 🟢 (1 read) · **Part of the exhaust2 feature swarm**

**Pitch:** Reconcile sidecar device labels/volume presets against the live device list; flag dead labels, offer prune (dry_run).

**Endpoint(s):** GET /me/player/devices + sidecar

**Params:** prune?, dry_run

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/427) · 2026-08-27 · closed · 0 comments

### feat: export_playlist_json — exhaust2 candidate (P2)

**Domain:** Portability/Analytics · **Bucket:** P2 · **Quota:** 🟢 (1 read) · **Part of the exhaust2 feature swarm**

**Pitch:** Full-fidelity JSON export of one playlist: items + added_at + added_by + URIs (CSV/M3U lose these).

**Endpoint(s):** /playlists/{id}/items

**Params:** playlist_id

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/426) · 2026-08-27 · closed · 0 comments

### feat: receipt_lookup — exhaust2 candidate (P2)

**Domain:** Portability/Analytics · **Bucket:** P2 · **Quota:** 🟢 (0 calls) · **Part of the exhaust2 feature swarm**

**Pitch:** Find receipts by id, date range, or affected URI — closes the receipts.ts loop (issue → lookup).

**Endpoint(s):** local history

**Params:** id?, since?, uri?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/425) · 2026-08-27 · closed · 0 comments

### feat: undo_preview — exhaust2 candidate (P2)

**Domain:** Portability/Analytics · **Bucket:** P2 · **Quota:** 🟢 (0-2 reads) · **Part of the exhaust2 feature swarm**

**Pitch:** Dry-run for undo_mutation: show exactly what would be reverted (diff of before/after) without executing.

**Endpoint(s):** local history + optional check reads

**Params:** mutation_id

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/424) · 2026-08-27 · closed · 0 comments

### feat: mutation_log_export — exhaust2 candidate (P2)

**Domain:** Portability/Analytics · **Bucket:** P2 · **Quota:** 🟢 (0 calls) · **Part of the exhaust2 feature swarm**

**Pitch:** Render the JSONL mutation history as CSV/markdown report, date/uri-filtered — audit trail you can read.

**Endpoint(s):** local history.jsonl

**Params:** from, to, format

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/423) · 2026-08-27 · closed · 0 comments

### feat: listening_week_in_time — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟡 (2-6 reads) · **Part of the exhaust2 feature swarm**

**Pitch:** Charts for any specific past week (within the 90-day recently-played window) via before/after cursor walk — retro "what was I playing then".

**Endpoint(s):** /me/player/recently-played?before/after

**Params:** week_start, top_n

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-end

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/422) · 2026-08-27 · closed · 0 comments

### feat: export_shows_opml — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟢 (1 read) · **Part of the exhaust2 feature swarm**

**Pitch:** Export saved shows as OPML XML — the one interchange format podcast apps actually speak.

**Endpoint(s):** GET /me/shows

**Params:** fetch_all

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/420) · 2026-08-27 · closed · 0 comments

### feat: export_playlist_markdown — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟢 (1 read) · **Part of the exhaust2 feature swarm**

**Pitch:** Markdown table variant of export_playlist — paste-ready tracklist doc for sharing/PRs.

**Endpoint(s):** /playlists/{id}/items

**Params:** playlist_id, include_added_at

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/419) · 2026-08-27 · closed · 0 comments

### feat: listening_journal_append — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟢 (0 calls) · **Part of the exhaust2 feature swarm**

**Pitch:** Attach a timestamped note to today's journal / a tagged session in the sidecar — makes tag_listening_session actually useful for recall.

**Endpoint(s):** sidecar only

**Params:** note, session?, tag?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/418) · 2026-08-27 · closed · 0 comments

### feat: artist_complete_check — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟡 (2-4 reads) · **Part of the exhaust2 feature swarm**

**Pitch:** Collector completeness: artist's full album list vs my saved albums — what's missing, EP/live-deluxe breakdown.

**Endpoint(s):** GET /artists/{id}/albums + /me/albums

**Params:** include_singles?

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/416) · 2026-08-27 · closed · 0 comments

### feat: chapter_bookmarks — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟢 (0 calls on save) · **Part of the exhaust2 feature swarm**

**Pitch:** Named chapter+position bookmarks per audiobook in sidecar; jump later via jump_to_chapter. Write/read/delete.

**Endpoint(s):** sidecar only

**Params:** book_uri, label, position

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/415) · 2026-08-27 · closed · 0 comments

### feat: audiobook_library_progress — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟡 (N reads) · **Part of the exhaust2 feature swarm**

**Pitch:** All saved audiobooks with % complete + est. time remaining, sorted by progress — "what am I actually reading".

**Endpoint(s):** GET /me/audiobooks, /audiobooks/{id}

**Params:** sort

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/414) · 2026-08-27 · closed · 0 comments

### feat: show_backlog_report — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟡 (N reads) · **Part of the exhaust2 feature swarm**

**Pitch:** Per saved show: unplayed episodes (fully_played/resume_point), hours of backlog, newest-episode age — decide what to unsubscribe from.

**Endpoint(s):** GET /me/shows, /shows/{id}/episodes

**Params:** sort, min_hours

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy.

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/413) · 2026-08-27 · closed · 0 comments

### feat: playlist_staleness_report — exhaust2 candidate (P1)

**Domain:** Portability/Analytics · **Bucket:** P1 · **Quota:** 🟡 (N reads, getAllPages) · **Part of the exhaust2 feature swarm**

**Pitch:** Per playlist: newest/oldest added_at, median item age, count added last 90d — find playlists rotting in place.

**Endpoint(s):** /me/playlists, /playlists/{id}/items?fields=added_at

**Params:** limit, sort

Ships as part of exhaust2 swarm; builder PR will close this issue. Verify against SPEC §9 (no deprecated endpoints) and the #329 gated-endpoint policy

[Read the thread](https://github.com/NovaLux12/spotify-mcp-server/issues/412) · 2026-08-27 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/NovaLux12/spotify-mcp-server/issues).
