Feyod MCP Server について
Feyod MCP Serverは、Feyenoordの試合、選手、対戦相手、関連イベントについて自然言語で質問できるサーバーです。質問を検証済みSQLに変換してFeyodのSQLiteデータベースで実行し、結果を返します。
主な機能
- 01自然言語でFeyenoordのデータを検索
- 02SQLクエリの生成と検証
- 03無効なSQLの修正を試行
- 04SQLiteでクエリを実行
- 05LLMと埋め込みモデルのプロバイダー設定
活用シーン
- 01試合結果、先発メンバー、ゴール、カードを質問
- 02Feyenoordの選手情報を調べる
- 03対戦相手や関連する試合イベントを確認
MCP 対応
MCPクライアントに`answer_feyenoord_question`ツールを公開します。公開Streamable HTTPエンドポイントから接続でき、ローカルでも実行できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Feyod MCP サーバー
自然言語を使ってFeyenoordの試合データを検索するための、Model Context Protocol(MCP)サーバーです。
Streamable HTTP サーバーは https://mcp.feyod.nl/mcp で公開されています。Docker コンテナはDocker Hubで利用できます。
主な機能
この MCP サーバーは、Feyod:Feyenoord Open Data を検索するための自然言語インターフェースを提供します。これにより、Feyenoordの試合、選手、対戦相手、および関連イベントに関する質問への回答を得られます。
基盤となるFeyodデータベースは、jeroenvdmeer/feyod GitHub リポジトリで管理されています。必要なデータベースをセットアップするには、そのリポジトリから最新の SQL ファイルを入手する必要があります。
このサーバーではLangChainを使用して、次の処理を行います。
- 自然言語の質問をSQLクエリに変換します(精度を高めるために、必要に応じて少数ショットの例を活用します)。
- 生成されたSQLを検証します。
- 無効なSQLをLLMで修正します。
- 有効なSQLをSQLiteデータベースに対して実行します。
- クエリの生の結果を返します。
LLMモデルと埋め込みモデルは、プロバイダーファクトリー(llm_factory.py)を使用し、設定に基づいて動的に読み込まれます。これにより、OpenAIやGoogleなどのプロバイダーを簡単に切り替えられます。
利用方法
公開エンドポイントを使用する
Feyod MCP サーバーは https://mcp.feyod.nl/mcp で公開されています。Claude Desktopなど、MCP対応クライアントからこのエンドポイントに接続できます。
Docker コンテナを使用する
Feyod MCP サーバーの Docker イメージはDocker Hubで利用できます。次のコマンドでイメージを取得して実行できます。
-
Docker イメージを取得する:
docker pull jeroenvdmeer/feyod-mcp -
Docker コンテナを実行する: LLMプロバイダーとAPIキーに必要な環境変数を指定する必要があります。イメージに含まれるデータベースの代わりにローカルデータベースを使用する場合は、
feyod.dbファイルをマウントすることもできます。docker run -p 8000:8000 \ -e LLM_PROVIDER="your_llm_provider" \ -e LLM_API_KEY="your_api_key" \ jeroenvdmeer/feyod-mcpyour_llm_providerとyour_api_keyを実際のLLM設定に置き換えてください。ローカルデータベースファイルをマウントするには:
docker run -p 8000:8000 \ -e LLM_PROVIDER="your_llm_provider" \ -e LLM_API_KEY="your_api_key" \ -v <absolute_path_to_feyod_db>:/app/feyod/feyod.db \ jeroenvdmeer/feyod-mcp<absolute_path_to_feyod_db>を、ホストマシン上にあるfeyod.dbファイルの絶対パスに置き換えてください。
ツール
このサーバーは、Feyenoordデータベースを検索するためのMCPツールを公開しています。ツールはMCPプロトコル(tools/list)を通じて検出できます。
- answer_feyenoord_question:Feyenoordに関する質問に回答します。質問は自然言語のテキストで入力でき、試合(先発メンバー、結果、ゴール、カードなど)、選手、対戦相手に関する内容を尋ねられます。
セットアップ
-
リポジトリをクローンする:
# MCP サーバーのリポジトリをクローンする git clone https://github.com/jeroenvdmeer/feyod-mcp.git # Feyodデータベースをクローンする git clone https://github.com/jeroenvdmeer/feyod.git # MCP サーバーのディレクトリに移動する cd feyod-mcp -
仮想環境を作成して有効化する(推奨:uv):
uvのインストール方法については、https://docs.astral.sh/uv/ を参照してください。uv venv .venv\Scripts\activate # Windows # or source .venv/bin/activate # macOS/Linux -
依存関係をインストールする:
# uvを使用する(推奨) uv add "mcp[cli]" langchain langchain-openai langchain-google-genai python-dotenv aiosqlite # Or using pip pip install -r requirements.txt -
データベースをセットアップする:
# SQLファイルがあるfeyodディレクトリに移動する cd ../feyod # SQL文を使用してSQLiteデータベースを構築する sqlite3 feyod.db < feyod.sql
設定
mcp ディレクトリに、以下の変数を含む .env ファイルを作成します。
# Path to the SQLite database file (relative to mcp folder or absolute)
DATABASE_PATH="../feyod/feyod.db"
# Server host binding (defaults to localhost/127.0.0.1)
HOST="127.0.0.1"
# Logging level (e.g., DEBUG, INFO, WARNING, ERROR)
LOG_LEVEL=INFO
# --- LLM Configuration ---
LLM_PROVIDER="google" # or "openai", etc.
LLM_API_KEY="YOUR_API_KEY_HERE"
LLM_MODEL="gemini-2.5-flash"
# --- Example Loading Configuration (Optional) ---
EXAMPLE_SOURCE="local" # or "mongodb"
EXAMPLE_DB_CONNECTION_STRING=""
EXAMPLE_DB_NAME="feyenoord_data"
EXAMPLE_DB_COLLECTION="examples"
注意:
- プレースホルダーの API キーを実際のキーに置き換えてください。
HOST設定のデフォルト値は、ローカル開発では「127.0.0.1」です。Docker で実行する場合は、外部からの接続を許可するため、自動的に「0.0.0.0」に設定されます。LLM_PROVIDERがllm_factory.pyで定義されているものと一致することを確認してください。- 選択したプロバイダーに必要な LangChain 統合パッケージ(例:
langchain-google-genai)をインストールしてください。 EXAMPLE_SOURCE="mongodb"を使用する場合は、上記のとおり MongoDB の設定を行ってください。
サーバーの実行
サーバーは、いくつかの方法で実行できます。
- 開発モード(ホットリロードと Inspector 対応):
mcp dev main.py - 通常の実行:
python main.py # or mcp run main.py
サーバーが起動し、MCP 接続を待ち受けます(デフォルトでは stdio、設定されている場合は HTTP/SSE)。
Docker での実行
付属の Dockerfile を使用して、MCP サーバーをコンテナ化できます。
-
Docker イメージをビルドする: ターミナルで
mcpディレクトリに移動し、以下のコマンドを実行します。docker build -t feyod-mcp:latest .これにより、
feyod-mcp:latestというタグが付いたイメージがビルドされます。 -
Docker コンテナを実行する: コンテナの内部ポート 8000 を、ホストマシンの外部ポート(例:8000)に割り当てて実行できます。また、コンテナからデータベースファイルにアクセスできるよう、データベースファイルをボリュームとしてマウントする必要があります。
docker run -p 8000:8000 -v <absolute_path_to_feyod_db>:/app/../feyod/feyod.db feyod-mcp:latest<absolute_path_to_feyod_db>を、ホストマシン上にあるfeyod.dbファイルの絶対パスに置き換えてください。または、環境変数を直接渡すこともできます。
docker run -p 8000:8000 -e DATABASE_PATH="/app/../feyod/feyod.db" -e LLM_PROVIDER="google" -e LLM_API_KEY="YOUR_API_KEY_HERE" -e LLM_MODEL="gemini-2.5-flash" -v <absolute_path_to_feyod_db>:/app/../feyod/feyod.db feyod-mcp:latestプレースホルダーの値を実際の設定に置き換えてください。
コンテナ内のサーバーが起動し、0.0.0.0:8000 で待ち受けます。
新しい LLM プロバイダーの追加
新しいプロバイダーのサポートを追加するには:
- パッケージをインストールする: 必要な LangChain 統合パッケージ(例:
pip install langchain-anthropic)をインストールします。 - ファクトリーを更新する:
llm_factory.pyを編集して、プロバイダーを追加します。 .env/ README を更新する: 必要な API キーを.envファイルに追加します。
依存関係
- Python 3.10+
- 各パッケージの依存関係については、
requirements.txtを参照してください。 - プロバイダー固有のパッケージ(例:
langchain-openai、langchain-google-genai)。
デバッグとトラブルシューティング
- ローカルテストには、
mcp dev main.pyと MCP Inspector を使用してください。 - ログは stderr に書き込まれ、Claude Desktop のログまたはターミナルで確認できます。
- 環境や設定の問題については、
.envと Claude Desktop の設定を確認してください。 - 詳細については、MCP デバッグガイドを参照してください。
セキュリティ
このセクションでは、MCP サーバーに実装されている主要なセキュリティ対策の概要を説明します。これらの対策は、リスク評価と MCP ドキュメントに記載されているセキュリティ上の考慮事項に基づいて選定されています。
リスク評価
MCP サーバーの主要な資産は次のとおりです。
- Feyod データベース内の情報
- エンドユーザーが利用できる、公開されている Streamable HTTP サーバー
どちらの資産も、エンドユーザーからの質問に正確に回答するという MCP サーバーの主要な目的を支えています。
Feyod データベース内の情報に関連するリスク
リスク評価の基礎として、以下の概要で情報セキュリティ基準の分析を確認できます。
| 基準 | 影響 | 説明 |
|---|---|---|
| 機密性 | なし | Feyod データベースは公開されているため、データが漏えいしても影響はありません。 |
| 完全性 | 高 | MCP サーバーの主要な機能は、質問に正確な回答を提供することです。データが完全でなくなったり、正確でなくなったりすると、MCP サーバーはこの約束を果たせなくなります。 |
| 可用性 | 高 | MCP サーバーの主要な機能は、質問に正確な回答を提供することです。データが利用できなくなると、MCP サーバーはこの約束を果たせなくなります。 |
データの完全性と可用性が重要であることから、Feyod データベースを削除または変更するデータベースへの操作は、Feyod データベース内の情報のセキュリティに影響する主要なリスクと見なされます。このような操作は、次の方法で行われる可能性があります。
- MCP サーバーを悪用して悪意のある SQL クエリ(例:
DELETEおよびUPDATEクエリ)を生成する - MCP サーバーのホスティングプラットフォーム上のデータベースへの不正アクセス
公開されている Streamable HTTP サーバーに関連するリスク
エンドユーザーからの質問に正確に回答するという目的を踏まえ、次の主要なリスクが想定されます。
- LLM が不正確な SQL クエリまたは出力メッセージを生成し、誤った回答につながる
- MCP サーバーへの過剰なリクエストにより、サービスが利用できなくなり、コストが高額になる
- MCP サービスに悪意のあるリクエストが送信され、多数の高コストな LLM 呼び出しが発生して、コストが高額になる
主要なセキュリティ対策
Feyod データベース内の情報および公開されている Streamable HTTP サーバーに関連して特定された主要なリスクに基づき、次の主要なセキュリティ対策を実施しています。
Feyod データベース内の情報に関連する主要な制御
| リスク | 制御 | 実装の詳細 |
|---|---|---|
MCP サーバーを悪用して悪意のある SQL クエリ(例:DELETE および UPDATE クエリ)を生成すること | プロンプトエンジニアリングとクエリ検証 | プロンプトレベルの強制: query_processor.py で LLM に送信するシステムプロンプトには、次の明示的な指示が含まれています。"DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database. Only SELECT statements are allowed."アプリケーションレベルのガードレール: 生成後、アプリケーションコードは返された SQL 文字列が(大文字と小文字を区別せずに) SELECT で始まることを検証します。これにより、他の種類のステートメントが実行されるのを防ぐ決定論的なチェックを実現します。読み取り専用アクセス: 公開ホスト型サービスでは、データベースファイルは読み取り専用としてマウントされています。これにより、生成された SQL にかかわらず、書き込みまたは削除操作が実行されないことをインフラストラクチャレベルで強力に保証します。 |
| MCP サーバーのホスティングプラットフォーム上のデータベースへの不正アクセス | ファイルシステムとネットワークの分離 | ローカルファイルアクセス: 標準構成では、SQLite データベースはローカルファイル(feyod.db)であり、ネットワークポート経由では公開されません。database.py に示されているように、アプリケーションはファイルシステムから直接アクセスするため、ネットワーク攻撃対象領域を最小限に抑えます。最小権限の原則: 本番環境のホスティング環境では、標準的なファイルシステム権限を使用し、MCP サーバープロセスを実行するサービスアカウントのみがデータベースファイルへの読み取りアクセス権を持つようにします。 |
公開されている Streamable HTTP サーバーに関連する主な制御
| リスク | 制御 | 実装の詳細 |
|---|---|---|
| LLM が誤った SQL クエリや出力メッセージを生成し、回答が不正確になる | 多段階検証ワークフロー | コンテキストを踏まえた生成: 精度を高めるため、LLM にはデータベーススキーマ全体(database.get_schema_description から取得)と、利用可能な場合は有効な質問とクエリのペアの少数例(examples.py から取得)が提供されます。実行前の構文チェック: query_processor.py では、生成された SQL クエリはすべて、まず EXPLAIN ステートメント(check_sql_syntax 関数)を使ってチェックされます。これにより、実際に実行することなく、データベーススキーマに対するクエリの構文が検証され、ほとんどのエラーを検出できます。自動修正ループ: 構文チェックに失敗すると、ワークフロー( attempt_fix_sql 関数)が 2 回目の LLM 呼び出しを行い、無効なクエリと、それによって発生した具体的なデータベースエラーを渡します。これにより、モデルは修正を試みることができ、実行前に再検証されます。 |
| MCP サーバーへの過剰なリクエストにより、サービスが利用不能になり、コストが増大する | リソースとインフラストラクチャの制限 | クエリ結果の上限設定: SQL 生成プロンプトで、LLM に "always limit your query to at most 5 results" と指示し、サーバーやクライアントに負荷をかけるような過度に大きなデータセットがクエリから返されるのを防ぎます。コンテナ化: Docker を使用すると、コンテナにリソース制限(CPU、メモリ)を適用でき、暴走した単一のプロセスがホストマシン全体に影響するのを防げます。 |
| MCP サービスに悪意のあるリクエストが送られ、高コストな LLM 呼び出しが多数発生し、コストが増大する | 効率的なワークフローと外部監視 | LLM 使用の最適化: クエリ処理ワークフローは効率的になるよう設計されています。有効なユーザーの質問には、通常、LLM 呼び出しは 1 回だけ必要です。よりコストのかかる「修正」呼び出しは、最初に生成されたクエリが失敗した場合にのみ行われます。 |
セキュリティ監査
参考資料
MCP リソース:
生成 AI および LLM アプリケーションのセキュリティ対策:
- LLM アプリケーション向け OWASP Top 10 2025
- OWASP エージェント型 AI – 脅威と緩和策 1.0(2025年2月17日)
- OWASP マルチエージェントシステム脅威モデリングガイド 1.0
免責事項
この取り組みは Feyenoord Rotterdam N.V. とは提携しておらず、Feyenoord の公式製品ではありません。このサーバーを通じて提供されるデータは非公式であり、誤っている可能性があります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
