Skip to main content
Glama
Grinv

TMDB MCP Server

Discover movies (filters)

discover_movies
Read-only

Find movies by structured filters—genre, release window, rating, runtime, cast/crew, watch providers, certification, or region—without starting from a title query.

Instructions

Find movies by structured filters instead of a title query: genres (include/exclude), year or release-date range, TMDB vote-average range, vote count, runtime range, original language, cast/crew/people, companies (include/exclude), origin country, keywords (include/exclude), watch providers (include/exclude) and access model (subscription/rent/buy/free/ads), certification, a release window in one country by release type (any_release_date_gte/lte + region + with_release_type — e.g. 'movies in German cinemas this month'), an adult-content toggle, and sort order. certification/with_watch_providers/without_watch_providers/with_watch_monetization_types/with_release_type/region have validation and silent-fallback rules — see their own field descriptions. Use for 'popular sci-fi from the 1990s with a TMDB vote average above 7 available on Netflix', or for a specific person's work in one genre — 'which of this director's/actor's/composer's films are animated' — via with_crew/with_cast/with_people + with_genres together; get_person_credits has no genre filter, so this combination is the right tool for that question, not that one. Resolve ids with get_movie_genres, search_people, search_keywords, search_companies, 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.
regionNoISO-3166-1 country code: limits any_release_date_gte/lte (and with_release_type) to releases in this country, e.g. 'DE'. Requires any_release_date_gte or any_release_date_lte; it has no effect on year/release_date_gte/lte. An unrecognized code such as 'ZZ' matches nothing ('XX' is a real TMDB pseudo-region, not an error). Movie-only.
sort_byNoSort order. Defaults to TMDB's own default (roughly popularity-based) if omitted.
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_castNoTMDB person ids, restricted to cast (actor) roles. Use search_people to resolve an actor's name to their id. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
with_crewNoTMDB person ids, restricted to crew roles (e.g. a director). Use search_people to resolve a name to their id. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
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_peopleNoTMDB person ids, matching either a cast or crew role. Use search_people to resolve a name to their id. Join several ids with "," to require ALL of them, or "|" to match ANY (e.g. "8|9").
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_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).
with_release_typeNoOnly count releases of these types toward any_release_date_gte/lte (and region): 'premiere', 'theatrical_limited', 'theatrical' (wide cinema release), 'digital' (VOD/streaming), 'physical' (DVD/Blu-ray), 'tv' (TV broadcast). Several values match ANY of them. Requires any_release_date_gte or any_release_date_lte.
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.
any_release_date_gteNoOnly movies with at least one release (any country and release type, re-releases included) on/after this date (YYYY-MM-DD) — unlike release_date_gte, which uses each movie's original premiere date. Narrow it with region and with_release_type, e.g. region='DE' + with_release_type=['theatrical'] + this window = movies in German cinemas then. A re-released movie matches, but its row's release_date stays the original one. Must be <= any_release_date_lte if both are given.
any_release_date_lteNoOnly movies with at least one release (see any_release_date_gte) on/before this date (YYYY-MM-DD).
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. Changed41 schema fields changedv0.14.0
    • addedInput schema / properties / any_release_date_gte
      Added value: +{
      +  "description": "Only movies with at least one release (any country and release type, re-releases included) on/after this date (YYYY-MM-DD) — unlike release_date_gte, which uses each movie's original premiere date. Narrow it with region and with_release_type, e.g. region='DE' + with_release_type=['theatrical'] + this window = movies in German cinemas then. A re-released movie matches, but its row's release_date stays the original one. Must be <= any_release_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 / any_release_date_lte
      Added value: +{
      +  "description": "Only movies with at least one release (see any_release_date_gte) on/before this date (YYYY-MM-DD).",
      +  "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 / region / description
      Previous value: -"ISO-3166-1 country code. TMDB's docs describe this as picking which country's release date counts as a movie's release date for date-based filtering (year, release_date_gte/lte) — but live testing found no measurable effect there; use certification_country instead to scope the certification filter, which does work. The one confirmed live effect: supplying any value (even one TMDB doesn't recognize) shifts total_results by a handful of titles versus omitting this field entirely, even with no other filter — real but too small and unexplained to use for precise filtering. Movie-only."New value: +"ISO-3166-1 country code: limits any_release_date_gte/lte (and with_release_type) to releases in this country, e.g. 'DE'. Requires any_release_date_gte or any_release_date_lte; it has no effect on year/release_date_gte/lte. An unrecognized code such as 'ZZ' matches nothing ('XX' is a real TMDB pseudo-region, not an error). Movie-only."
    • 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_cast / description
      Previous value: -"Comma-separated TMDB person ids, restricted to cast (actor) roles. Use search_people to resolve an actor's name to their id."New value: +"TMDB person ids, restricted to cast (actor) roles. Use search_people to resolve an actor's name to their id. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_cast / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • 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_crew / description
      Previous value: -"Comma-separated TMDB person ids, restricted to crew roles (e.g. a director). Use search_people to resolve a name to their id."New value: +"TMDB person ids, restricted to crew roles (e.g. a director). Use search_people to resolve a name to their id. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_crew / 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+)*)$"
    • 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"
      +}
    • changedInput schema / properties / with_people / description
      Previous value: -"Comma-separated TMDB person ids, matching either a cast or crew role. Use search_people to resolve a name to their id."New value: +"TMDB person ids, matching either a cast or crew role. Use search_people to resolve a name to their id. Join several ids with \",\" to require ALL of them, or \"|\" to match ANY (e.g. \"8|9\")."
    • changedInput schema / properties / with_people / pattern
      Previous value: -"^\\d+(?:,\\d+)*$"New value: +"^\\d+(?:(?:,\\d+)*|(?:\\|\\d+)*)$"
    • addedInput schema / properties / with_release_type
      Added value: +{
      +  "description": "Only count releases of these types toward any_release_date_gte/lte (and region): 'premiere', 'theatrical_limited', 'theatrical' (wide cinema release), 'digital' (VOD/streaming), 'physical' (DVD/Blu-ray), 'tv' (TV broadcast). Several values match ANY of them. Requires any_release_date_gte or any_release_date_lte.",
      +  "items": {
      +    "enum": [
      +      "premiere",
      +      "theatrical_limited",
      +      "theatrical",
      +      "digital",
      +      "physical",
      +      "tv"
      +    ],
      +    "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. Changed9 schema fields changedv0.11.0
    • addedInput schema / properties / with_cast / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_companies / pattern
      Added value: +"^\\d+(?:,\\d+)*$"
    • addedInput schema / properties / with_crew / 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_people / 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. Addedv0.10.1
  4. Removedv0.8.1
  5. Changed3 schema fields changedv0.8.1
    • removedInput schema / properties / language / minLength
      Removed value: -2
    • addedInput schema / properties / language / pattern
      Added value: +"^[a-z]{2}(-[A-Z]{2})?$"
    • addedInput schema / properties / with_original_language / pattern
      Added value: +"^[a-z]{2}$"
  6. Changed10 schema fields changedv0.8.0
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / certification / description
      Previous value: -"Filter by exact age certification, e.g. 'PG-13'. Requires certification_country."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. 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."
    • changedInput schema / properties / min_rating / description
      Previous value: -"Minimum vote average (0-10)."New value: +"Minimum vote average (0-10). Must be <= max_rating if both are given."
    • changedInput schema / properties / page / description
      Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (TMDB returns up to 20 results per page, max 500)."
    • changedInput schema / properties / page / maximum
      Previous value: -9007199254740991New value: +500
    • changedInput schema / properties / with_companies / description
      Previous value: -"Comma-separated TMDB production company ids."New value: +"Comma-separated TMDB production company ids (use search_companies to resolve names → ids)."
    • changedInput schema / properties / with_keywords / description
      Previous value: -"Comma-separated TMDB keyword (use search_keywords to resolve names → ids) ids."New value: +"Comma-separated TMDB keyword ids (use search_keywords to resolve names → ids)."
    • changedInput schema / properties / with_watch_providers / description
      Previous value: -"Comma-separated TMDB watch-provider (e.g. Netflix); requires watch_region ids."New value: +"Comma-separated TMDB watch-provider ids (e.g. Netflix's numeric id); requires watch_region to also be set."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "properties": {
      +    "page": {
      +      "type": "number"
      +    },
      +    "results": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "number"
      +          },
      +          "media_type": {
      +            "const": "movie",
      +            "type": "string"
      +          },
      +          "original_title": {
      +            "type": "string"
      +          },
      +          "overview": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "poster_url": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "release_date": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "vote_average": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "vote_count": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "year": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "media_type",
      +          "year",
      +          "release_date",
      +          "vote_average",
      +          "vote_count",
      +          "overview",
      +          "poster_url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "total_pages": {
      +      "type": "number"
      +    },
      +    "total_results": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "results",
      +    "page",
      +    "total_pages",
      +    "total_results"
      +  ],
      +  "type": "object"
      +}
  7. First observedv0.3.0

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnly/openWorld, so the description carries the real burden and does flag non-obvious behavior: validation and silent-fallback rules for certification, watch providers, monetization types, release type and region. It defers the specifics to the per-field descriptions rather than restating them, which is reasonable but means the agent must open the schema to learn what the fallback actually does.

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

Conciseness3/5

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

The scoping contrast is correctly front-loaded, but the middle portion is one enormous run-on enumeration of every filter family that largely duplicates a schema already at 100% coverage. The valuable parts (examples, sibling routing, fallback warning) are buried at the end of an overly long sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 33-parameter, all-optional query tool with an output schema and readOnly annotations, the description covers purpose, choosing against siblings, id-resolution helpers and fallback hazards — enough to call it correctly. Missing only a note on pagination/result limits (present in the schema) and any ranking caveat for sort_by defaults.

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 baseline is 3; the description adds cross-parameter semantics the schema does not state — notably that with_crew/with_cast/with_people must be combined with with_genres to answer 'a person's work in one genre'. The catalogue of filter families (include vs exclude, date-window vs original-release-date) also aids navigation of 33 parameters, though much of it echoes the field names.

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 precise verb+resource and an explicit contrast ('by structured filters instead of a title query'), which immediately separates it from search_movies. It also names the exact capability boundary against get_person_credits ('has no genre filter, so this combination is the right tool for that question, not that one').

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?

Gives two concrete use cases ('popular sci-fi from the 1990s with a TMDB vote average above 7 available on Netflix'; 'which of this director's films are animated') and explicitly routes the agent away from the wrong sibling. It also tells the agent how to prepare inputs via get_movie_genres, search_people, search_keywords, search_companies, search_watch_providers.

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