tvmaze-mcp-server について
tvmaze-mcp-serverは、視聴者や研究者、メディアアプリ向けにTVmazeのデータを提供し、番組や人物、エピソード予定、出演者、クレジットを検索できます。次回放送時刻はタイムゾーンに対応し、APIキーは不要です。
主な機能
- 01タイトルで番組を検索
- 02外部IDから番組を特定
- 03タイムゾーン別に次回放送を確認
- 04エピソードガイドと放送予定の閲覧
- 05出演者、スタッフ、人物クレジットの取得
活用シーン
- 01タイトルやIMDb IDから番組を検索
- 02次回放送を現地時刻で確認
- 03日付やシーズン別のエピソードを確認
- 04出演者やスタッフのクレジットを調査
MCP 対応
番組、エピソード、放送予定、出演者、人物を照会する8つのTVmazeツールをMCPクライアントに公開します。STDIOとStreamable HTTPに対応し、ホスト型エンドポイントも利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://tvmaze.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-tvmaze https://tvmaze.caseyjhand.com/mcp{"mcpServers":{"cyanheads-tvmaze":{"type":"http","url":"https://tvmaze.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-tvmaze":{"type":"http","url":"https://tvmaze.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-tvmaze":{"type":"http","url":"https://tvmaze.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-tvmaze":{"serverUrl":"https://tvmaze.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
8| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| query | string | はい | 番組のタイトルまたはタイトルの一部。データベース内のすべての番組タイトルとあいまい照合するため、軽微な誤記があっても見つかります。 |
詳細
@cyanheads/tvmaze-mcp-server
MCP を通じて、TVmaze の番組や人物を検索したり、タイムゾーンに合わせた次回エピソード、エピソードガイド、毎日の放送スケジュール、出演者情報を確認したりできます。STDIO または Streamable HTTP に対応しています。
公開ホストサーバー: https://tvmaze.caseyjhand.com/mcp
概要
TVmaze のテレビ番組データを利用できます。番組、エピソードガイド、出演者、放送時刻を検索できます。タイトルまたは IMDb/TheTVDB の ID で番組を探したり、タイムゾーンに合わせて次回エピソードの放送日時を確認したり、任意の日に放送・配信された番組を調べたりできます。API キーは不要です。
ツール
| ツール | 説明 |
|---|---|
tvmaze_search_shows | 曖昧検索でタイトルを検索し、チャンネル、放送状況、ジャンル、評価、外部カタログ ID とともに最大 10 件の番組を返します |
tvmaze_get_show | 1 つの TVmaze ID の詳細プロフィールを取得します。週間放送枠、シーズン一覧、前回と次回のエピソードを確認できます |
tvmaze_lookup_show | IMDb、TheTVDB、または TVRage の ID から番組を特定し、対応する TVmaze プロフィールを取得します |
tvmaze_get_next_episode | TVmaze ID またはタイトルを指定し、視聴者のタイムゾーンに変換して番組の次回エピソードの放送日時を取得します |
tvmaze_get_episodes | 1 シーズン、特定の放送日、または全エピソードのエピソードガイドを取得します。放送時刻、上映時間、あらすじを確認できます |
tvmaze_get_schedule | 指定日の放送エピソードを取得します。1 か国の地上波・ケーブルネットワーク、ストリーミングサービス、またはその両方を指定できます |
tvmaze_get_cast | 番組の出演者と役名を取得します。スタッフも指定できます。または、特定のエピソードのゲスト出演者と、任意で監督や脚本家を取得します |
tvmaze_get_person | 人名を検索して候補を取得するか、1 人の出演、ゲスト出演、またはスタッフとしてのクレジットをページ単位で取得します |
機能リファレンス
tvmaze_search_shows ツール
- すべての番組タイトルに対して
queryをあいまい検索するため、軽微なスペルミスがあっても一致します。空白のタイトルは除外されます - 番組を最大10件返します。ページネーションはありません。出力には
shown/capが示され、結果がすべて一致する場合や空の場合は、より絞り込んだタイトルまたはtvmaze_lookup_showを案内します - 各行には共通の番組概要と
match_scoreが含まれます。スコアを比較できるのは同じ検索結果内のみです
tvmaze_get_show ツール
tvmaze_search_shows、tvmaze_lookup_show、または番組表の行から取得したshow_idを指定します。エピソードの放送時刻には、オプションでIANAtimezoneを指定できます- 全シーズンと
next_episode/previous_episodeを含む完全なプロフィール(schedule_days/schedule_time、任意のschedule_timezone、official_site、externals)を返します。放送中(Running)で、まだ予定が発表されていない場合は、previous_episodeを案内する通知を返します - 不明な
show_idを指定すると、show_not_foundエラーになります
tvmaze_lookup_show ツール
sourceはimdb(ttID)、thetvdb、またはtvrage(サービス終了済みで、古いレコードにのみ存在)を指定し、external_idと組み合わせます- IMDb IDには、数字のみの形式、大文字の
TT、imdb.comのタイトルURLも指定できます - TVmazeに存在しない番組はエラーではなく、
found: falseとtvmaze_search_showsを案内するguidanceを含む結果として返されます。一致した場合はsourceとexternal_idをそのまま返し、検索結果と同じ番組概要を返します
tvmaze_get_next_episode ツール
by: "id"にはTVmaze IDを指定します。by: "title"には空白でないタイトルを指定し、tvmaze_search_showsより厳密な単一一致検索で解決します- 放送時刻は指定したIANA
timezoneで表示されます。time_known: falseは時刻が発表されておらず、日付のみが確実であることを示します - 見つからなかった場合は、型付きの
miss_reasonが返されます。タイトルの場合はshow_not_found、シーズン間で予定エピソードがない場合はno_scheduled_episode(previous_episodeを含む)です。解決できないshow_idを指定するとshow_not_found_by_idエラーになります
tvmaze_get_episodes ツール
seasonを指定すると1シーズンのエピソード、air_date(YYYY-MM-DD)を指定すると1日分のエピソードを取得します。両方を省略すると全期間が対象になります。両者は併用できません。該当日のエピソードがない場合は通知と空のリストを返し、実在しない日付を指定するとinvalid_dateエラーになります。season_not_foundでは、存在するシーズンが示されますair_dateはソースのairdateと照合されます。深夜帯の放送では、エピソードのlocal_dateと1日ずれる場合がありますinclude_specialsのデフォルトは false で、各一覧には除外したスペシャル番組の件数が示されます。limit(デフォルト50、最大250)でページサイズを指定します。next_cursor/has_moreで一覧を続けられ、totalCountはページ分割前の件数を示します
tvmaze_get_schedule ツール
scopeで番組表を選択します。linearは1か国の地上波・ケーブルネットワークと国内ストリーミングサービス、streamingはcountryを省略するとグローバルサービス、指定するとその国のローカルサービス、allは両方をまとめた番組表ですdateのデフォルトは、指定したtimezoneでの今日です。countryはISO 3166-1 alpha-2形式で指定します(英国はGB)。linearとallでは、指定がない場合に設定済みのデフォルト値が使われます。オプションのchannelでは、チャンネル名が完全一致かつ大文字・小文字を区別せずに絞り込まれます。limitのデフォルトは50(最大250)です- 各エントリーには
feed(linear/streaming)と簡潔なshow参照が含まれます(完全なプロフィールはtvmaze_get_showで取得できます)。applied_feedsには応答した番組表が示されます。例:["linear:GB","web:GB","web:global"]。番組表の取得に失敗しても、呼び出し自体は失敗せず、通知が返されます
tvmaze_get_cast tool
scope: "show"はキャラクター名を含む主要キャストを返します。scope: "episode"はそのエピソードのゲストキャストを返します。include_crewを指定すると、番組のスタッフ、またはエピソードのゲストスタッフ(監督、脚本家)が追加されます- 任意の
nameを指定すると、出演者、キャラクター、スタッフの役職名に含まれる部分文字列で絞り込めます(スタッフはinclude_crew: trueの場合のみ)。limit(デフォルト 50、最大 250)とcursorでページ分割されます。cast_total/crew_totalは一致するクレジットの総数を示します - キャストのクレジットには
as_selfとvoice_onlyが含まれます。スタッフのクレジットにはcredit_typeが含まれ、キャラクター情報はありません。番組のキャスト一覧では、レギュラー出演者とゲスト出演者が区別されないため、エピソードのゲストキャストを確認してください。クレジットが見つからない場合は、エラーではなく通知が返されます
tvmaze_get_person tool
query(名前検索)またはperson_id(キャストのクレジットか候補から取得)のいずれか一方を指定してください。検索では、ソースのスコア付きの簡潔な候補が返され、候補が自動で選択されることはありません。候補が10件の場合、ソース側の上限に達している可能性があるため、名前を絞り込んでくださいperson_idを指定すると、その人物と1つのcredit_kindが返されます。credit_kindはcast(デフォルト)、guest、crewのいずれかです。limit(デフォルト 50、最大 250)とcursorはこの場合のみ適用されます。ゲストのepisode_idはtvmaze_get_castにつながり、show_idはtvmaze_get_showまたはtvmaze_get_episodesにつながります- 候補またはクレジットがない場合は、空の結果が正常に返されます。ID が見つからない場合は
person_not_foundになります
機能
@cyanheads/mcp-ts-core を基盤としており、stdio と Streamable HTTP のトランスポート、プラグイン式の認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースに対応した構造化ログを提供します。
TVmaze 固有の機能:
- API キー不要です。アカウントも API キーも不要で、何も設定していない新規インストールでもすべてのツールが動作します
- TVmaze の IP ごとの制限を超えないようリクエスト間隔を調整し、429 では(
Retry-Afterに従って)待機時間を延ばし、プロセス内にキャッシュします - 深夜帯の放送枠では
airdate/airtimeが丸一日ずれる場合があるため、放送時刻はairstampのみから算出します - コミュニティ作成の HTML あらすじはプレーンテキストに変換されます
エージェントに適した出力:
- 時刻を捏造しません。発表済みの時刻がないレコードでは
time_known: falseと日付のみを返し、存在しないフィールドは0や""ではなくNot availableとして出力します - すべてのツールで型付きエラーを返します。各エラーには
reasonと復旧のヒントが含まれます - 検索で見つからなかった場合も結果として返します。
tvmaze_lookup_showとtvmaze_get_next_episodeのタイトル指定では、次の呼び出しに向けたguidanceとともにfound: falseを返します - 呼び出しで対象となった内容を出力に示します。エコーされたクエリ、
applied_feeds、ページ分割前の合計件数、ソースの上限に対する切り詰めの有無が含まれます
データとライセンス
データは TVmaze から取得しており、ライセンスは CC BY-SA です。出典として TVmaze を記載し、すべての番組、エピソード、人物のレコードに含まれる url フィールドを保持してください。リンクを戻すことが表示要件を満たす方法です。継承(ShareAlike)条項により、このデータを改変した場合は同じライセンスで共有する必要があります。
TVmaze は IP アドレスごとに少なくとも10秒間で20回の呼び出しを許可し、この上限を超える連続リクエストには HTTP 429 で応答します。このサーバーは上限内に収まるようリクエスト間隔を調整し、429 を受け取ると待機時間を延ばします。上流では出力が60分間キャッシュされるため、スケジュール変更や新たに発表されたエピソードが反映されるまで最大1時間かかる場合があります。ローカルのレスポンスキャッシュ(TVMAZE_CACHE_TTL_S、デフォルト 300 s)はその時間内に収まります。
はじめに
公開ホスト型インスタンス
https://tvmaze.caseyjhand.com/mcp で公開インスタンスを利用できます。インストールは不要です。Streamable HTTP 経由で、任意の MCP クライアントから接続してください。
{
"mcpServers": {
"tvmaze-mcp-server": {
"type": "streamable-http",
"url": "https://tvmaze.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。API キーは不要です。
{
"mcpServers": {
"tvmaze-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/tvmaze-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"tvmaze-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/tvmaze-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"tvmaze-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/tvmaze-mcp-server:latest"]
}
}
}
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動してください。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以上(または Node.js v24 以降)。
- TVmaze アカウントや API キーは不要です。UTC と米国以外をデフォルトにする場合は、
TVMAZE_DEFAULT_TIMEZONEとTVMAZE_DEFAULT_COUNTRYを一度設定してください。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/tvmaze-mcp-server.git
- ディレクトリに移動します:
cd tvmaze-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します(任意):
cp .env.example .env
# every variable is optional — edit only what you want to override
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
TVMAZE_BASE_URL | TVmaze API のベース URL です。エンタープライズエンドポイントを指定する場合に上書きします。 | https://api.tvmaze.com |
TVMAZE_USER_AGENT | すべての上流リクエストで送信される User-Agent です。TVmaze はクライアントに識別情報の提示を求めています。 | サーバー名、バージョン、リポジトリ URL |
TVMAZE_DEFAULT_TIMEZONE | ツール呼び出しで timezone が省略された場合に使われる IANA タイムゾーンです。 | UTC |
TVMAZE_DEFAULT_COUNTRY | country が省略された場合に、tvmaze_get_schedule の linear および all スコープで使われる ISO 3166-1 alpha-2 国コードです。 | US |
TVMAZE_CACHE_TTL_S | 上流レスポンスをプロセス内キャッシュに保持する秒数です。0 にするとキャッシュが無効になります。 | 300 |
TVMAZE_MAX_CONCURRENCY | 同時に実行する上流リクエスト数(1~16)です。 | 4 |
TVMAZE_REQUEST_TIMEOUT_MS | リクエストごとのタイムアウト時間(ミリ秒、1000~120000)です。 | 10000 |
MCP_TRANSPORT_TYPE | トランスポートです。stdio または http を指定します。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP サーバーをマウントするパスです。 | /mcp |
MCP_SESSION_MODE | HTTP セッションモードです。このサーバーは常に stateless です。 | stateless |
MCP_AUTH_MODE | 認証モードです。none、jwt、または oauth を指定します。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424)です。 | info |
LOGS_DIR | ログファイルのディレクトリです(Node.js のみ)。 | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | ツール呼び出しが失敗した際に、その引数と結果を記録します(キー名のみを秘匿化)。 | false |
STORAGE_PROVIDER_TYPE | ストレージバックエンドです。 | in-memory |
OTEL_ENABLED | OpenTelemetry の計装(スパン、メトリクス、完了ログ)を有効にします。 | false |
任意の上書き項目の全リストについては、.env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行します:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行します:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t tvmaze-mcp-server .
docker run --rm -p 3010:3010 tvmaze-mcp-server
Dockerfile のデフォルトは HTTP トランスポート、ステートレスセッションモード、/var/log/tvmaze-mcp-server へのログ出力です。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを省くには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。8 つのツール、サーバーの指示、サービスのライフサイクルを登録します。 |
src/config | サーバー固有の環境変数の解析と、Zod による検証を行います。 |
src/mcp-server/tools | ツール定義(*.tool.ts)と、各ツールで共有する出力スキーマです。 |
src/services/tvmaze | TVmaze REST クライアントです。リクエスト間隔の調整、再試行、レスポンスキャッシュ、ドメイン型への正規化を行います。 |
tests/ | src/ に対応するユニットテストと統合テストです。 |
docs/ | 設計ドキュメントと生成されたプロジェクトツリーです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールロジックで
try/catchを使わないでください。 - リクエスト単位のログには
ctx.logを使います。すべての上流呼び出しはTvmazeService経由にし、ハンドラーからfetchを呼び出さないでください。 - 新しいツールは
src/index.tsのcreateApp()配列に登録してください。 - 上流との境界処理はサービス内に保ってください。生データを検証し、ドメイン型に正規化してから、出力スキーマに沿って返します。欠落したフィールドを捏造してはいけません。放送時刻がない場合は、そのまま欠落した状態にします。
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。