Slsk Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Slsk Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
# Install dependencies
uv sync
# Run the server (stdio transport)
uv run python -m slsk_mcp.server| 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 |
Add to your MCP config (e.g. Windsurf global settings or ~/.cursor/mcp.json).
{
"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"
}
}
}
}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"
}
}
}
}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"
}
}
}
}| 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 |
| 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) |
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.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.
"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")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)"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)--remove-ft because featured artist credits vary wildly across file names and cause missed matches. 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.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=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.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.
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.maximum_peer_queue = 50 by default). Use max_queue_size=50 on search to apply the same filter.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.peer_status(username) queries their current state from the server — check for status: "online" and has_slots_free: true before downloading.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.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"].server.slsknet.org temporarily down. Verify SLSK_USERNAME/SLSK_PASSWORD. Note: Soulseek recycles usernames after 30 days of inactivity. (Soulseek FAQ)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.uv sync --extra dev
uv run pytest~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.