MCP server for controlling qBittorrent torrent client via its WebUI API
This qBittorrent MCP server has 15 tools with basic functionality but significant definition gaps. Tool names follow verb_noun convention (add_torrent, delete_torrent, pause_torrent, etc.), which is correct. However, descriptions vary widely in quality and usefulness. Several tools have overly complex or multi-language descriptions (search_torrents uses Chinese). Parameters are defined with JSON Schema types and some descriptions, but many lack proper constraints, validation guidance, or error recovery hints. The add_torrent tool accepts an ambiguously-formatted 'query' parameter (supporting JSON, arrays, or raw paths) which violates the principle of constrained input, this invites LLM parsing errors. Many parameter descriptions are terse or missing practical guidance. Output schemas are not documented, making it unclear what fields agents should expect or chain into downstream tools. Error handling is absent, no recovery guidance, retryability classification, or actionable error messages. Security: credentials are injected server-side via environment variables (good), but there are no permission gates for destructive operations like delete_torrent or confirmation patterns. Overall, the server is functional but would not pass production code review.
Add torrent files to qBittorrent Args: query: Query string containing torrent file path, supports the following formats: 1. JSON string: "{\"file_paths\": [\"path/to/file1.torrent\", \"path/to/file2.torrent\"]}" 2. JSON string: "[\"path/to/file1.torrent\", \"path/to/file2.torrent\"]" 3. Single file path: "path/to/file.torrent" Returns: Status and message of the add operation
Add torrent tags Args: hash: Torrent hash value tags: Tag list, multiple tags separated by comma Returns: Result message of adding torrent tags
Add trackers to torrent Args: hash: Torrent hash value trackers: Tracker URL, multiple URLs separated by %0A Returns: Result message of adding trackers
Delete torrents from qBittorrent Args: hashes: Torrent hash values to delete, multiple hashes separated by |, or use 'all' to delete all torrents delete_files: If True, also delete downloaded files Returns: Result message of delete operation
Get qBittorrent version Returns: qBittorrent version
No output schemas documented. Tools return strings with undefined structure, forcing LLMs to parse unstructured output and guess field formats. This violates the response-shaper pattern and wastes tokens.
No error handling or recovery guidance. Tools do not document what errors are possible, whether they are retryable, or what the LLM should do next. For example, delete_torrent can fail if a hash is invalid, but no guidance is provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Get torrent list
Get torrent trackers Args: hash: Torrent hash value Returns: String containing tracker information
Pause torrents Args: hashes: Torrent hash values to pause, multiple hashes separated by |, or use 'all' to pause all torrents Returns: Result message of pause operation
Resume torrents Args: hashes: Torrent hash values to resume, multiple hashes separated by |, or use 'all' to resume all torrents Returns: Result message of resume operation
搜索种子 Args: pattern: 搜索关键词 category: 搜索类别 (all, movies, anime, books, tv, software等),默认为all plugins: 搜索插件 (all或特定插件),默认为all max_size_gb: 最大文件大小限制(GB),默认为5GB。结果会过滤掉大于此大小的文件 Returns: 搜索结果的JSON字符串,包含过滤和排序后的top 10结果,按种子数(nbSeeders)降序排列
Set file priority Args: hash: Torrent hash value id: correspond to file position inside the array returned by torrent contents API, e.g. id=0 for first file, id=1 for second file, etc. priority: Value Description 0 Do not download 1 Normal priority 6 High priority 7 Maximal priority Returns: Result message of setting file priority HTTP Status Code Scenario 400 Priority is invalid 400 At least one file id is not a valid integer 404 Torrent hash was not found 409 Torrent metadata hasn't downloaded yet 409 At least one file id was not found 200 All other scenarios
Set global download speed limit Args: limit: Speed limit value, in bytes/second Returns: Result message of setting speed limit
Set global upload speed limit Args: limit: Speed limit value, in bytes/second Returns: Result message of setting speed limit
Set torrent download speed limit Args: hash: Torrent hash value limit: Speed limit value, in bytes/second Returns: Result message of setting torrent download speed limit
Set torrent upload speed limit Args: hash: Torrent hash value limit: Speed limit value, in bytes/second Returns: Result message of setting torrent upload speed limit
Destructive operations (delete_torrent) lack confirmation or dry-run patterns. An agent can delete all torrents with a single call, no safety gate prevents catastrophic errors.
add_torrent accepts ambiguous 'query' parameter supporting three conflicting formats (raw path, JSON object, JSON array). This violates constrained-input, LLMs will struggle to choose the right format and cause parsing errors.
search_torrents description and parameter descriptions are in Chinese, making the tool inaccessible to English-speaking developers and predominantly English-trained agents. Critical for internationalization and usability.
Parameter constraints missing. Speed limit parameters (set_global_download_limit, set_torrent_download_limit, etc.) accept unbounded integers, LLMs can pass negative, zero, or absurdly large values. No min/max guidance or enum for priority levels.
get_torrent_list has no pagination support, result limits, or output schema. A request could return thousands of torrents, exhausting context and degrading LLM reasoning.
Parameter format ambiguities: add_trackers_to_torrent requires '%0A' (URL-encoded newline) separator; add_torrent_tags requires comma separation. These are non-intuitive for LLMs and should be abstracted into list-type parameters instead of delimiter-separated strings.
Descriptions are inconsistent in length and quality. Some tools (get_application_version, get_torrent_list) have trivial 1-line descriptions (< 20 chars), violating the 10-1024 char guideline. Others (set_file_priority, add_torrent) are overly complex with embedded tables.
Missing parameter validation rules in descriptions. For example, 'id' parameter in set_file_priority is typed as string but should be an integer or have explicit format guidance. 'category' and 'plugins' in search_torrents should be enums, not free-form strings.