← Back to Plugins
Tools

Enquire Mcp

oomkapwn By oomkapwn ⭐ 3 stars 👁 16 views ▲ 0 votes

The MCP server that gives Claude Code, Cursor, OpenClaw & Codex first-class access to your Obsidian vault. 1.0 stable, no plugin, MIT.

Homepage GitHub

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.

[![CI](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
[![npm version](https://img.shields.io/npm/v/@oomkapwn/enquire-mcp.svg)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
[![Stable 1.0](https://img.shields.io/badge/release-1.0%20stable-brightgreen.svg)](./CHANGELOG.md)
[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](./LICENSE)
[![Node](https://img.shields.io/badge/node-%E2%89%A520-brightgreen.svg)](#develop)
[![MCP](https://img.shields.io/badge/MCP-1.29-8A2BE2.svg)](https://modelcontextprotocol.io/)
[![tests](https://img.shields.io/badge/tests-239%20passing-brightgreen.svg)](#develop)
[![coverage](https://img.shields.io/badge/coverage-82%25%20lines-brightgreen.svg)](#develop)
[![lint](https://img.shields.io/badge/lint-biome-60a5fa.svg)](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

Loading comments...