Skip to main content
Glama
alephtheagent

slskd-mcp

slskd-mcp

A production-ready Model Context Protocol (MCP) server for slskd (the modern Soulseek client daemon).

slskd-mcp allows AI agents (such as Hermes Agent, Claude, etc.) to interact with the Soulseek P2P music sharing network directly: searching for artists, releases, and tracks, filtering by format and bitrate, managing downloads, monitoring active transfers, and browsing peer libraries.


Features

  • Soulseek Health & Status: Monitor Soulseek daemon connection, login status, server address, peer stats, and shared library size.

  • P2P Search & Smart Ranking: Search the global Soulseek network. Results are automatically ranked prioritizing peers with free upload slots, lowest queue lengths, and highest transfer speeds.

  • Format & Quality Filtering: Filter results by audio format (flac, mp3, ogg, wav, etc.) and minimum bitrate (e.g. 320 kbps).

  • Download Management: Enqueue releases or tracks directly into the slskd download directory.

  • Real-Time Transfer Tracking: Monitor live progress, download/upload speeds, percent complete, remaining bytes, and ETAs.

  • Peer Library Browsing: Browse directories and examine shared music collections of specific Soulseek users.

  • Resilient Auth & Session Handling: Native JWT authentication with automatic token caching and seamless re-authentication on expiration (401 Unauthorized), plus optional static API key support.

  • Zero-Port stdio Transport: Communicates via standard I/O streams using FastMCP for secure, local agent integration.


Related MCP server: Soulseek MCP

Requirements

  • Python 3.10+ (tested up to Python 3.14)

  • A running slskd daemon with API enabled (default: http://127.0.0.1:5030)


Installation

Option 1: Using uv (Recommended)

git clone https://github.com/alephtheagent/slskd-mcp.git
cd slskd-mcp
uv venv venv
uv pip install -e .

Option 2: Standard Python venv

git clone https://github.com/alephtheagent/slskd-mcp.git
cd slskd-mcp
python3 -m venv venv
source venv/bin/activate
pip install -e .

Configuration

The server is configured via environment variables (or a local .env file). All variables use the SLSKD_ prefix:

Environment Variable

Default Value

Description

SLSKD_URL

http://127.0.0.1:5030

Base URL of the slskd daemon

SLSKD_USERNAME

slskd

slskd Web UI / API username

SLSKD_PASSWORD

slskd

slskd Web UI / API password

SLSKD_API_KEY

(None)

Optional static API key (X-API-Key header)

SLSKD_TIMEOUT

30.0

Default HTTP request timeout (seconds)

SLSKD_SEARCH_TIMEOUT

15

Default duration for search network polling (seconds)


Tool Reference

1. slskd_status

Check slskd connection to Soulseek, connected peers, and transfer stats.

  • Parameters: None

  • Returns:

    {
      "connected": true,
      "logged_in": true,
      "username": "polymatic",
      "version": "0.26.0.0",
      "upload_speed": 8737820.0,
      "download_speed": 0.0,
      "peer_count": 0,
      "shares_directories": 18,
      "shares_files": 266,
      "server_address": "208.76.170.59:2242"
    }

2. slskd_search

Search the Soulseek network for music files, albums, or artists. Polls until responses arrive or timeout expires, then ranks and filters the results.

  • Parameters:

    • query (str, required): Search string (e.g. "Aphex Twin Selected Ambient Works" or "Sewerslvt").

    • timeout_seconds (int, optional, default: 15): Search duration (minimum 5s).

    • max_results (int, optional, default: 50): Maximum ranked results to return.

    • format_filter (str, optional): File extension filter (e.g. "flac", "mp3").

    • min_bitrate (int, optional, default: 0): Minimum bitrate threshold in kbps (e.g. 320). Lossless audio (FLAC/WAV) is preserved.

    • exclude_locked (bool, optional, default: True): Automatically exclude password-locked files and peers with closed/rejected transfers.

    • max_queue_length (int, optional, default: 500): Exclude peers whose queue exceeds this threshold. Set None to disable.

  • Returns: List of ranked file entries:

    [
      {
        "user": "plexusnexus",
        "filename": "share\\Aphex Twin FLAC\\1991 - Analogue Bubblebath 2\\01. Digeridoo.flac",
        "size": 52758120,
        "size_mb": 50.31,
        "bitrate": null,
        "has_free_upload_slot": true,
        "upload_speed": 9850632,
        "queue_length": 0,
        "is_locked": false
      }
    ]

3. slskd_download

Enqueue a file from a specific user for download.

  • Parameters:

    • username (str, required): The Soulseek peer holding the file.

    • filename (str, required): Remote file path as returned by search or browse.

    • size (int, optional, default: 0): File size in bytes.

  • Returns:

    {
      "success": true,
      "username": "plexusnexus",
      "filename": "share\\Aphex Twin FLAC\\1991 - Analogue Bubblebath 2\\01. Digeridoo.flac",
      "size": 52758120,
      "status": "queued",
      "message": "File successfully enqueued for download"
    }

4. slskd_get_transfers

List current downloads or uploads with speeds, bytes transferred, queue position, and status.

  • Parameters:

    • direction (str, optional, default: "downloads"): Either "downloads" or "uploads".

  • Returns:

    [
      {
        "id": "d7673046-70e9-4092-82f5-51739790754c",
        "username": "deathalchemy",
        "direction": "Download",
        "filename": "music\\Linkin Park\\Hybrid Theory (2000)\\01 - Papercut.flac",
        "size": 45082764,
        "state": "Completed, Succeeded",
        "percent_complete": 100.0,
        "bytes_transferred": 45082764,
        "bytes_remaining": 0,
        "average_speed": 293394.51,
        "elapsed_time": "00:02:33.6591936",
        "remaining_time": "00:00:00"
      }
    ]

5. slskd_cancel_download

Cancel or remove an active/queued transfer.

  • Parameters:

    • username (str, required): Soulseek peer username.

    • id (str, required): Transfer ID (from slskd_get_transfers).

  • Returns:

    {
      "success": true,
      "username": "deathalchemy",
      "id": "d7673046-70e9-4092-82f5-51739790754c",
      "message": "Transfer successfully removed or canceled"
    }

6. slskd_browse_user

Browse shared directory structure of a Soulseek peer.

  • Parameters:

    • username (str, required): Peer username.

    • directory (str, optional): Specific remote directory path to list. If omitted, queries the peer's root library or returns share availability.

  • Returns: Directory listing containing files, sizes, bitrates, and track lengths.


7. slskd_download_directory

Download an entire album or directory from a peer in a single batch request.

  • Parameters:

    • username (str, required): Peer username.

    • directory (str, required): Remote directory path as shared by the peer.

    • format_filter (str, optional): Extension filter (e.g. "flac", "mp3").


8. slskd_clear_transfers

Clear all completed, succeeded, or failed transfers from the download or upload transfer lists.

  • Parameters:

    • direction (str, optional, default: "downloads"): "downloads" or "uploads".


9. slskd_get_me

Get detailed metrics and statistics for our own Soulseek account (polymatic).


10. slskd_get_user_info

Fetch presence status, profile bio, free upload slots, and queue length for any Soulseek peer.

  • Parameters:

    • username (str, required): Peer username.


11. slskd_get_shares & slskd_rescan_shares

Inspect local shared folders (/var/music/flac/main, etc.) and trigger background library re-indexing.


Hermes Agent Integration

To register slskd-mcp with Hermes Agent:

echo "y" | hermes mcp add slskd-mcp \
  --command /home/aleph/slskd-mcp/venv/bin/python \
  --args /home/aleph/slskd-mcp/main.py

If slskd runs on a custom URL or credentials, pass --env before --args:

echo "y" | hermes mcp add slskd-mcp \
  --command /home/aleph/slskd-mcp/venv/bin/python \
  --env SLSKD_URL=http://127.0.0.1:5030 \
  --env SLSKD_USERNAME=slskd \
  --env SLSKD_PASSWORD=slskd \
  --args /home/aleph/slskd-mcp/main.py

Verify connection:

hermes mcp test slskd-mcp
hermes mcp list

Claude Desktop Integration

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "slskd": {
      "command": "/path/to/slskd-mcp/venv/bin/python",
      "args": ["/path/to/slskd-mcp/main.py"],
      "env": {
        "SLSKD_URL": "http://127.0.0.1:5030",
        "SLSKD_USERNAME": "slskd",
        "SLSKD_PASSWORD": "slskd"
      }
    }
  }
}

Testing

Run the test suite against a live or local slskd daemon:

./venv/bin/pytest tests/

License

MIT License. See LICENSE for details.

Available Tools

6 tools
slskd_browse_userSlskd Browse UserC

Browse shared directory structure of a Soulseek peer.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesSoulseek peer username.
directoryNoOptional specific directory path to list (e.g. 'music\AlbumName'). If omitted, attempts full peer library browse or returns peer share info.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Browse' implies read-only, but the description does not state whether it is non-destructive, whether it depends on peer availability, how long a full-library browse may take, or what happens if the peer is offline.

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

Conciseness4/5

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

A single front-loaded sentence with no wasted words. It is efficient, though its brevity is partly the cause of the missing behavioral and usage detail rather than pure tightness.

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

Completeness2/5

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

For a tool with no annotations and no output schema, the description is too thin. It does not describe what is returned (directory tree vs. share info) or how the optional directory parameter changes behavior, even though the schema hints at that distinction.

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?

Schema description coverage is 100%, so the schema already documents both username and the optional directory path with an example. The description adds no parameter-level detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

The description states a specific verb+resource: 'Browse shared directory structure of a Soulseek peer.' An agent can tell this is a read of remote peer shares, distinct from transfer-oriented siblings. However, it does not name or differentiate against siblings like slskd_search, which also discovers remote content.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites (peer online, share access), and no reference to alternatives such as slskd_search for finding files. The agent must infer the use case entirely.

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

slskd_cancel_downloadSlskd Cancel DownloadB

Cancel or remove an active/queued transfer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTransfer ID (as returned by slskd_get_transfers).
usernameYesSoulseek peer username associated with the transfer.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, yet it never discloses irreversibility, whether cancelled partial files are deleted or retained, or permission requirements. The 'cancel or remove' phrasing also leaves two distinct behaviors (stop vs. delete) conflated without explaining when each applies.

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

Conciseness4/5

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

A single short sentence with the action front-loaded and zero filler. It is efficient rather than padded, though the extreme brevity is what leaves the behavioral gaps noted above.

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

Completeness2/5

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

An output schema exists, so return values need not be explained, and the parameters are fully documented in the schema. But for a destructive mutation tool with no annotations, the description omits the operation's consequences and preconditions, leaving the agent materially under-informed.

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?

Schema description coverage is 100%, and the schema already documents both 'id' (with its source, slskd_get_transfers) and 'username'. The description adds nothing about the parameters, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb pair (cancel/remove) and a clearly bounded resource (active/queued transfer), which is unambiguous against siblings like slskd_download or slskd_get_transfers. It stops short of naming how it differs from other transfer-lifecycle tools, but the action is clear.

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

Usage Guidelines3/5

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

The qualifier 'active/queued' implies a precondition for use, so an agent can infer this only applies to in-flight or pending transfers. There is no explicit when-not guidance, no mention of what to do for completed/failed transfers, and no alternative tool routed for other transfer operations.

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

slskd_downloadSlskd DownloadC

Enqueue a file from a specific user for download.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoFile size in bytes (optional but recommended, from search results).
filenameYesThe exact remote file path as returned by search or browse.
usernameYesThe Soulseek peer's username holding the file.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Enqueue' hints at asynchronous queuing, but nothing is said about whether the peer must be online, whether queuing is idempotent, how failures surface, or what happens to an already-queued file — all material for a mutation tool.

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

Conciseness4/5

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

A single, front-loaded sentence with zero filler and no redundancy. It is efficient, though the terseness edges into under-specification for a multi-step workflow rather than wasted words.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the schema fully covers inputs. What is missing is the prerequisite workflow context (search/browse first) and any behavioral caveats, leaving the definition minimally viable rather than complete.

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?

Schema description coverage is 100%, so every parameter (username, filename, size) is already documented in the schema, including the note that size comes from search results. The description adds no parameter meaning beyond that, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb and resource ('Enqueue a file ... for download') and adds scope ('from a specific user'), which is enough to separate it from slskd_cancel_download and slskd_search. It never names a sibling or the discovery step that must precede it, so sibling differentiation is only implied.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, no alternatives. The critical workflow fact — that the filename must come from a prior slskd_search or slskd_browse_user call — appears only in the schema's parameter description, not in the tool description.

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

slskd_get_transfersSlskd Get TransfersA

List current downloads or uploads with speeds, bytes transferred, queue position, and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionNoTransfer direction to query, either 'downloads' (default) or 'uploads'.downloads

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It discloses the returned fields and the 'current' (live snapshot) nature of the data, which implies a read-only listing, but says nothing about auth requirements, pagination, or rate limits.

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?

One front-loaded sentence with zero filler; every clause (fields returned) earns its place and nothing is buried.

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-optional-parameter listing tool with an output schema, the description is sufficient — return values need not be explained. Only the missing usage/alternative guidance keeps it from being fully complete.

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?

Schema description coverage is 100% and the single param's enum-like values ('downloads'/'uploads') plus default are fully documented in the schema. The description's phrase 'downloads or uploads' merely echoes the schema without adding format or default guidance, so baseline 3 applies.

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?

States a specific verb ('List') and resource ('current downloads or uploads') and enumerates what each entry contains (speeds, bytes transferred, queue position, status). An agent can distinguish this from siblings like slskd_status or slskd_search 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.

Usage Guidelines3/5

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

Usage is implied by the content description — you call it to inspect in-flight transfers — but the description never states when to prefer it over slskd_status or slskd_download, nor any exclusions. No explicit alternative routing is provided.

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

slskd_statusSlskd StatusA

Check slskd connection to Soulseek, connected peers, and transfer stats.

Returns: Summary object containing: connected: Soulseek server connection state (boolean) logged_in: Soulseek login state (boolean) username: Logged-in Soulseek username version: slskd daemon version string upload_speed: Average upload speed (bytes/sec) download_speed: Current download speed (bytes/sec) peer_count: Number of connected peers shares_directories: Shared directory count shares_files: Shared file count server_address: Soulseek server IP and port

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/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 full burden. 'Check' implies a read-only operation and the return summary clarifies the output, but it does not state permission requirements, rate limits, or explicitly confirm that no state is modified.

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

Conciseness3/5

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

The description is front-loaded with a clear purpose, but the lengthy enumeration of return fields is redundant because an output schema already exists. It remains readable but could be trimmed without losing necessary information.

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 zero-parameter status tool with an output schema, the description is complete enough for an agent to call it correctly. The main gap is the absence of explicit usage guidance relative to sibling tools, though the diagnostic purpose is obvious.

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 takes zero parameters, so there are no parameter semantics to document. Baseline for zero parameters is 4, and the empty schema is consistent with the description.

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?

States a specific verb (Check) and resource (slskd connection to Soulseek, connected peers, and transfer stats). It is clearly distinct from sibling tools such as slskd_search, slskd_download, and slskd_get_transfers.

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

Usage Guidelines3/5

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

The purpose implies a diagnostic/status use case, but the description does not explicitly say when to use this tool versus alternatives or when not to use it. No alternatives are named, so usage must be inferred from the tool name and purpose.

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. 6 tool updatesv0.1.0
    • First observedslskd_browse_user
    • First observedslskd_cancel_download
    • First observedslskd_download
    • First observedslskd_get_transfers
    • First observedslskd_search
    • First observedslskd_status

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a clearly distinct action or resource: status for connection health, search for network-wide discovery, browse_user for peer share inspection, download for enqueueing, get_transfers for monitoring, and cancel_download for removal. The slight thematic overlap between status and get_transfers is resolved by status returning summary stats while get_transfers returns per-transfer details.

Naming Consistency4/5

All names use the same slskd_ prefix and snake_case, which is highly consistent. However, the base patterns vary: some are verb_noun (get_transfers, cancel_download, browse_user), while others are simple verbs (search, download) or a noun (status), making the set mostly but not perfectly uniform.

Tool Count5/5

Six tools is well-scoped for a focused Soulseek client wrapper, covering the core workflow from status check to search, browse, download, monitor, and cancel. No tool feels redundant or out of place, and the count avoids both thinness and bloat.

Completeness4/5

The surface covers the primary lifecycle: connection status, searching, browsing peers, enqueueing downloads, listing transfers, and cancelling transfers. Minor gaps exist, such as no dedicated tool for clearing completed transfers or managing uploads/shares, but agents can work around these with the current set.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables interaction with the Soulseek peer-to-peer file sharing network for searching files, browsing user shares, and managing downloads. Supports chat functionality including public rooms, private messages, and user monitoring.
    -
  • 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