Skip to main content
Glama

Mark watched or unwatched

set_watched

Mark or unmark a Jellyfin film, series, season, or episode as watched, with a preview and confirmation step before applying changes.

Instructions

Marks a film, series, season or episode watched or unwatched in Jellyfin. Give a title, or item_id, the Jellyfin id: playback.itemId from get_library or get_media_details, or itemId from get_playback. A Radarr or Sonarr id is refused. A series id with season marks one season. A Grimmory book is grimmory:<book id> (READ is watched; marking sets its finish date to now). Safe tier, but unmarking and re-marking loses the original play date and resume position. A user other than the default needs services.jellyfin.allow_other_users. Previews first; confirm to apply. Field reference: arr://docs/set_watched.

Input Schema

NameRequiredDescriptionDefault
userNoWhose watch state to change. Defaults to services.jellyfin.default_user; naming anyone else needs services.jellyfin.allow_other_users.
titleNoA film or series title, in place of `item_id`. Resolved as get_media_details does; a title two items match equally is refused with both ids.
seasonNoOne season of a series. Omit with a series id to mark the whole series. Refused on a film.
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.
item_idNoThe Jellyfin item id — 32 hex characters. `playback.itemId` on a get_library or get_media_details record, or the `itemId` get_playback reports. Or `grimmory:<book id>` for a book. Not a Radarr or Sonarr id.
watchedYestrue to mark watched, false to unmark.

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. Changed21 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."
    • removedInput schema / properties / season / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / season / minimum
      Removed value: --9007199254740991
    • addedInput schema / properties / title
      Added value: +{
      +  "description": "A film or series title, in place of `item_id`. Resolved as get_media_details does; a title two items match equally is refused with both ids.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "item_id",
      -  "watched"
      -]New value: +[
      +  "watched"
      +]
    • 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?

Goes well beyond the annotations by disclosing the real cost of the operation: 'unmarking and re-marking loses the original play date and resume position.' It also explains the two-step preview/confirm protocol, the auth requirement (services.jellyfin.allow_other_users), and Grimmory-specific semantics (READ means watched, marking sets finish date to now).

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?

Front-loaded with purpose, then identifiers, edge cases, caveats, and a docs pointer — every sentence carries information and none is filler. It is dense to the point of being slightly run-on, with several distinct ideas packed into one paragraph rather than grouped, but nothing is wasted.

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 7-parameter mutation tool with an output schema and full schema coverage, the description covers the remaining gaps: permission model, id provenance, ambiguity refusal, data-loss caveat, and the confirm-token flow. An agent has everything needed to call it correctly without consulting other tools.

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 100%, so the baseline is 3; the description still adds resolution semantics the schema only partly implies, notably 'A series id with `season` marks one season' and the Grimmory 'READ is watched' mapping. The id-source guidance overlaps with the item_id schema text, which keeps it from a 5.

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?

Opens with a specific verb and resource — 'Marks a film, series, season or episode watched or unwatched in Jellyfin' — that tells an agent exactly what the tool does and at what granularity. It also implicitly separates itself from read-oriented siblings like get_playback and get_media_details by being the mutation counterpart.

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?

Explicitly routes the agent to the right id source: `playback.itemId` from get_library or get_media_details, or `itemId` from get_playback. It also states an exclusion ('A Radarr or Sonarr id is refused'), the permission prerequisite for non-default users, and the preview-then-confirm workflow, so the agent knows both when to use it and how to sequence calls.

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