tvmaze-mcp-server

v0.1.2 pre-1.0

Search TVmaze shows, next episodes in your timezone, episode guides, daily TV schedules, and cast via MCP. STDIO or Streamable HTTP.

tvmaze.caseyjhand.com/mcp
claude mcp add --transport http tvmaze-mcp-server https://tvmaze.caseyjhand.com/mcp
codex mcp add tvmaze-mcp-server --url https://tvmaze.caseyjhand.com/mcp
{
  "mcpServers": {
    "tvmaze-mcp-server": {
      "url": "https://tvmaze.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http tvmaze-mcp-server https://tvmaze.caseyjhand.com/mcp
{
  "mcpServers": {
    "tvmaze-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://tvmaze.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "tvmaze-mcp-server": {
      "type": "http",
      "url": "https://tvmaze.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://tvmaze.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

7

tvmaze_search_shows

open-world

Search television shows by title and return up to 10 matches, each with its network or streaming service, production status, genres, rating, and ids in other catalogs. Matching is fuzzy, so small typos still resolve. The result set is hard-capped at 10 by the source and cannot be paged — narrow the title to reach an eleventh match. To go the other way, from an IMDb or TheTVDB id to a show, use tvmaze_lookup_show.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_search_shows",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Show title or title fragment. Matched fuzzily against every show title in the database, so minor misspellings still resolve."
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}
view source ↗

tvmaze_get_show

open-world

Fetch a television show by its TVmaze id: full profile, weekly broadcast slot, season list, and the previous and next episode when the source has them. This is the entry point for an id returned by tvmaze_search_shows or tvmaze_lookup_show. For the episode list itself use tvmaze_get_episodes, and for credits use tvmaze_get_cast.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_get_show",
    "arguments": {
      "show_id": "<show_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "show_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "TVmaze show id, from tvmaze_search_shows, tvmaze_lookup_show, or tvmaze_get_schedule."
    },
    "timezone": {
      "description": "IANA timezone name for rendering the previous and next episode air times, e.g. \"America/Los_Angeles\" or \"Europe/London\". Defaults to the server-configured timezone.",
      "type": "string",
      "pattern": "^[A-Za-z0-9_+-]+(\\/[A-Za-z0-9_+-]+){0,2}$"
    }
  },
  "required": [
    "show_id"
  ],
  "additionalProperties": false
}
view source ↗

tvmaze_lookup_show

open-world

Resolve a television show from its id in another catalog — IMDb, TheTVDB, or TVRage — and return the matching TVmaze profile. Use this to cross a show id from another source into TVmaze. A show absent from TVmaze is reported as a miss with guidance, not an error.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_lookup_show",
    "arguments": {
      "source": "imdb",
      "external_id": "<external_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "const": "imdb",
          "description": "Look up by IMDb title id."
        },
        "external_id": {
          "type": "string",
          "pattern": "^tt\\d{7,}$",
          "description": "IMDb title id including the \"tt\" prefix, e.g. \"tt0903747\"."
        }
      },
      "required": [
        "source",
        "external_id"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "const": "thetvdb",
          "description": "Look up by TheTVDB series id."
        },
        "external_id": {
          "type": "string",
          "pattern": "^\\d+$",
          "description": "TheTVDB series id as digits, e.g. \"81189\"."
        }
      },
      "required": [
        "source",
        "external_id"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "const": "tvrage",
          "description": "Look up by TVRage show id. TVRage is defunct; these ids appear only in older records."
        },
        "external_id": {
          "type": "string",
          "pattern": "^\\d+$",
          "description": "TVRage show id as digits."
        }
      },
      "required": [
        "source",
        "external_id"
      ],
      "additionalProperties": false
    }
  ]
}
view source ↗

tvmaze_get_next_episode

open-world

Report when a show’s next episode airs, converted to a viewer timezone. Accepts a TVmaze id or a show title — a title is resolved with a stricter single-match search than tvmaze_search_shows uses. A show with no scheduled next episode is reported as a miss carrying its most recent episode, which is the normal state for a series between seasons.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_get_next_episode",
    "arguments": {
      "by": "id",
      "show_id": "<show_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "by": {
          "type": "string",
          "const": "id",
          "description": "Identify the show by its TVmaze id."
        },
        "show_id": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "TVmaze show id, from tvmaze_search_shows, tvmaze_lookup_show, or tvmaze_get_schedule."
        },
        "timezone": {
          "description": "IANA timezone name for the air time, e.g. \"America/Los_Angeles\". Defaults to the server-configured timezone.",
          "type": "string",
          "pattern": "^[A-Za-z0-9_+-]+(\\/[A-Za-z0-9_+-]+){0,2}$"
        }
      },
      "required": [
        "by",
        "show_id"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "by": {
          "type": "string",
          "const": "title",
          "description": "Identify the show by title. Resolved to a single best match."
        },
        "title": {
          "type": "string",
          "minLength": 1,
          "description": "Show title. Matched to one best result; when several shows share a title, resolve the id with tvmaze_search_shows first and call again with by \"id\"."
        },
        "timezone": {
          "description": "IANA timezone name for the air time, e.g. \"America/Los_Angeles\". Defaults to the server-configured timezone.",
          "type": "string",
          "pattern": "^[A-Za-z0-9_+-]+(\\/[A-Za-z0-9_+-]+){0,2}$"
        }
      },
      "required": [
        "by",
        "title"
      ],
      "additionalProperties": false
    }
  ]
}
view source ↗

tvmaze_get_episodes

open-world

List a show’s episodes with air times, runtimes, and synopses. Pass a season number to list one season, which is the cheaper path and the usual one; omit it to walk the whole run, which is paged because a long-running series returns hundreds of episodes. Specials are excluded unless include_specials is set.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_get_episodes",
    "arguments": {
      "show_id": "<show_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "show_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "TVmaze show id, from tvmaze_search_shows, tvmaze_lookup_show, or tvmaze_get_schedule."
    },
    "season": {
      "description": "Season number to list, as numbered in the season list from tvmaze_get_show. Omit to list every episode of the series. Daily shows number seasons by calendar year.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "include_specials": {
      "default": false,
      "description": "Include specials alongside regular episodes. Off by default because specials roughly double the result count on a series that has many.",
      "type": "boolean"
    },
    "limit": {
      "default": 50,
      "description": "Maximum episodes to return in one call. Raise it for a short series; the default keeps a long run inside a reasonable response size.",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "description": "Continuation token from a previous call’s next_cursor. Omit for the first page.",
      "type": "string"
    },
    "timezone": {
      "description": "IANA timezone name for the air times, e.g. \"America/Los_Angeles\". Defaults to the server-configured timezone.",
      "type": "string",
      "pattern": "^[A-Za-z0-9_+-]+(\\/[A-Za-z0-9_+-]+){0,2}$"
    }
  },
  "required": [
    "show_id",
    "include_specials",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

tvmaze_get_schedule

open-world

List television episodes airing on a given date. Scope "linear" covers broadcast and cable networks in one country; "streaming" covers streaming services — global services such as Netflix and Prime Video when no country is given, or that country’s local streaming services when one is. Scope "all" merges both. The source caches schedule data for up to an hour, so a same-day listing can lag a late change.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_get_schedule",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "date": {
      "description": "Date to list, ISO 8601 (YYYY-MM-DD). Defaults to today in the requested timezone.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 country code, e.g. \"US\", \"GB\", \"JP\". The United Kingdom is \"GB\". Required in effect for scopes \"linear\" and \"all\" — omitted, it falls back to the server-configured country. For scope \"streaming\", omitting it selects global streaming services rather than one country’s local ones.",
      "type": "string",
      "pattern": "^[A-Za-z]{2}$"
    },
    "scope": {
      "default": "linear",
      "description": "Which feed to read. \"linear\" is broadcast and cable networks; \"streaming\" is streaming services; \"all\" merges both and costs three upstream requests.",
      "type": "string",
      "enum": [
        "linear",
        "streaming",
        "all"
      ]
    },
    "timezone": {
      "description": "IANA timezone name for the air times, e.g. \"America/Los_Angeles\". Defaults to the server-configured timezone. Also decides what \"today\" means when date is omitted.",
      "type": "string",
      "pattern": "^[A-Za-z0-9_+-]+(\\/[A-Za-z0-9_+-]+){0,2}$"
    },
    "limit": {
      "default": 50,
      "description": "Maximum entries to return in one call. A full day in one country runs to roughly 50 broadcast entries and over 120 global streaming entries.",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "description": "Continuation token from a previous call’s next_cursor. Omit for the first page.",
      "type": "string"
    }
  },
  "required": [
    "scope",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

tvmaze_get_cast

open-world

List the credited cast of a show with the characters they play, optionally with crew; or list the guest cast of one episode. The source records no recurring-versus-guest distinction on a show’s cast list, so a name’s absence from it does not mean the performer never appeared — check an episode’s guest cast for that.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tvmaze_get_cast",
    "arguments": {
      "scope": "show",
      "show_id": "<show_id>",
      "include_crew": "<include_crew>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "scope": {
          "type": "string",
          "const": "show",
          "description": "List the show’s main cast."
        },
        "show_id": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "TVmaze show id, from tvmaze_search_shows, tvmaze_lookup_show, or tvmaze_get_schedule."
        },
        "include_crew": {
          "default": false,
          "description": "Also list crew credits — producers, writers, directors. Off by default; a long-running series carries dozens and they are rarely what a cast question is asking for.",
          "type": "boolean"
        }
      },
      "required": [
        "scope",
        "show_id",
        "include_crew"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "scope": {
          "type": "string",
          "const": "episode",
          "description": "List one episode’s guest cast."
        },
        "episode_id": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "TVmaze episode id, from tvmaze_get_episodes, tvmaze_get_next_episode, tvmaze_get_schedule, or tvmaze_get_show."
        }
      },
      "required": [
        "scope",
        "episode_id"
      ],
      "additionalProperties": false
    }
  ]
}
view source ↗