关于 XERJ
XERJ 是一个本地优先的搜索引擎和 MCP 服务,用于索引代码、文档、日志及多种数据文件,并向 AI Agent 返回带文件行号引用的结果。它结合全文、向量和混合搜索,并通过 Elasticsearch 兼容 API 提供查询能力。
主要功能
- 01索引代码、文档、日志和多种文件
- 02全文、向量及混合搜索
- 03返回带文件与行号的引用
- 04通过 Elasticsearch 兼容 API 查询
- 05提供 Agent 长期记忆空间
适用场景
- 01检索相似开源项目以参考实现
- 02对代码库进行问答和 RAG
- 03跨文件类型查询安全审计线索
- 04分析日志并保存 Agent 项目记忆
MCP 相关
XERJ 作为 MCP 服务向 MCP 客户端提供搜索能力,包括批量搜索;README 还列出 `xerj_batch_search`。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
XERJ
XERJ:面向 AI Agent 的搜索引擎。 AI 搜索数据的新方式:一个本地 Rust 二进制文件,可为代码、文档、规范和日志建立索引,还能使用 Corpus Hub 数据包,并返回带引用的答案。
面向 AI Agent 的本地优先搜索引擎和 MCP 服务。 一个 Rust 二进制文件,可为代码、文档、 日志、JSONL/CSV 和 PDF 建立索引,支持 BM25 全文搜索、向量搜索、混合搜索、代码搜索和 Agent 记忆,并通过兼容 Elasticsearch 的 API 提供服务。可与 Claude Code、Cursor 和任何 MCP 客户端搭配使用。
English | 简体中文 | 日本語 | العربية | Español | 한국어
XERJ 是一款深受社区信赖的本地 AI 搜索工具,可自动为任意文件夹建立索引,让你的编码 Agent 不再逐个读取文件、白白消耗令牌,而是直接获取所需的准确代码。参考编码是它的主要用途,也是效果最显著的场景:让 Agent 针对一项任务工作,它就会下载与任务最相关的开源仓库,为其建立索引,并在编写自己的代码之前复用这些仓库已有的解决方案。在一项受控研究中,编码 Agent 的输出令牌减少了 2.7 倍,同时解题率保持在 16/16
(案例研究);日常工作中也有人报告约 5 倍的效果
(实测报告)。
这样一来,成本更低、规模更小的模型也能凭借参考代码胜过依赖记忆的高价模型,同时减少你在反复修复上花费的时间。现在就通过一条提示词安装试用:
Install XERJ (docs: https://xerj.org/llms.txt), index this project's sources, and set up
reference coding: clone and index the open-source repos closest to what we're building,
and search how they solved a problem before writing code.
或者自行运行:
curl -fsSL https://xerj.org/get | sh
xerj --insecure --data-dir ~/xerj-data &
xerj init # wire XERJ into Claude Code/Cursor (MCP + skill), one command
xerj autoindex ~/my-project
xerj search "how do we rotate the WAL segment" # ranked passages, file:line
xerj def "euler_to_rotationmatrix" # go-to-definition: file:line + signature
xerj gain # what it did for you — counted, not estimated
若要一次搜索多个 ID 或问题,请使用 xerj batch-search --input queries.json
或 MCP xerj_batch_search:有序结果、引用和逐项错误。
请将该数据目录放在任何要自动建立索引的文件夹之外。data/ 不在内置忽略列表中,因此,如果你在随后要建立索引的目录树中使用 --data-dir ./data,节点就会为自己的存储建立索引。
Windows 和经人工验证的安装方式请参阅手动安装。
--insecure 标志关乎信任边界,不是走个形式。它会关闭 TLS 和 API 密钥身份验证,因此,任何能访问该端口的调用方都是超级用户,可以读取和删除所有索引,包括每个 /_memory 命名空间。它是为开发机器上的单个用户设计的:全新节点只绑定到 127.0.0.1;如果以明文方式绑定到其他任何接口,除非你明确允许,否则节点会拒绝启动。完整说明请见
docs/SECURITY_MODEL.md。
加入社区
运行 XERJ 并提交一份简短的使用体验报告,即可加入 XERJ 社区:只需一个 commit 或 PR。这份报告就是成员凭证,也是项目对免费 Apache-2.0 二进制版本用户的唯一回馈要求。它能让引擎持续改进,惠及之后的每一位用户。
欢迎人类和 AI Agent 参与;本项目特意不只面向 Agent。无论你是在午休时为某个仓库建立了索引,还是 Agent 在他人的代码库中途安装了 XERJ,要求都一样:提交一份简短报告,说明你让它处理什么、用它做了什么,以及你的真实评价。负面评价也是一份好报告。如果出了问题,那就另外提交问题报告或修复。
实测报告类 PR 不受 CLA 限制,因此无需签署即可合并。适用于任何构建版本的做法是运行普通的 gh pr create,在
user-feedback/16-agent-field-reports/ 下添加且仅添加一个 Markdown 文件,差异中不包含其他内容。如果你的构建版本支持,xerj feedback 会起草报告并填入版本、操作系统和索引内容;xerj feedback --open-pr 则会替你创建 PR。运行 xerj --help 查看你的二进制文件是否包含此命令。
经过实测的理由:参考编码
使用 grep 的 Agent 会将整个文件加载到上下文中。在我们的测量中,单个语料库最多会占用 1.06M 个输入词元,而且 Agent 仍然得通读这些文件。查询 XERJ 的 Agent 则能直接获取相关段落。在模型此前未记住的代码上进行端到端实测
(案例研究:8 项任务、4 种语言、每组 16 次运行,采用真实的 claude -p 词元计数):
| 输出词元 | 成本 | 已解决 | |
|---|---|---|---|
| 仅凭记忆 | 260,916 | $11.18 | 11/16 |
| 由 grep 驱动的 Agent | 26,477 | $3.27 | 16/16 |
| XERJ | 9,982 | $1.58 | 16/16 |
在解决率相同的情况下,XERJ 的输出词元数比 grep 少 2.7 倍,比单靠记忆少 26 倍;在单个 Java 任务上最多可减少 278 倍。在实际开发中,用户报告端到端词元数大约减少 5 倍 (一线报告)。效果取决于模型是否已记住相关代码:对于私有、内部、冷门或训练截止日期之后的代码,XERJ 表现更好;对于模型已经熟悉的热门公共库,效果持平,甚至可能有害。详情与局限请参阅案例研究。
输入任意文件夹
参考编码只是同一基本功能的一种用途:xerj autoindex <folder> 让 Agent 了解整个语料,而不是用 grep 搜索。只需一条命令,即可将代码、文档、日志、PDF、SQLite 和难以处理的 CSV 编入类型化、可查询的索引,用于搜索、RAG、安全审计和 Agent 记忆,无需编写架构或配置流水线。
xerj --insecure --data-dir ~/xerj-data & # start it
xerj autoindex ~/my-project # point it at anything
--insecure 同样表示不使用 TLS,也不进行身份验证——每个调用者都是超级用户——因此这仍然是上文所述的单用户开发机器边界(安全模型)。
XERJ 会嗅探每个文件,判断文件类型,并为找到的每个数据集创建一个索引。代码通过 tree-sitter 连同符号和行号一起导入,而不是作为扁平文本:
phase A: 593 datasets inferred, 1955 junk/skipped files
phase B: indexing 25329 files with 8 workers
done in 158.1s, 593 datasets, 83103 records live, 790 junk records
使用场景
- 参考编码:索引与你的问题最接近的 OSS 项目,在编写代码前检索它们的解决方案(即上文经过实测的用例)。
- 代码库问答和 RAG:为代码库创建索引,询问实现机制,即可获取带有
file:line的相关段落,而不是目录列表。 - 安全审计:为目标目录树创建索引,一次查询即可跨所有文件类型查找危险调用、密钥和危险调用模式。
- 日志与事件分析:混合格式会转换为类型化索引,并支持你期望从 Elasticsearch 获得的聚合功能。
- Agent 长期记忆:
/_memory/{namespace}会存储 Agent 学到的内容,并在下次会话中按含义检索。
提示词的工作原理
llms.txt 为你的 Agent 提供按顺序执行的步骤:安装、启动服务、运行 xerj autoindex .、使用任意 Elasticsearch 客户端进行查询,以及参考代码循环(克隆相似的 OSS 项目,将其编入索引,在编写代码前检索相关机制,引用所用内容,并遵守许可证)。
它之所以有帮助,是因为依赖记忆工作的 Agent 遇到任何未记住的 API 都会反复尝试,而 grep 只会告诉它去哪里查找;要解决问题,仍然需要将源码读入上下文。根据我们的测量,仅一个语料库就可能需要多达 1.06M 个输入令牌。使用 XERJ 查询的 Agent 则能直接读取准确的段落。相同的 16/16 解题率下,与 grep 相比,输出令牌少 2.7 倍(与仅依赖记忆相比少 26 倍,成本低 2.1 倍)。详情见上文实测原因。另一次配套测试中,模型从未接触过某个 Rust 库,但使用检索得分为 9/9,而仅依赖记忆得分为 0/9。
全新安装后可用的更多提示词:
- “阅读 https://xerj.org/llms.txt,将 XERJ 设置为搜索后端,为
./docs编制索引,并针对它创建的每个索引展示一个查询示例。” - “运行
xerj autoindex map,告诉我这些数据包含什么(类型、数量以及记录的注意事项),然后用搜索回答我的问题,而不是读取文件。” - “将 XERJ 的
/_memory/notesAPI 用作此项目的长期记忆:工作时存储学到的内容,并在下次会话中按含义回忆。”
每项功能都有经过验证的可运行示例:xerj.org/docs/recipes。
启动、批量导入、搜索、向量 kNN、实时仪表板,全程无剪辑。 在 xerj.org 上观看,或 试用在线 Playground。
手动安装
curl -fsSL https://xerj.org/get | sh
Windows PowerShell:
irm https://xerj.org/get.ps1 | iex
单个静态二进制文件,无 JVM、无依赖项。为 Linux、macOS 和 Windows 的 x86-64 与 arm64 架构提供预构建版本。x86-64 版本以 x86-64-v2 为目标平台(SSE4.2:Intel Nehalem 2008 及后续版本、AMD Bulldozer 及后续版本),并会在运行时根据 CPU 支持情况使用 AVX2 和 FMA,因此 Haswell 之前的机器也能运行同一个二进制文件。它支持 Elasticsearch API,因此现有客户端、仪表板和工具无需修改即可使用。
安装后的首批命令(安装程序会显示 xerj 的安装位置;如有需要,请将其添加到 PATH):运行 xerj --insecure --data-dir ~/xerj-data &,等待 http://localhost:9200 响应,然后运行 xerj autoindex ~/my-project。参见为文件夹编制索引。
对于无法访问运行时互联网的主机,请按照隔离网络部署指南操作。默认的词法嵌入器可离线运行;神经模式则需要在首次语义操作前,将三个模型文件放在本地。
索引文件夹
启动服务,然后将 autoindex 指向任意内容:
xerj --insecure --data-dir ~/xerj-data & # local dev: no TLS, no auth
xerj autoindex ~/my-project
这就是本 README 开头所说的开发机器信任边界——没有 TLS、没有身份验证,每个调用方都是超级用户。在笔记本电脑上这样做没问题,因为新节点会绑定到 127.0.0.1,不会绑定其他地址;共享主机则应使用下面的启用身份验证的启动方式。
如果你的服务已启用身份验证(不带 --insecure 的任何启动方式,包括从配置文件启动,默认都会启用身份验证),请向 autoindex 提供相同的密钥。它不会从 xerj.toml 中读取密钥;请传入 --api-key 或设置 XERJ_API_KEY,否则每个请求都会返回
401 Unauthorized:
xerj --data-dir ~/xerj-data & # auth on: key minted on first boot
export XERJ_API_KEY="$(cat ~/xerj-data/admin.key)" # <data_dir>/admin.key
xerj autoindex ~/my-project
这就是全部配置。无需编写架构,也无需配置流水线。XERJ 会检测每个文件,判断其类型,并为找到的每个数据集创建一个索引:
phase A: 593 datasets inferred, 1955 junk/skipped files
phase B: indexing 25329 files with 8 workers
done in 158.1s, 593 datasets, 83103 records live, 790 junk records
源文件会经过 tree-sitter 处理,因此代码会保留符号和行号,而不是变成扁平文本。系统支持 CSV、JSON、JSONL、XML、YAML、SQLite、PDF、DOCX、PowerPoint(.pptx,每张幻灯片一条记录)、Excel(.xlsx,每个工作表一个数据集)、EPUB 书籍(每章一条记录)、Jupyter 笔记本(每个标题章节一条记录,支持任意内核)、man 手册页(roff,每个章节一条记录)、HTML、邮件(.eml 和 mbox 邮箱,包括 Google Takeout 导出文件)以及常见日志格式。Unity 项目也受到一流支持:文本序列化的场景、预制件和资源会按每个 GameObject/Component 生成一条记录;.meta 文件会转换为 GUID 到路径的映射表;MonoBehaviour 记录会包含 script_class/script_path,因此“哪些场景使用了这个脚本?”只需一次查询即可回答(要读取二进制序列化的资源,需启用 Force Text;Library/ 等生成目录会自动跳过并记录)。
搜索
这是 Elasticsearch API,因此你已经熟悉这一部分:
# what did it find?
curl localhost:9200/_cat/indices
# full-text
curl "localhost:9200/ax-*/_search?q=checkout+error"
# structured
curl localhost:9200/ax-orders/_search -H 'content-type: application/json' -d '{
"query": { "range": { "total": { "gte": 100 } } },
"aggs": { "by_status": { "terms": { "field": "status" } } }
}'
向量搜索和混合搜索使用的 knn 和 semantic 语法,与发送给 Elasticsearch 的语法相同。任何 Elasticsearch 客户端库都可以使用,只需将其指向 localhost:9200。
使用 Jev 为结果评分
搜索分数能告诉你哪些结果排名靠前,但无法说明结果是否真的回答了你的问题。Jev 是 TypeSafe AI 提供的一项服务:给它一个问题和一份文档,它会返回一个 0 到 1 之间的数字,表示文档回答问题的效果。XERJ 支持两种使用方式。
1. 使用 Jev 重新排序结果(可选)。 在 _search 中添加 "rerank": {},XERJ 就会将排名靠前的结果发送给 Jev,然后按返回的分数重新排序。在公开的 FiQA 测试中,结果质量从 0.24 提升到 0.36(nDCG@10),648 次搜索的总费用约为 $0.64。请将这些分数视为排序依据,而非精确百分比:它们的校准效果并不好。这会将这些结果的文本发送到 TypeSafe 的服务器。 只有设置密钥后才会启用此功能,而 [rerank] enabled = false 会彻底禁止此功能。启用前请阅读
docs/RERANK.md。
2. 在本地获取同类答案。 POST /v1/systemone 和 POST /_decide 接受格式相同的问题,但由 XERJ 自行回答,方法是查找与你的问题最相似、且你已标注过的文档(例如已标记为垃圾邮件或非垃圾邮件的消息)。数据不会离开你的计算机,也不需要密钥。此功能仅在你有已标注的示例时有效;在 AG News(12 万条已标注示例)上,它有 92% 的概率选对标签。官方 jev-reranker Python 客户端无需修改即可连接 XERJ 节点
(测试)。XERJ 使用自己的名称 xerj-history-vote-1 返回答案;它不是 Jev。
测量结果及复现方法:
benchmarks/beir-hybrid 和
benchmarks/decisions-as-retrieval。
通过 MCP 连接 Agent
并非所有 Agent 都能运行 shell 命令。桌面助手和函数调用宿主通过模型上下文协议访问 工具,而你刚刚安装的二进制文件就是 MCP 服务。无需再下载任何内容,也无需编译:
xerj --insecure --data-dir ~/xerj-data & # 1. the node the tools query
xerj mcp # 2. MCP stdio server (your client runs this)
xerj mcp 通过 stdio 使用 MCP,并代理到 XERJ_URL 指定的节点(默认为
http://localhost:9200)。它不会启动节点;步骤 1 是前置条件。MCP
服务本身不会增添任何信任——它是同一个二进制文件,通过 stdio 与客户端通信,并通过
普通 HTTP 与节点通信,因此以节点的边界为准;上面的步骤 1 启动的也是同一个
--insecure 开发节点。将以下内容添加到 MCP 客户端的配置中:
{
"mcpServers": {
"xerj": {
"command": "/home/you/.local/bin/xerj",
"args": ["mcp"],
"env": { "XERJ_URL": "http://localhost:9200" }
}
}
}
请使用绝对路径。sh 安装程序(适用于 Linux、macOS 和 Windows Git Bash、MSYS 及 Cygwin)会将
xerj 放入 ~/.local/bin(Windows 上为 xerj.exe;可通过 command -v xerj 确认),且不会修改 PATH。PowerShell 安装程序(get.ps1)会将 xerj.exe 放入 %LOCALAPPDATA%\Programs\xerj,并将该目录添加到用户 PATH(可通过 (Get-Command xerj).Source 确认;设置 XERJ_NO_PATH=1 可跳过此操作)。从桌面图标启动的 MCP 宿主不会继承 shell 的
PATH。如果节点启用了身份验证(即未使用 --insecure),请在 XERJ_URL 旁添加
"XERJ_AUTH": "ApiKey <key>";密钥位于 <data-dir>/admin.key。
支持的 Agent
二十六个客户端可以将 xerj mcp 注册为本地 stdio 服务。配置项始终由相同的两个字段组成——二进制文件的绝对路径,以及作为唯一参数的 mcp——但配置项所在位置和外层包装键因客户端而异。tested 表示已在该客户端中注册服务,且 xerj_search 出现在其工具列表中;untested 表示配置的路径和格式摘自客户端自身的文档,尚未有人实际运行。已有两行经过实际运行验证。在 Windows 上使用 OpenCode v2.1.2 搭配 xerj v1.0.0-rc.97,返回了完整工具列表以响应 initialize 和
tools/list。在 Linux 上使用 Cline CLI 3.0.73 搭配 xerj v1.0.0-rc.98,成功加载了本节的
mcpServers 配置块,配置文件位于 ~/.cline/data/settings/cline_mcp_settings.json。xerj_search
出现在 Cline 提供给模型的工具列表中(名称为 xerj__xerj_search),属于该二进制文件的
20 个工具之一;Cline 还执行了一次 xerj_search 调用。由于没有可用的服务提供商密钥,模型轮次使用了本地 OpenAI 兼容的存根;MCP 服务则是实际运行的 xerj mcp 进程。本次运行未使用 IDE 的 MCP Servers > Configure 按钮。欢迎提交第一个 PR,修正任何 untested 行。
| 客户端 | 配置文件 | 键 | 备注 | 测试状态 |
|---|---|---|---|---|
| OpenCode | 项目中的 opencode.json,或 ~/.config/opencode/opencode.json | mcp.servers | 一个命令数组,使用 environment 而非 env,需要项目根目录 | 已测试 |
| Claude Code | .mcp.json(项目)或 ~/.claude.json(用户);claude mcp add 会写入其中一个文件 | mcpServers | 命令前必须加 -- | 未测试 |
| Cursor | 项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json | mcpServers | stdio 不需要 type | 未测试 |
| Codex | ~/.codex/config.toml,或受信任项目中的 .codex/config.toml | [mcp_servers.xerj] | 使用 TOML,而非 JSON | 未测试 |
| Gemini CLI | .gemini/settings.json 或 ~/.gemini/settings.json | mcpServers | 对文件夹运行 gemini trust,否则 stdio 会显示 Disconnected | 未测试 |
| VS Code 中的 GitHub Copilot | .vscode/mcp.json | servers | 需要 "type": "stdio";通用的 .mcp.json 使用 mcpServers | 未测试 |
| Windsurf | %APPDATA%\devin\mcp_config.json、~/.config/devin/mcp_config.json | mcpServers | 现在使用的是 Devin 的路径,而非 ~/.codeium/windsurf | 未测试 |
| Claude Desktop | %APPDATA%\Claude\claude_desktop_config.json、~/Library/Application Support/Claude/claude_desktop_config.json、~/.config/Claude/claude_desktop_config.json | mcpServers | 请完全退出应用,而不只是关闭窗口 | 未测试 |
| Cline | ~/.cline/data/settings/cline_mcp_settings.json(CLI);IDE 可从 MCP Servers > Configure 打开该文件 | mcpServers | disabled 和 autoApprove 是 Cline 专用设置;CLI 运行时不需要它们 | 已测试 |
| Roo Code | 项目中的 .roo/mcp.json,或 <VS Code User>/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json | mcpServers | 名称冲突时,项目条目优先 | 未测试 |
| Kilo Code | 项目中的 kilo.jsonc 或 .kilo/kilo.jsonc,全局配置为 ~/.config/kilo/kilo.jsonc | mcp | 一个命令数组,与 OpenCode 类似 | 未测试 |
| Continue | ~/.continue/config.yaml,或 .continue/mcpServers/ 中的任意文件 | mcpServers | 使用 YAML 列表,而非映射;仅限 Agent 模式 | 未测试 |
| Zed | ~/.config/zed/settings.json(Windows 上运行 zed: open settings file) | context_servers | 此处使用的键不是 mcpServers | 未测试 |
| JetBrains AI Assistant | 仅限设置界面:Settings > Tools > AI Assistant > Model Context Protocol | mcpServers | 与 Junie 使用独立存储 | 未测试 |
| Junie | 项目中的 .junie/mcp/mcp.json,用户配置为 ~/.junie/mcp/mcp.json | mcpServers | 较早的帖子省略了 mcp/ 文件夹 | 未测试 |
| Amp | ~/.config/amp/settings.json、工作区中的 .amp/settings.json,或运行 amp mcp add | amp.mcpServers | 键保留 amp. 前缀 | 未测试 |
| Goose | ~/.config/goose/config.yaml、%APPDATA%\Block\goose\config\config.yaml | extensions | 使用 cmd 而非 command,且格式为 YAML | 未测试 |
| Kiro | 工作区中的 .kiro/settings/mcp.json,用户配置为 ~/.kiro/settings/mcp.json | mcpServers | 展开 ${VAR} 需要批准 | 未测试 |
| Antigravity | ~/.gemini/config/mcp_config.json,或工作区中的 .agents/mcp_config.json | mcpServers | 远程服务使用 serverUrl | 未测试 |
| OpenClaw | ~/.openclaw/openclaw.json(JSON5) | mcp.servers | transport: "stdio" | 未测试 |
| DeepSeek Harness (dsh) | $DSH_HOME/cordis.patch.yml,或配置文件补丁 | - insert:,搭配 @deepseek-ai/dsh-mcp-client | 每个服务使用一个插件实例 | 未测试 |
| Warp | Settings > Agents > MCP servers,或 ~/.warp/.mcp.json 和项目中的 .warp/.mcp.json | mcpServers | 使用 working_directory,而非 cwd | 未测试 |
| Augment Code | Auggie CLI 使用 ~/.augment/settings.json;IDE 使用自己的面板 | mcpServers | 该文件不会影响 IDE | 未测试 |
| Qwen Code | ~/.qwen/settings.json,或项目中的 .qwen/settings.json | mcpServers | mcp.allowed 可能会在不提示的情况下隐藏它 | 未测试 |
| Kimi CLI | ~/.kimi-code/mcp.json,或项目中的 .kimi-code/mcp.json | mcpServers | 当前的 Kimi Code CLI,而非已归档的 ~/.kimi/mcp.json | 未测试 |
| Grok CLI | ~/.grok/config.toml,或项目中的 .grok/config.toml | [mcp_servers.xerj] | Grok Bot 不支持本地 stdio 注册 | 未测试 |
| Codex 和 Grok CLI 使用 TOML,因此条目是一个表: |
[mcp_servers.xerj]
command = "/abs/path/to/xerj"
args = ["mcp"]
OpenCode 和 Kilo Code 使用一个 command 数组,Kilo 使用相同的结构,但少嵌套一层:
{"mcp": {"servers": {"xerj": {"type": "local", "command": ["/abs/path/to/xerj", "mcp"], "environment": {"XERJ_URL": "http://localhost:9200"}}}}
{"mcp": {"xerj": {"type": "local", "command": ["/abs/path/to/xerj", "mcp"]}}}
Continue 和 Goose 使用 YAML:
# ~/.continue/config.yaml
mcpServers:
- name: xerj
command: /abs/path/to/xerj
args:
- mcp
# ~/.config/goose/config.yaml
extensions:
xerj:
type: stdio
cmd: /abs/path/to/xerj
args:
- mcp
enabled: true
Amp 会将键保留在命名空间中,VS Code 和 Copilot 需要 servers 和一种传输方式,Zed 称其为上下文服务,而 OpenClaw 会将它们嵌套在 mcp 下:
{"amp.mcpServers": {"xerj": {"command": "/abs/path/to/xerj", "args": ["mcp"]}}}
{"servers": {"xerj": {"type": "stdio", "command": "/abs/path/to/xerj", "args": ["mcp"]}}}
{"context_servers": {"xerj": {"command": "/abs/path/to/xerj", "args": ["mcp"], "env": {}}}}
{mcp: {servers: {xerj: {command: "/abs/path/to/xerj", args: ["mcp"], transport: "stdio"}}}}
DeepSeek Harness 会将一个 MCP 服务作为一个插件加载到 $DSH_HOME/cordis.patch.yml 中,或加载到配置文件补丁 $DSH_HOME/profiles/<profile>/cordis.patch.yml 中。同一代码块也是 dsh/ 中的配置文件包,其中的 command 是 PATH 上的 xerj。如果该文件只有 [],请将数组替换为下面的代码块;在 [] 下追加内容不是有效的 YAML。env 和 cwd 是可选的 stdio 字段(args 默认为 [],env 默认为 {},cwd 默认为 "")。如果节点没有使用 --insecure 运行,请在 env 下添加 XERJ_AUTH: "ApiKey <key>":
# $DSH_HOME/cordis.patch.yml
- insert:
- id: mcp-xerj
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: xerj
transport: stdio
command: xerj
args:
- mcp
env:
XERJ_URL: "http://localhost:9200"
cwd: ""
原始列表中的三个候选项特意未列出。Aider 完全不支持 MCP 客户端(Aider-AI/aider#3314 仍处于开放状态)。T3 Code 则是另一种情况:它托管一个供其他 Agent 连接的 MCP 端点,其会话会从底层的 Harness 继承服务。Grok Bot 没有文档说明如何注册本地 stdio;Grok CLI 支持,这就是上面 grok 行所指的工具。
共提供 21 个工具。其中 11 个是对 XERJ 已提供端点的轻量代理:
| 工具 | 功能 |
|---|---|
xerj_search | 对索引执行 ES 查询 DSL 搜索 |
xerj_semantic_search | 在 semantic_text 字段上按含义检索;查询在服务端嵌入(默认嵌入器使用词法特征哈希,而非神经网络,除非节点以 --embed-mode neural 运行) |
xerj_vector_search | 对 dense_vector 字段执行 kNN 搜索 |
xerj_hybrid_search | 对子查询执行 RRF 或线性融合 |
xerj_memory_store / xerj_memory_recall | 在命名空间中存储持久化 Agent 记忆,并按文本、含义或向量进行回忆 |
xerj_brain_overview / xerj_brain_ego / xerj_brain_link / xerj_brain_unlink | 第二大脑链接索引:确定方向、扩展一个节点中有证据支持的邻域、断言和撤销链接 |
xerj_plan | 输入普通文字过滤条件,输出经过验证的查询 DSL(POST /_ask;确定性且基于规则,不是大模型) |
对于 xerj_search,传入 {"prefix":"project","query":"retry policy"} 可搜索
project-*,效果与 xerj search --prefix project 相同。prefix 的解析方式与 CLI 使用的函数相同:它是 xerj autoindex --prefix 所存储的前缀,因此
My_Proj 会搜索 my-proj-*。如需指定明确的索引名称或模式,请使用
index;非空的 index 和 prefix 不能同时使用。空前缀、不含任何
[a-z0-9] 字符的前缀,或无法用作索引名称的前缀都会报错。如果两个参数都未提供,该工具会搜索 ax-*。
xerj_def 使用与 xerj def --json 相同的查询、排序和位置去重方式查找本地定义。
例如,{"symbol":"Cache","prefix":"project","kind":"struct","lang":"rust","k":5}
会搜索 project-*;index 可以替代 prefix,作用范围规则与 xerj_search 相同。
symbol 也接受能力描述短语。k 必须为 1–50(默认值为 5);可选的 max_tokens
可限制响应大小。结果为 ES JSON:声明位于 hits.hits[]._source.code,
位置位于 ax_path/path 和 line/start_line;较旧的文件命中项可能使用 fields._passage。
hits.total 统计去重前的引擎匹配数。没有匹配项时会返回空的命中列表。
与 CLI 一样,如果没有目标索引映射该字段,或任一目标索引将其映射为数值类型,则会忽略 kind/语言过滤条件。排序方式为词法排序。此工具查询已配置的节点;
xerj_hub_def 则会在指定的 Hub 包中查找定义。
另外两个工具并非普通代理:xerj_map 返回自动索引目录中按索引划分的字段映射(截断到字节上限,否则逐字返回),而 xerj_code_search 运行参考编码流程 xerj code(tools/xerj-code/),并返回渲染后的文本。
xerj_index_budget 统计文件夹,并在节点的磁盘预算范围内估算其索引大小,之后 xerj autoindex 才会对内容进行哈希(不会建立索引)。xerj_autoindex_remove 会在列出一个已自动索引的文件夹后将其移除,且只有在 confirm 为 true 时才会删除内容。
xerj_corpus_feedback 为中心语料评分。
xerj_field_report 提交现场报告,而 xerj_hub_find、xerj_hub_def 和 xerj_hub_ask 则基于机器上已有的 Corpus Hub 包回答问题(即 xerj ask 流程)。
xerj mcp --help 会输出相同的配置块和完整选项列表。机器可读的工具架构发布于
xerj.org/docs/agents/schemas/mcp-tools.json,
由实时的 tools/list 生成,而非手工编写,并通过 CI(scripts/mcp-schema-check.sh)和单元测试进行检查,因此已发布的列表不会与实际提供的列表产生偏差。
存在的意义
Agent 会耗费上下文窗口来读取文件。WordPress 核心中的 PHP 代码约有 520 万个 token,相当于 26 个完整的上下文窗口,因此 Agent 无法直接读取全部内容。Grep 也解决不了这个问题,因为 grep 命中的是一行代码,而要判断这一行的含义,就得打开整个文件。
查询索引时,每个问题只需耗费几 KB。在 WordPress 核心 AI 安全审计中, 一个 Agent 检查了 1,492 个 PHP 文件,耗费约 26,000 个 token,相当于加载整个代码树的约 0.5%。
使用场景
- 参考编码:编码 Agent 可以检索同类项目已有的解决方案,而不必重新推导。测量结果显示,相比由 grep 驱动的编码,输出 token 减少了 2.7 倍(与仅依靠记忆相比则为 26 倍);用户反馈,实际开发中约可减少 5 倍。
- 代码搜索与安全审计: 支持 AST 的索引,让 Agent 找到函数,而不只是某一行。
- AI 搜索与 RAG:通过一次查询实现全文、向量和混合检索,无需单独的向量数据库。
- Agent 记忆:利用个人文档构建知识图谱,实现持久记忆。
- 日志分析与可观测性: 在同一引擎中处理日志、指标和链路追踪。
- Elasticsearch 替代方案: 使用相同的线协议,只需一个二进制文件。
可运行示例见 recipes/ 和 docs/examples/。
Elasticsearch 兼容性
XERJ 实现了 Elasticsearch REST API:索引、文档、批量操作、搜索、聚合、映射、kNN、scroll、reindex 和 _cat 端点。Kibana 和官方客户端库都可以直接连接。将导出工具指向 XERJ 之前,有一点值得了解:scroll 会预先创建一个有界快照,而不是逐段遍历的游标,因此,如果查询的精确总数超出快照窗口,系统会返回 400,而不会静默截断。任何大小的结果集都应使用 search_after
(上限)。
一致性测试套件会在每次提交时运行,目前 1454 个用例中通过了 1444 个(0 个失败,10 个跳过)。测试套件位于
engine/tests/es-compat-yaml,剩余差距也列在其中,而非隐瞒。XERJ 兼容该 API,但并未重新实现 Elasticsearch 的内部机制,也不是其分支。
基准测试
XERJ 与 Elasticsearch 8.13.4 在数据写入、全文搜索、聚合、向量搜索,以及并发大量写入期间发起的读取方面进行了正面对比。最新一次闭环测试取得 55 胜、26 平、4 负,其中写入吞吐量为 1.72 倍,磁盘占用空间小 1.61 倍。
4 项失利都是同一个差距:高速写入器运行时的读取 p99 延迟。我们没有将其隐去,而是完整记录了这一发现。结果、方法和测试工具集可在 xerj.org/benchmarks 及 demo/playbooks 中查看,你可以自行重跑。对于任何无法复现的数据,都应持怀疑态度,包括我们的数据。
代码索引
源文件使用 tree-sitter 解析,并以 AST 感知方式建立索引,包含符号和全文,因此 Agent 检索到的是一个函数,而不是一行代码。在 Apache Lucene 检出版本(6,113 个源文件,51 MB)上,单线程进程内提取速度约为 1,500 个文件/秒(13 MB/秒);tree-sitter 解析占其中约 72%,是每个文件的耗时下限。可通过以下方式复现:
XERJ_EXTRACT_BENCH=/path/to/repo cargo test -p xerj-autoindex --release \
extract_bench -- --nocapture --ignored
重新索引是增量式的:如果某个文件的内容与上次索引的版本逐字节相同,就会完全跳过解析,并沿用其已提交的结果。因此,修改少量文件后重新运行,所需工作量与变更内容成正比,而不是与整个仓库成正比——这正是常见的编辑后重新运行/CI 场景,通常超过 95% 的内容不会变。仍会计算完整内容哈希以检测变更,因此重新索引的总耗时下限由哈希计算决定,而不是解析。
从源代码构建
你需要使用稳定版 Rust 工具链。
git clone https://github.com/xerj-org/xerj
cd xerj/engine
cargo build --release -p xerj-server
./target/release/xerj --insecure --data-dir ~/xerj-data
x86-64 发布构建以 x86-64-v2 为目标(SSE4.2;在 engine/.cargo/config.toml 中按目标设置)。HNSW 点积内核也会编译 AVX2+FMA 变体,并在运行时检测到 CPU 同时支持这两项功能时选择该变体。RUSTFLAGS 会覆盖该文件,因此本地构建可以启用主机 CPU 支持的功能:
RUSTFLAGS="-C target-cpu=native" cargo build --release -p xerj-server
若要对运行中的服务执行一致性测试套件:
cargo run --release -p es-yaml-runner -- --dir tests/es-compat-yaml/yaml
文档
各子系统的参考页面基于源代码编写,并说明每个子系统无法解除的限制:
- 第二大脑:介绍索引文档之上的关系层,包括
/_graph路由、链接上的证据、八种检测器以及两跳上限。 - 控制台阅读器:介绍控制台的语料库主页、任意记录的阅读器(例如带附件的电子邮件、PDF 页面)以及只读访客模式,还说明了如何渲染才能让恶意文档保持惰性,以及哪些内容不会被渲染。
- 脚本:介绍 Painless 子集、脚本的运行位置以及限制脚本的资源上限。
- 快照与恢复:介绍快照 API 支持的子集,以及恢复操作会替换哪些内容。
- 共享:介绍
xerj share,即通过链接和密码只读访客访问一个已索引文件夹的功能、访客可以和不可以访问的内容,以及威胁模型。 - 安全模型:介绍身份验证、保留的
.xerj-memory-*命名空间、API 密钥以及未强制执行的事项。 - 重排:介绍可选的
rerank搜索阶段:外部评估器根据校准后的概率对排名靠前的搜索结果重新排序。这是唯一一个在搜索时会将文档文本发送到节点外的功能(代理嵌入和 WAL 监听器也会在运营者配置后发送文本;该页面列出了节点可能建立的所有出站连接)。此功能需要运营者配置提供方密钥,并且尚未验证真实模型的排序质量。 - XERJ 与 Lucene 10.3.1:从六个维度对比两者的存储和搜索设计,并固定到特定源代码版本。
参与贡献
欢迎人类和 AI Agent 提交拉取请求;请参阅上文的加入社区。最基础的贡献是一份简短的实地报告:使用普通的 gh pr create,在 user-feedback/16-agent-field-reports/ 下添加一个 Markdown 文件。仅包含实地报告的拉取请求无需签署 CLA,因此可以免签合并。
对于代码变更,请参阅 CONTRIBUTING.md 了解工作流,并参阅 CLA.md 了解贡献者许可协议;每位贡献者只需签署一次,而不是每个拉取请求都签署一次。Agent 提交拉取请求时,应说明该请求由 Agent 编写,并遵循 AGENTS.md / .github/AI_CONTRIBUTIONS.md。
请通过 GitHub issues 提交错误报告和功能请求。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。