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 は検出しない
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.