MCP RAG Server
Um servidor Python que fornece funcionalidade de Geração Aumentada por Recuperação (RAG). Ele indexa vários formatos de documentos e requer um banco de dados PostgreSQL com pgvector.
Documentação
MCP RAG Server
O MCP RAG Server é um servidor Python com funcionalidade RAG (Retrieval-Augmented Generation) compatível com o Model Context Protocol (MCP). Ele indexa documentos em vários formatos, como Markdown, texto, PowerPoint e PDF, usando o modelo multilingual-e5-large, e fornece funcionalidade de recuperação de informações relevantes por meio de busca vetorial.
Visão geral
Este projeto fornece funcionalidade RAG além da implementação básica de um servidor MCP. Ele pode indexar documentos em vários formatos e pesquisar informações relevantes com base em consultas em linguagem natural.
Funcionalidades
-
Implementação básica do servidor MCP
- Opera com base em JSON-RPC over stdio
- Mecanismo para registro e execução de ferramentas
- Tratamento de erros e registro de logs
-
Funcionalidade RAG
- Leitura e análise de documentos em vários formatos (Markdown, texto, PowerPoint, PDF)
- Suporte a diretórios de origem com estrutura hierárquica
- Conversão para Markdown a partir de PowerPoint e PDF usando a biblioteca markitdown
- Geração de embeddings usando modelos selecionáveis (multilingual-e5-large, ruri, etc.)
- Banco de dados vetorial usando pgvector do PostgreSQL
- Recuperação de informações relevantes por meio de busca vetorial
- Funcionalidade de recuperação de chunks anteriores e posteriores (garantindo continuidade do contexto)
- Funcionalidade de recuperação do documento completo (fornecendo contexto completo)
- Funcionalidade de indexação incremental (processa apenas arquivos novos ou modificados)
-
Ferramentas
- Ferramenta de busca vetorial (MCP)
- Ferramenta de contagem de documentos (MCP)
- Ferramenta de gerenciamento de índice (CLI)
Pré-requisitos
- Python 3.10 ou superior
- PostgreSQL 14 ou superior (com extensão pgvector)
Instalação
Instalação das dependências
# uvがインストールされていない場合は先にインストール
# pip install uv
# 依存関係のインストール
uv sync
Configuração do PostgreSQL e pgvector
Usando Docker
# pgvectorを含むPostgreSQLコンテナを起動
docker run --name postgres-pgvector -e POSTGRES_PASSWORD=password -p 5432:5432 -d pgvector/pgvector:pg17
Criação do banco de dados
Após iniciar o contêiner PostgreSQL, crie o banco de dados com o seguinte comando:
# ragdbデータベースの作成
docker exec -it postgres-pgvector psql -U postgres -c "CREATE DATABASE ragdb;"
Instalando pgvector em um PostgreSQL existente
-- pgvectorエクステンションをインストール
CREATE EXTENSION vector;
Configuração das variáveis de ambiente
Crie o arquivo .env e defina as seguintes variáveis de ambiente:
# 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
EMBEDDING_DIM=1024
EMBEDDING_PREFIX_QUERY="query: "
EMBEDDING_PREFIX_EMBEDDING="passage: "
Configuração do modelo de embeddings
Neste servidor, você pode selecionar o modelo de embeddings por meio de variáveis de ambiente.
Modelos suportados
multilingual-e5-large (padrão)
EMBEDDING_MODEL=intfloat/multilingual-e5-large
EMBEDDING_DIM=1024
EMBEDDING_PREFIX_QUERY="query: "
EMBEDDING_PREFIX_EMBEDDING="passage: "
cl-nagoya/ruri-v3-30m
EMBEDDING_MODEL=cl-nagoya/ruri-v3-30m
EMBEDDING_DIM=256
EMBEDDING_PREFIX_QUERY="検索クエリ: "
EMBEDDING_PREFIX_EMBEDDING="検索文書: "
Sobre os prefixos
Em muitos modelos de embeddings (especialmente da família E5), o desempenho melhora ao adicionar prefixos de acordo com o tipo de texto:
- Para consultas de busca:
EMBEDDING_PREFIX_QUERY- adicionado automaticamente à consulta de busca do usuário - Para documentos:
EMBEDDING_PREFIX_EMBEDDING- adicionado automaticamente aos documentos indexados
Os prefixos são processados automaticamente, portanto o cliente MCP não precisa se preocupar com eles.
Observações ao alterar o modelo
Ao alterar o modelo de embeddings, a dimensão vetorial pode mudar, portanto limpe e recrie o índice existente:
python -m src.cli clear
python -m src.cli index
Uso
Iniciando o servidor MCP
Usando uv (recomendado)
uv run python -m src.main
Ao especificar opções:
uv run python -m src.main --name "my-rag-server" --version "1.0.0" --description "My RAG Server"
Usando Python normal
python -m src.main
Uso da ferramenta de linha de comando (CLI)
Está disponível uma ferramenta de linha de comando para limpar o índice e realizar a indexação.
Exibição da ajuda
python -m src.cli --help
Limpeza do índice
python -m src.cli clear
Indexação de documentos
# デフォルト設定でインデックス化(./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
Obtenção do número de documentos no índice
python -m src.cli count
Configuração no host MCP
Para usar este servidor em um host MCP (Claude Desktop, Cline, Cursor, etc.), faça a configuração da seguinte forma. Consulte a documentação de cada host MCP para o arquivo json a ser configurado.
Exemplo de configuração
{
"mcpServers": {
"mcp-rag-server": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/mcp-rag-server",
"python",
"-m",
"src.main"
]
}
}
}
Pontos importantes da configuração
command:uv(recomendado) oupythonargs: matriz de argumentos de execução/path/to/mcp-rag-server: substitua pelo caminho real deste repositório
Sem usar uv
Em ambientes sem uv instalado, você pode usar Python normal:
{
"command": "python",
"args": [
"-m",
"src.main"
],
"cwd": "/path/to/mcp-rag-server"
}
Uso das ferramentas RAG
search
Realiza busca vetorial.
{
"jsonrpc": "2.0",
"method": "search",
"params": {
"query": "Pythonのジェネレータとは何ですか?",
"limit": 5,
"with_context": true,
"context_size": 1,
"full_document": false
},
"id": 1
}
Descrição dos parâmetros
query: consulta de busca (obrigatório)limit: número de resultados a retornar (padrão: 5)with_context: se deve obter também os chunks anteriores e posteriores (padrão: true)context_size: número de chunks a obter antes e depois (padrão: 1)full_document: se deve obter o documento inteiro (padrão: false)
Melhoria dos resultados de busca
Esta ferramenta fornece melhores resultados de busca por meio das seguintes funcionalidades:
-
Funcionalidade de recuperação de chunks anteriores e posteriores:
- Também obtém e inclui nos resultados os chunks anteriores e posteriores ao chunk encontrado na busca
- Pode ser ativada/desativada pelo parâmetro
with_context - O número de chunks a obter antes e depois pode ser ajustado pelo parâmetro
context_size
-
Funcionalidade de recuperação do documento completo:
- Obtém e inclui nos resultados o texto completo do documento encontrado na busca
- Pode ser ativada/desativada pelo parâmetro
full_document - Particularmente útil ao lidar com documentos curtos ou documentos em que o contexto geral é importante
-
Melhoria na formatação dos resultados:
- Agrupa os resultados da busca por arquivo
- Distingue visualmente "correspondências da busca", "contexto anterior/posterior" e "texto completo do documento"
- Mantém o fluxo do documento ordenando pelo índice do chunk
get_document_count
Obtém o número de documentos no índice.
{
"jsonrpc": "2.0",
"method": "get_document_count",
"params": {},
"id": 2
}
Exemplos de uso
-
Coloque os arquivos de documento no diretório
data/source. Os formatos de arquivo suportados são:- Markdown (.md, .markdown)
- Texto (.txt)
- PowerPoint (.ppt, .pptx)
- Word (.doc, .docx)
- PDF (.pdf)
-
Indexe os documentos usando o comando CLI:
# 初回は全件インデックス化 python -m src.cli index # 以降は差分インデックス化で効率的に更新 python -m src.cli index -i -
Inicie o servidor MCP:
uv run python -m src.main -
Realize a busca usando a ferramenta
search.
Backup e restauração
Para usar o banco de dados indexado em outro PC, faça backup e restauração seguindo os passos abaixo.
Backup mínimo (somente banco de dados PostgreSQL)
Se você apenas deseja usar a funcionalidade de busca RAG em outro PC, o backup do banco de dados PostgreSQL é suficiente, pois todos os dados vetorizados estão armazenados no banco de dados.
Backup do banco de dados PostgreSQL
Para fazer backup do banco de dados PostgreSQL, use o comando pg_dump dentro do contêiner Docker:
# 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
Isso criará um arquivo de backup do banco de dados PostgreSQL (exemplo: 239MB) no diretório atual.
Procedimento mínimo de restauração
- Configure o PostgreSQL e o pgvector no novo PC:
# 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;"
- Restaure o banco de dados a partir do backup:
# バックアップファイルをコンテナにコピー
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
- Verifique a configuração do ambiente:
No novo PC, verifique se as informações de conexão do PostgreSQL no arquivo .env estão configuradas corretamente.
- Verificação de funcionamento:
python -m src.cli count
Isso exibirá o número de documentos no índice. Se o mesmo número do PC original for exibido, a restauração foi concluída com sucesso.
Backup completo (opcional)
Se você planeja adicionar novos documentos no futuro ou deseja usar a funcionalidade de indexação incremental, também é recomendável fazer os seguintes backups adicionais:
Backup dos documentos processados
Faça backup do diretório de documentos processados:
# 処理済みドキュメントディレクトリをZIPファイルにバックアップ
zip -r processed_data_backup.zip data/processed/
Backup do arquivo de configuração do ambiente
Faça backup do arquivo .env:
# .envファイルをコピー
cp .env env_backup.txt
Procedimento completo de restauração
- Pré-requisitos
O novo PC deve ter o seguinte software instalado:
- Python 3.10 ou superior
- PostgreSQL 14 ou superior (com extensão pgvector)
- O código base do mcp-rag-server
-
Restaure o banco de dados PostgreSQL usando o "procedimento mínimo de restauração" acima.
-
Restaure os documentos processados:
# ZIPファイルを展開
unzip processed_data_backup.zip -d /path/to/mcp-rag-server/
- Restaure o arquivo de configuração do ambiente:
# .envファイルを復元
cp env_backup.txt /path/to/mcp-rag-server/.env
Se necessário, edite as configurações do arquivo .env (especialmente as informações de conexão do PostgreSQL) de acordo com o ambiente do novo PC.
- Verificação de funcionamento:
python -m src.cli count
Observações
- As versões do PostgreSQL e do pgvector devem ser compatíveis entre o PC original e o novo PC.
- Se houver muitos dados, o backup e a restauração podem levar tempo.
- No novo PC, é necessário instalar os pacotes Python necessários (
sentence-transformers,psycopg2-binary, etc.).
Estrutura de diretórios
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
Licença
Este projeto é publicado sob a licença MIT. Consulte o arquivo LICENSE para obter detalhes.