MCP 协议与知识库 AI 自动化
调研时间:2026-06-09 数据来源:GitHub 项目调研 + 官方文档 覆盖版本:obsidian-local-rest-api v4.1.3、Claudian 最新版、n8n 最新版
1. MCP 协议简介
1.1 什么是 MCP(Model Context Protocol)
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年底提出、2025 年正式标准化的开放协议,用于规范 AI 模型与外部工具、数据源之间的通信方式。
传统上,每个 AI 应用都需要为每个外部工具单独开发适配代码,形成 N×M 的集成矩阵——N 个应用、M 个工具,维护成本极高。MCP 的核心价值在于引入标准化中间层,将这个问题简化为 N+M:每个工具只需实现一次 MCP Server,每个 AI 应用只需实现一次 MCP Client,双方就能互通。
1.2 Anthropic 提出 MCP 的背景和目标
MCP 的诞生背景是 AI Agent 的规模化落地需求:
- 工具爆炸:2024 年各类 AI 工具如雨后春笋,但每个工具的接入方式各异,开发者疲于适配。
- 上下文孤岛:AI 模型的训练数据有截止日期,要让模型”知道”最新数据、本地文件、私有知识,必须在推理时动态注入上下文。
- Agent 编排:多步骤 Agent 工作流需要模型在工具调用之间传递状态,缺乏标准协议导致 Agent 框架各自为政。
MCP 的官方目标:让 AI 模型能安全、标准地访问任意本地或远程数据源,就像 USB-C 统一了设备充电接口一样。
1.3 MCP 的三种角色:Host、Client、Server
┌─────────────────────────────────────────────────────────────┐
│ Host(宿主应用) │
│ ┌──────────────┐ MCP Protocol ┌──────────────────┐ │
│ │ MCP Client │◄──────────────────►│ MCP Server A │ │
│ │ (AI 模型侧) │ │ (Obsidian Vault) │ │
│ └──────────────┘ MCP Protocol └──────────────────┘ │
│ │ ────────────► ┌──────────────────┐ │
│ │ │ MCP Server B │ │
│ └───────────────────────────►│ (本地文件系统) │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
- Host(宿主):运行 AI 对话的应用,如 Claude Desktop、Cursor、Claude Code CLI。Host 负责生命周期管理,创建并维护 Client 实例。
- Client(客户端):嵌入 Host 内部,与单个 MCP Server 保持一对一连接,负责协议握手、能力协商、消息转发。
- Server(服务器):暴露具体工具和数据的轻量进程,向外声明自己能提供哪些
tools、resources、prompts。
MCP Server 可以通过两种传输方式运行:
- stdio:Host 以子进程方式启动 Server,通过标准输入输出通信。适合本地工具。
- HTTP+SSE / Streamable HTTP:Server 作为独立进程监听端口,适合需要持久运行的服务(如 Obsidian 插件)。
1.4 为什么 MCP 成为 2025 年 AI 集成标准
截至 2026 年初,MCP 已获得几乎所有主流 AI 工具的支持:
| 支持方 | 支持版本/时间 |
|---|---|
| Claude Desktop | 2024-11(首发) |
| Cursor | 0.43+ |
| VS Code Copilot | 2025-02 |
| Continue (开源) | 2025-Q1 |
| Windsurf | 2025-Q2 |
| OpenAI (Python SDK) | 2025-Q3 |
生态爆发的数据:截至 2025 年底,GitHub 上 MCP Server 相关项目超过 3,000 个,涵盖数据库、文件系统、浏览器、邮件、日历、代码仓库等几乎所有类型的工具。
1.5 MCP vs REST API vs Function Calling 的区别
| 维度 | REST API | Function Calling | MCP |
|---|---|---|---|
| 协议层 | HTTP | 模型内部机制 | 标准化协议(JSON-RPC 2.0) |
| 能力发现 | 需提前硬编码 | Schema 注入 Prompt | 动态协商(Client 主动查询) |
| 传输方式 | HTTP | 无(Prompt 层) | stdio / HTTP+SSE |
| 跨 AI 平台 | 需各自适配 | 不同厂商 Schema 不兼容 | 统一标准,一次实现到处用 |
| 状态管理 | 无状态 | 无状态 | 支持会话状态(Resources 订阅) |
| 工具复用 | 低 | 低 | 高(Server 可被任意 Host 复用) |
| 适合场景 | 服务间通信 | 单次工具调用 | AI Agent 工作流、知识库集成 |
核心差异:MCP 的 resources 机制支持 AI 模型订阅数据变化,这是 REST API 和 Function Calling 都没有的能力——AI 可以感知 Vault 里哪些文件被修改了,无需轮询。
2. Obsidian 的 MCP 生态
2.1 Local REST API v4.x 的双模式(REST + MCP)
obsidian-local-rest-api(GitHub: coddingtonbear/obsidian-local-rest-api)是 Obsidian 社区最成熟的外部 API 插件,目前有 2,422 个 star,v4.1.3 于 2026-06-04 更新。
v4.x 的重大变化是同时支持两种模式:
REST API 模式(传统):
GET /vault/{path} # 读取文件
PUT /vault/{path} # 创建/覆盖文件
DELETE /vault/{path} # 删除文件
PATCH /vault/{path} # 精准修改章节(v4 新增)
POST /search/simple/ # 全文搜索
POST /commands/{id}/ # 执行 Obsidian 命令
GET /active/ # 获取当前打开文件
MCP 服务器模式(v4 新增):
POST /mcp/ # MCP JSON-RPC 端点(Streamable HTTP)
GET /mcp/sse # SSE 传输端点(兼容旧客户端)
两种模式共用同一个 Obsidian 插件进程,通过请求路径区分,无需额外配置。
v4.1.3 重要安全修复:修复路径遍历漏洞 CVE GHSA-62gx-5q78-wrvx。强烈建议所有用户立即升级,旧版本存在攻击者通过 ../../ 路径读取 Vault 外文件的风险。
2.2 obsidian-mcp-plugin 独立方案
aaronsb/obsidian-mcp-plugin(340 stars,2025-06 发布)是另一个选择,定位为高性能独立 MCP 服务器。
与 Local REST API 相比的差异:
- 仅 MCP 模式,不提供 REST API 兼容层
- 更好的语义操作支持(如按标签批量操作笔记)
- 支持 HTTP 传输(适合多客户端同时连接)
- 适合只需要 MCP 接入的场景,比 Local REST API 更轻量
2.3 Claudian:Vault 作为 AI Agent 工作空间的新范式
Claudian(GitHub: YishenTu/claudian,12,534 stars,2025-12 发布)是 2025 年 Obsidian 社区最受关注的项目之一。
核心范式转变:传统方案是”在 Obsidian 里开一个 AI 聊天窗口”,Claudian 的范式是**“把 Claude Code / Codex 等 AI Agent 直接嵌入 Vault,让 Vault 成为 Agent 的工作目录”**。
这个区别至关重要:
- 传统方案:AI 通过 API 读取你的笔记,在对话中给建议
- Claudian 范式:AI 以 Vault 为工作目录,直接读写文件,执行 Shell 命令,调用 MCP 服务器
Claudian 的核心功能:
- 文件读写:AI 直接操作
.md文件,不经过 API 中转 - 全库语义搜索:基于 Obsidian 索引,不只是文本搜索
- Bash 执行:在 Vault 目录下执行 Shell 命令(如运行脚本处理笔记)
- 多步骤工作流:支持需要多次工具调用的复杂任务
- Inline Edit:选中任意文本 + 快捷键,AI 修改后以词级 Diff 预览,确认后应用
- Plan Mode:Agent 先输出执行计划,用户确认后再执行,避免意外修改
- @mention:在对话中引用 Vault 文件(
@filename)、子 Agent(@agent-name)、MCP 服务器(@mcp-server)
2.4 MCP 工具列表:Obsidian 暴露给 AI 的能力
通过 Local REST API 的 MCP 模式,AI 可以使用以下工具:
| 工具名 | 描述 | 参数示例 |
|---|---|---|
vault_read | 读取文件内容 | {"path": "Notes/todo.md"} |
vault_write | 写入文件 | {"path": "Notes/new.md", "content": "..."} |
vault_delete | 删除文件 | {"path": "Notes/old.md"} |
vault_patch | 修改指定章节 | {"path": "Notes/doc.md", "heading": "## 待办", "content": "..."} |
search | 全文搜索 | {"query": "MCP 协议"} |
command_exec | 执行 Obsidian 命令 | {"command_id": "obsidian-git:pull"} |
list_files | 列出目录文件 | {"path": "Projects/"} |
get_active | 获取当前打开文件 | {} |
3. Local REST API + MCP 完整配置
3.1 安装和基础配置
步骤一:安装 Obsidian 插件
在 Obsidian 中:
- 打开 设置 → 第三方插件 → 社区插件市场
- 搜索 “Local REST API”
- 安装并启用
- 在插件设置中找到 “API Key”,复制保存
步骤二:确认服务运行
插件启用后,默认在以下地址提供服务:
- HTTPS(默认):
https://127.0.0.1:27124 - HTTP(可选开启):
http://127.0.0.1:27123
在浏览器访问 https://127.0.0.1:27124/ 会看到 API 文档页面(需接受自签证书警告)。
步骤三:处理 HTTPS 自签证书
插件使用自签名 TLS 证书,程序访问时需要处理证书验证。有三种方案:
方案 A(推荐开发环境):禁用证书验证
import requests
requests.get("https://127.0.0.1:27124/", verify=False)方案 B(推荐生产环境):导出并信任插件生成的证书
# 从 Obsidian 插件设置页面导出证书,然后:
requests.get("https://127.0.0.1:27124/", verify="/path/to/obsidian-cert.pem")方案 C:改用 HTTP 端口(在插件设置中开启 HTTP,端口 27123)
# 无需证书处理,但通信不加密
requests.get("http://127.0.0.1:27123/")3.2 REST API 模式(Python 完整示例)
以下是一个完整的 Python 客户端,封装了常用操作:
"""
Obsidian Local REST API Python 客户端
适配 v4.1.3,支持全部核心端点
"""
import requests
import urllib3
from typing import Optional, List, Dict, Any
# 禁用自签证书警告(仅开发环境)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class ObsidianClient:
"""Obsidian Local REST API 客户端"""
def __init__(
self,
api_key: str,
host: str = "127.0.0.1",
port: int = 27124,
use_https: bool = True,
verify_ssl: bool = False,
):
self.base_url = f"{'https' if use_https else 'http'}://{host}:{port}"
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
})
self.session.verify = verify_ssl
# ──────────────────────────────────────────
# 文件基础操作
# ──────────────────────────────────────────
def read_note(self, path: str) -> str:
"""读取笔记内容"""
resp = self.session.get(f"{self.base_url}/vault/{path}")
resp.raise_for_status()
return resp.text
def write_note(self, path: str, content: str) -> Dict:
"""创建或覆盖笔记"""
resp = self.session.put(
f"{self.base_url}/vault/{path}",
data=content.encode("utf-8"),
headers={"Content-Type": "text/markdown"},
)
resp.raise_for_status()
return {"status": "ok", "path": path}
def delete_note(self, path: str) -> Dict:
"""删除笔记"""
resp = self.session.delete(f"{self.base_url}/vault/{path}")
resp.raise_for_status()
return {"status": "deleted", "path": path}
def list_directory(self, path: str = "") -> List[str]:
"""列出目录下的文件"""
resp = self.session.get(f"{self.base_url}/vault/{path}")
resp.raise_for_status()
return resp.json().get("files", [])
# ──────────────────────────────────────────
# 精准修改(v4 新增 PATCH 端点)
# ──────────────────────────────────────────
def patch_section(
self,
path: str,
heading: str,
new_content: str,
insert_position: str = "replace", # "replace" | "prepend" | "append"
) -> Dict:
"""
精准修改指定章节,不影响其他内容。
heading 示例:"## 待办事项" 或 "### 子标题"
"""
resp = self.session.patch(
f"{self.base_url}/vault/{path}",
json={
"heading": heading,
"content": new_content,
"insertPosition": insert_position,
},
)
resp.raise_for_status()
return resp.json()
def append_to_section(self, path: str, heading: str, content: str) -> Dict:
"""在指定章节末尾追加内容"""
return self.patch_section(path, heading, content, "append")
def prepend_to_section(self, path: str, heading: str, content: str) -> Dict:
"""在指定章节开头插入内容"""
return self.patch_section(path, heading, content, "prepend")
# ──────────────────────────────────────────
# 搜索
# ──────────────────────────────────────────
def search(self, query: str, context_length: int = 100) -> List[Dict]:
"""
全文搜索,返回匹配文件列表及上下文。
context_length:返回匹配行前后的字符数
"""
resp = self.session.post(
f"{self.base_url}/search/simple/",
json={"query": query, "contextLength": context_length},
)
resp.raise_for_status()
return resp.json()
# ──────────────────────────────────────────
# 执行 Obsidian 命令
# ──────────────────────────────────────────
def execute_command(self, command_id: str) -> Dict:
"""
执行 Obsidian 内置命令(如 obsidian-git:pull)。
命令 ID 可通过插件设置页面查看。
"""
resp = self.session.post(f"{self.base_url}/commands/{command_id}/")
resp.raise_for_status()
return {"status": "executed", "command": command_id}
def list_commands(self) -> List[Dict]:
"""列出所有可用命令"""
resp = self.session.get(f"{self.base_url}/commands/")
resp.raise_for_status()
return resp.json()
# ──────────────────────────────────────────
# 当前状态
# ──────────────────────────────────────────
def get_active_file(self) -> Dict:
"""获取 Obsidian 当前打开的文件"""
resp = self.session.get(f"{self.base_url}/active/")
resp.raise_for_status()
return resp.json()
# ──────────────────────────────────────────
# 使用示例
# ──────────────────────────────────────────
if __name__ == "__main__":
client = ObsidianClient(api_key="YOUR_API_KEY_HERE")
# 读取笔记
content = client.read_note("Projects/my-project.md")
print(content[:200])
# 写入新笔记
client.write_note(
"inbox/2026-06-09-meeting.md",
"# 会议记录\n\n## 议题\n\n## 结论\n",
)
# 在"## 结论"章节追加内容(不影响其他章节)
client.append_to_section(
"inbox/2026-06-09-meeting.md",
"## 结论",
"\n- 下周三前完成原型\n",
)
# 搜索包含 "MCP 协议" 的笔记
results = client.search("MCP 协议")
for r in results:
print(r["filename"], r.get("context", ""))
# 执行 Obsidian Git 插件的 pull 命令
client.execute_command("obsidian-git:pull")3.3 MCP 服务器模式配置
Claude Desktop 配置(~/Library/Application Support/Claude/claude_desktop_config.json on macOS,或 ~/.config/claude/claude_desktop_config.json on Linux):
{
"mcpServers": {
"obsidian": {
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE"
}
}
}
}Cursor 配置(.cursor/mcp.json 或全局 ~/.cursor/mcp.json):
{
"mcpServers": {
"obsidian-vault": {
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE"
},
"disabled": false
}
}
}Claude Code CLI 配置(.claude/mcp.json 或全局 ~/.claude/mcp.json):
{
"mcpServers": {
"obsidian": {
"type": "http",
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE"
}
}
}
}或者在项目级 .claude/settings.json 中配置(推荐,方便版本控制):
{
"mcpServers": {
"obsidian": {
"type": "http",
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer ${OBSIDIAN_API_KEY}"
}
}
}
}配合环境变量 export OBSIDIAN_API_KEY=your_key_here,避免密钥进入版本控制。
Continue(VS Code 插件)配置(~/.continue/config.json):
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "http",
"url": "https://127.0.0.1:27124/mcp/",
"requestOptions": {
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE"
}
}
}
}
]
}
}验证 MCP 连接是否正常(使用 curl 测试):
# 测试 MCP 端点响应(忽略证书错误)
curl -k -X POST https://127.0.0.1:27124/mcp/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{}},"id":1}'
# 期望返回:{"jsonrpc":"2.0","result":{"protocolVersion":"...","capabilities":{...},"serverInfo":{...}},"id":1}4. Claudian 深度使用指南
4.1 安装和初始化
在 Obsidian 中安装:
- 社区插件市场搜索 “Claudian”
- 安装启用后,在插件设置中填入:
- API Key:Anthropic API Key(
sk-ant-...) - Model:推荐
claude-sonnet-4-5(性价比最高) - Vault Root:确认为当前 Vault 路径
- API Key:Anthropic API Key(
4.2 将 Vault 作为 Claude Code 工作目录
Claudian 的核心机制:打开 Claudian 面板时,Agent 的工作目录(cwd)自动设置为 Vault 根目录。这意味着:
Vault/
├── inbox/ # Agent 可直接 ls、read、write
├── projects/ # Agent 以相对路径引用
├── experiences/ # Agent 写入提炼结果
└── .claude/ # Claude Code 配置(Slash Commands 等)
├── settings.json
└── commands/
├── organize-inbox.md
└── daily-review.md
Agent 可以执行的操作示例:
你:帮我整理 inbox/ 下所有今天的笔记,按主题分类移动到对应 projects/ 子目录
Agent 操作流程:
1. ls inbox/ # 列出文件
2. read inbox/2026-06-09-*.md # 读取内容
3. 分析主题 # LLM 推理
4. mkdir projects/mcp-research/ # 创建目录
5. write projects/mcp-research/notes.md # 写入整理结果
6. delete inbox/2026-06-09-*.md # 清理 inbox
4.3 Inline Edit 工作流
Inline Edit 是 Claudian 最高频的使用方式:
- 在 Obsidian 编辑器中选中一段文字(或将光标放在某行)
- 按
Cmd+Shift+E(或自定义快捷键)打开 Inline Edit 对话框 - 输入修改指令,如”将这段话改写为更专业的技术文档风格”
- AI 返回修改后的内容,以词级 Diff 高亮显示差异(绿色新增、红色删除)
- 按
Enter接受,按Escape取消
适用场景:
- 改写某段落的语气
- 将会议记录提炼为结构化笔记
- 将粗糙的想法扩展为完整段落
- 代码注释生成
4.4 Plan Mode 的正确使用
Plan Mode 的设计目的是处理高风险、多步骤的任务——在 AI 真正修改文件之前,先看到它打算做什么。
开启方式:在对话输入框点击 “Plan” 按钮,或以 /plan 开头输入指令。
示例:
/plan 把我 Vault 里所有超过 3 个月没更新、且没有任何外链的笔记移动到 Archive/ 目录
AI 会先输出:
计划:
1. 扫描所有 .md 文件的 frontmatter 中的 modified 日期
2. 检查每个文件在其他文件中是否被 [[wikilink]] 引用
3. 筛选出满足条件的文件(预计 47 个)
4. 创建 Archive/2026-06/ 目录
5. 移动文件并更新来源文件中的链接
是否继续?
用户确认后才执行。这是操作 Vault 核心内容时的最佳实践。
4.5 Slash Commands 定义知识管理任务
在 Vault 的 .claude/commands/ 目录下创建 .md 文件,即可定义可复用的 Slash Commands:
文件:Vault/.claude/commands/organize-inbox.md
# organize-inbox
整理 inbox/ 目录下的所有笔记:
1. 读取所有 `inbox/` 下的 `.md` 文件
2. 对每个文件判断其主要主题(技术/工作/学习/生活)
3. 在 `journal/YYYY-MM-DD-inbox-summary.md` 写入今日 inbox 摘要
4. 将有价值的内容提炼,追加到对应的 `projects/` 或 `experiences/` 文件
5. 将已处理的 inbox 文件移至 `archive/inbox/`
处理时保留原文链接(`[[原文件名]]`),不要丢失信息。使用时,在 Claudian 对话框输入 /organize-inbox 即可触发。
4.6 实际案例:用 Claudian 自动整理 inbox/
以下是一次完整的 inbox 整理会话示例:
用户:/organize-inbox
Claudian:我来整理 inbox/ 下的笔记...
[读取 inbox/2026-06-09-mcp-research.md]
主题:技术/AI工具
提炼要点:MCP 协议成为标准、Claudian 12k stars
[读取 inbox/2026-06-09-meeting-notes.md]
主题:工作/项目
提炼要点:Q2 目标讨论、产品路线图
[读取 inbox/2026-06-09-book-notes.md]
主题:学习/读书
提炼要点:《深度工作》第三章笔记
已处理 3 个文件,写入摘要到 journal/2026-06-09-inbox-summary.md
将 MCP 研究笔记追加到 experiences/ai-tools-research.md
将会议记录移至 projects/q2-planning/
将读书笔记追加到 reading/deep-work-notes.md
将原始文件归档到 archive/inbox/
完成!今日 inbox 已清空。
5. Claude Code Hooks + Obsidian 集成
5.1 会话结束自动提炼 Hook 配置
Claude Code 的 Hooks 机制允许在特定事件触发时运行自定义脚本。利用 Stop Hook(对话结束时触发),可以将每次 Claude Code 会话的关键信息自动写入 Obsidian Vault。
配置文件:.claude/settings.json
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "python3 /home/zbc/.claude/hooks/extract_to_obsidian.py"
}
]
}
]
}
}5.2 extract_to_obsidian.py 完整实现
#!/usr/bin/env python3
"""
Claude Code Stop Hook:会话结束后自动提炼关键信息写入 Obsidian
触发时机:每次 Claude Code 会话结束(用户输入 /exit 或关闭终端)
"""
import json
import os
import sys
import subprocess
from datetime import datetime
from pathlib import Path
# ──────────────────────────────────────────
# 配置
# ──────────────────────────────────────────
OBSIDIAN_API_URL = "http://127.0.0.1:27123" # 使用 HTTP 端口避免证书问题
OBSIDIAN_API_KEY = os.environ.get("OBSIDIAN_API_KEY", "")
VAULT_EXPERIENCES_DIR = "experiences"
VAULT_SESSIONS_DIR = "claude-sessions"
# ──────────────────────────────────────────
# 读取 Hook 输入(来自 Claude Code 标准输入)
# ──────────────────────────────────────────
def read_hook_input() -> dict:
"""读取 Claude Code 传入的 Hook 上下文"""
try:
raw = sys.stdin.read()
if raw.strip():
return json.loads(raw)
except (json.JSONDecodeError, Exception):
pass
return {}
# ──────────────────────────────────────────
# 提炼会话内容(调用本地 AI 或直接存储)
# ──────────────────────────────────────────
def extract_key_insights(session_data: dict) -> str:
"""
从会话数据中提炼关键信息。
如果有 Ollama 本地模型可用,使用 AI 提炼;否则原样存储。
"""
messages = session_data.get("messages", [])
if not messages:
return ""
# 构建会话摘要
today = datetime.now().strftime("%Y-%m-%d")
session_id = session_data.get("session_id", "unknown")[:8]
cwd = session_data.get("cwd", "unknown")
summary_lines = [
f"# Claude Code 会话 {today}-{session_id}",
f"\n工作目录:`{cwd}`\n",
"## 对话摘要\n",
]
# 提取用户消息(AI 的回复往往更长,先只存用户问题)
user_msgs = [
m.get("content", "")
for m in messages
if m.get("role") == "user"
][:5] # 最多取前 5 条
for i, msg in enumerate(user_msgs, 1):
truncated = msg[:200] + "..." if len(msg) > 200 else msg
summary_lines.append(f"{i}. {truncated}\n")
summary_lines.append("\n---\n*由 extract_to_obsidian.py 自动生成*\n")
return "\n".join(summary_lines)
# ──────────────────────────────────────────
# 写入 Obsidian
# ──────────────────────────────────────────
def write_to_obsidian(path: str, content: str) -> bool:
"""通过 Local REST API 写入文件到 Obsidian Vault"""
import urllib.request
url = f"{OBSIDIAN_API_URL}/vault/{path}"
data = content.encode("utf-8")
req = urllib.request.Request(
url,
data=data,
method="PUT",
headers={
"Authorization": f"Bearer {OBSIDIAN_API_KEY}",
"Content-Type": "text/markdown",
},
)
try:
with urllib.request.urlopen(req, timeout=5) as resp:
return resp.status in (200, 204)
except Exception as e:
print(f"[Hook] 写入 Obsidian 失败:{e}", file=sys.stderr)
return False
def main():
if not OBSIDIAN_API_KEY:
print("[Hook] OBSIDIAN_API_KEY 未设置,跳过", file=sys.stderr)
return
hook_data = read_hook_input()
content = extract_key_insights(hook_data)
if not content:
return
today = datetime.now().strftime("%Y-%m-%d")
now = datetime.now().strftime("%H%M%S")
file_path = f"{VAULT_SESSIONS_DIR}/{today}-{now}.md"
if write_to_obsidian(file_path, content):
print(f"[Hook] 会话记录已写入 Vault:{file_path}")
else:
print("[Hook] 写入失败,会话记录丢失", file=sys.stderr)
if __name__ == "__main__":
main()5.3 claude-obsidian-chronicle 方案
takashito/claude-obsidian-chronicle 是一个更完整的解决方案,提供:
- 自动记录每次 Claude Code 会话的完整对话
- 按日期、项目归档
- 支持搜索历史会话
- Frontmatter 元数据(项目路径、工具调用次数等)
安装方式:
pip install claude-obsidian-chronicle
# 或
npm install -g claude-obsidian-chronicle配置(.claude/settings.json):
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "chronicle --vault /path/to/your/vault --dir claude-sessions"
}
]
}
]
}
}6. n8n 自动化工作流
6.1 n8n 安装(Docker)
# 创建数据目录
mkdir -p ~/.n8n
# 启动 n8n(使用 host 网络模式,方便访问本地 Obsidian API)
docker run -d \
--name n8n \
--network host \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=admin \
-e N8N_BASIC_AUTH_PASSWORD=your_password \
-e WEBHOOK_URL=http://localhost:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n:latest
# 浏览器访问:http://localhost:56786.2 安装 Obsidian n8n 社区节点
在 n8n 界面:
- 设置 → 社区节点 → 安装
- 安装
n8n-nodes-obsidian-local-rest-api(j-shelfwood 维护,13 stars)
配置凭据(Credentials):
名称:Obsidian Local API
API URL:http://127.0.0.1:27123
API Key:YOUR_API_KEY_HERE
6.3 完整工作流示例一:定时整理 inbox
以下工作流每天 9:00 自动处理 inbox:
{
"name": "Daily Inbox Processor",
"nodes": [
{
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"hour": 9,
"minute": 0
}
}
},
{
"name": "List Inbox Files",
"type": "n8n-nodes-obsidian-local-rest-api.obsidian",
"parameters": {
"operation": "listFiles",
"path": "inbox/"
}
},
{
"name": "Split Files",
"type": "n8n-nodes-base.splitInBatches",
"parameters": {
"batchSize": 1
}
},
{
"name": "Read File Content",
"type": "n8n-nodes-obsidian-local-rest-api.obsidian",
"parameters": {
"operation": "getFile",
"path": "={{ $json.filename }}"
}
},
{
"name": "AI Categorize",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o-mini",
"prompt": "将以下笔记分类为:技术/工作/学习/生活/其他。只回答分类名称。\n\n{{ $json.content }}"
}
},
{
"name": "AI Extract Summary",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o-mini",
"prompt": "用3句话提炼以下笔记的核心要点:\n\n{{ $json.content }}"
}
},
{
"name": "Write to Experiences",
"type": "n8n-nodes-obsidian-local-rest-api.obsidian",
"parameters": {
"operation": "patchFile",
"path": "experiences/{{ $json.category }}.md",
"heading": "## {{ $now.format('yyyy-MM-dd') }}",
"content": "{{ $json.summary }}\n\n来源:[[{{ $json.filename }}]]\n",
"insertPosition": "append"
}
},
{
"name": "Archive Original",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "http://127.0.0.1:27123/commands/file-explorer:move-file/",
"authentication": "headerAuth",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
]
}6.4 完整工作流示例二:Webhook 触发实时处理
使用 Masterb1234/obsidian-post-webhook 插件,在 Obsidian 保存文件时触发 n8n:
Obsidian 插件配置(obsidian-post-webhook):
{
"webhookUrl": "http://localhost:5678/webhook/obsidian-save",
"triggerOn": "file-modify",
"pathFilter": "inbox/",
"includeContent": true
}n8n Webhook 工作流:
{
"name": "Realtime Inbox Processor",
"nodes": [
{
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "obsidian-save",
"method": "POST"
}
},
{
"name": "Check if Inbox",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"string": [{
"value1": "={{ $json.body.path }}",
"operation": "startsWith",
"value2": "inbox/"
}]
}
}
},
{
"name": "Process with AI",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o-mini",
"prompt": "提炼关键信息...\n\n{{ $json.body.content }}"
}
}
]
}7. 多 Agent 协作架构
7.1 ml-brainclone 的 4 Agent 分工模式分析
Ambivrt/ml-brainclone(2026-04 发布)是目前最完整的多 Agent 知识库管理开源方案。其 4 Agent 架构如下:
┌─────────────────┐
│ Orchestrator │ 任务分发、状态管理
└────────┬────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Ingestion │ │ Refinement │ │ Review │
│ Agent │ │ Agent │ │ Agent │
│ 摄取 Agent │ │ 提炼 Agent │ │ 审查 Agent │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────────▼──────────────────┘
┌─────────────────┐
│ Consumer │
│ Agent │
│ 消费 Agent │
└─────────────────┘
各 Agent 职责:
| Agent | 职责 | 输入 | 输出 |
|---|---|---|---|
| Orchestrator | 任务调度、状态同步 | 外部触发(定时/事件) | 任务队列 |
| Ingestion Agent | 从外部源抓取内容 | RSS/URL/文件/API | inbox/ 原始笔记 |
| Refinement Agent | 提炼、分类、链接 | inbox/ 笔记 | experiences/ 知识条目 |
| Review Agent | 质量检查、去重 | experiences/ 内容 | 审核通过/打回 |
| Consumer Agent | 按需检索、生成回答 | 用户查询 | 结构化答案 |
7.2 设计自己的多 Agent 知识管理系统
基于 Claude Code SDK(Multi-Agent)的最小实现:
"""
简化版多 Agent 知识管理系统
使用 Claude Code SDK + Obsidian MCP
"""
import asyncio
from anthropic import Anthropic
client = Anthropic()
OBSIDIAN_TOOLS = [
{
"name": "read_note",
"description": "读取 Obsidian Vault 中的笔记",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "文件路径,相对于 Vault 根目录"}
},
"required": ["path"]
}
},
{
"name": "write_note",
"description": "写入笔记到 Obsidian Vault",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string"},
"content": {"type": "string"}
},
"required": ["path", "content"]
}
},
{
"name": "search_vault",
"description": "搜索 Vault 中的笔记",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"}
},
"required": ["query"]
}
}
]
async def run_ingestion_agent(raw_content: str) -> str:
"""摄取 Agent:将原始内容结构化写入 inbox"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2000,
tools=OBSIDIAN_TOOLS,
system="你是一个知识摄取 Agent。将输入内容结构化为 Obsidian 笔记格式,写入 inbox/。",
messages=[{"role": "user", "content": f"处理以下内容:\n\n{raw_content}"}]
)
# 处理工具调用(实际实现需处理 tool_use 响应)
return response.content[0].text if response.content else ""
async def run_refinement_agent(inbox_path: str) -> str:
"""提炼 Agent:从 inbox 笔记提炼知识条目"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=3000,
tools=OBSIDIAN_TOOLS,
system=(
"你是一个知识提炼 Agent。读取 inbox 笔记,"
"提炼核心知识点,写入 experiences/ 目录。"
"使用 Zettelkasten 格式,每条知识独立成文件。"
),
messages=[{"role": "user", "content": f"提炼这篇笔记:{inbox_path}"}]
)
return response.content[0].text if response.content else ""
async def orchestrate():
"""Orchestrator:协调各 Agent 的执行"""
# 1. 摄取阶段
raw_data = "今天学习了 MCP 协议,发现 Claudian 很有用..."
await run_ingestion_agent(raw_data)
# 2. 提炼阶段(并发处理多个 inbox 文件)
inbox_files = ["inbox/2026-06-09-001.md", "inbox/2026-06-09-002.md"]
tasks = [run_refinement_agent(f) for f in inbox_files]
results = await asyncio.gather(*tasks)
print(f"处理完成:{len(results)} 个知识条目")
if __name__ == "__main__":
asyncio.run(orchestrate())8. 安全注意事项
8.1 API Key 管理最佳实践
不推荐(密钥硬编码):
{
"mcpServers": {
"obsidian": {
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer abc123xyz456"
}
}
}
}推荐(环境变量):
{
"mcpServers": {
"obsidian": {
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer ${OBSIDIAN_API_KEY}"
}
}
}
}在 shell 配置文件(~/.zshrc 或 ~/.bashrc)中:
export OBSIDIAN_API_KEY="your_actual_key_here"Keychain 方案(最安全):
# macOS:使用系统 Keychain 存储
security add-generic-password -s "obsidian-api" -a "local" -w "your_key"
# 读取时:
export OBSIDIAN_API_KEY=$(security find-generic-password -s "obsidian-api" -w)8.2 HTTPS 自签证书的正确处理
开发环境(可接受):禁用验证
import urllib3
urllib3.disable_warnings()
requests.get(url, verify=False)生产/共享环境(推荐):导出并信任证书
- 在 Obsidian Local REST API 插件设置中找到”Export Certificate”
- 将
.pem文件保存到~/.config/obsidian/local-rest-api-cert.pem - 在代码中指定:
requests.get(url, verify="~/.config/obsidian/local-rest-api-cert.pem") - 或将其添加到系统信任:
# Linux sudo cp obsidian-cert.pem /usr/local/share/ca-certificates/obsidian.crt sudo update-ca-certificates
8.3 CVE GHSA-62gx-5q78-wrvx 路径遍历漏洞
漏洞描述:obsidian-local-rest-api v4.1.3 之前的版本存在路径遍历漏洞。攻击者可以通过构造特殊请求(如 GET /vault/../../etc/passwd)读取 Vault 目录之外的任意文件。
影响范围:所有 v4.1.2 及更早版本。
修复状态:v4.1.3(2026-06-04 发布)已修复,通过对路径进行规范化处理,拒绝任何包含 ../ 序列的请求。
升级方法:
- Obsidian → 设置 → 第三方插件 → 已安装插件 → Local REST API → 检查更新
缓解措施(如无法立即升级):
- 确保 API 仅监听
127.0.0.1(不绑定0.0.0.0) - 防火墙规则阻止外部访问 27123/27124 端口
- 定期轮换 API Key
8.4 本地 only vs 允许远程访问的取舍
| 方案 | 安全性 | 便利性 | 适用场景 |
|---|---|---|---|
| 仅本地(127.0.0.1) | 最高 | 仅本机可用 | 个人使用 |
| 局域网(192.168.x.x) | 中 | 同网络设备可用 | 家庭/小团队 |
| 公网(+Tailscale) | 高 | 任意设备可用 | 远程工作 |
| 公网(直接暴露) | 低 | 任意设备可用 | 不推荐 |
推荐方案:本地 + Tailscale VPN。Tailscale 提供 WireGuard 加密隧道,只有你的授权设备能访问,且无需公网端口。
Tailscale + Obsidian 配置:
{
"mcpServers": {
"obsidian-remote": {
"url": "https://my-mac.tailnet-xyz.ts.net:27124/mcp/",
"headers": {
"Authorization": "Bearer ${OBSIDIAN_API_KEY}"
}
}
}
}9. 完整集成方案速查
9.1 按需求选择方案
| 需求 | 推荐方案 | 核心工具 |
|---|---|---|
| Claude Desktop 访问 Obsidian | MCP 直连 | Local REST API v4.x(MCP 模式) |
| 在 Obsidian 里运行 AI Agent | 嵌入 Agent | Claudian |
| Python 脚本操作 Vault | REST API | Local REST API v4.x(REST 模式)+ Python client |
| 定时自动整理笔记 | 工作流自动化 | n8n + obsidian 节点 |
| 实时触发处理(文件保存时) | Webhook | obsidian-post-webhook + n8n |
| 会话记录存档 | Hook 集成 | claude-obsidian-chronicle |
| 多 Agent 知识管理 | Agent 编排 | ml-brainclone 或自定义 |
| VS Code/Cursor 访问 Vault | MCP 直连 | Local REST API(MCP 模式) |
| 仅 MCP,不需要 REST | 轻量方案 | obsidian-mcp-plugin |
9.2 推荐组合搭配
个人知识管理(最小配置):
Local REST API v4.1.3(REST + MCP)
+ Claude Desktop(MCP 连接)
+ claude-obsidian-chronicle(会话存档 Hook)
进阶自动化:
Local REST API v4.1.3
+ Claudian(Vault-as-workspace)
+ n8n(定时 + Webhook 工作流)
+ obsidian-post-webhook(实时触发)
团队/企业级:
Local REST API v4.1.3
+ Tailscale(安全远程访问)
+ n8n(企业自动化平台)
+ 自定义多 Agent 系统(基于 ml-brainclone 改造)
+ Obsidian Publish(知识对外分享)
9.3 版本兼容矩阵
| 组件 | 最低要求版本 | 当前推荐版本 | 备注 |
|---|---|---|---|
| obsidian-local-rest-api | v4.1.3 | v4.1.3 | 安全版本,必须升级 |
| Obsidian | 1.5.0+ | 最新版 | MCP 模式需要 |
| Claude Code CLI | 1.0.0+ | 最新版 | Hooks 支持 |
| Claude Desktop | 任意 | 最新版 | MCP 原生支持 |
| n8n | 1.0.0+ | 最新版 | 社区节点支持 |
| Python | 3.9+ | 3.11+ | f-string 和类型注解 |
| Node.js | 18+ | 20 LTS | Claudian 运行时 |
总结
MCP 协议在 2025 年的快速普及,将 Obsidian 知识库从”被动的笔记存储”转变为”AI Agent 的主动工作空间”。本文覆盖的技术栈代表了当前该领域最前沿的实践:
-
Local REST API v4.1.3 的双模式设计,使同一个插件既能被 Python 脚本调用,也能作为 MCP Server 直接服务于 Claude Desktop、Cursor 等 AI 工具,是目前最成熟的 Obsidian 外部集成方案。
-
Claudian 代表的 Vault-as-AI-workspace 新范式,彻底改变了”AI 辅助笔记”的工作方式——不再是”问 AI 怎么写”,而是”让 AI 直接在你的知识库里工作”。
-
Hooks + n8n 的工作流自动化,补全了从被动触发到主动执行的最后一公里,使知识库真正实现自运转。
建议从最小配置入手:安装 Local REST API v4.1.3,配置 MCP 连接到 Claude Desktop,验证基础功能后,再逐步引入 Claudian、n8n 等更复杂的组件。
参考资源:
- obsidian-local-rest-api: https://github.com/coddingtonbear/obsidian-local-rest-api
- Claudian: https://github.com/YishenTu/claudian
- MCP 官方文档: https://modelcontextprotocol.io/docs
- n8n 文档: https://docs.n8n.io