Tools
Enquire Mcp
The MCP server that gives Claude Code, Cursor, OpenClaw & Codex first-class access to your Obsidian vault. 1.0 stable, no plugin, MIT.
Install
npm install -g
Configuration Example
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "@oomkapwn/enquire-mcp", "serve", "--vault", "/Users/you/Documents/Obsidian Vault"]
}
}
}
README
<div align="center">
<a href="https://github.com/oomkapwn/enquire-mcp"><img src="./assets/social-preview.png" alt="enquire — MCP server for Obsidian vaults. Wikilinks, frontmatter, backlinks, Dataview, MCP resources & prompts. Named after Tim Berners-Lee's 1980 prototype of the WWW." width="100%"></a>
# enquire
## Stop your AI guessing at vault paths.
**enquire** is the MCP server that gives **Claude Code, Cursor, OpenClaw 🦞, and Codex** native, structured access to your **Obsidian** vault — wikilinks resolved, backlinks ranked, frontmatter typed, Dataview queries first-class. Read-only by default. No plugin. One command to install.
[](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
[](./CHANGELOG.md)
[](./LICENSE)
[](#develop)
[](https://modelcontextprotocol.io/)
[](#develop)
[](#develop)
[](https://biomejs.dev/)
</div>
### Quick start (30 seconds)
```bash
# Claude Code:
claude mcp add --transport stdio obsidian \
-- npx -y @oomkapwn/enquire-mcp serve --vault ~/path/to/your/vault
# Cursor / OpenClaw / Codex / others — drop this into your MCP config:
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "@oomkapwn/enquire-mcp", "serve", "--vault", "/path/to/vault"]
}
}
}
```
Restart your AI client. That's it — your assistant can now follow `[[wikilinks]]`, walk backlinks, run Dataview queries, and reason about your vault the way you do.
```text
You: "What was I working on yesterday in the Apollo project?"
Claude: → obsidian_get_recent_edits({ since_minutes: 1440, folder: "01_Projects" })
→ obsidian_read_note({ title: "Apollo" })
→ obsidian_get_backlinks({ title: "Apollo" })
"You shipped the v0.3 spec, opened 3 open questions in [[Apollo/Open Threads]],
and 2 daily notes link back to it. Top blocker: the auth review."
```
> Named after [**ENQUIRE**](https://en.wikipedia.org/wiki/ENQUIRE) — the program Tim Berners-Lee wrote at CERN in 1980 to track «the complex web of relationships between people, programs, machines and ideas». ENQUIRE was the direct prototype of the World Wide Web. enquire-mcp brings the same idea to your AI: hyperlinked notes, structured access, zero plugins.
---
## Why enquire exists (vs other Obsidian-MCP options)
There are several Obsidian-MCP servers out there. enquire differentiates on three axes — **standalone**, **read-rich**, and **safe-by-default**:
| Capability (✅ = good for you) | Most Obsidian-MCPs | enquire |
|---|:---:|:---:|
| Works with `.md` files | ✅ | ✅ |
| **Standalone** — runs without Obsidian's Local REST API plugin | ❌ usually requires it | ✅ direct vault read |
| Resolves `[[Wikilink]]` with alias, section, block, `../` relative | partial | ✅ full |
| Surfaces `![[Embed]]` separately from links | ❌ | ✅ |
| Finds every note linking to X (**backlinks**) | rare | ✅ ranked + snippets |
| Finds every **broken `[[wikilink]]`** in the vault | ❌ | ✅ vault-hygiene tool |
| Lists **outbound links** for one note with resolution status | ❌ | ✅ |
| Built-in **Dataview-style queries** (`LIST` / `TABLE`, `AND`/`OR`, `LIKE`) | only via Obsidian plugin | ✅ first-class |
| **MCP resources** for browsing the vault as a tree | ❌ | ✅ |
| **MCP prompts** (`summarize_recent_edits`, `weekly_review`, `find_orphans`, `extract_todos`, `process_inbox`, `review_tag`) | ❌ | ✅ 6 prompts |
| **Read-only by default** (write tools require explicit flag) | ❌ usually write-default | ✅ `--enable-write` |
| Symlink-escape safety, realpath-checked reads & writes | rare | ✅ |
| Persistent on-disk cache for warm cold-starts | ❌ | ✅ `--persistent-cache` |
| **Per-folder privacy filter** (`--exclude-glob '02_Personal/**'`) | ❌ | ✅ |
| **Periodic-note aliases** (`title: "today"` resolves to today's daily-note) | rare | ✅ |
| **`Did you mean: ...`** suggestions on note-not-found errors | rare | ✅ |
| **Document-map projection** (`format: "map"`: headings + counts, no body) | ❌ | ✅ |
| **Anti-slop write validator** (`obsidian_validate_note_proposal` lints YAML + wikilinks + tags before write) | ❌ | ✅ |
| **Graph-aware retrieval** (`find_similar` + `get_note_neighbors` — multi-signal lexical hybrid, no embeddings) | ❌ | ✅ |
| **Vault dashboard** (`obsidian_stats`: orphans, broken links, top tags) | ❌ | ✅ |
| **Rename + auto-backlink rewrite** (`obsidian_rename_note` — atomic, code-fence-aware, dry-run preview) | ❌ usually breaks links | ✅ |
| TypeScript strict + Biome lint + 239 unit tests | varies | ✅ |
That's the gap. enquire closes it in ~2800 lines of TypeScript with four mandatory runtime dependencies (`@modelcontextprotocol/sdk`, `commander`, `gray-matter`, `zod`) plus one optional (`better-sqlite3`, only loaded when `--persistent-index` is passed).
> **Not affiliated with Obsidian.md.** Obsidian and the Obsidian logo are trademarks of Dynalist Inc. enquire-mcp is an independent open-source project that reads Obsidian-format vaults. The name «enquire» is a tribute to Tim Berners-Lee's 1980 hypertext system, not a trademark claim against any party.
---
## Who is this for?
- **Obsidian users on Claude Code / Cursor / OpenClaw / Codex** (or Devin or any other MCP-compatible client) who want the assistant to draft notes that actually link properly, follow `[[…]]`, and respect frontmatter.
- **Agentic workflow builders** who need a structured layer over a markdown vault — `dataview_query`, `get_backlinks`, `list_tags` are the kind of primitives that compose into real automations.
- **Tinkerers** who want to wire their PKM into LLM pipelines without writing a parser. We did the parsing.
---
## Configure your AI client
**Recommended: zero-install via `npx` — no clone, no build.** Drop this into your MCP client's config:
```json
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "@oomkapwn/enquire-mcp", "serve", "--vault", "/Users/you/Documents/Obsidian Vault"]
}
}
}
```
**Where to drop that JSON, by client:**
| Client | Config file |
|---|---|
| **Claude Desktop** | macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`<br>Windows: `%APPDATA%\Claude\claude_desktop_config.json` |
| **Claude Code (CLI)** | `~/.claude.json` (global) or `.mcp.json` (per-project) |
| **Cursor** | `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per-project) |
| **OpenClaw** | per your OpenClaw shared-memory MCP config |
| **Codex / Codex CLI** | per-project `.mcp.json` or environment-specific config |
| **Devin / any other MCP client** | wherever your client expects MCP server JSON |
To enable write tools (`obsidian_create_note`, `obsidian_append_to_note`), add `"--enable-write"` to the `args` array.
<details>
<summary><b>Alternative: global npm install</b></summary>
```bash
npm install -g @oomkapwn/enquire-mcp
enquire-mcp serve --vault ~/Documents/Obsidian\ Vault
```
Then in your client config use `"command": "enquire-mcp"` instead of `"command": "npx"`.
</details>
<details>
<summary><b>Alternative: from source (development)</b></summary>
```bash
git clone https://github.com/oomkapwn/enquire-mcp
cd enquire-mcp && npm install && npm run build
```
Then `"command": "node"` with `"args": ["/absolute/path/to/dist/index.js", "serve", "--vault", "..."]`.
</details>
Restart your client. The server logs `enquire <version> ready (read-only, vault=…)` on stderr — that's your "it's connected" signal.
---
## What you get
### 14 read tools (always on) + 1 opt-in (`--persistent-index`)
| Tool | What it does |
|---|---|
| `obsidian_list_notes` | Filter by tag / folder / modified-since. Returns title, path, frontmatter, tags, mtime — newest first. |
| `obsidian_read_note` | Body + frontmatter + wikilinks + embeds + tags for a note (by path or title). `format: "map"` returns just headings + counts. |
| `obsidian_resolve_wikilink` | `[[Note]]`, `[[Note#Heading]]`, `[[Folder/Note\|alias]]`, `![[Embed]]`, `[[../relative/path]]` — all resolved to a real file. |
| `obsidian_search_text` | Ranked case-insensitive token search across all notes (AND-tokenizer by default; `any` and `phrase` modes available). Returns structured response: `query`, `mode`, `scanned_notes`, ranked `matches` with snippets. |
| `obsidian_get_recent_edits` | Newest-first stream, optional time window. |
| `obsidian_get_backlinks` | Every note linking the target, ranked by hit count, with snippets. Distinguishes wikilink vs embed vs mixed. |
| `obsidian_get_outbound_links` | Symmetric counterpart to backlinks — every link a note points to, with resolution status. |
| `obsidian_get_unresolved_wikilinks` | Vault-hygiene: every `[[broken]]` link in the vault. |
| `obsidian_list_tags` | Every unique tag with frontmatter / inline counts. |
| `obsidian_dataview_query` | `LIST` / `TABLE` with `FROM`, `WHERE`, `SORT`, `LIMIT`. Supports `AND` / `OR` / `=` / `!=` / `contains` / `like`. |
| `obsidian_validate_note_proposal` | **Anti-slop write linter.** Lint a draft note BEFORE writing — parses YAML, resolves every `[[wikilink]]` against the live vault, pre-classifies every tag (existing vs new), checks path/title collisions. Returns errors + warnings + per-link/tag diagnostics. Closes the #1 LLM-write pain ("AI generates structurally-broken notes"). |
| `obsidian_find_similar` | **Hybrid lexical similarity** — given a note, rank
... (truncated)
tools
Comments
Sign in to leave a comment