obsidian-cli-mcp
obsidian-cli-mcp
一个MCP服务器,让Claude和其他MCP客户端通过官方Obsidian CLI(Obsidian 1.12+)完全控制正在运行的Obsidian仓库,并在正确性允许的情况下使用快速直接的文件系统读取。
姊妹项目:things-for-mac-mcp。
有何不同?
大多数Obsidian MCP服务器要么与社区REST插件通信,要么直接读取仓库文件夹。前者需要安装并信任一个插件。后者在移动或重命名文件时会悄悄破坏wiki链接,因为只有Obsidian知道指向它的每个链接、别名和嵌入。
此服务器按能力路由每个操作:
典型的纯文件系统MCP | obsidian-cli-mcp | |
跨数千篇笔记的全文搜索 | 快速 | 快速(文件系统) |
移动或重命名笔记 | 破坏每个入站链接 | 链接安全(Obsidian CLI) |
反向链接、别名、未解析链接 | 猜测 | Obsidian自身的解析器 |
Bases查询、模板变量 | 不可能 | 通过应用运行时求值 |
写入操作进入Obsidian的索引和文件恢复 | 否 | 是 |
iCloud已驱逐的文件 | 读取为空笔记 | 检测到并通过Obsidian读取 |
需要社区插件 | 有时 | 否 |
其架构与姊妹项目完全一致:
things-for-mac-mcp | obsidian-cli-mcp | |
快速读取 | SQLite直接读取 | 文件系统直接读取 |
权威写入 | AppleScript | Obsidian CLI |
便捷创建 | URL方案 | Obsidian CLI |
分割规则:批量读取走文件系统(需要吞吐量),任何涉及移动、重命名、删除或依赖链接解析与应用状态的操作走CLI(需要Obsidian的知识)。文件系统适配器在结构上不能修改仓库,它完全不导出写入功能。
要求
macOS、Windows或Linux桌面版,Obsidian 1.12或更高版本
已启用Obsidian CLI:Obsidian → 设置 → 通用 → 命令行界面
Obsidian必须正在运行。 CLI是应用的客户端,不是独立二进制文件。仅限桌面,不支持移动端。
Node.js 18或更高版本
安装
git clone https://github.com/jabaho9523/obsidian-cli-mcp.git
cd obsidian-cli-mcp
npm install
npm run build连接到MCP客户端
Claude(桌面版 / Code)
添加到 claude_desktop_config.json(Claude Desktop)或运行 claude mcp add(Claude Code):
{
"mcpServers": {
"obsidian": {
"command": "/absolute/path/to/node",
"args": ["/absolute/path/to/obsidian-cli-mcp/dist/index.js"],
"env": {
"OBSIDIAN_VAULT": "YourVaultName"
}
}
}
}使用 node 的绝对路径,不要只写单词。 GUI启动的应用不会继承你的shell PATH,因此 "command": "node" 在许多客户端中会静默失败。用 which node 找到你的路径。
如果你有多个仓库,设置 OBSIDIAN_VAULT。 否则CLI默认针对最后聚焦的仓库,这对于自动写入来说非常糟糕。只有一个仓库时,服务器会在启动时自动固定它。
配置
变量 | 默认值 | 用途 |
|
| Obsidian CLI二进制文件的路径 |
| 如果只有一个仓库则自动固定 | 每个命令针对的仓库名称 |
| 通过CLI自动检测 | 文件系统适配器的仓库文件夹 |
|
| 每条命令的超时时间(毫秒) |
| 未设置 | 设置为 |
| 未设置 | 设置为 |
安全护栏
三个层级,在生成二进制文件之前强制执行:
第1层,免费: 读取、搜索和增量写入(
create_note、append_note、append_daily、set_property、update_task、capture)。第2层,需要在工具调用中设置
confirm: true:delete_note、move_note、rename_note、remove_property、run_obsidian_command,以及通过透传:history:restore、publish:*、plugin:enable/disable/reload、theme:*、snippet:*、sync、sync:restore、reload、template:insert、workspace:save/delete。任何带有overwrite或permanent标志的调用也会升级到第2层。第3层,除非服务器以
OBSIDIAN_MCP_ALLOW_DANGEROUS=1运行,否则被阻止:eval、restart、plugin:install、plugin:uninstall、plugins:restrict、devtools、dev:cdp、dev:debug、dev:mobile,以及带有permanent: true的delete_note。
一个诚实的说明。第2层是防止意外调用的减速带,而非安全措施:调用模型可以自行设置 confirm: true。第3层是真正的边界,因为只有配置服务器环境的人才能解锁它。如果你将自主代理指向一个你关心的仓库,请使用 OBSIDIAN_MCP_READONLY=1 运行,这会在分派前拒绝所有修改命令,无论层级如何。
安全的移动和重命名
此项目中最重要的一条规则:文件永远不会通过文件系统移动、重命名或删除。 Obsidian在执行操作时会更新仓库中的每个wiki链接。单纯的 mv 不会。
之前,Projects/Roadmap.md 从三个笔记中被链接:
Weekly Review.md: Progress on [[Roadmap]] is on track.
Team Notes.md: See [[Roadmap#Q3]] for the plan.
Index.md: - [[Roadmap|2026 roadmap]]在使用 to: "Archive/2026 Roadmap.md" 执行 move_note 之后:
Weekly Review.md: Progress on [[2026 Roadmap]] is on track.
Team Notes.md: See [[2026 Roadmap#Q3]] for the plan.
Index.md: - [[2026 Roadmap|2026 roadmap]]所有三个链接都已更新,包括标题锚点和别名,因为Obsidian执行了移动。文件系统的移动会导致三个链接断裂且无错误提示。
为什么混合?性能原理
每次CLI调用都是通过正在运行的Obsidian应用进行一次完整的IPC往返。这虽然正确但较慢:通过 obsidian read 读取2000篇笔记需要2000次往返,需要几分钟的墙钟时间。从磁盘读取则是一次目录遍历,在任何SSD上都远低于1秒。
因此,批量读取(搜索、列表、标签和属性扫描、导出、摘要)走文件系统,CLI保留用于只有Obsidian才能回答的操作(链接、别名、Bases、模板、应用状态)以及所有写入操作。要比较你自己的仓库,可以将 search_notes 与透传 obsidian_cli 配合 ["search", "query=..."] 计时。
故障排除
"Obsidian未运行。" 最常见的失败原因。CLI需要应用打开并完全加载。启动Obsidian并重试。
"找不到Obsidian CLI二进制文件。" 在Obsidian设置 → 通用 → 命令行界面中启用CLI,或者将 OBSIDIAN_BIN 指向该二进制文件。
第一条命令超时。 冷启动Obsidian可能超过默认的20秒。提高 OBSIDIAN_MCP_TIMEOUT。
笔记读取为缺失,或服务器频繁回退到CLI。 如果你的仓库位于iCloud且开启了“优化Mac存储”,已驱逐的文件仅作为 .name.icloud 存根存在。服务器会检测到这些文件,并通过Obsidian读取它们(这会重新下载),而不是报告空笔记。批量扫描会跳过已驱逐的文件,并在输出中说明。
写入操作进入错误的仓库。 你有多个仓库且未设置 OBSIDIAN_VAULT。服务器会在启动时在stderr上对此发出警告。固定一个。
工具未在客户端中出现。 检查客户端的MCP日志,并检查上述的绝对node路径问题。
保持更新
git pull && npm install && npm run build服务器在启动时检查更新,最多每24小时一次,将结果缓存在 ~/.config/obsidian-cli-mcp/update-check.json。离线时静默失败,并在存在更新版本时打印一行stderr信息。
工具(共39个)
读取工具(18个)
工具 | 适配器 | 描述 |
| 文件系统,回退到CLI | 通过 wiki链接样式的名称或确切路径读取笔记 |
| 文件系统 | 全文搜索,支持文件夹、大小写、上下文和限制选项 |
| 文件系统 | 列出文件,按文件夹和扩展名过滤 |
| 文件系统 | 列出文件夹 |
| CLI | 路径、大小、创建和修改日期 |
| 文件系统 | 标题树,带行号 |
| CLI | 入站链接,由Obsidian解析 |
| CLI | 出站链接 |
| 文件系统 | 所有标签及其计数,包括frontmatter和内联标签 |
| 文件系统 | 整个仓库的frontmatter键及其计数 |
| 文件系统 | 单篇笔记上的一个frontmatter键 |
| CLI | 仓库名称、路径、统计信息 |
| CLI | 最近打开的文件 |
| CLI | 所有.base文件 |
| CLI | 运行Bases视图查询,由应用求值 |
| CLI | 配置文件夹中的模板 |
| CLI | 模板内容,可选包含已解析的变量 |
| 文件系统 | 单词和字符数,排除frontmatter |
写入工具(16个)
所有写入操作都通过CLI进行。每个都需要显式的 file 或 path 目标,都不允许回退到当前活动文件。
工具 | 防护等级 | 描述 |
| 1, 2 带 | 创建笔记,可选从模板创建 |
| 1 | 追加内容 |
| 1 | 在 frontmatter 后前置内容 |
| 1 | 读取今日日记 |
| 1 | 追加到今日日记 |
| 1 | 前置到今日日记 |
| 1 | 今日日记的路径 |
| 1 | 设置 frontmatter 属性 |
| 2 | 移除 frontmatter 属性 |
| 2 | 链接安全的移动 |
| 2 | 链接安全的重命名 |
| 2, 3 带 | 删除到回收站,或永久删除 |
| 1 | 列出带有引用的 Markdown 任务 |
| 1 | 通过引用或行号切换或设置任务状态 |
| 1 | 在 Obsidian UI 中打开,仅导航 |
| 2 执行 | 列出或运行命令面板命令,包括插件命令 |
run_obsidian_command 是服务器中最宽的门:它能访问所有命令面板操作,包括社区插件注册的。它被有意暴露,并在等级 2 进行防护。
工作流工具 (4)
工具 | 描述 |
| 带时间戳追加到今日日记,实践中最高频的操作 |
| 将日期范围内的日记汇总到一个文档 |
| 将文件夹导出为 JSON、Markdown 或 CSV,内联或导出到 vault 外的文件 |
| 孤页、死链、未解析链接和空笔记的单一报告。有意限定在链接图范围内 |
逃生舱 (1)
工具 | 描述 |
| 运行任何 CLI 命令。接受 |
MCP 资源
客户端对资源的支持各不相同,Claude Desktop 目前不展示它们。
资源 | 内容 |
| Vault 信息 |
| 今日日记 |
| 所有标签及其计数 |
| 最近打开的文件 |
| 没有入链的笔记 |
| 通过 vault 相对路径访问的笔记 |
MCP 提示
提示 | 目的 |
| 总结日记,展示未完成任务,建议后续行动 |
| 浏览 vault 健康报告并提出链接安全的修复方案 |
| 将粘贴的材料使用现有模板转换为笔记 |
| 将一周的日记汇总为摘要笔记 |
架构
src/
├── index.ts MCP server entry, stdio transport
├── config.ts Environment configuration
├── adapters/
│ ├── cli.ts execFile wrapper, vault injection, error contract
│ └── filesystem.ts Read-only vault access, iCloud stub detection
├── tools/
│ ├── common.ts Shared note loading with CLI fallback
│ ├── read.ts 18 read tools
│ ├── write.ts 16 write tools
│ ├── workflow.ts 4 composite tools
│ └── passthrough.ts obsidian_cli escape hatch
├── resources/
│ └── vault.ts MCP resources
├── prompts/
│ └── workflows.ts MCP prompts
└── utils/
├── guardrails.ts Tier policy, readonly allowlist
├── markdown.ts Frontmatter, headings, tags, word counts
├── output.ts Truncation at 60,000 characters
└── update-check.ts Daily update check测试针对一个存根二进制文件运行,该文件扫描其完整 argv,并可被指示失败、挂起或输出过大内容,因此整个测试套件在未安装 Obsidian 的情况下也能通过:
npm test支持
问题和功能请求:GitHub issues。
作者的其他作品
things-for-mac-mcp,Things 3 的姊妹 MCP 服务器
许可证
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read and write your Fresh Jots notes from Claude, Cursor, and any MCP client.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jabaho9523/obsidian-cli-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server