Music Playlist Organizer MCP
This MCP server lets you find, identify, classify, and organize music tracks and playlists across YouTube (primary) and Spotify (legacy), with preview-by-default writes.
Search catalogs:
spotify_search_tracks,youtube_search_videos(by title, artist, or free text, with limits/region/ordering).Identify a single song/video from a link, video ID, ISRC, or text:
spotify_identify_track,youtube_identify_track.Batch-resolve many links or search strings into candidates:
spotify_resolve_links,youtube_resolve_links.Inspect and manage playlists:
youtube_list_playlists,youtube_create_playlist(private/unlisted/public).Detect duplicates without modifying anything:
spotify_check_playlist_duplicates,youtube_check_playlist_duplicates.Preview deterministic playlist categorization by keyword rules:
spotify_classify_playlist,youtube_classify_playlist.Organize a Spotify source playlist into derived category playlists (preview or apply, optional prefix/public flags):
spotify_organize_playlist.Add one video to an existing playlist, skipping exact duplicates:
youtube_add_to_playlist.Do an end-to-end save on YouTube — identify, classify, dedupe, and place into a named or auto-created category playlist:
youtube_save_track.Safety by default: mutation tools take
mode: "preview"unless you passapply, and YouTube adds dedupe exact matches.Note: the README also describes
save_music, the local SQLite library, sync/reconcile, batch import, identity review, and a local HTTP/UI facade, but those tools are not present in this schema.
Legacy provider offering Spotify tools for searching, identifying tracks, batch resolving links, checking duplicates, classifying content, and organizing playlists.
Provides tools for searching YouTube videos, identifying tracks from URLs or IDs, resolving links, listing and creating playlists, checking for duplicates, classifying playlists, and adding videos to playlists.
Accepts YouTube Music links to identify tracks and save them to YouTube playlists, with support for classification, deduplication, and automatic playlist creation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Music Playlist Organizer MCPSave this YouTube link to my Chill playlist: https://youtube.com/watch?v=VIDEO_ID"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Music Playlist Organizer MCP
目前產品版本:v0.3.0。MCP server、HTTP /version 與音樂庫備份的版本資訊都從 package.json 讀取。
這是一個以 Node.js 撰寫的 MCP Server,讓你把找到的歌曲名稱或 YouTube/YouTube Music 連結,辨識後分類、去重,並加入自己的 YouTube 播放清單,之後可以直接回到 YouTube 觀看。
目前以 YouTube 為主要 provider;Spotify 工具仍保留,但屬於選配的 legacy provider。
收藏流程
建議的統一入口是 save_music:一次呼叫完成「辨識 → 綁定影片 → canonical 去重 → 分類 → 寫入本機音樂庫 →(可選)同步 YouTube 播放清單」,並回傳完整 receipt。
save_music({
"input": "https://music.youtube.com/watch?v=dQw4w9WgXcQ",
"mode": "apply"
})input接受歌曲名稱、YouTube/YouTube Music 影片連結或 11 字元 video ID;videoId可指定候選影片。mode預設"preview"(不寫入);"apply"才會實際寫入。syncToYouTube預設true;preview 模式仍會預覽 YouTube 步驟,設false可只寫本機音樂庫。remoteDedupe預設"canonical":目標播放清單已有同一首歌時不再加入——判斷依據包含同一 canonical track 在 Library 裡的其他 YouTube 來源,以及 metadata canonicalize 出相同 key 的播放清單項目(例如 Official MV 與 Official Audio,即使 Library 沒見過該上傳);命中時回報skipped_canonical_duplicate。傳"source"則只擋相同videoId,允許同一首歌的多個來源版本同列。live/cover/remix 等不同 version 的 canonical key 不同,不會被歌曲層級去重吞掉。receipt 以youtube.duplicateKind(exact_source/canonical_track)與youtube.matchedVideoId明確指出遠端判斷依據。tags/category會成為使用者標籤(只增不覆寫既有使用者標籤);category同時決定目標播放清單名稱,playlist可直接指定播放清單(名稱、URL 或 ID)。精確連結或 video ID 走 fast path;自由文字無法唯一綁定時回傳
selection_required與candidates,不會默默收藏搜尋第一名——請用回傳的videoId重新呼叫。本機音樂庫寫入與 YouTube 寫入是獨立步驟:一邊失敗時 receipt 會回報真實的 partial
writeState(如UNKNOWN_AFTER_WRITE、PARTIAL_PLAYLIST_CREATED)、completedSteps與安全的nextStep,不會把部分成功包成一般錯誤。重複收藏同一videoId是冪等的(skipped_duplicate);同一首歌的不同來源在預設remoteDedupe: "canonical"下也冪等(skipped_canonical_duplicate)。
若使用底層工具,對「歌曲名稱或搜尋文字」仍可採用兩階段流程:
呼叫
youtube_identify_track,取得候選影片與videoId。使用者確認候選後,把選定的
videoId傳給youtube_save_track,並設定mode: "apply"。Server 依分類找到或建立播放清單,檢查相同
videoId後才加入。
如果輸入本身是精確的 YouTube/YouTube Music 影片連結,可以直接套用;播放清單連結不能當成單一歌曲輸入。
Related MCP server: yt-curator-mcp
YouTube 工具
save_music:建議的收藏入口。辨識、綁定、canonical 去重、多維度分類、寫入本機音樂庫並可選同步 YouTube 播放清單,回傳含 exact IDs、duplicate level、syncState 與 nextStep 的完整 receipt。youtube_search_videos:搜尋歌曲、藝人或影片。youtube_identify_track:從 URL、YouTube Music URL、影片 ID 或文字搜尋辨識影片。youtube_resolve_links:批次解析多個連結或搜尋文字。youtube_list_playlists:列出已授權帳號的播放清單。youtube_create_playlist:建立私人、未列出或公開播放清單。youtube_check_playlist_duplicates:檢查播放清單內的重複影片。youtube_classify_playlist:依標題與頻道關鍵字預覽分類。youtube_add_to_playlist:預覽或將影片加入既有播放清單。youtube_save_track:辨識、分類、去重,並加入指定或自動建立的分類播放清單。youtube_auth_status:查看憑證狀態,不會顯示 token。youtube_auth_revoke:撤銷 OAuth 憑證並刪除本機加密憑證檔。library_status:查看本機音樂庫路徑、schema version 與曲目數,不會回傳任何列內容或 secret。classify_track:用固定 taxonomy 預覽單曲的多維度分類(genre、mood、language、activity、energy、era、artist、custom_tags),每個值附來源(user/rule/model)與信心度;唯讀,不寫入音樂庫。
多維度分類
src/classify.js 的 classifyMusic({ title, artist, channelTitle, description, userClassification }) 回傳 { taxonomyVersion, dimensions, provenance, needsReview }:
固定 taxonomy 定義在
src/taxonomy.js(TAXONOMY_VERSION = 1);同義詞會正規化(jpop/J-Pop/J-POP→j-pop)。無法對應官方值的輸入會導向
custom_tags並列入needsReview,不會憑空擴充官方 taxonomy。預設走決定性規則(
source: "rule",沿用DEFAULT_RULES關鍵字加上 taxonomy 掃描);可注入本地modelstub,失敗或缺模型時自動落回規則,不呼叫外部 LLM API。userClassification的欄位永遠優先(source: "user");自動分類只填空的維度,provider metadata 只算證據而非事實(信心度 < 1)。透過 MusicLibrary 公共 API 持久化:
persistClassification(library, trackInput, result)用upsertTrack寫維度欄位、addTag寫custom_tags、完整 provenance JSON 存進sync_state的classification.<trackId>。重新分類時使用者設過的維度與標籤不會被覆寫,tags 只增不減。
本機音樂庫
Server 啟動時會開啟一個本機 SQLite 音樂庫(node:sqlite),作為 Personal Music Library 的持久層:YouTube 仍是播放器,本機 DB 負責保存曲目、來源對應、tags、播放清單 mapping、aliases 與 sync_state。save_music 會寫入此庫(tracks、sources、tags、播放清單 mapping 與分類 provenance);底層的 youtube_save_track 仍只操作 YouTube。
預設位置:使用者設定目錄下的
music-playlist-organizer/library.sqlite(Windows 為%APPDATA%\music-playlist-organizer\library.sqlite;其他平台為~/.config/music-playlist-organizer/library.sqlite)。覆寫路徑:設定環境變數
MUSIC_LIBRARY_FILE(相對路徑會解析為絕對路徑)。備份:先關閉 server(關閉時會做 WAL checkpoint),再複製
library.sqlite;若仍看到-wal/-shm檔,請一併複製。重置:關閉 server,刪除
library.sqlite,重新啟動即會重建空 schema。OAuth token、refresh token、client secret 與
YOUTUBE_CREDENTIAL_PASSPHRASE一律留在加密憑證檔,不會寫入音樂庫 DB、log 或 MCP 輸出;寫入端也會拒絕疑似 secret 的欄位名稱。
音樂庫查詢與維護
音樂庫內容透過以下工具查詢與整理(實作在 src/library-query.js,SQL 集中在 MusicLibrary)。所有查詢皆唯讀、分頁有界(limit ≤ 100),穩定識別一律用本機 trackId 與精確 YouTube ID,不用顯示名稱當唯一鍵:
search_library:依title/artist(LIKE+正規化,支援 CJK)、tag、genre、mood、language、activity過濾,回傳items+total+hasMore。list_music:全庫分頁(limit/offset),最新收藏在前。recent_music:最近收藏的曲目,有界。get_music:單一trackId的完整檔案——canonical 欄位、sources、tags、playlists、分類記錄、sync狀態與 identity review 項目。update_music_tags:對單曲新增/移除自訂標籤,回傳 before/after;不碰其他維度或 user-set metadata。update_music_classification:對單曲做持久化人工分類修正,set寫入維度(genre/mood/language/activity/energy/era/artist,值過 taxonomy 驗證——未知值導向 custom tags+review,不擴張官方維度),clear明確移除使用者設過的維度;mode預設 preview 顯示 before/after/provenance diff。人工值記為source: user,reclassify_music不會覆寫;空值不算清除(清除只能走clear)。reclassify_music:對單曲重跑自動分類,使用者設過的維度與標籤保留,回傳變更前後的 per-dimension diff。remove_music:預設preview。apply只執行明確授權的 effect——local: true刪本機曲目(連同 sources、tags、playlist mapping、aliases、identity candidates、sync_state);youtubePlaylist(精確 playlist ID 或 URL,名稱會被拒絕)+可選videoId刪 YouTube playlist item。兩個 effect 獨立執行、各自回報writeState,一邊失敗不會回滾另一邊;未授權任何 effect 的 apply 是明確 no-op(no_effect_authorized)。list_unsynced_music:列出需要注意的曲目——not_synced(不在任何 provider playlist)、identity_conflict(needs_review)、provider_unavailable(sync.<trackId>標記為非 synced 狀態);可用reason過濾。
YouTube ↔ 音樂庫同步
同步工具在 src/library-sync.js,讓音樂庫與 YouTube playlist 不再無限漂移。設計原則:預設不做雙向破壞性同步;先產生 plan;push/pull/reconcile 語意分離;playlist 只用精確 ID 識別(名稱可改名,ID 不變);provider read-back 是事實來源,但不會覆寫本機 tags 或 canonical 合併決策。
sync_status:唯讀掃描。回報每首歌的穩定狀態——in_sync、local_only(音樂庫有、playlist 沒有)、conflict(needs_review)、unknown_after_write(上次寫入結果不確定)、unknown(playlist 讀取失敗);以及 remote 端的youtube_only、unlinked(本機有該 source 但缺 playlist 關聯)、unavailable(deleted/private)。可用playlist(精確 ID 或 URL)限定範圍。sync_youtube:預設preview回傳明確 plan(additions/imports/removals/renames/links/sourceMarks/markerResolutions),不做任何 provider 寫入。apply只執行預覽授權的direction與範圍:push:把local_only曲目補進 playlist;已在 playlist 內的不會重複加;allowRemoval: true才會另外移除youtube_only項目(破壞性操作需額外授權)。pull:把youtube_only影片以upsertTrack匯入音樂庫,走原有 dedup 與 playlist 精確 ID 關聯。reconcile:只修本機狀態,不做 provider 寫入——同步 playlist 改名(不會新建重複 playlist)、標記unavailablesource、補unlinked關聯、用已讀回的項目解unknown_after_writemarker。寫入遇到 timeout/5xx/429 不盲目 retry:該筆標記
unknown_after_write,整體回reconciliation_required。
reconcile_track:對單曲做 exact-ID read-back——只有明確 missing/deleted/private 才把 source 標unavailable(不刪 canonical track);timeout、取消、429、5xx、網路或認證失敗會保留 source availability,將待重試的unknown狀態存入 Library(原有unknown_after_write也保留),重啟後仍可再次 reconcile。receipt 對每個失敗 lookup 回傳不含 provider 原始訊息的錯誤類型與安全下一步;確認成功後才解為synced/local_only/unavailable。
同步狀態存在 sync.<trackId> marker(JSON,無 secrets),與 list_unsynced_music 的 provider_unavailable 過濾相容。schema v3 在 track_sources 增加 status 欄位(ok/unavailable),source 失效不等於歌曲消失。
HTTP 介面(本機限定)
src/http-server.js 提供受保護的 REST facade,供手機/Web UI 操作同一套 service layer——所有路由直接委派 saveMusic、library-query、library-sync,preview/apply、exact ID、reconciliation 語意與 stdio MCP 完全一致,不重複實作。
啟動(只綁 localhost):
node src/http-server.js # 127.0.0.1:8741
MUSIC_HTTP_PORT=9000 node src/http-server.jsSession 流程:
curl -X POST http://127.0.0.1:8741/session \
-H 'Content-Type: application/json' \
-d '{"token":"<MUSIC_HTTP_BOOTSTRAP_TOKEN>"}'
# → {"token":"<session>","expiresAt":"..."}
curl http://127.0.0.1:8741/api/library/tracks -H "Authorization: Bearer <session>"
curl -X DELETE http://127.0.0.1:8741/session -H "Authorization: Bearer <session>" # revoke環境變數:MUSIC_HTTP_HOST(預設 127.0.0.1,不要設 0.0.0.0 除非前面有 TLS + 反向代理+自有認證層)、MUSIC_HTTP_PORT(預設 8741)、MUSIC_HTTP_BOOTSTRAP_TOKEN(未設時啟動產生隨機值印在 stderr)、MUSIC_HTTP_ALLOWED_ORIGINS(逗號分隔;預設只允許 http://localhost/http://127.0.0.1,攜帶其他 Origin 的瀏覽器請求一律 403)。
安全界線:session token 與 YouTube OAuth 憑證完全分離,API 回應永不含 access/refresh token 或 credential passphrase;request body 上限 64 KB 且每個路由只收白名單欄位(client 無法注入 credential path);effectful endpoint 併發上限 4,超出回 429;所有錯誤為 {error:{code,message}} 結構。
路由:GET /health、GET /version(免認證);POST /session、DELETE /session;GET /api/library/{tracks,recent,search,unsynced,tracks/:id}、POST /api/library/tracks/:id/{tags,reclassify}、POST /api/library/remove;POST /api/save_music;GET /api/sync/status、POST /api/sync、POST /api/reconcile。
收藏 UI(GET /)
public/index.html 是一個免建置、行動裝置寬度(480px)的單頁收藏介面,由 GET / 直接送出(靜態 shell 不需 session;所有 /api/* 呼叫仍要 Bearer token)。流程:貼上歌名或 YouTube/YouTube Music 連結 → POST /session(貼 bootstrap token)→ preview;free text 回 selection_required 時列出候選、必須明確選 videoId(絕不自動選第一個);confirm 畫面顯示分類 chips、duplicate badge(含 playlist 內 canonical 重複的「different upload」標示)、目標 playlist 與 playlistAction;apply 後顯示 saved/skipped_duplicate/partial_failure/reconciliation_required receipt——YouTube step 回 skipped_canonical_duplicate 時改顯示「Same song already in playlist」(同一首歌的其他上傳已在 playlist,library 改為連結既有 source),失敗步驟列出各自 error message;UNKNOWN_AFTER_WRITE/PARTIAL_PLAYLIST_CREATED 提供一鍵 POST /api/reconcile read-back 與安全 nextStep。首頁列出 recent(/api/library/recent)與 needs-attention(/api/library/unsynced,含 reason badge 與 reconcile 按鈕)。前端不重複實作 canonicalization/dedup/sync——全部走 facade;回應與 bundle 皆不含 provider 憑證。
批次匯入
src/batch-import.js 把既有 YouTube / YouTube Music 收藏一次帶進音樂庫,不必逐首 save_music。管線:parse → resolve → canonicalize → dedupe → preview plan → apply → 可選 YouTube 同步。
preview_import:接受items(混合 URL/video ID/每行純文字歌名)與/或playlist(精確 ID 或 URL)。回傳batchId+counts(total/new/exactDuplicate/canonicalDuplicate/unresolved/retryable/unavailable)+逐項解析狀態(resolvedBy:url/id/search/playlist,失敗項附error)。精確 ID 的 provider 暫時錯誤標為retryable;僅確認不存在、私人或刪除的影片標為unavailable。不寫曲目、不碰 provider;plan 存進import.<batchId>sync_state 供 apply 使用。單筆超過 500 項時items截斷並標truncated。import_music_batch:傳同樣輸入(重新解析)或batchId+resume:true(接續中斷或暫時失敗的批次)。只寫入已解析項目;逐項回imported/exact_duplicate/canonical_duplicate/review(低信心身份留待確認)/unresolved/retryable/unavailable/failed,單項失敗不回滾其他項;同批重跑全部報exact_duplicate,是冪等的。預設只寫本機 Library——要同步到某個 YouTube playlist 必須每次呼叫明確傳syncPlaylist(精確 ID/URL),已在 playlist 內的不重複加。results與sync.results皆以 500 筆為上限,超過時標resultsTruncated/resultsTotal;完整逐項紀錄(含逐項 sync 結果)存於 plan,用import_status分頁取回。import_status:查已存批次的counts+done/pending,並以offset/limit(預設 100、上限 500)回傳有界的逐項status/result/syncResult/error視窗,itemsTruncated/nextOffset標示續頁。apply 回應因逾時或中斷遺失時,這裡是逐項對帳點。syncResult有四個值:added(provider 已確認加入)、already_present(這次同步時該影片已在目標 playlist,未發出 append)、failed(確定失敗,可直接重試)、unknown_after_write(寫入結果不明——重試前必須先用 exact video ID 核對 playlist,否則會重複加入)。
計數口徑:sync.results/sync.failed/sync.unknown 是每次實際 append 嘗試(同一 videoId 只算一次,批內重複列不重複加),import_status.items 則是逐 plan 列(重複列鏡射同一 videoId 的結果)。所以一個 videoId 失敗會讓 import_status 看到兩列 syncResult:"failed" 而 sync.failed 仍是 1——兩者都對,只是分母不同。already_present 不算 append 嘗試,所以只出現在 import_status。
安全:batch import 落進 plan(sync_state)的 provider 錯誤訊息與呼叫端貼上的 items 文字,以及 MCP tool 丟出的 error/nextStep 與 HTTP facade 的錯誤 message,都會先過 redactSecretishText:憑證形狀的子字串(Bearer …、ya29.…、AIza…、sk-…、GOCSPX-…、含前綴的 OAuth 指派如 invalid_client_id=、JSON 引號形如 "client_secret":"…"、SID=)一律換成 [REDACTED],code/status 保留供重試判讀。因此 preview_import/import_status 回傳的 input 會與你貼的原文不同——那是刻意的。讀取端同樣會 redact,所以舊版本寫入、當時未經處理的 plan 也不會在 import_status 回吐憑證。這組較寬鬆的樣式(OAuth 指派與 GOCSPX-…)只影響 redact;決定整列 sync_state 要不要從備份剔除的,仍是較嚴格的憑證值樣式——否則像 ?client_id=12345 這種無害 query 就會讓整份 import plan 從備份消失。save_music/library_sync/library_query 各自在成功回應內嵌的 errorInfo 尚未接上這層 redact,不受本保證涵蓋。
同步 preflight 失敗記在 plan 的 syncError,描述該次 apply並自帶 playlistId(此欄位只有本版之後寫入的 plan 才有,早期 plan 沒有):下一次沒傳 syncPlaylist 的呼叫會清掉它,傳了但 preflight 成功也會清掉。唯一保留舊值的情況是本次呼叫有傳 syncPlaylist 卻在同步前就被取消——那時本次沒有任何同步嘗試,上次失敗(連同它所屬的目標 playlist)仍是最後已知狀態。apply 回應的 sync.error 是同一份內容(playlistId/code/message/status):preflight 失敗時它取代了舊版塞在 results 裡的 sync_failed 項目,所以光看 results 會看不到這筆失敗,要改看 sync.error。import_status 的逐項視窗另含 syncPlaylistId,指出該列最後一次同步寫進哪個 playlist。
import_music_batch 回應裡的 counts 是用 countBy(plan.items) 重述 plan 的解析狀態(new/exactDuplicate/… ,preview 那一套),不是這次 apply 的結果分佈;逐項結果看 results,逐項 sync 結果看 import_status。已匯入的項目仍會留在 counts.new,因為它解析時就是 new。
取消/逾時/暫時 provider 錯誤:apply 每 25 項 chunk flush 一次 plan;未完成項目保持 pending,回 remaining + batchId,之後用 resume:true 安全續作。caller abort 另回 action:"cancelled"。
備份與還原
src/library-backup.js 讓音樂庫可離線備份、搬移與還原,不綁死單一 SQLite 檔。
export_library:format:"json"輸出 deterministic、versioned JSON——含 canonical tracks、YouTube sources/exact IDs、tags、playlist mappings、aliases、identity decisions、sync_state快照(meta.syncStateIsSnapshot明確標示不保證 provider 端仍相同)。format:"csv"輸出每曲一列的可讀分析格式(非無損,restore 一律走 JSON)。sync_state匯出會排除憑證形狀的 key/value,並將無法安全解析的結構化值另外列入excluded.malformedSyncState;兩者分別計數。任意純文字仍可能包含無法辨識的秘密,因此憑證應只放在 credential store。restore_library:預設preview回報insert/update/unchanged/conflict/unsupported計數,不寫任何東西;apply在單一 transaction 內寫入(失敗整批 rollback,不會部分破壞)。同一 backup 重複 restore 冪等(INSERT OR IGNORE+id/canonical_key 比對);schemaVersion不相容直接 fail safe。Restore 不觸發任何 provider 寫入——還原後用sync_status/sync_youtube對帳。
YouTube Playlist 管理
src/playlist-admin.js 補齊日常 playlist 維護,provider mutation 與 Library CRUD 嚴格分離:
youtube_get_playlist/youtube_list_playlist_items:唯讀;items 有界分頁(limit≤ 100)。youtube_rename_playlist:preview 顯示 old/new name;apply 後 exact-ID read-back 驗證,回RENAMED或UNKNOWN_AFTER_WRITE(lost response 但實際落地時,read-back 如實回報已改名)。youtube_remove_from_playlist:依精確 playlist ID+videoId移除 playlist item;只動 provider,canonical track 不變(要刪本機曲目走remove_music的獨立授權)。重複 video item 以 playlistItemId 驗證,只移除一個實例。youtube_delete_playlist:preview 回 exact ID/name/itemCount;apply 必須另傳confirmPlaylistId等於該精確 ID——獨立授權,sync/cleanup 絕不自動觸發。
所有 mutation 遇 timeout/5xx/429 不盲目 retry:read-back 能確認就如實回報,無法確認回 UNKNOWN_AFTER_WRITE+safe next step。
Canonical 曲目識別與去重
音樂庫以「歌曲」為單位去重(schema v2):一筆 tracks 是一個 canonical track,一個 canonical track 可掛多筆 track_sources(不同 videoId 的 MV、Official Audio、歌詞版等)。正規化邏輯集中在 src/canonical.js:
標題/藝人先經 NFKC、大小寫、拉丁 diacritics、標點與全半形正規化(CJK 組合符如濁點保留),再剝除
feat./ft.、(Official Video)、[MV]、Official Audio、Lyrics、- Topic後綴、Artist - Title前綴等包裝性詞彙。canonical_key = ct|<normalizedArtist>|<normalizedTitle>|<version>:version只在 live、cover、remix、remaster、acoustic 等「不同錄音版本」時才有值(如live:at wembley);Official MV 與 Official Audio 的 key 相同,因此會掛成同一首歌的兩個 source。每筆 source 記錄
source_type(official_video | official_audio | live | lyrics | cover | remix | remaster | unknown)、匹配置信度與 provenance(JSON)。
upsertTrack 回傳 identity 欄位:state 為 created | existing | same_canonical | possible_match,level 為四級去重結果:
level | 意義 |
| 同一 provider + sourceId,冪等更新 |
| canonical key 相同(含 merge 記憶 alias),掛為新 source |
| 模糊命中(同名不同版本、同名不同藝人、近似標題):不自動合併,另建曲目並標 |
| 無相近候選,建新曲目 |
人工決策永遠優先於自動流程:
mergeTracks(intoId, fromId):把 from 的 sources、tags、playlists、aliases 全部併入 into 並刪除 from;from 的 canonical key 會存成 into 的canonical_keyalias,之後同 key 的新來源仍自動掛進來。splitTrack(trackId, sourceIds, { title?, artist?, ... }):把指定 sources 拆到一個新曲目(新曲目identity_locked = 1),並撤銷原曲目上對應的 canonical_key alias。identity_locked的曲目不會成為自動掛載目標:同 key 新來源會落入possible_match(reasonidentity_locked)。setIdentityLocked(trackId, false)可解除。previewIdentity(input)為唯讀預覽:回傳正規化結果與將採用的去重決策,不寫入任何資料。identityReviewQueue()列出所有待審候選配對(含信心值與原因);setNeedsReview(trackId, false)可手動清除標記。
識別審核 MCP 工具
上述 domain 能力已透過 MCP 工具開放(src/identity-admin.js,全部 preview-first、只用穩定 ID,不碰 provider playlist):
工具 | 行為 |
| 列出待審候選配對:confidence、reason、雙方 exact sources |
| preview 列出 sources/tags/playlists/aliases 變化與 |
| preview 驗證 |
| preview/apply 將配對駁回為 distinct; |
| 切換 |
需求
Node.js 24 或更新版本(
node:sqlite)。YouTube Data API key:用於公開搜尋與影片資訊;若不設定,catalog read 會改用 YouTube OAuth。
Google OAuth 2.0 client:列出、建立與修改自己的播放清單時需要。
OAuth scope:
https://www.googleapis.com/auth/youtube。
安裝與設定
Copy-Item .env.example .env
npm install
npm test.env 的 YouTube 相關設定:
YOUTUBE_API_KEY=
GOOGLE_CLIENT_ID=your-google-oauth-client-id
GOOGLE_CLIENT_SECRET=your-google-oauth-client-secret
YOUTUBE_OAUTH_REDIRECT_URI=http://127.0.0.1:53682/oauth2callback
# 建議使用加密憑證檔,不要把 token 貼進設定檔。
YOUTUBE_CREDENTIAL_FILE=
YOUTUBE_CREDENTIAL_PASSPHRASE=use-a-local-secret-not-committed-to-git
YOUTUBE_REGION=TW
YOUTUBE_PLAYLIST_PREFIX=
PROVIDER_TIMEOUT_MS=15000
PROVIDER_MAX_READ_RETRIES=1Provider 請求界線(timeout/取消)
所有對 YouTube、Spotify、OAuth token 與 YouTube oEmbed 的 HTTP 請求都經過同一層 deadline/取消包裝(src/http.js):
每個請求與其回應 body 讀取都有有限 deadline:預設 15000ms,
PROVIDER_TIMEOUT_MS可調(1–120000ms 之間收敛)。MCP
notifications/cancelled會把進行中的 provider 請求 abort;HTTP facade 在 client 斷線時同樣傳遞取消。caller 取消回CALLER_CANCELLED,與TIMEOUT、NETWORK_ERROR、HTTP_429、HTTP_5XX、AUTH_REFRESH_FAILED分開分類。GET 讀取遇到 429/5xx 依 Retry-After/指數退避做有限次重試(
PROVIDER_MAX_READ_RETRIES,0–2);寫入永不自動重試——timeout、取消或網路錯誤視為 ambiguous,回UNKNOWN_AFTER_WRITE/reconciliation_required,由 read-back 對帳(見「YouTube ↔ 音樂庫同步」)。timeout/cancel/error 輸出不含 access token、refresh token、client secret 或 authorization code;計時器與 abort listener 在請求結束後一律釋放。
首次授權請執行:
npm run youtube:authyoutube:auth、MCP stdio server 與 HTTP facade 啟動時都會自動載入專案根目錄的 .env(Node 原生 process.loadEnvFile)——已存在的環境變數優先,.env 只補缺少的 key;缺少 .env 不算錯誤。
這個流程會使用 OAuth state 與 PKCE,開啟瀏覽器完成 Google 授權,並把 token 寫入本機 AES-256-GCM 加密檔。終端機只會顯示檔案位置與完成狀態,不會顯示 access token 或 refresh token。執行 MCP Server 時,仍須讓它取得同一個 YOUTUBE_CREDENTIAL_PASSPHRASE;不要把 passphrase、.env 或憑證檔提交到 Git。
YOUTUBE_CREDENTIAL_FILE 未設定時,預設位置是使用者設定目錄下的 music-playlist-organizer/youtube-credentials.json。YOUTUBE_ACCESS_TOKEN 與 YOUTUBE_REFRESH_TOKEN 仍可作為明確的本機 fallback,但不建議在一般部署中使用,也不要提交到 repository。
使用範例
先取得候選,不會寫入帳號:
youtube_identify_track({
"input": "Daft Punk One More Time",
"limit": 5
})使用者從回傳的 candidates 選定 videoId 後再收藏:
youtube_save_track({
"input": "Daft Punk One More Time",
"videoId": "dQw4w9WgXcQ",
"category": "Party",
"mode": "apply",
"createIfMissing": true,
"privacyStatus": "private",
"dedupe": true
})精確連結可以直接使用:
youtube_save_track({
"input": "https://music.youtube.com/watch?v=dQw4w9WgXcQ",
"category": "Chill",
"mode": "apply"
})若寫入期間發生 timeout、取消、網路錯誤、429 或 5xx,工具會回傳 UNKNOWN_AFTER_WRITE 或 PARTIAL_PLAYLIST_CREATED,包含已確認的 playlist ID、video ID 與 completedSteps。請先依回傳的 exact ID 讀取播放清單,再決定是否重試;寫入不會自動重試。
MCP Client 設定
把專案的絕對路徑填入 args,並讓 MCP process 取得加密憑證的 passphrase:
{
"mcpServers": {
"music-playlist-organizer": {
"command": "node",
"args": ["C:\\path\\to\\spotify-playlist-organizer-mcp\\src\\server.js"],
"env": {
"YOUTUBE_API_KEY": "your-youtube-data-api-key",
"GOOGLE_CLIENT_ID": "your-google-oauth-client-id",
"GOOGLE_CLIENT_SECRET": "your-google-oauth-client-secret",
"YOUTUBE_CREDENTIAL_PASSPHRASE": "load-this-from-your-local-secret-manager",
"YOUTUBE_REGION": "TW"
}
}
}
}stdio MCP 與 HTTP facade 共用同一套 service layer;手機/Web 收藏介面由 GET / 提供(見「收藏 UI」),經 bootstrap→session Bearer 流程呼叫 /api/*。
Spotify legacy provider
既有的 spotify_* 工具仍保留,包括搜尋、辨識、批次解析、重複檢查、分類與播放清單整理;不設定 Spotify 環境變數時,不會影響 YouTube 工具。
品質控制
npm test # 每個 commit 必跑(node:test)
npm run smoke # MCP stdio server 啟動煙霧測試
npm run lint # ESLint flat config(CI 也跑)
npm run test:coverage # 測試 + V8 coverage + 棘輪門檻(行≥80/分支≥75/函數≥88,校準於 CI Node 24)
npm run crap # CRAP 分數:cyclomatic complexity × coverage
npm run crap -- --gate 30 # 有任何函數 CRAP > 30 就 exit 1(可做門檻)
npm run mutate # Stryker mutation testing(全檔很慢,見下)
npx stryker run --mutate src/library.js # 單檔 scope品質閘門定位
工具 | 何時跑 | 量什麼 |
| 每個 commit(CI 也跑) | 行為正確性——spec 裡的每個驗收條件 |
| CI 每個 push | 靜態錯誤(unused vars、無效 escape 等) |
| CI 每個 push | 覆蓋率報表 + 棘輪門檻,只准升不准降 |
| PR 前/清理複雜度時 | CRAP = comp²×(1−cov)³+comp,找出「又複雜又沒測」的函數 |
| 定期深檢(約 7 分鐘/檔,不進 CI) | 變異測試分數——測試是否真的抓得到 bug |
Mutation testing 刻意不進 CI:
node --testcommand runner 每個 mutant 跑整套測試,單檔約 7 分鐘、全src/估約 2 小時。用--mutatescope 到正在改的檔案。src/spotify.js不計入 coverage:legacy provider,YouTube-first 路線下去留未定;server.js註冊層 6% 覆蓋是可接受的薄 wiring(mcp-smoke 涵蓋啟動)。CRAP 目前只做報表不做閘:
saveMusic(comp 99)與importRows(comp 79)即使高覆蓋也因複雜度上榜——先看基線再定閘值。Baseline(2026-09,spotify.js 不計):行 ~85% / 分支 ~78% / 函數 ~93%;
src/core.jsmutation score 46.6%(268 mutants)。
GitHub Actions 驗證
.github/workflows/ci.yml 會在每次 push 與 pull request 以 Ubuntu、Node.js 24 執行:
npm cinpm run lintnpm run test:coverage
npm run test:coverage 使用與 npm test 相同的 node --test 完整回歸套件,因此會包含 test/mcp-smoke.test.js;coverage 閘門另外要求行 ≥ 80%、分支 ≥ 75%、函數 ≥ 88%。Job 設有 5 分鐘上限,權限只有 contents: read,不提供 YouTube/Spotify OAuth 或 API key;測試使用 stub,不會修改真實播放清單,也不應在輸出中出現 secrets。
每次驗證請保存 Actions run URL、被測 commit SHA、實際命令與結果(可從 run summary 的 step log 取得)。這個 workflow 證明的是 Ubuntu/Node.js 24 下的本機與 stub provider 路徑;真實 OAuth/provider 網路行為,以及 Windows、macOS 或其他 Node 版本,仍需另外驗證。Issue #5 的實際 run 證據(含隔離負向測試失敗→復原)見 .github/quality-audits/2026-10-01-ci-regression-validation.md。
官方文件
Available Tools
15 toolsspotify_check_playlist_duplicatesA
Find repeated tracks in a Spotify playlist without changing it.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose an important trait: the tool is read-only and will not modify the playlist. It does not cover authentication, return format, or duplicate-detection criteria, but the read-only guarantee is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. The core action and the important non-mutating constraint are both front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool, the core operation is clear. The main gaps are the missing playlist identifier format and any guidance about the expected result shape, but the overall scope is modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only a required string named 'playlist' with no description, and the tool description does not clarify whether this should be a Spotify playlist ID, URL, or name. The description adds only the domain context 'Spotify playlist' without specifying the accepted format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Find repeated tracks in a Spotify playlist') and adds a clear non-mutating qualifier ('without changing it'). This distinguishes it from mutation-oriented siblings like spotify_organize_playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied: call this when you want to detect duplicates in a playlist. However, it does not explicitly mention alternatives or conditions for when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_classify_playlistC
Preview deterministic playlist categories using title, artist, and album keywords.
| Name | Required | Description | Default |
|---|---|---|---|
| rules | No | ||
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden. It discloses that the tool is 'deterministic' and keyword-based, but omits whether it is read-only, what happens on no matches, or any authentication/rate limits. The 'preview' wording implies a non-destructive read, but it isn't explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no fluff. However, it is too sparse to be effective — it trades completeness for brevity and misses key usage and parameter details that would help an agent call the tool confidently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested object schema and no output schema or annotations, this description is not complete. It doesn't define what output ('categories') is returned, how the rules map to songs, or any edge cases. An agent would likely need to contact the schema to understand the 'rules' object and playlist parameter, which defeats the description's raison d'être.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must contextualize both parameters. It hints that 'rules' relate to 'title, artist, and album keywords', but gives no structure for the 'rules' object or whether 'playlist' is a name or ID. It does not help the agent understand how to provide the required parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Preview deterministic playlist categories' clearly identifies a classification action on a playlist, and 'using title, artist, and album keywords' explains the method. It distinguishes itself from sibling operation like 'check_playlist_duplicates' and 'organize_playlist', though it doesn't explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives, prerequisites, or types of playlists. The description does not mention common cases like playlists with missing metadata or how this differs from 'youtube_classify_playlist' or 'spotify_organize_playlist'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_identify_trackC
Identify a track from a Spotify link, YouTube link, ISRC/search text, or title and artist.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| limit | No | ||
| artist | No | ||
| market | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It says nothing about return shape, pagination/limit behavior, network calls, authentication, or side effects. The only behavioral hint is that it accepts multiple input formats, leaving the agent to guess what happens with each.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states the action and input forms without wasted words. Excellent for a simple tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should tell the agent what the tool returns and how the parameters shape behavior. It does not explain the return value, the meaning of 'limit', market filtering, or what 'identify' means as an operation. The description is too sparse for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero descriptions, so the description must clarify the parameters. It partially does by mentioning Spotify/YouTube links, ISRC, search text, and 'title and artist', but it never explicitly ties these to the 'input' and 'artist' parameters, and it says nothing about 'limit' or 'market'. Coverage is inadequate for four parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Identify') on a resource ('track') and enumerates accepted input formats. It is immediately clear what the tool does. However, it does not contrast this with the overlapping sibling tools spotify_search_tracks, spotify_resolve_links, or youtube_identify_track, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to turn links or search text into a track identity, but it gives no explicit guidance on when to choose it over alternatives. There are several close siblings and no exclusion criteria, so an agent gets little direction about when this tool is the right one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_organize_playlistB
Preview or apply category playlists derived from a source Spotify playlist. Apply replaces only matching derived playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| rules | No | ||
| prefix | No | ||
| public | No | ||
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden, and it does disclose the key mutation behavior: apply replaces only matching derived playlists while preview is non-destructive. Still, it omits important side-effect details such as whether apply can delete or rename existing playlists, whether the source playlist is modified, and whether the operation is idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is two sentences with no filler: the first sentence front-loads the action and resource, and the second isolates the critical caveat about replacement behavior. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, a nested and undocumented 'rules' parameter, and five total parameters, this description is not complete enough for safe invocation. The agent knows the broad intent but cannot reliably determine rule syntax, the effect of prefix/public, or the full consequences of applying changes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only roughly maps to two parameters: 'Preview or apply' maps to mode, and 'source Spotify playlist' maps to playlist. The central 'rules' object, along with prefix and public, are left entirely unexplained, which is a serious gap for an agent trying to construct a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action ('Preview or apply') on a clearly defined resource ('category playlists derived from a source Spotify playlist') and adds a distinctive behavioral detail ('Apply replaces only matching derived playlists'). It is specific enough to separate it from generic playlist tools, though it does not explicitly compare against nearby siblings like spotify_classify_playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a preview-then-apply workflow and warns that apply replaces only matching derived playlists, which is a useful usage caution. However, it never states when to choose this tool over alternatives such as spotify_classify_playlist or the YouTube playlist tools, and it offers no explicit exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_resolve_linksB
Resolve a batch of Spotify or YouTube links into Spotify track candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| links | Yes | ||
| market | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for behavioral disclosure. It doesn't mention whether the tool makes network calls, rate limits, or failure handling for invalid links. Since there is no output schema, the agent doesn't know what to expect in the response. The description is purely functional without explaining side effects or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no unnecessary words. It is front-loaded with the core purpose. It could benefit from mentioning the output format or failure handling, but it is appropriately concise for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema and no annotations, the description is incomplete for an agent to call the tool correctly. It doesn't specify the exact format for links (e.g., Spotify track URLs vs Apple Music), the max batch size (though schema indicates 50), or how to handle invalid links. The optional 'market' parameter is undocumentedž For a batch resolution tool, this is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the parameters are undocumented in the schema. The description mentions 'Spotify or YouTube links' but doesn't explain the 'links' parameter format (e.g., URLs vs URIs). The 'market' parameter is not mentioned at all. Since there are only two parameters and the description provides some context for 'links', it adds partial value, but the market parameter remains unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as resolving a batch of Spotify or YouTube links into Spotify track candidates. It states the verb (resolve), the resource (links), and the output (Spotify track candidates). It distinguishes from siblings by mentioning YouTube links, which is unique. However, it doesn't explicitly mention the batch aspect or the output format, but the verb+resource is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for converting links to Spotify track candidates, and the batch aspect is implied by 'batch'. However, it doesn't provide explicit guidance on when to use this tool versus alternatives like youtube_resolve_links or spotify_search_tracks. There's no mention of prerequisites or links that fail resolution. The context is clear but lacks exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_search_tracksC
Search the Spotify catalog for tracks by title, artist, album, or free text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| market | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that it searches the catalog, implying a read-only operation, but does not mention rate limits, authentication, pagination, result ordering, or any side effects. The lack of such context is a significant gap for a search tool that returns a list of tracks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler, and the core action is front-loaded. However, it lacks any structured breakdown of parameters or usage scenarios, which would have added value without excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no output schema, and no annotations, the description is far from complete. It does not explain the return format, pagination, or the semantics of 'limit' and 'market', and provides no usage examples or context. An agent would need to inspect the schema (which lacks descriptions) or guess, making this insufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It partially explains the 'query' parameter by listing search fields, but completely ignores 'limit' (default 10, max 50) and 'market' (two-letter country code). The agent gets no hint about pagination or market filtering, leaving these parameters underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a clear resource ('Spotify catalog'), and a target ('tracks'), and enumerates the search dimensions ('by title, artist, album, or free text'). This makes the tool's purpose unambiguous and distinct from siblings like spotify_identify_track (audio identification) or spotify_resolve_links (link resolution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the sibling search-related tools (e.g., spotify_identify_track, spotify_resolve_links, or youtube_search_videos). It does not mention any exclusions, prerequisites, or alternative scenarios, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_add_to_playlistB
Preview or add one YouTube video to an existing playlist, skipping an exact duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| input | Yes | ||
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose one useful behavioral trait: duplicates are skipped during the add operation, and it suggests a preview/apply distinction. However, it does not explain what preview returns, whether apply modifies the playlist irreversibly, or any authentication/rate-limit requirements, leaving material gaps for a tool that mutates state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core operation and duplicates policy. Every word earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and no annotations, the description is too sparse to be fully actionable. It leaves unexplained the exact expectations for 'input' and 'playlist', what the preview mode's result looks like, whether the new mode actually implies idempotency, and how errors or partial results are surfaced. An agent would need to guess or inspect runtime behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It maps 'video' to input and 'playlist' to playlist, and implies mode via 'preview or add', but it does not specify the input format (URL, video ID, search term), the playlist identifier format, or what values are valid for mode beyond the schema's enum. This is minimal added value over the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool previews or adds one YouTube video to an existing playlist while skipping exact duplicates. The specific verb and resource combination ('add one YouTube video to an existing playlist') distinguishes it from siblings like youtube_check_playlist_duplicates, youtube_list_playlists, and youtube_create_playlist without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to use this tool versus alternatives. It mentions a preview and apply mode, but does not state what conditions would favor this over e.g. youtube_save_track or youtube_check_playlist_duplicates, nor does it specify prerequisites like needing an existing playlist or how to identify it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_check_playlist_duplicatesA
Find repeated videos in a YouTube playlist without changing it.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden for revealing side effects. It directly states the key behavioral attribute: the playlist is not modified. It does not detail return shape or edge conditions, but the safety-relevant behavior is explicitly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that wastes no words. It effectively communicates the action and the non-mutating guarantee.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should clarify what the agent receives, such as a list of duplicate entries, counts, or identifiers. It also does not clarify how to supply the playlist parameter. The core purpose is clear, but key invocation details are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The playlist parameter has 0% schema description coverage, and the tool description does not explain whether the value should be a playlist ID, URL, or title. It only establishes that the target is a YouTube playlist, leaving an important ambiguity for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific read-only operation: finding repeated videos in a YouTube playlist. 'Without changing it' also distinguishes it from mutation-oriented sibling tools like youtube_add_to_playlist and youtube_organize_playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the right use case: call it when duplicate detection in a playlist is needed. It provides no explicit comparison or rejection criteria versus the other playlist tools, so the guidance is adequate but not robust.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_classify_playlistC
Preview deterministic categories for a YouTube playlist using title and channel keywords.
| Name | Required | Description | Default |
|---|---|---|---|
| rules | No | ||
| playlist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. 'Preview' and 'deterministic' hint that the operation is read-only and reproducible, but the description does not confirm non-mutation, explain how the rules object affects behavior, or describe the return structure. For a categorization tool with a nested rules param, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence and is front-loaded with the most important information. It is not bloated, but the brevity contributes to the semantic gaps noted in parameters and behavioral transparency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 0% schema description coverage, no annotations, no output, and a nested object, the description leaves out critical details: the rules object is allowed but its purpose and structure are unsaid, and the output format isn't hinted. This is inadequate for reliable self-contained tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides zero descriptions for the `playlist` and `rules` parameters. The description mentions only 'title and channel keywords', which indirectly points to the rules content but fails to explain what `playlist` should be (YouTube URL/ID) or how `rules` maps categories to keyword lists. An agent cannot construct valid arguments from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb ('Preview'), resource ('categories for a YouTube playlist'), and mechanism ('using title and channel keywords'). It is distinct from sibling tools like youtube_list_playlists or youtube_check_playlist_duplicates, though 'deterministic categories' could be more explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when this tool is appropriate: you want a preview of category/mapping before performing other playlist actions. However, no alternatives are named, and there is no explicit when-not-to-use guidance, leaving some room for misrouting between Spotify and YouTube classifier siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_create_playlistC
Create a YouTube playlist for the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| description | No | ||
| privacyStatus | No | private |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It states it creates a playlist, which implies a write operation, but it does not disclose side effects, permission requirements, quotas, or whether the playlist is immediately available. It also does not mention that the operation likely returns a playlist ID or any response details. This is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words, which is efficient. However, it is so brief that it omits essential information. It is not front-loaded with any constraints or usage notes; it simply states the primary action. The conciseness is good, but it sacrifices necessary substance, making it minimally adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters, no output schema, and no annotations, the description is incomplete. It does not explain the parameters, the expected return value, any default behaviors (e.g., privacyStatus default), or any caveats about creating playlists. An agent would have to guess at how to correctly invoke this tool, especially regarding the privacy status and description fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has three parameters (name, description, privacyStatus) with 0% description coverage. The description does not mention any of these parameters, their meanings, defaults, or relationships. Since schema coverage is zero, the description must compensate but fails to add any semantic value beyond the raw schema. The agent is left to infer what 'name', 'description', and 'privacyStatus' mean without context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create') and the resource ('a YouTube playlist') with a specific scope ('for the authenticated user'). It distinguishes well from siblings like youtube_add_to_playlist (adding tracks) and youtube_list_playlists (listing existing ones). The verb and resource are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of when to create a new playlist versus using youtube_add_to_playlist or youtube_save_track. No conditions, prerequisites, or exclusions are given, so an agent has no help selecting this over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_identify_trackC
Identify a song/video from a YouTube URL, YouTube Music URL, video ID, or search text.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| limit | No | ||
| regionCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses that the tool identifies from various inputs but does not state whether the operation is read-only, what it returns, whether it performs network calls, or any failure or rate-limit behavior. For a tool with no annotation safety profile, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the core accepted input formats are front-loaded. It is appropriately concise and every word contributes to the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is not complete enough given there is no output schema and no annotations. It fails to explain return shape, the semantics of limit and regionCode, or what 'identify' yields (metadata, matched track, etc.). An agent can identify the tool but may not invoke optional parameters correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the schema's bare parameter names. It adds useful meaning for the input parameter by listing accepted formats, but it says nothing about limit or regionCode, leaving the agent to guess what those optional parameters control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Identify' and clearly names the resource ('song/video') plus the accepted input forms (YouTube URL, YouTube Music URL, video ID, or search text). It is clear enough to know what the tool does, though it does not explicitly distinguish itself from siblings like youtube_search_videos or youtube_resolve_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance, no exclusions, and no mention of alternatives such as youtube_search_videos or spotify_identify_track. The only context is the accepted input forms, leaving the agent to infer when this tool should be selected over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_list_playlistsB
List the authenticated user's YouTube playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only reveals that the operation requires an authenticated user and is a listing operation; it does not state whether the call is read-only, describe pagination behavior, mention rate limits, or indicate what response shape to expect. This is minimal disclosure for a tool with no annotation safety net.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, direct sentence that front-loads the core operation and resource. Every word earns its place, and there is no redundant repetition of the tool name or boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-required-parameter listing tool, the description is minimally adequate: it identifies the resource and the action. However, with no output schema and no annotations, it does not explain what exactly is returned, whether results are paginated, or how the 'limit' parameter affects the response, leaving some ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'limit' parameter is not mentioned anywhere in the description, and schema description coverage is 0%, so the description provides no added meaning. The schema's type, default, minimum, and maximum give the agent some understanding of 'limit', but the description does not compensate for the lack of explanatory text or clarify how pagination works.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('the authenticated user's YouTube playlists'), which clearly identifies the operation. It is immediately distinguishable from sibling tools like youtube_create_playlist, youtube_search_videos, and youtube_save_track because it uniquely targets the user's own playlist collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied: call this when you need to enumerate the authenticated user's playlists. However, there is no explicit guidance about when to choose this over youtube_search_videos or youtube_create_playlist, and no mention of when not to use it. The context is clear but alternatives and exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_resolve_linksC
Resolve multiple YouTube or YouTube Music links/searches into video candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| links | Yes | ||
| regionCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations or output schema, the description carries the full burden of behavioral disclosure. It reveals that multiple inputs are batched and the output is a set of candidates, but it does not explain how invalid links are handled, how search strings are interpreted, whether candidates are deduplicated or ranked, or what data each candidate contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler; every word contributes meaning. It is appropriately brief, though it leaves room for more behavioral and parameter detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations or output schema and one undocumented parameter (`regionCode`), the description is too thin for an agent to know the expected return shape, error behavior, or how to set region-specific options. More detail about resolution behavior is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that `links` can be YouTube or YouTube Music URLs and search terms, but it never mentions the optional `regionCode` parameter or its effect on results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Resolve'), names the resource ('YouTube or YouTube Music links/searches'), and defines the output ('video candidates'). It clearly differs from sibling tools like youtube_search_videos or youtube_identify_track, though it does not explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The input scope ('multiple links/searches') implies this is for resolving existing references rather than free-form discovery, but the description gives no explicit when-to-use/when-not-to-use guidance and does not mention alternatives. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_save_trackB
Identify a YouTube song/video, classify it, deduplicate it, and add it to a named or category playlist.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| input | Yes | ||
| rules | No | ||
| dedupe | No | ||
| prefix | No | ||
| category | No | ||
| playlist | No | ||
| privacyStatus | No | private | |
| createIfMissing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure, but it only lists the intended operations. It fails to mention that 'mode' is preview vs apply, that playlists can be created via createIfMissing, the default privacyStatus, or what happens to duplicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is a single efficient sentence with zero filler or repetition. It front-loads the resource and lays out the action sequence in a natural order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no annotations, no output schema, and no per-parameter schema descriptions, this high-level sentence is insufficient to invoke the tool safely or effectively. Important behaviors such as preview mode, rule handling, and playlist creation are completely absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since schema description coverage is 0%, the description must compensate for 9 parameters, but it only loosely maps 'input' to 'Identify a YouTube song/video', 'dedupe' to 'deduplicate it', and 'playlist'/'category' to 'named or category playlist'. Parameters like mode, rules, prefix, privacyStatus, and createIfMissing remain unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and a sequence of distinct actions ('Identify a YouTube song/video, classify it, deduplicate it, and add it to a named or category playlist'). This multi-verb structure clearly distinguishes it from sibling tools like youtube_identify_track, youtube_classify_playlist, and youtube_add_to_playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this composite tool versus composing individual sibling calls, nor does it mention mode semantics or conditions like already-identified tracks. Usage context is only implied by the action list, with no alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_search_videosC
Search YouTube or YouTube Music-compatible video links by song title, artist, or free text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | relevance | |
| query | Yes | ||
| regionCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Search', which weakly implies a read-only operation, but it does not state what is returned, whether results are limited or paginated, or any other observable behavior. Behavioral context is essentially absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 15-word sentence with no filler. The verb, resource, and search criteria are front-loaded, and every word earns its place. This is appropriately concise for a straightforward search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description should supply more context: what the returned video links look like, what the optional parameters control, and how ordering works. An agent can make a basic call with just `query`, but cannot correctly exploit the optional parameters or anticipate the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for `query` (song title, artist, or free text), but says nothing about `limit`, `order`, or `regionCode`. Three of the four parameters remain undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') with a clear resource ('YouTube or YouTube Music-compatible video links') and states the accepted search criteria (song title, artist, or free text). It is clear what the tool does, but it does not explicitly differentiate itself from siblings like youtube_resolve_links or youtube_identify_track, though the 'search' verb indirectly sets it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives input guidance (what to enter as a search), but provides no guidance on when to use this tool versus alternatives such as spotify_search_tracks, youtube_resolve_links, or youtube_identify_track. No conditions, exclusions, or selection criteria are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v0.2.0- First observed
spotify_check_playlist_duplicates - First observed
spotify_classify_playlist - First observed
spotify_identify_track - First observed
spotify_organize_playlist - First observed
spotify_resolve_links - First observed
spotify_search_tracks - First observed
youtube_add_to_playlist - First observed
youtube_check_playlist_duplicates - First observed
youtube_classify_playlist - First observed
youtube_create_playlist - First observed
youtube_identify_track - First observed
youtube_list_playlists - First observed
youtube_resolve_links - First observed
youtube_save_track - First observed
youtube_search_videos
TDQS
Scored across 15 tools
There is notable overlap between search, identify, and resolve_links on both platforms, as identify accepts search text and resolve_links handles links in batch. youtube_save_track also bundles identify, classify, and add, which could be confused with youtube_add_to_playlist. However, most tools have clear, distinct resource-action targets.
All tools follow a consistent platform_verb_noun pattern in snake_case, with spotify_ and youtube_ prefixes. The verbs are descriptive and predictable, with no mixed conventions or camelCase exceptions.
15 tools is at the upper edge of the ideal range, but justified by covering two platforms with search, identify, resolve, classify, duplicate-check, and playlist management operations. A few could be consolidated (e.g., identify vs resolve_links), but the count is not excessive for the scope.
The YouTube side includes list, create, add, and save operations, but the Spotify side lacks basic playlist management like listing, creating, or adding tracks to playlists. This is a significant gap for a playlist organizer, as users cannot directly manage Spotify playlists beyond organizing derived categories.
Maintenance
Related MCP Connectors
AI playlist engine that turns music prompts into real YouTube playlists and filters bad versions.
Transcripts of YouTube videos, playlists and channels with timestamps; SRT or WebVTT too.
YouTube discovery, transcripts, library search, and monitors with API keys or OAuth.
YouTube transcripts, video details, search, channels and playlists. OAuth sign-in or API key.
51
Related MCP Servers
- AlicenseCqualityDmaintenanceSyncs YouTube Music liked songs, analyzes them for DJ metadata like BPM and key, and enables creating playlists from previews.10MIT
- AlicenseAqualityCmaintenanceEnables YouTube playlist curation including inventory, deduplication, merging, and deletion via MCP tools.12MIT
- FlicenseNot gradedqualityBmaintenanceEnables analyzing and managing YouTube playlists, including Watch Later, using InnerTube authentication via browser cookies.-
- FlicenseNot gradedqualityBmaintenanceEnables managing YouTube Music playlists and searching songs via the YouTube Data API v3, deployed as a free Cloudflare Worker.-