Mcp Obsidiancli — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Obsidiancli (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
使用 TypeScript 实现的 stdio MCP Server,通过 Obsidian 官方 CLI 为 Claude Code、Codex 等 AI Agent 提供 Vault 操作能力。
本项目不直接读写 Vault 文件,也不通过 shell 拼接命令。所有操作均以参数数组调用 Obsidian CLI,并提供 Vault 锁定、命令权限、超时、输出限制及跨进程串行保护。
command、eval 等高权限操作调用链如下:
Claude Code / Codex
│ stdio MCP
▼
Obsidian CLI MCP Server
│ FIFO + 跨进程锁
▼
Obsidian.com / obsidian
│ IPC
▼
正在运行的 ObsidianWindows 使用安装目录中的 Obsidian.com 作为终端重定向器。升级安装器后,应重新启用命令行接口并重启终端。
先验证官方 CLI:
obsidian version
obsidian vaults verboseSet-Location D:\Document\MyMCP\ObsidianCli
npm install
npm run check
npm test
npm run build构建入口为:
D:\Document\MyMCP\ObsidianCli\dist\index.js修改 TypeScript 源码后必须重新执行 npm run build,并重启 MCP 客户端会话。
在 Vault 或 Claude Code 项目根目录创建 .mcp.json。下面是锁定到 Dance 且允许全部 Obsidian CLI 能力的配置:
{
"mcpServers": {
"obsidian-cli": {
"command": "node",
"args": [
"D:\\Document\\MyMCP\\ObsidianCli\\dist\\index.js"
],
"env": {
"OBSIDIAN_CLI_COMMAND": "D:\\Apps\\Common\\Obsidian\\Obsidian.com",
"OBSIDIAN_DEFAULT_VAULT": "Dance",
"OBSIDIAN_LOCKED_VAULT": "Dance",
"OBSIDIAN_CLI_ALLOW_UNSAFE": "true",
"OBSIDIAN_CLI_EXTRA_COMMANDS": "*"
}
}
}
}MCP 配置中的环境变量值必须全部是字符串。特别是应写成 "true",不能写成 JSON 布尔值 true,否则 Claude Code 会忽略整个 Server 配置。
从项目根目录验证:
claude mcp list
claude mcp get obsidian-cli预期状态:
obsidian-cli ... ✓ Connected修改 .mcp.json 或重新构建 Server 后,应退出并重新启动 Claude Code。
在受信任的项目中创建 .codex/config.toml:
[mcp_servers.obsidian-cli]
command = "node"
args = ['D:\Document\MyMCP\ObsidianCli\dist\index.js']
cwd = 'D:\Workspace\Ob\Dance\Dance'
enabled = true
required = true
startup_timeout_sec = 30
tool_timeout_sec = 60
default_tools_approval_mode = "approve"
[mcp_servers.obsidian-cli.env]
OBSIDIAN_CLI_COMMAND = 'D:\Apps\Common\Obsidian\Obsidian.com'
OBSIDIAN_DEFAULT_VAULT = "Dance"
OBSIDIAN_LOCKED_VAULT = "Dance"
OBSIDIAN_CLI_ALLOW_UNSAFE = "true"
OBSIDIAN_CLI_EXTRA_COMMANDS = "*"Codex 只会为受信任项目加载项目级 .codex/config.toml。修改配置或重新构建后,以目标 Vault 为工作区新建 Codex 线程。
MCP Server 负责提供操作能力,Skill 负责规定 Agent 的知识管理流程。当前 Dance 项目分别使用:
.claude/skills/curate-dance-vault/SKILL.md
.agents/skills/curate-dance-vault/SKILL.mdClaude Code 与 Codex 使用相同 Skill 内容,约束 inbox、atlas、workspace、archive、system 的数据流,并要求优先使用本 MCP,而不是 shell 文件操作。
| 工具 | 主要输入 | 用途 |
|---|---|---|
obsidian_status | 无 | 查询 Obsidian 版本及 CLI 连通性 |
obsidian_help | command? | 查询总帮助或指定命令帮助 |
obsidian_list | type、vault?、folder?、extension? | 列出 Vault、文件或文件夹 |
obsidian_read_note | path、vault? | 按 Vault 相对路径读取笔记 |
obsidian_write_note | path、content、mode、overwrite、vault? | 创建、追加或前置写入笔记 |
obsidian_search | query、path?、limit?、context、format、vault? | 搜索笔记内容 |
obsidian_cli | command、parameters、flags、vault? | 执行其他允许的 Obsidian CLI 命令 |
obsidian_write_note.mode 支持:
createappendprependobsidian_write_note 会把正文拆成最多 1,024 UTF-8 字节的块,并在一个不可交错的 CLI 批次中完成写入。调用方仍只需提交一次完整正文。
obsidian_cli 的参数格式:
{
"command": "move",
"parameters": {
"path": "inbox/source.md",
"to": "archive/source.md"
},
"flags": []
}Server 会将 Vault 参数放在命令之前,并将普通参数转换为 key=value。Obsidian 的普通布尔开关使用裸 flag,例如 overwrite、verbose;全局复制选项使用 --copy。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
OBSIDIAN_CLI_COMMAND | obsidian | CLI 可执行文件名或绝对路径 |
OBSIDIAN_DEFAULT_VAULT | 未设置 | 工具调用未指定 Vault 时使用的默认值 |
OBSIDIAN_LOCKED_VAULT | 未设置 | 将 Server 硬锁定到指定 Vault,并禁止枚举所有 Vault |
OBSIDIAN_CLI_TIMEOUT_MS | 30000 | 单个进程的执行超时,范围 1–300 秒 |
OBSIDIAN_CLI_MAX_OUTPUT_BYTES | 1048576 | 单次调用最大输出,最高 10 MiB |
OBSIDIAN_CLI_ALLOW_UNSAFE | false | 允许已知高影响命令 |
OBSIDIAN_CLI_EXTRA_COMMANDS | 未设置 | 额外命令名,逗号分隔;* 表示允许全部合法命令名 |
同时设置默认和锁定 Vault 时,两者必须一致,否则 Server 拒绝启动。
OBSIDIAN_DEFAULT_VAULT=Dance
OBSIDIAN_LOCKED_VAULT=Dance
OBSIDIAN_CLI_ALLOW_UNSAFE=falseOBSIDIAN_DEFAULT_VAULT=Dance
OBSIDIAN_LOCKED_VAULT=Dance
OBSIDIAN_CLI_ALLOW_UNSAFE=true
OBSIDIAN_CLI_EXTRA_COMMANDS=*完全信任配置允许 delete、eval、command、插件管理、发布、恢复、主题及开发者命令,但仍不会把输入交给操作系统 shell。eval 和插件命令本身仍可能对 Obsidian 应用或 Vault 产生广泛影响。
spawn(executable, argv, { shell: false })OBSIDIAN_CLI_ALLOW_UNSAFE=trueOBSIDIAN_CLI_EXTRA_COMMANDS=*obsidian_write_note设置 OBSIDIAN_LOCKED_VAULT 后:
obsidian_list type=vaults 和通用 vaults 命令被禁用Vault 锁定只约束通过本 Server 执行的命令。高权限的 Obsidian 应用级操作,例如插件安装或 eval,仍需由可信 Agent 使用。
Windows Obsidian.com 通过 IPC 与 Obsidian 主进程通信。多个 CLI 进程同时发送消息可能导致主进程 JSON 边界损坏。
Server 使用两层保护:
因此 Claude Code、Codex 和并发 MCP 工具调用会依次访问 Obsidian CLI。直接在终端运行的 obsidian 命令不会经过此锁,Agent 工作期间不要在其他终端并行执行大量 CLI 命令。
No MCP servers configured检查:
.mcp.json 的项目根目录启动。.mcp.json 是否为有效 JSON。env 下所有值是否都是字符串。运行:
claude mcp list
claude mcp get obsidian-cli修改后重启 Claude Code。
Unexpected token ... is not valid JSON这表示 Windows CLI IPC 收到了损坏的 JSON 请求头。已确认的触发因素包括单次 content= 正文过大,以及多个 CLI 进程并行发送消息。当前 Server 会自动分块正文、限制通用请求大小并串行执行。
处理步骤:
npm run build。Agent 不应在 MCP 写入失败后降级到系统 Write 或 shell;这会绕过 Obsidian 和 Skill 的数据流规则。
跨进程锁异常退出后会自动恢复失效锁。
The CLI is unable to find Obsidian.确认:
OBSIDIAN_CLI_COMMAND 指向正确的 Obsidian.comMCP 客户端运行的是 dist/,不是 src/。执行:
npm run check
npm test
npm run build然后重启 Claude Code/Codex 会话。
npm run dev项目结构:
src/
commands.ts 命令白名单、参数与 flag 构造
config.ts 环境变量解析和 Vault 锁定配置
content.ts UTF-8 安全正文分块
runner.ts 进程执行、FIFO 与跨进程锁
server.ts MCP 工具注册
index.ts stdio 入口
test/
commands.test.ts
config.test.ts
content.test.ts
runner.test.ts
server.test.tsstdio 的标准输出专用于 MCP 协议;Server 日志只能写入标准错误。
npm run check
npm test
npm run build当前测试覆盖:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.