mcp server
Lsearch
Everything-style instant filename search for Kylin/Linux desktops (CLI/TUI/GUI/D-Bus), plus an MCP server so LLM coding agents (Claude, opencode, Cursor) can search your local file index. C++17 · Qt5
Set up
Runs on your computer. Pick your agent and operating system.
This project does not publish an install method we can turn into a config. Follow the README instead.
README
synced Oct 23, 2026Lsearch — 面向麒麟 V10 桌面的 Everything 风格文件名搜索
TL;DR (EN): Everything-style instant filename search for Kylin/Linux desktops — plus an MCP server that lets LLM coding agents (Claude, opencode, Cursor, …) query your local file index: 100k+ files, millisecond, fully local. One index, five frontends (CLI / TUI / GUI / D-Bus / MCP).
Lsearch 是一款参考 Windows 版 Everything 打造的文件名即时搜索工具,专为 麒麟(Kylin V10)等信创桌面环境设计,采用 C++17 + Qt5 + SQLite + inotify 技术栈。 同一份索引同时服务两类消费者:
- 桌面用户:CLI / TUI / GUI / D-Bus —— 即输即搜,毫秒级返回;
- LLM 编码代理:内置 MCP server(
lsearch-mcp),让 Claude / opencode / Cursor 等代理直接检索本机文件名索引——全本地、不上传,无需把文件内容送去云端。
Everything 之所以快,是因为 NTFS 的 MFT + USN 日志免费提供了文件名索引; Linux 的 ext4 没有等价物,因此 Lsearch 必须自建索引:首次全量遍历 + 内存热索引 + SQLite 持久化 + inotify 增量更新,实现"即输即搜"。
特性
- 常驻守护进程
lsearchd:全量建索引 → SQLite 持久化 → inotify 实时增量 → 内存热索引 - Unix domain socket IPC(明文协议,可用 ncurses/GUI/CLI 共享,脚本/socat 可调试)
- CLI:
lsearch <关键词>即时输出路径,支持子串/通配符/re:正则、排序、计数、--under子树过滤、脚本用-0 - TUI:
lsearch-tui输入即搜、方向键浏览、Enter 打开(xdg-open)、F5 重建 - GUI:Qt5 实时搜索框 + 结果表格 + 托盘常驻 + 索引管理页
- MCP 前端
lsearch-mcp:stdio JSON-RPC,把本机文件名索引接给 LLM 编码代理(search_files/index_stats两个工具);兼容 legacy 与 modern 协议(含真实客户端的_meta.progressToken),并由官方 conformance 套件 + 第三方 Inspector + 真实客户端转录回归验证(见 Spec 011) - D-Bus 集成:
lsearch-dbus会话总线门面,支持按需激活与桌面集成 - 默认仅索引用户家目录,简单纯文本配置(
~/.config/lsearch/lsearch.conf) - 自动拉起守护进程:CLI/TUI 连不上 socket 时会自动把
lsearchd拉起来
构建
# 依赖:cmake、g++、libsqlite3-dev、libncurses-dev
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j"$(nproc)"
产物:build/lsearchd、build/lsearch、build/lsearch-tui、build/lsearch-mcp、build/lsearch-dbus、build/lsearch_tests
快速开始
# 1) 启动守护进程(自动生成配置并全量建索引;也可直接运行 lsearch 自动拉起)
lsearchd --foreground # 前台调试;默认后台守护化
# 2) 搜索
lsearch report # 子串匹配,大小写不敏感
lsearch '*.pdf' # 含 * ? 时切换为通配符
lsearch 're:^report-\d{4}\.pdf$' # re: 前缀切换为 ECMAScript 正则(大小写不敏感)
lsearch --count a # 仅计数(精确;>5 万时打印下界并在 stderr 提示 capped)
lsearch -d '报告' # 只显示目录
lsearch -s size -S 'log' # 按大小排序,带详情列
lsearch --under /data 'report' # 只在 /data 子树内搜索(realpath 规范化)
lsearch --stats # 索引统计
# 3) 交互界面
lsearch-tui # 输入即搜;↑↓ 选择,Enter 打开,F5 重建,F6 排序,F7 反序,Esc 清空,Ctrl+Q 退出
TUI 的完整操作与排障见 docs/tui-manual.md。
接入 LLM 代理(MCP)
lsearch-mcp 是一个 stdio JSON-RPC 服务器,暴露两个工具:
search_files(按文件名子串/通配符/re: 正则搜索,可用 under 限定路径子树)与
index_stats(索引规模与重建进度)。任何 MCP 宿主都可接入:
opencode(~/.config/opencode/opencode.jsonc):
{
"mcp": {
"lsearch": {
"type": "local",
"command": ["/usr/local/bin/lsearch-mcp"],
"enabled": true
}
}
}
Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"lsearch": { "command": "/usr/local/bin/lsearch-mcp" }
}
}
未安装到 PATH 时,把 command 指向构建产物 build/lsearch-mcp 的绝对路径即可。
首次调用会自动拉起 lsearchd(也可先手动 lsearchd --foreground)。
共用索引的注意点:MCP 宿主若以精简环境启动子进程(只传
HOME、不带XDG_*), 自动拉起的守护进程会落到回退路径(socket/tmp/lsearch-$UID、数据$HOME/.local/share/lsearch), 与桌面端看到的索引不是同一份。需要共用时,请在宿主配置里显式传递XDG_RUNTIME_DIR与XDG_DATA_HOME(这是真实客户端调试中实测到的行为,见 Spec 011)。
自测
一键自测核心流程(含建索引 / 搜索 / inotify 增量 / 停机补齐 / 关闭):
./scripts/self-test.sh # 自动构建后跑全部 25 项
./scripts/self-test.sh -s # 跳过构建,直接用现有 build/
MCP 前端自测(stdio JSON-RPC,S1–S13;需 python3):
./scripts/self-test-mcp.sh # 自动构建后跑全部 37 项
./scripts/self-test-mcp.sh -s # 跳过构建
IPC 协议自测(Unix socket 原始协议,P1–P18;需 python3):
./scripts/self-test-ipc.sh # 自动构建后跑全部 18 项
./scripts/self-test-ipc.sh -s # 跳过构建
D-Bus 桥接自测(dbus-run-session + gdbus,D1–D22;需 dbus-utils):
./scripts/self-test-dbus.sh # 自动构建后跑全部 22 项
./scripts/self-test-dbus.sh -s # 跳过构建
MCP 协议加固(Spec 011;外部验证器 + 转录回放 + 负形状矩阵;外部项需 npx/网络,缺失则 SKIP):
./scripts/self-test-mcp-conformance.sh -s # 官方 conformance server 套件(supergateway stdio→HTTP 桥;基线内预期失败)
./scripts/self-test-mcp-inspector.sh -s # 第三方 Inspector CLI:tools/list + index_stats(3 项)
./scripts/self-test-mcp-replay.sh -s # 回放转录 fixture(6 项;结构等价,忽略 id/时间)
./scripts/self-test-mcp-matrix.sh -s # _meta/id/通知/batch/大小写/参数 负形状矩阵(27 项)
真实客户端转录已固化为回归:tests/fixtures/mcp-trace-real.jsonl(真实 opencode 会话,含
legacy _meta.progressToken 与 notifications/cancelled):
./scripts/self-test-mcp-replay.sh -s tests/fixtures/mcp-trace-real.jsonl
重新采集:LSEARCH_MCP_TRACE=/tmp/lsearch-mcp-real.jsonl scripts/mcp-trace-wrapper.sh
(把 opencode 的 MCP command 临时指向该 wrapper 跑一次会话;详见脚本头注释)。
IPC 协议加固(Spec 012;第三方传输 + 独立客户端差分 + 帧完整性;含 \n/\t 文件名):
./scripts/self-test-ipc-external.sh -s # 第三方 nc -U 直连原始协议(7 项)
./scripts/self-test-ipc-diff.sh -s # 独立客户端 × CLI 逐字节差分(13 项)
./scripts/self-test-ipc-matrix.sh -s # 负形状/边界矩阵(61 项:帧完整性 + Spec 013 输入校验)
TUI 自动化自测(tmux 伪终端注入按键并断言画面;需装 tmux):
./scripts/self-test-tui.sh # 输入即搜 / 通配符 / F5 重建 / Esc 清空 / Ctrl+Q 退出
配置(简单纯文本,首次运行自动生成)
# ~/.config/lsearch/lsearch.conf
paths = /home/user, /data # 索引根路径,逗号分隔;默认仅用户家目录
excludes = /proc,/sys,/dev,/run # 排除前缀
index_hidden = 0 # 是否索引隐藏文件
follow_symlinks = 0 # 是否跟随符号链接
管理命令:lsearchd --add-path /data、lsearchd --remove-path /data、
lsearchd --rebuild、lsearchd --shutdown(已运行时自动转发给现有进程)。
架构
lsearchd 守护进程 ── Unix socket IPC ──┬─ GUI(Qt5,已完成,直接复用 core)
├ core/indexer 并行全量遍历 ├─ TUI(ncurses,V1 已交付)
├ core/watcher inotify 增量 └─ CLI(lsearch)
├ core/db SQLite 持久化
└ core/search 内存热索引
已知限制(V1)
- 守护进程离线期间的改动不自动追平(默认幂等:重启加载 SQLite,可 F5 重建)
- inotify 有 watch 上限:目录极多时需调高
/proc/sys/fs/inotify/max_user_watches,否则仅告警不阻塞 - 匹配仅针对**最终文件/文件夹名(basename)**做子串/通配符/
re:正则(完整路径不参与命中);全文内容搜索不在范围;可用--under PATH限定路径子树(Spec 010) re:支持 ECMAScript 正则;病态模式可能长时间占用搜索线程(本地 DoS),仅影响本机查询(详见 Spec 008)- TUI 需在真实终端(SSH/本地控制台)运行
路线图
- V1:lsearchd + CLI + TUI + inotify + SQLite + 单元测试 + 打包脚本
- V2:Qt5 GUI —— 实时搜索框、结果表格、双击打开、系统托盘常驻、深色现代主题
- V2:索引管理页 —— GUI 内增删索引根路径/排除前缀/选项(隐藏文件、符号链接)、一键重建
- V3:正则(
re:前缀,ECMAScript,大小写不敏感) - V3:D-Bus 集成(
lsearch-dbus会话总线门面 + 按需激活) - V3:检索协议 v2(
search2/count2/capabilities+under子树过滤,精确 total/cap 语义) - V3:多架构 CI
开源参考
Fsearch、fd、fzf、plocate 等(见 architecture 文档)。
License
MIT