语义搜索引擎服务

一个针对Google Drive参考库的个人语义搜索引擎,作为MCP服务器暴露,并可连接到Claude.ai。

  • by RafaelEstanislau
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 RafaelEstanislau/RAG-MCP-Server

使用说明

RAG MCP服务器

Google Drive参考库上的个人语义搜索引擎,作为MCP服务器公开,可连接到Claude.ai。


为什么是这个而不是Claude.ai的原生Google Drive集成?

本机驱动器连接 此RAG服务器
运作原理 将原始文件内容转储到上下文中 将块嵌入为向量,仅检索相关块
大型图书馆 使用10+篇论文快速达到令牌限制 扩展到数百个文档——只返回前K个块
搜索质量 关键字/文件名匹配 语义相似性——即使没有确切的关键字,也能找到相关内容
PDF处理 全文转储 使用页码元数据进行每页提取
重新读取文件 每次对话 索引都保存在Qdrant Cloud中,无需重新下载
引文支持 否 返回每个块的论文标题+页码
上下文效率 上下文中的整个文档 只有最相关的段落,保持窗口干净

核心思想:与其把整个库都给克劳德,不如给它一个工具 查询 图书馆。克劳德决定搜索什么,然后重新集中注意力,引用摘录。


建筑

Google Drive (PDFs / DOCX)
        │
        ▼
   src/drive/          ← Service Account auth + file sync
        │
        ▼
   src/ingestion/      ← text extraction (PyMuPDF / python-docx) + chunking
        │
        ▼
   src/store/          ← fastembed embeddings → Qdrant Cloud
        │
        ▼
   src/mcp_server/     ← MCP tools over Streamable HTTP + OAuth 2.0
        │
        ▼
     Claude.ai

先决条件

  • Python 3.11–3.13(不支持3.14——fastembed还没有轮子)
  • 一个启用了驱动API和 服务帐户
  • 与该服务帐户共享的Google Drive文件夹
  • A. Qdrant云 集群(免费层有效)
  • 服务器的公共HTTPS URL(为本地开发提供免费层或ngrok)

逐步设置

1.克隆并安装

git clone <repo-url>
cd RAG-MCP-Server
pip install -e ".[dev]"

2.Qdrant Cloud——创建集群

  1. 注册地址: cloud.qdrant.io
  2. 创建免费集群
  3. 复制 群集URL 并生成 API密钥 从仪表板

3.谷歌云——创建服务帐户

  1. 首选 谷歌云控制台
  2. 创建或选择一个项目并启用 Google Drive API
  3. 首选 IAM和管理员→ 服务账户→ 创建服务帐户
  4. 不授予其特殊角色(驱动器访问由文件夹共享控制)
  5. 打开服务帐户→ Keys → 添加关键点→ JSON --下载文件
  6. 复制整个JSON文件内容——将其粘贴为下面的env-var

4.与服务帐户共享您的Drive文件夹

打开要索引的Google Drive文件夹,单击 分享,并添加服务帐户电子邮件(看起来像 name@project.iam.gserviceaccount.com)与 观众 访问。

从URL获取文件夹ID:

https://drive.google.com/drive/folders/1A2B3C4D5E6F7G8H9I0J
                                        ^^^^^^^^^^^^^^^^^^^^
                                        this is your folder ID

5.配置环境变量

创建一个 .env 项目根目录中的文件:

DRIVE_FOLDER_ID=your_folder_id_here
QDRANT_URL=https://your-cluster.qdrant.io
QDRANT_API_KEY=your_qdrant_api_key
GOOGLE_SERVICE_ACCOUNT_KEY={"type":"service_account","project_id":"..."}
MCP_SERVER_URL=https://your-public-url.example.com

GOOGLE_SERVICE_ACCOUNT_KEY 是下载的JSON密钥的完整内容,在一行中。

可选变量(默认值):

MCP_HOST=0.0.0.0
MCP_PORT=8000
EMBED_MODEL=BAAI/bge-small-en-v1.5
CHUNK_MAX_TOKENS=400
CHUNK_OVERLAP_PARAGRAPHS=1

内存提示(免费层托管): 如果在同步过程中达到512 MB的限制,请降低 CHUNK_MAX_TOKENS 到 200较小的块意味着每个嵌入批内存中的向量更少。

6.运行服务器

python -m src.mcp_server.server

不需要浏览器OAuth流——服务帐户会自动进行身份验证。

7.公开服务器

选项A--部署到Render(推荐)

  1. 将仓库推送到GitHub
  2. 创建新 网络服务 上 render.com,已连接到您的仓库
  3. 设置构建命令: pip install -e .
  4. 设置启动命令: python -m src.mcp_server.server
  5. 在Render仪表板中添加步骤5中的所有环境变量
  6. 渲染提供稳定 https://your-service.onrender.com URL--请将其用作 MCP_SERVER_URL

选项B--ngrok用于本地开发

# in a separate terminal
ngrok http 8000

复制 https:// URL并将其设置为 MCP_SERVER_URL,然后重新启动服务器。

每次重启时免费更改ngrok网址——更新 MCP_SERVER_URL 每次重新启动。

8.连接Claude.ai

  1. 首选 claude.ai → 设置→ 集成
  2. 使用您的公共URL添加新的MCP服务器
  3. 完成出现的OAuth弹出窗口
  4. 服务器现在已连接

9.初始同步

在Claude.ai对话中:

“使用sync_drive工具下载并索引我的论文”

这将从您的Drive文件夹下载所有PDF和DOCX文件,并构建矢量索引。后续同步仅处理新的或更改的文件。


可用工具

工具 说明
search_references 语义搜索——返回与论文标题和页码最相关的块
list_papers 列出当前索引的所有论文
sync_drive 从驱动器下载新的/更新的文件并重新索引它们

示例提示

Search my references for transformer attention mechanisms
List all papers I have indexed
Sync my Drive folder, then find papers about retrieval-augmented generation and summarize the key ideas

项目结构

RAG-MCP-Server/
├── config/
│   └── settings.py          # All configuration via env vars
├── src/
│   ├── drive/
│   │   ├── auth.py          # Google Service Account authentication
│   │   └── sync.py          # File download and sync logic
│   ├── ingestion/
│   │   ├── extractor.py     # PDF (per-page) and DOCX text extraction
│   │   └── chunker.py       # Token-aware chunking with overlap
│   ├── store/
│   │   └── vector_store.py  # fastembed embeddings + Qdrant storage and query
│   └── mcp_server/
│       ├── oauth.py         # In-memory OAuth 2.0 provider (auto-approves)
│       └── server.py        # MCP tools + Streamable HTTP transport
├── tests/                   # Full test suite (AAA pattern, 90%+ coverage)
├── .env                     # Local env vars (git-ignored)
└── pyproject.toml

运行测试

pytest