Uses PostgreSQL with pgvector extension as a vector database for storing and searching document embeddings generated from various file formats including Markdown, PDF, and PowerPoint files.
MCP RAG Server
MCP RAG Serverは、Model Context Protocol (MCP)に準拠したRAG(Retrieval-Augmented Generation)機能を持つPythonサーバーです。マークダウン、テキスト、パワーポイント、PDFなど複数の形式のドキュメントをデータソースとして、multilingual-e5-largeモデルを使用してインデックス化し、ベクトル検索によって関連情報を取得する機能を提供します。
概要
このプロジェクトは、MCPサーバーの基本的な実装に加えて、RAG機能を提供します。複数形式のドキュメントをインデックス化し、自然言語クエリに基づいて関連情報を検索することができます。
機能
MCPサーバーの基本実装
JSON-RPC over stdioベースで動作
ツールの登録と実行のためのメカニズム
エラーハンドリングとロギング
RAG機能
複数形式のドキュメント(マークダウン、テキスト、パワーポイント、PDF)の読み込みと解析
階層構造を持つソースディレクトリに対応
markitdownライブラリを使用したパワーポイントやPDFからのマークダウン変換
選択可能なエンベディングモデル(multilingual-e5-large、ruriなど)を使用したエンベディング生成
PostgreSQLのpgvectorを使用したベクトルデータベース
ベクトル検索による関連情報の取得
前後のチャンク取得機能(コンテキストの連続性を確保)
ドキュメント全文取得機能(完全なコンテキストを提供)
差分インデックス化機能(新規・変更ファイルのみを処理)
ツール
ベクトル検索ツール(MCP)
ドキュメント数取得ツール(MCP)
インデックス管理ツール(CLI)
前提条件
Python 3.10以上
PostgreSQL 14以上(pgvectorエクステンション付き)
インストール
依存関係のインストール
PostgreSQLとpgvectorのセットアップ
Dockerを使用する場合
データベースの作成
PostgreSQLコンテナを起動した後、以下のコマンドでデータベースを作成します:
既存のPostgreSQLにpgvectorをインストールする場合
環境変数の設定
.envファイルを作成し、以下の環境変数を設定します:
エンベディングモデルの設定
このサーバーでは、環境変数でエンベディングモデルを選択できます。
サポートされているモデル
multilingual-e5-large(デフォルト)
cl-nagoya/ruri-v3-30m
プレフィックスについて
多くのエンベディングモデル(特にE5系)では、テキストの種類に応じてプレフィックスを付けることで性能が向上します:
検索クエリ用:
EMBEDDING_PREFIX_QUERY- ユーザーの検索クエリに自動で追加文書用:
EMBEDDING_PREFIX_EMBEDDING- インデックス化される文書に自動で追加
プレフィックスは自動で処理されるため、MCPクライアントは意識する必要がありません。
モデル変更時の注意
エンベディングモデルを変更した場合は、ベクトル次元が変わる可能性があるため、既存のインデックスをクリアして再作成してください:
使い方
MCPサーバーの起動
uvを使用する場合(推奨)
オプションを指定する場合:
通常のPythonを使用する場合
コマンドラインツール(CLI)の使用方法
インデックスのクリアとインデックス化を行うためのコマンドラインツールが用意されています。
ヘルプの表示
インデックスのクリア
ドキュメントのインデックス化
インデックス内のドキュメント数の取得
MCPホストでの設定
MCPホスト(Claude Desktop、Cline、Cursorなど)でこのサーバーを使用するには、以下のような設定を行います。設定するjsonファイルについては、各MCPホストの ドキュメントを参照してください。
設定例
設定のポイント
command:uv(推奨)またはpythonargs: 実行引数の配列/path/to/mcp-rag-server: このリポジトリの実際のパスに置き換えてください
uvを使用しない場合
uvがインストールされていない環境では、通常のPythonを使用できます:
RAGツールの使用方法
search
ベクトル検索を行います。
パラメータの説明
query: 検索クエリ(必須)limit: 返す結果の数(デフォルト: 5)with_context: 前後のチャンクも取得するかどうか(デフォルト: true)context_size: 前後に取得するチャンク数(デフォルト: 1)full_document: ドキュメント全体を取得するかどうか(デフォルト: false)
検索結果の改善
このツールは以下の機能により、より良い検索結果を提供します:
前後のチャンク取得機能:
検索でヒットしたチャンクの前後のチャンクも取得して結果に含めます
with_contextパラメータで有効/無効を切り替え可能context_sizeパラメータで前後に取得するチャンク数を調整可能
ドキュメント全文取得機能:
検索でヒットしたドキュメントの全文を取得して結果に含めます
full_documentパラメータで有効/無効を切り替え可能特に短いドキュメントや全体の文脈が重要なドキュメントを扱う場合に有用
結果の整形改善:
検索結果をファイルごとにグループ化
「検索ヒット」「前後のコンテキスト」「ドキュメント全文」を視覚的に区別
チャンクインデックスでソートして文書の流れを維持
get_document_count
インデックス内のドキュメント数を取得します。
使用例
ドキュメントファイルを
data/sourceディレクトリに配置します。サポートされるファイル形式は以下の通りです:マークダウン(.md, .markdown)
テキスト(.txt)
パワーポイント(.ppt, .pptx)
Word(.doc, .docx)
PDF(.pdf)
CLIコマンドを使用してドキュメントをインデックス化します:
# 初回は全件インデックス化 python -m src.cli index # 以降は差分インデックス化で効率的に更新 python -m src.cli index -iMCPサーバーを起動します:
uv run python -m src.mainsearchツールを使用して検索を行います。
バックアップと復元
インデックス化したデータベースを別のPCで使用するには、以下の手順でバックアップと復元を行います。
最小限のバックアップ(PostgreSQLデータベースのみ)
単純に他のPCでRAG検索機能を使いたいだけなら、PostgreSQLデータベースのバックアップだけで十分です。ベクトル化されたデータはすべてデータベースに保存されているためです。
PostgreSQLデータベースのバックアップ
PostgreSQLデータベースをバックアップするには、Dockerコンテナ内でpg_dumpコマンドを使用します:
これにより、PostgreSQLデータベースのバックアップファイル(例:239MB)がカレントディレクトリに作成されます。
最小限の復元手順
新しいPCでPostgreSQLとpgvectorをセットアップします:
バックアップからデータベースを復元します:
環境設定を確認します:
新しいPCでは、.envファイルのPostgreSQL接続情報が正しく設定されていることを確認してください。
動作確認:
これにより、インデックス内のドキュメント数が表示されます。元のPCと同じ数が表示されれば、正常に復元されています。
完全バックアップ(オプション)
将来的に新しいドキュメントを追加する予定がある場合や、差分インデックス化機能を使用したい場合は、以下の追加バックアップも行うと良いでしょう:
処理済みドキュメントのバックアップ
処理済みドキュメントディレクトリをバックアップします:
環境設定ファイルのバックアップ
.envファイルをバックアップします:
完全復元手順
前提条件
新しいPCには以下のソフトウェアがインストールされている必要があります:
Python 3.10以上
PostgreSQL 14以上(pgvectorエクステンション付き)
mcp-rag-serverのコードベース
PostgreSQLデータベースを上記の「最小限の復元手順」で復元します。
処理済みドキュメントを復元します:
環境設定ファイルを復元します:
必要に応じて、新しいPC環境に合わせて.envファイルの設定(特にPostgreSQL接続情報)を編集します。
動作確認:
注意点
PostgreSQLのバージョンとpgvectorのバージョンは、元のPCと新しいPCで互換性がある必要があります。
大量のデータがある場合は、バックアップと復元に時間がかかる場合があります。
新しいPCでは、必要なPythonパッケージ(
sentence-transformers、psycopg2-binaryなど)をインストールしておく必要があります。
ディレクトリ構造
ライセンス
このプロジェクトはMITライセンスの下で公開されています。詳細はLICENSEファイルを参照してください。