Skip to main content
Glama
Grinv

TMDB MCP Server

Discover TV shows (filters)

discover_tv
Read-only

Filter TV shows by genre, air date, rating, network, streaming provider, status, or certification to build structured discovery queries; cast and crew searches are excluded—use person credits for actor lookups.

Instructions

Find TV shows by structured filters (genres (include/exclude), first-air year or date range, TMDB vote-average range, vote count, runtime, language, origin country, companies (include/exclude), networks, keywords (include/exclude), watch providers (include/exclude) and access model (subscription/rent/buy/free/ads), episodes airing in a date range (air_date_gte/lte), type, status, certification, an adult-content toggle, sort) — but NOT cast/crew/person: this tool doesn't accept those params for TV at all (calling with them is a validation error, not a silent no-op) because TMDB's own /discover/tv would silently ignore them anyway, unlike /discover/movie; to find TV shows featuring someone, call get_person_credits instead and filter its results to media_type 'tv'. certification/with_watch_providers/without_watch_providers/with_watch_monetization_types have validation and silent-fallback rules — see their own field descriptions. The TV counterpart of discover_movies; use with_networks for 'HBO shows', with_type='Miniseries' for short/limited series (e.g. 'best miniseries to binge in a weekend'), with_status='Ended' to exclude shows still airing, certification='TV-Y7' + certification_country='US' for 'shows appropriate for a young kid'. Resolve ids with get_tv_genres, search_companies, search_keywords, search_watch_providers.

Input Schema

NameRequiredDescriptionDefault
pageNo1-based page number for pagination (TMDB returns up to 20 results per page, max 500).
yearNoRelease / first-air year.
sort_byNoSort order. Defaults to TMDB's own default (roughly popularity-based) if omitted. TV's vocabulary differs from discover_movies' — 'name'/'first_air_date' instead of 'original_title'/'primary_release_date', and no 'revenue' (TMDB doesn't track it per-show).
languageNoOverride the response language (ISO-639-1, optionally with a region), e.g. 'ru-RU' or 'en-US'. Localizes titles/overviews/genre names. Defaults to the server's TMDB_LANGUAGE. A well-formed code TMDB has no translation for (e.g. 'xx') is not an error: overviews come back null, movies/shows keep their original-language title, and episodes get a generic 'Episode N' name.
min_votesNoMinimum vote count (filters obscure titles).
with_typeNoRestrict to this TV type — e.g. 'Miniseries' for short/limited series, excluding documentaries/reality/talk shows/etc. that would otherwise mix into a genre/rating search.
max_ratingNoMaximum TMDB vote average (0-10).
min_ratingNoMinimum TMDB vote average (0-10). Must be <= max_rating if both are given.
max_runtimeNoMaximum runtime in minutes.
min_runtimeNoMinimum runtime in minutes. Must be <= max_runtime if both are given.
with_genresNoTMDB genre ids; get them from get_movie_genres/get_tv_genres. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
with_statusNoRestrict to this production status, e.g. 'Ended' to exclude shows still airing (a still-airing show's later seasons could still be mediocre or unfinished).
air_date_gteNoOnly shows with an episode airing on/after this date (YYYY-MM-DD) — e.g. 'what's airing this week' with air_date_lte; unlike release_date_gte, which uses the show's first air date. Dates are US Eastern time. Must be <= air_date_lte if both are given.
air_date_lteNoOnly shows with an episode airing on/before this date (YYYY-MM-DD), see air_date_gte.
watch_regionNoTwo-letter ISO-3166-1 country code, e.g. 'US', whose streaming catalog with_watch_providers / without_watch_providers / with_watch_monetization_types filter on. Only valid together with at least one of them.
certificationNoFilter by exact age/content certification, e.g. 'PG-13' (movies) or 'TV-Y7' (TV); join several with '|' to match ANY of them, e.g. 'G|PG' for kids/family movies or 'TV-Y|TV-Y7|TV-G' for kids' TV. Requires certification_country, and a certification_country TMDB doesn't recognize silently disables this filter (returns unfiltered results) instead of erroring or matching nothing — double-check the country actually has data for that rating system. Matching is case-insensitive (verified live: 'pg-13' and 'PG-13' return identical results) but must otherwise exactly match one of TMDB's known rating strings for that country's system, punctuation included (e.g. 'PG-13', not 'PG13'). Unlike get_movie/get_tv's own certification field (which falls back to the US rating, then any country, when the requested region has none), this filter has NO fallback: a title with no certification entry at all for the exact country given is silently excluded from results, even if it's certified elsewhere (e.g. has a US rating) — for a country with sparse TMDB certification data, prefer certification_country='US' for broader, more reliable coverage over the user's actual country if completeness matters more than exact local ratings.
include_adultNoInclude adult (NSFW) results. Defaults to false.
with_keywordsNoTMDB keyword ids (use search_keywords to resolve names → ids). Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
with_networksNoTMDB TV network ids, e.g. HBO=49, Netflix=213 (verified live). Unlike with_companies/with_keywords/with_people, this server has no name-based resolver for networks — supply the raw TMDB network id directly; a well-known network's id may already be known, otherwise there's no in-server way to look one up. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
with_companiesNoTMDB production company ids (use search_companies to resolve names → ids). Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
without_genresNoComma-separated TMDB genre ids to exclude; get ids from get_movie_genres/get_tv_genres.
release_date_gteNoOnly entries released on/after this date (YYYY-MM-DD). Must be <= release_date_lte if both are given.
release_date_lteNoOnly entries released on/before this date (YYYY-MM-DD).
without_keywordsNoComma-separated TMDB keyword ids to exclude (use search_keywords to resolve names → ids).
without_companiesNoComma-separated TMDB production company ids to exclude: titles produced by ANY of them are dropped (use search_companies to resolve names → ids).
with_origin_countryNoOnly titles whose country of origin (where they were produced, not where they can be watched) is one of these ISO-3166-1 codes, e.g. ['KR'] for Korean titles; several codes match ANY of them. An unrecognized code such as 'ZZ' matches nothing.
with_watch_providersNoTMDB watch-provider ids (use search_watch_providers to resolve a service name, e.g. 'Netflix', to its numeric id); requires watch_region to also be set. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
certification_countryNoCountry whose certification system the `certification` filter uses, e.g. 'US'. Only valid together with certification.
with_original_languageNoISO-639-1 original-language code, e.g. 'en', 'ja'.
without_watch_providersNoComma-separated TMDB watch-provider ids to exclude: titles that ANY of them offers in watch_region are dropped, e.g. 'not on Netflix' (use search_watch_providers to resolve a service name to its id); requires watch_region to also be set.
with_watch_monetization_typesNoOnly titles available in watch_region through at least one of these access models: 'flatrate' = included in a subscription (e.g. Netflix), 'free' = free to watch, 'ads' = free with ads, 'rent' = paid rental, 'buy' = paid purchase. Several values match ANY of them. Requires watch_region; works alone (any provider). Combined with with_watch_providers, TMDB checks the two independently, not per provider: with_watch_providers=2 (Apple TV, rent/buy only) + 'flatrate' still matches titles rentable on Apple TV that some OTHER service streams — check get_watch_providers to confirm which service offers which access model.

Output Schema

NameRequiredDescriptionDefault
pageYes
resultsYes
total_pagesYes
total_resultsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed35 schema fields changedv0.14.0
    • addedInput schema / properties / air_date_gte
      Added value: +{
      +  "description": "Only shows with an episode airing on/after this date (YYYY-MM-DD) — e.g. 'what's airing this week' with air_date_lte; unlike release_date_gte, which uses the show's first air date. Dates are US Eastern time. Must be <= air_date_lte if both are given.",
      +  "format": "date",
      +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      +  "type": "string"
      +}
    • addedInput schema / properties / air_date_lte
      Added value: +{
      +  "description": "Only shows with an episode airing on/before this date (YYYY-MM-DD), see air_date_gte.",
      +  "format": "date",
      +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      +  "type": "string"
      +}
    • changedInput schema / properties / certification / description
      Previous value: -"Filter by exact age/content certification, e.g. 'PG-13' (movies) or 'TV-Y7' (TV). Requires certification_country, and a certification_country TMDB doesn't recognize silently disables this filter (returns unfiltered results) instead of erroring or matching nothing — double-check the country actually has data for that rating system. Matching is case-insensitive (verified live: 'pg-13' and 'PG-13' return identical results) but must otherwise exactly match one of TMDB's known rating strings for that country's system, punctuation included (e.g. 'PG-13', not 'PG13'). Unlike get_movie/get_tv's own certification field (which falls back to the US rating, then any country, when the requested region has none), this filter has NO fallback: a title with no certification entry at all for the exact country given is silently excluded from results, even if it's certified elsewhere (e.g. has a US rating) — for a country with sparse TMDB certification data, prefer certification_country='US' for broader, more reliable coverage over the user's actual country if completeness matters more than exact local ratings."New value: +"Filter by exact age/content certification, e.g. 'PG-13' (movies) or 'TV-Y7' (TV); join several with '|' to match ANY of them, e.g. 'G|PG' for kids/family movies or 'TV-Y|TV-Y7|TV-G' for kids' TV. Requires certification_country, and a certification_country TMDB doesn't recognize silently disables this filter (returns unfiltered results) instead of erroring or matching nothing — double-check the country actually has data for that rating system. Matching is case-insensitive (verified live: 'pg-13' and 'PG-13' return identical results) but must otherwise exactly match one of TMDB's known rating strings for that country's system, punctuation included (e.g. 'PG-13', not 'PG13'). Unlike get_movie/get_tv's own certification field (which falls back to the US rating, then any country, when the requested region has none), this filter has NO fallback: a title with no certification entry at all for the exact country given is silently excluded from results, even if it's certified elsewhere (e.g. has a US rating) — for a country with sparse TMDB certification data, prefer certification_country='US' for broader, more reliable coverage over the user's actual country if completeness matters more than exact local ratings."
    • addedInput schema / properties / certification / pattern
      Added value: +"\\S"
    • changedInput schema / properties / certification_country / description
      Previous value: -"Country whose certification system the `certification` filter uses, e.g. 'US'."New value: +"Country whose certification system the `certification` filter uses, e.g. 'US'. Only valid together with certification."
    • changedInput schema / properties / language / description
      Previous value: -"Override the response language (ISO-639-1, optionally with a region), e.g. 'ru-RU' or 'en-US'. Localizes titles/overviews/genre names. Defaults to the server's TMDB_LANGUAGE."New value: +"Override the response language (ISO-639-1, optionally with a region), e.g. 'ru-RU' or 'en-US'. Localizes titles/overviews/genre names. Defaults to the server's TMDB_LANGUAGE. A well-formed code TMDB has no translation for (e.g. 'xx') is not an error: overviews come back null, movies/shows keep their original-language title, and episodes get a generic 'Episode N' name."
    • changedInput schema / properties / max_rating / description
      Previous value: -"Maximum vote average (0-10)."New value: +"Maximum TMDB vote average (0-10)."
    • changedInput schema / properties / min_rating / description
      Previous value: -"Minimum vote average (0-10). Must be <= max_rating if both are given."New value: +"Minimum TMDB vote average (0-10). Must be <= max_rating if both are given."
    • changedInput schema / properties / release_date_gte / description
      Previous value: -"Only entries released on/after this date (YYYY-MM-DD)."New value: +"Only entries released on/after this date (YYYY-MM-DD). Must be <= release_date_lte if both are given."
    • changedInput schema / properties / watch_region / description
      Previous value: -"Two-letter ISO-3166-1 country code, e.g. 'US'."New value: +"Two-letter ISO-3166-1 country code, e.g. 'US', whose streaming catalog with_watch_providers / without_watch_providers / with_watch_monetization_types filter on. Only valid together with at least one of them."
    • changedInput schema / properties / with_companies / description
      Previous value: -"Comma-separated TMDB production company ids (use search_companies to resolve names → ids)."New value: +"TMDB production company ids (use search_companies to resolve names → ids). Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_companies / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • changedInput schema / properties / with_genres / description
      Previous value: -"Comma-separated TMDB genre ids (AND); get ids from get_movie_genres/get_tv_genres."New value: +"TMDB genre ids; get them from get_movie_genres/get_tv_genres. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_genres / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • changedInput schema / properties / with_keywords / description
      Previous value: -"Comma-separated TMDB keyword ids (use search_keywords to resolve names → ids)."New value: +"TMDB keyword ids (use search_keywords to resolve names → ids). Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_keywords / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • changedInput schema / properties / with_networks / description
      Previous value: -"Comma-separated TMDB TV network ids, e.g. HBO=49, Netflix=213 (verified live). Unlike with_companies/with_keywords/with_people, this server has no name-based resolver for networks — supply the raw TMDB network id directly; a well-known network's id may already be known, otherwise there's no in-server way to look one up."New value: +"TMDB TV network ids, e.g. HBO=49, Netflix=213 (verified live). Unlike with_companies/with_keywords/with_people, this server has no name-based resolver for networks — supply the raw TMDB network id directly; a well-known network's id may already be known, otherwise there's no in-server way to look one up. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_networks / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • addedInput schema / properties / with_origin_country
      Added value: +{
      +  "description": "Only titles whose country of origin (where they were produced, not where they can be watched) is one of these ISO-3166-1 codes, e.g. ['KR'] for Korean titles; several codes match ANY of them. An unrecognized code such as 'ZZ' matches nothing.",
      +  "items": {
      +    "pattern": "^[A-Z]{2}$",
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / with_watch_monetization_types
      Added value: +{
      +  "description": "Only titles available in watch_region through at least one of these access models: 'flatrate' = included in a subscription (e.g. Netflix), 'free' = free to watch, 'ads' = free with ads, 'rent' = paid rental, 'buy' = paid purchase. Several values match ANY of them. Requires watch_region; works alone (any provider). Combined with with_watch_providers, TMDB checks the two independently, not per provider: with_watch_providers=2 (Apple TV, rent/buy only) + 'flatrate' still matches titles rentable on Apple TV that some OTHER service streams — check get_watch_providers to confirm which service offers which access model.",
      +  "items": {
      +    "enum": [
      +      "flatrate",
      +      "free",
      +      "ads",
      +      "rent",
      +      "buy"
      +    ],
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / with_watch_providers / description
      Previous value: -"Comma-separated TMDB watch-provider ids (use search_watch_providers to resolve a service name, e.g. 'Netflix', to its numeric id); requires watch_region to also be set."New value: +"TMDB watch-provider ids (use search_watch_providers to resolve a service name, e.g. 'Netflix', to its numeric id); requires watch_region to also be set. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_watch_providers / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • addedInput schema / properties / without_companies
      Added value: +{
      +  "description": "Comma-separated TMDB production company ids to exclude: titles produced by ANY of them are dropped (use search_companies to resolve names → ids).",
      +  "pattern": "^\\d+(?:,\\d+)*$",
      +  "type": "string"
      +}
    • addedInput schema / properties / without_watch_providers
      Added value: +{
      +  "description": "Comma-separated TMDB watch-provider ids to exclude: titles that ANY of them offers in watch_region are dropped, e.g. 'not on Netflix' (use search_watch_providers to resolve a service name to its id); requires watch_region to also be set.",
      +  "pattern": "^\\d+(?:,\\d+)*$",
      +  "type": "string"
      +}
    • removedOutput schema / properties / results / items / properties / overview / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / overview / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / poster_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / poster_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / vote_average / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / vote_average / description
      Added value: +"TMDB's own 0-10 user score. A different audience and scale from the IMDb/RT/Metacritic scores get_movie/get_tv return as `ratings` — don't compare, average or substitute across the two."
    • addedOutput schema / properties / results / items / properties / vote_average / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / vote_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / vote_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / year / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / year / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed7 schema fields changedv0.11.0
    • addedInput schema / properties / with_companies / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_genres / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_keywords / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_networks / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_watch_providers / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / without_genres / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / without_keywords / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
  3. Changed16 schema fields changedv0.10.1
    • changedInput schema / properties / certification / description
      Previous value: -"Filter by exact age/content certification, e.g. 'PG-13' (movies) or 'TV-Y7' (TV). Requires certification_country, and a certification_country TMDB doesn't recognize silently disables this filter (returns unfiltered results) instead of erroring or matching nothing — double-check the country actually has data for that rating system. Case-sensitive for movies ('pg-13' matches nothing; use 'PG-13'). Unlike get_movie/get_tv's own certification field (which falls back to the US rating, then any country, when the requested region has none), this filter has NO fallback: a title with no certification entry at all for the exact country given is silently excluded from results, even if it's certified elsewhere (e.g. has a US rating) — for a country with sparse TMDB certification data, prefer certification_country='US' for broader, more reliable coverage over the user's actual country if completeness matters more than exact local ratings."New value: +"Filter by exact age/content certification, e.g. 'PG-13' (movies) or 'TV-Y7' (TV). Requires certification_country, and a certification_country TMDB doesn't recognize silently disables this filter (returns unfiltered results) instead of erroring or matching nothing — double-check the country actually has data for that rating system. Matching is case-insensitive (verified live: 'pg-13' and 'PG-13' return identical results) but must otherwise exactly match one of TMDB's known rating strings for that country's system, punctuation included (e.g. 'PG-13', not 'PG13'). Unlike get_movie/get_tv's own certification field (which falls back to the US rating, then any country, when the requested region has none), this filter has NO fallback: a title with no certification entry at all for the exact country given is silently excluded from results, even if it's certified elsewhere (e.g. has a US rating) — for a country with sparse TMDB certification data, prefer certification_country='US' for broader, more reliable coverage over the user's actual country if completeness matters more than exact local ratings."
    • addedInput schema / properties / include_adult
      Added value: +{
      +  "description": "Include adult (NSFW) results. Defaults to false.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / min_runtime / description
      Previous value: -"Minimum runtime in minutes."New value: +"Minimum runtime in minutes. Must be <= max_runtime if both are given."
    • addedInput schema / properties / release_date_gte / format
      Added value: +"date"
    • changedInput schema / properties / release_date_gte / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    • addedInput schema / properties / release_date_lte / format
      Added value: +"date"
    • changedInput schema / properties / release_date_lte / pattern
      Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    • changedInput schema / properties / sort_by / description
      Previous value: -"TMDB sort, e.g. 'popularity.desc', 'vote_average.desc', 'primary_release_date.desc'."New value: +"Sort order. Defaults to TMDB's own default (roughly popularity-based) if omitted. TV's vocabulary differs from discover_movies' — 'name'/'first_air_date' instead of 'original_title'/'primary_release_date', and no 'revenue' (TMDB doesn't track it per-show)."
    • addedInput schema / properties / sort_by / enum
      Added value: +[
      +  "popularity.asc",
      +  "popularity.desc",
      +  "vote_average.asc",
      +  "vote_average.desc",
      +  "vote_count.asc",
      +  "vote_count.desc",
      +  "name.asc",
      +  "name.desc",
      +  "first_air_date.asc",
      +  "first_air_date.desc"
      +]
    • changedInput schema / properties / watch_region / description
      Previous value: -"Country for with_watch_providers, e.g. 'US'."New value: +"Two-letter ISO-3166-1 country code, e.g. 'US'."
    • changedInput schema / properties / with_networks / description
      Previous value: -"Comma-separated TMDB TV network, e.g. HBO or Netflix ids."New value: +"Comma-separated TMDB TV network ids, e.g. HBO=49, Netflix=213 (verified live). Unlike with_companies/with_keywords/with_people, this server has no name-based resolver for networks — supply the raw TMDB network id directly; a well-known network's id may already be known, otherwise there's no in-server way to look one up."
    • changedInput schema / properties / with_watch_providers / description
      Previous value: -"Comma-separated TMDB watch-provider ids (e.g. Netflix's numeric id); requires watch_region to also be set."New value: +"Comma-separated TMDB watch-provider ids (use search_watch_providers to resolve a service name, e.g. 'Netflix', to its numeric id); requires watch_region to also be set."
    • changedInput schema / properties / without_genres / description
      Previous value: -"Comma-separated TMDB genre ids to exclude."New value: +"Comma-separated TMDB genre ids to exclude; get ids from get_movie_genres/get_tv_genres."
    • changedInput schema / properties / without_keywords / description
      Previous value: -"Comma-separated TMDB keyword to exclude ids."New value: +"Comma-separated TMDB keyword ids to exclude (use search_keywords to resolve names → ids)."
    • changedOutput schema / properties / results / items / properties / first_air_date / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "format": "date",
      +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / results / items / properties / first_air_date / default
      Added value: +null
  4. Addedv0.8.1
  5. Removedv0.8.0
  6. First observedv0.3.0

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description discloses critical behavioral quirks: cast/crew/person params are validation errors rather than silent no-ops, TMDB's own /discover/tv silently ignores them, and certification/watch-provider filters have validation and silent-fallback rules. This is exactly the kind of surprising behavior an agent needs surfaced before calling the tool.

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 description is dense and front-loads the core filter scope before the important exclusion of cast/crew/person. Given 31 parameters and complex TMDB fallback behavior, the length is largely justified, though the single long paragraph and nested parentheticals make it less scannable than it could 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 31-parameter discovery tool with an output schema already present, the description covers the important selection guidance, exclusions, resolver tools, and silent-fallback warnings. No return-value explanation is needed because an output schema exists.

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 schema already defines all 31 parameters in detail. The description still adds value by mapping natural-language intents to parameters, such as with_networks='HBO shows,' with_type='Miniseries,' with_status='Ended,' and the certification-country pairing, plus which resolver tools supply ids.

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: 'Find TV shows by structured filters,' then names the supported filter families and explicitly excludes cast/crew/person parameters. It directly distinguishes this from discover_movies and get_person_credits, so an agent can identify the tool without opening the schema.

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?

It gives explicit routing guidance: use get_person_credits for shows featuring someone, use with_networks for 'HBO shows,' with_type='Miniseries' for limited series, with_status='Ended' to exclude ongoing shows, and certification='TV-Y7' for kid-appropriate TV. It also names resolver tools for ids, covering when to use this tool and its alternatives.

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