MCP与Obsidian
2034 字约 7 分钟
AIAgentMCPObsidian
2026-07-24
MCP 可以为 Obsidian Vault 提供结构化的 AI 工具能力,使 Agent 能够安全地搜索、读取、创建、修改和管理知识库内容。核心挑战在于:Obsidian 本质上是文件系统上的 Markdown 集合,既要让 AI 充分利用其结构化特性,又要防止不受控的写入破坏知识库完整性。
一句话解释
MCP 将 Obsidian Vault 暴露为一组受控的工具接口,让 Agent 通过语义化操作(而非任意文件读写)与知识库交互。
核心问题
Obsidian Vault 的特殊性带来几个关键问题:
- 非结构化 vs 结构化:Vault 底层是文件系统,但上层依赖 wikilink、tag、frontmatter 构成语义网络。MCP 工具应理解哪一层?
- 全局影响:一次错误的批量写入可以破坏数百条笔记和数千条链接。
- 并发与同步:用户可能同时在 Obsidian 中编辑,git 同步可能在后台运行。
- 路径安全:同名笔记存在于不同目录时,如何无歧义地定位?
Obsidian Vault 结构
理解 MCP 与 Obsidian 的交互,需要先理解 Vault 的核心组成:
| 组成 | 说明 | MCP 相关操作 |
|---|---|---|
| Markdown 文件 | .md 文件是笔记的载体 | 读取、创建、更新 |
| YAML frontmatter | 文件头部的元数据块 | 读取/更新属性 |
内部链接 wikilink | 笔记间的语义连接 | 链接分析、链接修复 |
| 标签 (tags) | frontmatter 或行内的分类标记 | 标签管理、过滤搜索 |
| 嵌入 (embeds) |  或  | 依赖解析、内容展开 |
| 附件 (attachments) | 图片、PDF 等非 Markdown 文件 | 路径管理、引用检查 |
| Canvas | .canvas JSON 文件 | 节点增删、布局操作 |
| 插件数据 | .obsidian/plugins/ 下的配置与数据 | 通常不应被 MCP 修改 |
设计原则
核心约束:不应让模型直接使用任意文件写入能力修改整个 Vault,应通过限定路径、原子操作、差异预览和回滚机制控制风险。
原则一:操作语义化,而非文件原始化
MCP 工具应暴露高层语义操作,而非让 Agent 直接拼接文件路径和内容:
✅ search_notes(query: string, tags: string[]) → Note[]
✅ read_note(path: string) → NoteContent
✅ update_section(path: string, heading: string, content: string) → void
✅ add_backlink(source: string, target: string) → void
❌ write_file(path: string, content: string) → void // 过于底层,风险高原则二:路径安全与同名笔记
Obsidian 允许不同目录下存在同名笔记。MCP 工具必须:
- 使用相对于 Vault 根目录的路径
- 支持通过
path/to/note格式精确指定 - 当路径歧义时返回候选列表,而非静默选择
- 拒绝包含
..或绝对路径的请求
原则三:原子操作与回滚
每次写入操作应具备:
- 差异预览:执行前返回 diff,供 Agent 或用户确认
- 原子性:操作要么完全成功,要么完全回滚
- 变更记录:记录操作类型、时间、影响范围,支持回退
原则四:增量同步与冲突处理
当 Vault 使用 git 或其他工具同步时:
- 读取操作应基于最新的文件系统状态
- 写入前应检查文件自上次读取后是否被修改
- 冲突时返回冲突内容,由用户决定合并策略
典型工具设计
以下是推荐的 Obsidian MCP Server 工具集:
读取类工具
| 工具名 | 功能 | 输入 | 输出 |
|---|---|---|---|
search_notes | 全文搜索 + 标签过滤 | query, tags, limit | 匹配的笔记列表(路径 + 摘要) |
read_note | 读取笔记全文或指定章节 | path, section? | Markdown 内容 |
get_note_properties | 读取 frontmatter | path | YAML 对象 |
get_backlinks | 获取指向某笔记的所有链接 | path | 来源笔记列表 |
check_broken_links | 扫描无效链接 | scope? | 无效链接列表 |
scan_orphans | 发现没有任何链接的孤立笔记 | 无 | 孤立笔记列表 |
写入类工具
| 工具名 | 功能 | 安全机制 |
|---|---|---|
create_note | 在指定路径创建笔记 | 路径白名单 + 覆盖检测 |
update_section | 更新指定标题下的内容 | 差异预览 + 原子写入 |
add_backlink | 在笔记中添加 wikilink | 幂等性检查(避免重复链接) |
update_moc | 更新 MOC/索引文件 | 仅追加模式 + diff |
update_properties | 修改 frontmatter 字段 | 字段级 diff |
rename_note | 重命名笔记并修复所有引用 | 自动链接修复 + 影响预览 |
move_note | 移动笔记到新路径 | 路径校验 + 链接修复 |
分析类工具
| 工具名 | 功能 |
|---|---|
get_knowledge_graph | 返回笔记间的链接拓扑 |
get_tag_hierarchy | 返回标签的层级结构 |
suggest_links | 基于内容相似度建议新链接 |
get_vault_stats | 笔记数、链接数、标签分布等统计 |
边界与限制
MCP 工具需要明确的能力边界:
不应触碰的领域
- 插件内部数据:
.obsidian/plugins/下的数据文件是插件私有格式 - 工作区配置:窗口布局、打开的文件列表等属于 UI 状态
- Obsidian 同步服务:如果用户使用 Obsidian Sync,不应与之竞争
.trash/目录:删除操作应通过 Obsidian 的删除机制,而非直接操作回收站
需要谨慎处理的场景
- Canvas 文件:
.canvas是 JSON 格式,结构复杂,修改需验证 schema - Dataview 查询结果:Dataview 是动态渲染的,MCP 无法直接获取其输出
- 同名笔记:必须通过完整路径消歧,不可依赖标题匹配
- 批量修改:超过 N 个文件的批量操作应要求显式确认
Vault 外部访问
MCP Server 应默认将操作限制在 Vault 目录内。如果确实需要访问 Vault 外部文件:
- 需要用户在 Server 配置中显式指定允许的外部路径
- 读取操作优先,写入操作需额外的权限声明
- 所有外部路径访问应记录在日志中
常见误区
| 误区 | 正确做法 |
|---|---|
让 Agent 直接 write_file 覆盖整个笔记 | 使用 update_section 做局部更新 |
| 用文件名而非路径定位笔记 | 使用相对于 Vault 的完整路径 |
| 批量修改时不做预览 | 先返回 diff,确认后再执行 |
| 忽略 frontmatter 中已有的字段 | 更新前先读取现有 frontmatter,合并而非覆盖 |
| 直接删除文件 | 通过 Obsidian 的删除接口,触发链接修复和回收站 |
假设所有 .md 文件都是笔记 | 排除 _templates/、excluded 目录等 |
检查清单
设计 Obsidian MCP Server 时,逐项确认: