MCP RAG 服务器是一个符合 Model Context Protocol (MCP) 的 Python 服务器,具有 RAG(检索增强生成)功能。它可以将多种格式的文档(如 Markdown、文本、PowerPoint、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
EMBEDDING_DIM=1024
EMBEDDING_PREFIX_QUERY="query: "
EMBEDDING_PREFIX_EMBEDDING="passage: "
此服务器允许在环境变量中选择嵌入模型。
EMBEDDING_MODEL=intfloat/multilingual-e5-large
EMBEDDING_DIM=1024
EMBEDDING_PREFIX_QUERY="query: "
EMBEDDING_PREFIX_EMBEDDING="passage: "
EMBEDDING_MODEL=cl-nagoya/ruri-v3-30m
EMBEDDING_DIM=256
EMBEDDING_PREFIX_QUERY="查询: "
EMBEDDING_PREFIX_EMBEDDING="文档: "
许多嵌入模型(尤其是 E5 系列)通过根据文本类型添加前缀来提高性能:
EMBEDDING_PREFIX_QUERY - 自动添加到用户的查询中EMBEDDING_PREFIX_EMBEDDING - 自动添加到被索引化的文档中前缀会自动处理,因此 MCP 客户端无需特别关注。
更改嵌入模型时,由于向量维度可能会改变,需要清除现有的索引并重新创建:
python -m src.cli clear
python -m src.cli index
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
要在 MCP 主机(如 Claude Desktop、Cline、Cursor 等)上使用此服务器,需要进行如下设置。关于设置 json 文件的具体内容,请参阅各 MCP 主机的文档。
{
"mcpServers": {
"mcp-rag-server": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/mcp-rag-server",
"python",
"-m",
"src.main"
]
}
}
}
command: uv(推荐)或 pythonargs: 实际运行参数的数组/path/to/mcp-rag-server: 请替换为此仓库的实际路径在未安装 uv 的环境中,可以使用普通 Python:
{
"command": "python",
"args": [
"-m",
"src.main"
],
"cwd": "/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 数据库即可。因为所有向量化数据都存储在数据库中。
使用 Docker 容器内的 pg_dump 命令备份 PostgreSQL 数据库:
# 在 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/ # 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 文件。