
RAG
STDIOMCP server with RAG functionality for multi-format document retrieval and vector search
MCP server with RAG functionality for multi-format document retrieval and vector search
MCP RAG Serverは、Model Context Protocol (MCP)に準拠したRAG(Retrieval-Augmented Generation)機能を持つPythonサーバーです。マークダウン、テキスト、パワーポイント、PDFなど複数の形式のドキュメントをデータソースとして、multilingual-e5-largeモデルを使用してインデックス化し、ベクトル検索によって関連情報を取得する機能を提供します。
このプロジェクトは、MCPサーバーの基本的な実装に加えて、RAG機能を提供します。複数形式のドキュメントをインデックス化し、自然言語クエリに基づいて関連情報を検索することができます。
MCPサーバーの基本実装
RAG機能
ツール
# uvがインストールされていない場合は先にインストール # pip install uv # 依存関係のインストール uv sync
# pgvectorを含むPostgreSQLコンテナを起動 docker run --name postgres-pgvector -e POSTGRES_PASSWORD=password -p 5432:5432 -d pgvector/pgvector:pg17
PostgreSQLコンテナを起動した後、以下のコマンドでデータベースを作成します:
# ragdbデータベースの作成 docker exec -it postgres-pgvector psql -U postgres -c "CREATE DATABASE ragdb;"
-- pgvectorエクステンションをインストール CREATE EXTENSION vector;
.env
ファイルを作成し、以下の環境変数を設定します:
# PostgreSQL接続情報
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DB=ragdb
# ドキュメントディレクトリ
SOURCE_DIR=./data/source
PROCESSED_DIR=./data/processed
# エンベディングモデル
EMBEDDING_MODEL=intfloat/multilingual-e5-large
uv run python -m src.main
オプションを指定する場合:
uv run python -m src.main --name "my-rag-server" --version "1.0.0" --description "My RAG Server"
python -m src.main
インデックスのクリアとインデックス化を行うためのコマンドラインツールが用意されています。
python -m src.cli --help
python -m src.cli clear
# デフォルト設定でインデックス化(./data/source ディレクトリ) python -m src.cli index # 特定のディレクトリをインデックス化 python -m src.cli index --directory ./path/to/documents # チャンクサイズとオーバーラップを指定してインデックス化 python -m src.cli index --directory ./data/source --chunk-size 300 --chunk-overlap 50 # または短い形式で python -m src.cli index -d ./data/source -s 300 -o 50 # 差分インデックス化(新規・変更ファイルのみを処理) python -m src.cli index --incremental # または短い形式で python -m src.cli index -i
python -m src.cli count
Cline/CursorなどのAIツールでMCPサーバーを使用するには、mcp_settings.json
ファイルに以下のような設定を追加します:
"mcp-rag-server": { "command": "uv", "args": [ "run", "--directory", "/path/to/mcp-rag-server", "python", "-m", "src.main" ], "env": {}, "disabled": false, "alwaysAllow": [] }
/path/to/mcp-rag-server
は、このリポジトリのインストールディレクトリに置き換えてください。
ベクトル検索を行います。
{ "jsonrpc": "2.0", "method": "search", "params": { "query": "Pythonのジェネレータとは何ですか?", "limit": 5, "with_context": true, "context_size": 1, "full_document": false }, "id": 1 }
query
: 検索クエリ(必須)limit
: 返す結果の数(デフォルト: 5)with_context
: 前後のチャンクも取得するかどうか(デフォルト: true)context_size
: 前後に取得するチャンク数(デフォルト: 1)full_document
: ドキュメント全体を取得するかどうか(デフォルト: false)このツールは以下の機能により、より良い検索結果を提供します:
前後のチャンク取得機能:
with_context
パラメータで有効/無効を切り替え可能context_size
パラメータで前後に取得するチャンク数を調整可能ドキュメント全文取得機能:
full_document
パラメータで有効/無効を切り替え可能結果の整形改善:
インデックス内のドキュメント数を取得します。
{ "jsonrpc": "2.0", "method": "get_document_count", "params": {}, "id": 2 }
ドキュメントファイルを data/source
ディレクトリに配置します。サポートされるファイル形式は以下の通りです:
CLIコマンドを使用してドキュメントをインデックス化します:
# 初回は全件インデックス化 python -m src.cli index # 以降は差分インデックス化で効率的に更新 python -m src.cli index -i
MCPサーバーを起動します:
uv run python -m src.main
search
ツールを使用して検索を行います。
インデックス化したデータベースを別のPCで使用するには、以下の手順でバックアップと復元を行います。
単純に他のPCでRAG検索機能を使いたいだけなら、PostgreSQLデータベースのバックアップだけで十分です。ベクトル化されたデータはすべてデータベースに保存されているためです。
PostgreSQLデータベースをバックアップするには、Dockerコンテナ内でpg_dump
コマンドを使用します:
# Dockerコンテナ内でデータベースをバックアップ docker exec -it postgres-pgvector pg_dump -U postgres -d ragdb -F c -f /tmp/ragdb_backup.dump # バックアップファイルをコンテナからホストにコピー docker cp postgres-pgvector:/tmp/ragdb_backup.dump ./ragdb_backup.dump
これにより、PostgreSQLデータベースのバックアップファイル(例:239MB)がカレントディレクトリに作成されます。
# Dockerを使用する場合 docker run --name postgres-pgvector -e POSTGRES_PASSWORD=password -p 5432:5432 -d pgvector/pgvector:pg17 # データベースを作成 docker exec -it postgres-pgvector psql -U postgres -c "CREATE DATABASE ragdb;"
# バックアップファイルをコンテナにコピー docker cp ./ragdb_backup.dump postgres-pgvector:/tmp/ragdb_backup.dump # コンテナ内でデータベースを復元 docker exec -it postgres-pgvector pg_restore -U postgres -d ragdb -c /tmp/ragdb_backup.dump
新しいPCでは、.env
ファイルのPostgreSQL接続情報が正しく設定されていることを確認してください。
python -m src.cli count
これにより、インデックス内のドキュメント数が表示されます。元のPCと同じ数が表示されれば、正常に復元されています。
将来的に新しいドキュメントを追加する予定がある場合や、差分インデックス化機能を使用したい場合は、以下の追加バックアップも行うと良いでしょう:
処理済みドキュメントディレクトリをバックアップします:
# 処理済みドキュメントディレクトリをZIPファイルにバックアップ zip -r processed_data_backup.zip data/processed/
.env
ファイルをバックアップします:
# .envファイルをコピー cp .env env_backup.txt
新しいPCには以下のソフトウェアがインストールされている必要があります:
PostgreSQLデータベースを上記の「最小限の復元手順」で復元します。
処理済みドキュメントを復元します:
# ZIPファイルを展開 unzip processed_data_backup.zip -d /path/to/mcp-rag-server/
# .envファイルを復元 cp env_backup.txt /path/to/mcp-rag-server/.env
必要に応じて、新しいPC環境に合わせて.env
ファイルの設定(特にPostgreSQL接続情報)を編集します。
python -m src.cli count
sentence-transformers
、psycopg2-binary
など)をインストールしておく必要があります。mcp-rag-server/
├── data/
│ ├── source/ # 原稿ファイル(階層構造対応)
│ │ ├── markdown/ # マークダウンファイル
│ │ ├── docs/ # ドキュメントファイル
│ │ └── slides/ # プレゼンテーションファイル
│ └── processed/ # 処理済みファイル(テキスト抽出済み)
│ └── file_registry.json # 処理済みファイルの情報(差分インデックス用)
├── docs/
│ └── design.md # 設計書
├── logs/ # ログファイル
├── src/
│ ├── __init__.py
│ ├── document_processor.py # ドキュメント処理モジュール
│ ├── embedding_generator.py # エンベディング生成モジュール
│ ├── example_tool.py # サンプルツールモジュール
│ ├── main.py # メインエントリーポイント
│ ├── mcp_server.py # MCPサーバーモジュール
│ ├── rag_service.py # RAGサービスモジュール
│ ├── rag_tools.py # RAGツールモジュール
│ └── vector_database.py # ベクトルデータベースモジュール
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_document_processor.py
│ ├── test_embedding_generator.py
│ ├── test_example_tool.py
│ ├── test_mcp_server.py
│ ├── test_rag_service.py
│ ├── test_rag_tools.py
│ └── test_vector_database.py
├── .env # 環境変数設定ファイル
├── .gitignore
├── LICENSE
├── pyproject.toml
└── README.md
このプロジェクトはMITライセンスの下で公開されています。詳細はLICENSEファイルを参照してください。