MCPVult 错误
一个本地的MCP服务器,可以让兼容的客户端在一个Obsidian金库中读取,搜索,并编辑笔记. MCPVault直接与金库文件相配合,将文件操作限制在已配置的金库根上,并为未改变的前事字段保留格式.
支助客户
Claude桌面、Claude代码、ChatGPT桌面(企业+)、OpenCode、双子座CLI、OpenAI Codex、IntelliJ EIDA 2025.1+、Cursor、Windsurf和Ontheia都有配置示例。 其他客户端如果支持本地stdio MCP服务器,可以使用MCPVault.
快开始
-
安装节点.js运行时间 :
# Download from https://nodejs.org (v22.12.0 or later) # or use a package manager like nvm, brew, apt, etc. -
测试服务器 :
如果使用已发布的软件包 :
npx @modelcontextprotocol/inspector npx @bitbonsai/mcpvault@latest /path/to/your/vault -
配置您的 AI 客户端 :
克劳德桌面 - 复制这个给
claude_desktop_config.json数字 :{ "mcpServers": { "obsidian": { "command": "npx", "args": ["@bitbonsai/mcpvault@latest", "/path/to/your/vault"] } } }克劳德代码 - 复制这个给
~/.claude.json数字 :{ "mcpServers": { "obsidian": { "command": "npx", "args": ["@bitbonsai/mcpvault@latest", "/path/to/your/vault"], "env": {} } } }打开代码 - 复制这个给
~/.config/opencode/opencode.json{ "mcp": { "obsidian": { "type": "local", "command": [ "npx", "@bitbonsai/mcpvault@latest", "/path/to/your/vault/" ], "enabled": true } } }替换
/path/to/your/vault与你真正的欧比多金库路径.其他平台见 详细的配置指南 见下文.
-
用你的人工智能测试:
- "我的Abbidian金库里的资料"
- "读取我的笔记,叫做"项目理想"
- "用今天的日期创造出新的音符"
要验证连接,请您客户端列出 MCPVault 工具或读取已知的注释 .
如何连接
一个MCP客户端启动MCPVault作为本地的stdio进程并经过金库路径. MCPVault向每个被支持的客户端暴露出相同的工具,因此服务器没有绑定在一个AI提供者上. Obsidian不需要运行,不需要Obsidian插件.
特征
- AST- 意识前题更新为未修改的 YAML 字段保留格式 .
- 路由检查块转弯, 共鸣链接出逃,点文件,
.obsidian, (中文(简体) ),.git,以及node_modules。 。 。 . - 18个MCP工具覆盖注释和文件操作:
- 文件操作 :
read_note, (中文(简体) ),write_note, (中文(简体) ),patch_note, (中文(简体) ),delete_note, (中文(简体) ),move_note, (中文(简体) ),move_file - 部分内容如下:
get_note_outline, (中文(简体) ),read_note_lines - 目录和批次如下:
list_directory, (中文(简体) ),read_multiple_notes - 搜索 :
search_notes多字匹配和BM25重排 - 元数据和标签 :
get_frontmatter, (中文(简体) ),update_frontmatter, (中文(简体) ),get_notes_info, (中文(简体) ),get_vault_stats, (中文(简体) ),manage_tags, (中文(简体) ),list_all_tags - 维基链接:
wiki_link当名称模糊时解析名称并返回其它路径
- 文件操作 :
write_note支持覆盖、附加和预置模式.delete_note财务报告和审定财务报表move_file需要匹配的确认路径.- 路径参数在验证前会修剪 .
- 搜索和批量工具默认返回压缩字段; 设置
prettyPrint: true用于扩展产出. - 套件会输出TypeScript声明和公开类型.
- MCPVault 不需要 Obsidian 插件.
先决条件
- 节点.js 运行时间(v22.12.0或以后)
- Obsidian 金库( 本地目录为
.md, (中文(简体) ),.markdown, (中文(简体) ),.txt, (中文(简体) ),.base,或.canvas文档) - MCP相容的AI客户端(Claude桌面,ChatGPT桌面,克洛德代码等)
安装
最终用户
npx 下载并运行软件包 :
npx @bitbonsai/mcpvault@latest /path/to/your/obsidian/vault
如果您省略了金库路径, 服务器会使用您当前的工作目录作为金库根 .
对于开发者
- 克隆此寄存器
- 使用正确的节点:
nvm use # Uses Node 24 from .nvmrc
- 安装 npm 的依赖 :
npm install # Corepack automatically uses npm 10.9.0
- 与MCP检查员进行本地测试:
npx @modelcontextprotocol/inspector npm start /path/to/your/vault
使用 MCP 检查器在添加到客户端之前先测试服务器 :
# Install globally for easier access
npm install -g @modelcontextprotocol/inspector
# Test with any vault
mcp-inspector npx @bitbonsai/mcpvault@latest /path/to/your/vault
使用量
运行服务器
终端用户 :
npx @bitbonsai/mcpvault@latest
npx @bitbonsai/mcpvault@latest /path/to/your/obsidian/vault
npx @bitbonsai/mcpvault@latest ./Vault
开发者 :
npm start
npm start /path/to/your/obsidian/vault
npm start ./Vault
AI 客户端配置
克劳德桌面
添加到您的 Claude 桌面配置文件 :
单个默认 :
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": [
"@bitbonsai/mcpvault@latest",
"/Users/yourname/Documents/MyVault"
]
}
}
}
多个断层 :
{
"mcpServers": {
"obsidian-personal": {
"command": "npx",
"args": [
"@bitbonsai/mcpvault@latest",
"/Users/yourname/Documents/PersonalVault"
]
},
"obsidian-work": {
"command": "npx",
"args": [
"@bitbonsai/mcpvault@latest",
"/Users/yourname/Documents/WorkVault"
]
}
}
}
只读模式 :
添加 --read-only 在金库路径之后,只显示读取工具。 变异工具在发现时被省略,如果直接调用则被拒绝.
{
"mcpServers": {
"obsidian-read-only": {
"command": "npx",
"args": [
"@bitbonsai/mcpvault@latest",
"/Users/yourname/Documents/ResearchVault",
"--read-only"
]
}
}
}
CLI也接受了 --read-only true 财务报告和审定财务报表 --read-only=true 用于需要明确值的配置系统。 关闭选项, 或者设置为 false,以保持正常的读取/写入访问.
默认搜索和列表排除 :
重复 --exclude <subtree> 来隐藏金库关联文件夹 search_notes 财务报告和审定财务报表 list_directory 在每次会议。 待命 excludePaths 添加到这些默认值。 直接读写工具仍然可供排除路径使用.
"args": [
"@bitbonsai/mcpvault@latest",
"/Users/yourname/Documents/ResearchVault",
"--exclude", "Archive",
"--exclude", "Snapshots/Old"
]
MCPVault 不读 Obsidian 的 .obsidian/app.json;排除在 MCP 服务器配置中保持清晰.
配置文件位置 :
- 马可斯:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗口 :
C:\Users\{username}\AppData\Roaming\Claude\claude_desktop_config.json - 林纳:
~/.config/Claude/claude_desktop_config.json
您也可以通过 Claude 桌面 设置 开发者 编辑配置
聊天GPT 桌面
所需经费: ChatGPT 企业、教育或团队订阅(个人+用户不可用)
ChatGPT通过Deep Research and developers模式使用MCP. 配置是通过 ChatGPT 接口完成的 :
- 访问 ChatGPT 开发者模式( β 特性)
- 通过内置的 MCP 客户端配置 MCP 服务器
- 为您的组织创建自定义连接符
注:ChatGPT桌面的MCP集成目前仅限于企业订阅,使用与基于文件的配置不同的设置过程.
克劳德代码
Claude 代码使用 .claude.json 配置文件 :
用户范围( 建议): 编辑 ~/.claude.json数字 :
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["@bitbonsai/mcpvault@latest", "/path/to/your/vault"],
"env": {}
}
}
}
项目范围 : 编辑 .claude.json 在您的项目中,或在项目中添加:
{
"projects": {
"/path/to/your/project": {
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["@bitbonsai/mcpvault@latest", "/path/to/your/vault"]
}
}
}
}
}
使用 Claude 代码 CLI :
claude mcp add obsidian --scope user npx @bitbonsai/mcpvault /path/to/your/vault
鹅桌面
在"鹅"桌面设置上,单击 添加自定义扩展名,并在命令字段上添加:
npx @bitbonsai/mcpvault@latest /path/to/your/vault
其他MCP-兼容客户端(2025)
确认 MCP 支持 :
- 2025.1+ (英语) - 本地MCP客户支持
- 光标 IDE - 内置的 MCP 兼容性
- Windsurf IDE 风平浪静 - 全面纳入多边协商进程
- 欧西娅 - 自主托管、开源的AI代理平台
- Zed、Replit、Codeum、原始图 - 发展中
- 微软副驾驶工作室 - 具有一击服务器连接的本地 MCP 支持
大多数现代的MCP客户端都使用相类似的JSON配置模式. 请查看您特定客户的文件 以获取确切的设置指示.
实例
问你的人工智能助手 你的笔记:
- "我的Absidian金库里有什么文件?"
- "读取我的笔记,叫做"项目理想"
- "给我看所有笔记 标题是"AI""
请您的人工智能助理协助音符管理:
- "用今天的日期在前题创作出新的笔记,叫做"会议笔记""Md"
- "我日记的今天日记条目附录"
- "给我的待办事宜清单准备紧急任务"
- "在我的任务说明中添加“项目”和“紧急”标记
- "在我的研究笔记上写下所有的标签"
- 从我完成的文章中删除"草稿"标签
- 在我的“ Projects” 文件夹中列出所有减记文件
- "删除旧注"草案-理想.md"(附确认)"
示例工作流程
- "用上个月的"机器学习"标记我的研究笔记"
- "更新我项目说明中的状况 以"完成"并添加今天的日期"
- "发现上面提到"API设计" 并起草一个指南"
- "审查我未加标记的笔记,并根据内容建议标签"
解决问题
共同问题
未找到命令 : npx
- 解决方案 : 安装节点.js运行时间 节点js.org
- 备选案文: 使用全局安装 :
npm install -g @bitbonsai/mcpvault
当路径看起来正确时“ 找不到文件 ”
- 原因 : 服务器使用错误的金库根
- 解决方案 : 要么从您的金库目录中运行命令, 要么明确通过金库路径
"拒绝"错误
- 原因 : 文件系统权限不足
- 解决方案 : 确保您的用户可读/ 可写入金库目录
"Path traversal不允许"
- 原因 : 试图访问金库外的文件
- 解决方案 : 所有文件路径都必须与金库根相对
AI 客户端无法识别服务器
- 检查您的 OS 配置文件路径正确
- 确保 JSON 语法有效(使用 JSON 验证符)
- 配置更改后重新启动您的AI客户端
- 检查您的 AI 客户端的日志中的错误信息
- 校验您的 AI 客户端支持 MCP( 模式上下文协议)
". . . .
- 预期: 路径过滤器自动排除
.obsidian/**模式 - 如果还见到他们: 过滤器是安全的
调试模式
以错误记录运行 :
npx @bitbonsai/mcpvault /path/to/vault 2>debug.log
获取帮助
- 打开一个问题 关于 GitHub 的
- 包含您的 OS, Node.js 版本和错误消息
- 提供金库目录结构( 不含敏感内容)
测试
运行测试套件 :
npm test
API 方法
read_note
从保险库里读一张纸条 上面写着解析过的前题.
请:
{
"name": "read_note",
"arguments": {
"path": "project-ideas.md",
"prettyPrint": false
}
}
压缩响应 :
{
"fm": {
"title": "Project Ideas",
"tags": ["projects", "brainstorming"],
"created": "2023-01-15T10:30:00.000Z"
},
"content": "# Project Ideas\n\n## AI Tools\n- MCP server for Obsidian\n- Voice note transcription\n\n## Web Apps\n- Task management system"
}
反应( 使用 pretty Print: true ):
{
"fm": {
"title": "Project Ideas",
"tags": ["projects", "brainstorming"],
"created": "2023-01-15T10:30:00.000Z"
},
"content": "# Project Ideas\n\n## AI Tools\n- MCP server for Obsidian\n- Voice note transcription\n\n## Web Apps\n- Task management system"
}
write_note
使用可选的前题向金库写出注释并写入模式 .
写入模式 :
overwrite(默认):替换全部文件内容append: 在现有文件末尾添加内容prepend: 在现有文件开头添加内容
请求( 覆盖) :
{
"name": "write_note",
"arguments": {
"path": "meeting-notes.md",
"content": "# Team Meeting\n\n## Agenda\n- Project updates\n- Next milestones",
"frontmatter": {
"title": "Team Meeting Notes",
"date": "2023-12-01",
"tags": ["meetings", "team"]
},
"mode": "overwrite"
}
}
请求(附录):
{
"name": "write_note",
"arguments": {
"path": "daily-log.md",
"content": "\n\n## 3:00 PM Update\n- Completed project review\n- Started new feature",
"mode": "append"
}
}
回应:
{
"message": "Successfully wrote note: meeting-notes.md (mode: overwrite)"
}
patch_note
替换现有音符中的精确字符串,而不重写完整文件 .
请:
{
"name": "patch_note",
"arguments": {
"path": "meeting-notes.md",
"oldString": "- Next milestones",
"newString": "- Next milestones (owner: Alex)",
"replaceAll": false
}
}
答复(成功):
{
"success": true,
"path": "meeting-notes.md",
"message": "Successfully replaced 1 occurrence",
"matchCount": 1
}
响应( 以 Alll=false 替换为多匹配) :
{
"success": false,
"path": "meeting-notes.md",
"message": "Found 3 occurrences of the string. Use replaceAll=true to replace all occurrences, or provide a more specific string to match exactly one occurrence.",
"matchCount": 3
}
list_directory
在金库中列出文件和目录 .
注:这包括非注解文件名(例如: pdf, (中文(简体) ), png, (中文(简体) ), jpg),所以AI助手可以看到金库结构,但音符工具如 read_note 财务报告和审定财务报表 write_note 仍然仅在便笺文件中操作( e).md, (中文(简体) ), .markdown, (中文(简体) ), .txt, (中文(简体) ), .base, (中文(简体) ), .canvas) (中文(简体) ).
请:
{
"name": "list_directory",
"arguments": {
"path": "Projects",
"prettyPrint": false
}
}
压缩响应 :
{
"dirs": ["AI-Tools", "Web-Development"],
"files": ["project-template.md", "roadmap.md"]
}
delete_note
从金库中删除一纸条(安全需要确认).
请:
{
"name": "delete_note",
"arguments": {
"path": "old-draft.md",
"confirmPath": "old-draft.md",
"trashMode": "local"
}
}
答复(成功):
{
"success": true,
"path": "old-draft.md",
"message": "Successfully moved note to vault trash: old-draft.md"
}
回收站模式 :
none(默认):永久删除local: 移动到.trash保存文件夹结构system: 移动到 OS 垃圾/回收桶
答复(确认失败):
{
"success": false,
"path": "old-draft.md",
"message": "Deletion cancelled: confirmation path does not match. For safety, both 'path' and 'confirmPath' must be identical."
}
确认: confirmPath 必须完全匹配 path 在删除之前.
get_frontmatter
只从注释中取出前题而不读出全部内容 .
请:
{
"name": "get_frontmatter",
"arguments": {
"path": "project-ideas.md",
"prettyPrint": false
}
}
压缩响应, 直接返回前题 :
{
"title": "Project Ideas",
"tags": ["projects", "brainstorming"],
"created": "2023-01-15T10:30:00.000Z"
}
manage_tags
在附注中添加、删除或列表标记。 标记在前题被管理,并且检测到内置标记.
请求( 列表标记) :
{
"name": "manage_tags",
"arguments": {
"path": "research-notes.md",
"operation": "list"
}
}
请求( 添加标记 ) :
{
"name": "manage_tags",
"arguments": {
"path": "research-notes.md",
"operation": "add",
"tags": ["machine-learning", "ai", "important"]
}
}
请求( 删除标记) :
{
"name": "manage_tags",
"arguments": {
"path": "research-notes.md",
"operation": "remove",
"tags": ["draft", "temporary"]
}
}
回应:
{
"path": "research-notes.md",
"operation": "add",
"tags": ["research", "ai", "machine-learning", "important"],
"success": true,
"message": "Successfully added tags"
}
search_notes
以多字匹配和BM25相关性重排的内容或前题搜索金库中的音符.
请:
{
"name": "search_notes",
"arguments": {
"query": "machine learning",
"limit": 5,
"searchContent": true,
"searchFrontmatter": false,
"caseSensitive": false,
"prettyPrint": false
}
}
压缩响应 :
[
{
"p": "ai-research.md",
"t": "AI Research Notes",
"ex": "...machine learning...",
"mc": 2,
"ln": 15,
"uri": "obsidian://open?vault=MyVault&file=ai-research.md"
}
]
字段名称 :
p= 路径t= 标题ex= 节选(21个字符上下文)mc= 匹配数ln=行号uri= 快速打开的深层链接
move_note
在金库中移动或重命名一个便条( Name.md, (中文(简体) ), .markdown, (中文(简体) ), .txt, (中文(简体) ), .base, (中文(简体) ), .canvas) (中文(简体) ).
请:
{
"name": "move_note",
"arguments": {
"oldPath": "drafts/article.md",
"newPath": "published/article.md",
"overwrite": false
}
}
回应:
{
"success": true,
"oldPath": "drafts/article.md",
"newPath": "published/article.md",
"message": "Successfully moved note from drafts/article.md to published/article.md"
}
move_file
用二进制安全文件操作来移动或重命名金库中的任何文件(仅文件;不是递归目录动作). 为了安全起见,这个工具需要确认源道和去向道.
请:
{
"name": "move_file",
"arguments": {
"oldPath": "Miro/attachments/Pasted image 20250812140124.png",
"newPath": "assets/images/Pasted image 20250812140124.png",
"confirmOldPath": "Miro/attachments/Pasted image 20250812140124.png",
"confirmNewPath": "assets/images/Pasted image 20250812140124.png",
"overwrite": false
}
}
回应:
{
"success": true,
"oldPath": "Miro/attachments/Pasted image 20250812140124.png",
"newPath": "assets/images/Pasted image 20250812140124.png",
"message": "Successfully moved file from Miro/attachments/Pasted image 20250812140124.png to assets/images/Pasted image 20250812140124.png"
}
确认: confirmOldPath 必须匹配 oldPath,以及 confirmNewPath 必须匹配 newPath。 。 。 .
read_multiple_notes
分批读取多笔记(最多10个文件).
请:
{
"name": "read_multiple_notes",
"arguments": {
"paths": ["note1.md", "note2.md", "note3.md"],
"includeContent": true,
"includeFrontmatter": true,
"prettyPrint": false
}
}
压缩响应 :
{
"ok": [
{
"path": "note1.md",
"frontmatter": { "title": "Note 1" },
"content": "# Note 1\n\nContent here..."
}
],
"err": [{ "path": "note2.md", "error": "File not found" }]
}
字段名称 :
ok= 读取成功err= 读取失败
update_frontmatter
更新注释的前题, 不更改内容 .
请:
{
"name": "update_frontmatter",
"arguments": {
"path": "research-note.md",
"frontmatter": {
"status": "completed",
"updated": "2025-09-23"
},
"merge": true
}
}
回应:
{
"message": "Successfully updated frontmatter for: research-note.md"
}
get_notes_info
在不读取完整内容的情况下获取注释的元数据 .
请:
{
"name": "get_notes_info",
"arguments": {
"paths": ["note1.md", "note2.md"],
"prettyPrint": false
}
}
压缩响应, 直接返回数组 :
[
{
"path": "note1.md",
"size": 1024,
"modified": 1695456000000,
"hasFrontmatter": true
}
]
get_vault_stats
获取高层金库统计数据而不阅读音符内容.
请:
{
"name": "get_vault_stats",
"arguments": {
"recentCount": 5,
"prettyPrint": false
}
}
压缩响应 :
{
"notes": 1248,
"folders": 76,
"size": 18349210,
"recent": [
{
"path": "Daily/2026-02-27.md",
"modified": 1772188800000,
"size": 2814
}
]
}
安全边界
MCPVault 在文件操作前应用这些检查 :
路径安全
- 路径倾斜保护 : 所有文件路径都经过验证以防止在金库外访问
- 相对路径执行 : 路径正常化并限制在金库目录内
- 符号链接安全 : 对照金库边界检查已解析的路径
文件过滤
- 自动排除:
.obsidian, (中文(简体) ),.git, (中文(简体) ),node_modules系统文件被过滤 - 扩展白名单 : 仅
.md, (中文(简体) ),.markdown, (中文(简体) ),.txt, (中文(简体) ),.base,以及.canvas文件默认可访问 - 隐藏文件保护 : 自动排除点文件和系统目录
内容验证
- YAML 前题验证 : 前题在写入前解析并验证
- 函数/符号预防: 危险 JavaScript 对象从前题被屏蔽
- 数据类型检查 : 只允许安全数据类型(字符串、数字、阵列、对象)
最佳做法
- 最小特权 : 服务器只访问指定的金库目录
- 仅读模式 : 运行
--read-only用于敏感的金库; 变异工具被隐藏并拒绝 - 建议备份 : 在使用写入操作前总是备份您的金库
- 网络隔离 : 服务器使用 stdio 传输( 不接触网络)
没有保护的东西
- 文件内容 : 服务器可以读取/写入任何允许的文件内容
- 断层结构 : 目录结构可见于 AI 助手
- 文件元数据 : 可访问创建时间、 文件大小等
只允许您信任的客户端和对话进行书面访问。 使用 --read-only 当客户不需要修改笔记时.
建筑
server.ts- MCP服务器入口src/cli.ts- 解析库道、只读模式和默认排除的 CLI 选项src/createServer.ts- MCP工具注册、请求路由和发现默认src/frontmatter.ts- YAML 前事处理灰色事项, 保留格式化和 CRLF 线尾; 可执行 JavaScript 前事保留为惰性注释内容src/filesystem.ts- 有路径验证的文件操作src/pathfilter.ts- 目录和文件过滤src/search.ts- 有内容和前题支持的备注搜索功能src/uri.ts- Absidian URI 代号,用于深层链接src/types.ts- 类型脚本类型定义
捐款
- 叉子存储器
- 创建特性分支 :
git checkout -b feature-name - 更改并添加测试
- 确保所有测试合格 :
npm test - 提交拉动请求
维护者:制作出版由GitHub Releases驱动. 见 相关内容。 。 。 .
许可证
麻省理工学院