使用说明
黑曜石MCP服务器
obsidian-mcp-server是本地优先MCP服务器,AI代理可以查看Obsidian Vault的Markdown文档、筛选相关依据并将其压缩到上下文中。
在本项目中,RAG不表示选择特定的矢量数据库或搜索引擎。RAG在Vault中查找候选文档,选择Agent操作的依据,并根据上下文窗口进行压缩。 代理上下文管道是。
核心方向
- 本地优先行为:在用户机器上执行Vault搜索和上下文准备,无需外部服务或需要单独运行的搜索引擎。
- 上下文筛选:将关键字搜索和语义搜索相结合,查找要提供给Agent的候选依据。
- 显式RAG集成:不在所有提示中添加后台搜索,而是在有Vault相关命令或工具参考时打开上下文收集路径。
- 节省代币:比起推送整个原文,excerpt、evicence snippet、
memory_packet压缩为形状。 - 基于本地模型的搜索:
@huggingface/transformers,使用LanceDB和local reranker在本地执行semantic retrieval。
Elasticsearch等搜索引擎也是可作为retrieval backend的替代方案。但是,此项目的默认目标是本地单独操作,不依赖外部服务或单独的搜索引擎,因此选择embedded retrieval stack作为默认值。
提供的功能
MCP工具
vaultsearch:结合关键字和基于语义的搜索进行混合候选搜索read:查看特定笔记正文和元数据list_all:查看Vault文档列表stats:查看Vault和索引状态collect_context:选择与主题相关联的文档memory_packet创建load_memory:加载已保存的上下文内存快照
generate_property:基于文档内容创建frontmatter候选write_property:frontmatter写入create_document_with_properties:分析文档后创建/写入属性的步骤2工作流organize_attachments:整理文档中的附件并更新链接
检索流水线
当前默认retrieval backend按以下顺序工作:
- 关键词搜索:内部
Indexer查找正确的单词匹配候选项。 - 向量搜索:查找与LanceDB在语义上与本地embedding model相似的区块。
- RRF融合:将关键字结果与向量结果的排名相结合。
- 本地重新排名:用reranker重新评估父候选人。
- 压缩:仅提供所需的exerct、source ref和memory packet作为Agent context。
如果未安装本地embedding/reranking模型,服务器将回退到关键字搜索。
安装
需求
- Node.js 22或更高版本
- 可访问的Obsidian Vault绝对路径
MCP服务器安装和型号准备
npx @sunub/obsidian-mcp-server setup
此命令将在缓存中安装本地semantic search和reranking所需的模型。
在已安装软件包的环境中,也可以执行以下操作:
obsidian-mcp-server setup
如果没有安装模型,默认关键字搜索将起作用,但不能使用semantic search和reranking质量。
MCP客户端设置
在Claude Desktop、Cursor、Copilot等MCP客户端上注册:
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "@sunub/obsidian-mcp-server@latest"],
"env": {
"VAULT_DIR_PATH": "/Users/username/Documents/MyVault"
}
}
}
}
VAULT_DIR_PATH必须更改为自己的Vault绝对路径。
环境变量
| 环境变量 | 默认值 | 用途 | 必需 |
|---|---|---|---|
VAULT_DIR_PATH |
无 | Obsidian Vault绝对路径 | 是 |
LOGGING_LEVEL |
info |
debug, info, warn, error 否 |
|
LLM_API_URL |
http://127.0.0.1:8080 |
CLI UI使用的OpenAI兼容的本地LLM端点 | 使用CLI |
LLM_CHAT_MODEL |
llama3 |
CLI UI答案生成模型名 | 使用CLI时 |
MCP服务器上的Vault搜索/读取工具包括: VAULT_DIR_PATH是核心设置。 LLM_API_URL和 LLM_CHAT_MODEL在存储库中包含的用于开发的CLI UI中接收交互式流式处理答复时需要。
用于开发的CLI AI Agent UI
此存储库包含基于终端的AI Agent UI。此CLI公开npm包 bin而是在存储库开发环境中运行的入口点。
此CLI的目的不仅仅是搜索Obsidian Vault。 调用MCP工具, 有条件的基于RAG的上下文收集, OpenAI兼容的LLM端点流响应将组织为一个交互式工作流。也就是说,不仅仅是实现简单的“聊天UI”,而是连接Vault、工具和模型之间 协调层是。
为什么需要此CLI
根据项目的文档和设计方向,创建此CLI是为了解决或缓解以下问题:
- 减少对外部AI服务的依赖:由于项目涉及本地Vault和本地工具,我们希望尽可能在本地运行环境中独立工作。
- 减少上下文丢失:在触发Vault相关工具的问题中,您可以收集相关文档并进行摘要,并将其发送给LLM。
- 减少令牌浪费:
collect_context通过基于压缩摘要和批量输入卸载,不会将长文档或大paste直接推送到模型中。 - 提高终端输入的可靠性:控制基于Raw mode的输入环境中的paste storm、多个Enter触发器和缓冲区污染等问题。
- 确保长时间会话的稳定性:通过取消流、历史剪枝和scrollback委派等结构减少内存使用和渲染负担。
此CLI所做的工作
1.交互式AI界面
用户在终端上以自然语言输入问题,CLI与LLM服务器通信并流式传输答案。
- 实时输出响应。
- 如果模型有thinking区域,中间推论状态也将单独呈现。
- 完成的对话将反映在历史记录中,正在进行的响应将单独进行
pending按状态管理。
2.MCP工具运行界面
CLI允许终端直接使用连接到MCP服务器的工具。
/search,/read,/stats,/context,/tools提供相同的斜线命令。- 除了用户的显式命令外,LLM还提供了一个循环,可以在创建tool call时执行该循环。
- 连接到多个MCP服务器,同时管理每个服务器的工具列表和连接状态。
3.有条件地基于RAG的上下文注入
此CLI不会自动对所有常见问题执行RAG。根据目前的实施标准,在输入文本中 vault 仅在触发工具或相关服务器/工具名称时,才尝试收集Vault上下文。 <context> 整理成块并输入提示。
collect_context使用动作以批处理单位收集相关文档。memory_packet将和高关联文档excerpt组合起来配置LLM输入。- 因此,与其说此CLI始终是带有RAG的聊天窗口,不如说它是。 代理UI在需要时执行Vault-aware操作接近。
4.优化大容量输入
粘贴长代码、日志和文档后,将安全地折叠/卸载,而不是将其原封不动地发送到模型。
- 大的paste作为临时文件分开保存。
- 向LLM传达文件位置、预览和处理指令,而不是整个正文。
- 这种方法可以减少令牌的使用量,并只在需要时通过工具读取原文。
5.以流媒体为中心的用户体验
CLI UI的设计重点不是响应结束后一次性显示的结构,而是立即显示正在创建的状态的流程。
- 输入后立即清空缓冲区,以准备以下任务:
- 第一个令牌之前显示thinking/processing状态。
- 完成的记录将被转移到静态区域,仅动态地重新呈现当前响应。
主要执行流
- 用户输入消息或斜杠命令。
- 在问题内容中触发Vault相关工具时,将尝试收集相关上下文。
- 启动LLM流媒体请求。
- 必要时调用MCP工具。
- 实时输出响应。
- 将完成的结果反映在历史记录中,并等待以下输入:
在体系结构方面的作用
区域角色代表文件
| --- | --- | --- |
|启动和环境检查| LLM端点检查,初始加载程序/错误屏幕控制| AppContainer.tsx, ui/LLMHealthChecker.tsx, ui/LLMStatusLoader.tsx |
|管理MCP连接|基于配置文件的MCP服务器连接,收集工具列表,管理多服务器状态| hooks/useMcpManager.ts, services/McpClientService.ts, config/mcpServersConfig.ts |
|输入系统|原始密钥处理、paste缓冲、多行编辑、历史浏览| context/KeypressContext.tsx, ui/InputPrompt.tsx, key/ |
|命令派遣|将斜杠命令转换为MCP工具调用| hooks/useDispatcher.ts |
|收集RAG上下文|仅从触发Vault相关工具的问题收集上下文并将其注入提示符| hooks/useRagContext.ts |
|LLM流循环|流响应,运行tool call,解析thinking | hooks/useLlmStream/useLlmStream.ts |
|渲染和会话管理|历史输出、pending响应显示、transient UI消息管理| ui/MainContent.tsx, hooks/useHistoryManager.ts |
|批量输入优化|大粘贴输入卸载和临时文件清理| services/InputOffloadService.ts |
设计原则
此CLI的设计原则如下:
- 分离输入和渲染
- 流优先UX
- 基于配置文件的MCP连接
- 集成工具调用和对话流
- 优化令牌/内存效率
- 确保可中断性和可恢复性
提供的主要命令
根据当前代码,内置的代表性斜杠命令行如下:
/search <keyword>:Vault混合搜索/read "filename":查看特定文档/semantic <query>:语义搜索/stats:检查Vault状态/index:更新矢量索引/context <topic>:基于主题的上下文收集/organize <keyword>:运行附件清理工具/genprop <filename>:调用frontmatter生成工具/tools:检查连接的MCP工具列表/help:显示帮助/clear:初始化屏幕/对话状态/quit,/exit:退出CLI
执行方法
当前CLI入口点为 存储库开发环境的运行方式是。包的 bin 条目用于MCP服务器,CLI UI作为单独的脚本在根目录下运行。
从存储库根目录安装依赖性,并首先构建服务器。
npm install
npm run build
默认情况下,此存储库根目录为 mcp-servers.json包括: node ./build/index.js使用运行服务器。
然后运行兼容OpenAI的本地LLM服务器。例如, llama.cpp的 llama-server被 8080 可以放到端口上。
llama-server -m /path/to/model.gguf --port 8080
CLI按如下方式注入并运行环境变量:
VAULT_DIR_PATH="/Users/username/Documents/MyVault" \
LLM_API_URL="http://127.0.0.1:8080" \
LLM_CHAT_MODEL="llama3" \
npm run cli
MCP配置文件
CLI在运行时按顺序在当前工作目录中查找以下文件:
mcp-servers.json.mcp-servers.json
如果没有配置文件,将尝试基于环境变量的回退,但最安全的执行方式是 在存储库根目录中, build/index.js以就绪状态运行。
运行时需要注意的事项
- 此CLI的运行方式包括: 用于开发的CLI UI入口点 标准。已部署
npx @sunub/obsidian-mcp-server只启动MCP服务器,不运行CLI UI。 - CLI要连接到MCP服务器,请使用
mcp-servers.json或.mcp-servers.json必须有效。 VAULT_DIR_PATH如果未找到或无效,Vault相关工具将不起作用。- 要使用semantic search和reranking,请使用服务器
setup必须使用安装本地模型。
注意事项
VAULT_DIR_PATH如果未找到或无效,Vault相关工具将不起作用。- 使用semantic search和reranking
setup必须使用安装本地模型。 - 要使用CLI UI,必须运行独立的符合OpenAI的本地LLM服务器。
- CLI的显式RAG
vault只有在输入中触发相关命令、服务器名和工具名时,才会尝试收集上下文。 collect_context适合长主题整理和内存数据包创建,短查询search我read更简单。- 写入系列工具阻止写入Vault外部路径。
参考文档
许可证
阿帕奇-2.0
