关于 mcp-local-rag
mcp-local-rag 是面向 MCP 客户端和命令行的本地文档检索服务器,可索引常见文档并离线搜索。它结合语义匹配与关键词提升,并返回可追溯到原文的片段。
主要功能
- 01索引 PDF、DOCX、Markdown 和文本
- 02语义搜索结合关键词匹配
- 03返回原文片段及位置
- 04支持目录同步与增量更新
- 05提供 MCP 工具和命令行
适用场景
- 01检索本地 API 文档中的认证说明
- 02按错误码查找对应文档段落
- 03将已获取的 HTML 加入索引
- 04限定目录范围查找项目资料
MCP 相关
作为 MCP 服务,提供索引同步、文件摄取、文档搜索、相邻片段读取及状态查询等工具。客户端可将已获取的 HTML 或内存文本传入索引。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y mcp-local-ragBASE_DIRBase directory for document storage (defaults to current working directory). Ignored when BASE_DIRS is set.BASE_DIRSJSON array of base directories (e.g. '["/a","/b"]'). Takes precedence over BASE_DIR.IGNORE_PATHSJSON array of glob patterns for files to keep out of the index, each matched against the file's path relative to its root (e.g. '["plugs/**","**/*.draft.md"]').DB_PATHPath to LanceDB database directory (defaults to ./lancedb/)CACHE_DIRDirectory where Transformers.js models are cached (defaults to ./models/)HF_ENDPOINTHugging Face model download endpoint. Set this to a mirror URL when direct downloads are blocked (defaults to https://huggingface.co).MODEL_NAMEEmbedding model name (defaults to Xenova/all-MiniLM-L6-v2)MAX_FILE_SIZEMaximum file size in bytes (defaults to 104857600 / 100MB)RAG_MAX_DISTANCEMaximum distance threshold for filtering search results. Results with distance greater than this value will be excluded. Lower values mean stricter filtering (e.g., 0.5 for high relevance only)RAG_GROUPINGGrouping mode for quality filtering. 'similar' returns only the most similar group (stops at first distance jump). 'related' includes related groups (stops at second distance jump). Unset means no grouping filterRAG_MAX_FILESMaximum number of files to keep in search results. Results are filtered to include only chunks from the top N best-scoring files. For example, 1 returns only the single best-matching file's chunks. Unset means no file filtering.CHUNK_MIN_LENGTHMinimum chunk length in characters (1-10000, defaults to 50). Chunks shorter than this threshold are filtered out during ingestion.STORE_IMAGESStore supported PDF and DOCX images during ingestion and return them with matched chunks (defaults to false).EMBED_TITLE_PREFIXEmbed each chunk together with its document title, which can help when passages don't restate the topic the title names (defaults to false). After changing it, use a new DB_PATH or delete the index and re-ingest.EMBED_HEADING_PREFIXAdd section headings to chunk embeddings when they fit (defaults to false). Independent of EMBED_TITLE_PREFIX. Re-ingest documents after changing it.RAG_DEVICEExecution device for the embedder (defaults to cpu). Passed straight to ONNX Runtime; see the Transformers.js device source for the supported backend names. If the requested device fails to initialize, the server throws an error.RAG_DTYPEEmbedding quantization dtype for the embedder (defaults to fp32). Opt-in and pass-through; accepts any dtype the chosen model provides (fp32, fp16, q8, int8, ...). If the model has no variant for the requested dtype, the server throws an error. Changing this changes the embedding space — re-ingest existing data.RAG_HYBRID_WEIGHTKeyword boost factor for hybrid search (0.0-1.0, defaults to 0.6). 0 means semantic similarity only; higher values increase the keyword-match contribution to the final score.RAG_RERANK_CMDExternal reranker command template. Use {query} and {top} for query text and result count; unset disables reranking.RAG_RERANK_TIMEOUT_MSTime budget per rerank call in milliseconds (100-600000, defaults to 10000). On timeout the spawned command is killed and the pre-rerank ordering is returned.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
9收录的工具列表 · 更新于 6 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | number | 否 | 最大结果数(默认值 10,范围 1–100)。值越小越注重精确率,值越大越注重召回率。 |
| query | string | 是 | 搜索查询。保留用户的具体用词(用于关键词匹配);查询含糊时补充上下文(用于语义匹配)。 |
| scope | any | 否 | 可选的绝对路径前缀(单个字符串或列表,按并集处理),用于将结果限制为 filePath 等于该前缀或位于其下的文件。"/docs/api" 匹配 "/docs/api/auth.md",但不匹配 "/docs/apiv2"。必须是绝对路径(服务器操作系统格式);相对前缀不会匹配任何内容——可从先前查询返回的 filePath 推导前缀,或省略 scope。 |
详细介绍
MCP Local RAG
English | 简体中文 | Deutsch | Español | Português (Brasil) | Français
通过 MCP 客户端或终端搜索私人文档,无需将文档发送到嵌入 API。
mcp-local-rag 会为你设备上的 PDF、DOCX、Markdown 和文本文件建立索引。搜索结合语义相似度与关键词匹配,因此查询既能匹配意图,也能匹配 API 名称、类名和错误代码等精确技术术语。结果会包含来源片段;在可用时,还会提供标题、行号或页码,方便你核查并引用原始文档。
无需 API 密钥、Docker、Python 或外部数据库。首次下载模型后,文本导入和搜索均可离线运行。
快速开始
要求
- Node.js 22.20 或更高版本
- 首次使用时需联网下载 npm 包和嵌入模型
- 包含待搜索文档的目录
将 BASE_DIR 设为该目录。它也是文件操作的安全边界。请将下方的
/absolute/path/to/your/documents 替换为该目录的绝对路径。
使用以下示例之一,或注册 npx -y mcp-local-rag,并按照客户端的 MCP 配置格式设置 BASE_DIR。
同时将 DB_PATH 和 CACHE_DIR 设为绝对路径。相对路径以服务的工作目录为基准,因此从不同项目启动服务会分别创建索引和模型缓存。
Claude Code
运行此命令:
claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag
Codex
添加到 ~/.codex/config.toml:
[mcp_servers.local-rag]
command = "npx"
args = ["-y", "mcp-local-rag"]
[mcp_servers.local-rag.env]
BASE_DIR = "/absolute/path/to/your/documents"
OpenCode
添加到 ~/.config/opencode/opencode.json(或 opencode.jsonc):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"local-rag": {
"type": "local",
"command": ["npx", "-y", "mcp-local-rag"],
"environment": {
"BASE_DIR": "/absolute/path/to/your/documents"
}
}
}
}
Cursor
添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"local-rag": {
"command": "npx",
"args": ["-y", "mcp-local-rag"],
"env": {
"BASE_DIR": "/absolute/path/to/your/documents"
}
}
}
}
重启客户端,然后让它建立索引:
Sync all documents in the configured root and wait until it finishes.
首次同步会下载默认嵌入模型(约 90 MB),导入开始前可能需要等待 1–2 分钟。之后的运行会使用本地缓存。
同步完成后:
What does the API documentation say about authentication?
CLI 快速开始
无需 MCP 客户端即可使用 CLI:
npx mcp-local-rag ingest ./docs/
npx mcp-local-rag query "authentication API"
默认情况下,CLI 会将当前目录用作文档根目录。从同一目录运行这两条命令,确保它们使用同一个默认索引;也可以显式设置 BASE_DIR 和 DB_PATH。
支持的内容
| 输入 | 导入方式 |
|---|---|
| PDF、DOCX、TXT、Markdown | 文件导入或目录同步 |
| 客户端已获取的 HTML | ingest_data |
| 内存中的纯文本或 Markdown | 使用稳定的来源标识符调用 ingest_data |
服务不内置 HTML 获取功能。MCP 客户端可以获取网页,并将其 HTML 传递给 ingest_data。
文件导入不支持 Excel、PowerPoint、独立图片和源代码文件扩展名。PDF 可以选择使用本地视觉模型描述图表,但这不是 OCR,也不支持图片搜索。
使用索引
添加、编辑或移除文档后,请同步索引。进行搜索和后续阅读时,请向 MCP 客户端询问:
Find the documented behavior of ERR_CONNECTION_REFUSED.
Read the surrounding chunks for that result.
你也可以导入单个文件,或导入客户端已获取的 HTML。若要刷新现有条目,请使用相同的路径或来源标识符重新导入文档。sync 会跳过未更改的文件。MCP 文件路径必须是绝对路径,且位于已配置的文档根目录内。
PDF 章节标题可能不准确。需要确切标题时,请查看原始页面。
MCP 工具
| 工具 | 用途 |
|---|---|
sync_start | 将索引与所有已配置的根目录或单个路径进行同步 |
sync_status | 查询正在运行的同步任务 |
ingest_file | 导入或替换单个文件 |
ingest_data | 导入客户端已持有的文本、Markdown 或 HTML |
query_documents | 使用语义匹配和关键词加权进行搜索 |
read_chunk_neighbors | 阅读搜索结果中相邻的文本块 |
list_files | 显示受支持的文件及其导入状态 |
delete_file | 删除已编入索引的文件或 ingest_data 项目 |
status | 显示索引和搜索状态 |
CLI
使用 CLI 更新索引、缩小搜索范围或移除已编入索引的内容:
npx mcp-local-rag sync ./docs/
npx mcp-local-rag query "auth" --scope /docs/api --scope /docs/guide
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
npx mcp-local-rag list
npx mcp-local-rag status
npx mcp-local-rag delete ./docs/old.pdf
npx mcp-local-rag delete --source "https://example.com/docs"
ingest 会导入选定的文件;sync 还会移除已删除文件对应的条目,并跳过未更改的文件。使用 --scope 将搜索结果限制在某个路径前缀下;重复使用该选项可纳入多个前缀。
--db-path、--cache-dir 和 --model-name 等全局选项必须放在子命令之前。子命令选项则放在子命令之后:
npx mcp-local-rag --db-path ./my-db query "authentication"
运行 npx mcp-local-rag --help 查看完整的命令参考。
query 会以 JSON 格式将结果写入 stdout,并按最佳匹配优先排序,因此可以通过管道传递给其他工具。各字段的说明见
docs/schema/query-output.schema.json。
若要迁移项目并保留索引,请先停止 MCP 服务和其他数据库写入进程,然后在不更改目录布局的情况下,将文件和数据库一并迁移,接着运行:
npx mcp-local-rag --db-path /new/project/lancedb relocate --from /old/project --to /new/project
在 MCP 配置中更新 BASE_DIR/BASE_DIRS、DB_PATH 及其他已迁移的路径,然后重启客户端。
Agent 技能
Agent 技能为 AI 助手提供查询和导入指导:
npx mcp-local-rag skills install --claude-code
npx mcp-local-rag skills install --claude-code --global
npx mcp-local-rag skills install --codex
已安装的技能涵盖查询制定、结果优化和 HTML 导入。如果技能未自动启用,请明确要求助手使用 mcp-local-rag 技能。
高级选项
先使用默认设置。需要更换文档根目录、改善语料库的搜索结果或让 PDF 图表可搜索时,再展开以下部分。
存储和文档根目录
MCP 服务会读取环境变量。CLI 接受列出的变量和标志。需要让命令使用同一索引时,请保持 DB_PATH 不变。
| 环境变量 | CLI 标志 | 默认值 | 说明 |
|---|---|---|---|
BASE_DIR | --base-dir | 当前目录 | 单个文档根目录;在 ingest、list 和 sync 中可重复使用 CLI 标志 |
BASE_DIRS | N/A | (未设置) | 文档根目录的 JSON 数组;优先于 BASE_DIR |
IGNORE_PATHS | N/A | (未设置) | 文件排除规则的 glob 模式 JSON 数组 |
DB_PATH | --db-path | ./lancedb/ | 向量数据库位置 |
CACHE_DIR | --cache-dir | ./models/ | 模型缓存目录 |
HF_ENDPOINT | N/A | https://huggingface.co | Hugging Face 模型下载端点;直接下载受阻时请使用镜像 URL |
MAX_FILE_SIZE | --max-file-size | 104857600(100MB) | 最大文件大小,单位为字节 |
| 文件操作仅限于已配置的根目录。对于多个目录,请设置 | |||
BASE_DIRS='["/absolute/docs","/absolute/specs"]',或重复使用 CLI --base-dir。优先级:CLI | |||
根目录、BASE_DIRS、BASE_DIR,然后是当前目录。仅使用优先级最高的来源;不会合并不同来源中的根目录。无效的 | |||
BASE_DIRS 会报错。相对路径的 DB_PATH 和 CACHE_DIR 会基于工作目录解析。 |
如需将文件排除在索引之外,请将 IGNORE_PATHS 设为 glob 模式的 JSON 数组,例如
IGNORE_PATHS='["plugs/**","**/*.draft.md"]'。每个模式都会与文件相对于其所属根目录的路径匹配;所有操作系统上路径都使用 /。* 和 ** 不会匹配
以 . 开头的名称,因此需明确写出这类目录,例如 ".obsidian/**"。扫描目录时,ingest、
list 和 sync 会跳过匹配的文件,而 sync 还会移除已编入索引的匹配文件。无效的
IGNORE_PATHS 会报错。
模型与搜索调优
请根据文档的语言和主题选择嵌入模型。使用实际会提出的问题比较各项设置,并检查返回了哪些源文段。该模型必须支持均值池化和 L2 归一化,本工具会使用这两项功能生成嵌入。
| 环境变量 | CLI 标志 | 默认值 | 描述 |
|---|---|---|---|
MODEL_NAME | --model-name | Xenova/all-MiniLM-L6-v2 | Hugging Face 嵌入模型 |
CHUNK_MIN_LENGTH | --chunk-min-length | 50 | 普通文本块的最小字符数(1–10000);为适应模型的 token 数限制而拆分的内容片段可以更短 |
EMBED_TITLE_PREFIX | N/A | false | 将文档标题添加到每个文本块的嵌入输入中 |
EMBED_HEADING_PREFIX | N/A | false | 在适用时将标题层级添加到每个文本块的嵌入输入中 |
RAG_DEVICE | N/A | cpu | ONNX Runtime 执行设备 |
RAG_DTYPE | N/A | fp32 | 传递给所选模型的嵌入数据类型 |
这两个前缀选项的默认值均为 false,且彼此独立。若文段需要体现文档的整体主题,可尝试设置 EMBED_TITLE_PREFIX;若需要体现其所属章节的主题,则可尝试设置
EMBED_HEADING_PREFIX。同时启用两者不一定更好。它们会影响嵌入,而不会影响返回的
文本或关键词索引;如果标题上下文超出输入预算,则会省略。
更改嵌入模型时,请在新的 DB_PATH 下创建全新索引。不同模型生成的向量不可比较,即使其维度相同也不行。更改 RAG_DTYPE 或任一前缀选项后,请重新摄取所有已编入索引的文档,再进行搜索。sync 会跳过未更改的文件。
CLI 不会读取 MCP 客户端配置。共享索引时,摄取和搜索必须使用相同的模型、RAG_DTYPE 和前缀设置。仅更改 RAG_DEVICE 无需创建新索引。
搜索调优
以下前四项设置同时适用于 MCP 和 CLI 查询。若要提高精确词项的权重,可尝试增大 RAG_HYBRID_WEIGHT,并根据自己的问题比较结果。外部重排仅适用于 MCP。
| 变量 | 默认值 | 描述 |
|---|---|---|
RAG_HYBRID_WEIGHT | 0.6 | 关键词加权系数(0.0–1.0)。0 表示不进行关键词重排;1 表示应用最大加权。 |
RAG_GROUPING | (未设置) | similar 保留第一个相关性分组;related 最多保留两个分组,并以显著的向量距离差异作为边界。 |
RAG_MAX_DISTANCE | (未设置) | 过滤低相关性结果(例如 0.5)。 |
RAG_MAX_FILES | (未设置) | 仅保留排名靠前的 N 个文件(例如 1 表示仅保留最佳文件)。 |
RAG_RERANK_CMD | (未设置) | 仅适用于 MCP:外部命令;{query} 表示传入查询,{top} 表示请求的结果数量。 |
RAG_RERANK_TIMEOUT_MS | 10000 | 每次重排调用的时间预算,单位为毫秒(100–600000)。 |
外部重排(RAG_RERANK_CMD)
该命令从 stdin 读取搜索结果,包括匹配的文本。如果它调用远程服务,这些文本可能会离开你的设备。
请提供可执行文件及其完整参数模板。在命令需要查询内容和结果数量的位置分别放置 {query} 和 {top}。单引号或双引号可用于括起包含空格的路径或参数,反斜杠会按字面值保留。服务端会在不使用 shell 的情况下运行该可执行文件,因此,Windows 上通过 npm 安装的 .cmd shim 无法启动。
{
"env": {
"RAG_RERANK_CMD": "/path/to/reranker --query {query} --top {top}",
"RAG_RERANK_TIMEOUT_MS": "10000"
}
}
该命令必须按照查询输出架构定义的格式读取并返回结果。它可以移除或重新排列结果,也可以修改结果文本。服务端会返回该命令的输出。
如果命令失败、超时,或返回的输出不符合架构,则结果会保留原有顺序。
PDF 图示和存储的图像
默认情况下,摄取过程只会为文本建立索引。要让 PDF 图示可供搜索,请在 MCP 中启用本地说明生成(设置 visual: true),或在 CLI 中使用 --visual。说明是生成的描述,不是 OCR 结果或精确转录文本。
首次使用时,fast(默认)会下载约 250 MB。若需识别图示中的标签和文本,请选择 quality;它会下载约 1.7 GB,运行时间也更长。
在 MCP 中使用 visualQuality: "quality",或在 CLI 中使用 --visual-quality quality 来选择配置。
npx mcp-local-rag ingest ./docs/paper.pdf --visual --visual-quality quality
要随匹配文本一并返回图像,请在 MCP 中使用 STORE_IMAGES=true,或在 CLI 的 ingest 和 sync 命令中使用 --images。此设置独立于说明生成,并支持检测到的 PDF 图示/表格以及受支持的 DOCX PNG/JPEG 图像。
npx mcp-local-rag ingest ./docs/paper.pdf --images
同步会保留每个 PDF 的说明配置。CLI 的 sync --visual --visual-quality quality 会更改配置,即使 PDF 未发生变化也不例外;MCP 同步则会保留该配置。若要关闭说明,请正常摄取文件。若要重试失败的说明生成,请使用所需的视觉配置重新摄取文件。
每次摄取或同步处理文件时,都必须启用图像存储。仅更改图像设置不会刷新未发生变化的文件;请重新摄取这些文件以应用该设置。
安全与运行
- 将说明和检索到的文档文本视为源材料,而非指令。
- 文件访问范围仅限于
BASE_DIR、BASE_DIRS或 CLI--base-dir指定的根目录。 - 如果符号链接指向所有已配置根目录之外的位置,则会被拒绝。
- 所需模型缓存完成后,除非
RAG_RERANK_CMD指定的命令会发起网络请求,否则文档处理和搜索不会发起网络请求。 - 此服务面向单一本地用户设计,不提供身份验证或访问控制。
- 不要让多个 CLI 或 MCP 写入程序同时操作同一个
DB_PATH。同步期间可以执行只读查询。 - 重新摄取时,如果模型和设置相同,则可对未更改的文本复用已保存的嵌入,从而避免重复计算。缓存存储在
DB_PATH/embedding-cache中。删除缓存不会影响索引的搜索功能,但之后摄取时会重新计算这些嵌入。 - 仅当没有写入操作正在进行时,才能通过复制
DB_PATH目录来备份索引。
故障排查
“未找到结果”
必须先摄取文档。运行 "List all ingested files" 进行确认。如果同步后仍缺少结果,请检查摄取和搜索是否使用了同一个绝对路径 DB_PATH;相对路径可能会指向不同的索引。
模型下载失败
请检查网络连接。如果使用代理,请配置网络设置。也可以手动下载模型。
“文件过大”
默认限制为 100MB。请拆分大文件,或增大 MAX_FILE_SIZE。
查询缓慢
使用 status 检查分块数量。包含大量分块的大型文档可能会拖慢查询。可考虑拆分特别大的文件。
确保文件路径位于某个已配置的根目录下(BASE_DIR、任何 BASE_DIRS 条目或任何 CLI --base-dir)。使用绝对路径。
“BASE_DIRS 必须是 JSON 数组……”
BASE_DIRS 接受一个包含一个或多个非空路径字符串的 JSON 数组:
- 有效:
BASE_DIRS='["/Users/me/work","/Users/me/specs"]' - 无效:
BASE_DIRS=/a:/b(不支持分隔符语法) - 无效:
BASE_DIRS='[]'(数组为空)
MCP 客户端看不到工具
- 检查配置文件语法
- 完全重启客户端(在 Mac 上按 Cmd+Q 退出 Cursor)
- 直接测试:
npx mcp-local-rag应能无错误运行
贡献
欢迎贡献!有关设置和指南,请参阅 CONTRIBUTING.md。
许可证
MIT 许可证。可免费用于个人和商业用途。
博客文章
- 构建用于 Agent 编码的本地 RAG:深入介绍语义分块和混合搜索的设计。
致谢
基于 Anthropic 的 Model Context Protocol、 LanceDB 和 Transformers.js 构建。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。