mcpField
S
Seekstone Obsidian Mcp Server

Seekstone Obsidian Mcp Server

本地服务
github.com/shaqmughal开发工具341 天前更新

关于 Seekstone Obsidian Mcp Server

Seekstone 是直接访问文件系统的 MCP 服务,让 Claude 和其他 MCP 客户端无需启动 Obsidian 或插件即可读写 Obsidian 知识库。它结合索引全文搜索、可选的本地语义搜索和结构化笔记查询,并返回精简结果。

主要功能

  1. 01直接访问知识库文件
  2. 02排序后的全文搜索
  3. 03可选本地语义搜索
  4. 04Frontmatter 和元数据查询
  5. 05精简摘录与只读模式

适用场景

  1. 01用精简结果搜索大型 Obsidian 知识库
  2. 02按标签、Frontmatter 或修改时间查找笔记
  3. 03在运行时无需联网进行语义搜索
  4. 04Obsidian 关闭时仍向 MCP 客户端开放访问

MCP 相关

通过本地服务向 MCP 客户端提供 Obsidian 知识库读写能力。其配置命令行工具可检测知识库并配置支持的客户端。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"seekstone": {
"command": "npx",
"args": [
"-y",
"seekstone"
],
"env": {
"SEEKSTONE_VAULT": "<SEEKSTONE_VAULT>"
}
}
}
}
启动命令npx -y seekstone
需要配置的环境变量
SEEKSTONE_VAULTAbsolute path to your Obsidian vault.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmseekstone0.22.4

工具

19

收录的工具列表 · 更新于 3 周前

参数类型必填说明
querystring是搜索查询。
modeenum否lexical = 关键词搜索(默认)。semantic = 基于含义的搜索(需要 SEEKSTONE_SEMANTIC=1)。hybrid = 精确标题查询使用 lexical,其他情况使用 semantic。lexical | semantic | hybrid
limitnumber否最大结果数(1–50,默认 10)。
folderstring否限制为 vault 相对文件夹前缀。
tagstring否限制为带有此标签的笔记。

详细介绍

Seekstone

无需插件、无需运行 Obsidian 应用的 Obsidian MCP 服务——而且不会撑爆你的上下文窗口。

直接访问文件系统 · 关键词搜索耗时个位数毫秒 · 语义搜索约 26 ms · 负载约 2 KB · 25 个工具 · macOS · Linux · Windows

seekstone.dev →

在 Claude Desktop 中安装 在 Cursor 中安装 在 VS Code 中安装

npm (seekstone) npm total downloads npm weekly downloads 覆盖率 Codacy 评分 Socket.dev 安全性 已知漏洞 CI OpenSSF 评分卡 OpenSSF 最佳实践 许可证:MIT Node.js ≥ 22 shaqmughal/seekstone MCP 服务 在 X 上关注 @seekstone 在 Bluesky 上关注 @seekstone 请我喝杯咖啡


Seekstoneobsidian-mcp-server(下载量排名第 1)REST 代理服务
本地 REST API 插件不需要需要需要
Obsidian 应用运行不需要——Obsidian 关闭时也能工作需要需要
10k 条笔记时的搜索负载2.0 KB47 KB最高 95 MB
10k 条笔记时的热搜索延迟5.6 ms732 ms(慢约 131 倍)最高 1,550 ms
结构化 frontmatter 查询内置(query_notes)——属性/日期/大小谓词,答案仅需几百字节通过 REST 使用 JSONLogic因情况而异
相同查询、相同的已提交知识库、各运行 20 次、同一台机器。进程内适配器于 2026 年 9 月在 fixture-v2 知识库上重新运行;REST 代理行(rest、obsidian-mcp-server、mcp-obsidian)以及 obsidian-mcp 和 obsidian-mcp-pro 是 2026 年 6 月在 fixture v1 上采集的数据——每行数据的来源记录在 benchmarks.json 中;该文件是生成的事实来源,CI 会据此核验此处的每个数字——下方查看八个服务、三种知识库大小的完整结果,所有结果均可通过测试工具完整复现。

Seekstone 演示 — Claude 搜索 Obsidian 知识库并查询 frontmatter,工具调用等待时间已加速


什么是 Seekstone?

Seekstone 是一款 Obsidian MCP 服务——它让 Claude(以及任何 Model Context Protocol 客户端)能够直接读取和写入你的 Obsidian 知识库。无需打开 Obsidian 应用,无需安装插件,也不会有任何数据离开你的机器。

它直接从磁盘读取知识库,而不是通过 Obsidian Local REST API 插件中转,并在进程内维护一个热的全文索引。实际区别主要有两点:

  • 速度。 热缓存下,关键词搜索只需个位数毫秒,语义搜索约需 26 毫秒——比我们测试过的所有其他 Obsidian MCP 服务快最多 约 508 倍,因为无需启动子进程,也无需为每次查询进行 HTTP 往返。
  • 上下文。 REST 代理服务通过一次宽泛搜索返回数千万字节和数百万个 token,而 Seekstone 只返回约 2 KB——最多可减少约 47,000 倍,且知识库越大,差距越明显。

搜索有三种模式:排序后的全文搜索(模糊匹配和前缀匹配)、可选的本地语义搜索(基于含义,通过小型本地嵌入模型实现——需选择启用;一次性下载约 30 MB 模型后,运行时可离线使用),以及结构化元数据查询——query_notes 可按 frontmatter 属性(status、due、type 等)、标签、文件夹、修改时间和大小进行筛选,让你用几百字节就能回答“哪些草稿笔记在本周有更改?”之类的问题,无需反复搜索和读取。

Claude 可以在毫秒内搜索和读取整个笔记库,无需在一次工具调用中耗费大部分上下文窗口。

此项目已发布到 npm,名称为 seekstone——使用 npx -y seekstone 安装。(此前也曾以 obsidian-mcp-seekstone 发布;该别名已弃用,但现有安装仍可正常使用。)


为什么选择 Seekstone?看数据。

大多数 Obsidian MCP 服务会为每个搜索结果返回完整笔记内容。宽泛查询会产生数百万字节的文本,供大模型处理——其中大部分都无关紧要,却全都要占用上下文窗口。

Seekstone 返回的是简短的排序摘录(默认约 120 个字符,可按查询调整)。我们将 Seekstone 与另外 7 个 Obsidian MCP 服务进行了基准测试——总计 8 个服务——覆盖三种知识库大小:1,000 / 5,000 / 10,000 条笔记(各运行 20 次)。以下所有数字都可以完整复现:知识库已提交到此仓库(由公共领域的 1911 年《大英百科全书》生成),你可以克隆仓库并运行完全相同的基准测试。

测试三种大小的意义在于,不同架构的差异会在这里显现——真实知识库只会不断增长。

搜索载荷——每次查询返回的字节数(上下文开销;越低越好)

服务架构1k 条笔记5k 条笔记10k 条笔记
🥇 Seekstone进程内索引1.6 KB1.8 KB2.0 KB
mcpvault直接访问文件系统的子进程1.7 KB1.9 KB2.2 KB
obsidian-mcp-rs直接访问文件系统,每次查询扫描5.4 KB5.8 KB6.2 KB
obsidian-tcSQLite 平台4.6 KB6.8 KB7.3 KB
obsidian-mcp-serverREST API55 KB47 KB47 KB
obsidian-mcp-pro直接访问文件系统的子进程25 KB84 KB114 KB
obsidian-mcp直接访问文件系统的子进程18 KB105 KB203 KB
mcp-obsidianREST API9.8 MB45 MB95 MB

无论知识库有多大,Seekstone 的负载都保持稳定在约 2 KB,因为它始终返回排序后的摘录;如今,它也是测试过的所有服务中负载最小的,在三种规模下都略胜 mcpvault。REST 代理服务会返回每个匹配项的完整笔记内容,因此负载会随知识库增大——mcp-obsidian 在 10k 条笔记时达到 95 MB,而单次宽泛查询(the capital of)在 20 次运行中平均每次调用产生 370.9 MB / 9,780 万个 token。在 10k 条笔记时,二者的上下文开销相差约 47,000 倍。

搜索延迟——预热后的平均值,毫秒(越低越好)

服务1k 条笔记5k 条笔记10k 条笔记相较于 Seekstone(10k 条)
🥇 Seekstone1.02.85.6—
obsidian-mcp-rs6.01936慢约 6 倍
obsidian-mcp-pro41200407慢约 73 倍
obsidian-mcp-server82356732慢约 131 倍
obsidian-mcp78380772慢约 138 倍
mcpvault90431893慢约 159 倍
mcp-obsidian1647401,550慢约 277 倍
obsidian-tc2731,3802,849慢约 508 倍

每个竞品都会为每次查询启动子进程或进行 HTTP 往返,而且大多数服务的工作量会随知识库规模增长。Seekstone 将预热后的索引保留在进程内——无需 IPC,也无需网络——因此即使有 10,000 条笔记,关键词搜索仍能保持在个位数毫秒(随附的语义处理流水线——嵌入、扫描、MaxSim 重排——耗时约 26 毫秒)。而且,规模越大,差距就越明显:笔记数从 1k 增至 10k,竞品会慢 5–10 倍,而 Seekstone 几乎没有变化。即使是最快的替代方案 obsidian-mcp-rs——每次查询都会重新扫描知识库——在 10k 条笔记、预热状态下也慢约 6 倍,且负载是其 3 倍;REST 代理这一代服务则慢约 100–280 倍。

工具列表——首次调用前加载的 token 数(越低越好)

会话启动时,大多数 MCP 客户端会在调用任何工具之前,将服务的工具列表(每个工具的名称、说明和输入架构)加载到模型的上下文中。有些客户端(例如启用了工具搜索的 Claude Code)只会先加载名称,等到需要某个工具时再加载其详细信息。若完整加载,Seekstone 的 25 个工具会占用约 5,742 个 token(26 KB)。设置 SEEKSTONE_READ_ONLY=1 后,列表中会移除 11 个写入工具,token 数降至约 3,261 个,减少 43%。测试框架通过 MCP 测量已构建的服务(npm run harness -- schema-tax),CI 会在每次提交时重新测量,因此任何工具说明或架构的变更都会导致构建失败,直至更新已发布的数据。

在我们的基准测试中,Seekstone 是唯一一款在所有知识库规模下都同时实现约 2 KB 负载和个位数毫秒关键词延迟的服务;据我们所知,它也是唯一一款发布了可复现基准测试数据的 Obsidian MCP 服务。测试框架、合成知识库和完整结果均已开源:请参阅 benchmark-scaling.md 和测试框架。克隆、运行、验证。


安装

选择最适合你的方式。

正在使用 AI Agent?粘贴此提示词

如果你使用 Claude Code、Cursor 或其他编码 Agent,无需亲自遵循任何说明——粘贴此提示词,让 Agent 完成安装:

为此编辑器安装 seekstone MCP 服务。运行 npx -y seekstone init --client code --write(其他客户端请使用 desktop、cursor 或 vscode)。该命令会自动检测我的 Obsidian 库;如果列出多个库,请询问我选择哪一个,然后使用 --vault "<path>" 重新运行。将任何错误转告我,然后提醒我重启此会话,以便加载 seekstone 工具。

seekstone init 完全无需交互——使用 --write 后,它会一次性验证库并修改客户端配置(Claude Code 通过 claude mcp add,其他客户端则通过附带时间戳备份的增量 JSON 补丁)。

选项 1 — 一键安装(Claude Desktop,无需使用终端)
  1. 下载 seekstone.mcpb(直接链接,始终指向最新版本)
  2. 使用 Claude Desktop 打开该文件——在 Finder 中双击,或右键点击 →“打开方式”→ Claude Desktop
  3. 根据提示选择你的 Obsidian 库文件夹

当 seekstone 出现在 Claude 的工具栏中时,就表示安装成功。无需编辑 JSON、使用终端或安装 Node.js。

想要语义搜索?改为下载 seekstone-semantic.mcpb——它是同一 MCP 服务,已在安装包中附带本地嵌入模型(体积约大 28 MB),因此开箱即用地支持基于含义的搜索:仍然无需使用终端,运行时也不会下载任何内容。

Claude Desktop 显示 seekstone 安装对话框
选项 2 — 引导式设置(推荐 CLI 用户使用)

打开终端(macOS:按 Cmd+Space,输入“Terminal”,然后按 Enter)并运行:

npx -y seekstone init

当 Seekstone 出现在 Claude 工具栏的插件图标下时,就表示安装成功。

Seekstone 会读取 Obsidian 自带的库注册表来检测你的库、验证该库,然后打印供你粘贴的配置块,或直接修改 Claude Desktop 配置:

# Auto-detect vault, print config to paste
npx -y seekstone init

# Auto-detect vault, patch Claude Desktop in place (with backup)
npx -y seekstone init --write

# Specify vault explicitly if you have multiple
npx -y seekstone init --vault "/path/to/vault"

# Auto-configure Claude Code in one step (auto-detects vault, runs claude mcp add)
npx -y seekstone init --client code --write

# Or just print the Claude Code command without running it
npx -y seekstone init --client code
选项 3 — 手动配置(Claude Desktop)

将以下内容添加到 claude_desktop_config.json(设置 → 开发者 → 编辑配置):

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}
选项 4 — Claude Code

自动检测你的库,并通过一条命令配置 Claude Code:

npx -y seekstone init --client code --write

如果你想明确指定库路径,也可以手动配置:

claude mcp add seekstone --env SEEKSTONE_VAULT=/absolute/path/to/your/vault -- npx -y seekstone
选项 5 — Cursor

一键安装:在 Cursor 中安装 — 然后在 Cursor 的 MCP 设置中,将 SEEKSTONE_VAULT 设置为你的库的绝对路径(该链接安装的是占位配置)。

或者,让 CLI 自动检测你的库并修改 ~/.cursor/mcp.json(同时创建备份):

npx -y seekstone init --client cursor --write

或者手动将配置块添加到 ~/.cursor/mcp.json(全局)或 <project>/.cursor/mcp.json(针对单个项目):

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}
选项 6 — VS Code

一键安装:在 VS Code 中安装 — 然后在 VS Code 打开服务配置时,将 SEEKSTONE_VAULT 设置为保管库的绝对路径(该链接会安装一个占位配置)。

或者让 CLI 自动检测保管库并写入工作区配置(当前目录中的 .vscode/mcp.json):

npx -y seekstone init --client vscode --write

或者从终端添加:

code --add-mcp '{"name":"seekstone","command":"npx","args":["-y","seekstone"],"env":{"SEEKSTONE_VAULT":"/absolute/path/to/your/vault"}}'

或者手动将代码块添加到 .vscode/mcp.json(工作区),或通过命令面板 → MCP: Open User Configuration(全局用户配置)添加。请注意 VS Code 的两个特殊之处:顶层键是 servers(而非 mcpServers),且必须指定 "type": "stdio":

{
  "servers": {
    "seekstone": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

需要 VS Code 1.102 或更高版本;Seekstone 会显示在 Copilot Chat 的 Agent 模式工具选择器中。

其他 MCP 客户端(Windsurf、Cline 等)

Seekstone 是标准的 MCP stdio 服务 — 任何 MCP 客户端都可以运行它。在客户端的 MCP 配置中使用上面的同一个 JSON 代码块(command: npx、args: ["-y", "seekstone"]、环境变量 SEEKSTONE_VAULT)。


安装后,请重启客户端。启动时,Seekstone 会遍历保管库,构建内存中的全文索引(数千条笔记只需几秒),并在你编辑时保持索引实时更新。随后,Claude 即可使用以下 25 个工具。

CLI 选项需要 Node.js ≥ 22。一键安装的 .mcpb 包无需外部依赖。

如果 Seekstone 为你节省了上下文空间,不妨考虑 ⭐ 为仓库加星 — 这有助于其他人发现它。


Claude 可以用你的保管库做什么?

连接 Seekstone 后,你可以向 Claude 提出类似这样的请求:

  • “搜索我的笔记中关于 [主题] 的所有内容,并给我一份摘要” — 使用 search,返回按相关性排序的摘录,而非完整文件
  • “查找所有带有 #project 标签的笔记,并列出标题” — 使用 list_notes 并按标签筛选
  • “本周的每日笔记中还有哪些事项未完成?” — 使用 list_tasks,每个复选框返回一行简洁记录,而非整篇笔记;update_task 只需编辑一个字符即可勾选完成
  • “只读取我的 [项目] 笔记中的‘决策’部分” — 使用 read_note 并指定章节,因此只有该部分会进入上下文
  • “哪些笔记链接到我的 [主题] 笔记?它又链接到了哪些笔记?” — 使用 get_backlinks 和 get_links 遍历你的图谱
  • “将今天的站会笔记追加到我的每日笔记中” — 使用 append_periodic_note,根据保管库配置解析每日笔记路径(无需打开 Obsidian)
  • “修正这篇笔记中所有旧项目名称的出现位置” — 使用 replace_in_note,写入前会提供试运行预览
  • “在 [笔记] 的末尾添加摘要部分” — 使用 append_note,绝不会修改 frontmatter
  • “将 /inbox 中的所有笔记移动到 /archive/[year]” — 使用 move_note
  • “将这篇笔记 frontmatter 中的状态字段更新为 'done'” — 使用 patch_frontmatter,保留键的顺序和引号样式
  • “使用标准模板为今天创建一篇新会议笔记” — 使用 create_note

Claude 不会一次性看到你的整个保管库 — 它会按需搜索和读取,因此即使保管库很大(超过 10k 条笔记),也能控制在上下文预算内。


工具

读取
工具描述
search全文搜索。返回按相关度排序的摘录(默认约 120 个字符,可通过 excerptLength 调整),而非完整笔记。支持模糊匹配和前缀匹配;设置 SEEKSTONE_SEMANTIC=1 后,mode: "semantic"/"hybrid" 会通过本地嵌入模型按语义搜索(不会有任何内容离开你的设备)。
query_notes结构化元数据查询。按 frontmatter 键值谓词(eq、ne、contains、exists、missing、gt/gte/lt/lte)、标签、文件夹、修改时间和大小筛选;排序并选择所需字段。返回紧凑的行(默认包含路径和标题),而非笔记内容。
context_pack通过一次调用,为自然语言问题提供可直接用于回答的上下文,并严格限制在字节预算内(默认 2 KB):按相关度排序的摘录、附带单行摘要的关联邻近笔记,以及后续来源路径——无需再进行“搜索 → 读取 → 获取反向链接”的往返操作。可按 folder/tag 限定范围,并使用与 search 相同的 mode。
read_note按相对于 vault 的路径读取笔记的完整内容。支持返回单个章节、区块或行范围。
read_notes一次调用中读取最多 20 篇笔记(或章节、区块、行范围),并受总字节预算限制(默认 16 KB)。超出预算时,每篇笔记会按公平份额截断并标记为 truncated;单个无效路径会返回自身错误,不会导致整个批次失败。
list_notes列出笔记,可选择按文件夹前缀或标签筛选。
list_tags列出 vault 中所有标签,并按使用次数排序(或按字母顺序排序)。
list_tasks将 Markdown 复选框任务列为紧凑的结构化行(路径、行号、状态、文本、最近的标题)——可遍历整个 vault,也可按笔记、文件夹、标签、状态或修改时间筛选。自定义标记(- [/]、- [-]、……)会作为单字符状态一等处理。
outline_note返回笔记的标题和区块结构,不包含完整内容——在定向读取前可低成本浏览。
get_backlinks查找所有链接到指定笔记的笔记。
get_links列出笔记中的所有出站 wikilink 和 Markdown 链接。
resolve_note将笔记名称、路径或 frontmatter 别名解析为其规范 vault 路径——为每个匹配项提供来源信息;存在歧义时列出所有候选项,未匹配时提供“你是否要找”建议。
get_periodic_note读取今天(或任意日期)的每日、每周、每月、每季度或每年笔记——根据 vault 配置解析路径,无需 Obsidian。
list_writes日志中的近期写入记录——序号、时间戳、工具、涉及的路径,以及每条记录是否仍可撤销。仅包含元数据,绝不包含笔记内容。
写入
工具描述
create_note创建笔记(可选的 frontmatter + 正文);会自动创建父目录。
delete_note将笔记移至 vault 的 .trash/ 文件夹(兼容 Obsidian,可恢复)。传入 permanent: true 可跳过回收站 — 写入日志仍可让 undo_write 恢复笔记。
move_note移动或重命名笔记 — 会重写其他笔记中指向它的 wikilink 和 Markdown 链接,避免链接失效(设置 rewriteLinks: false 可禁用);会自动创建目标目录。
rename_heading重命名笔记中的标题 — 会重写整个 vault 中的每个 [[note#heading]] wikilink 和嵌入内容,确保引用仍然有效(保留别名,不处理围栏代码块)。
append_note在笔记正文末尾追加文本,不改动 frontmatter。
patch_frontmatter设置、更新或删除 frontmatter 键,不改变现有键的顺序或引号样式。
patch_note在标题或块引用处追加、前置或替换文本(设置 createIfMissing 可添加该章节)— 不改动 frontmatter。
replace_in_note在笔记正文中查找并替换文本 — 支持字面匹配或正则表达式、区分大小写、整词匹配、可选的 limit(默认替换所有匹配项),并提供试运行预览。
append_periodic_note追加到今天的周期笔记;如果笔记不存在,则根据模板创建。
update_task根据路径 + 行号(来自 list_tasks)设置一个复选框的状态 — 只改写一个字符,其他每个字节都保持不变。如果任务文本自列出后发生变化,expectText 防护会拒绝操作。
undo_write撤销一项已记录的写入:将其触及的每个文件恢复为写入前逐字节相同的状态(多文件移动或标题重命名会整体恢复;即使删除操作设置了 permanent,也能恢复)。默认撤销最近一次写入;如果文件此后发生变化,则拒绝操作并返回 undo_conflict,除非设置 force: true。撤销操作本身也会记录日志 — 对撤销条目调用 undo_write({ seq }) 可重做。

每个写入工具(append_note、patch_note、patch_frontmatter、replace_in_note、rename_heading、move_note、delete_note、append_periodic_note、update_task,以及设置了 overwrite: true 的 create_note)都支持可选的比较并交换:将从 read_note 获取的 contentHash 作为 prevHash 传入,如果笔记期间发生变化,调用会安全失败 — 不会悄然丢弃并发编辑,也不会移动或删除你未查看过的内容。每个变更结果都会返回新的 contentHash,因此连续编辑无需重新读取。

每次写入都可撤销。 在任何写入工具改动任何字节之前,它都会将即将触及的每个文件的写入前状态记录到 <vault>/.seekstone/history/ — 按内容寻址(相同状态只存储一次),并在 vault 写入提交前执行 fsync。list_writes 会显示日志;undo_write 会逐字节恢复:多文件 move_note 或 rename_heading 会整体恢复(笔记以及每一处链接重写),delete_note 即使设置了 permanent 也能恢复。外部编辑后执行撤销会被拒绝并返回结构化的 undo_conflict,除非传入 force: true — 即使如此,被覆盖的状态也会先记录到日志中,因此绝不会丢失内容。撤销操作本身也会记录日志:连续执行默认撤销会沿历史记录逐步回退,对撤销条目调用 undo_write({ seq }) 可重做。.seekstone/ 与 .trash/ 一样,不会被索引或搜索;请将它添加到 vault 的 .gitignore 中。它与 git 和 Obsidian 的文件恢复功能互为补充,而非取而代之 — 这是 Agent 可驱动的恢复路径。 每次写入都会留下记录。 设置 SEEKSTONE_AUDIT_FILE 后,每次写入工具调用——无论成功还是被拒绝——都会追加一行 JSON:工具、相对于知识库的路径、写入前后的 sha-256、结果(ok、hash_conflict、undo_conflict、policy_denied、error),以及操作元数据,例如替换次数或 .trash/ 目标位置;绝不记录笔记内容、frontmatter 值或搜索查询,因此可以放心将该文件附在错误报告中。

{"v":1,"ts":"2026-08-29T21:02:11.042Z","tool":"replace_in_note","outcome":"ok","durationMs":1.8,"seq":42,"files":[{"path":"notes/a.md","hashBefore":"3f9c…","hashAfter":"b71e…"}],"path":"notes/a.md","replacements":3}

哈希值与 read_note 返回的 contentHash 值相同,因此可以对照知识库核验每条记录;seq 是该调用提交的日志条目,因此可通过行索引直接定位到 list_writes / undo_write。记录会在知识库写入提交后追加并执行 fsync;超过 SEEKSTONE_AUDIT_MAX_SIZE 后,文件会轮转为 <file>.1;无法写入审计文件路径会导致启动失败;若追加失败,调用会报告结构化的 audit_failed 错误,而非干净地返回成功。以下是一些 jq 用法示例:

jq -r '[.tool, .outcome] | @tsv' audit.jsonl | sort | uniq -c            # session summary by tool + outcome
jq -c 'select(.files[]?.path == "notes/a.md")' audit.jsonl              # history of one note
jq -c 'select(.ts > "2026-08-29T21:00:00Z" and .outcome == "ok")' audit.jsonl   # what changed since a timestamp

快速,且全面。 在我们的基准测试集里,Seekstone 是唯一将 list_tags、outline_note、get_backlinks 和 get_links 作为一等工具提供的 Obsidian MCP 服务。还有四项能力让它脱颖而出:

  • 本地语义搜索,完全在进程内运行。 设置 SEEKSTONE_SEMANTIC=1 后,search 和 context_pack 会新增 mode: "semantic" 和 "hybrid",即通过小型设备端嵌入模型进行基于含义的检索(只需下载一次 npx -y seekstone fetch-model,或使用内置模型的 seekstone-semantic.mcpb 包;运行中的服务不会访问网络),并从 0.17.0 起加入 MaxSim 后期交互重排。在我们提交的 1 万篇笔记基准测试知识库上(150 条查询的黄金集,fixture v2),默认模型——通过实际搜索工具端到端测量——总体 hit@5 得分为 83.3%,留出集得分为 86.7%(而纯关键词搜索为 34.7%),预热 p50 延迟约为 26 毫秒;选择启用的 potion-retrieval-32M 模型(SEEKSTONE_SEMANTIC_MODEL;约 129 MB)则达到 总体 hit@5 为 86.7%,留出集得分为 86.7%,延迟约为 55 毫秒。我们纳入基准测试的其他服务都没有提供离线、零原生依赖的嵌入功能——而且我们在同一黄金集、同一次运行和已提交的开发集/留出集划分上对替代方案进行了正面对比(已提交的对比结果,结果解读见 COMPETITORS-SHA-322):obsidian-tc 的纯 Ollama 语义搜索在留出集上略胜我们(90.0% 对比我们的 86.7%),但每次查询耗时 169 毫秒,建索引需 30 分钟,而我们约为 28 秒;其 GraphRAG 模式得分超过我们纳入基准测试的所有方案(留出集 95.0%),代价是每次查询耗时数秒(p50 为 2.9 秒,p95 为 4.2 秒,而我们为 26–55 毫秒)、负载约为 8 倍(每次查询 16 KB 对比约 2 KB),还需要安装并运行第二个服务(Ollama + 一个 1.37 亿参数模型)。我们预先登记了争夺第一名的门槛(GATE-V2-SHA-316,在 fixture v1 上运行),但未能达标——这一结论的公布显著程度与获胜时相同;v2 上没有运行新的门槛测试,相同条款重新计算后结果依然未达标。obsidian-mcp-pro 完全无法为 1 万篇笔记的知识库建立索引(嵌入约 17 分钟后,其 JSON 向量存储超出 JavaScript 字符串长度限制)。如何取舍由你决定——所有数据都已提交。
  • 周期笔记,直接访问文件系统。 get_periodic_note 和 append_periodic_note 会读取你自己的知识库配置(.obsidian/daily-notes.json 和 Periodic Notes 插件),解析每日、每周、每月、每季度和每年的笔记路径——即使 Obsidian 已关闭也可以。 基于 REST 的服务只能在应用运行时执行此操作。
  • 确保前置元数据逐字节一致。 patch_frontmatter 会原地编辑 YAML,保留键顺序、引号样式和注释;测试框架已通过逐字节比对验证写入安全性。我们调查过的其他服务都无法作出这项保证。
  • 零耦合。 无需 Obsidian 应用、Local REST API 插件,也不受插件版本变动影响。只需使用磁盘上的文件。

配置

变量必填描述
SEEKSTONE_VAULT是Obsidian 库的绝对路径。
SEEKSTONE_LOG_LEVEL否error | warn | info(默认)| debug。
SEEKSTONE_LOG_FILE否绝对路径;设置后,JSON 行日志会追加到此处(按大小轮转)。
SEEKSTONE_LOG_MAX_SIZE否SEEKSTONE_LOG_FILE 的日志轮转阈值(例如 10mb;默认 5 MB)。
SEEKSTONE_WATCH_POLL否设为 1,以轮询文件状态来检测更改,而不是使用原生 OS 事件——速度较慢,但在网络驱动器、WSL 和某些容器中更可靠。
SEEKSTONE_WATCH_POLL_INTERVAL否文件状态轮询间隔,单位为 ms(默认 10000)。仅在 SEEKSTONE_WATCH_POLL=1 时使用。间隔越短,发现外部编辑越快,但 CPU 占用越高;在较慢的网络或 9p 挂载上应调高此值。
SEEKSTONE_READ_ONLY否设为 1 以只读模式运行:11 个写入工具会从工具列表中完全移除(即使被调用也会被拒绝),因此可以确证会话无法修改你的库。
SEEKSTONE_WRITE_PATHS否以逗号分隔的库相对路径 glob(例如 journal/**,inbox/*.md)。仅允许写入匹配路径下的内容;库的其余部分保持只读。
SEEKSTONE_HISTORY否设为 0 可禁用写入日志(默认开启)。启用后,每个写入工具都会将其修改的每个文件的写入前内容存储在 <vault>/.seekstone/history/ 下,以便 undo_write 逐字节还原文件。
SEEKSTONE_HISTORY_MAX_SIZE否写入前内容的存储上限(例如 100mb;默认 50 MB)。先淘汰最旧的条目,然后在 list_writes 中显示 undoable: false——绝不会静默处理。
SEEKSTONE_HISTORY_MAX_ENTRIES否日志条目上限(默认 1000);超过上限后会丢弃最旧的条目。
SEEKSTONE_AUDIT_FILE否绝对路径;仅在设置后启用。每次写入工具调用(成功或拒绝)都会追加一条 JSON 行审计记录,其中包含工具、路径、写入前后的 sha-256、结果和操作元数据。绝不记录笔记内容。
SEEKSTONE_AUDIT_MAX_SIZE否超过此大小后,将审计文件轮转为 <file>.1(例如 10mb;默认 10 MB)。
SEEKSTONE_SEMANTIC否设为 1 可启用语义搜索(search 和 context_pack 将支持 mode: "semantic" 和 "hybrid")。需要本地嵌入模型——使用 npx -y seekstone fetch-model 下载一次;运行中的服务绝不会访问网络。seekstone-semantic.mcpb 包会自动设置此项,并内置该模型。
SEEKSTONE_SEMANTIC_MODEL否要加载的本地模型:potion-base-8M(默认,约 30 MB,256 维)或 potion-retrieval-32M(约 129 MB,512 维——对描述式查询更准确,查询延迟约为 2 倍)。请先使用 npx -y seekstone fetch-model --model potion-retrieval-32M 下载。
SEEKSTONE_MODEL_PATH否存放 Model2Vec 嵌入模型的目录(默认:fetch-model 将所选模型放入的缓存目录)。
SEEKSTONE_CACHE_DIR否下载的模型和每个库的嵌入缓存所在的缓存根目录(默认 ~/.cache/seekstone)。
SEEKSTONE_BUNDLED_MODEL_DIR否由 seekstone-semantic.mcpb 包的清单设置——指向扩展中内置的分片模型文件,服务会在启动时将其重新组装到模型目录中(仅写入磁盘,并根据固定的 SHA-256 哈希进行验证)。通常无需手动设置。
SEEKSTONE_INSTRUCTIONS否文件路径,该文件的内容将成为 MCP 服务的 instructions 字符串(与工具列表一同呈现给客户端)。相对路径以库根目录为基准解析。启动时读取一次,去除首尾空白,限制为 16 KB(超出时截断并发出警告)。文件不存在、无法读取或去除首尾空白后为空时,不提供任何指令——不会导致启动失败。

工作原理

Seekstone 使用 fast-glob 遍历知识库,解析每篇笔记的 frontmatter(按字节处理,因此写入前后可以验证 frontmatter 区域的字节完全一致),并在内存中构建 MiniSearch 全文索引。搜索返回经过排序的简短摘录,而非整篇笔记——上下文成本的降低正是源于这种“摘录而非文档”的设计。跨平台文件监视器(chokidar)会在你使用 Obsidian 编辑时保持索引最新。

写入功能在设计上力求保守:append_note 绝不触碰 frontmatter,patch_frontmatter 则直接修改 YAML 文档,而不是重新序列化,从而保留键的顺序、引号样式和注释。

它的设计目标是持续稳定运行。Seekstone 会在每次提交时通过 CI 在 macOS、Linux 和 Windows 上接受测试;其写入工具经过强化,可抵御病态输入(ReDoS);对于意外的未处理拒绝,会记录日志而不是崩溃——因此,长期运行的 MCP 会话能够保留热索引,不会在对话中途意外退出。

如需逐层了解代码库——包括各个包、服务内部实现、端到端请求流程和测量工具——请参阅 docs/ARCHITECTURE.md。


安全与隐私

Seekstone 会读取本地磁盘上 SEEKSTONE_VAULT 下的文件,并可通过写入工具修改这些文件。运行中的服务不会进行网络调用,也不会发送遥测数据(包中唯一的网络路径是显式运行 npx -y seekstone fetch-model 子命令:一次性下载可选的语义搜索模型,并通过 SHA-256 验证;该命令会在服务启动前退出;seekstone-semantic.mcpb bundle 则连这一步也省去了,因为它将模型随包提供,并在启动时从磁盘重新组装,且会使用相同的固定哈希进行验证)。默认情况下,日志只包含元数据(只有在 debug 级别才会出现笔记内容)。除可选的日志文件(需自行配置)以及启用 SEEKSTONE_SEMANTIC=1 时位于 ~/.cache/seekstone 的每个知识库嵌入缓存(由笔记生成的向量——绝不会发送到任何地方)外,不会在知识库之外写入任何内容。

写入安全契约

允许 AI 写入你的笔记,光说“请相信我们”还不够。Seekstone 提供了一份具名且经过测试的契约——docs/WRITE-SAFETY.md——其中列出了十项保证,每项都链接到负责强制执行的代码和用于验证的测试。这些保证会由 CI 中的安全测试套件逐字节验证,并在每次提交和发布时运行:零网络访问、知识库沙盒、编辑正文时 frontmatter 字节完全一致、原子写入(不会产生残缺文件)、创建操作绝不覆盖现有文件、可恢复删除(.trash/)、每个写入工具均支持可选的比较并交换、可配置写入范围/只读模式、可撤销每次写入的写入日志(undo_write),以及可通过哈希验证的审计日志——每次写入调用都会留下回执。同一测试套件也会以无头模式对其他直接操作文件系统的服务运行;契约中包含对比表。

常见问题

需要运行 Obsidian 应用吗? 不需要。Seekstone 直接从磁盘读取库文件夹。Obsidian 可以处于打开或关闭状态。

我需要安装 Local REST API 插件吗? 不需要。Seekstone 完全绕过它——这正是有效载荷减少高达 47,000 倍的原因。无需安装任何插件。

它支持哪些 AI 客户端? 任何支持通过标准输入/输出使用 Model Context Protocol(MCP)的客户端——Claude Desktop、Claude Code、Cursor、Windsurf、Continue 等。

在我的库中使用安全吗? Seekstone 绝不会修改文件,除非你明确调用它的某个写入工具(上表中的十个工具——create_note、append_note、patch_note、patch_frontmatter、replace_in_note、move_note、rename_heading、delete_note、append_periodic_note、undo_write)。每个工具都会先记录其要修改的每个文件的原始内容,因此 undo_write 可以逐字节还原——请参阅上文的写入日志说明。设置 SEEKSTONE_AUDIT_FILE 后,每次写入调用都会留下可通过哈希验证的审计记录(包括被拒绝的尝试)。运行中的服务不会发起网络请求(语义搜索模型由显式调用的 fetch-model 子命令在服务之外下载一次)。库路径受到沙盒限制——任何工具都无法在此路径之外读取或写入。你还可以进一步收紧限制:SEEKSTONE_READ_ONLY=1 会从会话中完全移除写入工具,而 SEEKSTONE_WRITE_PATHS 会将写入限制在你允许的文件夹中(例如,仅允许 journal/**)。这两项限制都在分发层执行,而非由各个工具单独执行,因此没有工具会漏掉检查。

它能在 Windows 上运行吗? 能。Seekstone 会在每次提交时通过 CI 在 macOS、Linux 和 Windows 上进行测试。

搜索能处理拼写错误吗? 可以处理轻微的拼写错误。关键词搜索允许 3–7 个字母的单词每个有一个拼写错误,8 个或更多字母的单词每个有两个拼写错误,因此输入 benchamrk 仍能找到 “benchmark”。一个或两个字母的单词必须完全匹配,交换两个字母则算作两个拼写错误。搜索也会匹配单词前缀:kuber 可以找到 “Kubernetes”。search、context_pack、query_notes 和 list_notes 中的 tag 筛选器与 Obsidian 的行为相同:忽略大小写并包含嵌套标签,因此 project 可以匹配 #Project/alpha。如果某个标签不存在,工具会返回 unknown_tag 错误并列出最接近的现有标签。

它能处理多大的 Obsidian 库? Seekstone 已针对包含数千篇笔记的库进行性能分析。在已提交的 10,000 篇笔记基准测试库中,冷启动索引构建需要几十秒,进程 RSS 低于约 100 MB;典型的个人库只需几秒即可完成索引。语义模式会在启动后于后台生成嵌入(10,000 篇笔记约需 30 秒,之后会按库缓存,因此重启时可在不到一秒内重新加载)。

seekstone init 如何自动找到我的库? 它会读取 Obsidian 自己的库注册表(obsidian.json)——Obsidian 用同一文件跟踪你已知的库。如果你只有一个库,系统会自动选择。如果你有多个库,系统会列出它们,并要求你使用 --vault 选择。

.mcpb 文件是什么? MCP Bundle——一个包含服务及其清单的独立压缩包。安装方法:在 Finder 中双击(或右键点击 →“打开方式”→ Claude Desktop),选择你的库,即可完成安装。无需使用终端或 Node.js。每个版本都提供两个变体:seekstone.mcpb(标准版)和 seekstone-semantic.mcpb(相同的服务,内置本地嵌入模型,开箱即用语义搜索)。


贡献与开发

欢迎贡献。请参阅 CONTRIBUTING.md 了解指南,或直接开始:

npm install                                          # install all workspace deps
npm test                                             # run all tests
npm run lint                                         # biome check
npm run build -w seekstone                           # tsup → dist/
npm run build:mcpb                                   # build seekstone.mcpb bundle

npx vitest run packages/server/src/tools/search.test.ts  # single test file
npx vitest run -t 'parses a typical frontmatter'         # single test by name
npx tsc -p packages/server/tsconfig.json --noEmit        # typecheck
仓库布局
包用途
packages/server已发布的 seekstone MCP 服务(25 个工具、stdio、MiniSearch 索引、chokidar 监视器)。
packages/core共享的知识库基础功能——遍历、frontmatter 解析器、链接/标签提取器、大纲、百分位数、pmap 和 Model2Vec 嵌入器。会打包到服务构建产物中。
packages/harness分析器 + 基准测试 + 写入安全测试框架(REST 与文件系统),用于生成上述负载数据。仅用于开发;不会发布。

服务会实际构建(tsup → dist/)并发布到 npm。测试框架通过 tsx 从源码运行。发布流程已自动化——参见 docs/RELEASING.md。

测量测试框架

该测试框架用于复现促成文件系统直连设计的基准测试数据。默认复现路径(针对已提交的合成知识库使用 fs/seekstone 后端)不需要任何额外配置;只有基于 REST 的后端(rest、mcp-obsidian、obsidian-mcp-server)需要在 Obsidian 运行并启用 Local REST API 插件。

export SEEKSTONE_VAULT="/absolute/path/to/your/vault"

npx tsx packages/harness/src/cli.ts profile --vault "$SEEKSTONE_VAULT"
npx tsx packages/harness/src/cli.ts bench \
  --queries packages/harness/queries/default.json \
  --stats reports/vault-stats.json
npx tsx packages/harness/src/cli.ts safety --vault "$SEEKSTONE_VAULT"

测试框架环境变量:SEEKSTONE_REST_API_KEY(来自 Local REST API 插件)和 SEEKSTONE_REST_URL(默认为 https://127.0.0.1:27124)。


支持

Seekstone 免费且开源。如果它为你节省了上下文(和金钱),你可以请我喝杯咖啡。


许可证

MIT © Shaq Mughal

评论

支持 Markdown

第一次接触 MCP?

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

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