Skip to main content
Glama
voidtype
by voidtype

slsk-mcp

A Model Context Protocol server that gives any MCP-capable AI assistant the ability to log in to Soulseek, search the network, and download files — all through simple tool calls.

Built on aioslsk 1.4.x.

Quick Start

# Install dependencies
uv sync

# Run the server (stdio transport)
uv run python -m slsk_mcp.server

Related MCP server: mcp-slskd

Environment Variables

Variable

Default

Description

SLSK_USERNAME

Auto-login username

SLSK_PASSWORD

Auto-login password

SLSK_DOWNLOAD_DIR

./downloads

Default download directory

SLSK_LISTEN_PORT

aioslsk default

Soulseek listening port

SLSK_OBFUSCATED_PORT

aioslsk default

Obfuscated port

SLSK_SEARCH_TIMEOUT

7

Seconds to wait for search results

SLSK_MAX_CONCURRENT_DL

3

Parallel download limit

SLSK_MAX_CONCURRENT_SEARCH

4

Parallel search ticket limit

SLSK_MAX_CONCURRENT_OPS

1

Max simultaneous socket operations

MCP Integration

Add to your MCP config (e.g. Windsurf global settings or ~/.cursor/mcp.json).

Option A — Install from GitHub (no clone needed)

{
  "mcpServers": {
    "slsk": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/voidtype/slsk_mcp.git", "slsk-mcp"],
      "env": {
        "SLSK_USERNAME": "your_username",
        "SLSK_PASSWORD": "your_password",
        "SLSK_DOWNLOAD_DIR": "/home/you/music"
      }
    }
  }
}

Option B — Local clone

git clone https://github.com/voidtype/slsk_mcp.git
{
  "mcpServers": {
    "slsk": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/slsk_mcp", "slsk-mcp"],
      "env": {
        "SLSK_USERNAME": "your_username",
        "SLSK_PASSWORD": "your_password",
        "SLSK_DOWNLOAD_DIR": "/home/you/music"
      }
    }
  }
}

Option C — pip install from GitHub

pip install git+https://github.com/voidtype/slsk_mcp.git
{
  "mcpServers": {
    "slsk": {
      "command": "slsk-mcp",
      "env": {
        "SLSK_USERNAME": "your_username",
        "SLSK_PASSWORD": "your_password",
        "SLSK_DOWNLOAD_DIR": "/home/you/music"
      }
    }
  }
}

Tools

Tool

Description

search

Search the network for files

download

Download a file from a peer

download_status

Poll download progress

cancel_download

Abort an in-progress download

peer_status

Check a peer's online status, speed, queue, and free slots

Resources

URI

Description

slsk://status

Connection state, username, passive mode

slsk://downloads

All tracked downloads with progress

slsk://search_tips

Actionable search & download strategies (sourced from Nicotine+, sldl, Soularr, SoulSync)

Tips & Tricks

Soulseek is a peer-to-peer network — every file lives on someone else's machine. These strategies are drawn from how Nicotine+, sldl, Soularr, and SoulSync handle search and download.

Tip: These strategies are also available as structured data via the slsk://search_tips resource endpoint — designed for AI agents to read programmatically.

Search Query Craft

Soulseek search works by tokenizing your query and matching against every shared filename and folder path on connected peers. The server-side algorithm is a simple word-intersection: every word you send must appear somewhere in the file's path for it to match.

  • Provide the least input that uniquely identifies the file. "Miles Davis Kind of Blue flac" is better than "jazz trumpet classic album". Include artist + album + format when known. (sldl docs: "always best to provide the least input necessary to uniquely identify an album or song")

  • Exclude junk with - (minus). Nicotine+ supports flac -live to exclude live recordings, or jazz -compilation to skip compilations. The Soulseek protocol supports excluded terms — include -term directly in the query string. (Nicotine+ search syntax docs)

  • Search matches folder names and full file paths, not just filenames. Searching "experimental" returns all files inside folders named "experimental". You can search by genre folder names, label names, or any part of the directory structure. (Soulseek Wikipedia)

  • Drop "feat." and featured artists from queries. Tools like sldl strip these with --remove-ft because featured artist credits vary wildly across file names and cause missed matches.

  • For "Various Artists" compilations, search by track name, not artist. The artist field on compilations is unreliable. sldl recommends removing the artist entirely for VA releases.

  • Partial matching with * works only at the start of a word in Nicotine+. *trance matches "psytrance" but remix* does not work. Keep this in mind if searches seem to miss results.

Search Filters

All filters are applied post-search on the result set, the same way Nicotine+, sldl, and Soularr implement them. They're available as params on the search tool:

Param

Type

Source

Example

extensions

list[str]

Nicotine+ file type filter, Soularr allowed_filetypes

["flac", "mp3"]

min_bitrate

int (kbps)

sldl pref-min-bitrate=200, Nicotine+ bitrate filter

200 or 320

min_filesize

int (bytes)

Nicotine+ min file size filter

1000000 (1 MB)

max_filesize

int (bytes)

Nicotine+ max file size filter

500000000 (500 MB)

free_slots_only

bool

Nicotine+ "Free Slot" filter (most impactful for reliability)

true

max_queue_size

int

Soularr maximum_peer_queue=50

50

min_speed

int (bytes/s)

Soularr minimum_peer_upload_speed, Nicotine+ speed filter

50000 (50 KB/s)

Note on min_bitrate: Files with unknown bitrate are kept, not rejected. The standard SoulseekQt client does not broadcast bitrate info, so rejecting unknowns would exclude many valid files. This matches sldl's behavior. (sldl docs on --strict-conditions caveat)

Timeout & Timing

  • 7 seconds is the minimum, not the ideal. For popular music 7–10s is fine. For rare/obscure content, use timeout=20 or timeout=30. sldl's --fast-search mode exits early when a good match is found, but for broad discovery you want a longer window.

  • Search results are a snapshot of who's online right now. Different peers are online at different times of day. Nicotine+'s wishlist feature re-runs searches every 90–120 minutes for this reason. If you don't find something, try again later.

  • Peak hours yield more results. The Nicotine+ docs note that searching during peak hours (evenings in the US/EU) means more peers online and more results. Off-peak searches for niche content may come back empty.

Choosing Peers (the key to avoiding "stuck at queued")

This is the single most important part. A file appearing in search results does not mean the peer will serve it to you. Tools like Soularr and SoulSync score peers before downloading.

  • has_free_slots: true is the #1 signal. Nicotine+ lets you filter results to only show users with free upload slots. Use free_slots_only=true on search, or check the field in results. If has_free_slots is false, you'll sit in their queue — potentially for hours.

  • Check queue_size. Soularr rejects peers with queue sizes above a threshold (maximum_peer_queue = 50 by default). Use max_queue_size=50 on search to apply the same filter.

  • Check avg_speed. Soularr sets a minimum_peer_upload_speed floor. Use min_speed=50000 to filter. But remember: your actual download speed is the slowest link between you and the peer (WikiHow Soulseek guide). Use speed as a tiebreaker, not a guarantee.

  • Use peer_status before committing. The peer was online during search but may have gone offline since. peer_status(username) queries their current state from the server — check for status: "online" and has_slots_free: true before downloading.

  • For full albums, pick one peer for all tracks. SoulSync calls this "source reuse for album consistency" — downloading an entire album from the same user ensures consistent encoding, tagging, and folder structure rather than getting a Frankenstein album from 12 different rippers.

  • Some peers can't connect to you (and vice versa). If you're behind NAT and so is the peer, neither side can initiate a direct connection. This is the most common cause of permanent "queued" with no position number. The only fix is to try a different peer. (Soulseek FAQ)

Downloading Strategies

  • Stuck at "queued" with no queue position? This almost always means a connectivity issue — the peer can't reach you, or you can't reach them. Cancel and try the next peer sharing the same file. (r/Soulseek: common advice across dozens of "stuck at queued" threads)

  • Set a stale timeout. Soularr uses stalled_timeout = 3600 (1 hour) to abort downloads that aren't progressing. sldl uses --max-stale-time 30 for faster iteration. Poll download_status periodically; if progress_pct hasn't moved, call cancel_download and retry from the next peer.

  • Don't be afraid to cancel and retry from a different peer. The same file is usually shared by dozens of users. Canceling a stalled download and picking the next result is the standard workflow in every Soulseek client.

  • For quality, prefer FLAC but accept fallbacks. sldl's default strategy is to prefer lossless (pref-format = flac,wav) but still accept lossy if lossless isn't available, with a minimum bitrate preference of 200 kbps. Search first with extensions=["flac"]; if count=0, retry with extensions=["flac","mp3"].

  • Don't queue tons of files from one user. Soulseek etiquette: stick to 1–2 albums at a time per user. Queuing too much may get you banned. Spread downloads across multiple peers. (WikiHow ban avoidance guide)

  • Passive mode is normal. If you're behind NAT without port forwarding, the server falls back to passive mode. Downloads still work but are relay-negotiated. Some very old clients may not support it. UPnP can help if your router supports it (WikiHow).

Troubleshooting

  • Empty search results? Check: (1) query too specific — try fewer words, (2) timeout too short — increase to 15–20s, (3) search term matches an excluded phrase, (4) very few peers share this content — try again at peak hours. (Nicotine+ troubleshooting)

  • "Login failed" on startup? Credentials wrong, or server.slsknet.org temporarily down. Verify SLSK_USERNAME/SLSK_PASSWORD. Note: Soulseek recycles usernames after 30 days of inactivity. (Soulseek FAQ)

  • Everything is slow? Increase SLSK_MAX_CONCURRENT_DL to download from more peers in parallel. Close other bandwidth-heavy apps. If your upload is saturated (someone downloading from you), it can throttle your downloads too.

  • Getting banned? Some users ban leechers. The Soulseek community expects you to share files back. Users with no shared files or very slow upload speeds may be deprioritized or banned by individual peers. (WikiHow)

Development

uv sync --extra dev
uv run pytest

Available Tools

8 tools
cancel_downloadA

Abort an in-progress download.

ONLY cancel a download if:

  • download_status shows age_seconds > 180 AND status is still 'queued' (stuck)

  • download_status shows status='failed'

  • You explicitly want to switch to a different peer

Do NOT cancel just because progress is 0% — P2P connections take 1-3 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that downloads may show 0% progress for 1-3 minutes and provides criteria for stuck/failed downloads, which is useful behavioral context. However, it doesn't describe side effects like removed files or whether cancellation 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct and front-loaded with the core action, then uses bullets for conditions and a clear warning. Every line adds value, and the formatting improves readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with minimal schema and no annotations, the description provides good usage criteria and warnings. However, it omits expected response/return value and any side effects, leaving some ambiguity for the agent. Still, the guidance is sufficient for selecting and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has a single required 'id' string with no description, and the description does not explain what the id refers to or how to obtain it (e.g., from list_downloads). It adds no meaning beyond the implicit understanding that id identifies the download.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Abort') and resource ('in-progress download'), clearly distinguishing it from sibling tools like download_status and download. It states exactly what the tool does in one line.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists three conditions under which cancellation is appropriate and one strong 'do NOT' condition (progress being 0%). It references download_status as the prerequisite check, providing clear when-to-use guidance and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connection_healthA

Check the MCP's Soulseek connection health before starting work.

Call this at the start of every session and after any suspected restart. Returns: connected, passive_mode, session_id, listening_port, p2p_reachable, session_uptime_secs, active_downloads, and a note if something needs attention.

Key fields:

  • session_id: increments on each login. If it changed since your last check, all previous download IDs are invalid — re-search and re-download.

  • p2p_reachable: false means downloads will likely fail (double-NAT). Warn the user and suggest configuring SLSK_LISTEN_PORT + port forwarding.

  • passive_mode: true means no listening port bound. Same implication as above.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the transparency burden. It explains key fields and their implications (e.g., session_id changes invalidate download IDs, p2p_reachable false indicates likely download failures) and provides actionable advice for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded, starting with the main verb and purpose. The bullet list of key fields is concise and every sentence provides essential information, with no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description thoroughly explains the return fields and their meanings. It also covers edge cases and what actions the agent should take based on the values, making the tool's behavior complete and actionable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds useful semantics about the output fields, but there are no parameters to clarify, so it cannot exceed the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks the MCP's Soulseek connection health, with a specific verb ('Check') and resource ('Soulseek connection health'). It is distinct from sibling tools like search or download, as no other tool in the context covers connection health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: 'Call this at the start of every session and after any suspected restart.' This provides clear context for when to use it, though it does not explicitly mention alternatives or when not to use it, which would warrant a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

downloadA

Download a file from a Soulseek peer.

Files are saved to the directory configured by SLSK_DOWNLOAD_DIR.

IMPORTANT: After calling this, SLEEP for at least 30 seconds (or do other productive work) before calling download_status. P2P connections take time to establish — the peer must accept, negotiate, and begin sending data. Checking immediately wastes tokens and will always show 0%.

The response includes wait_before_poll_secs — you MUST sleep/wait that many seconds before your first status poll. Do not live-poll in a loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so well. It discloses that downloads are saved to a configured directory, that P2P connections are asynchronous, and that checking immediately will show 0%. It also reveals the response includes wait_before_poll_secs, which is beyond what any schema offers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized: a one-line purpose, a single sentence on file location, and a clear 'IMPORTANT' section with imperative guidance. Every sentence adds value, and the structure naturally front-loads the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's asynchronous nature and the lack of an output schema, the description covers the key expectations: directory, timing, and the wait_before_poll_secs field. It does not mention error handling or what happens with invalid ids, but for a simple download initiation tool it provides sufficient context for an agent to act.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions (0% coverage), and the description does not explicitly define the 'id' parameter. It is inferable that the id identifies a file from a search result, but the description never states the source or format. The description fails to compensate for the missing schema detail, leaving a gap for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Download a file from a Soulseek peer.' This clearly distinguishes the tool from siblings like search, download_status, and cancel_download.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool and crucially warns about waiting 30 seconds before polling download_status. It also instructs the agent to respect wait_before_poll_secs and avoid live-polling. It stops short of naming alternative tools, but the timing guidance is explicit and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_statusA

Poll progress of an active or recent download.

CRITICAL TIMING RULES:

  • Do NOT call this within 30 seconds of starting a download.

  • status='queued' at 0% is NORMAL for the first 1-2 minutes. P2P takes time.

  • Do NOT cancel a download just because it shows queued/0%. Check age_seconds.

  • Only consider cancelling if age_seconds > 180 (3 minutes) with no progress.

  • The 'message' field contains contextual guidance — READ IT and follow its sleep recommendation before polling again. Do NOT live-poll in a tight loop.

  • If status='not_found' or status='session_expired', the download ID is stale (server restarted). You must re-search and re-download.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: initial queued status is normal, age_seconds is the metric for cancellation decisions, the message field contains actionable instructions, and stale IDs require re-download. This goes beyond simple status retrieval and prevents misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then structured into bullet-point rules. Every sentence offers actionable value, and the formatting makes scanning easy despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description thoroughly covers the download-status lifecycle: when to poll, how to interpret queued status, when to cancel, how to use the message field, and what to do on stale IDs. It equips the agent with necessary edge-case handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required parameter 'id' with no description, and the description only indirectly references it as 'download ID' in the stale-ID rule. It does not explicitly define the parameter's meaning or source, though context implies it. With 0% schema coverage, this is a modest gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Poll progress of an active or recent download,' using a specific verb (poll) and resource (download status). This clearly distinguishes it from siblings like download, cancel_download, and list_downloads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit CRITICAL TIMING RULES with when-to-use and when-not-to-use guidance, including not calling within 30 seconds, not cancelling on queued status, and following the message field's sleep recommendation. It also specifies actions for stale IDs, offering clear operational context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_configA

Return the MCP's runtime configuration (no secrets).

Use this to check where files are being downloaded, which ports are configured, concurrency limits, and the connected username.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It adds 'no secrets' to set expectations about what will not be returned, and lists the contained configuration aspects. It does not explicitly mention side effects, but 'Return' implies a read-only operation, making it reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary purpose and followed by practical usage examples. Every word contributes value, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-argument config getter, the description covers the main purpose and key contents. It stops short of specifying the exact return format, but since there is no output schema, this is a minor gap; the examples suffice for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description's enumeration of return contents adds context beyond the empty schema, making it clear what the tool provides even though no parameters are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Return the MCP's runtime configuration' with a specific verb and resource, and enumerates concrete items (download paths, ports, concurrency limits, username). This differentiates it from sibling tools like search or download.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this to check where files are being downloaded, which ports are configured, concurrency limits, and the connected username,' providing clear use cases. However, it does not name alternative tools or when not to use it, though no obvious overlap exists with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_downloadsA

List all active/queued/recent downloads in the current session.

Use this to recover state after context compaction or session resume. Returns all tracked downloads with their current status, progress, age_seconds, username, connection_state, and local_path.

Each entry includes the download ID so you can call download_status or cancel_download on specific items.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses return contents: 'status, progress, age_seconds, username, connection_state, and local_path,' and notes each entry includes the download ID. It does not mention potential limits or permissions, but for a read-only list tool this is substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each earning its place: purpose, usage scenario, return fields, and follow-up actions. It is front-loaded with the core function and avoids redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema is provided, but the description compensates by listing all return fields and explaining the recovery use case. It also tells the agent how to use the result (call download_status/cancel_download), making the tool's behavior and integration with siblings complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty, so there are zero parameters. Per the rubric, a baseline of 4 applies, and the description does not need to explain parameters. It adds no param details, but none are required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all active/queued/recent downloads in the current session,' a specific verb and resource that clearly defines the tool's scope. It distinguishes itself from sibling tools like download_status and cancel_download by focusing on listing all tracked downloads rather than acting on a specific one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this to recover state after context compaction or session resume.' It also mentions alternatives by stating the download ID enables calling download_status or cancel_download on specific items, implicitly telling the agent when to use those instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

peer_statusA

Check a peer's online status, speed, queue, and free slots before downloading.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. 'Check' implies a read-only operation, and the listed attributes (online status, speed, queue, free slots) give some insight into behavior. However, it does not disclose potential errors, auth requirements, or response format, which are ambiguous for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that directly states the tool's function and timing. Every word contributes value, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema or annotations, the description covers the core query (what status aspects are checked) and context ('before downloading'). It lacks details on return values or edge cases, but given the low complexity, this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not mention the 'username' parameter, adding no meaning beyond the schema's minimal 'Username' title. While the parameter is intuitive, the description fails to clarify its exact role (e.g., username of the peer to check).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Check') and resource ('a peer's online status, speed, queue, and free slots'), clearly distinguishing it from siblings like download_status which relates to download state, not peer state. The 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Before downloading' provides clear temporal context for when to use this tool. However, it does not explicitly mention alternatives or exclusions, though the sibling list makes the distinction from download_status implicit.

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.

  1. 8 tool updatesv0.1.0
    • First observedcancel_download
    • First observedconnection_health
    • First observeddownload
    • First observeddownload_status
    • First observedget_config
    • First observedlist_downloads
    • First observedpeer_status
    • First observedsearch

TDQS

A4.4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct capability: search finds files, download initiates transfers, download_status polls progress, cancel_download aborts, list_downloads enumerates active sessions, connection_health checks connectivity, peer_status inspects peer state, and get_config retrieves settings. There is no functional overlap between any two tools.

Naming Consistency4/5

All names use lowercase_snake_case, but the pattern mixes single verbs (search, download) with verb_noun (get_config, cancel_download, list_downloads) and noun phrases (connection_health, peer_status, download_status). While readable and predictable, it is not a strict verb_noun convention throughout.

Tool Count5/5

Eight tools is well within the ideal 3-15 range and is appropriate for a focused Soulseek client. Each tool earns its place, covering search, download lifecycle, session management, and health checks without unnecessary bloat.

Completeness5/5

The tool surface covers the full download workflow: search, initiate download, poll status, cancel, and list active/recent transfers. It also includes connection health, peer status, and config retrieval to address operational concerns. No obvious dead ends or missing core operations for a download-centric Soulseek MCP.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    MCP server for searching and downloading music from the Soulseek peer-to-peer network via slskd. Enables AI assistants to discover and download music directly.
    5
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives AI agents full control over slskd, a modern Soulseek client, enabling search, download, browse peers, monitor transfers, and manage the slskd instance.
    1
    MIT