flacli
Canonicalises track and album metadata, checks the existing library, and provides artist image relations for filling artist pictures.
Imports playlists from Spotify using the user's data export or an Exportify CSV.
Connects to TIDAL's official API via browser login to access the user's TIDAL account and playlists.
Retrieves Wikidata portraits for artists to fill missing artist pictures.
Provides artist images from Wikimedia Commons, recording author and licence information.
Fetches Wikipedia lead paragraphs for artists and albums that have linked articles, filling bios and wikis with attribution.
Integrates with YouTube Music through ytmusicapi, using logged-in request headers to access playlists.
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., "@flacliget Lorde - Royals and the album Geogaddi by Boards of Canada"
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.
flacli
Site: https://flacli.vercel.app · Repo: https://github.com/h-3303/flacli
Get music onto disk from any agent, or from a shell: name songs and albums, or hand over a playlist; flacli
canonicalises the tracks on MusicBrainz, skips what your library already holds, fetches the rest on Soulseek
through your own running Nicotine+ client (one identity, your shares intact), files every track as
Artist/Album/NN - Title as it lands, and writes an M3U in the original order.
It is a fork of claude-music with the Claude Code plugin layer removed. The same engine now has three front doors, so the tool works with whatever drives it:
Front door | Run | For |
CLI |
| any agent with a shell, including small local models; humans |
Simple MCP |
| MCP clients with a modest model: fifteen coarse tools, one step each |
Full MCP |
| capable models: every fine-grained tool (55) |
Every CLI command prints one JSON object and returns within seconds; Soulseek matching runs in a detached worker
and flacli status follows it. flacli guide prints the workflow for an agent to read.
agent ──shell──▶ flacli ─┬─▶ MusicBrainz (1 req/s, cached)
or MCP └─▶ Unix socket ──▶ MCP Bridge plugin ──▶ Nicotine+ core ──▶ SoulseekNo telemetry, no hosted services. The only network traffic is MusicBrainz lookups and Soulseek through Nicotine+.
Install
Needs Nicotine+ 3.3 or newer and uv. Two halves: the flacli command, and a small
bridge plugin that runs inside Nicotine+.
git clone https://github.com/h-3303/flacli ~/src/flacli && cd ~/src/flacli
./install.shThe installer copies nicotine-plugin/mcp_bridge into Nicotine+'s plugin folder (native or Flatpak) and runs
uv tool install . so flacli lands on your PATH. Then: Nicotine+ → Preferences → Plugins → enable plugins →
tick MCP Bridge (re-tick it after upgrading). Check with:
flacli doctor
flacli config set music_dir ~/Music
flacli config set contact you@example.com # sent in the MusicBrainz User-Agent, as their terms askSettings live in ~/.config/flacli/config.toml; environment variables (FLACLI_MUSIC_DIR, FLACLI_DATA,
FLACLI_CONTACT, NICOTINE_MCP_SOCKET, FLACLI_TIDAL_CLIENT_ID, FLACLI_AUTO_TIDY, FLACLI_WIKI_TARGETS,
FLACLI_MPD, FLACLI_STALL_MINUTES) override them.
Related MCP server: music-mcp-agent
Use from a shell
flacli get "Lorde - Royals" "Boards of Canada - Geogaddi (album)"
flacli get '{"kind": "track", "artist": "Lorde", "title": "Royals"}' # JSON when a name holds a dash
flacli status 1 # a minute later: job progress, downloads, where files went
flacli sync ~/Downloads/Playlist1.json
flacli status 2 # until the job is finished
flacli queue 2 # totals: tracks, MB, users
flacli queue 2 --yes # queue them
flacli review 2 --doubtful # the matches below 0.85, with reasons
flacli approve 2 --tracks 14,15 && flacli skip 2 --tracks 16
flacli m3u 2
flacli tidy && flacli tidy --apply # library clean-up: plan, then apply
flacli mpd # is the player's MPD reachable, and does it serve the same library?
flacli avatar fill # a picture for every artist: Wikidata portrait, MusicBrainz, Deezer
flacli cover fill # a cover for every album: Cover Art Archive, Deezer, iTunes; embedded too
flacli wiki missing # artists and albums whose bio / wiki in the player is empty
flacli wiki fill # Wikipedia's lead paragraph where an article exists, attributed
flacli wiki set "Artist" "Album" --text-file t.txt --attribution "Written by ... from MusicBrainz"flacli --help and flacli <command> --help document every flag.
The player
flacli files music; Flaclify (or any MPD client) plays it. The two meet through MPD and through files beside the music, nothing else:
New files. Each tidy ends with a scoped
updateof the folders that received files, so a finished download is in the player's library as soon as it is filed. A fulltidy --applyupdates the whole library once.Playlists.
flacli m3uwrites the M3U8 and also stores the playlist in MPD under its own name (playlistclear+playlistadd), so it appears in the player's Playlists view; tracks MPD does not know yet get their folders updated first.flacli mpd playlist <id>does the MPD half on its own.Bios, wikis, pictures, covers.
flacli wiki,flacli avatarandflacli coverwriteArtist/artist.md,Artist/Album/wiki.md,Artist/artist.jpgandArtist/Album/cover.jpgbeside the music. Flaclify reads the text and the artist pictures from those files itself, before any online provider, and re-reads one whenever it is newer than its cached copy; album art it takes only from its cache. The direct write into a player's cache (wiki_targets, defaultflaclify) is still there for Euphonica; set it to nothing once the files alone are enough. Covers are the exception: they go into Flaclify's cache whenever it exists, whateverwiki_targetssays, because a failed lookup remembered there would otherwise hide the file for good.
MPD is found through $MPD_HOST / $MPD_PORT, then the usual local sockets, then localhost:6600;
flacli config set mpd <socket path | host:port | off> pins or disables it. Over a local socket flacli reads MPD's
music_directory and skips updates and playlists when it is not the library it files into; over TCP it assumes
they match. flacli doctor and flacli mpd report all of this. An unreachable MPD is a skipped field in the
result, never a failure.
Artist pictures
The player shows a picture for each artist and finds almost none on its own. flacli avatar fill gives every
artist one: a picture a tagger left in the artist folder, else the Wikidata portrait (Wikimedia Commons, author
and licence recorded), else a MusicBrainz image relation, else Deezer's public artist picture for an exact name
match. It is saved beside the music as Artist/artist.jpg, where Navidrome and Jellyfin look too, its origin in
.wiki/avatars.json, and written into the player's image cache the way the player would have, so it shows at
once. An artist none of the sources has is remembered in the same file and not asked for again until
--retry, a new MusicBrainz id in the tags, or a picture dropped into the folder. flacli avatar set "Artist" photo.jpg uses a picture of your own.
Album covers
An album with no cover.jpg and no picture in its tracks shows as a grey square, and once the player's lookup
has failed it never asks again. flacli cover fill gives every album one: a picture a tagger left in the folder
or embedded in a track, else the Cover Art Archive front (the tagged release, then the release group MusicBrainz
finds), else Deezer's album search, else the iTunes Search API, the last two for an exact artist and title
match. It is saved as Artist/Album/cover.jpg, where MPD's albumart, Navidrome and Jellyfin look, embedded in
every track that has no picture (never replacing one; --no-embed leaves the tags alone), its origin kept in
.wiki/covers.json, and written into the player's cache under the album's folder as MPD names it, clearing the
failed-lookup memo. An album that already has its cover file only gets it embedded. An album none of the sources
has is remembered in the same file and not asked for again until --retry, a new MusicBrainz id in the tags, or
a picture dropped into the folder. flacli cover set "Artist" "Album" front.png uses a scan of your own.
Bios and wikis
Flaclify and Euphonica show a bio under each artist and a wiki under each album, and for most libraries
they are empty. flacli wiki fills them: the text lives as Artist/artist.md and Artist/Album/wiki.md
beside the music (front matter with the source and licence, plain text below) and is pushed into the
player's metadata.sqlite, where it appears in the wiki panel and can be backed up to MPD from there.
fill takes Wikipedia verbatim where MusicBrainz links an article; for the rest, sources hands an agent
the MusicBrainz facts and links to write from, and set stores what it wrote with an attribution that
names the sources and the model. wiki_targets chooses the players (flaclify, euphonica, or a path).
Use from an agent
Point the agent at the guide once (flacli guide, or paste src/flacli/GUIDE.md into its instructions) and give
it a shell. The guide is written for small models: a quick reference, two short workflows, and the rules that
matter (never queue downloads without the user's yes, never delete by hand, do not fight the Soulseek rate limit).
For MCP clients, register flacli mcp (simple) or flacli mcp --full. docs/integrations.md
has the configuration for Claude Code, Codex CLI, Gemini CLI, opencode, Goose, Claude Desktop, and local
models through Ollama or llama.cpp.
Claude Code plugin
install.sh also registers the repository as a plugin marketplace and installs the flacli plugin when
claude is on PATH; from inside Claude Code the equivalent is /plugin marketplace add h-3303/flacli then
/plugin install flacli@flacli (and install.sh for the bridge and the command). The plugin is a thin
wrapper: the two skills (/playlist-sync, /music-tidy), the matcher agent, a session health check and
a download monitor, over flacli mcp --full and flacli mcp --soulseek from PATH. It has no settings
of its own; flacli config is the one place. Coming from claude-music: /plugin uninstall claude-music@claude-music, then the steps above; the Nicotine+ bridge plugin is the same and needs no
change.
Services
TIDAL: official API, browser login. Register your own app at developer.tidal.com with the redirect URI
http://127.0.0.1:43117/callback, thenflacli config set tidal_client_id <id>andflacli service connect tidal.Deezer: public playlists only, no login.
flacli service playlists deezer --user <id or profile URL>.YouTube Music: unofficial (ytmusicapi). Copy the request headers from a logged-in music.youtube.com tab into a file and
flacli service connect youtube-music --headers-file headers.txt.Spotify: the data export or an Exportify CSV (Spotify's developer terms forbid feeding API data to a model).
Tokens are stored 0600 under the flacli data dir and never leave the machine.
Optional extras
The full MCP server also exposes beets import and the ListenBrainz content resolver
(troi) when they are installed. See flacli mcp --full.
Development
uv sync # dev environment
uv run pytest # unit tests; bridge tests fetch Nicotine+ source into $XDG_CACHE_HOME/flacli
tests/run_matrix.sh # against every supported Nicotine+ versionTested against Nicotine+ 3.3.10, 3.3.11 and master with MCP Python SDK 2.x. GPL-3.0-or-later.
Available Tools
15 toolsapprove_tracksA
Approve candidates: give track_ids (candidate picks which one, 0 = best), or min_confidence to approve every track in the playlist at or above it. Approving queues nothing; queue_downloads does.
| Name | Required | Description | Default |
|---|---|---|---|
| candidate | No | ||
| track_ids | No | ||
| playlist_id | Yes | ||
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, closed-world mutation, and the description adds the crucial behavioral nuance that approving does NOT enqueue downloads — a genuinely useful clarification of side-effect scope beyond the annotations. It still doesn't state what state the tracks move to or whether approval is reversible.
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?
Two tight sentences, front-loaded with the action and the two modes, with the disambiguation against queue_downloads placed last where it is most needed. Dense but no 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?
For a 4-parameter mutation with no output schema and no parameter descriptions in the schema, the description supplies enough to invoke correctly and to know the side-effect boundary. Missing only the interplay of the two mutually-exclusive-looking selectors and the post-approval state.
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 carries the full burden and does well: it defines track_ids, explains that candidate selects which pick (0 = best), and describes min_confidence as a threshold selector. playlist_id is left undocumented, and the precedence when both track_ids and min_confidence are supplied is unstated.
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?
States a specific verb (approve) and resource (candidates/tracks in a playlist) and explicitly separates its effect from queue_downloads. An agent can distinguish this from sibling tools like queue_downloads and review_candidates without opening a schema.
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?
Explains the two selection modes (explicit track_ids vs min_confidence threshold) and clarifies the boundary with queue_downloads ('Approving queues nothing; queue_downloads does'). It lacks an explicit statement of when approval is a prerequisite step or when to prefer review_candidates first, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobB
Stop the running matching job of a playlist.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the agent knows this mutates state but is not classified as destructive. The description adds only that the target is a 'matching job,' without saying whether partial progress is preserved, whether cancellation is reversible, or what happens when no job is running.
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. It is efficient, though arguably too terse to carry the needed behavioral 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?
For a state-mutating job-control tool with no output schema and no supporting annotations beyond the safety profile, the description omits error/edge-case behavior and job lifecycle context. An agent lacks enough to know what happens on cancellation or in the no-job-running case.
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%, but there is only one parameter named playlist_id, whose meaning is largely obvious from the name. The description does not clarify the identifier's format or relationship to the job, so it adds minimal value while the near-trivial parameter keeps this at baseline.
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?
States a specific verb ('Stop') and resource ('the running matching job of a playlist'), which is clear enough to distinguish from read tools like status or get_music. It does not explicitly differentiate itself from a hypothetical start/resume counterpart, but the resource scope is 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?
No guidance on when to use this versus siblings such as status, sync_playlist, or review_candidates. No preconditions are stated (e.g., whether a job must be running, what happens if none is).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doctorARead-only
Health check: is Nicotine+ reachable, does the music dir exist, what is configured. Call this first when something fails; the result says how to fix it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable non-obvious context: the result is prescriptive ('says how to fix it'), telling the agent the output is actionable remediation rather than raw 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?
Two sentences, extremely tight, with the nature of the check front-loaded and the usage trigger immediately after. No filler, no restatement of the name.
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 parameterless, read-only diagnostic tool with no output schema, the description covers what it probes and the shape of the answer (remediation advice). Enough to invoke correctly; only a note on expected failure output or how it relates to 'status' is missing.
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?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly spends no words on nonexistent arguments.
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?
States a concrete diagnostic verb (health check) with three enumerated checks: reachability of Nicotine+, existence of the music dir, and configuration state. It is specific enough to distinguish from the other wiki/queue tools, though it does not explicitly contrast with the similarly-scoped sibling 'status'.
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?
Gives a clear trigger condition: 'Call this first when something fails', which tells the agent when to select it. It stops short of naming an alternative or stating when NOT to use it (e.g., versus 'status'), so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_musicA
Fetch named songs and albums in one call. Items: "Artist - Title" for a song, "Artist - Album (album)" for a whole album. Resolves them on MusicBrainz, skips what the library already has, and starts a background job that searches Soulseek and queues every match at or above min_confidence; the request itself is the go-ahead, no extra confirmation. Report what was understood, then call status(playlist_id) in a minute or two.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| lossy | No | ||
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds substantial non-obvious behavior: it hits MusicBrainz, skips assets already in the library, launches a background job against Soulseek, queues every match at or above min_confidence, and requires no further confirmation. The 'no extra confirmation' disclosure is exactly the kind of side-effect detail an agent needs before calling.
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?
Dense but front-loaded: the item format spec and the pipeline description come before the follow-up instruction. Nothing is redundant, though the single long sentence packing MusicBrainz/Soulseek/queueing could be split for readability.
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 3-param, no-output-schema tool with a background job, the description covers the important lifecycle well, but it references status(playlist_id) while no playlist_id is defined in the input schema and no output schema exists to explain what the call returns. The meaning of lossy is also left to inference.
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 coverage is 0%, so the description must carry the params. It precisely specifies the item string grammar ('Artist - Title' vs 'Artist - Album (album)') and explains min_confidence as the queueing threshold. The lossy parameter is never mentioned, leaving one of three parameters undocumented.
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?
States a specific verb+resource ('Fetch named songs and albums in one call') and goes further by describing the full pipeline (MusicBrainz resolution, library de-duplication, Soulseek search, queueing). This is clearly distinguishable from siblings like queue_downloads, sync_playlist, and status.
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?
Gives clear operational context: items must be supplied in a specific format, the request itself acts as consent ('no extra confirmation'), and the caller should follow up with status(playlist_id) in a minute or two. It does not explicitly name when to prefer this over siblings such as queue_downloads or sync_playlist, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_downloadsB
Without yes: the totals (tracks, size, users) of what would be downloaded; show them to the user. With yes=True: queue the transfers in Nicotine+. min_confidence first approves every candidate at or above it.
| Name | Required | Description | Default |
|---|---|---|---|
| yes | No | ||
| playlist_id | Yes | ||
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state readOnlyHint=false, destructiveHint=false, so the agent knows this is a non-destructive mutation. The description adds that yes=False gives a preview and yes=True performs the queueing, which is useful. However, it doesn't describe whether queued transfers are reversible (cancel_job suggests possible), rate limits, or what happens to already-queued items.
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?
Compact, front-loads the conditional behavior. Could be slightly clearer with structured formatting, but every sentence conveys needed information.
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 3-param tool with 0% schema coverage and no output schema, the description covers the two optional params but omits playlist_id semantics and the return format of the dry-run totals. It's adequate but has clear gaps.
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 coverage is 0%, so the description must carry the full burden. It explains the yes flag (boolean default false) and min_confidence (approves candidates at or above it), but says nothing about playlist_id (required integer) beyond implying a playlist exists. The meaning of min_confidence relative to 'confidence' is not fully clear.
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?
States a clear split behavior: dry-run style total preview without 'yes', actual queueing with yes=True. This is a specific verb+resource combination, though the two-mode behavior is somewhat non-standard for a tool named 'queue_downloads'.
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?
Implies when to use the dry-run (show totals to user) vs actual execution (yes=True), but doesn't explicitly name alternatives in the sibling list (e.g., approve_tracks, review_candidates) or state exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_candidatesCRead-only
Tracks that need a decision with their best candidates: confidence, quality, why they scored, user queue. doubtful_only hides everything at or above 0.85. status="not_found" lists what Soulseek did not have.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No | candidates | |
| playlist_id | Yes | ||
| doubtful_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and openWorldHint annotations already establish the safety profile, and the description adds useful behavioral detail: it lists what the result includes (confidence, quality, scoring rationale, user queue) and explains that doubtful_only hides high-confidence items and status='not_found' surfaces missing Soulseek results. It does not contradict the annotations.
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 compact and front-loads the most important content. The two sentences are dense but do not waste words, though the first sentence is more of a content summary than an action statement.
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 five parameters, no schema descriptions, and no output schema, the description is incomplete. It gives some return-field context and filter behavior, but it omits key parameter explanations and workflow guidance relative to sibling tools like approve_tracks and skip_tracks.
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 carry parameter meaning. It explains doubtful_only and partially explains status, but it leaves limit, offset, playlist_id, and the default status='candidates' undocumented, despite there being five 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 conveys that this tool retrieves tracks needing a decision along with candidate metadata, but it uses a noun phrase rather than a clear verb + resource. It does not explicitly distinguish the tool from siblings such as approve_tracks or skip_tracks, leaving the exact action to be inferred.
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 when-to-use guidance, no when-not-to-use guidance, and no named alternatives. The description only explains filter behavior for doubtful_only and one status value, which is parameter semantics rather than usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_tracksB
Leave these tracks out of matching and the M3U.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | skipped by user | |
| track_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this mutates state non-destructively. The description usefully adds the consequence (exclusion from matching and M3U generation), but says nothing about persistence, undo, or whether the skip is scoped to this run or permanent.
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 to conveying the tool's effect. Ideal size for a simple two-parameter action.
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 mutating tool with 0% schema coverage, an undocumented 'reason' parameter, and no output schema, the one-line description is too thin. It should at minimum clarify what the skip affects and what happens to the excluded tracks.
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% for two parameters, and the description only obliquely references track_ids via 'these tracks'. The 'reason' parameter (defaulting to 'skipped by user') is never mentioned, so the description fails to compensate for the coverage gap.
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 (exclude tracks) and its concrete effect (out of matching and the M3U), which is enough to tell it apart from curation siblings like approve_tracks or review_candidates. It lacks any explicit naming of alternatives, but the verb+resource+effect is 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?
Usage is only implied: the phrase 'leave these tracks out of matching and the M3U' suggests a curation step, but there is no statement of when to prefer this over review_candidates/approve_tracks or what prerequisites exist. An agent can infer intent but gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
All playlists, or one playlist: counts by state, the running or last job, download progress. Finished downloads are filed into the library (tags normalised, Artist/Album/NN - Title) as a side effect. The 'next' field says what to do next.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false with destructiveHint=false, and the description discloses exactly why: finished downloads are filed into the library (tags normalised) as a side effect of a call that looks like a read. That is meaningful context annotations alone don't supply. It stops short of saying whether the filing is idempotent or requires any auth.
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?
Three compact sentences, front-loading scope and key outputs before the side-effect disclosure and the 'next' field note. The opening 'All playlists, or one playlist:' is a clipped fragment that reads slightly awkwardly, but no sentence is 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?
With no output schema, the description covers what is returned (state counts, job, progress), the mutation side effect, and the guidance field well enough for correct invocation. Only edge details like pagination or job-failure reporting 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?
Schema coverage is 0% and the single parameter is only titled 'Playlist Id', but the description compensates by explaining that omitting it returns all playlists while supplying one scopes to that playlist. That resolves the optional-vs-required ambiguity the schema leaves open.
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 conveys a status/inspection tool via specific outputs: counts by state, running or last job, download progress, plus the 'next' guidance field. The resource and scope ('all playlists, or one playlist') are stated, though the opening fragment is ellipted and no verb like 'report' appears. It does not differentiate itself from any sibling tool by name.
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?
Usage is implied rather than stated: an agent infers it should call this to see counts/progress and that the 'next' field routes follow-up actions. There is no explicit when-not or named alternative (e.g. vs. get_music or review_candidates), so guidance stays at the implied level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_playlistA
Import a playlist (file path: Spotify export, CSV, M3U, JSPF, XSPF; or a TIDAL / Deezer / YouTube Music share URL; or an existing playlist id), resolve it on MusicBrainz, diff it against the library, and match the missing tracks on Soulseek in the background. Nothing is downloaded unless yes=True, which the user must have asked for. Follow with status(playlist_id) until the job is finished, then queue_downloads.
| Name | Required | Description | Default |
|---|---|---|---|
| yes | No | ||
| lossy | No | ||
| target | Yes | ||
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true), it discloses that matching runs in the background, that external services (MusicBrainz, Soulseek) are contacted, and that side effects are gated behind yes=True. This is exactly the extra context annotations cannot convey.
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?
Two dense, front-loaded sentences with no filler; the accepted-input parenthetical is long but earns its space by defining the required target parameter. The workflow instruction is placed last, which is the right 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?
With no output schema, the description correctly covers lifecycle (background job, status polling), safety gating, and next steps. The remaining gap is the semantics of lossy and min_confidence, which an agent would have to guess at.
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 carry parameter meaning. It covers target well (valid input forms) and mentions yes=True, but says nothing about lossy or min_confidence (default 0.85), leaving two of four parameters undocumented in either place.
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?
States a specific verb (sync/import) and resource (playlist) and enumerates accepted target forms (Spotify export, CSV, M3U, JSPF, XSPF, share URL, existing playlist id). It also names the downstream pipeline stages (resolve on MusicBrainz, diff, match on Soulseek), which clearly separates it from status and queue_downloads.
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?
Explicitly states the condition for the destructive path (nothing is downloaded unless yes=True, which the user must have asked for) and the required follow-up sequence (status(playlist_id) until finished, then queue_downloads). The alternatives in the workflow are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tidy_libraryADestructive
Library clean-up: normalise tags, drop lossy duplicates of FLACs, file everything as Artist/Album/NN - Title. apply=False is a dry run that writes a report; apply=True changes files and must only follow the user's yes to the listed deletions.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | ||
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds real value on top: it specifies what actually gets removed (lossy duplicates of FLACs), that the default path is a non-mutating dry run producing a report, and that mutation requires explicit user consent. It stops short of saying whether changes are reversible or how the report is surfaced.
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?
Two sentences with no filler; the operation scope is front-loaded ahead of the safety-critical apply semantics. The second sentence is dense but each clause about apply carries operational weight.
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 parameter descriptions, the description carries the full burden, and it covers the destructive path, the dry-run default, and the consent requirement well. It is incomplete on 'force', on whether a dry-run report is returned or written to a file, and on whether the file renaming/tag normalisation is undoable.
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% for both parameters. The description fully explains 'apply' (dry run vs. mutation), but 'force' is never mentioned anywhere, leaving half the parameters undocumented in both the schema and the prose. That is a meaningful gap for a destructive tool.
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 verb+resource ('Library clean-up') and enumerates the concrete sub-operations (normalise tags, drop lossy duplicates of FLACs, file as Artist/Album/NN - Title), which is far more than a restated name. It does not, however, explicitly distinguish itself from plausible siblings such as 'doctor' or 'review_candidates', so an agent must infer the boundary.
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?
It clearly states the when-to-use split for the main switch: apply=False is a dry run that writes a report, apply=True changes files. It also imposes a procedural precondition (only after the user's yes to the listed deletions). What's missing is guidance on alternatives — e.g., when to run 'doctor' or 'review_candidates' instead of tidying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_fillA
Give every entry without text its English Wikipedia lead paragraph when MusicBrainz links one (attributed,
CC BY-SA), limit entries per call. The rest come back in to_write with MusicBrainz facts and links: write
those yourself, from the facts only, and store each with wiki_write. Call again while remaining > 0.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, but the description adds substantial value beyond them: the CC BY-SA attribution obligation, the fact-only constraint for manual writes, and the iterative to_write/remaining loop contract. It still does not state auth requirements or rate limits, keeping it below a 5.
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?
Front-loads the core action in the first clause and keeps to three dense sentences with no filler. The heavy use of backticked identifiers makes it information-rich but slightly harder to scan than a cleaner breakdown would be.
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 correctly explains the return shape (to_write, remaining) and the follow-up workflow. Combined with the annotation safety profile, an agent has nearly everything needed, though permission/pagination edge cases remain unstated.
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 coverage is 0% and the single parameter has only a title and default, so the description must compensate. It does clarify that limit caps 'entries per call', but gives no range, unit nuance, or behavior when omitted beyond the default value already in the 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?
States a specific verb (fill) and resource (entries without text) and the exact content used (English Wikipedia lead paragraphs linked via MusicBrainz). It also distinguishes itself from the sibling wiki_write by explaining that the leftovers go there instead, so an agent can route correctly.
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?
Gives clear operational context: 'Call again while remaining > 0' and 'store each with wiki_write' for the entries this tool cannot fill. It does not explicitly say when NOT to use it versus wiki_todo or wiki_sources, so it falls just short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_sourcesB
Facts and links for one artist (album=None) or album: MusicBrainz type, dates, area, labels, tags, annotation, outbound links (Wikidata, Discogs, Bandcamp, homepage), and the Wikipedia lead when there is an article.
| Name | Required | Description | Default |
|---|---|---|---|
| album | No | ||
| artist | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, readOnlyHint=false, and destructiveHint=false, so the safety profile is partially covered. The description adds a useful list of returned data fields, but it does not explain why the tool is not read-only, what side effects may occur, or any network/rate-limit 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, front-loaded sentence that lists the returned data without filler. It is dense but efficient, using a parenthetical to handle the album/artist switch compactly.
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 does the work of enumerating return fields and the artist/album distinction. It omits sibling-tool context and return format details, but for a two-parameter retrieval tool those gaps are minor.
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 carry parameter meaning. It successfully clarifies that album=None selects artist-level facts and that providing an album switches to album-level data, which is the key semantic needed to invoke the tool 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 description clearly states what the tool returns (facts and links) for either an artist or an album, distinguishing both modes via album=None. It does not, however, differentiate itself from sibling tools like wiki_todo, wiki_fill, or wiki_write, so it falls short of a 5.
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 only usage hint is the parenthetical album=None, which explains parameter behavior but not when to choose this tool over alternatives. There is no explicit context, prerequisites, or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_todoB
Artists and albums in the library that have no bio / wiki text yet, with what a writer needs (tracks, year, MusicBrainz ids). Start here, then wiki_fill; write the rest yourself with wiki_sources + wiki_write.
| Name | Required | Description | Default |
|---|---|---|---|
| include_all | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=false, and destructiveHint=false, so the safety profile is mostly negative and uninformative. The description usefully discloses the return contents (tracks, year, MusicBrainz ids) but says nothing about auth requirements, whether include_all alters the result set, or side effects of the write steps it recommends.
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?
Two dense, front-loaded sentences with no filler; the resource definition comes first and the routing guidance second. The telegraphic phrasing (fragments, semicolons) is slightly terse but every clause carries information.
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 a single boolean parameter, the description covers the return contents and the downstream workflow well, but leaves include_all unexplained and omits any note on expected volume or pagination for a todo-list style tool.
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?
There is one parameter, include_all, with 0% schema description coverage, and the description never mentions it or explains what 'all' adds relative to the default. The name is suggestive but the description does not compensate for the missing schema documentation.
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 identifies a specific resource set ('artists and albums with no bio/wiki text') and the payload a caller gets back ('tracks, year, MusicBrainz ids'). The verb is implicit rather than stated ('lists'/'returns'), but the scope is clear enough to distinguish it from wiki_fill, wiki_sources, and wiki_write.
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?
It explicitly positions itself in a workflow ('Start here, then wiki_fill') and names the alternative path ('write the rest yourself with wiki_sources + wiki_write'). It stops short of a true when-not-to-use statement (e.g. how include_all changes the recommended next step), so it is strong rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_writeC
Store the text for an artist (album=None) or an album: written to a sidecar file beside the music and pushed into the player's cache. Plain text, no markup; one paragraph for an album, two for an artist; only what the sources support. attribution is shown under the text: name the sources and, if you wrote it, yourself (e.g. "Written by Claude from MusicBrainz and Discogs, 2026-09-17"). force replaces existing text.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| album | No | ||
| force | No | ||
| artist | Yes | ||
| content | Yes | ||
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, but the description says 'force replaces existing text,' which describes a destructive overwrite. This directly contradicts the annotation, forcing a score of 1 under the contradiction rule.
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 dense paragraph that front-loads the action and destination. The attribution example earns its place, though the semicolon-heavy structure is slightly run-on.
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 6-parameter write tool with no output schema and 0% schema descriptions, the description covers most behavioral and content requirements. However, it leaves url undocumented and gives no sibling-usage routing.
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 carry parameter meaning. It explains album=None, content formatting rules, attribution format, and force behavior, but it omits the url parameter entirely.
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?
States a specific verb ('Store') and resource ('text for an artist (album=None) or an album'), with a clear sidecar/cache destination. It does not explicitly differentiate itself from sibling wiki tools such as wiki_fill or wiki_sources, so it falls short of a 5.
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?
Provides formatting, content, and attribution rules, but does not say when to use this tool versus alternatives like wiki_fill or wiki_sources. No prerequisites, exclusions, or routing guidance are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_m3uB
Write the playlist as M3U8 in its original order from the local files; lists the tracks still missing.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| playlist_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, marking this as a local write with no external effect. The description adds a useful side effect (the missing tracks are listed), but says nothing about whether an existing file is overwritten, what permission/path constraints apply, or what happens when path is omitted.
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 compact sentence that front-loads the action and its ordering constraint, with the side effect appended. No filler, though it is arguably too short for the parameter gaps it must cover.
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 two-parameter mutation tool with no output schema and no enum/nested complexity, the description covers the action, the format, the ordering, and the return hint. It is still incomplete on parameter semantics and overwrite behavior, but the surface area is small.
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 coverage is 0% and neither parameter is mentioned in the description: playlist_id's meaning is left to the name, and the optional path (an anyOf string/null with a null default) is completely unexplained, so the agent cannot tell whether omitted path writes alongside the playlist or to a default location.
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?
States a specific verb (write) and resource (playlist as M3U8) plus the ordering rule and the source of truth (local files). An agent can distinguish it from siblings like sync_playlist or tidy_library, though the tool is never named against those alternatives.
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 when-to-use vs when-not guidance, no mention of a prerequisite (e.g. run after sync_playlist), and no explanation of when the optional path matters. Usage must be inferred entirely from the verb.
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.2- First observed
approve_tracks - First observed
cancel_job - First observed
doctor - First observed
get_music - First observed
queue_downloads - First observed
review_candidates - First observed
skip_tracks - First observed
status - First observed
sync_playlist - First observed
tidy_library - First observed
wiki_fill - First observed
wiki_sources - First observed
wiki_todo - First observed
wiki_write - First observed
write_m3u
TDQS
Scored across 15 tools
Two clear clusters exist (download/playlist workflow and wiki authoring), and most tools like approve_tracks vs queue_downloads vs cancel_job are cleanly separated. The wiki_* set (todo/fill/sources/write) has subtle boundary overlaps—both wiki_fill and wiki_sources return Wikipedia lead text—but descriptions disambiguate them adequately. Overall distinct purposes with only minor friction.
Mostly a consistent snake_case verb_noun pattern (get_music, sync_playlist, review_candidates, queue_downloads, write_m3u, tidy_library, cancel_job) plus a wiki_* prefix group. Minor deviations are bare nouns 'doctor' and 'status', which break the verb style but remain readable.
15 tools is within a reasonable range and each earns its place across the download pipeline and the wiki authoring flow. It sits at the top of the comfortable band given the server covers two distinct feature areas, so slightly heavy but justified.
The domain (library management, Soulseek matching/download, wiki metadata) is well covered end-to-end: health check, fetch, sync, status, review/approve/skip, queue, cancel, M3U export, and tidy. Minor gaps like no explicit library browse/search or playlist deletion are workable around, but not full lifecycle CRUD.
Maintenance
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.
Autonomous music production for AI agents with MIDI generation, QC and provenance.
- AchriomOAuthcom.achriom
Media memory for AI agents and their humans: books, movies, music, shows, anime, podcasts, games.
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceEnables Claude to search and download music files from the Soulseek peer-to-peer network using a Soulseek account.3-
- FlicenseNot gradedqualityCmaintenanceEnables music search, metadata retrieval, local audio analysis (tempo, key, energy), recommendations, song recognition, and classical work resolution via Spotify, Last.fm, AudD, MusicBrainz, and Songkick APIs.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to search and download music from the Soulseek peer-to-peer network via Nicotine+, with smart ranking of results by audio quality and peer speed, bulk automation, and real-time transfer monitoring.-
- AlicenseAqualityBmaintenanceProvides AI agents with structured access to the Soulseek network via slskd, including label and format filtering and standing wishlist searches.13MIT