关于 Local Rag
Local Rag(MIMIRS)是面向 AI 编码 Agent 的本地语义代码搜索与项目记忆服务,结合向量与 BM25 混合检索、交叉编码器重排序和 AST 感知分块。无需 API 密钥、云服务或 Docker,基于 Bun 与 SQLite 运行,适合希望减少上下文消耗的开发者。
主要功能
- 01向量与 BM25 混合语义搜索
- 02交叉编码器重排序
- 03支持 14 种语言的 AST 感知分块
- 04跨会话对话记忆与检查点
- 05代码注释与依赖图
- 06搜索分析统计
适用场景
- 01让编码 Agent 在会话开始时快速定位相关文件
- 02减少大型代码库中无关文件带来的 token 消耗
- 03在多次会话之间保留项目上下文与讨论记录
MCP 相关
该项目是一个 MCP 服务,通过 stdio 运行,向 Claude Code、Cursor、Windsurf 等 MCP 客户端提供代码搜索与项目记忆相关工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
你的 Agent 每次开始会话时都一无所知——只能猜文件名、搜索关键字、把上下文浪费在无关文件上,还会忘记昨天讨论过的所有内容。
在一个真实项目中,一条典型提示词会消耗 380K 个 token,端到端约需 12 秒。
使用 mimirs 建立索引后:91K 个 token,约需 3 秒——在该代码库中减少了 76%。实际数据会因仓库大小、查询和模型而异。
无需 API 密钥。无需云服务。无需 Docker。
只需 bun 和 SQLite。
语义搜索 ·
自动生成的 Wiki
跨会话记忆 ·
依赖关系图 ·
注释
兼容:Claude Code · Cursor · Windsurf · JetBrains (Junie) · GitHub Copilot · 任意 MCP 客户端
快速开始
1. 前置条件
Bun(curl -fsSL https://bun.sh/install | bash),macOS 用户还需要安装较新版本的 SQLite——Apple 捆绑的版本不支持扩展:
brew install sqlite
Linux 和 Windows 已自带兼容的 SQLite。
2. 设置编辑器(自动)
bunx mimirs init --ide claude # or: cursor, windsurf, copilot, jetbrains, all
这会创建 MCP 服务配置、编辑器规则、.mimirs/config.json 和 .gitignore 条目。使用 --ide all 可一次性设置所有受支持的编辑器。
init 支持 Claude Code、Cursor、Windsurf、Copilot 和 JetBrains (Junie)。其他工具——Codex、Zed、自定义客户端——请复制下面的代码片段之一。
3. 设置编辑器(手动参考)
mimirs MCP 服务通过 stdio 运行。每个客户端都需要相同的三项配置:command(bunx)、args(["mimirs@^1", "serve"]),以及指向项目根目录的 RAG_PROJECT_DIR 环境变量。
为什么用
@^1而不是@latest? 这个版本范围会让你保持在 1.x,因此仍会自动获取错误修复和新功能,但不会在未经你允许的情况下升级到带有破坏性变更的未来 2.0 版本。要升级到下一个主版本,请编辑参数或重新运行bunx mimirs init。如果配置中已有mimirs@latest,重新运行bunx mimirs init会将其改写为mimirs@^1。
“command not found: bunx”/服务无法启动(但
bunx在终端中可以运行)? 从 Dock 或桌面启动器启动的编辑器不会加载 shell 配置文件,因此其 PATH 中没有~/.bun/bin。请在下方代码片段中将command设置为which bunx返回的绝对路径,而不是单独的bunx。bunx mimirs init会自动写入绝对路径(重新运行即可修复现有配置),bunx mimirs doctor会检测此问题。
Claude Code — 项目根目录中的 .mcp.json
{
"mcpServers": {
"mimirs": {
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/absolute/path/to/your/project"
}
}
}
}
Cursor — 项目根目录中的 .cursor/mcp.json
{
"mcpServers": {
"mimirs": {
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/absolute/path/to/your/project"
}
}
}
}
Windsurf — ~/.codeium/windsurf/mcp_config.json(全局)
Windsurf 从主目录而非项目目录读取 MCP 服务。JetBrains 插件版本使用 ~/.codeium/mcp_config.json。
{
"mcpServers": {
"mimirs": {
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/absolute/path/to/your/project"
}
}
}
}
JetBrains (Junie) — 项目根目录中的 .junie/mcp.json
{
"mcpServers": {
"mimirs": {
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/absolute/path/to/your/project"
}
}
}
}
GitHub Copilot — 项目根目录中的 .vscode/mcp.json
VS Code 的 Copilot 使用 servers 映射(而非 mcpServers)和 type 字段。
{
"servers": {
"mimirs": {
"type": "stdio",
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/absolute/path/to/your/project"
}
}
}
}
Codex — ~/.codex/config.toml(全局)
Codex 使用 TOML 而非 JSON,并从 ~/.codex/config.toml 读取配置。每个项目需要一个配置块——如果要配置多个仓库,请选择唯一的表名(mimirs-frontend、mimirs-api 等)。
[mcp_servers.mimirs]
command = "bunx"
args = ["mimirs@^1", "serve"]
env = { RAG_PROJECT_DIR = "/absolute/path/to/your/project" }
或者,也可以使用展开的 env 表:
[mcp_servers.mimirs]
command = "bunx"
args = ["mimirs@^1", "serve"]
[mcp_servers.mimirs.env]
RAG_PROJECT_DIR = "/absolute/path/to/your/project"
只读项目目录? 重定向索引
如果项目位于只读挂载中,请将 RAG_DB_DIR 设置为可写位置。索引会存放在那里,而不是 <project>/.mimirs/。
{
"mcpServers": {
"mimirs": {
"command": "bunx",
"args": ["mimirs@^1", "serve"],
"env": {
"RAG_PROJECT_DIR": "/read/only/project",
"RAG_DB_DIR": "/home/me/.cache/mimirs/myproject"
}
}
}
}
4. 首次索引
MCP 服务会在首次查询时延迟建立索引,因此配置完成后,只需向 Agent 提问即可。要预先强制建立完整索引(适用于大型仓库):
bunx mimirs index # current directory
bunx mimirs status # how many files, chunks, embeddings
5. 试用演示(可选)
bunx mimirs demo
手动工作流(不使用 init)
init 是一项便捷功能:它会配置你的编辑器(MCP 配置、Agent 规则、.gitignore、.mimirs/config.json)。它不会构建索引,下面的步骤也都不需要它——首次建立索引或查询时,索引和默认配置会自动创建。
1. 手动添加 MCP 服务。 从上面的手动参考中复制适用于你的客户端的代码片段:command: "bunx"、args: ["mimirs@^1", "serve"],以及指向项目根目录的 RAG_PROJECT_DIR。这就是全部 MCP 配置。
不使用
init就不会有 Agent 规则文件,因此你的助手不会知道这些工具的存在。你可以在提示词中提及 mimirs,也可以将 CLAUDE.md 中的工具列表复制到编辑器的规则中。
2. 构建索引。 MCP 服务会在首次调用工具时延迟建立索引,因此通过 Agent 使用时可以跳过此步骤。若要提前建立索引(大型代码库建议这样做;使用下面的 CLI search/read 前则必须这样做):
bunx mimirs index # current directory
bunx mimirs index /path/to/repo # a specific directory
bunx mimirs index --patterns "src/**/*.ts,*.md" # restrict to globs
bunx mimirs status # files, chunks, embeddings
无需 init,也无需配置文件——系统会应用默认设置,并将索引写入 <project>/.mimirs/。
3. 从 CLI 查询。 有两个读取命令,都会针对当前目录中的索引运行(使用 --dir 可指定其他目录):
# Where is it? — ranked file paths + snippet previews
bunx mimirs search "where is auth handled" --top 10
# What is it? — the actual matching code chunks (functions, classes, sections)
bunx mimirs read "jwt validation" --top 8 --threshold 0.3
可使用 --ext .ts,.tsx、--in src,packages/core 或 --exclude tests 限定范围。注意:CLI search/read 不会自动建立索引——请先运行 mimirs index(只有 MCP 服务会按需建立索引)。
Claude Code 插件
如需更深入的集成,mimirs 也可作为 Claude Code 插件使用。在 Claude Code 会话中:
/plugin marketplace add https://github.com/TheWinci/mimirs.git
/plugin install mimirs
该插件会配置 MCP 服务和三个钩子——SessionStart(上下文摘要)、PostToolUse(编辑后自动重新建立索引)、SessionEnd(自动创建检查点)——以及一组工作流技能,用于编排工具以完成常见任务:explore、plan、review、debug、research、recall、catch-up、handoff、doc-gaps、scout 和 wiki。
想要使用技能,但不安装插件? 这些技能是 skills/ 下的普通 SKILL.md 文件。将你喜欢的技能复制到项目的 .claude/skills/<name>/(与代码库共享)或 ~/.claude/skills/<name>/(适用于你的所有项目),Claude Code 就会在下次会话中加载它们。技能是 Claude Code 的功能,因此不适用于其他编辑器——但 MCP 工具本身可在任何地方使用。
搜索质量
Recall@10 为 89–97%,Recall@20 为 97–100%,MRR 为 0.69–0.77。在三种语言的四个真实代码库上进行基准测试,采用按难度分层混合的查询集(每组 72–120 个查询,约 ⅓ 为难题),并于 2026-06-04 在当前流水线上重新测量。完整方法见 BENCHMARKS.md。
| 代码库 | 语言 | 文件数 | 查询数 | Recall@10 | MRR | 零遗漏率 |
|---|---|---|---|---|---|---|
| mimirs | TypeScript | 244 | 74 | 95.3% | 0.759 | 4.1% |
| Excalidraw | TypeScript | 693 | 72 | 90.3% | 0.773 | 9.7% |
| Django | Python | 3,181 | 116 | 97.4% | 0.727 | 2.6% |
| Kubernetes | Go | 8,792 | 120 | 89.2% | 0.689 | 10.8% |
较大的代码库(Kubernetes、Excalidraw)规模足够大,因此一些相关文件的排名会刚好落在前 10 之外;前 20 的召回率可达 97–100%,因此在大型代码库中请设置 searchTopK: 15–20。
与编码 Agent 的对比(ContextBench)
我们还在 ContextBench(针对真实代码仓库进行金标准上下文检索)上测试了 mimirs。该基准中的其他项目都是完整的编码 Agent——多步骤探索者——而非单次调用的工具。对于一个聚焦查询(大模型阅读 issue 后发送的查询),一次 mimirs 检索调用与完整的 Agent 执行轨迹相比,排名如下:
| 指标 | mimirs | 排名 | 领域 |
|---|---|---|---|
| 文件覆盖率 | 0.799 | #1 | 高于 OpenHands、SWE-agent、Agentless…… |
| 行覆盖率 | 0.341 | #1 | 高于 Agentless、mini-SWE…… |
| 行精确率 | 0.316 | #2 | 仅次于 Agentless(0.376) |
| 文件精确率 | 0.192 | #6 | 按照设计较低——优先召回 |
mimirs 通过单次调用在两项覆盖率指标上均领先。文件精确率有意排在最后:漏掉一个金标准文件是致命的(大模型永远看不到要修复的代码),多找到一个文件则很容易过滤——因此 mimirs 尽可能提高召回率,再由模型完成精确筛选。而文件精确率偏低,主要是指标造成的假象:mimirs 返回的非金标准文件中,约 86% 是与修复相关联的上下文(调用方、类型、同级实现),而非噪声——以金标准衡量时精确率为 0.19,以相关性衡量时则为 0.87。
相同的召回率,成本仅为一小部分。 在与仅使用 grep 的 Agent 正面对比时(原始 issue、无索引、不查看修复内容),针对相同的 15 个 issue 进行定位:mimirs 通过一次约 15 ms 的调用且不消耗任何大模型 Token,就能提供相关文件簇;Agent 则平均每个 issue 需要 约 11.5 次工具调用(每次都是一个大模型步骤)才能收敛——而且最终只找到主要文件。对于多文件修复,Agent 找到了金标准文件的 22%,而 mimirs 通过一次调用就找到了 56%——依赖关系图揭示了 issue 从未提及的次要文件。
n=15 的样本,对比 Agent 的 500 个样本集——仅供参考;Agent 的工具调用次数由其自行报告且设有上限。完整排行榜、注意事项、相关性和成本表请见 BENCHMARKS.md。
对比情况
| mimirs | 无工具(grep + Read) | 塞入全部上下文 | 云端 RAG 服务 | |
|---|---|---|---|---|
| 设置 | 一条命令 | 无需设置 | 无需设置 | API 密钥、账号 |
| Token 成本 | 约 91K/提示词 | 约 380K/提示词 | 整个代码库 | 不等 |
| 搜索质量 | Recall@10 为 89–97% | 取决于关键词 | 不适用(已加载全部内容) | 不等 |
| 代码理解 | 感知 AST(24 种语言) | 行级 | 无 | 通常为行级 |
| 跨会话记忆 | 对话 + 检查点 | 无 | 无 | 部分支持 |
| 隐私 | 完全本地 | 本地 | 本地 | 数据会离开你的设备 |
| 价格 | 免费 | 免费 | 高额 Token 费用 | $10-50/月 + Token 费用 |
为什么不选用现有工具?
- Continue.dev 的
@codebase——功能最接近(本地 RAG、开源),但检索功能集成在编辑器扩展中。Mimirs 是独立的 MCP 服务,提供明确的工具(search、read_relevant、project_map、search_conversation、annotate),供 Agent 规划调用,并内置对话追踪和 Wiki 生成器。 - Aider 的 repo-map——使用 tree-sitter 生成代码仓库的静态摘要,不使用嵌入。它巧妙而轻量,但摘要并不等于检索——mimirs 会针对每个查询,使用向量 + BM25 为代码块排序,并根据图中心性提升排名。
- Sourcegraph Cody / OpenCtx——代码搜索能力出色,但索引依赖云基础设施和账号。只需运行一条
bunx命令即可使用 Mimirs,且数据不会离开你的设备。 - llama-index / LangChain / 自行搭建——这些都是库。Mimirs 开箱即用:已集成感知 AST 的分块、混合检索、文件监视器、对话追踪和注释功能。
工作原理
-
解析并分块 — 使用与类型匹配的策略拆分内容:代码按函数/类边界拆分(通过 tree-sitter 支持 24 种语言),Markdown 按标题拆分,YAML/JSON 按顶层键拆分。超过嵌入模型令牌限制的块会通过窗口切分后再合并。
-
生成嵌入 — 每个块都通过 all-MiniLM-L6-v2 转换为 384 维向量(在进程内通过 Transformers.js + ONNX 运行,无需 API 调用)。向量存储在 sqlite-vec 中。
-
构建依赖图 — 在 AST 分块时捕获导入说明符和导出符号,随后解析这些信息,构建文件级依赖图和符号级调用图。
impact会遍历函数的所有传递调用方(影响范围 + 要运行的测试);trace会查找一个符号如何到达另一个符号;mimirs affectedCLI 会将 git diff 转换为确切的待运行测试集合。 -
混合搜索 — 并行执行向量相似度搜索和 BM25 搜索,并通过倒数排名融合(加权,默认值为 0.5)合并结果,从而适应两种评分器差异很大的分数范围。标识符会按 camelCase/snake_case 拆分,因此搜索
depends也会匹配getDependsOn。随后根据依赖图中心性和路径启发式提升结果排名。read_relevant会返回单个块及其实体名称和精确行号范围(path:start-end)。 -
监视并重新索引 — 文件变更会通过 2 秒防抖检测。变更文件会重新索引;已删除文件会被清理。
-
对话与检查点 — 实时读取 Claude Code 的 JSONL 对话记录。Agent 可以在重要时刻创建检查点,供后续会话搜索。
-
注释 — 附加到文件或符号的备注会在
read_relevant结果中以[NOTE]块的形式显示。 -
分析 — 记录每次查询。分析结果会展示无结果查询、相关性较低的查询,以及不同时间段之间的趋势。
数据处理
mimirs 完全在你的机器上运行。它会索引仓库跟踪的文件,以及未跟踪但未被 gitignore 排除的文件(因此,忘记加入 gitignore 的 .env 可能会被读取——默认会排除 .env、*.pem、*.key 和 SSH 密钥等常见机密模式;你可以在 .mimirs/config.json 的 exclude 中添加自己的排除项)。文件内容和嵌入向量存储在 <project>/.mimirs/index.db 这个本地 SQLite 文件中。对话索引只会读取 ~/.claude/projects/<this-project>/ 下当前项目的对话记录。
唯一的网络调用是从 huggingface.co 一次性下载嵌入模型
(Xenova/all-MiniLM-L6-v2),并将其缓存到
~/.cache/mimirs/models。你的代码不会离开你的机器——不会发送到任何服务。
支持的语言
通过 bun-chunk 和 tree-sitter 语法进行 AST 感知分块:
TypeScript、JavaScript、Python、Go、Rust、Java、C、C++、C#、Ruby、PHP、Scala、Kotlin、Lua、Zig、Elixir、Haskell、OCaml、Dart、Bash/Zsh、TOML、YAML、HTML、CSS/SCSS/LESS
也支持索引:Markdown、JSON、XML、SQL、GraphQL、Protobuf、Terraform、Dockerfile、Makefile 等。扩展名不在已知列表中的文件会回退到按段落拆分。
文档
- 工具输出示例 — Agent 通过 MCP 实际收到的内容
- MCP 工具、CLI 与分析
- 配置与示例
- 基准测试
技术栈
| 层 | 选择 |
|---|---|
| 运行时 | Bun(内置 SQLite,TypeScript 运行速度快) |
| AST 分块 | bun-chunk — 支持 24 种语言的 tree-sitter 语法 |
| 嵌入 | Transformers.js + ONNX(在进程内运行,无需守护进程) |
| 嵌入模型 | all-MiniLM-L6-v2(约 23MB,384 维)— 可配置 |
| 向量存储 | sqlite-vec(单个 .db 文件) |
| MCP | @modelcontextprotocol/sdk(stdio 传输) |
| 插件 | Claude Code 插件,包含技能和钩子 |
所有数据都存储在项目内的 .mimirs/ 中——请将其加入 .gitignore。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。