qbt-kit
Provides tools for interacting with the qBittorrent WebUI API, enabling agents to manage torrents, categories, RSS feeds, search, transfers, application settings, logs, and sync data. Includes safety controls such as confirmation for destructive actions, read-only mode, and guarded raw endpoint access.
qbt-kit
A complete, typed Python client for the qBittorrent WebUI API — with a CLI that covers every endpoint one-to-one, and an MCP server so coding agents can drive it without deleting your data.
$ qbt coverage
qbt-kit coverage — target release-5.2.3
scope n spec progress
torrents 61 61 ████████████████████ 61/61
app 16 16 ████████████████████ 16/16
rss 14 14 ████████████████████ 14/14
search 11 11 ████████████████████ 11/11
transfer 9 9 ████████████████████ 9/9
torrentcreator 4 4 ████████████████████ 4/4
auth 2 2 ████████████████████ 2/2
clientdata 2 2 ████████████████████ 2/2
log 2 2 ████████████████████ 2/2
sync 2 2 ████████████████████ 2/2
----
TOTAL 123 123 ████████████████████ 100.0%Highlights
All 123 endpoints of qBittorrent 5.2.3, each one a spec entry that generates the client method, the CLI command and the docs together.
A verifiable coverage claim. The endpoint list is extracted from the qBittorrent C++ source per release tag and committed, so CI fails both when the spec misses an endpoint and when it invents one.
An MCP server with 15 tools — 13 task-shaped, plus
qbt_callandlist_endpoints— and safety gates that hold even through the escape hatch.Compatibility measured, not assumed — tested against real 4.6, 5.0, 5.1 and 5.2 containers, with a rename table so
torrents/stopresolves topauseon servers that predate the rename.Typed throughout, no runtime dependency beyond
httpxandtyper.
That coverage claim is worth a sentence of context. The wiki page most clients
are written against documents 78 endpoints. qBittorrent 5.2.3 ships
123, and two whole scopes — torrentcreator and clientdata — appear in
no wiki page at all.
Related MCP server: qBittorrent MCP Server
Installation
PyPI's qbt name belongs to an unrelated package, so the CLI is run via
--from:
uvx --from qbt-kit qbt doctor
uvx --from "qbt-kit[mcp]" qbt-mcp --help # the server lives in the `mcp` extraBoth run via --from because the qbt name on PyPI belongs to an unrelated
package, and qbt-mcp is a script inside this one rather than a package of its
own — uvx qbt-mcp resolves to nothing.
Or add it to a project:
uv add qbt-kit # library and CLI
uv add "qbt-kit[mcp]" # with the MCP serverAs a Claude Code plugin
This repository is also a plugin marketplace, so one line installs the MCP server and the skill together:
/plugin install qbt-kit --marketplace manueltarouca/qbt-kitThe bundled MCP server runs from the plugin's own checkout, so it needs uv
but not a published package, and it always matches the version you installed.
Point it at your server with QBT_URL, and see Configuration
for credentials.
Quickstart
qbt doctor # version, auth mode, endpoint availability
qbt torrents info --category tv # the API calls this `info`, not `list`
qbt torrents add --urls <magnet> --category tv --auto-tmm
qbt health # swarm health across the queue
qbt coverage # the endpoint coverage ledger
qbt call torrents/pieceStates -p hash=<h> # raw, reaches all 123Scope commands mirror the API exactly — torrents info, not a friendlier
list — so anything you read in qBittorrent's own docs translates directly.
--json works everywhere, so every command composes with jq.
qbt ready is also there, but it inspects the local filesystem to decide
whether a download has really settled, so it only means anything when the CLI
runs on the same machine as qBittorrent.
MCP server
{
"mcpServers": {
"qbittorrent": {
"command": "uvx",
"args": ["--from", "qbt-kit[mcp]", "qbt-mcp", "--url", "http://127.0.0.1:8080"]
}
}
}Fifteen tools rather than 123 — a tool list that long costs context
on every turn and measurably worsens which tool a model picks. qbt_call keeps
every endpoint reachable and list_endpoints lets a model discover them, so the
small surface stays complete.
Configuration
Flags first, then the environment, then the macOS Keychain:
variable | meaning |
| base URL, default |
| API key (qBittorrent 5.2+); preferred when present |
| WebUI username, for cookie login on any version |
| WebUI password |
|
|
Keychain fallback uses service qbittorrent, account api-key for a key and
webui for the password:
security add-generic-password -s qbittorrent -a api-key -w '<key>'qBittorrent has no OAuth, so there is no token flow to delegate and the
secret is long-lived. The reference MCP servers put credentials straight into
the client's env block — GITHUB_PERSONAL_ACCESS_TOKEN is the canonical
example — but that file is plaintext and frequently committed. Prefer the
Keychain, and if you do use env, reference a variable instead of pasting the
secret:
"env": {
"QBT_URL": "${QBT_URL:-http://127.0.0.1:8080}",
"QBT_API_KEY": "${QBT_API_KEY:-}" // empty falls through to the Keychain
}The :- default matters. Claude Code passes an unset ${VAR} through as the
literal text ${VAR} rather than as empty, which otherwise surfaces as a
confusing 401 much later — so qbt-mcp detects that case at startup and says
so plainly instead of starting.
On startup it reports, on stderr, where the credentials came from and never what they are:
qbt-mcp: http://127.0.0.1:8080 · WebAPI 2.15.1 · auth=bearer via macOS KeychainSafety
An agent driving a torrent client can destroy data that took weeks to collect, so the gates are code rather than guidance:
Destructive endpoints require
confirm;delete_filesis never implied.--read-only(orQBT_READ_ONLY=1) blocks mutations, including viaqbt_call.app/setPreferencesrefuses the WebUI, auth and network keys that would sever the connection or weaken security. There is no override.Refusals return a structured cause and remedy, so an agent can correct itself instead of seeing an opaque tool error.
qbt-mcp speaks stdio by default, which keeps it a child process with nothing
listening. The sse and streamable-http transports expose an
unauthenticated control surface holding your qBittorrent credentials — bound
to loopback, but do not forward those ports. See SECURITY.md.
Documentation
how the coverage claim is built and gated | |
the container harness, and behaviours that cost real time to learn | |
the design and the reasoning behind it | |
what is done and what is not | |
an independent review of the plan, with every finding dispositioned | |
every dependency, and why it is justified | |
threat model, credential handling, how to report a vulnerability |
A Claude skill ships in skills/qbt-kit/ covering CLI usage
and the swarm-health rule.
Field notes
Things that cost us time, documented so they cost you none.
Login success cannot be read from the status code. qBittorrent ≤5.1 answers a failed login with HTTP 200 and the body
Fails.; 5.2 returns an empty 204. The only rule that holds across versions is whether a session cookie was issued.app/webapiVersionrequires authentication. Onlyauth/loginis public, so you cannot read the version to decide how to authenticate. Probe instead.The session cookie is not always
SID. On 5.2 it isQBT_SID_<port>; on 5.0/5.1 it is user-configurable. Never match on the name.A bare 401 is often Host-header validation, not bad credentials. It is on by default and rejects any request whose
Hostport differs from the port qBittorrent listens on — which is what happens behind mapped container ports, SSH tunnels and most reverse proxies.API keys exist only from qBittorrent 5.2.0. Sending
Authorization: Bearerto 5.0/5.1 gets a 403 that looks like a credentials problem.pause/resumewere removed in 5.0, not aliased; they 404 there.progress: 1.0does not mean every file is on disk. Progress is computed over the selected files, so a torrent with files at priority 0 reports 100% having never fetched them.size < total_sizeis the cheap flag, from the same listing call.A category alone does not place a torrent. qBittorrent only applies a category's save path under automatic torrent management, so
torrents/addwith a category but withoutautoTMMfiles it in the global save path.A stalled torrent is usually not slow but stuck.
availabilityis how many complete copies exist across reachable peers; when it does not exceedprogress, no peer has the missing pieces. But a queued torrent reports availability 0 simply for not being connected — judging those as dead is how you delete healthy downloads.
Contributing
See CONTRIBUTING.md. The short version: endpoints are added
to the spec under src/qbtkit/spec/, never by hand to the CLI or MCP, and
tools/build_coverage.py --strict has to stay green.
Acknowledgements
qBittorrent — and specifically its
src/webui/api/*controller.cpp, which is the only complete and accurate description of this API that exists.qbittorrent-apiis the mature, well-maintained Python library for this API, and if a library is all you need, use it. qbt-kit exists for the CLI, the MCP server and the verifiable coverage claim, not because anything is wrong with it.
Licence
MIT — see LICENSE.
Available Tools
15 toolsadd_torrentC
Add a torrent by magnet or URL, or several at once.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | magnet or http(s) URLs | |
| stopped | No | add without starting | |
| auto_tmm | No | automatic torrent management. Left unset it is on when a category is given without an explicit save path, which is what makes the category's save path apply. | |
| category | No | category to file it under | |
| save_path | No | explicit save path; overrides the category's |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full behavioral burden, and it discloses almost nothing: no indication that the add starts the torrent by default, that duplicates may be rejected, whether the operation requires elevated permissions, or how failures surface. The phrase 'or several at once' hints at batch behavior but doesn't say what happens per-URL on partial failure.
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, which suits a simple add operation. It is arguably too terse for a five-parameter mutation tool, so not a perfect score.
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?
An output schema exists so return values need not be described, and all five parameters are documented in the schema. What's missing is the behavioral context a mutation tool needs: whether the add is destructive/irreversible, default start behavior, and duplicate handling.
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 100%, so baselines apply; the schema itself documents stopped, auto_tmm, category, and save_path in detail. The description only adds that urls accepts magnet or http(s) links and may be multiple, which slightly reinforces the schema without adding new meaning.
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?
Specific verb (Add) plus resource (torrent) and accepted input forms (magnet or URL), so the agent knows exactly what the call does. It does not, however, distinguish itself from siblings like control_torrents or delete_torrents beyond the verb itself.
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 statement of when to use this versus alternatives, no prerequisites, no note about duplicate torrents or auth requirements. The only implied usage is that you have a magnet/URL to submit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categoriesC
List, create, edit or remove categories.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | category name | |
| action | No | list, create, edit or remove | list |
| confirm | No | required for remove | |
| save_path | No | save path for it |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral load. It names 'remove' as an action, which implies a destructive operation, but gives no detail about permissions, reversibility, confirmation requirements, or side effects. The schema's 'confirm required for remove' is not reflected in the description.
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 with no wasted words. It is concise and structurally clear, though its brevity contributes to other completeness gaps rather than being a structural flaw.
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 a fully described schema and an output schema present, the description need not explain return values. However, for a multi-action CRUD tool, it does not clarify which parameters apply to which action or highlight the confirmation requirement for removal, leaving some inference to the agent.
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 100%, so all four parameters are already documented in the schema. The description adds no parameter-specific meaning beyond the action list, which is already captured by the 'action' parameter description.
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 specific actions (list, create, edit, remove) on a specific resource (categories), making the tool's purpose immediately clear. It does not distinguish itself from similar sibling tools such as 'tags', but the verb-resource pairing 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?
The description provides no when-to-use guidance, no conditions for choosing among list/create/edit/remove, and no references to alternatives. It simply lists possible actions without helping an agent decide which action or tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_torrentsA
Start, stop, recheck or reannounce torrents. Note that force_start makes a torrent ignore share limits, so a stop-on-complete rule stops applying to it.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | start, stop, recheck, reannounce, force_start, unforce_start | |
| hashes | No | torrent hashes; omit for all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It usefully discloses that force_start ignores share limits and can bypass stop-on-complete, but it omits permissions, side effects, idempotency, and error 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?
Two sentences, front-loaded with the core purpose and followed by a high-value caveat. There is no redundant or wasted text.
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?
The tool is simple, the schema fully documents parameters, and an output schema exists. The description covers the core actions and the key force_start caveat, though it does not mention unforce_start explicitly or broader mutation side effects.
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 100%, so the schema already documents both parameters. The description adds a useful caveat for force_start but does not add meaning for hashes beyond what the schema provides.
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 resource and action set: start, stop, recheck, or reannounce torrents. It is clearly a torrent-control tool, though it does not explicitly differentiate itself from siblings like delete_torrents or move_torrents.
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 by the listed torrent actions and the force_start caveat, but there is no explicit guidance on when to use this versus delete_torrents, move_torrents, or other siblings. Prerequisites or exclusions are not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_torrentsA
Remove torrents. delete_files is never implied: without it the data stays on disk. Requires confirm=True because it cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| hashes | Yes | torrent hashes to remove. The single value "all" targets EVERY torrent in the queue — pass explicit hashes unless wiping the whole queue is genuinely what was asked. | |
| confirm | No | must be true to proceed | |
| delete_files | No | also delete the downloaded data |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses that deletion is irreversible, that confirmation is required, and that downloaded data remains unless delete_files is set. It could say more about effects on active torrents, but the core destructive behavior is clearly communicated.
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 short sentences, front-loaded with the core action and immediately followed by the most important safety details. Every sentence earns its place.
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 destructive tool with no annotations, the description covers the critical safety behavior: irreversibility, explicit confirmation, and non-implicit file deletion. Output schema presence means return values need not be explained, and remaining 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 coverage is 100%, so the baseline is 3. The description still adds meaningful semantics by emphasizing that delete_files is never implicitly applied and that data remains on disk without it, which clarifies the practical consequence of the default.
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 verb and resource: 'Remove torrents.' It clearly identifies the tool's operation, though it does not explicitly contrast it with siblings such as control_torrents or move_torrents.
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 provides important usage constraints: delete_files is not implied and confirm=True is required. However, it does not state when to choose this tool over alternatives like control_torrents, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_endpointsA
List every endpoint qbt_call can reach, with its shape.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | filter to one scope | |
| mutating_only | No | only endpoints that change state |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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. The verb 'List' and the phrase 'with its shape' imply a side-effect-free introspection call whose result includes endpoint schemas, but the description never affirms read-only safety, required auth, or how scope/mutating_only filtering changes the result.
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?
One short sentence with the action and target front-loaded; nothing is wasted and nothing is buried.
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?
An output schema exists, so the return payload need not be described, and both parameters are documented in the schema. The description communicates the tool's purpose and its linkage to qbt_call adequately, though for an unannotated tool it could say more about it being a safe, read-only discovery call.
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 100%: the schema already documents 'scope' (filter to one scope) and 'mutating_only' (only endpoints that change state). The description adds nothing about either parameter, so the baseline of 3 applies.
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 (List) and resource (every endpoint qbt_call can reach), and explicitly ties itself to the sibling tool qbt_call, which no other sibling does. It does not distinguish itself from read-oriented siblings like server_info, but the reference to qbt_call makes its discovery role identifiable.
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 mention of qbt_call implies this is the discovery step before invoking that tool, but there is no explicit when-to-use, when-not, or named alternative. Usage is only inferable from the phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_torrentsC
List torrents, with the fields that usually matter.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | tag name | |
| full | No | return every field rather than the useful subset | |
| sort | No | field to sort by, e.g. progress | |
| limit | No | maximum rows | |
| status | No | all, downloading, seeding, completed, stopped, stalled, errored | |
| category | No | category name |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it discloses almost nothing: it doesn't say the operation is read-only, how results are paginated or ordered, or what happens with large result sets. Only the vague 'fields that usually matter' hints at return shaping.
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?
It is a single front-loaded sentence with no waste. Its brevity leans toward under-specification rather than genuine conciseness, keeping it short of a 5.
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?
An output schema exists and the input schema is fully annotated, so return values and parameters are covered elsewhere. But with no annotations and no usage guidance, the definition leaves behavioral expectations (read-only nature, ordering defaults) 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 description coverage is 100%, so all six parameters (tag, full, sort, limit, status, category) are already documented in the schema. The description adds no syntax or semantic detail beyond what the schema provides, so the baseline 3 applies.
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 verb and resource ('List torrents') and hints at a curated field subset, distinguishing it implicitly from torrent_detail. However, 'the fields that usually matter' is vague and doesn't sharpen the differentiation from its siblings.
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 guidance on when to use this versus torrent_detail, search, or list_endpoints, and no statement of exclusions or prerequisites. The agent must infer the usage context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_torrentsA
Move a torrent's data to a new location. qBittorrent performs the move and the torrent stays valid; the call returns before the move finishes. A recheck afterwards is optional because it rehashes everything.
| Name | Required | Description | Default |
|---|---|---|---|
| hashes | Yes | torrent hashes | |
| recheck | No | verify against piece hashes afterwards; slow on large data | |
| location | Yes | destination directory |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses important traits: qBittorrent performs the move asynchronously, the call returns before completion, and the torrent remains valid. It does not cover permissions, destination conflicts, failure behavior, or whether existing data at the destination is overwritten, leaving some mutation-related gaps.
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 three tight sentences with the core action front-loaded. Each sentence adds useful information about behavior or the optional recheck, with 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?
The presence of an output schema reduces the need to explain return values, and the description covers the key async behavior and torrent validity. It still omits some operational details relevant to a mutation tool with no annotations, such as destination requirements and conflict handling.
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 100%, so the parameters are already documented clearly. The description reinforces that recheck is optional and rehashes data, but it does not add substantial meaning beyond the schema beyond that rationale.
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 verb and resource: moving a torrent's data to a new location. It clearly distinguishes this action from sibling tools like add_torrent, delete_torrents, and control_torrents, which do not move existing data.
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 description gives some usage guidance by saying a recheck afterwards is optional and why, but it does not explicitly say when to use move_torrents versus alternatives or describe prerequisites. The intended use is implied by the clear purpose rather than stated with explicit comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preferencesA
Read preferences, or write a subset. Keys that would sever this connection or weaken the server's security (WebUI port, password, host-header validation and similar) are refused outright, with no override.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | No | limit a read to these keys | |
| action | No | read or write | read |
| values | No | preference keys to set, for write |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a genuinely important behavioral trait: security-sensitive keys (WebUI port, password, host-header validation) are refused with no override. It does not cover auth requirements, whether writes persist or need a restart, or side effects, but the refusal disclosure is substantive non-obvious context.
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 with the core action front-loaded and the safety constraint second. Nothing is wasted and the structure leads with what the tool does.
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?
An output schema exists, so return values needn't be explained, and all three params are documented in the schema. The description adds the critical refusal behavior, leaving only auth/persistence details as minor 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 description coverage is 100%, so the schema already documents keys, action, and values. The description only loosely echoes 'subset'/'read/write' without adding format or syntax detail beyond the schema, so the baseline 3 applies.
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 dual-mode verb (read/write) on a specific resource (preferences) and clarifies that writes apply only to a subset. This clearly sets it apart from the torrent-management siblings, though it never names an alternative tool explicitly.
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 by 'read preferences, or write a subset,' and the refusal rule hints at when writes will fail, but there is no explicit guidance on when to choose this tool over qbt_call or other siblings, nor any stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qbt_callA
Call any qBittorrent endpoint directly as scope/name, for anything the tools above do not cover. Parameters are validated against the endpoint spec, and the same safety gates apply: destructive endpoints need confirm, and read-only mode refuses anything that mutates state.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | scope/name, e.g. torrents/pieceStates | |
| params | No | endpoint parameters | |
| confirm | No | required for destructive endpoints |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that params are validated against the endpoint spec, that destructive endpoints require 'confirm', and that read-only mode refuses state-mutating calls. It does not describe error behavior or pagination, but the safety-gate disclosure is substantive and non-obvious.
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 with no filler. The fallback purpose is front-loaded in the first clause and the safety behavior follows, so an agent gets the key facts immediately.
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?
An output schema exists, so return values need not be explained, and the description covers purpose, routing, validation, and safety gates. What remains thin is guidance on malformed paths or how endpoint-specific params are shaped, but nothing essential to invoking it correctly 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?
Schema description coverage is 100%, so path, params, and confirm are already documented in the schema; baseline is 3. The description only reinforces the 'scope/name' path format and the confirm-for-destructive rule, adding little beyond what structured fields already state.
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 and resource ('Call any qBittorrent endpoint directly as scope/name') and explicitly positions itself as the fallback: 'for anything the tools above do not cover.' An agent can distinguish it from the specific siblings like list_torrents or add_torrent without opening any 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?
The phrase 'for anything the tools above do not cover' clearly conditions when to reach for this generic tool instead of the purpose-built siblings, which is exactly the routing decision an agent faces. It stops short of naming a specific sibling or listing explicit exclusions, so it is clear context rather than a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Run a plugin search: start it, poll until it settles, return the results. Requires qBittorrent to have search plugins installed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | maximum results | |
| pattern | Yes | what to search for | |
| plugins | No | plugin names, "all" or "enabled" | enabled |
| category | No | category or "all" | all |
| wait_seconds | No | how long to poll |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the important behavior: this is an asynchronous start-and-poll operation rather than a single blocking lookup. It still omits failure behavior when plugins are missing, whether an unfinished search can be re-polled later, and any result persistence.
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 short sentences with no waste; the operation and its prerequisite are front-loaded and nothing is repeated from the schema.
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?
An output schema exists, so return values need no explanation, and the async polling behavior plus plugin prerequisite are covered. The description is adequate for a 5-parameter tool; only edge-case behavior (plugin absent, polling timeout with no settle) is left unaddressed.
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 100%, so all five parameters are already documented in the schema and the baseline is 3. The phrase 'poll until it settles' hints at how wait_seconds bounds polling, but the description adds no format or selection guidance beyond 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?
Specific verb+resource ('Run a plugin search') plus a clear lifecycle summary (start, poll, return results). It implicitly distinguishes itself from the torrent-listing siblings by saying 'plugin search', but never names an alternative tool, so an agent still has to infer that this is not a torrent lookup.
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?
States a precondition ('Requires qBittorrent to have search plugins installed'), which is genuinely useful context for deciding whether the call will work. However, it gives no when-to-use guidance relative to siblings such as qbt_call or list_torrents, and no when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoB
Server version, auth mode and endpoint availability.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden, and it does not explicitly state that this is a side-effect-free read or that no authentication beyond the configured mode is needed. It does disclose the categories of information returned (version, auth mode, endpoint availability), which is behavioral value beyond the schema's empty property list, but permissions and safety profile remain unstated.
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 fragment with no filler, and the key content categories are front-loaded. It is appropriately sized for a trivial no-argument tool, though the telegraphic style stops just short of a fully self-contained 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?
With an output schema present, the description need not enumerate return values, and with zero parameters there is no input surface to document. What remains missing is the safety/auth framing that would normally come from annotations, but for a low-risk read-only info call the current text is close to sufficient.
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?
The tool takes zero parameters, so the baseline of 4 applies. Schema coverage is reported at 100% and there is nothing parameter-wise for the description to compensate for.
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 the three things the tool reports (server version, auth mode, endpoint availability), which is enough for an agent to recognize it as a server-level diagnostics tool and to distinguish it from siblings like transfer_status and list_endpoints. It is a noun phrase rather than a verb+resource, but for a zero-parameter info tool that still communicates purpose effectively.
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 or when-not-to-use guidance and no sibling is named as an alternative. The context is only implied by the tool's content, so an agent must infer on its own whether to reach for server_info versus transfer_status or list_endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swarm_healthA
Judge whether each torrent can actually finish. availability is how many complete copies exist across reachable peers; when it does not exceed progress, no peer holds the missing pieces and the download can never complete however long it waits. Queued torrents are excluded because they report availability 0 simply for not being connected yet. progress is relative to the selected files, so partial_selection marks torrents that are 100% yet never fetched their deselected files.
| Name | Required | Description | Default |
|---|---|---|---|
| include_complete | No | also report torrents already at 100% |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it defines what availability means (reachable complete copies), the availability-vs-progress failure condition, why queued torrents are filtered out (reported 0 from disconnection), and what partial_selection indicates. It is a read-oriented diagnostic, so the lack of mutation/auth notes is minor.
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 dense sentences, front-loaded with the core question, followed by the definitions an agent needs to interpret availability and progress. No filler, though the partial_selection sentence is packed tightly.
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?
An output schema exists, so return-format explanation is unnecessary, and the single parameter is fully documented in the schema. The description supplies the domain semantics (availability vs progress, exclusions) needed to read results, leaving little an agent would need to guess.
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?
The single parameter include_complete has 100% schema description coverage, so the baseline is 3. The description doesn't explicitly address the parameter, though its framing around 100%/partial_selection torrents implicitly relates to why complete torrents are normally hidden.
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?
Opens with a specific diagnostic goal — 'Judge whether each torrent can actually finish' — which is clearly distinct from listing tools like list_torrents or torrent_detail. It never names a sibling to route against, but the verb+resource (swarm completion feasibility per torrent) 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 implied rather than stated: it explains that queued torrents are excluded and why, and that availability<=progress means it can never finish, which tells the agent when the tool is meaningful. However, there is no explicit 'use this rather than X' guidance against the many sibling torrent tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tagsC
List, create, delete, add or remove tags.
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | tag names | |
| action | No | list, create, delete, add or remove | list |
| hashes | No | torrents, for add and remove | |
| confirm | No | required for delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies mutation by listing create/delete/add/remove but never states that delete is destructive or irreversible, that 'confirm' is mandatory for deletion, or whether any permission is needed.
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 short sentence, front-loaded with the resource and all supported actions, with zero filler. It is efficient, though the terseness borders on under-specification for a five-action tool.
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 four optional parameters, no annotations, and an output schema that covers return values, the description is minimally adequate. It omits the action-to-argument mapping and the destructive/confirm behavior, which a multi-action mutation tool should surface.
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 100%, so all four parameters are documented in the schema itself (names, action, hashes 'for add and remove', confirm 'required for delete'). The description contributes nothing about argument semantics, which is acceptable at baseline when the schema is complete but earns no credit.
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 the resource (tags) and enumerates five operations, so the agent knows it is a tag-CRUD multiplexer. However, it is a bare verb list with no indication of what each action targets, and it does nothing to distinguish itself from the sibling 'categories' tool, which is a near-identical concept.
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 guidance on when to choose this tool over 'categories', nor on which arguments each action requires. The verb list mirrors the 'action' enum in the schema, so it adds no routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
torrent_detailB
Properties, trackers and files for one torrent.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes | torrent hash |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure, and it says nothing about read-only safety, authentication needs, or whether the hash must reference an existing torrent. It discloses the returned data categories but no operational 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?
A single compact sentence with no filler, front-loading the returned content. It is efficient, though the fragment style omits the action verb that would make it fully self-contained.
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?
An output schema exists, so return values need not be explained, and the one parameter is fully documented in the schema. However, with zero annotation coverage the description should say more about the read-only nature and the requirement that the hash identify an existing torrent.
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 100% with a single 'hash' parameter documented in the schema, so the baseline is 3. The description adds no format, source, or validity detail beyond what the schema already provides.
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 the resource (a torrent) and enumerates the specific data returned (properties, trackers, files), so an agent knows exactly what this tool produces. It lacks an explicit verb and does not name a sibling, but 'for one torrent' does distinguish it from list_torrents.
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 singular 'one torrent' suggests this is the detail view versus the list view in list_torrents, but the description never states when to choose this tool or what precondition (a known hash) is required. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_statusB
Global transfer rates, limits and connection status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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, yet it only lists the returned data categories. It never states that this is a read-only, side-effect-free call, nor mentions any auth or rate-limit considerations, leaving the agent to infer the safety profile.
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 fragment with zero filler. Everything present contributes to identifying the tool's data scope, and nothing is wasted.
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 parameters and an output schema that already documents the return structure, the description only needs to identify the data scope, which it does. It could still note the read-only nature, but that gap is minor given the simplicity of the 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?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify about inputs beyond what the empty schema already conveys.
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 enumerates what the tool surfaces: global transfer rates, limits, and connection status. It is a noun phrase rather than a verb+resource construction and offers no differentiation from potentially overlapping siblings like server_info or swarm_health, 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?
There is no indication of when to call this tool versus alternatives such as server_info, list_endpoints, or swarm_health, nor any prerequisites. The agent must infer usage from the generic name and the data categories alone.
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
- First observed
add_torrent - First observed
categories - First observed
control_torrents - First observed
delete_torrents - First observed
list_endpoints - First observed
list_torrents - First observed
move_torrents - First observed
preferences - First observed
qbt_call - First observed
search - First observed
server_info - First observed
swarm_health - First observed
tags - First observed
torrent_detail - First observed
transfer_status
This server cannot be deployed
TDQS
Scored across 15 tools
Each tool targets a distinct resource or concern (list vs detail vs swarm health vs control vs move vs delete), and the status/config tools are clearly separated. The main soft overlap is qbt_call acting as an escape hatch for anything the others cover, but it is explicitly framed as a fallback, so the boundaries stay readable.
There is a mix of verb_noun tools (list_torrents, add_torrent, delete_torrents, move_torrents, control_torrents), noun-phrase tools (torrent_detail, transfer_status, server_info, swarm_health), and bare-noun names (categories, tags, preferences, search). Plural bulk nouns versus a singular add_torrent and the multi-action bundle names break a uniform pattern.
15 tools sits at the top of the well-scoped range and each maps to a real qBittorrent capability. Multi-action tools (categories, tags, control_torrents, preferences) sensibly bundle related operations instead of exploding the count.
Core lifecycle is covered: list, detail, add, control, move, delete, plus transfer/server status, categories, tags, preferences, and search. Gaps exist for RSS feed/automation-rule management and per-torrent file/peer priority, though qbt_call provides a raw fallback for those.
Maintenance
Related MCP Connectors
QuLab MCP remote server (Streamable HTTP) for computational science and lab tools.
Jikan MCP — wraps the Jikan v4 API (anime/manga data, free, no auth)
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Related MCP Servers
- AlicenseBqualityCmaintenancePython wrapper & MCP server for the rqbit API83MIT
- FlicenseAqualityDmaintenanceEnables interaction with qBittorrent through its Web API to search for torrents using search plugins and manage downloads. Supports torrent searching, downloading via URLs/magnet links, and torrent management operations like pause, resume, and delete.73-
- AlicenseBqualityAmaintenanceMCP server that exposes qui's JSON REST API as tools for monitoring and managing qBittorrent instances, torrents, automations, cross-seeding, RSS, backups, and related services.12MIT
- AlicenseAqualityAmaintenanceMCP server exposing qBittorrent's WebUI API v2 as tools, enabling LLMs to manage torrents, categories, tags, RSS feeds, search plugins, and application settings.903MIT