mcpField
X
XERJ

XERJ

本地服务
xerj.org搜索与检索17.3k今天更新

关于 XERJ

XERJ 是一个本地优先的搜索引擎和 MCP 服务,用于索引代码、文档、日志及多种数据文件,并向 AI Agent 返回带文件行号引用的结果。它结合全文、向量和混合搜索,并通过 Elasticsearch 兼容 API 提供查询能力。

主要功能

  1. 01索引代码、文档、日志和多种文件
  2. 02全文、向量及混合搜索
  3. 03返回带文件与行号的引用
  4. 04通过 Elasticsearch 兼容 API 查询
  5. 05提供 Agent 长期记忆空间

适用场景

  1. 01检索相似开源项目以参考实现
  2. 02对代码库进行问答和 RAG
  3. 03跨文件类型查询安全审计线索
  4. 04分析日志并保存 Agent 项目记忆

MCP 相关

XERJ 作为 MCP 服务向 MCP 客户端提供搜索能力,包括批量搜索;README 还列出 `xerj_batch_search`。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbxerj-mcp-1.0.0-rc.99.mcpb1.0.0-rc.99

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

XERJ

XERJ:面向 AI Agent 的搜索引擎。 AI 搜索数据的新方式:一个本地 Rust 二进制文件,可为代码、文档、规范和日志建立索引,还能使用 Corpus Hub 数据包,并返回带引用的答案。

面向 AI Agent 的本地优先搜索引擎和 MCP 服务。 一个 Rust 二进制文件,可为代码、文档、 日志、JSONL/CSV 和 PDF 建立索引,支持 BM25 全文搜索、向量搜索、混合搜索、代码搜索和 Agent 记忆,并通过兼容 Elasticsearch 的 API 提供服务。可与 Claude Code、Cursor 和任何 MCP 客户端搭配使用。

xerj-org%2Fxerj | Trendshift

English | 简体中文 | 日本語 | العربية | Español | 한국어

CI Release License Stars Rust Discussions Discord X

Reference coding Autoindex Search Agent memory MCP llms.txt ES-YAML conformance Single static binary Default embedder Neural 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.1811/16
由 grep 驱动的 Agent26,477$3.2716/16
XERJ9,982$1.5816/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/notes API 用作此项目的长期记忆:工作时存储学到的内容,并在下次会话中按含义回忆。”

每项功能都有经过验证的可运行示例:xerj.org/docs/recipes。

观看 XERJ 演示:启动、导入、搜索、向量、仪表板

启动、批量导入、搜索、向量 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.jsonmcp.servers一个命令数组,使用 environment 而非 env,需要项目根目录已测试
Claude Code.mcp.json(项目)或 ~/.claude.json(用户);claude mcp add 会写入其中一个文件mcpServers命令前必须加 --未测试
Cursor项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.jsonmcpServersstdio 不需要 type未测试
Codex~/.codex/config.toml,或受信任项目中的 .codex/config.toml[mcp_servers.xerj]使用 TOML,而非 JSON未测试
Gemini CLI.gemini/settings.json 或 ~/.gemini/settings.jsonmcpServers对文件夹运行 gemini trust,否则 stdio 会显示 Disconnected未测试
VS Code 中的 GitHub Copilot.vscode/mcp.jsonservers需要 "type": "stdio";通用的 .mcp.json 使用 mcpServers未测试
Windsurf%APPDATA%\devin\mcp_config.json、~/.config/devin/mcp_config.jsonmcpServers现在使用的是 Devin 的路径,而非 ~/.codeium/windsurf未测试
Claude Desktop%APPDATA%\Claude\claude_desktop_config.json、~/Library/Application Support/Claude/claude_desktop_config.json、~/.config/Claude/claude_desktop_config.jsonmcpServers请完全退出应用,而不只是关闭窗口未测试
Cline~/.cline/data/settings/cline_mcp_settings.json(CLI);IDE 可从 MCP Servers > Configure 打开该文件mcpServersdisabled 和 autoApprove 是 Cline 专用设置;CLI 运行时不需要它们已测试
Roo Code项目中的 .roo/mcp.json,或 <VS Code User>/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.jsonmcpServers名称冲突时,项目条目优先未测试
Kilo Code项目中的 kilo.jsonc 或 .kilo/kilo.jsonc,全局配置为 ~/.config/kilo/kilo.jsoncmcp一个命令数组,与 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 ProtocolmcpServers与 Junie 使用独立存储未测试
Junie项目中的 .junie/mcp/mcp.json,用户配置为 ~/.junie/mcp/mcp.jsonmcpServers较早的帖子省略了 mcp/ 文件夹未测试
Amp~/.config/amp/settings.json、工作区中的 .amp/settings.json,或运行 amp mcp addamp.mcpServers键保留 amp. 前缀未测试
Goose~/.config/goose/config.yaml、%APPDATA%\Block\goose\config\config.yamlextensions使用 cmd 而非 command,且格式为 YAML未测试
Kiro工作区中的 .kiro/settings/mcp.json,用户配置为 ~/.kiro/settings/mcp.jsonmcpServers展开 ${VAR} 需要批准未测试
Antigravity~/.gemini/config/mcp_config.json,或工作区中的 .agents/mcp_config.jsonmcpServers远程服务使用 serverUrl未测试
OpenClaw~/.openclaw/openclaw.json(JSON5)mcp.serverstransport: "stdio"未测试
DeepSeek Harness (dsh)$DSH_HOME/cordis.patch.yml,或配置文件补丁- insert:,搭配 @deepseek-ai/dsh-mcp-client每个服务使用一个插件实例未测试
WarpSettings > Agents > MCP servers,或 ~/.warp/.mcp.json 和项目中的 .warp/.mcp.jsonmcpServers使用 working_directory,而非 cwd未测试
Augment CodeAuggie CLI 使用 ~/.augment/settings.json;IDE 使用自己的面板mcpServers该文件不会影响 IDE未测试
Qwen Code~/.qwen/settings.json,或项目中的 .qwen/settings.jsonmcpServersmcp.allowed 可能会在不提示的情况下隐藏它未测试
Kimi CLI~/.kimi-code/mcp.json,或项目中的 .kimi-code/mcp.jsonmcpServers当前的 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 提交错误报告和功能请求。

许可证

Apache 2.0。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。