Skip to main content
Glama
smeet666

mcp-tvsubtitles

List a season's coverage or an episode's subtitles

list_subtitles
Read-onlyIdempotent

List subtitle coverage and records for a TV series by show ID. Choose a season for per-episode language coverage or add an episode to view its subtitle download records.

Instructions

List what tvsubtitles.net holds for one series. Pass 'id' from search_titles. With 'season' alone the answer is that season's coverage, one row per episode saying which languages hold something, and 'kind' reads 'coverage'. Add 'episode' and the answer is the subtitle records themselves, with 'kind' reading 'subtitles'. Leaving 'season' out reads the newest season, and the answer says which one that was. This server reads the catalogue: each record carries the page to open to download it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesA show id from search_titles. The site answers an id it does not hold with a page.
limitNoRows to render, 40 by default and 200 at most.
seasonNoLeave it out to read the newest season. The answer states which season it read.
episodeNoName an episode to read its subtitle records rather than the season's coverage.
languageNoA language from list_languages, by its name, the site's two-letter code, or its BCP 47 tag. Left out, every language comes back.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYes
kindYesWhich shape 'results' takes.
notesYes
cachedYes
seasonYesThe season the site served, which it states on the page.
sourceYes
episodeYesThe episode read, or null for a season.
resultsYesCoverage rows when 'kind' is 'coverage', subtitle records when it is 'subtitles'.
show_nameYes
result_countYes
total_countsYesWhat 'total_available' counted: the episodes of a season, or the records one episode held.
filters_appliedYes
filters_droppedYes
total_availableYes
season_requestedYesThe season that was asked for, or null when the newest was asked for.
seasons_availableYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.0.0
    • changedOutput schema / properties / results / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "episode": {
      -          "maximum": 9007199254740991,
      -          "minimum": -9007199254740991,
      -          "type": "integer"
      -        },
      -        "episode_id": {
      -          "description": "The site's own id for the episode.",
      -          "type": "string"
      -        },
      -        "languages": {
      -          "description": "The languages holding something for this episode.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "subtitle_count": {
      -          "anyOf": [
      -            {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "What the site counts for this episode. Null where it printed nothing."
      -        },
      -        "title": {
      -          "type": "string"
      -        },
      -        "url": {
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "episode",
      -        "episode_id",
      -        "title",
      -        "subtitle_count",
      -        "languages",
      -        "url"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "comment": {
      -          "description": "Free text the uploader left.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "downloads": {
      -          "anyOf": [
      -            {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "episode": {
      -          "anyOf": [
      -            {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "file_name": {
      -          "description": "The name of the file, as published.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "files_in_pack": {
      -          "anyOf": [
      -            {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Always null here, for the same reason."
      -        },
      -        "hearing_impaired": {
      -          "description": "Null: the site publishes no such marker.",
      -          "type": [
      -            "boolean",
      -            "null"
      -          ]
      -        },
      -        "id": {
      -          "description": "Pass this to get_subtitle.",
      -          "type": "string"
      -        },
      -        "is_pack": {
      -          "description": "Always false here: the site catalogues one episode per record and holds no packs.",
      -          "type": "boolean"
      -        },
      -        "language": {
      -          "description": "The language as the site names it.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "language_code": {
      -          "description": "BCP 47, where the site's own code maps to one with certainty. Null otherwise: the site writes 'br' for Brazilian Portuguese, which ISO assigns to Breton, so no code is derived.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "machine_translated": {
      -          "description": "Null: the site publishes no such marker.",
      -          "type": [
      -            "boolean",
      -            "null"
      -          ]
      -        },
      -        "page_url": {
      -          "description": "The page a reader opens to download the file.",
      -          "type": "string"
      -        },
      -        "published_at": {
      -          "description": "ISO 8601, read from the site's own stamp. The site states no timezone, so this carries none and 'published_text' keeps what it printed.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "published_text": {
      -          "description": "The stamp as the site printed it.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "rating": {
      -          "additionalProperties": false,
      -          "description": "Two counters the site publishes and its readers barely use: a zero here is a figure the site printed rather than a poor opinion of the file.",
      -          "properties": {
      -            "bad": {
      -              "anyOf": [
      -                {
      -                  "maximum": 9007199254740991,
      -                  "minimum": -9007199254740991,
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "good": {
      -              "anyOf": [
      -                {
      -                  "maximum": 9007199254740991,
      -                  "minimum": -9007199254740991,
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "good",
      -            "bad"
      -          ],
      -          "type": "object"
      -        },
      -        "release_match": {
      -          "description": "'stated' means the site published the release. 'none' means it published nothing, so the row says nothing about which video this is timed to. This site never infers one from a file name.",
      -          "enum": [
      -            "stated",
      -            "inferred",
      -            "none"
      -          ],
      -          "type": "string"
      -        },
      -        "releases": {
      -          "description": "The video releases as published, in the case the uploader typed them. The site states the medium and the release group separately, and both appear here when it published them.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "season": {
      -          "anyOf": [
      -            {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "size_text": {
      -          "description": "The size as published, which the site states in kb.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "source": {
      -          "type": "string"
      -        },
      -        "title_id": {
      -          "description": "The show this belongs to.",
      -          "type": "string"
      -        },
      -        "uploader": {
      -          "description": "Null on roughly two records out of three, where the site printed no author.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        }
      -      },
      -      "required": [
      -        "id",
      -        "title_id",
      -        "page_url",
      -        "language",
      -        "language_code",
      -        "releases",
      -        "release_match",
      -        "season",
      -        "episode",
      -        "is_pack",
      -        "files_in_pack",
      -        "hearing_impaired",
      -        "machine_translated",
      -        "uploader",
      -        "published_at",
      -        "published_text",
      -        "downloads",
      -        "rating",
      -        "file_name",
      -        "size_text",
      -        "comment",
      -        "source"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "episode": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "episode_id": {
      +          "description": "The site's own id for the episode.",
      +          "type": "string"
      +        },
      +        "languages": {
      +          "description": "The languages holding something for this episode.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "subtitle_count": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "What the site counts for this episode. Null where it printed nothing."
      +        },
      +        "title": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "episode",
      +        "episode_id",
      +        "title",
      +        "subtitle_count",
      +        "languages",
      +        "url"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "comment": {
      +          "description": "Free text the uploader left.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "downloads": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "episode": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "file_name": {
      +          "description": "The name of the file, as published.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "files_in_pack": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Always null here, for the same reason."
      +        },
      +        "hearing_impaired": {
      +          "description": "Null: the site publishes no such marker.",
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "id": {
      +          "description": "Pass this to get_subtitle.",
      +          "type": "string"
      +        },
      +        "is_pack": {
      +          "description": "Always false here: the site catalogues one episode per record and holds no packs.",
      +          "type": "boolean"
      +        },
      +        "language": {
      +          "description": "The language as the site names it.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "language_code": {
      +          "description": "BCP 47, where the site's own code maps to one with certainty. Null otherwise: the site writes 'br' for Brazilian Portuguese, which ISO assigns to Breton, so no code is derived.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "machine_translated": {
      +          "description": "Null: the site publishes no such marker.",
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "page_url": {
      +          "description": "The page a reader opens to download the file.",
      +          "type": "string"
      +        },
      +        "published_at": {
      +          "description": "ISO 8601, read from the site's own stamp. The site states no timezone, so this carries none and 'published_text' keeps what it printed.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "published_text": {
      +          "description": "The stamp as the site printed it.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "rating": {
      +          "additionalProperties": false,
      +          "description": "Two counters the site publishes and its readers barely use: a zero here is a figure the site printed rather than a poor opinion of the file.",
      +          "properties": {
      +            "bad": {
      +              "anyOf": [
      +                {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "good": {
      +              "anyOf": [
      +                {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "good",
      +            "bad"
      +          ],
      +          "type": "object"
      +        },
      +        "read_from": {
      +          "description": "Which page this row was read from. A listing carries no file name, no size and no comment, because the site prints those on a record's own page alone: read a null on one of the three as unread here rather than as something the site does not publish.",
      +          "enum": [
      +            "listing",
      +            "record"
      +          ],
      +          "type": "string"
      +        },
      +        "release_match": {
      +          "description": "'stated' means the site published the release. 'none' means it published nothing, so the row says nothing about which video this is timed to. This site never infers one from a file name.",
      +          "enum": [
      +            "stated",
      +            "inferred",
      +            "none"
      +          ],
      +          "type": "string"
      +        },
      +        "releases": {
      +          "description": "The video releases as published, in the case the uploader typed them. The site states the medium and the release group separately, and both appear here when it published them.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "season": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "size_text": {
      +          "description": "The size as published, which the site states in kb.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "title_id": {
      +          "description": "The show this belongs to, where the page it was read from names one. A record's own page names no show, so a row whose 'read_from' is 'record' carries null here and names the show under 'show_name' instead.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "uploader": {
      +          "description": "Null on roughly two records out of three, where the site printed no author.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "title_id",
      +        "page_url",
      +        "language",
      +        "language_code",
      +        "releases",
      +        "read_from",
      +        "release_match",
      +        "season",
      +        "episode",
      +        "is_pack",
      +        "files_in_pack",
      +        "hearing_impaired",
      +        "machine_translated",
      +        "uploader",
      +        "published_at",
      +        "published_text",
      +        "downloads",
      +        "rating",
      +        "file_name",
      +        "size_text",
      +        "comment",
      +        "source"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  }
      +]
  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?

The annotations already mark the tool read-only and idempotent; the description adds useful behavioral detail beyond that: the kind field reports coverage versus subtitles, the season default behavior, and the fact that each record carries the page to open to download it. It also notes in the schema that unknown ids return a page.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, id source, mode semantics, default behavior, and result interpretation are all covered without fluff. The main behavioral details are front-loaded.

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?

Given an output schema exists and all parameters are documented, the description covers the necessary call-shaping details: how to switch modes, default season behavior, and what the records contain. Nothing critical is missing for an agent to invoke this correctly.

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

Parameters5/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, but the description goes further by explaining the relationship between season and episode, how the output changes depending on their combination, and what omitting season does. This adds real meaning beyond the individual parameter descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List what tvsubtitles.net holds for one series.' It then distinguishes its two modes, season coverage versus episode subtitles, and clearly separates it from siblings like get_subtitle and search_titles by explaining the object being listed.

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

Usage Guidelines4/5

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

It gives explicit usage context: pass id from search_titles, use season alone for coverage, add episode for subtitle records, and omit season to get the newest season. It does not explicitly exclude alternatives like get_subtitle, but the mode-based guidance is clear and actionable.

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