Vault MCP Server
by gzlance
README.md
# Vault MCP Server
个人知识库 + 代码图谱统一 MCP 服务。
**最后更新:** 2026-05-12
**Python:** 3.10+
**协议:** MCP stdio
---
## 项目概述
Vault MCP Server 基于 Obsidian Vault 构建统一个人知识库,通过 MCP 协议与 Claude Code 深度集成。工作或学习中解决的问题、学到的知识,一句话就能按模板持久化为 Markdown 笔记,后续在任何项目中都能全文检索复用。
核心能力:
- **结构化存储** — Markdown + YAML frontmatter,文件名 kebab-case,使用 Obsidian `[[wikilink]]` 格式链接笔记
- **全文索引** — SQLite FTS5 + BM25 相关度排序,覆盖 permanent/、project/、graphify/ 全部目录
- **代码图谱** — graphify CLI(tree-sitter AST)自动提取代码结构,生成可浏览的模块笔记
- **上下文恢复** — 读取项目会话日志和架构决策笔记,快速恢复工作状态
- **引用图分析** — 追踪 wikilink 引用关系,检测孤立笔记
架构分层:
```
Claude Code ──MCP──> Vault MCP Server ──SQLite──> ~/vault/ (.md 笔记文件)
| |
| /kb 路由指令 ├── vault_init/save/search/resume/list/stats/orphan/update/tags/log
| (~/.claude/skills/ └── graphify_build/status/query
| kb.md)
|
└── (可选) Obsidian 客户端 ──> 知识图谱可视化浏览
```
---
## 快速开始
### 1. 安装依赖
```bash
pip install mcp>=1.0.0
# graphify 为可选依赖,用于代码图谱功能
pip install graphifyy
```
### 2. 启动 MCP Server(手动验证)
```bash
PYTHONIOENCODING=utf-8 python ~/scripts/vault-mcp-server/server.py
```
### 3. 注册到 Claude Code
编辑 `~/.claude/mcp.json`,在 `mcpServers` 中添加:
```json
{
"mcpServers": {
"vault": {
"command": "python",
"args": [
"~/scripts/vault-mcp-server/server.py"
],
"env": {
"PYTHONIOENCODING": "utf-8"
}
}
}
}
```
或者一键安装:
```bash
# Windows
powershell -ExecutionPolicy Bypass -File release/install.ps1
# Linux/macOS
bash release/install.sh
```
验证注册:
```bash
claude mcp list
```
### 4. 初始化知识库
首次使用需要初始化 Vault 目录结构和 SQLite 数据库:
```bash
# 对 Claude Code 说
初始化知识库
# 或指定项目目录
/kb init --project myproject
```
---
## 命令参考
共 13 个 MCP 工具,分为核心工具、管理工具和代码图谱工具三类。
### 核心工具 (P0)
| 工具名 | 功能 | 必填参数 | 说明 |
|--------|------|----------|------|
| `vault_init` | 初始化 Vault 目录 + 模板 + SQLite | 无 | 幂等操作,已初始化部分自动跳过 |
| `vault_save` | 保存知识笔记 | `title`, `content`, `tags`, `type` | 自动匹配已有笔记生成 `[[wikilink]]`,写入 .md 并更新 FTS5 索引 |
| `vault_search` | FTS5 全文搜索 | `query` | 返回标题、片段高亮、标签、相关度分数,支持按 tag/project/type 过滤 |
| `vault_resume` | 恢复项目工作上下文 | `project` | 读取最近 N 个会话日志 + 架构决策笔记 |
| `vault_log` | 写入会话日志 | `project`, `summary` | 记录做了什么、决策、待办事项 |
### 管理工具 (P1)
| 工具名 | 功能 | 必填参数 | 说明 |
|--------|------|----------|------|
| `vault_list` | 条件列表查询 | 无 | 支持按 tag/project/type/status 过滤,分页排序 |
| `vault_stats` | 知识库统计面板 | 无 | 笔记总数、类型分布、Top 标签、链接密度 |
| `vault_orphan` | 孤立笔记检测 | 无 | 找出入度为 0 或出度为 0 的笔记 |
| `vault_update` | 更新已有笔记 | `note_path` | 替换或追加正文,保留 frontmatter,更新索引 |
| `vault_tags` | 标签索引查询 | 无 | 返回所有已用标签及使用频次,支持模糊搜索 |
### 代码图谱工具 (P1)
| 工具名 | 功能 | 必填参数 | 说明 |
|--------|------|----------|------|
| `graphify_build` | 构建代码图谱 | `project`, `project_dir` | 调用 graphify CLI 解析 AST,生成模块笔记到 Vault |
| `graphify_status` | 图谱构建状态 | `project` | 上次构建时间、节点数、边数、社区数 |
| `graphify_query` | 代码符号搜索 | `project`, `symbol` | 在 graph.json 中模糊匹配符号,返回所属模块 |
### 笔记类型
| type | 用途 | 存放位置(无项目) | 存放位置(有项目) |
|------|------|-------------------|-------------------|
| `permanent` | 永不删除的原子知识笔记 | `~/vault/permanent/` | `~/vault/<project>/architecture/` |
| `solution` | 技术问题解决方案 | `~/vault/permanent/` | `~/vault/<project>/features/` |
| `concept` | 概念解释 | `~/vault/permanent/` | `~/vault/<project>/architecture/` |
| `tool` | 工具使用技巧 | `~/vault/permanent/` | `~/vault/<project>/data/` |
| `session-log` | 会话日志(自动归入 logs/) | `~/vault/logs/` | `~/vault/<project>/logs/` |
| `code-graph` | 代码图谱笔记(自动生成) | — | `~/vault/graphify/<project>/` |
> **项目自动检测:** 在项目窗口中保存时,`vault_save` 自动从 CWD 检测项目名,笔记路由到对应项目子目录。系统级知识(环境配置、通用技巧等)不传 `project` 即存入 `permanent/`。
---
## 典型工作流
### 工作流 1: 解决问题后保存
```
用户: "git push 总是失败,报 permission denied"
Claude 排查并解决问题...
用户: "把这个解决方案保存到知识库"
```
Claude 执行流程:
1. 回顾对话,提取问题背景、解决方案、关键命令
2. 确定 `title`(如 "Git 推送权限被拒的排查步骤")
3. 确定 `tags`(如 `["git", "ssh", "permission"]`)和 `type: solution`
4. 构建 Markdown 正文,手动添加或让系统自动生成 `[[wikilink]]`
5. 调用 `vault_save`(服务端会自动检测正文中出现的已知笔记标题,替换为 `[[wikilink]]` 格式)
6. 返回结果:`created → permanent/git-push-quan-xian-bei-ju-de-pai-cha-bu-zhou.md | wikilinks: 3`(如关联项目则自动路由到 `<project>/features/`)
> **自动 wikilink 机制:** `vault_save` 在保存时自动扫描正文,将已知笔记标题的纯文本出现替换为 `[[标题]]` 格式,无需手动添加链接。
### 工作流 2: 搜索复用知识
```
用户: "之前那个 Windows 下 subprocess 编码问题的解决方案还在吗?"
# 或直接用命令
/kb search Windows subprocess 编码
```
Claude 调用 `vault_search`,参数 `{"query": "Windows subprocess 编码"}`,返回结构化结果:
```json
{
"status": "ok",
"query": "Windows subprocess 编码",
"count": 3,
"results": [
{
"title": "Windows Python subprocess 乱码解决方案",
"snippet": "...设置 <b>PYTHONIOENCODING</b>=utf-8...",
"tags": ["windows", "python", "encoding"],
"type": "solution",
"score": 0.87
}
]
}
```
用户可直接在对话中引用笔记内容,Claude 自动应用其中的方案。
### 工作流 3: 恢复工作上下文
```
用户: "继续昨天 myproject 的工作"
# 或
/kb resume myproject
```
Claude 调用 `vault_resume`,参数 `{"project": "myproject", "log_count": 3}`,返回:
- 最近 3 篇会话日志(含做了什么、决策、待办)
- 最近 5 篇架构决策笔记
Claude 用自然语言总结:
> 上次你在 myproject 做了以下工作:
> 1. 实现了 MCP Server 的核心工具 save/search/resume
> 2. 决策:SQLite 用标准库 sqlite3,不引入 ORM
> 3. 待办:补充单元测试、完善错误处理
>
> 需要我帮你继续其中某件事吗?
---
## 目录结构
### Vault MCP Server 源码
```
~/scripts/vault-mcp-server/
├── server.py # MCP 入口,注册 13 个工具,stdio 通信
├── db.py # SQLite 数据库层 (VaultDB 类)
├── requirements.txt # mcp>=1.0.0, graphifyy (可选)
├── tools/
| ├── __init__.py
| ├── _shared.py # 公共工具: 输入校验、JSON 回复、路径处理
| ├── vault_tools.py # 10 个核心 + 管理工具实现
| └── graphify_tools.py # 3 个代码图谱工具实现
└── tests/ # 单元/集成/E2E 测试(228)
```
### Vault 知识库
```
~/vault/ # Obsidian Vault 根目录
├── CLAUDE.md # Vault 使用规则(笔记规范 + 三层查询策略)
├── permanent/ # 永久知识笔记 (type: permanent/solution/concept)
├── templates/
| ├── default-note.md # 通用笔记模板
| └── session-log.md # 会话日志模板
├── logs/ # 全局会话日志 (type: session-log)
├── <project>/ # 项目笔记(每个项目一个子目录)
| ├── architecture/ # 架构设计、概念笔记 (type: permanent/concept)
| ├── features/ # 功能方案、问题解决 (type: solution)
| ├── data/ # 数据模型、工具技巧 (type: tool)
| └── logs/ # 项目会话日志 (type: session-log)
└── graphify/ # 代码图谱笔记
└── <project>/
├── Index.md # 图谱索引
└── Community-*.md # 按社区(模块)分类的代码笔记
```
### Claude Code 配置
```
~/.claude/
├── skills/
│ └── kb/
│ └── SKILL.md # /kb 路由指令
└── .claude.json # 用户级配置(含 MCP servers)
```
---
## 常见问题
### graphify CLI 未安装
graphify 是可选依赖,未安装时不影响核心知识库功能。如果运行 `/kb graphify build` 时提示未安装:
```bash
pip install graphifyy
```
如果安装后仍报 "graphify CLI 未安装",检查 PATH 是否正确,或使用完整路径:
```bash
# 查看 graphify 安装位置
pip show graphifyy | grep Location
```
### 中文搜索效果不佳
SQLite FTS5 默认使用空格分词,对中文(无空格分隔)效果可能不理想。当前方案:
- 短关键词(2-3 字)可精确匹配
- 长句搜索建议用关键词组合而非完整句子
- 标题精确匹配不受分词影响
Vault MCP Server 已配置 `PYTHONIOENCODING=utf-8`,确保中文内容读写无乱码。
### Windows 编码问题
在 Windows 上如果遇到 GBK 编码错误,确保:
1. 环境变量 `PYTHONIOENCODING=utf-8` 已设置
2. MCP Server 启动命令中已包含 `"env": {"PYTHONIOENCODING": "utf-8"}`
3. 所有 .md 文件以 UTF-8 编码写入
### MCP Server 启动失败
```bash
# 检查 Python 版本 (需要 3.10+)
python --version
# 检查 mcp 包是否安装
pip show mcp
# 手动启动测试
python C:/Users/Gzlance/scripts/vault-mcp-server/server.py
# 如果无报错退出,说明 MCP stdio 正常启动
```
### 笔记保存后搜索不到
`vault_save` 同步写入 .md 文件和 SQLite 索引。如果搜索不到,检查:
1. `~/vault/` 下对应的 .md 文件是否存在
2. SQLite 数据库是否损坏:删除 `~/vault/.vault.db` 后重新运行 `vault_init`(不影响已有的 .md 文件)
### Vault 目录在哪里
默认 `~/vault/`,即 `C:\Users\<你的用户名>\vault\`。可在每次调用时通过 `vault_dir` 参数覆盖,或设置环境变量 `VAULT_DIR` 指定。
---
## 相关文档
- PRD 与完整规格: `docs/prd-knowledge-base.md`
- 使用手册: `docs/USER_GUIDE.md`
- 路由 Skill: `~/.claude/skills/kb/SKILL.md`
- Obsidian Vault 社区方案: [wangjun.dev](https://www.wangjun.dev/2026/05/claude-code-memory-setup/)
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues