qb-mcp
An MCP server for qBittorrent — manage torrents with natural language.
This is an unofficial project. It is not affiliated with, endorsed by, or supported by the qBittorrent project.
English | 简体中文
qb-mcp wraps the qBittorrent WebUI API v2 and exposes it as eleven tools that
an AI agent can call. It manages any number of instances, each with its own
credentials, so a single agent can drive a home NAS and a remote seedbox at once.
Why this exists
qBittorrent has a complete HTTP API but no MCP interface. Wrapping it means an agent can answer "why isn't it uploading?" by actually checking tracker health, listening ports, speed limits and peer supply — instead of guessing.
The eleven tools are grouped by user intent, not by API endpoint: mapping all 80+ endpoints one-to-one would produce a tool list no model can choose from.
Features
- Multiple instances, each with independent credentials
qb_diagnose— turns "why is nothing uploading?" into one call- Field-trimmed responses — the API returns 30+ fields per torrent; this returns 12
- Before/after reporting on every write operation
delete_filesis opt-in — removing a torrent never deletes data by default- stdio and HTTP transports
- Credentials never leave your machine; nothing is logged
Quick start
pip install qb-mcp
cp instances.example.json .instances.json
# edit .instances.json with your qBittorrent URL and credentials
chmod 600 .instances.json
qb-mcp
Configuration
qb-mcp reads .instances.json from the current directory, or the path in
QB_MCP_CONFIG.
{
"instances": {
"nas": {
"label": "Home NAS",
"url": "http://192.168.1.100:8080",
"username": "admin",
"password": "${QB_PASS_NAS}"
},
"seedbox": {
"url": "https://seedbox.example.com",
"username": "me",
"password": {"file": "~/.secrets/seedbox"}
}
}
}
| Field | Required | Default | Notes |
|---|---|---|---|
url |
✅ | — | Must start with http:// or https:// |
username |
✅ | — | Per-instance; instances may use different accounts |
password |
✅ | — | Literal, "${ENV_VAR}", or {"file": "/path"} |
label |
— | key | Display name |
verify_ssl |
— | true |
Set false for self-signed certificates |
timeout |
— | 8.0 |
Per-request timeout in seconds |
Keep .instances.json out of version control. It is already listed in
.gitignore. qb-mcp prints a warning if the file is readable by group or others.
Tools
Read (safe)
| Tool | Purpose |
|---|---|
qb_instances |
List configured instances and whether each is reachable |
qb_overview |
Global status for one or all instances |
qb_list |
Torrent list with filtering, sorting and a row limit |
qb_detail |
One torrent in depth, including tracker status |
qb_diagnose |
Explain why an instance is or is not uploading |
Write (state-changing)
| Tool | Purpose |
|---|---|
qb_control |
pause / resume / reannounce / force_start |
qb_set_limit |
Global or per-torrent speed limits |
qb_set_share |
Ratio and seeding-time limits |
qb_add |
Add from magnet, URL or a local .torrent (paused by default) |
qb_remove |
Remove torrents; delete_files is opt-in |
qb_category |
Assign categories and tags |
Client setup
stdio (Claude Desktop, Cursor, most local clients):
{
"mcpServers": {
"qbittorrent": {
"command": "qb-mcp",
"env": { "QB_MCP_CONFIG": "/absolute/path/to/.instances.json" }
}
}
}
HTTP (remote or multi-client):
qb-mcp --transport http --host 127.0.0.1 --port 17890
{
"servers": {
"qbittorrent": {
"url": "http://127.0.0.1:17890/mcp",
"transport": "streamable_http"
}
}
}
Compatibility
| qBittorrent | WebUI API | Status |
|---|---|---|
| 4.x | 2.8+ | Supported |
| 5.x | 2.11+ | Supported (tested on 5.2.4) |
Both official builds and third-party NAS packages (QNAP QPKG, Synology SPK) work, with the proxy quirks below already handled.
Troubleshooting
login rejected (Fails.)
qBittorrent returns HTTP 200 even when the password is wrong — the body is
Fails. instead of Ok.. qb-mcp inspects the body, so this message means the
credentials are genuinely wrong.
Login fails behind a reverse proxy
The official API requires Referer or Origin to match the request Host
exactly, including the port. qb-mcp sets both from your configured url,
so make sure url uses the same host and port you would type in a browser.
Works with curl but not through a proxy
Some reverse proxies (QNAP QTS is one) return 204 No Content with an empty
body on a successful login instead of 200 Ok.. qb-mcp treats any status
below 400 with an empty or Ok. body as success.
login blocked - too many failed attempts
qBittorrent temporarily bans an IP after repeated failures. Wait a few minutes, or check the WebUI's ban list.
Development
git clone https://github.com/zxw060810/qb-mcp.git
cd qb-mcp
pip install -e ".[dev]"
ruff check .
mypy src
pytest
Tests mock the qBittorrent API; no live instance is required.
License
Metadata
Release files for qb-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| qb_mcp-0.1.1.tar.gz | 60.6 kB | With provenance | Details for qb_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| qb_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for qb_mcp-0.1.1-py3-none-any.whl |
Total release size: 81.0 kB
Release files / qb_mcp-0.1.1.tar.gz
| Download URL | qb_mcp-0.1.1.tar.gz |
|---|---|
| Size | 60.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17db0f79cb0fead1b0dd8fd0e6ff577e7adaa9b703a5afb1d3ecb51e3ad4921d
|
|
BLAKE2b-256 checksum How to use checksums |
35ce93ac3dd601cf91fe45f30d06180bc17347308f887a0fd21231a87a166a33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / qb_mcp-0.1.1-py3-none-any.whl
| Download URL | qb_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 20.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5ad1c8fd55b49a3e01d8428199310df0149672b772b208f5a1906770e06b7d4a
|
|
BLAKE2b-256 checksum How to use checksums |
8397c03ead2259ae5e78574095dca0f3c6ab677bf28be65fa5edbfd3c15c80d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logSecurity for qb-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for qb_mcp-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.