anime-mcp-server について
anime-mcp-server は、AniList、Jikan、Kitsu のデータを MCP クライアントに提供するアニメ・マンガ検索サーバーです。作品検索、詳細、シリーズ関係、放送予定、キャラクター、ランキング、スタジオ作品を扱い、AniList と MAL のスコアを別々に表示します。
主な機能
- 01アニメ・マンガの検索
- 02各サービスのスコアを含む詳細取得
- 03シリーズ関係のたどり
- 04放送予定と声優の確認
- 05おすすめ・ランキング・スタジオ作品の検索
活用シーン
- 01タイトル・ジャンル・シーズンによる作品検索
- 02AniList と MAL のスコア比較
- 03シリーズ関係や次回放送の確認
- 04キャラクター・声優・スタジオ作品の検索
MCP 対応
8 つのツールと anime://media/{id} リソースを MCP 経由で公開し、STDIO と Streamable HTTP に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @cyanheads/anime-mcp-serverMCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEシークレットAuthentication mode to use: 'none', 'jwt', or 'oauth'.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
8掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tag | string | いいえ | AniList のタグフィルター。例:"Isekai"、"School"、"Time Manipulation"。"Action" などのジャンルはタグではありません。前後の空白は削除され、空白のみの場合は未指定として扱われます。 |
| page | integer | いいえ | 1始まりのページ番号です。AniList が提供するのは最初の 5,000 件のみのため、page × per_page は 5,000 以下である必要があります。 |
| sort | array | いいえ | ソート順のリストです。デフォルト:query が設定されている場合は SEARCH_MATCH(タイトルの関連度)、それ以外は POPULARITY_DESC です。SEARCH_MATCH は query に基づく場合のみ順位付けします。 |
| genre | string | いいえ | ジャンルフィルター。例:"Action"、"Romance"、"Slice of Life"、"Mecha"。前後の空白は削除され、空白のみの場合は未指定として扱われます。 |
| query | string | いいえ | タイトル検索クエリです。部分一致に対応しています。前後の空白は削除され、空白のみの場合は未指定として扱われます。 |
| format | enum | いいえ | 出版/放送フォーマットのフィルターです。TV | TV_SHORT | MOVIE | SPECIAL | OVA | ONA | MUSIC | MANGA | NOVEL | ONE_SHOT |
| season | enum | いいえ | アニメの放送シーズンです。WINTER=1~3月、SPRING=4~6月、SUMMER=7~9月、FALL=10~12月。WINTER | SPRING | SUMMER | FALL |
| status | enum | いいえ | 制作状況のフィルターです。FINISHED | RELEASING | NOT_YET_RELEASED | CANCELLED | HIATUS |
| per_page | integer | いいえ | 1ページあたりの結果数です。上限は50です。page × per_page は5,000以下である必要があります。MyAnimeList へのフォールバックは25件以下の場合のみ実行されます。 |
| media_type | enum | はい | 検索するメディアの種類:anime または manga。ANIME | MANGA |
| season_year | integer | いいえ | 放送シーズンの4桁の年。例:2024。指定しない場合、すべての年から該当シーズンを検索します。 |
| include_adult | boolean | いいえ | MyAnimeList のフォールバック結果を含め、成人向け/NSFW コンテンツを含めます。デフォルトは false です。 |
詳細
@cyanheads/anime-mcp-server
MCP を通じて、アニメ・マンガを検索し、詳細情報、シリーズの関連作品、シーズン別スケジュール、キャラクター、ランキング、スタジオの作品一覧を取得できます。STDIO または Streamable HTTP に対応しています。
概要
AniList、Jikan(MyAnimeList)、Kitsu のアニメ・マンガデータを利用できます。作品を検索し、AniList と MAL のスコアを並べて表示する詳細情報を取得できます。また、シリーズの関連作品をたどったり、放送スケジュールを確認したり、キャラクター、声優、スタジオの作品一覧を検索したりできます。
ツール
| ツール | 説明 |
|---|---|
anime_search_media | タイトル、ジャンル、タグ、シーズン、年、形式、またはステータスでアニメや漫画を検索します。ID、タイトル、スコア、形式、エピソード数/話数を含む、順位付けされた結果を返します。AniListを優先し、タイトルのみのクエリでAniListに一致する結果がない場合はJikan(MAL)をフォールバックとして使用します。 |
anime_get_media | AniList IDを指定して、1つのアニメや漫画の詳細を取得します。あらすじ、形式、エピソード数/話数、ステータス、シーズン、スタジオ、原作、ジャンル、タグ(ネタバレのフラグ付き)、AniListとMALのスコアの比較、配信リンク、カバー/バナー、直接の関連作品を含みます。 |
anime_get_relations | ホップ数の上限内で関連作品のグラフをたどります。主要作品と補足作品を関連度の優先順位、次に年ごとにまとめます。厳密な時系列順ではありません。 |
anime_get_schedule | シーズンまたは今後のエピソード期間の放送スケジュールです。シーズンモードでは、指定したシーズン/年に放送されるすべてのアニメを一覧表示します。今後の放送モードでは、日付の範囲内に放送される各作品の次のエピソードを、UTCタイムスタンプとカウントダウン付きで返します。 |
anime_find_characters | 作品のキャラクターと声優を検索するか、名前でキャラクター/声優を検索します。役割(メイン/サポート/背景)、言語別の声優、他のメディアへの相互リンクとともにキャラクターを返します。 |
anime_get_recommendations | AniListのおすすめと、対応するJikan(MAL)の投票数を返します。任意で、選んだ作品についてユーザーが気に入った点を反映し、おすすめの背景を説明できます。 |
anime_get_rankings | トップ、トレンド、またはシーズン別のランキングです。ジャンル、タグ、形式で絞り込めます。トップは全期間のスコア順、トレンドはAniListのトレンド順、シーズン別は現在または指定したシーズンの人気順です。 |
anime_get_studio | 名前またはAniListのスタジオIDで、スタジオの全作品一覧を取得します。スタジオが制作したすべての作品を、年またはスコアで並べ替えられます。形式、ステータス、エピソード数も含みます。 |
リソース
| リソース | 説明 |
|---|---|
anime://media/{id} | AniList IDによる簡潔なメディアレコードです。タイトル、あらすじ、スコア、ジャンル、配信数、カバー画像を含みます。注入可能なコンテキストに使える安定したURIです。 |
すべてのリソースデータはツールからも取得できます。リソースURIを取得する前に、anime_search_mediaを使ってAniList IDを見つけてください。
機能リファレンス
anime_search_media tool
- タイトル、ジャンル、タグ、シーズン/年、形式、ステータス、または最大5つの並べ替え値でアニメや漫画を検索します。少なくとも1つの条件が必要です。
page/per_pageで結果をページ分割できます(最大50件)。include_adult: trueを指定すると成人向け作品も含まれます - 結果にはAniList ID、タイトル、スコア、エピソード数/話数が含まれます。AniListを優先し、一致する結果がないタイトルのみの検索では、
per_pageが25以下の場合にJikanへフォールバックすることがあります。has_next_pageに従ってください。total_resultsが正確なのは最終ページのみです - AniListでは、検索、シーズン、ランキングの各エントリーは先頭5,000件のみ提供されます。それより後のページは
page_depth_exceededで失敗するため、条件を絞り込んでください
anime_get_media tool
- AniListの
idを指定して詳細を取得します。成人向けコンテンツの取得にはinclude_adult: trueが必要です。anime_search_mediaを使ってIDを見つけてください - あらすじ、ジャンル、ネタバレのフラグ付きタグ、スタジオ、直接の関連作品、画像、配信リンク、AniListとMALそれぞれのスコアを返します。
data_sourcesは補完データの取得に成功したソースを示します。IDが解決できなかった場合はnot_foundが返されます full_text: trueを指定すると、完全な結果をフェンス付きJSONで返します。デフォルトでは、あらすじは500文字のプレビューで、タグと関連作品は省略件数とともに短縮されます
anime_get_relations tool
- AniList の
idを起点に、max_depthホップまでフランチャイズをたどります(デフォルトは 2、最大 4) - シーズンの年とエピソード数/章数を含む
mainとsupplementaryのエントリーを、関連の優先度、次に年の順で返します。not_foundはルート ID が解決されなかったことを示します depth、parent_id、relation_to_parent、pathは、各エントリーへの最短経路を示します。relation_to_rootはルートに直接関連付けられたエントリーにのみ設定され、それ以外は null です。ホップ上限に達したエントリーは、そのエントリー自身の関連を伴わずに返されます。depth_reachedは返された中で最も深いホップを示します
anime_get_schedule tool
seasonモードではseasonとseason_yearが必要です。upcomingモードではdays_aheadを使用します(デフォルトは 7、最大 30)。page/per_pageでページ分割できます(最大 50)。成人向けタイトルにはinclude_adult: trueが必要です- UTC の ISO 8601 放送時刻と
time_until_airing_secondsを返します。has_next_pageに従ってください。total_resultsが正確なのはシーズンの最終ページのみです。invalid_seasonとconflicting_inputsは無効なモード入力を示します
anime_find_characters tool
- メディアの
id、character_name、voice_actor_nameのうち、ちょうど 1 つを指定します。languageはメディアのキャスト検索にのみ適用されます。per_pageの上限は 25 です modeに応じて、キャスト、声優、またはメディアへの出演情報を返します。truncated: trueは、上限に達したキャスト一覧の次ページに関する案内を含みます。media_not_found/not_foundにより、不明なメディア ID と一致する名前がない場合を区別しますvoice_actor_data_available: falseは、空の一覧とは異なり、プロバイダーに声優データがなかったことを示します。full_text: trueを指定すると、ページ内のすべての役と完全な経歴をフェンス付き JSON として返します。デフォルトでは、経歴は 500 文字のプレビューで、スタッフの役職は 20 件までとなり、省略された項目数が示されます
anime_get_recommendations tool
- AniList の
idに対するおすすめを取得し、page/per_pageでページ分割します(最大 25)。任意のliked_aspectsは変更せずにそのまま返されます anilist_ratingとjikan_votesを分けて返し、sourcesで各情報の提供元を示します。truncated: trueは次ページに関する案内を含みます。not_foundはソース ID が解決されなかったことを示します
anime_get_rankings tool
top/trendingのANIMEまたはMANGAをランキングします。シーズン別およびシーズン/年のフィルターはANIMEにのみ適用されます(それ以外ではanime_only_season)。ジャンル/タグ/フォーマットのフィルターとpage/per_page(最大 50)も利用できます。成人向けタイトルにはinclude_adult: trueが必要です- 各エントリーには 1 始まりの
rankとseason_labelが含まれます。has_next_pageに従ってください。total_resultsが正確なのは最終ページのみです。シーズン別モードでは、seasonとseason_yearを両方指定するか、どちらも指定せずに現在のシーズンを使用します(それ以外ではinvalid_season)
anime_get_studio tool
nameまたはidのどちらか 1 つだけでスタジオを特定します。人気度、スコア、公開日のいずれかで並べ替え、page/per_pageでページ分割します(最大 25)- ページ内のタイトルごとに 1 行を返し、
is_main_studioでメインクレジットかどうかを示します。has_next_pageに従ってください。total_titlesが正確なのは、全作品が 1 ページ目に収まる場合のみです。not_foundはスタジオが解決されなかったことを示します
anime://media/{id} resource
anime_search_mediaまたはanime_get_mediaで取得した AniList のidを使って、コンパクトなapplication/json形式のメディアレコードを読み取ります- ID は 1 から 2147483647 までの整数である必要があります。それ以外の場合は、上流への呼び出し前に
invalid_idで失敗します - タイトルの各種表記、あらすじ、スコア、ジャンル、配信数、カバー画像を返します。タグ、スタジオ、配信リンク、関連作品には
anime_get_mediaを使用してください
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。
アニメ・マンガに特化した機能:
- 3つのソースを利用するアーキテクチャ:AniList GraphQL(メイン)、Jikan v4 REST(MAL スコア+おすすめ)、Kitsu JSON:API(字幕/吹き替えの言語情報を含む配信リンク)
- AniList の
idMalブリッジを使用して ID を照合するため、ソース間で ID を推測する必要はありません - フランチャイズの関連グラフをたどり、関連タイプの優先度、次いでシーズンの年に基づくヒューリスティックで順序を決定します
- レート制限を考慮したサービスレイヤー:AniList は30リクエスト/30秒で自動バックオフ、Jikan は呼び出し間隔を350ms以上に設定
- API キー不要の設計 — 3つのソースはいずれも公開されており、API 認証情報は不要です
エージェントが扱いやすい出力:
- 2種類のスコアを別々に提示 — AniList の
meanScore(0~100)と MAL のscore(0~10)に、エージェントが重みを判断できるよう母数(scored_by)を付加します。合成スコアにまとめることはありません - ネタバレフラグ — タグの概要ではネタバレタグと成人向けタグを非表示にします。構造化出力と
full_text: trueでは、フラグ付きのすべてのタグを取得できます - 補足データの出所 —
anime_get_media.data_sourcesには、AniList、MAL/Jikan、Kitsu のデータを取得できたかどうかが報告されます。補足データを利用できない場合、そのフラグは false のままです - タイムスタンプはすべて UTC。季節ラベル(
WINTER 2024)もそのまま返し、冬/春/夏/秋の境界で起きる問題を回避します
はじめに
API キーは不要です — 3つの上流ソース(AniList、Jikan、Kitsu)はすべて、API キーなしで利用できる公開 API です。
MCP クライアントの設定ファイルに次の内容を追加します:
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/anime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用する場合(Bun は不要です):
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/anime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用する場合:
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/anime-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 以上)。API キーは不要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/anime-mcp-server.git
- ディレクトリに移動します:
cd anime-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します(任意):
cp .env.example .env
# edit .env if you want to change transport or log level
設定
サーバー固有の環境変数は不要です。フレームワークの変数はすべて任意で、適切なデフォルト値が設定されています。
| 変数 | 説明 | デフォルト |
|---|---|---|
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_HTTP_HOST | HTTP サーバーのホスト名。 | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | MCP サーバーのエンドポイントパス。 | /mcp |
MCP_SESSION_MODE | セッションモード:auto、stateful、または stateless。 | stateless |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424):debug、info、notice、warning、error。 | info |
LOG_TOOL_FAILURE_PAYLOADS | 失敗した呼び出しの引数と結果をログに記録します。キー名に基づいて機密情報を伏せ、LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルトは 16384)を上限とします。自由形式の値に含まれる機密情報は伏せられません。 | false |
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 anime-mcp-server .
docker run --rm -p 3010:3010 anime-mcp-server
Dockerfile のデフォルトは HTTP トランスポート、ステートレスなセッションモードで、ログは /var/log/anime-mcp-server に出力されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツールとリソースを登録し、サービスを初期化します。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。 |
src/mcp-server/resources | リソース定義(*.resource.ts)です。 |
src/services/anilist | AniList GraphQL クライアントです。すべてのクエリの主要なデータソースです。 |
src/services/jikan | Jikan v4 REST クライアントです。MAL のスコアとおすすめを提供します。 |
src/services/kitsu | Kitsu JSON:API クライアントです。字幕・吹き替えの言語情報を含むストリーミングリンクを提供します。 |
tests/ | src/ の構成を反映した単体テストと統合テストです。 |
changelog/ | バージョンごとの変更履歴ファイル(changelog/<minor>.x/<version>.md)です。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は以下のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジック内で
try/catchを使わないでください。 - リクエストスコープのログには
ctx.logを、テナントスコープのストレージにはctx.stateを使用してください。 - 新しいツールとリソースは、
src/mcp-server/*/definitions/index.tsのバレル経由で登録してください。 - 外部 API の呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに従って返します。不足しているフィールドを決して捏造しないでください。
- AniList を主要なデータソースとします。補助サービス(Jikan、Kitsu)の障害には、
Promise.allSettledを使用して適切に対応します。
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。