Plain grep over markdown returns lines with no idea what they belong to; here a match comes back attached to the tag, the property or the section it lives under, which is usually the difference between an answer and a list. On a large vault the context detection is also the expensive part, and it can be turned off per search, alongside a folder filter and a smaller result limit. The orphan and backlink views turn the same index into maintenance tools for a graph that has grown untidy.
Content search across an Obsidian vault, run with ripgrep and read with the vault's structure in mind. A hit reports which frontmatter property or which heading contains it rather than a bare line number, and the link-aware tools turn the same index into graph maintenance.
- Text search scoped three ways — everything, note content only, or YAML frontmatter only — with case sensitivity, a folder filter and a result limit between 1 and 100, defaulting to 15 (rg_search_notes).
- Context on every match: the frontmatter property name for a frontmatter hit, or the nearest heading for a content hit, including nested YAML structures — switchable off when speed matters more (rg_search_notes).
- Links found and filtered by kind: wiki links in both [[Note]] and [[Note|Display]] forms, markdown links, external URLs, and links inside frontmatter properties and lists, narrowed by a regex on the URL or on the title (rg_search_links).
- Every note linking to a given target, with the context around each reference, so a topic's incoming edges are readable (rg_search_backlinks).
- Notes filtered by modification date between a start and an end in YYYY-MM-DD form, for reviewing recent work or a particular period (rg_search_recent_notes).
- Notes with no links in or out — the ones that fell out of the graph (rg_search_orphaned_notes).
Python 3.8 or higher, ripgrep installed and on your PATH, and an Obsidian vault. The vault location is the one thing to set: OBSIDIAN_VAULT_PATH as an environment variable, or a vault_path entry in ~/.rgrep-mcp.json, which also holds defaults for case sensitivity and result limit. Use an absolute path. Install from a clone with `pip install -e .` and run it as `python -m rgrep_mcp.server`. No account, no key, and nothing leaves the machine.
Build from source — clone the repository and build it, then point your client at the binary
