Skip to main content
Glama

Refresh and scan a library

trigger_scan

Rescan a Radarr, Sonarr, Jellyfin or Plex library to fix files that downloaded but won't play, reconcile stale scan reports, or refresh a single item's metadata.

Instructions

Asks a service to reconcile itself with what is on disk: the "it downloaded but will not play" fix, and the usual fix for a stale scan diagnose reports. No id rescans the whole library of Radarr, Sonarr, Whisparr, Lidarr, Jellyfin, Plex or Grimmory; on Prowlarr it pushes the indexer list to the apps. An id refreshes and rescans one item. On Jellyfin and Plex a scan only finds changed files; wrong metadata is fix_metadata. action: rename (files to the service's naming, needs id), import (a finished download stuck at importBlocked, with mapping to correct a wrong match; not on Lidarr), remap (which episode an imported Sonarr file really is), postprocess (rerun NZBGet post-processing by downloadId), bookdrop (Grimmory). For an import refused over a "TBA" episode title, scan the series, wait, then import again. Most actions queue and return; follow them in stack_health commands. Previews first; confirm to run. Field reference: arr://docs/trigger_scan.

Input Schema

NameRequiredDescriptionDefault
idNoOne movie, series or Lidarr artist id — `acquisition.id` on a get_library record. Omit with action: "scan" to scan the whole library.
actionNoscan rescans the library, or just one item when `id` is given (on Lidarr only the refresh narrows to one artist: the rescan still reads every root folder); on Radarr, Sonarr, Whisparr and Lidarr it refreshes metadata from the provider first. rename renames one item's files to the service's own naming scheme, and requires `id`. import takes a finished download the service never picked up, and requires `download_id`; add `mapping` when the service cannot tell what a file is. remap reassigns already-imported Sonarr files to the episodes a person has confirmed they are, and requires `id` and `reassignments`. postprocess reruns NZBGet's post-processing on a finished download, and requires `download_id`. bookdrop rescans Grimmory's Bookdrop folder for new files.scan
confirmNoThe token from this tool's preview, passed back verbatim to apply it. Single-use and bound to the previewed arguments.
dry_runNoPreview without a confirm token, for "what would happen if" questions; not the first step of a real change.
libraryNoGrimmory only: one library, by name or by id as stack_health and get_library show it. Omit to rescan every library.
mappingNoFor action: "import", ignored otherwise. What each named file really is, for a download the service matched wrongly or not at all. The service judges each mapped file again with that answer and imports it only if it then accepts it; files left out keep the service's own match.
serviceYesprowlarr syncs its indexers to the apps; nzbget only with action: "postprocess".
instanceNoWhich instance (e.g. "4k") when several of this service exist. Omit it when there is one.
download_idNoThe download client's own id, as `downloadId` on a get_queue row (or, for nzbget, on a get_history row). Required for action: "import" and action: "postprocess", ignored otherwise.
reassignmentsNoRequired for action: "remap", ignored otherwise. Include every file the change touches: a file moved onto an episode that already has one must say where that one goes too, or the call is refused.

Output Schema

NameRequiredDescriptionDefault
noopYes
tierYes
toolYes
resultNo
targetYes
appliedYes
dry_runYes
effectsYes
serviceYes
summaryYes
audit_idNo
warningsNo
operationYes
uncheckedNo
next_stepsNo
permissionYes
confirm_errorNo
confirm_tokenNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed24 schema fields changedv1.74.0
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / confirm / description
      Previous value: -"The confirmation token from this same tool's preview of this same operation. Omit it to get a preview and a token; pass the token back verbatim to apply the change. Tokens are single-use, expire, and are bound to the exact operation and arguments previewed."New value: +"The token from this tool's preview, passed back verbatim to apply it. Single-use and bound to the previewed arguments."
    • changedInput schema / properties / dry_run / description
      Previous value: -"Preview only: resolve the target and describe exactly what would happen, then stop. Never mutates anything and never returns a confirmation token. Use this to answer \"what would happen if…\" — not as the first step of actually doing it."New value: +"Preview without a confirm token, for \"what would happen if\" questions; not the first step of a real change."
    • changedInput schema / properties / instance / description
      Previous value: -"Which instance, when several of this service are configured — for example \"4k\" or \"hd\". Omit it when there is only one. If several are configured and you omit it, the call is refused and the names are listed."New value: +"Which instance (e.g. \"4k\") when several of this service exist. Omit it when there is one."
    • removedInput schema / properties / mapping / items / properties / episodes / items / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / mapping / items / properties / season / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / reassignments / items / properties / episode / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / reassignments / items / properties / season / maximum
      Removed value: -9007199254740991
    • changedInput schema / properties / service / description
      Previous value: -"radarr, sonarr, whisparr, lidarr, jellyfin, plex or grimmory — or prowlarr, to sync its indexers to the apps, or nzbget for action: \"postprocess\"."New value: +"prowlarr syncs its indexers to the apps; nzbget only with action: \"postprocess\"."
    • changedInput schema / properties / service / enum
      Previous value: -[
      -  "radarr",
      -  "sonarr",
      -  "whisparr",
      -  "lidarr",
      -  "prowlarr",
      -  "bazarr",
      -  "jellyfin",
      -  "seerr",
      -  "sabnzbd",
      -  "nzbget",
      -  "transmission",
      -  "qbittorrent",
      -  "plex",
      -  "profilarr",
      -  "cleanuparr",
      -  "reclaimerr",
      -  "dispatcharr",
      -  "shelfmark",
      -  "grimmory"
      -]New value: +[
      +  "radarr",
      +  "sonarr",
      +  "whisparr",
      +  "lidarr",
      +  "prowlarr",
      +  "jellyfin",
      +  "nzbget",
      +  "plex",
      +  "grimmory"
      +]
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / properties / applied / description
      Removed value: -"Whether the change actually happened. False on every preview, refusal and no-op."
    • removedOutput schema / properties / audit_id / description
      Removed value: -"The audit row this call wrote. Every branch writes one, including previews and refusals."
    • removedOutput schema / properties / confirm_error / description
      Removed value: -"Why a presented token was rejected. Present only when one was presented."
    • removedOutput schema / properties / confirm_token / description
      Removed value: -"Present when a preview is awaiting confirmation. Single-use, expiring, bound to this exact operation and arguments."
    • removedOutput schema / properties / dry_run / description
      Removed value: -"Whether this was an explicit preview."
    • removedOutput schema / properties / effects / description
      Removed value: -"Itemised consequences, most severe first. Empty is legitimate for a no-op."
    • removedOutput schema / properties / next_steps / description
      Removed value: -"Present on an applied write when another call is worth offering. Offer it to the person; do not run it."
    • removedOutput schema / properties / noop / description
      Removed value: -"True when the request resolved but there was nothing to do — already monitored, already approved."
    • removedOutput schema / properties / result / description
      Removed value: -"Whatever the service returned, on a write that landed."
    • removedOutput schema / properties / summary / description
      Removed value: -"One sentence, safe to show a human."
    • removedOutput schema / properties / target / description
      Removed value: -"The resolved id the write acts on — what the confirmation token is bound to."
    • removedOutput schema / properties / unchecked / description
      Removed value: -"Present when a service could not be asked, so its absence from `warnings` means nothing."
    • removedOutput schema / properties / warnings / description
      Removed value: -"Present on a preview when another service has something to say about this change. Tell the user before confirming."
  2. First observedv0.1.0

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations' safety hints, it discloses that most actions queue and return rather than complete, that progress should be followed via stack_health `commands`, and that a preview/confirm token cycle gates real runs. It also flags quirks an agent could not infer, such as Lidarr's rescan still reading every root folder despite a narrowed refresh.

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 scenario framing comes first and every sentence carries information, with no filler. It is dense, however: long semicolon-joined clauses and heavy backtick usage make it slower to parse than a bulleted action list would be.

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 10-parameter, six-action mutation tool the description covers the decision points an agent needs: which service, which action, when an item id applies, and the preview-then-confirm flow. Return values need no explanation because an output schema exists, and the 'queues and returns' note correctly redirects follow-up to stack_health.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description still adds cross-field meaning, tying `action` values to required companions (`rename` needs `id`, `import` uses `mapping`, `postprocess` by `downloadId`) and noting where an action is unsupported. It stops short of explaining `confirm`/`dry_run` ordering itself, which the schema already handles, so it sits just above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'asks a service to reconcile itself with what is on disk', plus concrete scenarios ('it downloaded but will not play', stale scan from diagnose). It explicitly differentiates from the nearest sibling by naming fix_metadata for wrong metadata cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Spells out when `id` is omitted vs supplied across each service, notes that Prowlarr instead pushes indexers, and that Jellyfin/Plex scans only find changed files. Each action gets a condition for its use (importBlocked, TBA episode titles, wrong matches), and an explicit exclusion is given ('not on Lidarr').

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