# Changelog

All notable changes to this project are documented here. The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.14.0] - 2026-10-22

### Changed

- **Breaking:** raise runtime floor to Node ≥ 22.18 (was ≥ 20.11); Node 20 reached end-of-life in April 2026. ([dab54b1](https://github.com/Grinv/tmdb-mcp/commit/dab54b1), [77f087a](https://github.com/Grinv/tmdb-mcp/commit/77f087a))

## [0.13.0] - 2026-10-20

### Added

- Add `search_collections` to find a franchise's collection id by name ([7e51069](https://github.com/Grinv/tmdb-mcp/commit/7e51069)).
- Add `get_movie_releases` for movies in a country's cinemas now or opening soon ([b93b210](https://github.com/Grinv/tmdb-mcp/commit/b93b210)).
- Filter `discover_*` by country of origin (`with_origin_country`) ([c86df49](https://github.com/Grinv/tmdb-mcp/commit/c86df49)).
- Exclude companies or streaming services in `discover_*` (`without_companies`, `without_watch_providers`) ([c86df49](https://github.com/Grinv/tmdb-mcp/commit/c86df49)).
- Find movies released in a country within a date window, optionally by release type (`any_release_date_gte`/`_lte`, `with_release_type`) ([c86df49](https://github.com/Grinv/tmdb-mcp/commit/c86df49)).
- Find TV shows with an episode airing in a date window (`air_date_gte`/`_lte`) ([c86df49](https://github.com/Grinv/tmdb-mcp/commit/c86df49)).
- Filter `discover_*` by access model (subscription, free, ads, rent, buy) with `with_watch_monetization_types` ([90316a9](https://github.com/Grinv/tmdb-mcp/commit/90316a9)).
- Return `year` from `get_tv`, as `get_movie` already does ([e170e16](https://github.com/Grinv/tmdb-mcp/commit/e170e16)).
- Add `exact_year` to `search_movies`, matching only the original release year ([a15a0e2](https://github.com/Grinv/tmdb-mcp/commit/a15a0e2)).
- Return each video's `language` from `get_videos` ([a15a0e2](https://github.com/Grinv/tmdb-mcp/commit/a15a0e2)).
- Return `popularity` and `known_for` for people in `find_by_imdb_id`, as `search_people` does ([e170e16](https://github.com/Grinv/tmdb-mcp/commit/e170e16)).

### Changed

- Require a release-date window for `discover_movies`' `region`, which TMDB otherwise ignores ([c86df49](https://github.com/Grinv/tmdb-mcp/commit/c86df49)).
- Return `get_similar` as TMDB ranks it, 20 per page, without the genre filter that left pages short or empty ([a2f1fc5](https://github.com/Grinv/tmdb-mcp/commit/a2f1fc5)).
- Fetch a movie's or show's details and watch providers once, not once per `region` ([53d377c](https://github.com/Grinv/tmdb-mcp/commit/53d377c)).
- Fetch a person's credits once per language in `get_person_credits`, not once per `department`/`limit` ([5b6fe6b](https://github.com/Grinv/tmdb-mcp/commit/5b6fe6b)).
- Cache only the credit fields `get_person_credits` reads, not a prolific person's full ~900 KB filmography ([91f3c81](https://github.com/Grinv/tmdb-mcp/commit/91f3c81)).

### Fixed

- Name only the TV tools in `recommend_similar` for a TV request ([88db15e](https://github.com/Grinv/tmdb-mcp/commit/88db15e)).
- Reject a `count` of 0 in both prompts ([88db15e](https://github.com/Grinv/tmdb-mcp/commit/88db15e)).
- Let `discover_*`'s `with_*` id filters match ANY id with `|`; a comma means ALL, so "Netflix or Prime" as `8,9` found nothing ([4f00340](https://github.com/Grinv/tmdb-mcp/commit/4f00340)).
- Return English, original-language and untagged videos from `get_videos`, not just the configured language's few ([a15a0e2](https://github.com/Grinv/tmdb-mcp/commit/a15a0e2), [545b28c](https://github.com/Grinv/tmdb-mcp/commit/545b28c)).
- Keep both credits in `get_person_credits` when a movie and a TV show share an id (Ron Perlman's `Hellboy` was dropped) ([761e2e4](https://github.com/Grinv/tmdb-mcp/commit/761e2e4)).
- List a collection's undated, announced part last instead of first ([761e2e4](https://github.com/Grinv/tmdb-mcp/commit/761e2e4)).
- Return `null`, not `0`, for the score of a title nobody has voted on yet ([761e2e4](https://github.com/Grinv/tmdb-mcp/commit/761e2e4)).
- Return `null`, not `0`, for a runtime TMDB doesn't know yet ([761e2e4](https://github.com/Grinv/tmdb-mcp/commit/761e2e4)).
- Reject an inverted `release_date_gte`/`release_date_lte` range in `discover_*` instead of returning no results ([5b6fe6b](https://github.com/Grinv/tmdb-mcp/commit/5b6fe6b)).
- Name the cause, such as a rejected OMDb key, when `get_movie`/`get_tv` can't fetch ratings ([5b6fe6b](https://github.com/Grinv/tmdb-mcp/commit/5b6fe6b)).
- Keep the seasons that loaded when one of `expand_episodes`' requests fails, and don't cache that partial result ([5b6fe6b](https://github.com/Grinv/tmdb-mcp/commit/5b6fe6b), [aa430fc](https://github.com/Grinv/tmdb-mcp/commit/aa430fc)).
- Fill `year` on `get_tv_shows` cards when TMDB gives only a year ([e170e16](https://github.com/Grinv/tmdb-mcp/commit/e170e16)).
- Return `null`, not `"N/A"`, for a title or year OMDb doesn't have ([e170e16](https://github.com/Grinv/tmdb-mcp/commit/e170e16)).
- State in PRIVACY.md which responses are cached and which are always fetched fresh ([4d0d623](https://github.com/Grinv/tmdb-mcp/commit/4d0d623)).

### Security

- Don't leave the checkout token on disk in the release jobs ([a45b7c9](https://github.com/Grinv/tmdb-mcp/commit/a45b7c9)).
- Run dependency install scripts only in a release job that holds no publishing credentials ([2211c6e](https://github.com/Grinv/tmdb-mcp/commit/2211c6e)).
- Refuse to publish a release whose tag doesn't match `package.json`'s version ([2211c6e](https://github.com/Grinv/tmdb-mcp/commit/2211c6e)).

## [0.12.0] - 2026-10-03

### Added

- List a TV show's directors and writers in `get_tv_credits`, each with an episode count ([93cd3c7](https://github.com/Grinv/tmdb-mcp/commit/93cd3c7)).
- Return an episode's own `imdb_id`/`imdb_url` from `get_tv_episode`, so `get_ratings` can rate a single episode ([7f22649](https://github.com/Grinv/tmdb-mcp/commit/7f22649)).

### Changed

- Rank `get_tv_credits`' cast by episodes across every season, not just the final season's regulars ([93cd3c7](https://github.com/Grinv/tmdb-mcp/commit/93cd3c7)).
- Upgrade the MCP SDK to 2.3.0 and Zod to 4.6.5 ([6ec6335](https://github.com/Grinv/tmdb-mcp/commit/6ec6335)).
- Publish nullable fields in `outputSchema` as `"type": ["…", "null"]` instead of an `anyOf` pair ([6ec6335](https://github.com/Grinv/tmdb-mcp/commit/6ec6335)).

### Fixed

- Keep TMDB's `vote_average` and the IMDb/RT/Metacritic `ratings` apart in every tool and field description ([3e6b4c5](https://github.com/Grinv/tmdb-mcp/commit/3e6b4c5)).
- Warn that `get_ratings`' title lookup can match a same-named work (`Halloween` returns the 1978 film) ([3e6b4c5](https://github.com/Grinv/tmdb-mcp/commit/3e6b4c5)).
- Drop talk- and news-show guest spots from `get_person_credits` when TMDB leaves `character` blank ([50b1652](https://github.com/Grinv/tmdb-mcp/commit/50b1652)).
- Cap `total_pages` at 500, the last page TMDB serves; it reported 1001 ([e27943d](https://github.com/Grinv/tmdb-mcp/commit/e27943d)).
- Reject `discover_*` filters TMDB silently ignores: a lone `watch_region` or `certification_country`, or a blank `certification` ([1ad7d28](https://github.com/Grinv/tmdb-mcp/commit/1ad7d28)).
- Trim the whitespace TMDB pads some certifications and provider names with ([5748559](https://github.com/Grinv/tmdb-mcp/commit/5748559)).
- Stop `top_by_entity` asking the model to filter by genre when no genre was given ([028b23e](https://github.com/Grinv/tmdb-mcp/commit/028b23e)).
- Name `discover_*`'s score filters as TMDB vote average ([1d9cd79](https://github.com/Grinv/tmdb-mcp/commit/1d9cd79)).
- Describe what a well-formed but untranslated `language` returns ([1d9cd79](https://github.com/Grinv/tmdb-mcp/commit/1d9cd79), [9d0a632](https://github.com/Grinv/tmdb-mcp/commit/9d0a632)).
- Say that `get_ratings`' awards text covers the episode when given an episode's IMDb id ([f182fd6](https://github.com/Grinv/tmdb-mcp/commit/f182fd6)).
- Correct PRIVACY.md and SECURITY.md on how long cached responses stay in memory ([4621f20](https://github.com/Grinv/tmdb-mcp/commit/4621f20)).
- State in PRIVACY.md that ratings enrichment calls both TMDB and OMDb ([4621f20](https://github.com/Grinv/tmdb-mcp/commit/4621f20)).

### Security

- Reject a `tools/call` whose arguments hold over 100 array elements and object members ([bb6dea9](https://github.com/Grinv/tmdb-mcp/commit/bb6dea9)).

## [0.11.0] - 2026-08-15

### Changed

- Trim redundant text from several tool and prompt descriptions to cut per-request token cost ([153d2fd](https://github.com/Grinv/tmdb-mcp/commit/153d2fd)).

### Fixed

- Drop OMDb enrichment whose release year is unrelated to TMDB's, instead of attaching another title's ratings and awards when TMDB's `imdb_id` is stale ([d5a95f3](https://github.com/Grinv/tmdb-mcp/commit/d5a95f3)).
- Reject non-numeric ids in `discover_*`'s id-list filters, which TMDB answers with an empty result set indistinguishable from a real one ([99db051](https://github.com/Grinv/tmdb-mcp/commit/99db051)).
- Give `get_movies`/`get_tv_shows`' per-id `reason` the same friendly text as every other error surface, not the raw upstream body ([0ca3c4e](https://github.com/Grinv/tmdb-mcp/commit/0ca3c4e)).
- Stop `expand_episodes` evicting later seasons over specials it could never return in full: a 39-season show now returns 250 episodes, not 228 ([bb917ad](https://github.com/Grinv/tmdb-mcp/commit/bb917ad)).
- Act on `top_by_entity`'s `entity_type` in the generated plan's steps, not just its intro line ([2e9cf21](https://github.com/Grinv/tmdb-mcp/commit/2e9cf21)).
- Report an `imdb_id` OMDb doesn't recognize as no match, rather than as an upstream failure ([cc80432](https://github.com/Grinv/tmdb-mcp/commit/cc80432)).
- Disclose that `search_tv`'s `year` is a hard first-air-year match, unlike `search_movies`' soft filter ([fda9199](https://github.com/Grinv/tmdb-mcp/commit/fda9199)).
- Disclose that `expand_episodes` spends its 250-episode budget from season 0 up, so specials are served before later seasons ([bb917ad](https://github.com/Grinv/tmdb-mcp/commit/bb917ad)).

### Security

- Redact the fatal startup error, which ran before the logger existed ([8743788](https://github.com/Grinv/tmdb-mcp/commit/8743788)).
- Cap the upstream response body read and bound a forwarded upstream error message ([811d4f2](https://github.com/Grinv/tmdb-mcp/commit/811d4f2)).

## [0.10.1] - 2026-07-30

### Changed

- Tighten every date/timestamp field in tool output schemas from a bare string to a proper ISO date/date-time format ([ba90249](https://github.com/Grinv/tmdb-mcp/commit/ba90249)).

### Fixed

- Reject calendar-invalid dates (e.g. `2024-02-30`) in `discover_movies`/`discover_tv`'s date filters instead of forwarding them to TMDB unchecked ([e880886](https://github.com/Grinv/tmdb-mcp/commit/e880886)).
- Degrade a malformed date/timestamp field (e.g. an unusual `birthday` on an older person record) to `null` instead of failing the whole tool call ([d74aa30](https://github.com/Grinv/tmdb-mcp/commit/d74aa30)).
- Correct `discover_movies`/`discover_tv`'s `certification` field: matching is case-insensitive, not case-sensitive as previously described ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Correct `search_watch_providers`' `media_type` field: a service's id doesn't change between movie and TV, only whether it's offered at all ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Disclose that `get_videos` is pinned to the server's `TMDB_LANGUAGE` with no per-call override, which can shrink its result set ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Disclose that `get_similar`'s `total_pages`/`total_results` are TMDB's raw, pre-filter counts, not the actual per-page result count ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Disclose that `search_movies`' `year` filter is soft, unlike `discover_movies`'/`search_tv`'s hard year filters ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Disclose that a `get_reviews` review's `rating` can be null ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Disclose in `recommend_similar`'s generated plan that `get_movies`/`get_tv_shows` cap batches at 20 ids ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Add `search_watch_providers` to `discover_movies`'/`discover_tv`'s id-resolver roundup (`discover_tv` had none at all) ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).
- Point `without_keywords` to `search_keywords` for id resolution, like its `with_keywords` sibling ([0d90dff](https://github.com/Grinv/tmdb-mcp/commit/0d90dff)).

## [0.10.0] - 2026-07-30

### Added

- Add `search_watch_providers` — resolves a streaming/rental service name (e.g. "Netflix") to its TMDB numeric provider id, for `discover_movies`/`discover_tv`'s `with_watch_providers` filter, paginated 20-per-page like every sibling `search_*` tool. TMDB has no name-based lookup of its own (hundreds of providers, ids vary by region), so this was previously a guess-the-id gap ([79123a5](https://github.com/Grinv/tmdb-mcp/commit/79123a5), [5243541](https://github.com/Grinv/tmdb-mcp/commit/5243541)).
- Add `PRIVACY.md` and `SECURITY.md` policies, both linked from the README ([b84340b](https://github.com/Grinv/tmdb-mcp/commit/b84340b), [16b375c](https://github.com/Grinv/tmdb-mcp/commit/16b375c), [bf55ff9](https://github.com/Grinv/tmdb-mcp/commit/bf55ff9)).
- Add an original icon for the MCPB submission ([ce59d35](https://github.com/Grinv/tmdb-mcp/commit/ce59d35)).

### Changed

- Raise runtime floor to Node ≥ 20.11 (was ≥ 20) ([0630a1a](https://github.com/Grinv/tmdb-mcp/commit/0630a1a), [d22c35b](https://github.com/Grinv/tmdb-mcp/commit/d22c35b)).
- Let a cancelled MCP tool call stop waiting immediately instead of hanging until the upstream request finishes, for every tool, not just cached ones ([5243541](https://github.com/Grinv/tmdb-mcp/commit/5243541), [0d32b03](https://github.com/Grinv/tmdb-mcp/commit/0d32b03)).

### Fixed

- Stop shipping contributor-only tooling (`.claude/`, `skills/`, `AGENTS.md`, `glama.json`, etc.) inside the `.mcpb` bundle — 39 files down to 10 ([f23617d](https://github.com/Grinv/tmdb-mcp/commit/f23617d), [9afaa5a](https://github.com/Grinv/tmdb-mcp/commit/9afaa5a)).
- Reject `min_runtime` greater than `max_runtime` on `discover_movies`/`discover_tv` instead of silently returning an empty result set ([1fe8de8](https://github.com/Grinv/tmdb-mcp/commit/1fe8de8)).
- Correct `get_tv_credits`' description: TMDB's TV credits data doesn't reliably expose director/writer/creator jobs the way movie credits do ([103e4d1](https://github.com/Grinv/tmdb-mcp/commit/103e4d1)).
- Disclose that `find_by_imdb_id` silently drops a match for an episode/season-level IMDb id ([c6562e8](https://github.com/Grinv/tmdb-mcp/commit/c6562e8)).
- Disclose that `discover_tv`'s `with_networks` has no name-based id resolver, unlike its sibling filters ([61bff64](https://github.com/Grinv/tmdb-mcp/commit/61bff64)).
- Document `get_tv`'s `created_by` field, previously returned but unmentioned in its description ([103e4d1](https://github.com/Grinv/tmdb-mcp/commit/103e4d1)).
- Point `discover_movies`'s `with_cast`/`with_crew`/`with_people` to `search_people` for id resolution, matching every sibling filter ([61bff64](https://github.com/Grinv/tmdb-mcp/commit/61bff64)).

### Security

- Redact OMDb's `apikey` query parameter from log output and, now, from tool-result error text too, closing gaps where a retried request's logged URL or an upstream error echoing the request back could leak `OMDB_API_KEY` ([573a4cf](https://github.com/Grinv/tmdb-mcp/commit/573a4cf), [c70a80d](https://github.com/Grinv/tmdb-mcp/commit/c70a80d)).

## [0.9.0] - 2026-07-29

### Added

- Advertise `cacheHints` on `tools/list`/`prompts/list`/`server/discover` for protocol revision 2026-07-28, since this server's tool/prompt list never changes at runtime ([1f8246b](https://github.com/Grinv/tmdb-mcp/commit/1f8246b)).
- Add `include_adult` to `discover_movies`/`discover_tv` — verified live to change the result set on both endpoints ([7ed7c99](https://github.com/Grinv/tmdb-mcp/commit/7ed7c99)).
- Add `region` to `discover_movies` (movie-only) — its documented date-filtering effect wasn't reproducible live, only disclosed as-is ([7ed7c99](https://github.com/Grinv/tmdb-mcp/commit/7ed7c99)).
- Add `type` (`movie`/`series`/`episode`) to `get_ratings`'s title lookup, to disambiguate same-titled entries of different types (e.g. "Chuck" the movie vs. the series) ([6a35918](https://github.com/Grinv/tmdb-mcp/commit/6a35918)).

### Fixed

- Reject an unrecognized `sort_by` on `discover_movies`/`discover_tv` via a strict, per-kind enum instead of silently falling back to TMDB's default order ([7ed7c99](https://github.com/Grinv/tmdb-mcp/commit/7ed7c99)).
- Fix `top_by_entity`'s TV step to still apply a given `genre` to `discover_tv` for a COMPANY ([d520865](https://github.com/Grinv/tmdb-mcp/commit/d520865)).
- Remove `get_movies`/`get_tv_shows`' `region` param — a fully inert input, since the compact card drops the only fields it ever affected ([083e231](https://github.com/Grinv/tmdb-mcp/commit/083e231)).
- Disclose that `search_movies`' `region` only picks which country's release_date is shown per result, unlike `get_watch_providers`' `region` ([083e231](https://github.com/Grinv/tmdb-mcp/commit/083e231)).
- Disclose that a season skipped by `get_tv`'s `expand_episodes` budget also loses its `overview`/`poster_url`, not just its episode list ([0e85a8d](https://github.com/Grinv/tmdb-mcp/commit/0e85a8d)).

## [0.8.1] - 2026-07-23

### Fixed

- Reject a malformed `language`/`TMDB_LANGUAGE` up front instead of letting TMDB silently return null overview/title fields for a well-formed-looking but nonexistent code, with no signal anything went wrong ([90e0b96](https://github.com/Grinv/tmdb-mcp/commit/90e0b96)).
- Drop each episode's `overview` from `get_tv`'s `expand_episodes` aggregate, since the combined episode cap alone didn't keep the response usable; `get_tv_season` (single season) is unaffected ([b971897](https://github.com/Grinv/tmdb-mcp/commit/b971897)).
- Lower `get_tv`'s `expand_episodes` combined episode cap from 500 to 250 — 500 was still too large on the longest-running shows even without per-episode overviews ([489e234](https://github.com/Grinv/tmdb-mcp/commit/489e234)).
- Fix `top_by_entity`'s prompt to drop the movies/TV branch `media_type` excludes, instead of only wording the intro sentence differently ([6906d47](https://github.com/Grinv/tmdb-mcp/commit/6906d47)).
- Reject a malformed `with_original_language` up front instead of silently no-op'ing the `discover_movies`/`discover_tv` filter, same as `language` ([9af534d](https://github.com/Grinv/tmdb-mcp/commit/9af534d)).
- Fix `top_by_entity`'s TV step referencing a movies-filter explanation that isn't shown when `media_type=tv` ([8a2fa96](https://github.com/Grinv/tmdb-mcp/commit/8a2fa96)).
- Cap `get_tv`'s `expand_episodes` aggregate by actual serialized size instead of episode count alone, and stop fetching seasons already known to fall entirely beyond the budget ([6f171fa](https://github.com/Grinv/tmdb-mcp/commit/6f171fa)).

## [0.8.0] - 2026-07-22

### Added

- Add `get_movies`/`get_tv_shows`: a compact card (title/name, year, genres, vote average, opt-in ratings) for 1-20 ids in one call, instead of one `get_movie`/`get_tv` call per title ([ebe4d79](https://github.com/Grinv/tmdb-mcp/commit/ebe4d79)).
- Add `search_companies`, resolving a production company name (e.g. "A24") to the id `with_companies` needs ([913098a](https://github.com/Grinv/tmdb-mcp/commit/913098a)).
- Add `department` and `limit` params to `get_person_credits`, so a prolific multi-hyphenate's filmography in one role isn't crowded out by their other credits or the default 25-credit cap ([64b2869](https://github.com/Grinv/tmdb-mcp/commit/64b2869), [c99141a](https://github.com/Grinv/tmdb-mcp/commit/c99141a)).
- Add `with_type`/`with_status` to `discover_tv` (e.g. `with_type: "Miniseries"`), and `number_of_seasons`/`number_of_episodes` to `get_tv_shows`' card ([abddb53](https://github.com/Grinv/tmdb-mcp/commit/abddb53), [48703cf](https://github.com/Grinv/tmdb-mcp/commit/48703cf)).
- Add `certification`/`certification_country` to `discover_tv` (e.g. `certification: "TV-Y7"`) — verified live against the real API, though TMDB's own docs only list this for movies ([94284b4](https://github.com/Grinv/tmdb-mcp/commit/94284b4)).
- Add a `top_by_entity` prompt: top titles from a person or company/studio, optionally by genre, falling back to `get_person_credits` for a person's TV work since `discover_tv` can't filter by person ([3b84310](https://github.com/Grinv/tmdb-mcp/commit/3b84310)).

### Changed

- Sharpen several tool/prompt descriptions per a TDQS audit (`get_movie`/`get_tv` now name `get_movies`/`get_tv_shows`; `get_trending` discloses per-row `media_type`; genre tools point at `discover_*`; `recommend_similar` now fetches its shortlist's ratings via `get_movies`/`get_tv_shows` instead of one call per title) ([c65d507](https://github.com/Grinv/tmdb-mcp/commit/c65d507)).
- Cross-reference `get_person_credits` (no genre filter) with `discover_movies`'s `with_crew`/`with_cast`/`with_people` + `with_genres` — the right combination for "this person's work in one genre" ([b46ed60](https://github.com/Grinv/tmdb-mcp/commit/b46ed60)).
- Disclose `get_movie`/`get_tv`/`get_ratings`' previously-undocumented `awards` and `ratings.rated` fields (both from OMDb), and clarify `awards` isn't Oscar-specific ([ea88dc0](https://github.com/Grinv/tmdb-mcp/commit/ea88dc0)).
- Document `certification`'s real edge cases (case-sensitive for movies, silently disabled by an unrecognized country, no fallback to another country unlike `get_movie`/`get_tv`), verified live ([94284b4](https://github.com/Grinv/tmdb-mcp/commit/94284b4)).

### Fixed

- Filter `get_similar` results down to titles sharing at least half the source's genres, since a broad genre (e.g. "Drama") could surface unrelated titles from across TMDB's catalog ([ebe4d79](https://github.com/Grinv/tmdb-mcp/commit/ebe4d79)).
- Fix `get_person_credits` capping crew by row count instead of distinct title — a multi-hyphenate's own films (2+ rows each) could get pushed out of the cap entirely ([64b2869](https://github.com/Grinv/tmdb-mcp/commit/64b2869)).
- Fix `discover_tv`'s and `get_person_credits`' descriptions implying TV cast/crew/person filters are a silent no-op — they're rejected outright by input validation, and `get_person_credits` wrongly suggested pairing its results with `discover_tv` for a person's genre-filtered TV work, which isn't possible at all ([31215c4](https://github.com/Grinv/tmdb-mcp/commit/31215c4), [e5f97fa](https://github.com/Grinv/tmdb-mcp/commit/e5f97fa)).

## [0.7.1] - 2026-07-22

### Fixed

- Cap the combined episode count across all seasons at 500 in `get_tv`'s `expand_episodes`, since a 30+ season show (e.g. long-running sitcoms) could still blow past a usable response size even with each season's own 50-episode cap ([c74a261](https://github.com/Grinv/tmdb-mcp/commit/c74a261)).
- Widen `get_person_credits`' self-appearance filter to also exclude `Himself`/`Herself`-credited cast entries, not just `Self`-prefixed ones ([c74a261](https://github.com/Grinv/tmdb-mcp/commit/c74a261)).

## [0.7.0] - 2026-07-22

Everything below is one commit: [6d6ff93](https://github.com/Grinv/tmdb-mcp/commit/6d6ff93).

### Added

- Surface `_meta: {"tmdb-mcp/stale": true}` on a tool result when the upstream (TMDB/OMDb) was down and the response was served from a stale cache entry, so a caller can tell degraded data from a fresh answer instead of it looking identical.

### Fixed

- Fix every tool silently dropping unknown/misspelled parameters (e.g. a typo'd filter name in `discover_movies`/`discover_tv`) instead of raising a validation error — all `inputSchema`s are now `.strict()`.
- Fix `get_tv`'s `expand_episodes` failing outright on shows with more than 20 seasons (e.g. long-running sitcoms) by chunking the bulk season request under TMDB's 20-remote-call `append_to_response` limit.
- Cap a season's episode list (`get_tv_season`, `get_tv`'s `seasons_detail`) at 50 so a "Specials" season with hundreds of bonus clips can't blow past a usable response size; `episode_count` still reports the true total.
- Fix `get_person_credits` burying an actor's actual film/TV roles under talk-show guest spots and repeat same-show appearances — "Self"-credited cast entries are now excluded and same-title duplicates deduped before ranking.
- Reject `discover_movies`/`discover_tv` calls where `certification`/`with_watch_providers` are set without their required `certification_country`/`watch_region` pair, and where `min_rating` exceeds `max_rating` — TMDB previously ignored these incomplete filters without any error.
- Reject a `page` above TMDB's hard cap of 500 up front instead of surfacing TMDB's raw error.

## [0.6.0] - 2026-07-21

Everything below is one commit: [f2a88e7](https://github.com/Grinv/tmdb-mcp/commit/f2a88e7).

### Added

- Add `outputSchema`/`structuredContent` (MCP SEP-2106) to every tool, describing its exact return shape so clients can validate and consume it as typed data instead of parsing the text-JSON mirror.

### Changed

- Fix `get_movie_recommendations`/`get_tv_recommendations`/`get_similar` descriptions implying `get_similar` gives thematically tighter results than recommendations — in practice TMDB's `/similar` (genre/keyword overlap) is the blunter, noisier heuristic, while `/recommendations` (co-viewing data) is usually more thematically relevant. Descriptions now point the calling model at recommendations first.
- The `recommend_similar` prompt now tells the model to weigh `get_movie_recommendations` as the stronger signal and use `get_similar` only to fill gaps, matching the description fix above.
- Migrate to MCP TypeScript SDK v2 (`@modelcontextprotocol/server`) and adopt protocol revision 2026-07-28.

### Fixed

- Fix several `string | null` fields (`imdb_id`, `status`, `known_for_department`, season/episode `name`/`air_date`, and others across movie/TV/person/OMDb results) leaking an empty string instead of `null` when TMDB/OMDb sent `""` rather than omitting the field or sending `null`.
- An invalid environment variable (e.g. a typo'd `LOG_LEVEL`, a malformed `TMDB_REGION`) now fails startup with a readable message naming the field and constraint, instead of a raw ZodError stack.

### Removed

- Drop MCP log mirroring (`notifications/message`, `logging/setLevel`) — deprecated for stdio servers as of protocol revision 2026-07-28 (SEP-2577) in favor of stderr, which any MCP host spawning this server as a child process already reads. Logs are stderr-only now.

## [0.5.1] - 2026-07-20

Everything below is one commit: [04789ef](https://github.com/Grinv/tmdb-mcp/commit/04789ef).

### Fixed

- Fix `search_people` mis-shaping every result as a TV show (`media_type: "tv"`, wrong fields) instead of a person — TMDB's `/search/person` endpoint, unlike `/search/multi`, never sends `media_type`.

### Changed

- Sharpen `get_person_credits`, `get_watch_providers`, `search_multi`, `get_person` and the shared pagination parameter's descriptions: disclose that crew credits lack `vote_average` (unlike cast credits), the `available:false`/`available_regions` fallback for an unlisted region, cross-references between the search tools, and TMDB's 20-result page size.

## [0.5.0] - 2026-07-20

Everything below is one commit: [70c03cb](https://github.com/Grinv/tmdb-mcp/commit/70c03cb).

### Added

- Add `expand_episodes` to `get_tv`, fetching every season's full episode list (`seasons_detail`) in one extra request instead of calling `get_tv_season` once per season.

## [0.4.1] - 2026-07-18

Everything below is one commit: [823a490](https://github.com/Grinv/tmdb-mcp/commit/823a490).

### Changed

- `get_movie`/`get_tv` no longer return a null certification just because the requested region lacks one — they fall back to the US rating, then any available country, and report which region the value actually came from via `certification_region`.

## [0.4.0] - 2026-07-18

### Added

- Add the `recommend_similar` MCP prompt, which plans a search for titles similar to one the user liked via `get_similar`/recommendations/discover instead of the model's own knowledge ([2d85f67](https://github.com/Grinv/tmdb-mcp/commit/2d85f67)); the `.mcpb` install preview now lists it too ([be487dc](https://github.com/Grinv/tmdb-mcp/commit/be487dc)).
- The search/discover/recommendations/similar/reviews tools now honor MCP client cancellation, aborting the in-flight TMDB request instead of running it to completion in the background ([8109dc9](https://github.com/Grinv/tmdb-mcp/commit/8109dc9), [55fe55f](https://github.com/Grinv/tmdb-mcp/commit/55fe55f)).

### Changed

- Sharpen `get_movie`/`get_tv`/`get_ratings` descriptions to disclose the ratings degrade-to-`{found:false}` shape, and `get_trending`'s `media_type` default ([e0d520d](https://github.com/Grinv/tmdb-mcp/commit/e0d520d)).

### Fixed

- Tool parameter descriptions naming a region default now reflect the server's actual `TMDB_REGION` instead of always saying `'US'` ([daec76a](https://github.com/Grinv/tmdb-mcp/commit/daec76a)).

## [0.3.2] - 2026-07-18

### Fixed

- `get_watch_providers` now honors the configured `TMDB_REGION` default instead of always falling back to `"US"`, matching `search_movies`/`get_movie`/`get_tv` ([d0ee332](https://github.com/Grinv/tmdb-mcp/commit/d0ee332)).

### Changed

- Sharpen several tool descriptions — disambiguate `get_movie_recommendations`/`get_tv_recommendations` from `get_similar`, and note when to prefer `search_movies`/`search_tv`/`search_people` over `search_multi` ([d0ee332](https://github.com/Grinv/tmdb-mcp/commit/d0ee332)).

## [0.3.1] - 2026-07-18

### Changed

- Raise runtime floor to Node ≥ 20 (was ≥ 18) ([98499fd](https://github.com/Grinv/tmdb-mcp/commit/98499fd)).

### Fixed

- Prevent `RateLimiter` from assuming `Date.now()` is always far from the `0` epoch, which could misfire near epoch ([98499fd](https://github.com/Grinv/tmdb-mcp/commit/98499fd)).

## [0.3.0] - 2026-07-09

### Added

- Add `get_similar` — TMDB's algorithmic "similar titles" for a movie or TV show ([875ebbf](https://github.com/Grinv/tmdb-mcp/commit/875ebbf)).
- Add `get_reviews` — user reviews for a movie or TV show ([875ebbf](https://github.com/Grinv/tmdb-mcp/commit/875ebbf)).
- Add `get_collection` — a movie franchise/collection and all its parts in release order ([875ebbf](https://github.com/Grinv/tmdb-mcp/commit/875ebbf)).
- Add `collection` and `origin_country` to `get_movie` ([875ebbf](https://github.com/Grinv/tmdb-mcp/commit/875ebbf)).
- Add `next_episode_to_air`/`last_episode_to_air`, a `seasons` summary, `homepage` and `type` to `get_tv` ([875ebbf](https://github.com/Grinv/tmdb-mcp/commit/875ebbf)).

### Fixed

- Scope `get_watch_providers`' cache key by region — it previously returned another region's cached result ([cb32e76](https://github.com/Grinv/tmdb-mcp/commit/cb32e76)).

## [0.2.0] - 2026-07-09

### Added

- Support the MCP logging capability, mirroring stderr log lines to the client as `notifications/message` ([e7333f5](https://github.com/Grinv/tmdb-mcp/commit/e7333f5)).
- Publish to the MCP Registry (npm package, `environmentVariables`) via `mcp-publisher` ([e7333f5](https://github.com/Grinv/tmdb-mcp/commit/e7333f5)).

### Changed

- Share one in-flight fetch across concurrent callers in `TtlCache` ([e7333f5](https://github.com/Grinv/tmdb-mcp/commit/e7333f5)).

### Fixed

- Prevent `dist/index.js` from crashing standalone (`ERR_MODULE_NOT_FOUND`) by inlining the SDK/`zod` instead of leaving them external ([e7333f5](https://github.com/Grinv/tmdb-mcp/commit/e7333f5)).
- Treat unfilled `.mcpb` optional fields as unset instead of the literal `${user_config.x}` string ([e7333f5](https://github.com/Grinv/tmdb-mcp/commit/e7333f5)).

## [0.1.1] - 2026-06-30

### Added

- Publish to npm (`npx -y tmdb-mcp` now works) via Trusted Publishing (OIDC) on each release ([427f4a6](https://github.com/Grinv/tmdb-mcp/commit/427f4a6)).

## [0.1.0] - 2026-06-30

### Added

- Ship the initial release: a TMDB-backed MCP server (search, details, credits, recommendations, trending, genres, ratings) ([98b952f](https://github.com/Grinv/tmdb-mcp/commit/98b952f)).
- Add `discover_movies`/`discover_tv` — structured filtering by genre, date/rating/runtime range, people, companies, keywords, watch providers and certification ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8), [31f74da](https://github.com/Grinv/tmdb-mcp/commit/31f74da)).
- Add `get_watch_providers` — where to stream/rent/buy a movie or show, by region ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8)).
- Add `get_person_credits` — a person's filmography, most popular first ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8)).
- Add `get_videos` — trailers/teasers/clips for a movie or show ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8)).
- Add `find_by_imdb_id` — resolve an IMDb id to TMDB movie/TV/person entities ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8)).
- Add `get_tv_season`/`get_tv_episode` — season overview and single-episode details ([e936cf8](https://github.com/Grinv/tmdb-mcp/commit/e936cf8)).
- Add `search_keywords` — resolve keyword names to ids for the `with_keywords` filter ([31f74da](https://github.com/Grinv/tmdb-mcp/commit/31f74da)).
- Add age/content certifications to `get_movie`/`get_tv` ([51304b2](https://github.com/Grinv/tmdb-mcp/commit/51304b2)).
- Add localization via `TMDB_LANGUAGE`/`TMDB_REGION`, with per-call overrides ([31f74da](https://github.com/Grinv/tmdb-mcp/commit/31f74da)).
- Add OMDb enrichment: IMDb/Rotten Tomatoes/Metacritic ratings folded into `get_movie`/`get_tv`, or standalone via `get_ratings` ([98b952f](https://github.com/Grinv/tmdb-mcp/commit/98b952f)).
- Build on the reusable MCP carcass (`lib/`), with a `.mcpb` manifest and GitHub Actions CI/release ([98b952f](https://github.com/Grinv/tmdb-mcp/commit/98b952f)).
