Skip to main content
Glama

qbt-kit

CI status Latest PyPI version Supported Python versions MIT licence

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_call and list_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/stop resolves to pause on servers that predate the rename.

  • Typed throughout, no runtime dependency beyond httpx and typer.

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` extra

Both 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 server

As 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-kit

The 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 123

Scope 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

QBT_URL

base URL, default http://127.0.0.1:8080

QBT_API_KEY

API key (qBittorrent 5.2+); preferred when present

QBT_USERNAME

WebUI username, for cookie login on any version

QBT_PASSWORD

WebUI password

QBT_READ_ONLY

1/true/yes to refuse everything that changes state

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 Keychain

Safety

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_files is never implied.

  • --read-only (or QBT_READ_ONLY=1) blocks mutations, including via qbt_call.

  • app/setPreferences refuses 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

docs/TRACEABILITY.md

how the coverage claim is built and gated

docs/TESTING.md

the container harness, and behaviours that cost real time to learn

docs/PLAN.md

the design and the reasoning behind it

docs/ROADMAP.md

what is done and what is not

docs/REVIEW-1.md

an independent review of the plan, with every finding dispositioned

docs/dependencies.md

every dependency, and why it is justified

SECURITY.md

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/webapiVersion requires authentication. Only auth/login is 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 is QBT_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 Host port 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: Bearer to 5.0/5.1 gets a 403 that looks like a credentials problem.

  • pause/resume were removed in 5.0, not aliased; they 404 there.

  • progress: 1.0 does 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_size is 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/add with a category but without autoTMM files it in the global save path.

  • A stalled torrent is usually not slow but stuck. availability is how many complete copies exist across reachable peers; when it does not exceed progress, 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-api is 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 tools
add_torrentC

Add a torrent by magnet or URL, or several at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesmagnet or http(s) URLs
stoppedNoadd without starting
auto_tmmNoautomatic 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.
categoryNocategory to file it under
save_pathNoexplicit save path; overrides the category's

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/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, 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.

Conciseness4/5

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.

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 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNocategory name
actionNolist, create, edit or removelist
confirmNorequired for remove
save_pathNosave path for it

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesstart, stop, recheck, reannounce, force_start, unforce_start
hashesNotorrent hashes; omit for all

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

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 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashesYestorrent 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.
confirmNomust be true to proceed
delete_filesNoalso delete the downloaded data

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNofilter to one scope
mutating_onlyNoonly endpoints that change state

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNotag name
fullNoreturn every field rather than the useful subset
sortNofield to sort by, e.g. progress
limitNomaximum rows
statusNoall, downloading, seeding, completed, stopped, stalled, errored
categoryNocategory name

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashesYestorrent hashes
recheckNoverify against piece hashes afterwards; slow on large data
locationYesdestination directory

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysNolimit a read to these keys
actionNoread or writeread
valuesNopreference keys to set, for write

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, 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.

Conciseness5/5

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.

Completeness4/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 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.

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 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesscope/name, e.g. torrents/pieceStates
paramsNoendpoint parameters
confirmNorequired for destructive endpoints

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden 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.

Conciseness5/5

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.

Completeness4/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 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

server_infoB

Server version, auth mode and endpoint availability.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/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 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

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 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_completeNoalso report torrents already at 100%

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden 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.

Conciseness4/5

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.

Completeness4/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-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNotag names
actionNolist, create, delete, add or removelist
hashesNotorrents, for add and remove
confirmNorequired for delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashYestorrent hash

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/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 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.

Conciseness4/5

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.

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 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/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, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 15 tool updates
    • First observedadd_torrent
    • First observedcategories
    • First observedcontrol_torrents
    • First observeddelete_torrents
    • First observedlist_endpoints
    • First observedlist_torrents
    • First observedmove_torrents
    • First observedpreferences
    • First observedqbt_call
    • First observedsearch
    • First observedserver_info
    • First observedswarm_health
    • First observedtags
    • First observedtorrent_detail
    • First observedtransfer_status

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables 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.
    7
    3
    -
  • A
    license
    B
    quality
    A
    maintenance
    MCP 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.
    12
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server exposing qBittorrent's WebUI API v2 as tools, enabling LLMs to manage torrents, categories, tags, RSS feeds, search plugins, and application settings.
    90
    3
    MIT