Skip to content

tvmaze mcp server changelog

io.github.cyanheads/tvmaze-mcp-server

7 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • Resources +1
    • + tvmaze-guide

  • server.json 1 field changed
    version
    0.3.0 0.4.0

  • Tools +1
    • + tvmaze_get_person

  • AGENTS.md +10 −9

    https://raw.githubusercontent.com/cyanheads/tvmaze-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.2.1− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`− **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0− **Zod:** ^4.6.5− import { field, ShowSummary, showSummaryLines, yearRange } from './shared-schemas.js';−         `### ${show.name} (${yearRange(show)})`,− This server ships neither — everything is reachable through the seven tools, a `tvmaze://shows/{id}` resource would only mirror `tvmaze_get_show` while demanding the one thing a caller starting from a title lacks, and the domain has no recurring interaction worth templating (`docs/design.md` § Design Decisions). If that changes, the `add-resource` and `add-prompt` skills carry the current patterns — don't hand-write one from memory.−   tools: [searchShows, getShow, lookupShow, getNextEpisode, getEpisodes, getSchedule, getCast],−   index.ts                              # createApp() entry point — seven tools, instructions, service lifecycle+ **Version:** 0.3.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.3.1+ **Zod:** ^4.6.7+ import { field, inline, ShowSummary, showSummaryLines, yearRange } from './shared-schemas.js';+       .trim()+         `### ${inline(`${show.name} (${yearRange(show)})`)}`,+ This server ships neither — everything is reachable through the eight tools, a `tvmaze://shows/{id}` resource would only mirror `tvmaze_get_show` while demanding the one thing a caller starting from a title lacks, and the domain has no recurring interaction worth templating (`docs/design.md` § Design Decisions). If that changes, the `add-resource` and `add-prompt` skills carry the current patterns — don't hand-write one from memory.+   tools: [searchShows, getShow, lookupShow, getNextEpisode, getEpisodes, getSchedule, getCast, getPerson],+   index.ts                              # createApp() entry point — eight tools, instructions, service lifecycle

  • server.json 2 fields changed
    description
    Search TVmaze shows, next episodes in your timezone, episode guides, daily TV schedules, and cast. TVmaze shows, people, next episodes in your timezone, episode guides, schedules, and credits.
    version
    0.2.1 0.3.0

  • AGENTS.md +10 −11

    https://raw.githubusercontent.com/cyanheads/tvmaze-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.2.0− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.6`− **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0− **Zod:** ^4.4.3− | `ctx.fail` / `ctx.recoveryFor` | Typed throw against the tool's own `errors[]` reason union, and the declared recovery hint to forward as the throw's data. See Errors. |− | `ctx.requestId` | Unique request ID. |− `ctx.requestInput` / `ctx.inputs` are unused — no handler asks the caller for input mid-flight, which is why `createApp()` can declare a plain `sessionMode: 'stateless'` rather than `require: 'stateful'`. Adding an elicitation to any tool means revisiting that declaration. `ctx.content` is unused as well: every response is text plus `structuredContent`, and image URLs are returned as fields, not as image blocks. The framework CLAUDE.md carries the full signatures for all four.− **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reaso−       ...ctx.recoveryFor('show_not_found'),− **A 404 becomes `null` in the service, not a throw.** Every by-id fetch method returns `T | null`, so the handler decides what a miss means — a typed `ctx.fail` where the caller supplied an id, or a `{ found: false, guidance }` result where resolving an identifier was the tool's whole job (`tvmaze_lookup_show`, the title arm of `tvmaze_get_next_episode`). That keeps every `ctx.fail` lexically inside a handler, the only place the `error-contract-unthrown` and `error-contract-recovery-unforwarded`− **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the changelog entry plus a gates section); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the branch, and publishes. A caller's bri+ **Version:** 0.2.1+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0+ **Zod:** ^4.6.5+ | `ctx.fail` / `ctx.recoveryFor` | Typed throw against the tool's own `errors[]` reason union — the framework fills the declared recovery hint — and that hint as data, for building an explicit override. See Errors. |+ | `ctx.requestId` | Request ID — the one every log record of the call carries and its error envelope returns as `data.requestId`. |+ `ctx.requestInput` / `ctx.inputs` / `ctx.clientCapabilities` are unused — no handler asks the caller for input mid-flight, which is why `createApp()` can declare a plain `sessionMode: 'stateless'` rather than `require: 'stateful'`. Adding an elicitation to any tool means revisiting that declaration. `ctx.content` is unused as well: every response is text plus `structuredContent`, and image URLs are returned as fields, not as image blocks. The framework CLAUDE.md carries the full signatures for a+ **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. The framework puts it on the+ **A 404 becomes `null` in the service, not a throw.** Every by-id fetch method returns `T | null`, so the handler decides what a miss means — a typed `ctx.fail` where the caller supplied an id, or a `{ found: false, guidance }` result where resolving an identifier was the tool's whole job (`tvmaze_lookup_show`, the title arm of `tvmaze_get_next_episode`). That keeps every `ctx.fail` lexically inside a handler, the only place the `error-contract-unthrown` lint can see it. Where the service must t+ **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the release digest: theme line, `## Changes`, `## Gates`, changelog link last); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the 

  • server.json 1 field changed
    version
    0.2.0 0.2.1