cleanuparr-mcp
This server exposes Cleanuparr's REST API as MCP tools for inspecting, configuring, and managing Cleanuparr.
Health & Status: Check liveness/readiness, detailed health reports, version/uptime/resource status, download client and *arr (Sonarr/Radarr/Lidarr) connection statuses, and run health checks.
Jobs: List scheduled jobs, get job details, trigger manual one-time runs, start jobs with custom schedules, and update job schedules.
Events & Strikes: List/filter/retrieve events, timelines, types, and severities; manage manual events (resolve one/all, statistics); list/filter/delete strikes and purge all strikes.
Statistics: View aggregate v2 stats, timeline metrics (events, strikes, recovered, removed, malware blocked), Seeker search summaries/events, and custom-format score data, upgrades, instances, and history.
Configuration: Read/update general settings (dry-run, auth, retry/timeout, retention, logging, etc.); manage *arr instances and download clients (create/update/delete/test); configure queue cleaner, download cleaner, dead torrent, unlinked/orphaned file handling, and seeding rules (including reorder).
Feature Configurations: Manage malware blocker, Seeker, and blacklist synchronizer settings.
Notifications: List, create, update, test, and delete notification providers (Notifiarr, Apprise, ntfy, Telegram, Discord, Pushover, Gotify); check Apprise CLI availability.
Destructive Actions: Purge strikes, resolve all manual events, and perform clearly marked destructive updates.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cleanuparr-mcpshow me recent cleanup history and stats"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cleanuparr-mcp
Part of the arr-mcps collection. An MCP server exposing Cleanuparr's REST API as tools for inspecting status, history, statistics, jobs, and configuration.
Requirements
Cleanuparr with its REST API enabled
An API key from Cleanuparr
Python 3.11+ and
uvfor source development
Related MCP server: job-search-mcp
Configuration
Variable | Required | Description |
| Yes | Cleanuparr URL, including any reverse-proxy |
| Usually | API key sent as |
Install a built wheel and register it with Claude Code:
uv tool install cleanuparr_mcp-*.whl
claude mcp add cleanuparr \
--env CLEANUPARR_URL=https://cleanuparr.example.com \
--env CLEANUPARR_API_KEY=your-api-key \
-- cleanuparr-mcpFor a source checkout:
uv sync
claude mcp add cleanuparr \
--env CLEANUPARR_URL=https://cleanuparr.example.com \
--env CLEANUPARR_API_KEY=your-api-key \
-- uv run --directory /path/to/cleanuparr-mcp cleanuparr-mcpTools
8 resource-scoped tools, each covering multiple Cleanuparr REST endpoints
(84 total) via an operation parameter. Call a tool with operation set to
one of its listed operations and an arguments dict matching that
operation's parameters — the tool's own description (visible to your MCP
client) lists every operation, its signature, and a one-line doc. This keeps
the full API surface available while costing a fraction of the context
budget of registering all 84 endpoints as separate tools.
Tool | Operations | Covers |
| 19 | Queue/download cleaners, dead torrents, orphaned/unlinked files, seeding rules |
| 18 | Events, manual events, strikes, timelines, stats |
| 15 | General config, *arr instances, download clients |
| 8 | Health, readiness, system/*arr/download-client status |
| 7 | Seeker search events, custom-format scores |
| 6 | Notification providers |
| 6 | Malware blocker, Seeker, blacklist sync |
| 5 | List, inspect, trigger, start, schedule jobs |
Example: cleanuparr_jobs(operation="cleanuparr_trigger_job", arguments={"job_type": "QueueCleaner"}).
Endpoint-level naming (cleanuparr_<verb>_<resource>) is preserved as the
operation value, so the full endpoint list is still discoverable from each
group tool's description at runtime.
Destructive operations are noted in their operation-line doc. Cleanuparr
returns 503 when its configuration database is busy; this server does not
retry and instead returns the upstream error to the MCP client.
Request bodies are pass-through JSON dictionaries matching the DTOs in the running Cleanuparr version. Sensitive update fields should use Cleanuparr's placeholder value to preserve an existing secret. Do not place real API keys, passwords, or notification tokens in prompts.
Development
make sync
make test
make test-integration # requires CLEANUPARR_URL and optionally CLEANUPARR_API_KEY
make buildThe offline tests use httpx.MockTransport; integration tests are skipped by
default.
Available Tools
8 toolscleanuparr_arr_download_clientsA
cleanuparr arr download clients operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_create_arr_instance(arr_type, instance) — Create an *arr instance. DTO fields: enabled, name, url, apiKey, version, externalUrl.
cleanuparr_create_download_client(client) — Create a download client. DTO includes enabled, name, typeName, type, host, username, password, urlBase, externalUrl, and directory source/target.
cleanuparr_delete_arr_instance(arr_type, instance_id) — Delete an *arr instance by GUID.
cleanuparr_delete_download_client(client_id) — Delete a download client by GUID.
cleanuparr_get_arr_config(arr_type) —
cleanuparr_get_general_config() — Get general configuration, including dry-run and auth settings.
cleanuparr_list_arr_instances(arr_type) —
cleanuparr_list_download_clients() — List configured download clients.
cleanuparr_purge_strikes() — Purge all stored strikes. This is irreversible.
cleanuparr_test_arr_instance(arr_type, instance) — Test an *arr connection. DTO fields: url, apiKey, version, optional instanceId.
cleanuparr_test_download_client(client) — Test a download client. DTO includes typeName, type, host, credentials, urlBase, and optional clientId.
cleanuparr_update_arr_config(arr_type, config) — Replace one *arr config, normally containing failedImportMaxStrikes.
cleanuparr_update_arr_instance(arr_type, instance_id, instance) — Replace an *arr instance. Use Cleanuparr's secret placeholder for apiKey.
cleanuparr_update_download_client(client_id, client) — Replace a download client. Use the secret placeholder for password.
cleanuparr_update_general_config(config) — Merge fields into the current general config and PUT the result. A raw PUT replaces the whole resource, so sending only changed fields (e.g.
{"dryRun": false}) resets every unspecified field — includingdisplaySupportBannerand theauthobject — to defaults. This read-modify-write preserves current values for anything not inconfig. Fields include dryRun, retry/timeout settings, ignoredDownloads, connectivity, retention, log, and auth objects.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses important behavioral traits for some operations: purge_strikes is 'irreversible', update_general_config warns about resetting unspecified fields in a read-modify-write, and secret placeholders for apiKey/password are noted. However, many operations (e.g., create, delete, test) lack side-effect or permission details, so the disclosure is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately so for 15 operations. It is front-loaded with the usage pattern and then organized as a clean bulleted list of operations, each on a single line. There is no fluff or redundancy; every line adds operational detail. The structure is easily scannable for an agent needing to find a specific operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (15 operations) and lack of annotations, the description provides substantial context: function signatures, DTO fields, and behavioral warnings. The presence of an output schema reduces the need to describe return values. Some operations are under-descripted (e.g., cleanuparr_get_arr_config has no explanatory text), but the names and signatures largely suffice. Overall, it is fairly complete for a multi-operation dispatch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides `operation` and a free-form `arguments` object with no internal structure. The description compensates fully by giving a function signature for each operation (e.g., cleanuparr_create_arr_instance(arr_type, instance)) and, for many, listing DTO fields (e.g., 'enabled, name, url, apiKey'). This directly tells the agent how to construct the arguments dict for any operation, adding critical meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it covers 'cleanuparr arr download clients operations' and then enumerates 15 distinct operations with clear verbs (create, delete, list, test, update, purge) and resources (arr instances, download clients). This clearly communicates the tool's scope and differentiates it from sibling tools that cover other Cleanuparr domains, though it is a collection rather than a single specific verb+resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to invoke the tool ('Pass `operation` and an `arguments` dict') but does not explicitly state when to use this tool versus alternatives. It lacks any 'when to use' guidance, exclusions, or references to sibling tools, leaving the selection decision to the agent's inference from the operation list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanuparr_cleaner_configA
cleanuparr cleaner config operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_create_queue_rule(kind, rule) — Create a stall or slow queue rule. Common DTO fields include name, enabled, maxStrikes, privacyType, completion percentages, and changeCategory.
cleanuparr_create_seeding_rule(download_client_id, rule) — Create a seeding rule. DTO includes name, categories, trackerPatterns, tagsAny/tagsAll, priority, privacyType, ratio/time/seeder limits, and deleteSourceFiles.
cleanuparr_delete_queue_rule(kind, rule_id) — Delete a stall or slow queue rule by GUID.
cleanuparr_delete_seeding_rule(rule_id) — Delete a seeding rule by GUID.
cleanuparr_get_dead_torrent_config(download_client_id) — Get dead-torrent settings for a download-client GUID.
cleanuparr_get_download_cleaner_config() — Get download cleaner configuration.
cleanuparr_get_orphaned_files_config(download_client_id) — Get orphaned-file settings for a download-client GUID.
cleanuparr_get_queue_cleaner_config() — Get queue cleaner configuration.
cleanuparr_get_unlinked_config(download_client_id) — Get unlinked-file settings for a download-client GUID.
cleanuparr_list_queue_rules(kind) — List stall or slow queue rules.
cleanuparr_list_seeding_rules(download_client_id) — List seeding rules for a download-client GUID.
cleanuparr_reorder_seeding_rules(download_client_id, ordered_ids) — Reorder rules by sending an orderedIds GUID array.
cleanuparr_update_dead_torrent_config(download_client_id, config) — Replace dead-torrent settings: enabled, targetCategory, useTag, maxStrikes, categories.
cleanuparr_update_download_cleaner_config(config) — Replace download cleaner config: enabled, cronExpression, useAdvancedScheduling, and ignoredDownloads.
cleanuparr_update_orphaned_files_config(download_client_id, config) — Replace orphaned-file settings: enabled, scanDirectories, orphanedDirectory, excludePatterns, minFileAgeHours, and optional purgeAfterHours.
cleanuparr_update_queue_cleaner_config(config) — Replace queue cleaner config. DTO includes enabled, cronExpression, useAdvancedScheduling, failedImport, downloadingMetadataMaxStrikes, processNoContentId, and ignoredDownloads.
cleanuparr_update_queue_rule(kind, rule_id, rule) — Replace a stall or slow queue rule. Stall fields include minimumProgress; slow fields include minSpeed, maxTimeHours, and ignoreAboveSize.
cleanuparr_update_seeding_rule(rule_id, rule) — Replace a seeding rule by GUID. Priority is ignored by the upstream update.
cleanuparr_update_unlinked_config(download_client_id, config) — Replace unlinked settings: enabled, targetCategory, useTag, ignoredRootDirs, categories.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It indicates mutating vs. read-only through operation names (create, delete, update) and notes one behavioral quirk ('Priority is ignored by the upstream update'). However, it does not disclose side effects, reversibility, or prerequisites, leaving significant gaps for a config tool with many mutating operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but justified by the need to document 19 sub-operations. It is well-structured as a bulleted list with each line containing the function name and its arguments/fields, making it scannable. The opening sentence provides the general pattern, and every line adds usable information, though the length is substantial.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high tool complexity (19 operations), sparse schema, and no annotations, the description covers all operations and their parameters. An output schema exists, so return values are not needed. However, it lacks contextual details such as how to obtain required GUIDs (e.g., download_client_id) or any mention of error conditions, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines 'operation' (an enum) and a generic 'arguments' dict, providing zero detail about parameters. The description fully compensates by explaining that 'arguments' must match the operation's parameters, then listing parameter names and DTO fields for each of the 19 operations. This provides complete semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool performs Cleanuparr cleaner config operations and enumerates all 19 supported operations with explicit verbs (create, delete, get, list, update). It distinguishes from sibling tools (health status, jobs, events, etc.) by focusing on config management, though it is a dispatcher rather than a single action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the listed operations (e.g., to create a queue rule, call cleanuparr_create_queue_rule), but there is no explicit guidance on when to use this tool versus alternatives, nor any exclusions. The overloaded nature of the tool (single operation parameter) makes context 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.
cleanuparr_eventsA
cleanuparr events operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_delete_strikes(download_item_id) — Delete all strikes for a download-item GUID.
cleanuparr_get_event(event_id) — Get one event by GUID.
cleanuparr_get_event_timeline(hours=720) — Get event timeline buckets for the requested number of hours.
cleanuparr_get_events_by_tracking(tracking_id) — Get events associated with a tracking GUID.
cleanuparr_get_manual_event(event_id) — Get one manual event by GUID.
cleanuparr_get_manual_event_stats() — Get manual-event counts by severity and resolution.
cleanuparr_get_stats(hours=168, include_dry_run=False) — Get v2 aggregate statistics. The deprecated v1 stats endpoint is not exposed.
cleanuparr_get_stats_timeline(metric='events', hours=720, bucket=None, include_dry_run=False) — Get v2 metric timeline. Metrics include events, strikesIssued, recovered, removed, and malwareBlocked; buckets include hour, day, week, and month.
cleanuparr_list_event_severities() — List event severity enum values.
cleanuparr_list_event_types() — List event type enum values.
cleanuparr_list_events(page=1, page_size=50, severity=None, event_type=None, from_date=None, to_date=None, search=None, job_run_id=None) — List events. Dates are ISO-8601 strings; page_size is capped by the API at 500.
cleanuparr_list_manual_event_severities() — List manual-event severity enum values.
cleanuparr_list_manual_events(page=1, page_size=50, is_resolved=None, severity=None, from_date=None, to_date=None, search=None) — List manual events with pagination and optional filters.
cleanuparr_list_recent_strikes(count=5) — List recent strikes; count is capped by the API at 50.
cleanuparr_list_strike_types() — List strike type enum values.
cleanuparr_list_strikes(page=1, page_size=50, search=None, strike_type=None) — List strike-bearing download items.
cleanuparr_resolve_all_manual_events() — Mark all unresolved manual events resolved.
cleanuparr_resolve_manual_event(event_id) — Mark one manual event resolved.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds useful constraints (page_size capped at 500, count capped at 50, deprecated v1 stats not exposed, default values). However, it does not disclose side effects of mutating operations like delete_strikes or resolve_manual_event, nor does it mention authentication, rate limits, or error behavior. This is a clear gap for a tool with write operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately structured as a bulleted list of operation signatures. The opening sentence explains the dispatch pattern, and each line is compact and self-contained. There is no fluff; every line adds necessary operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (18 operations) and the presence of an output schema, the description covers the dispatch mechanism, parameters, defaults, and key constraints. It does not explain return values (covered by output schema) but also omits error handling and side-effect warnings, which would be valuable for a dispatcher with mutating operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines 'operation' as an enum and 'arguments' as a generic object with no additional properties. The description compensates by listing each operation's parameters, defaults, types (e.g., ISO-8601 dates), and caps. This is essential for constructing correct invocation arguments and goes well beyond the schema, though it does not fully document every parameter's type or allowed values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it handles 'cleanuparr events operations on Cleanuparr' and enumerates 18 specific operations with verbs like delete, get, list, and resolve targeting events, strikes, and stats. This distinguishes it from sibling tools focused on config, health, jobs, and stats by its event-specific scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for event and strike operations and provides usage instructions for each sub-operation, including required arguments and default values. It does not explicitly contrast with alternatives, but the operation list and naming make the appropriate context clear. It also notes API caps and date formats, which guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanuparr_feature_configsA
cleanuparr feature configs operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_get_blacklist_sync_config() — Get blacklist synchronizer configuration.
cleanuparr_get_malware_blocker_config() — Get malware blocker configuration.
cleanuparr_get_seeker_config() — Get Seeker configuration.
cleanuparr_update_blacklist_sync_config(config) — Replace blacklist sync config: enabled and optional blacklistPath.
cleanuparr_update_malware_blocker_config(config) — Replace malware blocker config, including per-arr blocklist settings.
cleanuparr_update_seeker_config(config) — Replace Seeker config: search toggles, strategy, grace period, and instances.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior itself. It uses the word 'Replace' for all update operations, signaling overwrite semantics, and lists affected fields. However, it does not warn that omitted fields in the arguments might be cleared, nor mention any permissions or side effects beyond the replacement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the usage pattern and then a bullet list of operations. Each bullet is concise and informative, with no redundant text, making it easy to scan and front-loaded with key instructions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six operations with custom argument structures, but the description only hints at the fields for each. The arguments schema is permissive (any object), so it doesn't validate. Without a detailed argument list per operation, an agent cannot reliably construct valid calls, making the description incomplete despite having an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates. It defines the operation parameter via the enum and instructs the arguments dict to match the operation. For updates, it lists key fields like enabled, blacklistPath, per-arr settings, and Seeker toggles, though not exhaustive for every operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it handles Cleanuparr feature configs and enumerates six specific operations for three distinct configs (blacklist sync, malware blocker, Seeker). It distinguishes these from sibling tools that manage cleaner configs, health, jobs, events, stats, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a concrete usage pattern: pass an operation and a matching arguments dict, and lists each operation's purpose. It does not explicitly compare to sibling tools or state when not to use it, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanuparr_health_statusA
cleanuparr health status operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_get_arr_status() — Check all configured Sonarr/Radarr/Lidarr-style connections.
cleanuparr_get_download_client_status() — Check all configured download-client connections.
cleanuparr_get_status() — Get Cleanuparr version, uptime, resource, and instance status.
cleanuparr_health() — Check anonymous liveness at /health.
cleanuparr_health_checks() — List configured health checks.
cleanuparr_health_detailed() — Get the authenticated detailed health report.
cleanuparr_health_ready() — Check anonymous readiness at /health/ready.
cleanuparr_run_health_check(check_id=None) — Run all health checks, or one check by GUID when check_id is supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It adds useful behavioral context by noting which operations are anonymous (e.g., 'anonymous liveness' at /health) and which are authenticated ('authenticated detailed health report'). However, it does not explicitly state that these are read-only or describe potential side effects, though health checks are inherently non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact bullet list with front-loaded operation names and short, informative descriptions. Every line is purposeful, and the format makes the tool easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (not shown) and a clear list of operations, the description adequately covers scope. It provides enough detail to understand each operation's purpose and arguments, and the output schema can handle return-value specifics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by listing each operation with its expected arguments (e.g., cleanuparr_run_health_check accepts check_id). The generic 'arguments' dict is clarified by the operation-specific signatures, providing meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as handling 'cleanuparr health status operations' on Cleanuparr, with a specific list of operations. This distinguishes it from sibling tools focused on cleaner config, jobs, events, stats, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing health-related operations and noting the resource (Cleanuparr). It does not explicitly mention alternatives or exclusions, but the scope is clear enough for an agent to select this tool for health status checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanuparr_jobsA
cleanuparr jobs operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_get_job(job_type) — Get one job. Values include QueueCleaner, MalwareBlocker, DownloadCleaner, BlacklistSynchronizer, Seeker, and CustomFormatScoreSyncer.
cleanuparr_list_jobs() — List scheduled jobs and their current status.
cleanuparr_start_job(job_type, schedule) — Start a job with a schedule object containing the JobSchedule DTO.
cleanuparr_trigger_job(job_type) — Run a one-time job now. Seeker cannot be manually triggered.
cleanuparr_update_job_schedule(job_type, schedule) — Replace a job schedule using the JobSchedule DTO.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds useful constraints such as 'Seeker cannot be manually triggered' and describes the replace semantics for update_job_schedule, but it omits details on auth requirements, side effects, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, using a bulleted list to break down each operation. Each line is short, focused, and free of unnecessary verbiage, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all five operations and highlights a key constraint (Seeker cannot be triggered manually), but it does not fully specify the shape of the JobSchedule DTO needed for start_job and update_job_schedule. While an output schema exists, the input-side ambiguity for complex operations makes the description only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With the schema providing zero coverage for the arguments dictionary, the description compensates by naming the parameters for each operation (job_type, schedule) and listing the enumerable job_type values. It references JobSchedule DTO but does not detail its structure, leaving some ambiguity for constructing valid schedule objects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this tool as handling cleanuparr jobs operations and enumerates five distinct sub-operations (get, list, start, trigger, update) with precise wording. This differentiates it from sibling tools focused on other Cleanuparr resources such as config, health, or stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for managing Cleanuparr jobs through its operation list, but it does not provide explicit context on when to use this tool versus alternatives, nor does it state any exclusions. Usage is inferred rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanuparr_notificationsA
cleanuparr notifications operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_create_notification_provider(provider_type, provider) — Create a notification provider. Types: notifiarr, apprise, ntfy, telegram, discord, pushover, gotify. Common fields are name, isEnabled, and event flags; provider-specific fields follow the API DTO.
cleanuparr_delete_notification_provider(provider_id) — Delete a notification provider by GUID.
cleanuparr_get_apprise_cli_status() — Get Apprise CLI availability status.
cleanuparr_list_notification_providers() — List notification providers. Secret fields may be redacted by Cleanuparr.
cleanuparr_test_notification_provider(provider_type, provider) — Test a notification provider using its provider-specific DTO.
cleanuparr_update_notification_provider(provider_type, provider_id, provider) — Replace a notification provider. Use Cleanuparr placeholders for secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses some useful traits: secret fields may be redacted, update 'Replaces' a provider, delete is destructive. But it does not mention permissions, reversibility, rate limits, or potential side effects of testing a provider.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the key guidance about operation and arguments. The bullet list is scannable, each line earning its place with a concise operation summary and parameters. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-operation dispatcher, the description covers all operations with enough detail to select correctly. The presence of an output schema means return values do not need to be explained. Minor gaps include no error behavior or explicit arguments dict structure, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does so by listing operation-specific parameter names like provider_type, provider, and provider_id, and by noting common fields (name, isEnabled, event flags) plus provider-specific DTOs. This adds real meaning beyond the generic top-level schema, though it stops short of fully documenting the provider object's required structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as 'cleanuparr notifications operations' and enumerates six specific operations (create/delete/list/test/update providers, apprise status). This distinguishes it from sibling tools focused on other Cleanuparr domains. It lacks a single verb+resource formulation, but the operation list provides concrete purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It instructs users to pass an operation and matching arguments dict, and each operation has a one-line summary. However, it does not explicitly state when to use this tool over sibling tools, nor does it provide exclusions like 'for jobs use cleanuparr_jobs'. Usage context 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.
cleanuparr_statsARead-only
cleanuparr stats operations on Cleanuparr. Pass operation and an arguments dict matching that operation's parameters.
cleanuparr_get_cf_item_history(instance_id, item_id, episode_id=0) — Get score history for an item; episode_id is used for Sonarr episode history.
cleanuparr_get_cf_stats() — Get custom-format score tracking statistics.
cleanuparr_get_search_summary() — Get Seeker search totals and per-instance summary.
cleanuparr_list_cf_instances() — List instances and quality profiles with tracked scores.
cleanuparr_list_cf_scores(page=1, page_size=50, instance_id=None, search=None, sort_by='Title', sort_direction=None, quality_profile=None, item_type=None, cutoff_filter='All', monitored_filter='All') — List current custom-format scores with cutoff and monitored filters.
cleanuparr_list_cf_upgrades(page=1, page_size=50, instance_id=None, days=30, search=None, sort_by='UpgradedAt', sort_direction=None) — List recent custom-format score upgrades.
cleanuparr_list_search_events(page=1, page_size=50, instance_id=None, cycle_id=None, search=None, sort_by='Timestamp', sort_direction='Desc', search_status=None, search_type=None, search_reason=None, grabbed=None) — List Seeker search events. search_status can contain repeated enum filters.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description's operations are all get/list, aligning with this. The description adds value beyond the annotation by detailing the dispatcher pattern, parameter defaults, and special notes like 'episode_id is used for Sonarr episode history' and 'search_status can contain repeated enum filters.' No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured as a scannable bulleted list, with each operation given a concise purpose and parameter list. It is long due to the number of sub-operations, but every line provides necessary information without fluff. The opening sentence effectively frames the dispatcher pattern.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 sub-operations, many parameters) and that the schema provides no descriptions, the description covers all operations and their parameters, making the tool's interface quite clear. It does not explain return values, but the output schema likely covers that. Some parameter enums (e.g., search_status values) are not fully specified, but overall comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by listing each operation's parameters and defaults in function-signature form, which adds meaning beyond the schema's generic 'arguments' object. It also highlights operation-specific behavior for certain parameters, though it does not enumerate all enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a dispatcher for Cleanuparr stats operations, and enumerates each supported operation with a specific verb and resource (e.g., 'Get score history for an item', 'Get custom-format score tracking statistics'). This differentiates it from sibling tools focused on config, health, jobs, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage instructions by explaining the operation/arguments pattern and listing each operation's signature with parameters and defaults. While it does not explicitly mention when not to use the tool or name alternative tools, the context is clear that this is the stats/read-only dispatcher, so usage is well implied.
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. Dates show when Glama detected each change.
92 tool updates
v0.2.1- Added
cleanuparr_arr_download_clients - Added
cleanuparr_cleaner_config - Removed
cleanuparr_create_arr_instance - Removed
cleanuparr_create_download_client - Removed
cleanuparr_create_notification_provider - Removed
cleanuparr_create_queue_rule - Removed
cleanuparr_create_seeding_rule - Removed
cleanuparr_delete_arr_instance - Removed
cleanuparr_delete_download_client - Removed
cleanuparr_delete_notification_provider - Removed
cleanuparr_delete_queue_rule - Removed
cleanuparr_delete_seeding_rule - Removed
cleanuparr_delete_strikes - Added
cleanuparr_events - Added
cleanuparr_feature_configs - Removed
cleanuparr_get_apprise_cli_status - Removed
cleanuparr_get_arr_config - Removed
cleanuparr_get_arr_status - Removed
cleanuparr_get_blacklist_sync_config - Removed
cleanuparr_get_cf_item_history - Removed
cleanuparr_get_cf_stats - Removed
cleanuparr_get_dead_torrent_config - Removed
cleanuparr_get_download_cleaner_config - Removed
cleanuparr_get_download_client_status - Removed
cleanuparr_get_event - Removed
cleanuparr_get_event_timeline - Removed
cleanuparr_get_events_by_tracking - Removed
cleanuparr_get_general_config - Removed
cleanuparr_get_job - Removed
cleanuparr_get_malware_blocker_config - Removed
cleanuparr_get_manual_event - Removed
cleanuparr_get_manual_event_stats - Removed
cleanuparr_get_orphaned_files_config - Removed
cleanuparr_get_queue_cleaner_config - Removed
cleanuparr_get_search_summary - Removed
cleanuparr_get_seeker_config - Removed
cleanuparr_get_stats - Removed
cleanuparr_get_stats_timeline - Removed
cleanuparr_get_status - Removed
cleanuparr_get_unlinked_config - Removed
cleanuparr_health - Removed
cleanuparr_health_checks - Removed
cleanuparr_health_detailed - Removed
cleanuparr_health_ready - Added
cleanuparr_health_status - Added
cleanuparr_jobs - Removed
cleanuparr_list_arr_instances - Removed
cleanuparr_list_cf_instances - Removed
cleanuparr_list_cf_scores - Removed
cleanuparr_list_cf_upgrades - Removed
cleanuparr_list_download_clients - Removed
cleanuparr_list_event_severities - Removed
cleanuparr_list_event_types - Removed
cleanuparr_list_events - Removed
cleanuparr_list_jobs - Removed
cleanuparr_list_manual_event_severities - Removed
cleanuparr_list_manual_events - Removed
cleanuparr_list_notification_providers - Removed
cleanuparr_list_queue_rules - Removed
cleanuparr_list_recent_strikes - Removed
cleanuparr_list_search_events - Removed
cleanuparr_list_seeding_rules - Removed
cleanuparr_list_strike_types - Removed
cleanuparr_list_strikes - Added
cleanuparr_notifications - Removed
cleanuparr_purge_strikes - Removed
cleanuparr_reorder_seeding_rules - Removed
cleanuparr_resolve_all_manual_events - Removed
cleanuparr_resolve_manual_event - Removed
cleanuparr_run_health_check - Removed
cleanuparr_start_job - Added
cleanuparr_stats - Removed
cleanuparr_test_arr_instance - Removed
cleanuparr_test_download_client - Removed
cleanuparr_test_notification_provider - Removed
cleanuparr_trigger_job - Removed
cleanuparr_update_arr_config - Removed
cleanuparr_update_arr_instance - Removed
cleanuparr_update_blacklist_sync_config - Removed
cleanuparr_update_dead_torrent_config - Removed
cleanuparr_update_download_cleaner_config - Removed
cleanuparr_update_download_client - Removed
cleanuparr_update_general_config - Removed
cleanuparr_update_job_schedule - Removed
cleanuparr_update_malware_blocker_config - Removed
cleanuparr_update_notification_provider - Removed
cleanuparr_update_orphaned_files_config - Removed
cleanuparr_update_queue_cleaner_config - Removed
cleanuparr_update_queue_rule - Removed
cleanuparr_update_seeding_rule - Removed
cleanuparr_update_seeker_config - Removed
cleanuparr_update_unlinked_config
84 tool updates
v0.1.0- First observed
cleanuparr_create_arr_instance - First observed
cleanuparr_create_download_client - First observed
cleanuparr_create_notification_provider - First observed
cleanuparr_create_queue_rule - First observed
cleanuparr_create_seeding_rule - First observed
cleanuparr_delete_arr_instance - First observed
cleanuparr_delete_download_client - First observed
cleanuparr_delete_notification_provider - First observed
cleanuparr_delete_queue_rule - First observed
cleanuparr_delete_seeding_rule - First observed
cleanuparr_delete_strikes - First observed
cleanuparr_get_apprise_cli_status - First observed
cleanuparr_get_arr_config - First observed
cleanuparr_get_arr_status - First observed
cleanuparr_get_blacklist_sync_config - First observed
cleanuparr_get_cf_item_history - First observed
cleanuparr_get_cf_stats - First observed
cleanuparr_get_dead_torrent_config - First observed
cleanuparr_get_download_cleaner_config - First observed
cleanuparr_get_download_client_status - First observed
cleanuparr_get_event - First observed
cleanuparr_get_event_timeline - First observed
cleanuparr_get_events_by_tracking - First observed
cleanuparr_get_general_config - First observed
cleanuparr_get_job - First observed
cleanuparr_get_malware_blocker_config - First observed
cleanuparr_get_manual_event - First observed
cleanuparr_get_manual_event_stats - First observed
cleanuparr_get_orphaned_files_config - First observed
cleanuparr_get_queue_cleaner_config - First observed
cleanuparr_get_search_summary - First observed
cleanuparr_get_seeker_config - First observed
cleanuparr_get_stats - First observed
cleanuparr_get_stats_timeline - First observed
cleanuparr_get_status - First observed
cleanuparr_get_unlinked_config - First observed
cleanuparr_health - First observed
cleanuparr_health_checks - First observed
cleanuparr_health_detailed - First observed
cleanuparr_health_ready - First observed
cleanuparr_list_arr_instances - First observed
cleanuparr_list_cf_instances - First observed
cleanuparr_list_cf_scores - First observed
cleanuparr_list_cf_upgrades - First observed
cleanuparr_list_download_clients - First observed
cleanuparr_list_event_severities - First observed
cleanuparr_list_event_types - First observed
cleanuparr_list_events - First observed
cleanuparr_list_jobs - First observed
cleanuparr_list_manual_event_severities - First observed
cleanuparr_list_manual_events - First observed
cleanuparr_list_notification_providers - First observed
cleanuparr_list_queue_rules - First observed
cleanuparr_list_recent_strikes - First observed
cleanuparr_list_search_events - First observed
cleanuparr_list_seeding_rules - First observed
cleanuparr_list_strike_types - First observed
cleanuparr_list_strikes - First observed
cleanuparr_purge_strikes - First observed
cleanuparr_reorder_seeding_rules - First observed
cleanuparr_resolve_all_manual_events - First observed
cleanuparr_resolve_manual_event - First observed
cleanuparr_run_health_check - First observed
cleanuparr_start_job - First observed
cleanuparr_test_arr_instance - First observed
cleanuparr_test_download_client - First observed
cleanuparr_test_notification_provider - First observed
cleanuparr_trigger_job - First observed
cleanuparr_update_arr_config - First observed
cleanuparr_update_arr_instance - First observed
cleanuparr_update_blacklist_sync_config - First observed
cleanuparr_update_dead_torrent_config - First observed
cleanuparr_update_download_cleaner_config - First observed
cleanuparr_update_download_client - First observed
cleanuparr_update_general_config - First observed
cleanuparr_update_job_schedule - First observed
cleanuparr_update_malware_blocker_config - First observed
cleanuparr_update_notification_provider - First observed
cleanuparr_update_orphaned_files_config - First observed
cleanuparr_update_queue_cleaner_config - First observed
cleanuparr_update_queue_rule - First observed
cleanuparr_update_seeding_rule - First observed
cleanuparr_update_seeker_config - First observed
cleanuparr_update_unlinked_config
TDQS
Each of the 8 tools represents a distinct functional area: cleaner configuration, health status, jobs, events, stats, arr/download clients, feature configs, and notifications. The sub-operation names further clarify boundaries, leaving no ambiguity about which tool to use for a given task.
All tools follow a consistent `cleanuparr_<area>` snake_case pattern, and sub-operations use a uniform verb_noun structure (get_, list_, update_, delete_, create_, etc.). The only minor deviation is the compound `arr_download_clients`, but it is still clear and does not break the overall naming scheme.
With 8 well-categorized tools, the server is well-scoped. Each tool groups a coherent set of operations, making the count neither too thin nor too heavy for the domain of managing a Cleanuparr instance.
The surface covers the key entities and actions: CRUD for arr instances, download clients, notification providers, and rules; configuration get/update for all major settings; job lifecycle management; event and strike retrieval/management; and statistics. No critical operations appear to be missing for the server's stated purpose.
Maintenance
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for searching Airweave collections with natural language queries.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP Server that enables natural language interaction with the Open Policy Agent REST API, allowing users to manage policies, decisions, and data through conversational interfaces.1-
- AlicenseNot gradedqualityAmaintenanceMCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.7MIT
- AlicenseNot gradedqualityDmaintenanceTransforms Swagger/OpenAPI documented APIs into conversational interfaces, enabling natural language interaction with APIs through an MCP server for use with AI assistants.4MIT

Cutover MCPofficial
AlicenseNot gradedqualityBmaintenanceAn MCP server for interacting with the Cutover API, enabling management of cutover events and related operations through natural language.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/arr-mcps/cleanuparr-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server