一个轻量级的 模型上下文协议(MCP) 服务器,它为存储在 S3 上的 Markdown 文档提供了 RAG(检索增强生成)功能。
简单构建:
[!IMPORTANT] 🚧 本项目正在进行中。 API 和行为可能会随时更改,并且不保证向后兼容性。 不适合生产环境。
nomic-embed-text 模型# 1. 先决条件
# 从 https://ollama.ai 安装 Ollama
ollama pull nomic-embed-text
# 2. 配置
cp env.example .env # 添加您的 S3 凭证
# 3. 运行
docker run -d \
--name s3-doc-mcp \
-p 3000:3000 \
--env-file .env \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
-v $(pwd)/data:/app/data \
yoanbernabeu/s3-doc-mcp:latest
或者使用 Docker Compose(本地构建):
docker compose up -d
# 1. 先决条件
# 从 https://ollama.ai 安装 Ollama
ollama pull nomic-embed-text
# 2. 安装并运行
npm install
cp env.example .env # 配置您的 S3 凭证
npm run build && npm start
# 3. 本地开发
npm run dev
您的 MCP 服务器现在正在 http://localhost:3000 运行。
一旦您的服务器运行起来,您需要配置您的 MCP 客户端以连接到它。
编辑您的 ~/.cursor/mcp.json 文件并添加:
{
"mcpServers": {
"doc": {
"type": "streamable-http",
"url": "http://127.0.0.1:3000/mcp",
"note": "S3 文档 RAG 服务器"
}
}
}
编辑您的 Claude Desktop 配置文件:
~/Library/Application Support/Claude/claude_desktop_config.json{
"mcpServers": {
"doc": {
"type": "streamable-http",
"url": "http://127.0.0.1:3000/mcp",
"note": "S3 文档 RAG 服务器"
}
}
}
重启您的 MCP 客户端,您应该能看到:
search_documentation,refresh_index,get_full_document💡 提示:如果使用 Docker,请确保端口映射匹配您的配置(默认是
3000:3000)
text-embedding-3-small,text-embedding-3-large)- 云端、高精度、多语言search_documentation,refresh_index 和 get_full_document服务器遵循一个简单的流水线:
.md 文件,下载其内容,并跟踪 ETags 以检测变化nomic-embed-text(本地、免费)text-embedding-3-small 或 text-embedding-3-large(云端、高精度)search_documentation,refresh_index,get_full_document 用于语义搜索和操作resources/list,resources/read 用于文件发现和直接访问HNSWLib(分层可导航的小世界)是一个轻量级的内存向量搜索库,非常适合这个用例:
它是 RAG 应用程序之间简单性和性能的最佳平衡点。
复制 env.example 到 .env 并配置您的环境变量:
cp env.example .env
# S3 配置
S3_BUCKET_NAME=your-bucket-name # 您的 S3 存储桶名称
S3_ACCESS_KEY_ID=your-access-key # S3 访问密钥
S3_SECRET_ACCESS_KEY=your-secret-key # S3 秘密密钥
S3_REGION=us-east-1 # S3 区域
S3_ENDPOINT= # 可选:非 AWS S3(MinIO、Scaleway 等)
# 嵌入提供者(选择一个)
EMBEDDING_PROVIDER=ollama # ollama(默认)或 openai
# 选项 1:Ollama(本地)
OLLAMA_BASE_URL=http://localhost:11434 # Ollama API 端点
OLLAMA_EMBEDDING_MODEL=nomic-embed-text # Ollama 嵌入模型
# 选项 2:OpenAI(云端)- 仅当 EMBEDDING_PROVIDER=openai 时
OPENAI_API_KEY= # 您的 OpenAI API 密钥
OPENAI_EMBEDDING_MODEL=text-embedding-3-small # 或 text-embedding-3-large
查看 env.example 以获取所有可用选项和详细文档(RAG 参数、同步模式、块大小等)。
服务器支持两个嵌入提供者:
优点:
缺点:
设置:
# 从 https://ollama.ai 安装 Ollama
ollama pull nomic-embed-text
# 配置
EMBEDDING_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_EMBEDDING_MODEL=nomic-embed-text
优点:
缺点:
text-embedding-3-small)设置:
# 从 https://platform.openai.com/api-keys 获取 API 密钥
# 配置
EMBEDDING_PROVIDER=openai
OPENAI_API_KEY=sk-...your-key...
OPENAI_EMBEDDING_MODEL=text-embedding-3-small # 或 text-embedding-3-large
模型比较:
| 模型 | 维度 | 性能 | 成本 | 最佳用途 |
|---|---|---|---|---|
text-embedding-3-small | 1536 | 高 | 低 | 通用目的,成本敏感 |
text-embedding-3-large | 3072 | 更高 | 中等 | 最大精度,多语言 |
💡 提示:大多数情况下从
text-embedding-3-small开始。只有在需要绝对最佳精度或大量处理非英语内容时才切换到text-embedding-3-large。
回退行为:
如果您设置了 EMBEDDING_PROVIDER=openai 但未提供有效的 OPENAI_API_KEY,服务器会自动回退到 Ollama(如果已配置)。这确保了即使配置不完整,服务器也能始终启动。
服务器支持三种同步模式,通过 SYNC_MODE:
startup(默认):在服务器启动时同步
refresh_index!periodic:定期同步(SYNC_INTERVAL_MINUTES)
manual:无自动同步
refresh_index 工具💡 注意:服务器会自动检测向量存储是否为空(例如,在删除
./data/文件夹或首次运行后),并触发全量同步。您不再需要在每次重启后手动运行refresh_index!
默认情况下,服务器以 开放访问模式 运行,便于本地开发。对于共享或远程部署,您可以启用 API 密钥认证:
# 启用认证
ENABLE_AUTH=true
# 设置您的 API 密钥
MCP_API_KEY=your-secret-key-here
当启用认证时:
/health)都需要有效的 API 密钥Authorization: Bearer your-secret-key?api_key=your-secret-key使用示例:
# 使用授权头(推荐)
curl -H "Authorization: Bearer your-secret-key" http://localhost:3000/mcp
# 使用查询参数
curl "http://localhost:3000/mcp?api_key=your-secret-key"
MCP 客户端配置带 API 密钥:
{
"mcpServers": {
"doc": {
"type": "streamable-http",
"url": "http://127.0.0.1:3000/mcp",
"headers": {
"Authorization": "Bearer your-secret-key"
},
"note": "带认证的 S3 文档 RAG 服务器"
}
}
}
💡 最佳实践:
- 本地开发时保持认证 禁用
- 对于共享网络或远程部署 启用
- 使用强随机生成的密钥(例如,
openssl rand -hex 32)/health端点始终可以无认证访问,用于监控
search_documentation{
"query": "如何配置 S3?",
"max_results": 4
}
返回相关文档片段及其相似度分数和来源。
refresh_index{
"force": false // 默认:增量同步(推荐)
}
将文档索引与 S3 同步,检测新文件、修改过的文件或删除的文件。
参数:
force(布尔值,可选,默认:false)
false:增量同步 - 只处理更改(快速、高效)✅true:全量重新索引 - 重新处理所有文件(慢、昂贵)⚠️⚠️ 重要:force 参数应仅在明确需要时设置为 true(例如,“强制重新索引”,“从零开始重建一切”)。全量重新索引是昂贵的:
正常操作时,始终使用增量同步(默认行为)。
get_full_document{
"s3_key": "docs/authentification_magique_symfony.md"
}
从 S3 检索 Markdown 文件的完整内容及其元数据:
使用场景:
search_documentation 查找文档后查看完整文档重要说明:
get_full_document 返回“未找到”,这意味着该文件在被索引后已被从 S3 删除refresh_index 以使索引与当前 S3 状态同步除了三个工具外,服务器还实现了 MCP 资源,用于文件发现和直接访问:
resources/list:列出所有已索引的 Markdown 文件及其元数据(名称、URI、大小、分块数、最后修改时间)