Scryfall MCP Server について
Scryfall MCP Serverは、MCPクライアントをScryfallベースの『Magic: The Gathering』データとローカルのルール検索に接続します。カード検索や価格確認に加え、デッキ分析、適法性確認、シナジー検索、マナベース提案に対応します。
主な機能
- 01カード検索と詳細取得
- 02価格確認と代替候補の検索
- 03セットとシナジーカードの検索
- 04ローカルルールファイルの検索
- 05デッキ構成と適法性の分析
- 06マナベース配分の提案
活用シーン
- 01Scryfallクエリでカードを探す
- 02カード価格と代替候補を比較する
- 03Brawlの統率者適法性を確認する
- 04デッキのマナカーブと色構成を確認する
MCP 対応
MCPクライアントに15個のツール、3個のリソース、2個のプロンプトを公開します。主なトランスポートはstdioで、別途ローカル用のStreamable HTTPエントリーポイントもあります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Scryfall MCP サーバー
Magic: The Gathering の検索、ルールの照会、価格確認、セットの検索、デッキ構築ワークフローに対応した、Scryfall を利用する MCP サーバーです。
現在、プロジェクトは以下をサポートしています。
- ローカル MCP クライアント向けの主要トランスポートとして
stdio src/http.tsを介したローカル優先の Streamable HTTP- 15 個の MCP ツール、3 個のリソース、2 個のプロンプト
公開している機能
ツール
search_cards:ページ指定、並べ替え、任意の価格フィルターを使って Scryfall のカード検索を実行します。get_card:名前、セット/コレクター番号、または Scryfall ID を使ってカードを 1 枚取得します。get_card_prices:任意のフォーマット情報と代替カードを含む価格データを返します。random_card:任意のフィルターを指定してランダムなカードを取得します。search_sets:Magic のセットを検索して絞り込みます。query_rules:ローカルの総合ルールファイルを、前後の文脈とともに検索します。build_scryfall_query:自然言語を、説明可能な Scryfall クエリに変換します。search_format_staples:公開されている価格と並べ替えのヒューリスティックを使って、フォーマットで使用可能な候補を検索します。大会のメタゲームデータは使用しません。search_alternatives:公開されている価格、タイプ、マナ総量のヒューリスティックを使って候補を検索します。結果は、機能的な代替カードや上位互換であることが検証されていません。find_synergistic_cards:カード、テーマ、またはアーキタイプに合うシナジーカードを検索します。batch_card_analysis:複数のカードについて、使用可能性、価格、シナジー、または構成を分析します。validate_brawl_commander:Brawl および Standard Brawl の統率者として使用可能か確認します。analyze_deck_composition:デッキリストのマナカーブ、色、構成上の問題を評価します。suggest_mana_base:色の要件に基づき、土地の枚数と色マナを整えるパッケージを提案します。show_card_search:Scryfall のカード検索結果を視覚的に表示する ChatGPT Apps ウィジェットを描画します。
リソース
card-database://bulk:キャッシュされた Oracle 一括スナップショット。set-database://all:キャッシュされたセット一覧のスナップショット。ui://widget/card-search.html:show_card_search用の ChatGPT Apps ウィジェットテンプレート。
プロンプト
analyze_cardbuild_deck
トランスポート
STDIO
Claude Desktop、Codex、MCP Inspector、およびほとんどのローカル MCP クライアントに推奨されます。
npm run dev
npm start
Streamable HTTP
ローカル環境、または明示的に管理された環境向けに、別のエントリーポイントとして利用できます。
npm run dev:http
npm run start:http
ローカル MCP テストの場合:
npm run dev:http:local
npm run smoke:http
スモークテストでは /health を確認し、MCP の initialize を実行して notifications/initialized を送信し、tools/list を検証します。
また、代表的な validate_brawl_commander と search_cards のツール呼び出しも実行するため、ローカル HTTP エンドポイントを機能の検出だけでなく、その先まで確認できます。
HTTP リクエストには、デフォルトで 1 MiB の本文サイズ制限(HTTP_MAX_BODY_BYTES)が適用されます。SDK やツールによる検証の前に、HTTP エントリーポイントでは、リクエスト JSON に含まれる配列要素とオブジェクトキーの合計が 10,000 個を超える場合も拒否します。この制限はバッチを含むリクエスト全体に適用されます。また、SDK 1.32.2 ではバッチ内のメッセージ数も 100 件に制限されます。この構造ガードは反復処理で実装されており、このプロジェクトの低レベル Server ハンドラーに適用されます。オプトインの McpServer.maxToolInputElements オプションには依存しません。
現在の HTTP の動作:
- デフォルトでは
127.0.0.1にバインドします /mcpでPOST|GET|DELETEを提供しますGET /healthを提供しますHTTP_ALLOWED_ORIGINSが設定されていない限り、デフォルトでループバック以外のOriginヘッダーを拒否しますHTTP_HOSTがループバック以外の場合、HTTP_AUTH_TOKENとHTTP_TRUST_PROXY_TLS=trueの両方を必須とします。後者は、信頼できる HTTPS プロキシまたはトンネルによって、暗号化されていないリスナーが保護されていることを運用者が明示するものですHTTP_MAX_SESSIONSで、アクティブなセッションと初期化中のセッションを制限します(デフォルトは100)
HTTP エントリーポイントは現在も有用ですが、ドキュメントでは引き続き慎重な表現をしています。ここでは、パブリックホスティングの仕組みとして紹介していません。
ChatGPT アプリの開発
HTTP MCP エンドポイントは、ローカルアプリのプロトタイプとして ChatGPT Developer Mode に接続できます。ループバックでサーバーを起動します。
npm run dev:http:local
HTTPS トンネルを使って、そのローカルエンドポイントを公開します。
ngrok http 3000
次に、トンネル経由の https://.../mcp URL を ChatGPT Developer Mode に接続します。ツールの記述子、ウィジェットのリソース、またはメタデータを変更した後は、アプリを更新して、ChatGPT に最新の MCP インターフェースを再読み込みさせてください。
現在 ChatGPT 向けのウィジェットは show_card_search です。モデル向けに簡潔な structuredContent を返し、ChatGPT では ui://widget/card-search.html をレンダリングします。このウィジェットは Scryfall に対して読み取り専用で、Scryfall の画像 URL を使用し、CSP リソースの許可リストを https://cards.scryfall.io のみにしています。
セットアップ
前提条件
- Node.js
^20.19.0、^22.13.0、または>=24.0.0 - npm
インストール
git clone https://github.com/bmurdock/scryfall-mcp.git
cd scryfall-mcp
npm install
cp .env.example .env
記載されている npm run dev*、npm start、および npm run inspector コマンドは、.env を事前に読み込みます。明示的に指定されたプロセス環境変数は、そのファイル内の値より優先されます。dist/index.js を直接起動する MCP クライアントでは、独自の env 設定を通じてオーバーライドを指定してください。
検証
npm run lint
npm run type-check
npm test
npm run test:coverage
ビルド
npm run build
よく使うコマンド
npm run dev
npm run dev:http
npm start
npm run start:http
npm test
npm run test:watch
npm run test:ui
npm run test:coverage
npm run lint
npm run lint:fix
npm run type-check
npm run inspector
設定
正規の値については .env.example を参照してください。現在使用中の主な変数は次のとおりです。
SCRYFALL_USER_AGENTRATE_LIMIT_MSRATE_LIMIT_QUEUE_MAXSCRYFALL_TIMEOUT_MSCACHE_MAX_SIZECACHE_MAX_MEMORY_MBLOG_LEVELNODE_ENVHEALTHCHECK_DEEPHTTP_HOSTHTTP_PORTHTTP_MCP_PATHHTTP_HEALTH_PATHHTTP_MAX_BODY_BYTESHTTP_SESSION_IDLE_MSHTTP_SESSION_CLEANUP_INTERVAL_MSHTTP_ALLOWED_ORIGINSHTTP_AUTH_TOKENHTTP_TRUST_PROXY_TLSHTTP_MAX_SESSIONS
運用上の注意:
- Scryfall API 呼び出しは、共有レートリミッターによってグローバルに直列化されます。バッチツールは複数のローカル検索をスケジュールできますが、設計上、Scryfall へのリクエストは常に一度に 1 件ずつ完了します。
- デフォルトのリクエスト間隔は、一般的な API エンドポイントでは 100 ms、Scryfall の 2 リクエスト/秒のカードエンドポイント(
/cards/search、/cards/named、/cards/random、/cards/collection)では 500 ms 以上です。 - HTTP 429 レスポンスは自動的に再試行されません。サーバーは Scryfall のスロットル期間を記録し、次のリクエストの開始を遅らせます。再試行するかどうかは呼び出し元が判断できます。
CACHE_MAX_MEMORY_MBは、card-database://bulkを含む大容量のインメモリスナップショットを保持できるかどうかを制御します。バルクリソースの再構築はまず一時ファイルにストリーミングされます。サイズの大きいスナップショットはキャッシュに保持されず、ウォーム読み込み用にディスク上に残ります。各 MCP リソースレスポンスでは、リソースプロトコルに必要な完全なシリアル化済みバルクペイロードが引き続きメモリ上に展開されるため、呼び出し元はレスポンスサイズに比例するメモリを確保してください。- セットのスナップショットは毎週更新されます。キャッシュ容量に応じて、古いスナップショットは最大 4 週間保持され、定期更新に失敗した場合はそれが提供されることがあります。定期更新に失敗した場合は、5 分後に再試行されます。
- カードの詳細出力には、利用可能な場合、Scryfall のソースリンクとアーティストのクレジットが含まれます。Scryfall の画像 URL を表示する利用者は、著作権、アーティスト、ソースの情報を保持してください。また、カード画像をトリミング、変形、色変更、透かし加工したり、所有権を主張したりしないでください。
- 英語以外の
get_card検索では、Scryfall のローカライズ版セット/コレクターエンドポイントを使用します。名前と UUID による検索では、まず印刷版を特定し、次に選択した言語でその印刷版をリクエストします。翻訳が利用できない場合は、検索エラーが返されます。 get_card_pricesは、24 時間のカード詳細キャッシュとは独立した、専用の 6 時間キャッシュを使用します。- デッキリストの分析では、まずカード名を完全一致で解決し、一致しない場合はファジー検索にフォールバックします。ファジー検索で解決された項目はレスポンスに報告されます。入力は 64 KiB、ユニーク名 100 件、合計カード数 10,000 枚、1 エントリーあたり 1,000 枚に制限されています。
- MCP ツール、プロンプト、またはリソース読み取りをキャンセルすると、キューに入っている Scryfall の処理は停止します。別のアクティブな呼び出し元と共有されている検索やリソース読み取りは、その呼び出し元が完了またはキャンセルするまで続行されます。バルクリソースをキャンセルするとストリームが停止し、不完全なスナップショットはクリーンアップされます。シャットダウン時は、実行中のバルク再構築のクリーンアップが完了するまで待機します。
- stdio サーバーは、クライアントが入力を閉じるとシャットダウンします。不正な HTTP URL または Host ヘッダーには、サーバーを終了せず HTTP 400 を返します。
- プロンプトの検証エラーでは、対処に役立つメッセージが維持され、MCP の無効なパラメーター用エラーコードが使用されます。上流のプロンプトエラーには、安全なステータス情報または再試行情報が含まれます。
suggest_mana_baseは、ヒューリスティックに基づく土地の枚数とサイクルのカテゴリを返します。各カードの使用可否や色の適合性は、別途確認が必要です。割り当てられたスロットはすべて含まれ、該当するサイクルがない場合は汎用のマナ調整カテゴリが使用されます。特殊な土地要件には現在対応しておらず、空でないspecial_requirements入力には検証エラーが返されます。- デッキ規模のツールでは、Scryfall がカード検索をスロットリングした場合、分析結果の一部、または明示的な再試行待ち時間のメッセージが返されることがあります。
- ストリーミング可能な HTTP セッションは
HTTP_SESSION_IDLE_MSが経過すると期限切れになり、HTTP_SESSION_CLEANUP_INTERVAL_MSごとに確認されます。 - 期限切れまたは不明な HTTP セッション ID を含むリクエストには 404 が返されます。クライアントは古い ID を使わずに新しいセッションを初期化して復旧します。必須のセッション ID がないリクエストには 400 が返されます。
- ループバック以外への HTTP バインドには、ベアラートークン認証と
HTTP_TRUST_PROXY_TLS=trueが必要です。これは、信頼できる HTTPS プロキシまたはトンネルが、平文のリスナーを保護していることを示します。Origin の許可リストは追加のブラウザーポリシーであり、認証の仕組みではありません。 GET /healthはレディネスチェックです。Scryfall のサーキットブレーカーが開いている場合を含め、必須サービスが劣化しているときは HTTP 503 を返します。
ローカル HTTP の起動例:
HTTP_HOST=127.0.0.1 HTTP_PORT=3000 npm run start:http
ツール呼び出しの例
build_scryfall_query
{
"natural_query": "blue counterspells under $20 for modern",
"optimize_for": "precision"
}
search_cards
{
"query": "c:r t:instant mv=1",
"limit": 10,
"order": "name"
}
search_sets
{
"type": "expansion",
"released_after": "2020-01-01"
}
find_synergistic_cards
{
"focus_card": "Obeka, Splitter of Seconds",
"synergy_type": "theme",
"format": "commander",
"color_identity": "UBR",
"limit": 12
}
統率者戦のようなワークフローでは、解決可能なカードではなくテーマに焦点を当てる場合、color_identityを渡してください。焦点がカードに解決される場合、ツールはそのカードの固有色を推測し、指定されたフォーマットの適正、Arenaでの利用可否、固有色で最終結果を絞り込みます。
analyze_deck_composition
{
"deck_list": "4 Lightning Bolt\n4 Monastery Swiftspear\n20 Mountain",
"format": "modern",
"strategy": "aggro"
}
Claude Desktopとの連携
ビルドしたstdioエントリーポイントをClaude Desktopの設定に追加してください。
macOSのパス:~/Library/Application Support/Claude/claude_desktop_config.json
Windowsのパス:%APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"scryfall": {
"command": "node",
"args": ["/absolute/path/to/scryfall-mcp/dist/index.js"]
}
}
}
運用上の注意
- レート制限はプロセス内で適用されます。Scryfall APIへの一般的なリクエストではデフォルトの最小間隔が100 ms、Scryfallの2/secカードエンドポイントでは最小間隔が500 msです。
- 検索結果、カードの詳細、価格、セット、バルクスナップショットは、上限付きのインメモリキャッシュに保存されます。
- バルクカードリソースはディスク経由で再構築され、シリアライズ済みのスナップショットを事前に保存することで、繰り返しの読み取りにかかるコストを抑えます。キャッシュの保持量には上限がありますが、バルクリソースの応答を生成する際には、シリアライズ済みの応答テキスト全体をプロセスのメモリ上に保持する必要があります。
- セットのフィルタリングでは、誤ったフィルター済みキャッシュの再利用を防ぐため、正規の
/setsデータセットを1つ使用します。 - ヘルスチェックは
ScryfallMCPServer.healthCheck()とHTTPの/healthエンドポイントから利用できます。 - MCPコネクターでJSON-RPC/SSEのデシリアライズエラーが報告された場合は、未加工のHTTPスモークパスと比較してください。
npm run dev:http:local
npm run smoke:http
スモークコマンドが成功した場合は、コネクターのエラーテキストとスモーク出力を一緒に記録してください。これにより、ローカルエンドポイントのフレーミングとコネクター固有の解析を切り分けられます。
ドキュメント一覧
現在の正式なドキュメント:
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。