Skip to main content

Semantic recommendation engine for Obsidian vaults — embeddings + wiki-link graph boosting with MCP server for Claude Code integration.

Project description

vault-recommender

Semantic recommendation engine for Obsidian vaults. Uses sentence-transformer embeddings + wiki-link graph boosting to surface related notes, forgotten knowledge, and missing connections.

Designed as a tool for LLMs — returns context-rich results with explanations, not just ranked paths.

How it works

Your vault (markdown files)
       │
   Parser ─── extracts frontmatter, body, wiki-links
       │
   Indexer ─── embeds each note as a 384-dim vector (all-MiniLM-L6-v2)
       │
   Link Graph ─── builds bidirectional wiki-link adjacency
       │
   Recommender ─── cosine similarity + graph boost + staleness boost
       │
   Ranked results with reasons

Three scoring signals:

  • Semantic similarity — cosine distance between note embeddings. Catches meaning, not just keywords.
  • Link graph boost — notes connected through wiki-links get a bump. 2-hop neighbors (connected through a shared link) surface "bridge" connections.
  • Staleness boost — notes untouched for 30+ days get a small boost. Surfaces forgotten-but-relevant knowledge.

Installation

git clone https://github.com/JoshuaOliphant/vault-recommender.git
cd vault-recommender
uv sync

Usage

CLI

# Build the index (run once, re-run when vault changes significantly)
uv run vault-recommender --vault /path/to/vault index

# Recommend by topic
uv run vault-recommender --vault /path/to/vault recommend --topic "career transition strategies"

# Recommend notes similar to a specific note
uv run vault-recommender --vault /path/to/vault recommend --note "areas/career/plan.md"

# Find missing connections (similar but not linked)
uv run vault-recommender --vault /path/to/vault recommend --note "areas/career/plan.md" --exclude-linked

# JSON output (for LLM consumption)
uv run vault-recommender --vault /path/to/vault recommend --topic "python testing" --json

MCP Server (Claude Code integration)

Add to your .mcp.json:

{
  "mcpServers": {
    "vault-recommender": {
      "type": "stdio",
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/vault-recommender",
        "python",
        "-m",
        "vault_recommender.mcp_server"
      ],
      "env": {
        "VAULT_PATH": "/path/to/your/vault"
      }
    }
  }
}

This exposes three tools:

  • recommend_by_topic — open-ended semantic search
  • recommend_by_note — "notes like this one"
  • find_missing_connections — similar but unlinked notes

Python API

from pathlib import Path
from vault_recommender.parser import parse_vault
from vault_recommender.indexer import build_index
from vault_recommender.graph import build_graph
from vault_recommender.recommender import VaultRecommender

vault = Path("/path/to/vault")
notes = parse_vault(vault)
index = build_index(notes)
graph = build_graph(notes)

rec = VaultRecommender(index=index, graph=graph, vault_path=vault)

# By topic
results = rec.similar_to_topic("career transition")

# By note
results = rec.similar_to_note("areas/career/plan.md")

# Each result has: path, title, score, snippet, tags, reason
for r in results:
    print(f"{r.score:.3f} {r.title}{r.reason}")

Performance

  • ~1,500 notes indexed in ~5 seconds (M-series Mac)
  • Queries return in <1 second (after model warm-up)
  • Index persists as numpy + JSON (~2MB for 1,500 notes)
  • Model: all-MiniLM-L6-v2 (~80MB, runs on CPU)

Requirements

  • Python 3.12+
  • An Obsidian vault (or any directory of markdown files with [[wiki-links]])

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vault_recommender-0.1.0.tar.gz (107.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vault_recommender-0.1.0-py3-none-any.whl (13.3 kB view details)

Uploaded Python 3

File details

Details for the file vault_recommender-0.1.0.tar.gz.

File metadata

  • Download URL: vault_recommender-0.1.0.tar.gz
  • Upload date:
  • Size: 107.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vault_recommender-0.1.0.tar.gz
Algorithm Hash digest
SHA256 dc2eca37a2be9c4fb3d0dba97afba0617ba12d643e79987707be26b58cf2b273
MD5 637623ec831022f7ed52278baf5e2a32
BLAKE2b-256 9003238cf7fbf0cf0defa3f66279ad89ccb71863a5e33ce030f910b38e6d1c8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for vault_recommender-0.1.0.tar.gz:

Publisher: publish.yml on JoshuaOliphant/vault-recommender

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vault_recommender-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for vault_recommender-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2d1230d7c1bec919efc632f9e63858e5d8ad253e8f4cd739a6de0f5fc83a3358
MD5 0b440ab36d84bc8661b16d3cb59f9651
BLAKE2b-256 0ebced8034e22b2198ac7c216ae0b8437ec8d800a3e67630700e0fcb45038fa4

See more details on using hashes here.

Provenance

The following attestation bundles were made for vault_recommender-0.1.0-py3-none-any.whl:

Publisher: publish.yml on JoshuaOliphant/vault-recommender

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page