Skip to main content
Glama
swe-sanad

jdownloader-mcp

by swe-sanad

jdownloader-mcp

An MCP server that lets an agent drive a local JDownloader 2 through its entire download lifecycle — add links / containers, watch the linkgrabber resolve them, move them to the queue, set priority, force-start, track progress, inspect download/extract directories, and clean up.

It exists for the one download workload the shell can't already do: premium hosters, one-click hosters, .dlc/.crypt containers, and captcha-gated folder links. JDownloader stays the moat for that case — but plain video/social URLs (TikTok, YouTube, X, Instagram, Reddit, ...) are often where JD's plugins fall behind (anti-bot walls, "plugin outdated"). For those, the server also carries a yt-dlp backend and a smart_download router that tries JDownloader first and auto-falls-back to yt-dlp when a link breaks, so the agent can finish the download either way instead of stopping at "left to the shell."

Thin wrapper over myjdapi and yt-dlp; built on the mcp 1.x FastMCP API.

Status: v0.6.0 — 62 tools. monitor() is the tool for watching a queue over time: a live snapshot for polling — overall state + speed, download counts bucketed by category, active-download progress, and blocked hosts, in one call. The full v0.3 tool surface has now been exercised live against a real JDownloader 2: 24 safe tools (config, cleanup/update, variants/organize, extensions, dialogs, basic-auth/account creds reads, plus the original 34 v0.2.0 lifecycle/query/account tools) are live-verified, on top of 91+ mocked unit tests and the full smoke_test.py lifecycle. That live pass found and fixed two bugs: get_download_urls (now returns each link's url via query_links) and get_variants (now handles non-variant links gracefully) — both are now live-verified working, as is set_variant. Destructive tools (clear_linkgrabber, update_jd, restart_jd, reconnect) remain unit-tested only by design — not exercised live.

Lifecycle

add_links / add_container ─▶ LINKGRABBER ─(move_to_downloads)─▶ DOWNLOADS ─▶ extract ─▶ remove
                            list_linkgrabber                    list_downloads / force_start / wait_for

Item IDs (uuid) come from the list_* tools; most tools take package_ids / link_ids plus a stage (linkgrabber | downloads).

See Agent lifecycle below for worked tool-call flows, and the full tool reference for every parameter.

Related MCP server: mcp-yt-dlp

Tools (62)

Every tool returns {"ok": true, "result": ...} on success or {"ok": false, "error": "..."} on failure — no tool raises.

Lifecycle (16)

Tool

Parameters

Description

add_links

urls: list[str], package: str | None, destination_folder: str | None, priority: str = "DEFAULT", extract_password: str | None, download_password: str | None, autostart: bool = False

Add URLs to the linkgrabber. autostart=True moves them straight to the download queue once resolved. priority: HIGHEST..LOWEST.

add_container

container_type: str, content: str

Add a link container (container_type: DLC | RSDF | CCF) by its content.

list_linkgrabber

List linkgrabber packages+links (online/offline status) and whether JD is still collecting. Use the uuid fields to act on items.

list_downloads

List download-queue packages with progress_pct, speed, ETA, status, and save path (saveTo). The workhorse for polling.

status

Overall dashboard: state, running/paused, aggregate speed (bytes/s), premium, speed-limit state, bytes downloaded, and update_available.

wait_for

package_id: str, timeout_s: int = 60

Bounded poll of one download package (cap 120s). Returns finished / failed / stalled / still_running / not_found — finished/failed/stalled are terminal, re-call only on still_running.

move_to_downloads

package_ids: list[str] | None, link_ids: list[str] | None

Promote resolved linkgrabber items to the download queue.

control_downloads

action: str

Global queue control. action: start | stop | pause | resume.

force_start

package_ids: list[str] | None, link_ids: list[str] | None

Force the given items to download now, bypassing queue/connection limits.

set_priority

priority: str, stage: str = "linkgrabber", package_ids: list[str] | None, link_ids: list[str] | None

Set priority (HIGHEST..LOWEST) on items in the given stage (linkgrabber | downloads).

set_enabled

enabled: bool, stage: str = "downloads", package_ids: list[str] | None, link_ids: list[str] | None

Enable/disable items in the given stage (linkgrabber | downloads).

get_directories

package_ids: list[str] | None

Per-package save paths + the default download folder + extraction settings (extension enabled, custom extract path).

set_download_dir

directory: str, package_ids: list[str]

Set the download directory for the given download-queue packages.

set_extraction

enabled: bool | None, custom_path: str | None

Toggle the extraction extension and/or set a custom extract path.

remove

stage: str = "downloads", package_ids: list[str] | None, link_ids: list[str] | None, from_disk: bool = False

Remove items from a list. from_disk=True (downloads only) also deletes the files from disk.

reset

package_ids: list[str] | None, link_ids: list[str] | None

Reset download-queue items so they re-download from scratch.

Ergonomic / composite (3)

Tool

Parameters

Description

download

urls: list[str], dest: str | None, package: str | None, priority: str = "DEFAULT"

One-shot download: add URLs, auto-move to the queue, start, and return the resulting download package. The common case in a single call.

check_availability

urls: list[str]

Check whether URLs are online (and their size) WITHOUT queueing them. Resolves in the linkgrabber, reports per-link availability, then cleans up.

find

query: str

Find packages by name substring across both lists -> uuid + stage.

Accounts / premium hosters (6)

Tool

Parameters

Description

list_accounts

List premium/hoster accounts: hostname, username, valid, traffic left, expiry (-1 = unlimited/none), enabled, uuid.

list_premium_hosters

filter: str | None, limit: int = 100

List hosters JDownloader supports (optionally filtered by substring).

add_account

hoster: str, username: str, password: str

Add a premium/hoster account. The password is a hoster credential supplied by the user; it travels through the My.JDownloader relay (end-to-end encrypted) to your JDownloader instance and is never stored by this server.

remove_accounts

account_ids: list[str]

Remove hoster accounts by uuid. Irreversible — re-adding requires the credentials again.

set_account_enabled

enabled: bool, account_ids: list[str]

Enable or disable hoster accounts by uuid. Disabling can stop in-flight premium downloads that rely on the account.

refresh_accounts

account_ids: list[str] | None

Refresh hoster account status/traffic (all accounts if none given).

System / control (5)

Tool

Parameters

Description

get_storage_info

Free/total disk per drive (with free_gb and used_pct) — check before a large download.

restart_jd

Restart the JDownloader application (recovery).

get_speed_limit

Current download speed-limit state: enabled + limit in bytes/s.

set_speed_limit

enabled: bool, bytes_per_sec: int | None

Enable/disable the download speed limit and optionally set it (bytes/s).

reconnect

Trigger a router reconnect to get a new IP (resets some hoster limits).

Captcha — human-in-the-loop (3)

Tool

Parameters

Description

list_captchas

List captchas JDownloader is currently waiting on.

get_captcha

captcha_id: str

Fetch a pending captcha (image data) for a human to solve.

answer_captcha

captcha_id: str, solution: str

Submit a human-provided solution for a pending captcha.

Config (generic settings) (3)

Tool

Parameters

Description

get_config

interface: str, key: str

Read one JDownloader config value. interface is a settings interface name (e.g. org.jdownloader.settings.GeneralSettings); find keys with list_config.

list_config

filter: str | None, limit: int = 200

List JD config entries (interface/key/value), optionally filtered by substring. JD exposes ~2200 keys — always pass a filter and expect total to exceed limit.

set_config

interface: str, key: str, value: str | int | bool

Write one JDownloader config value; returns the re-read value. Use list_config/get_config first to confirm the exact interface + key.

Cleanup, update & diagnostics (8)

Tool

Parameters

Description

clear_linkgrabber

backup: bool = True

Clear the ENTIRE linkgrabber list. With backup=True (default) it first saves every link URL to a backup file (returned as backup_file) so the wipe is recoverable via restore_linkgrabber.

restore_linkgrabber

backup_file: str

Re-add links from a backup file written by clear_linkgrabber.

clean_downloads

what: str = "finished"

Remove a category of links from the download list (files stay on disk): what = finished | offline | failed | disabled | all. Use offline to purge dead "File not found" links clogging a stuck queue.

diagnose_queue

One-shot health summary of the download queue: totals, unfinished links bucketed by status and host, and pending captcha/dialog counts. The fast way to understand WHY a queue is stuck without dumping every link.

recommend

Turn the current queue state into prioritized, actionable fixes (offline links, anti-bot/plugin hosts, waiting captchas, stopped-with-pending, low disk, bad accounts). Priority 1 = most urgent. The "what should I do?" tool.

monitor

Live monitoring snapshot for polling: overall state + speed, download counts bucketed by category (downloading | pending | done | stopped | error | blocked), the currently-active downloads with progress/speed/eta, and which hosts are blocked.

wait_for_change

since: str | None = None, timeout_s: int = 600, poll_s: int = 15

Block (server-side) until the queue status changes, then return the new monitor snapshot — or {changed: false, timed_out: true} after timeout_s. The MCP polls internally, so you spend no tokens while waiting and only get woken on a real change. Pass since = the last signature you saw; omit to baseline on the current state. Call again after a timeout to keep waiting.

update_jd

Apply an available JDownloader update and restart it. Disruptive — downloads pause during the restart.

Variants & organize (5)

Tool

Parameters

Description

get_variants

link_id: str

List the variants (audio/video/quality) of a multi-variant link.

set_variant

link_id: str, variant_id: str

Select a variant (from get_variants) for a multi-variant link.

rename

new_name: str, package_id: str | None, link_id: str | None

Rename a linkgrabber package (package_id) or link (link_id).

move_to_new_package

new_name: str, package_ids: list[str] | None, link_ids: list[str] | None, dest: str | None, stage: str = "linkgrabber"

Move the given items into a new package named new_name in the given stage (linkgrabber | downloads).

get_download_urls

package_ids: list[str] | None, link_ids: list[str] | None

Get the resolved original download URLs for the given linkgrabber items.

Extensions (2)

Tool

Parameters

Description

list_extensions

List JDownloader extensions (id, name, installed, enabled).

set_extension_enabled

extension_id: str, enabled: bool

Enable or disable a JDownloader extension by id (from list_extensions).

Dialogs (3)

Tool

Parameters

Description

list_dialogs

List interactive dialogs JDownloader is currently waiting on.

get_dialog

dialog_id: str

Fetch a pending dialog's details/options.

answer_dialog

dialog_id: str, data: dict

Answer a pending dialog with a data payload (shape per the dialog type).

Basic-auth & account credentials (5)

Tool

Parameters

Description

list_basic_auth

List stored FTP/HTTP basic-auth entries.

add_basic_auth

auth_type: str, hostmask: str, username: str, password: str

Add an FTP/HTTP basic-auth entry (auth_type: FTP | HTTP). The password is a user-supplied credential; it travels the My.JDownloader relay (end-to-end encrypted) and is never stored by this server.

remove_basic_auth

auth_ids: list[str]

Remove FTP/HTTP basic-auth entries by id.

set_account_credentials

account_id: str, username: str, password: str

Update a hoster account's username/password. The password is a user-supplied credential; it travels the My.JDownloader relay (end-to-end encrypted) and is never stored by this server.

get_premium_hoster_url

hoster: str

Get the signup/premium URL for a hoster.

Escape hatch (1)

Tool

Parameters

Description

raw_action

path: str, params: list | None, http_action: str = "POST"

Call any JD API endpoint not wrapped above (e.g. premium accounts, captcha, reconnect, speed-limit). path like /downloadsV2/setPriority; params is the positional argument list that endpoint expects.

yt-dlp backend (2)

Tool

Parameters

Description

ytdlp_download

url: str, dest: str | None, audio_only: bool = False, cookies_from_browser: str | None, cookies_file: str | None

Download a URL directly via yt-dlp (thousands of video/social sites); bypasses JDownloader. For private/login-gated content pass cookies_from_browser (chrome | firefox | edge | ... — browser must be CLOSED on Windows) or cookies_file (a Netscape cookies.txt path — works while the browser is open).

smart_download

url: str, dest: str | None, audio_only: bool = False, backend: str | None, cookies_from_browser: str | None, cookies_file: str | None, jd_wait_s: int = 45

Known video/social sites (tiktok, youtube, x, instagram, reddit, ...) go straight to yt-dlp. Everything else is tried on JDownloader first; if the link breaks within jd_wait_s (offline / error / plugin-outdated / stalled) it auto-falls-back to yt-dlp. Override with backend='ytdlp'|'jd' to force one engine (strict, no fallback).

16 + 3 + 6 + 5 + 3 + 3 + 8 + 5 + 2 + 3 + 5 + 1 + 2 = 62 tools.

Agent lifecycle

JDownloader keeps two separate lists. Understanding this is the key to using the tools correctly:

  1. Linkgrabber — a staging area. add_links / add_container drop URLs here; JD resolves them (checks online/offline, size, host) in the background. Inspect with list_linkgrabber.

  2. Downloads queue — the actual download engine. Nothing downloads until an item is here. Promote resolved linkgrabber items with move_to_downloads, or add with autostart=True / use the download tool to skip straight there. Inspect and poll with list_downloads / status / wait_for.

uuid values returned by any list_* tool are the IDs (package_ids / link_ids) that every other tool expects — there is no other way to get an ID.

Config surface: JD exposes its full ~2,200-key settings tree via get_config / list_config / set_config. Don't try to enumerate it — start with list_config(filter=...) to find the interface/key you need, then get_config/set_config on that exact pair. List cleanup: once you're done with a package, clear_linkgrabber wipes the whole staging list — by default it backs up every link URL first (backup=True), so the wipe is recoverable via restore_linkgrabber(backup_file) — and clean_downloads (what = finished | offline | failed | disabled | all) removes a category of entries from the download queue (files stay on disk) — both are separate from the per-item remove tool above. Stuck queue? Call diagnose_queue first — it buckets unfinished links by status/host and surfaces pending captcha/dialog counts in one call, before you reach for list_downloads/list_captchas individually. Then call recommend() for the quickest path to an actionable next step — it turns that same queue state (offline links, anti-bot/plugin hosts, waiting captchas, stopped-with-pending, low disk, bad accounts) into a prioritized fix list. Watching a queue over time? monitor gives the same status/host buckets plus per-download progress/speed/eta for active items — it's the one to poll on an interval instead of re-calling diagnose_queue/list_downloads separately. Token-free waiting: instead of calling monitor() on a timer, call wait_for_change (optionally with since = the last snapshot's signature) — it blocks server-side and only returns when the queue actually changes or the timeout elapses, so you don't burn tokens on unchanged snapshots.

stateDiagram-v2
    [*] --> Linkgrabber: add_links / add_container
    Linkgrabber --> Linkgrabber: list_linkgrabber while resolving
    Linkgrabber --> Downloads: move_to_downloads
    Linkgrabber --> [*]: remove to discard
    Downloads --> Downloads: control_downloads / force_start / set_priority
    Downloads --> Downloads: list_downloads / status / wait_for to poll
    Downloads --> Finished: wait_for returns finished
    Downloads --> Failed: wait_for returns failed or stalled
    Finished --> [*]: remove / get_directories
    Failed --> Downloads: reset to retry
    Failed --> [*]: remove

Polling pattern: list_downloads / status are the workhorses — call them as often as you like. wait_for is a bounded convenience (hard-capped at 120s server-side); for anything longer, loop: call wait_for, and if it returns still_running, call it again. A stalled result means the item is idle with no progress (captcha / reconnect needed / all links offline) — don't re-poll blindly, investigate first (e.g. list_captchas).

"Just download this" (fire and forget)

1. download(urls=[...])              # add + auto-queue + start in one call
2. wait_for(package_id)              # poll until finished/failed/stalled
3. get_directories(package_ids)      # confirm where the files landed

For a fast preflight check without committing to a download, use check_availability(urls) first — it reports online/offline + size and leaves nothing queued (timed_out flags if the check itself ran out of time).

"Careful lifecycle" (inspect before committing)

1. add_links(urls, package="my-set")
2. list_linkgrabber()                # confirm links resolved online, get uuid
3. move_to_downloads(package_ids=[uuid])
4. force_start(package_ids=[uuid])   # or control_downloads("start")
5. wait_for(package_id=uuid)
6. remove(stage="downloads", package_ids=[uuid])   # cleanup once finished

"Manage premium accounts"

1. list_accounts()                          # see current hosters, validity, traffic
2. add_account(hoster, username, password)  # add a new one, or:
   set_account_enabled(enabled, account_ids) # temporarily disable one, or:
   refresh_accounts(account_ids)             # re-check traffic/validity

"Precondition checks" (before a large or unattended download)

1. get_storage_info()   # confirm free_gb on the target drive
2. list_accounts()      # confirm the needed hoster account is valid/enabled
3. download(urls, dest=...)

Downloading video / social (yt-dlp)

smart_download(url) is JDownloader-first with an auto-fallback to yt-dlp. Known video/social hosts (tiktok, youtube, x/twitter, instagram, facebook, reddit, vimeo, twitch, soundcloud, ...) route straight to ytdlp_download. Everything else is tried on JDownloader's download first; if that link breaks within jd_wait_s seconds (default 45 — offline / error / plugin-outdated / stalled), the failed JD entry is auto-removed and the URL falls back to ytdlp_download. The result carries "routed_to": "jd" when JD is handling it, or "routed_to": "jd->ytdlp" plus jd_outcome/jd_reason when a fallback happened. Override with backend='ytdlp'|'jd' to force one engine (strict, no fallback), or call ytdlp_download directly to skip the router.

Private/login-gated content (your own TikTok videos, members-only posts) needs cookies — pick one:

  • cookies_from_browser='chrome'|'firefox'|'edge'|... — reads that browser's cookie store directly. On Windows the browser must be closed first (it locks the cookie DB while running).

  • cookies_file='path/to/cookies.txt' — a Netscape-format cookies file exported via a "Get cookies.txt" browser extension. Works while the browser stays open.

ffmpeg must be on PATH for audio_only=True (audio extraction) and for merging separate video+audio streams on formats that need it — yt-dlp will otherwise fail or fall back to a lower-quality single-stream format.

Connection modes

Set via MYJD_CONNECT_MODE in .env (default relay):

  • relay (default) — connects via My.JDownloader, which works through NAT with no port-forwarding. myjdapi automatically upgrades data calls to a direct LAN connection when JD advertises one, so only the initial handshake actually touches the cloud. Uses MYJD_EMAIL / MYJD_PASSWORD / MYJD_DEVICE.

  • direct — pure-local via JDownloader's built-in RemoteAPI, no cloud account involved. Set MYJD_CONNECT_MODE=direct plus MYJD_DIRECT_IP (default 127.0.0.1) / MYJD_DIRECT_PORT (default 3128). Requires enabling RemoteAPI in JDownloader first (Settings → Advanced Settings, search "RemoteAPI" / "Deprecated"). It's a deprecated, more limited API that may not support every tool here — relay is the full-featured default; only use direct if you specifically need to avoid the cloud account.

Setup

  1. In JDownloader: pick a connection mode (see above). For the default relay mode, go to Settings → My.JDownloader, sign in / link the device, note its device name. For direct mode, instead enable RemoteAPI (Settings → Advanced Settings, search "RemoteAPI").

  2. Configure creds:

    cp .env.example .env   # then edit .env
  3. Install deps (already done if you used uv):

    uv sync

    Deps: mcp, myjdapi, requests, yt-dlp. For the yt-dlp backend, also put ffmpeg on PATH (needed for audio_only extraction and video+audio merges) — JDownloader-only usage doesn't need it.

Verify

uv run pytest                     # mocked unit tests (no JD needed)
uv run python smoke_test.py       # live end-to-end against your JD2 (uses .env)

The smoke test walks the whole lifecycle with a tiny file and cleans up. It SKIPs cleanly if the env vars aren't set.

Register with Claude Code

claude mcp add jdownloader -- uv run --directory E:/SWE-Pioneers/projects/jdownloader-mcp jdownloader-mcp

or add to your MCP client config (stdio):

{
  "mcpServers": {
    "jdownloader": {
      "command": "uv",
      "args": ["run", "--directory", "E:/SWE-Pioneers/projects/jdownloader-mcp", "jdownloader-mcp"]
    }
  }
}

The server reads MYJD_CONNECT_MODE plus either the relay creds (MYJD_EMAIL / MYJD_PASSWORD / MYJD_DEVICE) or the direct-mode settings (MYJD_DIRECT_IP / MYJD_DIRECT_PORT) from .env (or the environment). See Connection modes.

Docs

  • docs/2026-08-01-jdownloader-mcp-design.md — design spec.

  • docs/myjdapi-api-reference.md — exact installed-API reference the code targets.

License

MIT — see LICENSE.

Available Tools

17 tools
add_containerA

Add a link container (container_type: DLC | RSDF | CCF) by its content.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
container_typeYes

TDQS

A3.5/5.0
Behavior2/5

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

There are no annotations, and the description provides minimal behavioral context. It does not mention that this is a write operation, what happens to the added container (e.g., goes to linkgrabber), or any side effects. The word 'Add' implies mutation, but no further transparency is offered.

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 a single concise sentence that front-loads the action and resource. It avoids redundancy and includes only essential information, making it easy to scan and understand.

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 only two parameters, no output schema, and no annotations, the description is relatively complete for a simple tool. Yet it lacks context about what 'content' means, whether the container is added to a specific list, and what the expected outcome is. This leaves the agent uncertain about the exact invocation semantics.

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 0%, so the description must clarify parameters. It does add value by enumerating allowed container_type values (DLC | RSDF | CCF), which the schema does not provide as enums. However, 'content' is left vague—only described as 'by its content' without explaining what format or source is expected. Partial compensation for schema gap.

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 clearly states a specific action ('Add') applied to a specific resource ('link container'), and lists the valid container types (DLC | RSDF | CCF). It distinguishes itself from the sibling 'add_links' by targeting container files rather than plain links.

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 implies usage: use this when you have a container file to add. However, it does not explicitly contrast with alternatives like 'add_links' or state when not to use it. The guidance is implicit rather than explicit.

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

control_downloadsA

Global queue control. action: start | stop | pause | resume.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes

TDQS

A3.7/5.0
Behavior2/5

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

With no annotations, the description bears the full burden of disclosing behavior. It does not explain what each action does (e.g., does 'stop' cancel downloads or just pause them?), whether changes are reversible, or any side effects. This is a significant gap for a control tool.

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 extremely concise, front-loading the purpose ('Global queue control') and then listing the action values. Every word earns its place, with no unnecessary fluff or repetition.

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?

While the tool is simple with one parameter, the description still fails to convey important context like the effect of each action, any prerequisites, or what the tool returns. The absence of an output schema makes this more critical, but the description remains minimally adequate for a basic control action.

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 schema provides no description or enum for the 'action' parameter, but the description lists the allowed values: start, stop, pause, resume. This adds critical semantic information beyond the schema, though it does not elaborate on the meaning of each value.

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 clearly states the tool's purpose as 'Global queue control' and lists the supported actions (start, stop, pause, resume). This distinguishes it from sibling tools like force_start or set_enabled, which likely operate on individual items rather than the entire queue.

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 action list implies usage (e.g., use 'pause' to pause the queue), but the description does not explicitly explain when to use this tool versus alternatives like force_start, nor does it exclude cases where another tool would be more appropriate. The guidance is implied rather than explicit.

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

force_startA

Force the given items to download now, bypassing queue/connection limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
link_idsNo
package_idsNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the key behavioral trait: bypassing queue/connection limits and starting downloads immediately. Yet it omits side effects (e.g., impact on existing downloads, reversibility) and prerequisites, which a mutation tool should clarify. It adds some value over the name but is not comprehensive.

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 with no wasted words. It efficiently conveys the core action and qualifier, earning a top score for conciseness and clear structure.

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?

The tool is relatively simple, but with no output schema and no annotations, the description should ideally clarify return behavior, expected outcomes, or error conditions. It explains the action but leaves gaps around parameter usage and side effects, making it minimally adequate for context completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%—the description never mentions link_ids or package_ids. While the schema names are clear, the description does not explain that users can pass either or both, nor what happens if both are null. Given low schema coverage, the description should compensate but doesn't, providing minimal semantic value.

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 clearly states the action ('Force... to download now') and resource ('given items'), with a specific qualifier ('bypassing queue/connection limits') that distinguishes it from sibling tools like control_downloads or move_to_downloads. This meets the 'specific verb+resource, distinguishes from siblings' criterion.

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 'bypassing queue/connection limits' clearly implies this tool is for forcing downloads immediately, overriding normal limits—a context distinct from siblings. However, it does not explicitly mention when not to use it or name alternative tools, so it falls short of the 'explicit when/when-not/alternatives' standard for a 5.

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

get_directoriesA

Per-package save paths + the default download folder + extraction settings (extension enabled, custom extract path).

ParametersJSON Schema
NameRequiredDescriptionDefault
package_idsNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It communicates that the tool retrieves directory/settings information, which implies a read-only operation, but it does not describe behavior when package_ids is null, return format, or error cases. Some useful context is added via 'extension enabled' and 'custom extract path'.

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 a single concise fragment that wastes no words and front-loads the key content. Every element ('per-package save paths', 'default download folder', 'extraction settings') carries meaningful information.

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?

For a simple getter with one optional parameter and no output schema, the description gives a reasonable overview of the response categories. However, it lacks details about how results are structured, the effect of omitting package_ids, and whether the response is grouped per package. This leaves some gaps for an agent to handle correctly.

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 schema has one optional parameter with no description, and schema coverage is 0%. The description adds partial meaning by tying 'per-package save paths' to package_ids, but it does not clarify how package_ids affects the default folder/extraction settings or what null means. This partially compensates for the missing schema documentation.

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 lists the specific information returned (per-package save paths, default download folder, extraction settings) and the tool name 'get_directories' reinforces the retrieval purpose. It is specific and distinguishable from sibling setters, though it lacks an explicit verb.

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 tool being a getter: an agent would use it to inspect current save paths and extraction settings, as opposed to set_download_dir or set_extraction. However, there is no explicit when-to-use guidance or mention of alternatives.

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

list_downloadsA

List download-queue packages with progress_pct, speed, ETA, status, and save path ('saveTo'). The workhorse for polling.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the burden. It discloses output fields and a key behavioral trait (poll-friendly), which strongly implies a read-only, lightweight operation. It doesn't mention auth or rate limits, but for a simple list tool these are less critical.

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 action and resource, followed by a valuable usage hint. No wasted words.

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

Completeness5/5

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

For a zero-param tool with no output schema, the description provides sufficient detail: it names the main return fields and gives a clear use case. The tool is simple, and the description covers all essential aspects.

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 has zero parameters, and the description correctly doesn't discuss any. Baseline for 0 params is 4; no further elaboration needed.

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 clearly states 'List download-queue packages' with a specific verb and resource. It distinguishes from the sibling 'list_linkgrabber' by focusing on the download queue and enumerating exact fields (progress_pct, speed, ETA, status, saveTo).

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 'The workhorse for polling' gives clear usage context, implying frequent/repeated calls for progress monitoring. However, it does not explicitly mention when to prefer this over alternatives like 'status' or 'wait_for', though the name and field list imply its niche.

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

list_linkgrabberA

List linkgrabber packages+links (online/offline status) and whether JD is still collecting. Use the 'uuid' fields to act on items.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/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. It discloses the exact output content (status, collecting state, and UUIDs), which is valuable behavioral detail. The verb 'list' implicitly indicates a read-only operation, though explicit safety notes are absent.

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 two sentences with no redundancy. It front-loads the action and resource, and every word adds value—first the primary function, then the critical UUID usage note.

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

Completeness5/5

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

For a parameter-less list tool with no output schema, the description covers all essential aspects: what is listed, status details, the collecting state, and the presence of UUIDs for actions. It is sufficiently complete for an agent to use the tool correctly.

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 has zero parameters, so the description appropriately does not discuss them. The baseline for 0 parameters is 4, and the description adds no confusion by mentioning parameters that do not exist.

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 clearly states the tool lists linkgrabber packages and links with online/offline status and whether JD is still collecting. It distinguishes itself from sibling list_downloads by explicitly naming 'linkgrabber' and provides actionable output details (UUIDs).

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 description implies usage context: it is for inspecting linkgrabber items and the UUIDs are meant for subsequent actions. It does not explicitly name alternatives or exclusions, but the context is clear enough for an AI agent to know when to invoke it.

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

move_to_downloadsB

Promote resolved linkgrabber items to the download queue.

ParametersJSON Schema
NameRequiredDescriptionDefault
link_idsNo
package_idsNo

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of behavioral disclosure. It states the action ('promote') but does not disclose whether items are removed from the linkgrabber, what happens for invalid IDs, or what the return value is. The 'resolved' precondition is helpful but incomplete.

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 fluff. It is concise and readable, though slightly undersized given the tool's behavioral complexity.

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

Completeness2/5

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

With no annotations, no output schema, and only 0% parameter coverage, this description leaves major gaps: return values, side effects, selection behavior, and error handling are all omitted. It is not complete enough for reliable tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no parameter-level semantics. link_ids and package_ids are not explained—neither their relationship nor whether one is required over the other. The parameter names are somewhat self-explanatory, but the description adds no meaning beyond the schema.

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 uses a specific verb ('Promote') with a clear resource ('resolved linkgrabber items') and destination ('download queue'). It clearly distinguishes from siblings like add_links, list_linkgrabber, and control_downloads.

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 word 'resolved' implies a precondition for use, but no explicit alternatives or when-not-to-use scenarios are given. It provides some implied usage context but lacks explicit guidance compared to sibling tools.

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

raw_actionA

Call any JD API endpoint not wrapped above (e.g. premium accounts, captcha, reconnect, speed-limit). path like '/downloadsV2/setPriority'; params is the positional argument list that endpoint expects.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
paramsNo
http_actionNoPOST

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explains the path format and that params is a positional argument list, but it does not mention return values, side effects (e.g., destructive actions), error handling, or authentication requirements, which are critical for a raw passthrough tool. The 'call any endpoint' phrasing hints at broad behavior but lacks explicit safety or response info.

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 one concise, front-loaded sentence that efficiently states purpose, gives examples, and explains the key parameter. Every phrase earns its place, with no redundant or filler content.

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?

Given no output schema and no annotations, the description provides a reasonable but incomplete picture. It covers purpose and parameter semantics but omits return values and side-effect warnings, which are especially important for an arbitrary endpoint caller. The tool's simplicity and clear role prevent a lower score, but the lack of behavioral details is a notable gap.

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 description coverage is 0%, so the description compensates by explaining that params is the positional argument list and giving an example path format. It does not explain http_action, but the name and default ('POST') make it self-evident. This adds meaning beyond the bare schema.

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 clearly identifies the tool as a generic caller for any JD API endpoint not covered by dedicated wrappers, with concrete examples (premium accounts, captcha, reconnect, speed-limit). It distinguishes itself from sibling tools by explicitly positioning itself as the 'not wrapped above' fallback, making its purpose unmistakable.

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?

It states when to use: for endpoints not wrapped by other tools, and gives examples that imply alternatives (the specialized sibling tools). While it doesn't explicitly say 'use other tools for wrapped endpoints', the phrase 'not wrapped above' plus the examples provide clear usage context.

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

removeB

Remove items from a list. from_disk=True (downloads only) also deletes the files from disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNodownloads
link_idsNo
from_diskNo
package_idsNo

TDQS

B3.2/5.0
Behavior4/5

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

With no annotations available, the description discloses an important side effect: from_disk=True deletes files from disk. It also notes this applies only to downloads, which is a useful scope restriction. Missing details include whether removal is permanent, what happens to associated metadata, or required permissions, but the key destructive behavior is surfaced.

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 extremely concise: two short sentences, front-loaded with the primary purpose and one crucial qualifier. Every word contributes value with no redundancy or fluff.

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

Completeness2/5

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

Given four optional parameters, no annotations, and no output schema, the description is markedly incomplete. It fails to explain how to specify what to remove (link_ids vs package_ids), what stage options exist, or what the tool returns. An agent would struggle to construct a correct invocation beyond guessing from param names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. Only from_disk is partially explained (its effect on files), while stage, link_ids, and package_ids are left completely undefined. The description does not clarify the distinction between link_ids and package_ids or valid values for stage.

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 states the primary action ('Remove items from a list') and the from_disk qualifier, which distinguishes it from sibling tools like add_links and move_to_downloads. However, 'list' is generic and does not specify whether it targets linkgrabber or downloads, leaving some ambiguity.

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 guidance on when to use this tool versus alternatives such as reset or move_to_downloads. It only mentions a constraint (from_disk applies 'downloads only') but does not explain selection criteria or exclusions. This is insufficient for an agent to decide between siblings.

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

resetA

Reset download-queue items so they re-download from scratch.

ParametersJSON Schema
NameRequiredDescriptionDefault
link_idsNo
package_idsNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It conveys that the tool resets download state and causes re-download, but does not detail side effects like whether existing files are deleted, if downloads are immediately stopped, or if the operation is reversible. The main behavior is stated, but additional nuance is missing.

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 a single, focused sentence with no unnecessary words. It is appropriately sized and front-loaded, delivering the core function efficiently.

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

Completeness2/5

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

Given the tool has 2 optional parameters, no output schema, and no annotations, the description leaves critical ambiguities unaddressed, such as the default behavior when no parameters are provided, the relationship between link_ids and package_ids, and the exact effects of the reset operation. The description is too minimal to be considered complete for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (link_ids and package_ids) with no descriptions, and the tool description does not explain them. The parameter names hint at their purpose, but the description does not clarify how they interact, whether both can be used together, or what happens when they are null (e.g., does it reset all items?). Schema coverage is 0%, so the description should compensate but does not.

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 clearly states the tool resets download-queue items, specifying the action (reset), the resource (download-queue items), and the intended outcome (re-download from scratch). This distinguishes it from siblings like 'remove' or 'force_start'.

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 description explicitly indicates when to use the tool: when download-queue items need to be re-downloaded from scratch. It provides clear context but does not mention exclusions or alternatives, which prevents a perfect score.

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

set_download_dirC

Set the download directory for the given download-queue packages.

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryYes
package_idsYes

TDQS

C2.8/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 burden of behavioral disclosure. It states the mutation action ('set') and scope ('for the given download-queue packages') but omits details like whether existing directories are overwritten, permission requirements, side effects, or result confirmation.

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 a single, clear sentence that front-loads the core action and object. Every word contributes meaning, with no filler or redundancy.

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

Completeness2/5

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

Given the lack of annotations, no output schema, and the presence of many sibling tools with overlapping concepts, the description is not complete. It lacks usage context, behavioral caveats, and return expectations, leaving an agent under-informed for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It vaguely maps 'directory' to the target directory and 'package_ids' to 'download-queue packages', but offers no format, constraints, or behavior beyond the parameter names. This is insufficient for full understanding of parameter semantics.

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 identifies the action ('set') and resource ('download directory') for specific entities ('given download-queue packages'). It distinguishes from siblings like get_directories (retrieval) and set_extraction (different resource), though it does not explicitly name alternatives.

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 guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, when not to use it, or how it fits into a workflow. The context of setting a directory is only implicitly understood from the name and description.

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

set_enabledB

Enable/disable items in the given stage (linkgrabber | downloads).

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNodownloads
enabledYes
link_idsNo
package_idsNo

TDQS

B3.3/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 burden for behavioral disclosure. It states the toggle action but does not explain scoping behavior (e.g., whether link_ids/package_ids act as filters or targets), the effect on running downloads, or whether changes are reversible. This is insufficient for a mutation tool.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or redundancy. Every word contributes to defining the action and scope, achieving maximum brevity while remaining clear.

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

Completeness2/5

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

The tool has 4 parameters, no output schema, and no annotations, yet the description is extremely thin. It fails to clarify the role of the selection parameters (link_ids, package_ids), the default behavior when they are null, or the practical difference between 'enabled' and related sibling actions. This is inadequate for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only adds meaning for the 'stage' parameter by listing valid values, but it does not explain 'enabled', 'link_ids', or 'package_ids' beyond their names and schemas. Given 4 parameters and minimal param-level guidance, this is a significant gap.

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 clearly identifies the action ('Enable/disable') and the resource ('items in the given stage'), and explicitly enumerates valid stage values (linkgrabber | downloads). This distinguishes it from sibling tools like set_priority or control_downloads, making the primary function 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?

The description implies usage when you need to toggle item enabled-state within a specific stage, and the stage list provides some context. However, it does not explicitly state when to prefer this tool over alternatives, nor does it mention prerequisites or exclusions, leaving the guidance only implicit.

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

set_extractionC

Toggle the extraction extension and/or set a custom extract path.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledNo
custom_pathNo

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description must bear the full burden of behavioral disclosure. It only states the two actions but does not explain side effects, reversibility, requirements, or what happens when parameters are null. This is insufficient for a configuration mutation tool.

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

Conciseness4/5

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

The description is a single concise sentence that front-loads the main actions. It avoids unnecessary words, though the phrase 'and/or' is slightly awkward. It earns its place but is terse.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description should explain what the tool does beyond the bare action. It does not mention return values, behavior of null inputs, or any downstream effects. For a simple tool this is minimal but still leaves the agent with limited context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It hints at parameter roles by mentioning 'Toggle' (implying 'enabled') and 'set a custom extract path' (implying 'custom_path'), but it does not describe the parameters explicitly or explain their interaction or defaults beyond what the schema already titles.

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 clearly identifies the tool's dual function: toggling the extraction extension and setting a custom extract path. It uses specific verbs ('Toggle', 'set') and a specific resource ('extraction extension', 'custom extract path'), distinguishing it from generic sibling tools like set_enabled and set_download_dir.

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 guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or contrast with sibling tools such as set_enabled for toggling or set_download_dir for path settings. The usage context is entirely absent.

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

set_priorityB

Set priority (HIGHEST..LOWEST) on items in the given stage (linkgrabber | downloads).

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNolinkgrabber
link_idsNo
priorityYes
package_idsNo

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations, the description carries full responsibility for disclosing behavior. It mentions setting priority but does not explain effects like what happens when both link_ids and package_ids are provided, whether priority is overwritten or appended, or any side effects. It also does not describe return values or error conditions.

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 a single sentence with no filler. It front-loads the core action and includes the key scoping information (stage). Every word earns its place, and it is easy to scan.

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

Completeness2/5

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

Despite the tool having 4 parameters and no annotations/output schema, the description only covers the basic purpose and stage values. It lacks detail on parameter interactions, priority value enumeration, prerequisites, and behavioral outcomes. This is insufficient for an agent to confidently invoke the tool with correct parameter combinations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides useful context for the `stage` parameter (allowed values: linkgrabber|downloads) and mentions priority range (HIGHEST..LOWEST), but it does not explain the relationship between `link_ids` and `package_ids` (e.g., are they alternatives or combinable), nor the exact set of valid priority values. The term 'items' is vague and does not clearly map to the schema's parameters.

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 clearly states the action ('Set priority'), the resource ('items'), and the scope ('in the given stage (linkgrabber | downloads)'). This distinguishes it from sibling tools like set_enabled or set_extraction, which target different attributes.

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 implies the tool is used to set priority on items in either the linkgrabber or downloads stage, but does not explicitly mention when to use it over alternatives or any exclusion criteria. No alternative tools are named, so 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.

statusA

Overall download-controller state and aggregate speed (bytes/s).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It indicates what the tool returns but does not explicitly state that it is read-only or has no side effects. For a status tool, this is straightforward, but the description does not add behavioral context beyond the basic 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?

The description is a single, well-structured sentence that immediately conveys the essence of the tool. Every word earns its place, and there is no redundancy or 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?

Given the tool's simplicity (no parameters, no output schema), the description provides a clear overview of the return value: overall state and aggregate speed. It could be slightly more detailed about the format or structure of the state, but for a basic status tool, it is 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 has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and it does not detract from them.

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 states the resource (download-controller) and what it provides (state and aggregate speed in bytes/s). It is not a tautology and is distinct from sibling tools that perform actions like add_links or control_downloads, though it lacks an explicit verb like 'get' or 'retrieve'.

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 name 'status' and the description, but there is no explicit guidance on when to use this tool versus alternatives. Since there is no sibling status tool, the intended use is fairly evident, but no exclusions or conditions are provided.

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

wait_forA

Bounded poll of one download package (cap 120s). Returns finished/failed/ still_running/not_found — re-call on still_running.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_sNo
package_idYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the bounded nature (cap 120s), the possible return values, and the retry instruction. It is a read/poll operation and the side-effect-free nature is implied by 'poll' and 'returns', but it could be more explicit about not mutating state.

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 two sentences, front-loaded with the core action ('Bounded poll'), and every clause adds useful information—no filler. The return statuses and re-call guidance are packed efficiently.

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

Completeness4/5

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

For a simple two-parameter tool with no output schema, the description covers the essential behavior: what it polls, the timeout cap, the possible return statuses, and the retry instruction. It misses precise parameter semantics but is otherwise complete enough for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description mentions 'one download package' (mapping to package_id) and a 120s cap (relating to timeout_s), but it does not directly explain the timeout_s parameter, its units, or how it relates to the cap. It doesn't sufficiently compensate for the lack of parameter descriptions in the schema.

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 clearly states the action: 'Bounded poll of one download package' with a specific resource (download package) and a cap of 120s. It also lists the distinct return statuses, which differentiates it from sibling tools like status or list_downloads.

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?

It provides explicit usage guidance by saying 're-call on still_running', indicating a polling loop with retry behavior. It implies its use for waiting on a package rather than a one-shot check, but it doesn't explicitly name alternatives like 'status' or say when not to use it.

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. 17 tool updatesv0.1.0
    • First observedadd_container
    • First observedadd_links
    • First observedcontrol_downloads
    • First observedforce_start
    • First observedget_directories
    • First observedlist_downloads
    • First observedlist_linkgrabber
    • First observedmove_to_downloads
    • First observedraw_action
    • First observedremove
    • First observedreset
    • First observedset_download_dir
    • First observedset_enabled
    • First observedset_extraction
    • First observedset_priority
    • First observedstatus
    • First observedwait_for

TDQS

A3.7/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct operation or stage (linkgrabber vs downloads vs global controller). The only adjacent tools, force_start and control_downloads, have clearly different scopes (specific items vs global state).

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (add_links, list_downloads, set_priority). Minor deviations: status, wait_for, remove, and reset are shorter but still intuitive; no mixing of styles.

Tool Count4/5

At 17 tools, the set is on the heavier side but each tool covers a meaningful function in the download lifecycle. The count is reasonable for a full-featured download manager.

Completeness5/5

The toolkit covers the full workflow: adding, collecting, moving, controlling, prioritizing, configuring directories/extraction, and removing/resetting. The raw_action fallback ensures no endpoint is unreachable, making the surface effectively complete.

Maintenance

ActivityNo data
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers