obsidian-knowledge-mcp
Enables hybrid vector-BM25 search and retrieval of Obsidian vault knowledge notes, allowing AI assistants like Claude to efficiently access relevant chunks without full file reads.
README
obsidian-knowledge-mcp
Obsidian vault の知識ノート (learnings / references / reviews などの markdown) を、全文読みせず vector + BM25 ハイブリッド検索で必要チャンクだけ取得するための MCP サーバーである。Claude Code の skill が抱える知識ファイルを検索対象とすることを想定している。
重要な前提
vault リポジトリは public 化しない前提である。 このサーバーは vault 内の知識本文をローカル sqlite (DB_PATH) にインデックスし、検索結果としてチャンク本文をそのまま返す。vault 本体・インデックス DB のいずれも公開してはならない。
アーキテクチャ
- チャンク分割: markdown を
##/###見出し単位で分割し、約 3200 文字を超える場合は段落境界でさらに分割する。frontmatter (skill/repo/domain/type) はyamlパッケージ (YAML 1.2) でパースし、chunk_metaテーブルへメタデータとして展開してフィルタに使う。各キーは複数値 (配列) を許容し、ノートは例えばdomainに複数のドメインを宣言できる - embedding: ollama の
/api/embed(既定モデル bge-m3、1024 次元) - 検索: sqlite-vec の vec0 による KNN (cosine) と FTS5 (
tokenize='trigram') の BM25 を各 top 20 取得し、RRF (k=60) で統合する - インデックス更新: サーバー起動時と毎
search_knowledge呼び出し冒頭に mtime/size 突合の lazy 同期を行い、変化したファイルだけ再チャンク・再 embed する。検索した瞬間に必ず最新であることを保証する
前提
- Node.js v24 以上
- ollama が起動しており、embedding モデルを取得済みであること
ollama pull bge-m3
セットアップ
npm install
npm run build
Claude Code への登録例
claude mcp add obsidian-knowledge \
--env VAULT_ROOT=/path/to/obsidian-vault \
--env KNOWLEDGE_DIR=knowledge \
-- node /path/to/obsidian-knowledge-mcp/dist/src/index.js
環境変数
| 変数 | 必須 | 既定値 | 説明 |
|---|---|---|---|
VAULT_ROOT |
yes | - | 検索対象のルートディレクトリ (絶対パス) |
KNOWLEDGE_DIR |
yes | - | VAULT_ROOT 配下の相対ディレクトリ。この配下の **/*.md がインデックス対象 |
OLLAMA_URL |
no | http://localhost:11434 |
ollama サーバーの URL |
EMBED_MODEL |
no | bge-m3 |
embedding モデル名 (1024 次元であること) |
DB_PATH |
no | ~/.local/share/obsidian-knowledge-mcp/index.db |
インデックス sqlite ファイル。ディレクトリは自動作成される |
MCP ツール仕様
search_knowledge
vector + BM25 のハイブリッド検索で関連チャンクを返す。知識ファイルの全文読みの代わりにまずこれを使う。
- 入力
query: string— 検索クエリ (日本語 / 英語)filter?: { skill?, repo?, domain?, type? }— frontmatter 由来のメタデータで絞り込み。各 filter 値は文字列 1 つだが、判定は containment (そのノートが宣言する値集合に filter 値が含まれていればヒット) なので、domainを複数持つノートもいずれか一致すればヒットするtop_k?: number— 返却件数 (既定 8)
- 返却: 各ヒットの
path/heading/score/ チャンク本文。末尾にtotal bytes returned: Nを付け、stderr にも返却バイト数をログする
read_knowledge
ノート全文を返す。search_knowledge のチャンクで足りない場合のみ使う。
- 入力:
path: string—VAULT_ROOTからの相対パスまたは絶対パス。VAULT_ROOT外へのパストラバーサルは拒否する
reindex_knowledge
mtime 差分検知を無視した強制再インデックス。
- 入力:
scope?: string—VAULT_ROOTからの相対パス prefix。指定時はその配下のみ再構築する - 返却: indexed files / chunks 数などのサマリ
CLI での動作確認
MCP を経由せず search_knowledge 相当を直接叩ける。
VAULT_ROOT=/path/to/vault KNOWLEDGE_DIR=knowledge \
npm run dev-search -- "リトライの冪等性" --top-k 5
--skill / --repo / --domain / --type / --top-k オプションを受け付ける。
eval (golden query 評価)
eval/golden-queries.json に期待クエリを書き、hit@1 / hit@3 / hit@10 を計測する。
このファイルは期待する path や本文断片という形で vault 本文の抜粋を含むため gitignore してあり、リポジトリには入らない。スキーマの例として eval/golden-queries.example.json をコミットしてあるので、これをコピーして自分の vault に合わせて書き換える。
cp eval/golden-queries.example.json eval/golden-queries.json
VAULT_ROOT=/path/to/vault KNOWLEDGE_DIR=knowledge npm run eval
golden query の形式は次のとおりである。
[
{
"query": "一覧取得のたびに関連レコードを 1 件ずつ引いてしまう",
"filter": { "repo": "my-repo" },
"expect_path_contains": "learnings/db",
"expect_content_contains": "eager loading"
}
]
filter と expect_content_contains は省略できる。golden-queries.json が存在しない場合、npm run eval は評価をスキップして正常終了する。
既知の制約
- FTS5 の trigram tokenizer は 3 文字未満の語にマッチできない。クエリは空白区切りトークンのうち 3 文字以上のものだけを OR 結合して MATCH に使うため、2 文字の日本語単語 (例: 「設定」) は BM25 側では拾えない。その場合も vector 検索側が意味的に補完する
- frontmatter は
---区切りブロックをyamlパッケージ (YAML 1.2) でパースする。ネストしたオブジェクト値はskill/repo/domain/typeとしては展開されず (空扱いになり警告を記録する)、YAML 構文エラーのノートは索引全体を落とさないよう frontmatter 無し扱いにフォールバックする domainなどの frontmatter キーは配列で複数値を宣言できる (例:domain: [domain-a, domain-b])。search_knowledgeの filter は containment で一致判定するが、MCP ツールスキーマ上の filter 値そのものは単一文字列のみを受け付ける (配列 filter は未対応)- インデックス DB (
DB_PATH) は vault から常に再生成できる派生キャッシュである。内部スキーマはPRAGMA user_versionで管理しており、バージョンが変わるとfiles/chunks/chunk_meta/vec_chunks/fts_chunksを全て作り直す (再起動時に自動で再インデックスされる)。このリポジトリのコードを旧バージョンへ戻す場合は DB ファイルの削除が必須である。旧コードは新スキーマのchunk_metaテーブルを認識せず、逆に新スキーマには旧コードが期待するchunks.skill/chunks.repo/chunks.domain/chunks.type列が存在しない read_knowledgeのパス検証は正規化ベースであり、VAULT_ROOT内から外部を指す symlink は検出しない
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。