使用说明
🧠 黑曜石MCP服务器
将您的黑曜石库转换为Claude Desktop的结构化上下文源
📚 技术深度潜水: 阅读完整的开发历程 --研究笔记、设计决策和迭代历史。
为什么存在
黑曜石拱顶是我的知识所在。但是,将它们连接到LLM需要的不仅仅是“读取文件”,您还需要 vault感知会话, 基于航向的导航,以及 令牌高效搜索 这不会破坏你的上下文窗口。
此MCP服务器通过将黑曜石保险库视为 一流数据源 对于LLM,使用围绕markdown实际工作原理设计的工具(基于结构,而不是基于行号)。
✨ 主要特点
🗂️ 多保险库会话管理
- 在中配置多个保管库
vaults.yaml(个人、工作、研究等) - 在对话中切换活动保险库: “使用我的工作保险库”
- 跨工具调用的会话感知上下文跟踪
🎯 结构感知编辑
传统的文件操作使用行号。Markdown使用 标题.
## Project Ideas
Some content here
### Idea 1
Details about idea 1
## Resources
Links and references
使用此服务器:
insert_after_heading("Project Ideas")→ 在正确的语义位置添加内容replace_section("Idea 1")→ 仅更新该小节delete_section("Resources")→ 删除标题+所有内容,直到下一个相同级别的标题
🔍 代币高效搜索
搜索10条内容完整的笔记: 约50000个代币 💸
使用上下文片段搜索: 约1500个代币 ✅
# Returns 3 snippets per match, ~200 chars each
search_obsidian_content("MCP server design patterns")
克劳德获得了足够的上下文来理解比赛,而不会消耗你的代币预算。
🏷️ 前线指挥控制
- 读取、合并、替换或删除YAML frontmatter,而无需触摸笔记正文
- 强制模式验证(大小限制、UTF-8、YAML安全类型)
- 专为标签管理和模板验证等未来自动化而设计
🚀 快速开始
先决条件
- Python 3.11+
- 克劳德桌面
- 一个或多个黑曜石拱顶
安装
# Clone the repository
git clone https://github.com/nbaradar/obsidian-mcp-server.git
cd obsidian-mcp-server
# Install dependencies with uv (recommended)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r requirements.txt
配置
- 创建
vaults.yaml在项目根目录中:
default: personal
vaults:
personal:
path: "/Users/you/Documents/PersonalVault"
description: "Primary personal vault"
work:
path: "/Users/you/Documents/WorkVault"
description: "Work projects and documentation"
- 添加到Claude桌面配置 (
~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"obsidian": {
"command": "/absolute/path/to/.venv/bin/python",
"args": [
"/absolute/path/to/obsidian-mcp-server/server.py"
]
}
}
}
- 重新启动克劳德桌面
你应该看看”🔌 使用您的黑曜石工具在Claude Desktop中创建“MCP”。
🎬 它看起来像什么
配置后,您将在Claude Desktop中看到您的黑曜石工具:
22种工具可用于多保险库笔记管理,具有标题感知操作
此外,您也可以使用您偏好的MCP客户端!在这里,我在代理模式下使用VSCode和Copilot。
关于如何将VSCode连接到MCP的更多细节, 查看这里
您甚至可以将其与您自己的本地LLM模型一起使用!我在这里跑步 qwen3-14b 使用 LM 工作室
📖 用法示例
基本操作
User: "Create a note called 'Project Ideas' in my personal vault"
Claude: [uses create_obsidian_note]
User: "Switch to my work vault and list all notes"
Claude: [uses set_active_vault, then list_obsidian_notes]
User: "Search for notes about 'machine learning'"
Claude: [uses search_obsidian_content for snippets]
高级:结构化编辑
User: "In my 'Meeting Notes' file, add today's standup under the 'Daily Standups' heading"
Claude: [uses insert_after_heading_obsidian_note]
User: "Replace the 'Action Items' section with..."
Claude: [uses replace_section_obsidian_note]
User: "Add a summary paragraph at the end of 'Project Updates' before any subsections"
Claude: [uses append_to_section_obsidian_note]
User: "What’s the most recent note in my Mental Health folder?"
Claude: [uses list_notes_in_folder("Mental Health", include_metadata=True, sort_by="modified")]
🛠️ 可用工具
管理
| 工具 | 目的 |
|---|---|
list_vaults |
发现已配置的保管库和当前会话状态 |
set_active_vault |
切换活动保险库以进行后续操作 |
核心业务
| 工具 | 目的 |
|---|---|
create_obsidian_note |
创建新的markdown文件 |
retrieve_obsidian_note |
阅读完整笔记内容 |
replace_obsidian_note |
覆盖整个文件 |
append_to_obsidian_note |
将内容添加到末尾 |
prepend_to_obsidian_note |
将内容添加到开头 |
delete_obsidian_note |
删除文件 |
move_obsidian_note |
移动或重命名注释(可选反向链接更新) |
结构化编辑
| 工具 | 目的 |
|---|---|
insert_after_heading_obsidian_note |
在标题下方插入内容 |
append_to_section_obsidian_note |
将内容附加到子章节之前的标题部分 |
replace_section_obsidian_note |
替换标题下的内容 |
delete_section_obsidian_note |
删除标题及其部分 |
前台
| 工具 | 目的 |
|---|---|
read_obsidian_frontmatter |
仅返回YAML frontmatter块 |
update_obsidian_frontmatter |
将字段合并到现有frontmatter中 |
replace_obsidian_frontmatter |
覆盖整个frontmatter块 |
delete_obsidian_frontmatter |
完全拆除前体块 |
发现
| 工具 | 目的 |
|---|---|
list_obsidian_notes |
列出所有注释,可选择包括元数据 |
search_obsidian_notes |
搜索笔记标题(支持元数据+排序) |
list_notes_in_folder |
目标文件夹列表(元数据+递归支持) |
search_obsidian_content |
令牌高效内容搜索 |
search_notes_by_tag |
基于标记的令牌高效搜索 |
按需元数据:
list_obsidian_notes,search_obsidian_notes,以及list_notes_in_folder接受include_metadata=True附加ISO时间戳和文件大小。旗帜大致加起来 每张纸币9个代币,因此请在广泛的列表中禁用它,并在需要“最新”时启用它 或“最大音符”风格的查询。
🧭 内部架构
从v1.4.3开始,代码库使用 模块化封装结构 为了更好的可维护性和可测试性:
obsidian_vault/
├── core/ # Pure business logic (NO MCP dependencies)
│ ├── vault_operations.py # Path validation and sandboxing
│ ├── note_operations.py # Note CRUD operations
│ ├── search_operations.py # Search and discovery
│ ├── section_operations.py # Heading-based manipulation
│ └── frontmatter_operations.py # YAML frontmatter ops
│
├── tools/ # MCP tool wrappers (thin layer)
│ ├── vault_tools.py # Vault management tools
│ ├── note_tools.py # Note CRUD tool wrappers
│ ├── search_tools.py # Search tool wrappers
│ ├── section_tools.py # Section tool wrappers
│ └── frontmatter_tools.py # Frontmatter tool wrappers
│
├── server.py # FastMCP server initialization
├── config.py # Configuration loading (vaults.yaml)
├── session.py # Per-session active vault tracking
└── models.py # Data models (VaultMetadata, etc.)
主要优势:
- 关注点分离:核心逻辑与MCP无关,可以独立测试
- 单一责任:每个模块都有一个明确的目的
- 可扩展性:通过扩展核心模块、工具包装器自动注册添加新功能
- 可测试性:核心模块可以在没有MCP服务器基础设施的情况下进行单元测试
数据流:
- MCP工具包装器接收请求(处理上下文、vault解析)
- 调用相应的核心操作(纯业务逻辑)
- 核心操作返回结构化数据
- MCP客户端的工具包装器格式响应
🏗️ 设计原则
1. 代币效率优先
每个工具都旨在最大限度地减少上下文窗口的使用:
- 基于片段的搜索与完整内容检索
- 在完整文件读取过程中基于标题的导航
- 通过多个工具调用进行组合操作
| 任务 | 天真 | 此服务器 | 节省 |
|---|---|---|---|
| “在中查找最新笔记 心理健康“ | ~60000个代币 | ~450个代币 | ~99% |
| “查找最大的文件” | ~30万个令牌 | ~850个令牌 | ~97% |
2. Markdown原生操作
传统编辑器使用行号。这与注释编辑无关。 语义锚 (标题)在内容变化时保持稳定。
3. 会话感知上下文
克劳德可以在谈话中在保险库之间切换,而不会失去状态。
4. MCP建筑商合规性
所有工具均遵循 MCP构建器技能 格式--单行摘要→ 解释→ 参数→ 返回模式→ 使用/不使用——使用指导。
5. 日志记录和调试
服务器使用Python logging (stderr/file)用于所有操作:vault开关、CRUD事件、帮助程序调用和错误。
- 日志存储在
~/Library/Logs/Claude/在Claude Desktop下运行时。 - 避免
print()--它破坏了STDIO JSON-RPC流。 - 令牌成本跟踪挂钩(即将推出)将记录每次操作的令牌估计值,以便进行调试。
6. 错误处理原理
优雅、描述性和安全:
- 缺少注释/路径错误→ 建议正确的工具或路径。
- YAML格式错误→ 报告确切的行/类型。
- 保险库或文件系统错误→ 引用配置路径。
- 破坏性操作总是得到客户的确认。
🧪 测试总结
在多个真实保管库和自动化套件中验证实施。
- 27个标签搜索测试,涵盖格式处理、不区分大小写、元数据排序、嵌套文件夹、AND/OR语义、性能和异步MCP集成。
- 4个路径规范化回归测试,确保虚线注释标题、嵌套路径、大写
.MD,遍历拒绝行为如预期。 - 测试命令:
PYTHONPATH=. uv run --with pytest --with pytest-asyncio pytest tests/test_path_normalization.py tests/test_tag_search.py
🌿 前台规则
Frontmatter工具仅在YAML块上运行,以保存令牌并避免不必要的内容重写。
- 验证UTF-8和YAML安全类型;拒绝格式错误或过大的元数据。
- 默认情况下合并语义(保留未知键)。
- 专为未来的标签自动化和模板验证而设计。
🔌 远程访问(计划)
目前运行通过 工作室 (仅限本地)。未来版本将支持 HTTP传输 用于根据MCP规范具有可选身份验证的远程客户端。
🚧 已知限制
- 目前还没有基于正则表达式或属性/frontmatter的搜索。
- 没有SQLite索引或缓存。
- 无图像/附件管理。
- 无反向链接维护(移动/重命名时的链接更新除外)。
- 无HTTP传输或身份验证(仅限STDIO)。
- 从v1.4.2开始,完全支持带圆点的注释标题;
_normalize_note_identifier在执行沙盒规则的同时保留内部段。
🗺️ 路线图
- [x] v1.0 --核心CRUD操作
- [x] v1.1 --令牌高效内容搜索
- [x] v1.2 --基于结构化标题的编辑
- [x] v1.3 --改进Vault导航
- [x] v1.4 --前端操纵+标签搜索
- [x] v1.4.1 --标签搜索工具优化(已完成)
- [x] v1.4.2 --在中保留虚线注释标识符
_normalize_note_identifier - [x] v1.4.3 --重构代码库结构
- [x] v1.5 --用于输入验证的Pydantic数据模型
- [ ] v1.6 --Vault感知提示资源
- [ ] v1.6.1 --Vault特定模板
- [ ] v2.0 --用于远程访问的HTTP传输
看 AGENTS.md 详细的开发说明和架构决策。
📚 文档
- 发展历程 --完整的技术报告,包括研究笔记、调试故事和设计迭代
- MCP概述 --我对模型上下文协议的研究笔记
- 构建您的第一台MCP服务器 --分步指南
🤝 贡献
该项目正在积极开发中。欢迎投稿、问题和功能请求!
特别感兴趣的是:
- 在Windows/Linux上进行测试(目前以Mac为重点)
- 其他保险库来源(Notion、Roam等)
- 大型金库(10k+纸币)的性能优化
📄 许可证
MIT许可证-请参阅 许可证 了解详情。
🙏 致谢
内置:
Built because context matters, and Obsidian is where mine lives.