知识库AI插件

Witness是一款Obsidian插件,通过AI将您的知识库转化为智能、可访问的知识管理系统,支持文件操作、全文搜索、语义搜索等功能。

  • by jawache
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 jawache/witness

使用说明

见证

将混乱转化为秩序的AI伴侣

Witness是一个黑曜石插件,可以将你的保险库变成一个智能的、人工智能可访问的知识库。它直接在Obsidian内部运行一个MCP(模型上下文协议)服务器,允许Claude Desktop和其他AI助手代表您读取、写入和组织笔记。

哲学:混沌→ Order

见证是围绕一个简单的组织理念建立的:

  • 混沌:来自世界各地的未经处理的信息(文章、视频、快速笔记、成绩单)
  • 订单:你提炼和组织的结构化知识(主题、项目、综合)

该插件可帮助您将信息从混乱转移到有序,并在人工智能的帮助下处理、分类和合成您的笔记。

特性

电流(第1+2+3阶段)✅

  • MCP服务器:在黑曜石内部运行,无外部依赖
  • 文件操作:通过AI读取、写入、编辑和列出vault中的文件
  • 全文检索:使用可选过滤器搜索所有markdown文件
  • 语义搜索:使用本地Ollama嵌入+Orama矢量存储按含义查找文档
  • 搜索面板:通过模糊自动补全进行路径和标签过滤的侧边栏搜索
  • 背景索引:自动增量索引,带空闲门控执行(等待2分钟不活动)、取消暂停保存、活动文件延迟和状态栏倒计时器
  • 命令执行:通过AI执行任何黑曜石命令
  • Claude桌面集成:直接从Claude Desktop应用程序连接
  • 远程访问:Cloudflare快速隧道或命名隧道(永久URL),可从任何地方访问
  • 命名隧道支护:将您自己的域名与Cloudflare命名隧道一起使用,以获得永久、稳定的URL
  • 主要机器:指定在跨多个设备同步时运行隧道的计算机
  • 令牌身份验证:使用简单令牌保护您的远程端点
  • 混沌分类:通过队列管理和安全的前台更新,人工智能辅助处理未读的混乱项目
  • 混沌队列面板:用于浏览和分类混乱项目的可视化侧边栏——基于卡片的UI,具有悬停操作、批量编辑模式、键盘快捷键和文件资源管理器上下文菜单
  • LLM重新排名:可选的两阶段搜索——快速混合结果立即显示,然后由本地LLM重新排名以获得更高的精度
  • 上下文搜索:切换搜索面板根据光标位置、选择或当前段落自动显示相关注释的模式,无需键入
  • 页面预览:Cmd+将鼠标悬停在任何搜索结果上,无需离开面板即可预览笔记
  • 隐私第一:一切都在本地运行,你的隧道,你的数据

16种MCP工具可用:

  • read_file -读取文件内容(可选数据视图渲染)
  • write_file -创建新文件(仅创建,现有文件有错误)
  • list_files -浏览目录
  • edit_file -查找和替换文本
  • search -统一内容搜索:混合(关键字+语义)、矢量或全文模式,带标签/路径过滤
  • find -按名称、路径、标签或带有元数据的frontmatter属性查找文件
  • move_file -移动或重命名文件
  • copy_file -将文件复制到新位置
  • create_folder -创建文件夹(支持mkdir-p)
  • delete -删除文件/文件夹(支持垃圾桶)
  • execute_command -运行黑曜石命令
  • get_vault_context -加载vault的上下文文档(自动呈现Dataview)
  • dataview_query -执行Dataview查询,获取结构化vault数据(需要Dataview插件)
  • get_next_chaos -获取下一个未处理的混乱项目进行分类(单模式或列表模式)
  • mark_triage -记录分诊决定(已处理、推迟、确认、下一步、重置)
  • copy-obsidian-url -复制当前文件的内部黑曜石URL

即将推出

  • 聊天界面:通过WhatsApp/Telegram连接以进行移动访问
  • 心跳提示:每日/每周提示您保持保险库新鲜
  • 混沌监测:未处理的项目堆积时收到通知

安装

先决条件

  • 黑曜石1.0.0或更高版本
  • Node.js 20+(用于克劳德桌面连接)
  • Claude Desktop应用程序(可选,用于AI集成)
  • 奥拉玛 (可选,用于语义搜索)

通过BRAT安装(推荐)

安装Witness最简单的方法是使用 BRAT插件:

  1. 从黑曜石社区插件安装BRAT
  2. 打开BRAT设置并单击“添加Beta插件”
  3. 输入: jawache/witness
  4. 点击“添加插件”
  5. 在社区插件中启用见证

BRAT将在新版本发布时自动更新Witness。

手动安装

如果您更喜欢手动安装:

  1. 下载最新版本

    • 首选 发布
    • 下载 main.js 和 manifest.json
  2. 在您的保险库中安装

    # Create plugin folder
    mkdir -p /path/to/your/vault/.obsidian/plugins/witness/
    
    # Copy files
    cp main.js manifest.json /path/to/your/vault/.obsidian/plugins/witness/
    
  3. 启用黑曜石

    • 打开黑曜石设置→ 社区插件
    • 如果系统提示,禁用安全模式
    • 在列表中找到“见证人”并启用它

从源代码构建

对于希望从源代码构建的开发人员:

  1. 克隆存储库

    git clone https://github.com/jawache/witness.git
    cd witness
    
  2. 构建插件

    npm install
    npm run build
    
  3. 在您的保险库中安装

    cp main.js manifest.json /path/to/your/vault/.obsidian/plugins/witness/
    

连接到克劳德桌面

  1. 配置Claude桌面版

    编辑 ~/.claude/claude_desktop_config.json (或 %APPDATA%\Claude\claude_desktop_config.json 在Windows上):

    {
      "mcpServers": {
        "witness": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-remote@latest",
            "http://localhost:3000/mcp",
            "--transport",
            "http-only",
            "--allow-http"
          ]
        }
      }
    }
    
  2. 重新启动克劳德桌面

  3. 验证连接

    在Claude Desktop中,您应该在MCP服务器列表中看到“见证”。试着问:

    “你能列出我保险库中的文件吗?”

用法

整理您的保险库

为了获得最佳效果,请使用以下顶级文件夹组织您的保管库:

vault/
├── chaos/
│   ├── external/     # Articles, videos, clippings
│   └── inbox/        # Quick capture notes
└── order/
    ├── knowledge/    # Organized information
    ├── heartbeat/    # Daily/weekly notes
    ├── projects/     # Active work
    └── synthesis/    # Published output

这种结构不是必需的,但Witness旨在帮助您保持这种流程。

设置

打开黑曜石设置→ 证人。设置被组织到选项卡中:

常规选项卡

  • 启用MCP服务器:打开/关闭服务器
  • 端口:HTTP服务器端口(默认值:3000)

远程访问选项卡

  • 启用隧道:通过Cloudflare隧道暴露您的MCP服务器
  • 隧道类型:快速(随机URL)或命名(域名上的永久URL)
  • 需要认证:使用令牌保护远程访问

搜索标签

  • 基本URL:Ollama服务器地址(默认值: http://localhost:11434)
  • 嵌入模型:使用哪种Olama模型进行嵌入(参见 支持的型号)
  • 索引状态:显示索引文档的数量,并提供构建/清除按钮
  • 最小内容长度:跳过小于此字符数的文件(默认值:50)。短文件会产生与任何查询匹配的嘈杂的通用嵌入——过滤它们可以显著提高搜索质量。看 为什么要过滤短文档? 了解详情。
  • 文件夹排除:选择要从索引中排除的文件夹(例如附件、模板)。使用文件夹选择器进行轻松选择。

远程访问

Witness支持两种类型的Cloudflare隧道,以远程公开您的保险库:

选项A:快速隧道(简易、临时)

一个快速隧道会给你一个随机的URL,每次黑曜石重启时都会发生变化。适合测试。

  1. 转到黑曜石设置→ 见证
  2. 切换“启用隧道”
  3. 将隧道类型设置为“快速隧道(临时)”
  4. 等待隧道URL出现
  5. 启用“要求身份验证”并复制您的MCP URL

URL看起来像: https://random-words.trycloudflare.com/mcp?token=xxx

选项B:命名隧道(永久URL)

命名隧道为您提供自己域上的永久URL。需要一个免费的Cloudflare帐户。

步骤1:在Cloudflare中创建隧道

  1. 注册地址: Cloudflare零信任
  2. 首选 网络→ 隧道
  3. 点击 创建隧道
  4. 选择 云雾缭绕 作为连接器类型
  5. 命名您的隧道(例如,“目击者”)
  6. 在“安装连接器”页面上, 复制隧道令牌 (长 eyJh... 字符串)
  7. 跳过连接器安装(Witness会自动处理此问题)
  8. 添加一个 公共主机名:
    • 子域:例如。, witness
    • 域名:选择您的域名(例如。, example.com)
    • 服务类型: HTTP
    • 网址: localhost:3456 (或您在见证设置中设置的任何端口)
  9. 保存隧道

步骤2:配置见证

  1. 转到黑曜石设置→ 见证
  2. 设置MCP服务器端口以匹配您的隧道配置(例如。, 3456)
  3. 切换“启用隧道”
  4. 将隧道类型设置为 “命名隧道(永久)”
  5. 粘贴您的 隧道令牌 来自Cloudflare
  6. 集 隧道URL 到您的公共主机名(例如。, https://witness.example.com)
  7. 启用“要求身份验证”(推荐)
  8. 点击“复制URL”以获取完整的MCP URL

第三步:连接克劳德

在MCP客户端配置中使用隧道URL:

{
  "mcpServers": {
    "witness": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://witness.example.com/mcp?token=YOUR_TOKEN",
        "--transport",
        "http-only"
      ]
    }
  }
}

这适用于Claude Desktop、Claude.ai web和Claude mobile。

多个设备(黑曜石同步)

如果使用黑曜石同步在多台计算机上同步保管库,则见证插件设置也会同步,包括隧道令牌。如果没有预防措施,每台机器都会尝试启动隧道,Cloudflare会不可预测地在它们之间循环流量。

为了防止这种情况,Witness有一个 主要机器 特点:

  1. 打开黑曜石设置→ 在你想运行隧道的机器上作证
  2. 在“命名隧道设置”下,单击 “设置为主”
  3. 这将保存机器的主机名——只有这台机器将启动隧道
  4. 在其他机器上,隧道在启动时会自动跳过

要将主计算机切换到其他计算机,请打开该计算机上的见证设置,然后单击“设置为主计算机”。要完全清除限制,请单击 ✕ 主主机名旁边的按钮。

移动设备

隧道和MCP服务器功能如下 仅限桌面。黑曜石手机(iOS/Android)无法运行HTTP服务器或cloudflared二进制文件。要从移动设备访问您的保险库,请从客户端应用程序(例如Claude mobile)连接到隧道URL——保险库由运行隧道的任何台式机提供服务。

安全说明

  • 身份验证令牌包含在URL查询参数中。HTTPS在传输过程中对此进行加密,但在共享URL或记录URL时要谨慎。
  • 为了提高安全性,令牌也可以通过以下方式传递 Authorization: Bearer xxx header而不是查询参数。
  • 这 cloudflared 二进制文件会自动下载并存储在 ~/.witness/bin/.

语义搜索

Witness提供语义搜索,由 奥拉玛 用于本地嵌入和 奥拉马 用于矢量存储。一切都在本地运行-没有云服务,没有API密钥。

先决条件

  1. 安装Ollama:从下载 ollama.com

  2. 拉取嵌入模型:

    ollama pull nomic-embed-text    # Good default (768 dims, 2048 token context)
    ollama pull mxbai-embed-large   # Higher quality (1024 dims, 512 token context)
    

    您还可以直接从见证设置页面中提取模型。

  3. 构建索引:打开见证设置→ “搜索”选项卡→ 单击“构建索引”

搜索模式

这 search MCP工具(和搜索面板)支持三种模式:

  • 混合 (默认):将QPS关键字匹配与向量余弦相似度相结合。最适合大多数查询——通过语义理解的召回来获得关键字的准确性。
  • 矢量:纯粹的语义相似性。查找概念上相关的文档,即使它们不共享关键字。适合探索性查询,如“关于改善睡眠质量的笔记”。
  • 全文:纯QPS(量子邻近评分)关键字匹配。当你知道确切的术语时,快速准确。不需要嵌入。通过象征性的接近度得分——相邻单词的“碳强度”排名高于分散出现的单词。

支持的嵌入模型

型号 尺寸 上下文 前缀 注释
nomic-embed-text 768 2048个令牌 两者都有(必填) 默认值良好。需要 search_document: / search_query: 前缀——自动处理。
mxbai-embed-large 1024 512个令牌 仅限查询 更高质量的嵌入。需要查询前缀--自动处理。
all-minilm 384 256个令牌 无 最小且最快。短上下文窗口。
bge-m3 1024 8192个标记 无 最长的上下文--最适合非常长的文档。
bge-large 1024 512个令牌 无 质量好,不需要前缀。
snowflake-arctic-embed 384 512个令牌 仅限查询 紧凑型,质量不错。

任务前缀 是添加到输入文本前的特殊字符串,用于告诉模型是处理文档进行存储还是处理查询进行搜索。见证人通过以下方式自动处理此问题 embedDocuments() 和 embedQuery() --您不需要手动添加前缀。使用错误的前缀(或在需要前缀时不使用前缀)会在错误的向量空间中产生嵌入,使相似性得分毫无意义。

上下文长度和截断

每个嵌入模型都有一个以令牌为单位的最大上下文窗口。超过此长度的文档在嵌入之前会被截断。见证人会自动处理此问题:

  1. 动态分辨率:在启动时,Witness询问Ollama的 /api/show 端点,用于获取模型的实际架构上下文长度
  2. 客户端预截断:作为安全网,文本被截断为 context_tokens × 2 发送给Ollama之前的字符数(2的系数是保守的每个令牌字符数估计值)
  3. 服务器端截断:奥利玛的 truncate: true 参数提供了第二个安全网

重要:重要的上下文长度是模型的 建筑 上下文长度(例如。, nomic-bert.context_length: 2048), 不 模型文件 num_ctx 参数(可以是8192,但不扩展嵌入上下文)。这种区别让我们大吃一惊——nomic嵌入文本报告 num_ctx 8192 但只能嵌入2048个令牌。

具有大量JSON、HTML、URL或非ASCII内容的文档标记效率较低(每个标记低至约1.5个字符,而英语散文的典型标记为约4个字符)。保守的 CHARS_PER_TOKEN = 2 解释了这一点。

为什么要过滤短文档?

非常短的文档(例如,只包含一个单词如“gold”的文件)会产生 通用嵌入 它们位于向量空间的中心附近。因为它们缺乏独特的内容,所以它们最终与所有东西等距——余弦相似性在任何查询中都给它们带来了惊人的高分。

这 最小内容长度 设置(默认值:50个字符)在索引时过滤掉这些字符。这是在不改变嵌入模型的情况下提高搜索质量的最有效设置。

您可能希望提高此阈值的迹象:

  • 搜索结果包括存根页、空模板或占位符文件
  • 相同的短文档出现在无关查询的结果中
  • 矢量搜索返回的结果明显比全文差

指数持久性

索引存储在 .witness/index.orama 作为单个JSON文件存储在vault中。它包含一个模式版本号——当模式更改时(例如,添加新字段时),旧索引会自动丢弃,并在下次使用时触发完整的重新索引。

强制完全重新索引:设置→ 搜索→ 清除索引→ 构建索引。

示例命令

连接到Claude Desktop后,您可以问:

  • “显示我混乱/收件箱文件夹中的所有文件”
  • “阅读我每日笔记的内容”
  • “按照[主题]的顺序/知识创建新笔记”
  • “列出我保管库中的所有标记文件”

发展

建筑

npm run build          # Production build
npm run dev            # Development mode with watch

测试

# Build and install plugin in test vault
npm run test:install-plugin

# Start Obsidian with test vault
npm run test:start-obsidian

# Run integration tests (47 tests)
npm test

# Check server status
curl http://localhost:3000/health

日志

MCP服务器日志将写入vault的插件文件夹:

.obsidian/plugins/witness/logs/mcp-YYYY-MM-DD.log

这使得以下操作变得容易:

  • 共享错误报告日志
  • 在没有开发人员控制台的情况下调试问题
  • 让AI助手直接读取日志

其他日志位置:

  • 黑曜石控制台: Cmd+Option+I → 控制台选项卡
  • 克劳德桌面: ~/Library/Logs/Claude/mcp-server-witness.log

故障排除

插件无法加载

  1. 检查黑曜石控制台是否有错误
  2. 验证文件是否位于正确位置: .obsidian/plugins/witness/
  3. 尝试禁用并重新启用插件

Claude Desktop无法连接

  1. 检查MCP服务器是否正在运行:

    curl http://localhost:3000/health
    # Should return: {"status":"ok","plugin":"witness"}
    
  2. 检查克劳德桌面日志:

    tail -f ~/Library/Logs/Claude/mcp-server-witness.log
    
  3. 验证Node.js版本:

    node --version  # Should be 20.x or higher
    

MCP服务器断开连接(macOS睡眠)

如果MCP服务器在一段时间不活动后无法访问,则您的Mac可能正在休眠并断开网络连接。检查您当前的电源设置:

pmset -g

按键设置为 networkoversleep --如果是 0,macOS在睡眠期间会断开所有网络连接,从而杀死远程客户端的MCP服务器。

修复:在睡眠期间启用网络访问

sudo pmset -a networkoversleep 1

保持服务器可访问的其他有用电源设置:

# Prevent system sleep on AC power
sudo pmset -c sleep 0

# Enable Wake on LAN (allows remote wake)
sudo pmset -c womp 1

# Disable Power Nap (can interfere with network stability)
sudo pmset -c powernap 0

快速修复:暂时保持清醒

如果您不想永久更改系统设置,请运行 caffeinate 在终端中:

# Prevent idle and system sleep (Ctrl+C to stop)
caffeinate -si

# Or run in the background
caffeinate -si &

关键pmset设置

设置 值 效果
networkoversleep 1 在睡眠期间保持网络活动
womp 1 启用LAN唤醒
tcpkeepalive 1 在睡眠期间保持TCP连接
sleep 0 禁用系统睡眠(交流电源: -c)
powernap 0 禁用电源小睡

端口已在使用中

如果端口3000被占用:

  1. 打开黑曜石设置→ 见证
  2. 更改端口号(例如3001)
  3. 更新您的Claude Desktop配置以匹配

建筑

Witness在Obsidian的Electron进程中运行一个HTTP服务器:

Claude Desktop (MCP Client)
    ↓ stdio
mcp-remote bridge
    ↓ HTTP + SSE
Witness Plugin (MCP Server)
    ↓ Direct API
Obsidian Vault

这与其他在外部运行并通过REST API连接的黑曜石MCP服务器不同。Witness可以直接访问Obsidian的内部API,以获得最大的可靠性和性能。

路线图

第一阶段:MCP服务器✅

  • [x] 基础插件脚手架
  • [x] HTTP服务器实现
  • [x] 文件操作(读、写、列表、编辑)
  • [x] Claude桌面集成
  • [x] 全文搜索
  • [x] 命令执行
  • [x] 定向文件系统
  • [x] 基于文件的日志记录
  • [x] 集成测试套件(47个测试)

第二阶段:远程访问✅

  • [x] Cloudflare快速隧道集成
  • [x] Cloudflare命名隧道支持(永久URL)
  • [x] 多设备同步的主机名称
  • [x] 远程访问的令牌身份验证
  • []WhatsApp/电报机器人
  • []多用户会话

第三阶段:语义搜索✅

  • [x] 通过Ollama进行本地嵌入(nomic嵌入文本、mxbai嵌入大等)
  • [x] Orama矢量存储,具有混合(BM25+矢量)、仅矢量和全文模式
  • [x] 实现最佳检索质量的特定于模型的任务前缀
  • [x] 通过Ollama解析动态模型信息 /api/show
  • [x] 客户端预截断以确保上下文长度安全
  • [x] 针对短文档噪声的最小内容长度过滤器
  • [x] 使用文件夹选择器UI排除文件夹
  • [x] 搜索面板侧边栏视图
  • [x] 带模型拉取和实时索引进度的标签设置UI
  • [x] 在4097文件库上测试

数据视图集成✅

  • [x] dataview_query MCP工具(标记+JSON输出)
  • [x] read_file 用于解析Dataview代码块的呈现参数
  • [x] get_vault_context 自动呈现Dataview查询
  • [x] 8集成测试

混沌分类✅

  • [x] get_next_chaos 工具(单列表模式、队列计数、优先级排序)
  • [x] mark_triage 工具(已处理、延迟、确认、下一步、重置)
  • [x] 安全前沿更新通过 processFrontMatter API
  • [x] AI护栏:仅创建 write_file,改善 edit_file 错误

混沌队列面板✅

  • [x] 带有基于卡片的UI的可视化侧边栏(标题、路径、智能片段)
  • [x] 带有可折叠部分的“Next Up”和“Queue”组
  • [x] 仅悬停操作按钮(确认、标记下一步、移动到死亡、重置)
  • [x] 批量编辑模式,包括全选、批量确认、批量移动到死亡
  • [x] 10个键盘命令(分流操作、兄弟导航、面板切换)
  • [x] 具有冲突检测功能的设置中的内联热键捕获
  • [x] 混乱文件和文件夹的文件资源管理器上下文菜单
  • [x] 动作后导航(移动到死亡后的下一个兄弟文件)
  • [x] Live vault事件侦听器(从面板中删除已删除/重命名的文件)

第四阶段:情报

  • []心跳调度程序(每日/每周提示)
  • []混沌监测(检测陈旧项目)
  • []聪明的建议
  • []自动分类

阶段5:高级功能

  • []图形分析
  • []模板系统
  • []工作流自动化

贡献

欢迎投稿!该项目正处于积极的早期开发阶段。

指南

  • 保持简单和专注
  • 保持对其他插件的零依赖
  • 测试包含 test-vault/
  • 遵循现有代码样式

许可证

麻省理工学院

致谢

  • 建立在 模型上下文协议 通过Anthropic
  • 受Zettelkasten和PARA方法的启发
  • 感谢黑曜石社区提供这个令人惊叹的平台

支持


“预测未来的最好方法就是发明它。”-艾伦·凯