Skip to content

mcp server

Alexander Herling edited this page Oct 15, 2026 · 24 revisions

MCP server

rDownloader carries a built-in Model Context Protocol server at /mcp, over Streamable HTTP, on the same port as the web interface. An AI assistant — Claude Code, Claude Desktop, ChatGPT Desktop, any MCP client — can drive the queue and the configuration through it.

It exposes 265 tools.

Setting it up

Settings → Clients & API on its API & MCP tab, beside Desktop and Browser: creating an API token for chosen permission areas, beside the active tokens

Create an API token under Settings → Clients & API → API & MCP, or during the setup wizard. It is shown once and stored only as a SHA-256 digest. Expires sets how long it lasts — Never, the default, or 7, 30, 90 or 365 days; an expired token is refused like a revoked one and stays in the list marked Expired until you revoke it (API tokens). Calls per minute limits how often the token may call — REST and MCP together, every MCP message counted; empty is no limit. A call above it is answered 429 with the stable code api.token_rate_limited and a Retry-After saying how many seconds are left of the minute. The limit is changed with the pencil in the token list; no tool can change it, so an assistant cannot lift the limit it runs under.

claude mcp add --transport http rdownloader http://127.0.0.1:8710/mcp \
  --header "Authorization: Bearer <TOKEN>"

Clients configured through a dialog

Clients that ask for the header value rather than a command line — the ChatGPT desktop app among them — often want an environment variable holding it. That variable must contain the complete Bearer <TOKEN>, and the token panel offers it in exactly that form, ready to copy.

Configure exactly one source for the Authorization header. When a client sends two, only the first is read — so a correct token in second place never arrives, and the refusal is indistinguishable from a wrong token.

ChatGPT Desktop on Windows

Create a Windows user environment variable:

  • Name: RDOWNLOADER_AUTH_HEADER
  • Value: Bearer <NEW_TOKEN>

Then in %USERPROFILE%\.codex\config.toml:

[mcp_servers.rdownloader]
url = "http://127.0.0.1:8710/mcp"
env_http_headers = { Authorization = "RDOWNLOADER_AUTH_HEADER" }
enabled = true
default_tools_approval_mode = "prompt"

When a token is refused

A refused token is logged. The line names what arrived — no header, a non-bearer header, an empty bearer (an environment variable that did not resolve), several Authorization headers, an unknown token, or a token holding no API scope — together with the first eight characters of the token's SHA-256 digest, to match against the token list.

The token itself is never written to the log. Raise the level with RUST_LOG=rd_api=warn if the default filter has been narrowed.

The tools

Everything the interface can do, the toolbox can do too — with a listing tool first wherever an action needs an id, so an assistant never has to guess one. What stays out is listed under What is deliberately not a tool.

Downloads and the queue (12)

add_downloads (paused creates them paused) · list_downloads · get_download · get_download_sources (a Metalink download's mirrors and their state) · control_downloads (pause/resume/cancel/remove) · get_status_summary · list_packages · delete_packages · export_packages (packages of the list or the LinkGrabber as an .rdlinks or .crawljob file, answered as text; an optional passphrase encrypts it and is never echoed back) · reresolve_downloads (drops a download's binding to the plugin version that first resolved it, so the next start uses the one installed now; with check_now it resolves the files at once and answers each file's name, size and status, links of a hoster without an account skipped and counted) · search_queue (packages and files by part of their name, without reading the whole queue; the ids work with every other tool here) · set_package_start_after (holds a package's waiting files back until a moment; without one, the hold is removed)

Pausing for a while, bandwidth profiles and download windows (12)

pause_queue (for minutes or until a time; resumes by itself) · get_queue_pause (also the schedule's pause, schedule_pause: the profile that pauses downloads and until when) · resume_queue · get_bandwidth_status (the active profile, and whether the schedule or a switch by hand chose it) · list_bandwidth_profiles (with pause_downloads) · switch_bandwidth_profile (until the schedule's next change, a time, or until switched back; the way to download now anyway while a profile pauses downloads) · return_to_bandwidth_schedule · get_package_speed_limit · set_package_speed_limit (one package's own download limit; refused for a package holding a torrent) · get_package_download_window (a package's own window, its category's, and whether the window or the schedule holds it now) · set_package_download_window (weekly spans and ignore the schedule's pause; without a window, the package follows its category again) · set_category_download_window (the window a category's packages follow)

Queue order, renaming and unpacking (12)

reorder_packages · reorder_downloads · rename_download · update_package · update_packages · rename_package_folder · clear_finished_packages · extract_downloads · extract_packages (unpack on demand) · get_package_postprocess · set_stop_mark (pauses the queue once a download or package is done; one mark at most) · clear_stop_mark

LinkGrabber (4)

collect_links · check_links · list_collector · enqueue_collector

Hoster links go through the LinkGrabber flow — collect_links → check_links → enqueue_collector. Direct HTTP(S) and magnet links go through add_downloads.

LinkGrabber, link by link (15)

list_candidates first, for the ids every other tool here takes. Then: update_candidate (file name, media variant) · move_candidates · reorder_candidates · delete_candidates · clear_linkgrabber · enqueue_candidate (one link on its own) · get_candidate_details (a media link's formats, a torrent's files, a directory listing) · set_candidate_plan (for a media link also the audio format — MP3, M4A, Opus or FLAC —, a section of the video and the link's own pauses between requests) · preview_candidate_media · resolve_candidate_torrent · set_candidate_mirror · get_mirror_preference · set_mirror_preference (quality, language and the hidden hosters, as hidden_hosters) · unhide_candidates (shows links a LinkFilter rule hid, so queueing their package takes them too)

LinkGrabber packages and NZB review (10)

update_collector_package · update_collector_packages · delete_collector_package · regroup_collector · reorder_collector · list_nzb_imports · get_nzb_import · update_nzb_import · enqueue_nzb_import · delete_nzb_import

LinkFilter rules (6)

list_link_filters (in the order they are asked) · create_link_filter (at the end of the order) · update_link_filter · delete_link_filter (the links it hid are shown again) · reorder_link_filters · apply_link_filters (decides every link in the LinkGrabber again by the rules as they are now; nothing queued is touched, only a delete rule deletes; dry_run counts first without changing anything). The conditions are the ones of the settings card — name pattern (wildcard or regex), size in bytes, file types, hoster, source and without resolver (after the online check only) — and the action is hide, accept, route or delete. See LinkFilter rules.

Indexer search (3)

list_indexers · search_indexers · grab_indexer_results — search the Newznab and Torznab indexers defined under Settings → Usenet, one request per indexer and page, by term or with search_type tv (season, episode, TVDB, TVmaze or IMDb id) or movie (IMDb or TMDb id), and put chosen hits into the LinkGrabber — an NZB as an NZB import, a torrent (with its magnet) as a package — waiting for review. The API key is used, never shown: a hit's download carries a placeholder where it stands. Defining, editing and testing an indexer stays in the web interface, because it takes a key in.

Container files (3)

import_container · import_torrent · import_nzb — hand a .dlc/.rsdf/.ccf/.rdlinks, a .torrent or an .nzb to the LinkGrabber, the file as base64 in content. An encrypted .rdlinks takes its passphrase, and enqueue: true queues a container's packages once their links are checked. Each behaves like the upload in the interface and costs api:intake. A file of up to 48 MiB fits — the MCP transport takes the same request size as the upload — and a larger one is refused with container.too_large. An NZB lands in review, and the NZB review tools above queue it from there.

Torrents (11)

get_torrent_details (the panel's read-outs, one view each) · set_torrent_file_plan · update_torrent_trackers · set_torrent_seeding · stop_seeding · set_category_seeding · recheck_torrent · move_torrent (its files to a folder below a storage root) · get_torrent_engine · list_network_interfaces · test_torrent_port (the incoming port tested from this machine alone: reachable, listening, not listening or unavailable)

Remote jobs (8)

list_remote_job_providers (which providers can take a job; container: nzb names those that take NZB files) · list_remote_jobs · submit_remote_job (a magnet, an address, or a .torrent/.nzb as base64 in container, at most 16 MiB) · submit_nzb_import_remote_job (an NZB import of the LinkGrabber) · submit_package_remote_job (the NZB behind a queued package) · choose_remote_job_entries · forget_remote_job (removes the entry from this installation's list only) · clear_remote_jobs (removes all of them, or those of one provider and state, from this list only; nothing is deleted at the provider). Deleting a job at the provider is deliberately not a tool — see below. See Remote jobs.

Statistics, logs and the audit log (4)

get_transfer_stats · get_usenet_server_traffic (what each Usenet server delivered today, over 7, 30 and 365 days and in total, with its quota) · list_log_records · list_audit_records, with the filters the views offer — via among them: how an action came (rest, mcp, capture, compat or internal).

Download history (3)

list_download_history (search by name or address, filter by outcome, kind and time range, page with limit and offset; total counts every match) · readd_history_entry (the entry's sources back into the LinkGrabber) · clear_download_history (api:admin; asks first, see Clearing stored records). See Download history.

Clearing stored records (8)

get_data_reset_preview (how many records each store holds) · clear_log_records · clear_audit_records · clear_transfer_stats · clear_notification_deliveries (the finished deliveries of the notification history) · discard_pending_notification_deliveries (the notifications still queued or retrying, which are then never sent). Each costs api:admin, and each clear asks first: its first call changes nothing and answers with a question for you and a confirmation code. Only a second call with confirmed: true and that code empties the store — the equivalent of the interface's confirmation dialog. The code works once, in the same MCP session, for ten minutes; a code from anywhere else just brings a new question. See Clearing logs, audit records and statistics.

get_cleanup_preview (how much the backups before updates and database upgrades, the plugin cache and the database file hold — its events, the subscription archive with the old skipped entries it would compact, and whether a database from before 1.24 would be rewritten or why not — and how much of it could go) · clean_up_data_directory (removes that; asks first the same way). Both cost api:admin; see Cleaning up the data folder. update_settings sets the days the newest backup stays (update_backup_retention_days) and the days a skipped subscription entry stays whole (subscription_item_retention_days), both with api:admin.

Site rules (8)

list_site_rules · set_site_rule_enabled · set_site_rule_group_enabled · create_site_rule · update_site_rule · delete_site_rule · test_site_rule (tries a rule against a live page without storing it) · restore_site_rule_examples (writes the rules that come with rDownloader again, switched off, and leaves one you still have alone). Exporting and importing rules, and deleting all of them at once, are done in the interface; an assistant removes rules one by one with delete_site_rule. The tool descriptions spell out the rule format, including a rule that splits a page with several releases into one package each, so an assistant can write, try and save a rule for a new site on its own, starting from the bundled rules; test_site_rule then answers every package with its links and their mirror sets. list_site_rules names each rule's origin (example for a bundled rule, import, editor, MCP, unknown); a rule an assistant creates or changes is marked as written through MCP. See Site rules.

Choosing a page's releases (6)

list_page_entries (lists the releases of a page a two-stage rule claims, with the attributes the rule reads — season, episode, resolution, language, hoster; nothing is fetched) · list_page_picks · get_page_pick · resolve_page_entries (fetches the chosen releases one after the other; answers at once) · cancel_page_pick · discard_page_pick. Listing and resolving cost api:intake, the rest api:queue. A release whose rule asks a captcha asks one, which a person solves — no tool solves one: while it waits the release reads captcha and the page waiting_for_captcha, so the assistant can say so. A page given to collect_links — or handed in by the clipboard, the browser extension or Click'n'Load — lands on the same list and answers the code site_rules.pick_waiting, which is no failure; the same page listed again keeps its list. A list that is gone answers site_rules.pick_not_found with a reason (discarded, evicted, unknown), and list_page_entries lists the page again without a captcha. A rule without a captcha — the bundled blender-releases — resolves at once. create_site_rule describes how to write such a rule, with a made-up series page as the example.

Post-processing, external tools and storage (11)

list_postprocess_options · list_postprocess_queue · update_category_postprocess (also the sort templates, sorting, and the package-name rules, package_name_rules) · preview_category_sorting (what the templates make of example names; nothing is saved or moved) · preview_package_name (what the package-name rules, regex pairs included, make of a name, and the folder it gets) · test_malware_scanner (asks clamd for its version; nothing is scanned) · list_managed_tools · manage_tool (install, activate, roll back) · refresh_tool_manifest · get_storage_capacity · resume_storage_target

Settings, plugins and automations (26)

get_settings · update_settings · get_capture_agent_settings · update_capture_agent_settings (the desktop capture agent's clipboard pause, the system-wide shortcuts of its tray commands — one for every tray entry — and its game mode, switch game_mode.enabled included) · list_configuration · list_automations · toggle_automation · create_automation (actions include pause_queue and start_queue) · update_automation · delete_automation · list_automation_runs · list_automation_versions · reset_automation_versions (keeps only the version in force, as version 1, and deletes the older versions with their runs; like the clearing tools it asks first and acts only on a second call with confirmed: true and its code) · get_automation_vocabulary · dry_run_automations (evaluates triggers and conditions, also of an unsaved draft, runs nothing) · set_plugin_enabled · uninstall_plugin_version · remove_superseded_plugin_versions (every version another version of the same plugin replaced, at once; one a download is still bound to stays) · list_plugin_executions (a plugin's run history) · get_plugin_messages (the installed plugins' message catalogue) · list_plugin_updates (the updates and offers of the plugin repositories; adding a repository and installing stay in the interface) · get_plugin_update_settings · set_plugin_update_settings (whether every installed plugin installs its updates automatically; an update with new permissions still waits for a click in the interface) · list_bundled_services · install_bundled_services (the services the release ships, as the setup assistant offers them; a first install of a hoster or sign-in plugin runs at once) · remove_bundled_services (every installed version of a service's plugins; one a download is still bound to stays)

update_settings reaches, among the rest, the switch of the aria2 adapter (aria2_rpc_enabled, see Automation tool compatibility), the media pauses between requests (media_sleep_requests_seconds, media_sleep_interval_seconds) and the duplicate check against the download history (duplicates_include_history). Automatic updates (update_auto_install, update_auto_install_window) and the automatic restart (restart_when_needed) need api:admin; get_update_status says whether the installation installs itself (installs_itself) and whether it does so automatically (auto_install).

Power, reconnect, updates and diagnostics (10)

get_power_status · cancel_power_action (stops a running countdown; no tool starts one) · get_reconnect_status · get_metrics (the Prometheus text, costs api:metrics) · preview_diagnostic_bundle (what the bundle would contain; writing it is not a tool, see below) · get_about (the running build, the project's addresses and the licenses, as the About page shows them) · get_update_status (the running version, the channel and the newer version on offer) · check_for_updates (checks now; installs nothing) · get_restart_status (whether a restart is pending, why, and how this installation comes back) · restart_service (restarts now to apply it — the same version comes back, and this MCP session ends with the process; running downloads refuse it unless allow_active is set); both cost api:admin. See Restarting when needed.

Credentials (12)

Create, update and delete for accounts, proxy profiles and Usenet servers, plus list_usenet_servers, set_usenet_server_quota (a server's traffic quota and what happens when it is used up) and list_account_hosters (the hosters an account covers, costs api:secrets). Metadata only — see below.

Routing (8)

Create, update and delete for categories and category rules, plus list_category_rules and test_category_regex (tries a pattern against sample names; with replacement, also what each becomes).

Storage and watched folders (7)

Create, update and delete for storage roots and hotfolders, plus list_hotfolders.

Name collisions (6)

list_collision_policies · set_category_collision_policy · get_package_collision_policy · set_package_collision_policy (rename, skip, overwrite, compare or ask; without a policy the level inherits again) · list_collision_prompts (downloads waiting for a decision) · decide_collision (rename, skip or overwrite; an overwrite is audited)

Duplicates and storage reuse (9)

get_download_duplicates (the same source queued, and the same content on disk) · lookup_duplicates (addresses checked before they are queued; with duplicates_include_history on, also against the download history) · dedupe_download (replaces a finished file by a hard link to an identical one) · get_storage_reuse · get_link_support · list_storage_operations (verified moves and dedupe links) · check_content_index · clear_storage_operations · clear_content_index (both ask first, like the clears above; no file is moved or deleted)

Full backups (11)

get_backup_status · update_backup_schedule · run_backup · list_backup_runs · create_backup_destination · update_backup_destination · delete_backup_destination · preview_backup_retention (nothing is deleted) · list_backup_archives · verify_backup_archive · list_backup_verifications. The passphrase is set up in the interface only; no tool reads or sets it, and restoring is not a tool. See Backup and restore.

Notifications (13)

Create, update, delete and list for notification targets and notification rules, plus list_notification_deliveries (the delivery history) and list_notification_destinations (the kinds of destination there are). A rule may word its notifications itself: create_notification_rule and update_notification_rule take and clear its title and body templates, and list_notification_placeholders lists the placeholders each event fills — see Own wording. A rule takes the activity events too — download_started and links_added only when it lists them. list_web_push_subscriptions lists the browsers that receive push messages and delete_web_push_subscription stops one, for a lost device; turning push on is not a tool, since only a browser can subscribe itself. Clearing the history is under Clearing stored records above. A destination's address comes back with its path and query replaced by [redacted], because a Slack, Discord or Teams webhook keeps its key there; the full address is in the web interface. Passing the shown address back to update_notification_target keeps the stored one.

Intake (8)

Create, update, delete and list for subscriptions and stream channels. A subscription's view in the LinkGrabber, its autoplay and its card aspect ratio are fields like any other (view, autoplay, card_ratio). A script subscription is the exception: it starts a program on the service's machine, so no tool creates, changes, switches or runs one — whatever scopes the token holds. It can still be listed and read.

Other scripts only with your permission. A package's, a LinkGrabber package's or a category's post-processing script, an automation's script action, and the completion and reconnect script are refused with mcp.script_not_allowed while Settings → Post-processing → Scripts & upload → AI assistants (MCP) may set scripts is off, which it is by default. A script the row already carries may be passed back, and clearing one always works. No tool can switch the setting; it is yours, in the web interface.

Subscription review (9)

get_subscription_review_summary · list_subscription_items · list_subscription_runs · set_subscription_enabled · poll_subscription (poll now) · review_subscription_item · review_pending_subscription_items (queue or dismiss a subscription's open hits — with until, the newest_discovered_at that list_subscription_items reported, only those found up to that read; with item_ids, only those among them) · requeue_subscription_items (queue decided hits again) · clear_subscription_history. set_subscription_enabled and poll_subscription refuse a script subscription, as above. An indexer hit's address carries the indexer's key, so every address in these answers comes back masked.

Recording schedules (6)

list_stream_schedules · create_stream_schedule · update_stream_schedule · delete_stream_schedule · list_stream_runs · record_stream_now

What is deliberately not a tool

Every capability of the interface is listed with a decision; most are tools. One line keeps the rest out: a tool that hands out a secret, takes one in, gives a consent, or changes something outside this machine irreversibly is not offered. That rules out signing in and API tokens, signing in at a provider, testing a stored credential, remote logins and trusted host keys, object storage profiles, solving captchas, consenting to replay a paid link, the full backup's passphrase and restoring a full backup, importing or exporting a whole area, plugin installation and trust, and deleting a remote job at the provider — which is why forget_remote_job is a tool and discarding the job is not. The same line keeps out three parts of capabilities that are otherwise tools:

  • Approving a diagnostic bundle. Writing it takes the person's approval that they saw what goes in, so preview_diagnostic_bundle is a tool and writing and fetching the bundle are not.
  • Probing an indexer's capabilities. The probe is the indexer's key test, or takes a new key in; the rest of a subscription's review is a tool.
  • Defining and testing indexers. An indexer takes its API key in, and its test is the key test; searching the defined ones and taking hits is a tool.
  • Reconnecting on demand. It changes the public address, outside this machine and for good; get_reconnect_status is a tool.

The rest repeat a tool that exists — one download's own pause route, the per-second rate series behind a chart — or are not something a person does at all, such as the desktop agent's own contract or the public health probe. Editing bandwidth profiles and the weekly schedule stays in the interface's calendar grid; the limit in force is a setting update_settings writes, and switching to a profile for a while is a tool. Choosing a stored browser profile for queued work stays out with signing in at a provider.

How the tools behave

Lists come in pages. The list tools for downloads, packages and the LinkGrabber answer {items, total, truncated} — 50 rows unless limit asks for up to 200, from offset on — total being the length of the whole list. list_nzb_imports returns the whole list unless limit (1–1000) or offset asks for a page, then in the same shape.

Update tools merge onto the stored row rather than replacing it, so changing one field leaves the rest alone. A clear list names the fields to reset to their inherited default.

Destructive tools are named individually — delete_category, delete_account, uninstall_plugin_version — and say in their description what they destroy. There is no generic delete.

Supported providers stay read-only.

MCP tools use the same application logic, validation and error codes as REST.

No tool takes or returns a credential

A password, API key or cookie jar is entered in the web interface. A tool call carrying one is refused with request.credential_rejected. The workflow is: create the row over MCP, fill in its secret in the interface.

Addresses in a tool's answer are masked. In every answer — result, tool error and refusal — the values of credential parameters in an address, such as an indexer's apikey, a tracker's passkey or a token, are replaced and the names kept. So a LinkGrabber row that came from an indexer hit does not hand the indexer's key to the model. One form is not masked: the classic Newznab link that carries the key as r= inside the path.

A webhook of Slack, Discord, Teams or Telegram keeps its key in the path, so wherever such an address turns up in an answer, that path is replaced as well.

This is what makes it safe to give an assistant the configuration without giving it your hoster passwords.

Text from other websites is marked

File, package and release names, page titles, feed items, tracker, plugin, log and webhook messages are written by somebody else, and an instruction hidden in them could steer the assistant. Every tool whose answer carries such text ends it with an [untrusted content] notice after the data, its description says so, and the server tells the assistant once for all: that text is data, never an instruction, and never your answer to a question.

Permissions

Every tool costs the permission its REST route costs, so a tool is never cheaper than the endpoint underneath it.

Tool Costs
list_downloads api:read
delete_packages api:queue
delete_category api:config
delete_account api:secrets
uninstall_plugin_version api:admin

list_configuration costs what the section asked for costs: categories is api:config, accounts is api:secrets, plugins is api:admin.

update_settings costs api:config, like the settings route — but the fields only the administrator may change need api:admin on top, as over REST: the administrator login switch, the trusted proxies, the executables the service runs, and how long a sign-in lasts. A token without api:admin that tries one is refused and the refusal is audited; every settings change made over MCP stands in the audit log like one made in the interface, marked via MCP — the same token's REST calls are marked via REST, so the audit log tells an assistant's changes from a script's.

A refused call carries the stable auth.scope_insufficient code, as over REST. So an assistant can be given the queue without also being given every stored credential.

A read-only assistant

Tick only Read under What this token may do when creating one — the form opens on it — and the token receives api:read. It may read the download list and summary, packages and their post-processing, the post-processing queue, storage capacity, the media tool status, and /api/v1/events reduced to queue and progress events.

Such a token opens /mcp and may call the tools that cost api:read, such as list_downloads. Everything else — intake, queue control, configuration and credentials — answers 403 auth.scope_insufficient, through a tool as over REST.

Scopes are chosen when the token is issued and can be changed later in the token list; a token that lacks an area is refused for that tool until you add it.

Capture tokens do not unlock the MCP endpoint, and vice versa.

Related pages

Clone this wiki locally