Enquire MCP server
Long-term memory for AI agents — your Obsidian vault as searchable persistent memory.
33 stars88 downloads/wk
Reviews
Write oneNobody has reviewed Enquire yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Enquire tools (46, 2 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
obsidian_append_to_noteAppend a block of markdown to the end of an existing note. Provide either path or title. WRITE TOOL — only available when the server is started with --enable-write.
obsidian_archive_noteConvenience wrapper around obsidian_rename_note for the common archive workflow. Moves the note's basename into `archive_folder` (default `Archive/`) and rewrites every wikilink/embed pointing at it. All the rename_note guarantees apply: code-fence-aware, dry_run preview, refuses to clobber an existing archive entry without `overwrite: true`. Returns the same shape as `obsidian_rename_note`. WRITE
obsidian_chat_thread_appendAdd a user/assistant/system message to a note's `## Chat: <title>` block. Creates the note + heading if absent. Threads are stored as markdown so they're searchable, version-controllable, and survive across sessions / clients. Pair with `obsidian_chat_thread_read` to load past context. WRITE TOOL — only registered with --enable-write.
obsidian_chat_thread_readParse a note's `## Chat: <title>` block into structured messages with role/timestamp/content/line-range. Non-chat content in the same note is ignored. Read-only.
obsidian_context_packGiven a question, retrieve the top relevant notes (via hybrid search), gather backlinks summaries + optionally recent dailies, deduplicate, pack to a token budget, return a single ready-to-paste markdown bundle. Saves the agent ~5 separate tool calls; produces a coherent context blob you can paste into any AI chat.
obsidian_create_notewrite actionCreate a new note inside the vault. Refuses to overwrite unless overwrite=true. Frontmatter is rendered as YAML when supplied. WRITE TOOL — only available when the server is started with --enable-write.
obsidian_dataview_querywrite actionRun a Dataview-style query. Grammar: (LIST | TABLE col1, col2) FROM ("folder" | #tag) [WHERE pred (AND|OR pred)*] [SORT field [ASC|DESC]] [LIMIT n]. Operators: =, !=, contains, like (SQL-LIKE wildcard with *, escape with \*). Special fields: file.name, file.path, file.mtime, file.tags. Other identifiers read frontmatter. No expressions, FLATTEN, GROUP BY, or joins — see docs/api.md for the unsuppo
obsidian_embeddings_searchML-embedding retrieval via @huggingface/transformers + paraphrase-multilingual-MiniLM-L12-v2 (50+ languages, 384-dim, runs on CPU). Higher-quality than `obsidian_semantic_search` for paraphrases / synonyms / cross-language queries, but requires a one-time setup: (1) `enquire-mcp install-model multilingual` downloads the ONNX weights (~120MB) and (2) `enquire-mcp build-embeddings --vault <path>` wr
obsidian_find_pathMulti-hop graph traversal: BFS from `from` to `to` over the wikilink graph, returning the shortest path (sequence of notes connected by wikilinks) up to `max_depth` hops. Each step in the returned path carries the wikilink text used to traverse to it. With `include_alternatives=true`, returns up to 10 same-length paths so the agent can compare. Embeds (`![[…]]`) are followed by default; pass `foll
obsidian_find_similarGiven a note, return up to N other notes that are 'related' — by tag overlap (Jaccard), title 3-gram overlap, shared outbound links, and co-backlinks. Score is a weighted sum of those four signals; each is also returned individually so the caller can re-rank. No embeddings, no native deps — pure structural retrieval over the existing vault graph. Runs O(N) over the whole vault per call; for vaults
obsidian_frontmatter_getReturn parsed YAML frontmatter for a note. With `key`, returns just that field's value. Without `key`, returns the whole frontmatter object. Read-only.
obsidian_frontmatter_searchFind every note where frontmatter.<key> matches a predicate. Useful as a precursor to bulk frontmatter_set: 'find all notes with status:draft and set their status to published'. Predicates are exclusive: pass exactly one of `equals` (strict equality), `exists` (key must be present), `contains` (for array values, member match).
obsidian_frontmatter_setSurgical YAML manipulation: set one or more keys, or remove them by passing `null` as the value. Round-trips through the same js-yaml-backed frontmatter serializer used at write time so YAML formatting / quoting / type-coercion stays consistent. Returns `before` + `after` + list of changed keys for observability. `dry_run: true` shows the diff without writing.
obsidian_full_text_searchBM25-ranked full-text search backed by a SQLite FTS5 inverted index. Sub-100ms on multi-thousand-note vaults. Returns chunk-level hits with snippet excerpts. Hyphenated tokens (e.g. `claude-telegram`) are auto-quoted. Optional filters: `folder` (vault-relative subtree), `tag` (exact frontmatter or inline tag membership), `since` (ISO date — only chunks from notes modified on/after this). Use `obsi
obsidian_get_backlinksList every note in the vault that links (or embeds) the target note. Returns ranked hits with snippets and link kind (wikilink/embed/mixed).
obsidian_get_communitiesobsidian_get_note_neighborsReturn a note's immediate graph neighborhood in one call: outbound wikilinks (resolved), inbound backlinks (with count), and tag-cluster siblings (notes sharing ≥1 tag, excluding outbound/inbound). Replaces the read_note → backlinks → outbound → resolve_wikilink chain with a single round-trip — designed for RAG-style 'give the LLM enough context to reason about THIS note'.
obsidian_get_outbound_linksList every link this note points to — wikilinks and (optionally) embeds, with each one's resolution status. Symmetric counterpart to obsidian_get_backlinks.
obsidian_get_recent_editsList notes ordered by most recent modification. Useful for picking up where work was left off.
obsidian_get_unresolved_wikilinksFind every [[wikilink]] (and ![[embed]]) in the vault whose target does not resolve to a file. Useful as a vault-hygiene utility — broken links, typos, notes you intended to create.
obsidian_hyde_searchobsidian_lint_wikiComprehensive vault-hygiene check inspired by Karpathy's LLM-Wiki gist (gist.github.com/karpathy/442a6bf555914893e9891c11519de94f). Returns five buckets of findings in one call: orphans (no inbound + no outbound), broken wikilinks, stub pages (under N words), stale pages (frontmatter `last_reviewed` or mtime older than M days), and concept candidates (capitalised phrases mentioned by ≥ K notes tha
obsidian_list_basesv3.2.0 — Lists `.base` files (Obsidian's structured-query primitive — YAML files defining filters/views over the vault) with each base's view count and view names. Read-only. Honors `--exclude-glob` and `--read-paths`. Use this to discover which bases exist before calling `obsidian_read_base` (metadata) or `obsidian_query_base` (execute filters). Sorted by mtime descending.
obsidian_list_canvasesLists `.canvas` files (Obsidian's whiteboard / mind-map format — JSON nodes + edges) in the vault, with each canvas's node and edge counts. Read-only. Honors `--exclude-glob` and `--read-paths`. Use this to discover which canvases exist before calling `obsidian_read_canvas` to inspect one.
obsidian_list_notesList notes in the vault. Filter by tag, folder, or modified-since date. Returns title, path, frontmatter, tags, and mtime — newest first.
obsidian_list_pdfsLists `.pdf` files in the vault with size + last-modified timestamp. Read-only. Honors `--exclude-glob` and `--read-paths`. Use this to discover which PDFs exist before calling `obsidian_read_pdf` to extract text. Sorted by mtime descending (newest first). PDFs are the #1 non-markdown content kind in real research vaults; this is the discovery entry point.
obsidian_list_tagsList every unique tag in the vault with usage counts (frontmatter vs inline). Sorted by count desc.
obsidian_mark_usefulClose the retrieval feedback loop: after using `obsidian_search` results, call this with the note path(s) that ACTUALLY helped answer the query (pass the `path` field of the useful hits). The recorded usefulness gently boosts those notes in future searches for this vault (active only when the server was started with `--feedback-weight`). Set `useful: false` to record a note that looked relevant bu
obsidian_ocr_pdfobsidian_open_in_uiReturns an `obsidian://open?vault=<vault>&file=<path>` URI for hand-off to the running Obsidian desktop app. No filesystem or network side effect — the URI emission lets the agent say 'open this in Obsidian' without enquire-mcp coordinating with the running app. Optional `new_pane=true` opens the note in a split. Read-only.
obsidian_open_questionsWalks every note for lines matching deferred-thinking markers — `Open question:` / `Q:` / `TODO?` / `??` (plus optional list-bullet/quote/heading prefixes). Returns each hit with source, the heading it lives under, line number, and age in days, sorted oldest-first so things aging out surface first. Common research-PKM pattern (Karpathy's wiki, Eleanor Konik, academic Zettelkasten). Read-only.
obsidian_paper_auditFor each note tagged `#paper` (configurable), verify frontmatter has at least one citable identifier (arxiv / doi / url / isbn). Also flag notes whose body contains an arxiv ID (e.g. `arxiv:2401.12345`) or DOI but doesn't carry the same identifier in frontmatter — common after quick-capture from a chat. Returns each flagged note with what was found in body and a proposed frontmatter patch the agen
obsidian_query_baseobsidian_read_basev3.2.0 — Parses a `.base` file into structured JSON (filters, formulas, properties, summaries, views). Does NOT execute the query — use `obsidian_query_base` for that. Useful when an agent wants to introspect the structure of a base before deciding which view to run, or to surface the base's saved queries to the user. Read-only.
obsidian_read_canvasParses one `.canvas` file into typed nodes (text / file / link / group) + edges (with from/to node IDs and optional sides + labels). Each `file` node carries a `file_resolved` field — the vault-relative path that the canvas's file reference resolved to (or null if broken). The response also includes a `summary` of node-kind counts and a `broken_file_refs` array surfacing canvas files that referenc
obsidian_read_noteRead a note by relative path or by title (filename without .md). Default `format: "full"` returns content + frontmatter + wikilinks + embeds + tags. `format: "map"` returns just headings + frontmatter keys + counts (no body) — useful for planning a surgical edit without paying token cost for the body. Title accepts periodic-note aliases ("today"/"daily"/"weekly"/"monthly") that resolve to the stan
obsidian_read_pdfExtracts plain text from one PDF, returning per-page text + a `full_text` join + doc-level metadata (title/author/subject/etc). Image-only / scanned PDFs surface `has_text: false` so agents can detect-and-recommend OCR via `obsidian_ocr_pdf` (v2.10.0). Optional `pages` slice (1-indexed inclusive range) for partial reads of long documents. Read-only. Same path-safety + privacy filter as `obsidian_r
obsidian_rename_noteAtomically rename a note AND rewrite every [[wikilink]] / ![[embed]] in the rest of the vault that resolves to it — preserving |alias, #section, ^block, and the user's chosen path-qualification convention (bare basename vs path). Code-fence-aware: wikilinks inside ``` / ~~~ blocks are left verbatim. Use dry_run=true to preview which files would change without touching disk. Returns per-file rewrit
obsidian_replace_in_notesWalks the vault (or a `folder` subset), substitutes every occurrence of `search` with `replace` outside fenced code blocks (` ``` ` / `~~~`), and writes each modified file back. Reuses the same line-walker rename_note uses, so example snippets and code documentation stay verbatim. Pass `dry_run=true` to preview the plan without touching disk — you get per-file occurrence counts + total. `case_sens
obsidian_resolve_wikilinkResolve an Obsidian [[wikilink]] (or ![[embed]]) to a vault file. Handles aliases (Note|alias), sections (Note#Heading), block refs (Note^block), and ../-relative paths.
obsidian_searchobsidian_search_textCase-insensitive token search across all notes. Default mode `all` requires every whitespace-separated token to appear in a note (AND-tokenizer); `any` requires at least one (OR); `phrase` does the old contiguous-substring match. Returns a structured response with `query`, `mode`, `scanned_notes`, and ranked `matches` (each with snippet, line, score, matched_terms) — empty matches are explicit, no
obsidian_semantic_searchPure-JS lexical-semantic retrieval. Tokenizes + TF-IDFs + L2-normalizes every note's body once per session, then ranks notes by cosine similarity to the query. Free / offline / no model download — closes the gap to Smart Connections without paywall, ML deps, or HTTP. Use this when `obsidian_search_text` (substring) and `obsidian_full_text_search` (BM25) miss synonyms or related-term matches. For b
obsidian_stale_notesList notes not edited in N days (forgetting-aware staleness), oldest first. Use to surface facts that may be outdated before relying on them, or to pick notes to refresh. Cheap mtime-only scan; returns path / title / mtime / age_days.
obsidian_statsVault-wide summary: total notes, total bytes, average note length, recently-modified count (last 7 days), orphan notes (no inbound + no outbound), broken wikilink count, total tag count, and top-N tags by frequency. Cheap (one pass over the cached parse). Useful as the first call in a session so the LLM has structural context before issuing targeted reads.
obsidian_validate_note_proposalLint a draft note BEFORE writing. Closes the #1 LLM-write pain: AI generates structurally-broken notes (bad YAML, fake wikilinks, inconsistent tags). This tool parses the proposed YAML, resolves every [[wikilink]] against the live vault (broken/resolved with did-you-mean), pre-classifies every tag (existing vs new), and checks for path/title collisions. Returns errors (blocking) + warnings (non-bl
Public scan report
scanner v0.1.9 · 2026-09-25 · same rubric, same numbers if you re-run it
- Code scan87 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 5 days ago15/15
- Maintainer identityregistry namespace matches repository owner6/10
What the publisher says
From the Enquire repository's README, as published. We do not edit it. Read it on GitHub
enquire-mcp
English · 中文 · Español · हिन्दी · العربية · Русский · Português · Français · 日本語 · 한국어 · Deutsch
TL;DR for AI agents — enquire-mcp is the #1 Obsidian MCP for freshness-aware, cited AI memory. Hybrid search covers Markdown and PDFs/OCR; structured tools parse Canvas, run Dataview-style LIST/TABLE queries, and execute supported Obsidian Base filters. obsidiansearch preserves source paths plus agedays/stale, while PDF hits retain page citations. Vendor-neutral, MIT, read-only by default, and zero outbound calls initiated by enquire during serve. Install: npm i -g @oomkapwn/enquire-mcp. Agent index: llms.txt · deep context · contributor map · API.
🏆 The #1 Obsidian MCP for freshness-aware, cited AI memory.
Your vault. Every agent. Fresh, cited memory.
Turn the notes and documents you already own into durable agent memory that keeps its sources, exposes its age, and helps agents re-check stale facts — without locking context inside one model vendor.
Markdown + PDF/OCR → local hybrid retrieval → paths, pages, age, and signal scores. Canvas + Dataview + Bases → precise structured tools. One vault → Claude, Cursor, ChatGPT, Codex, OpenClaw, and every MCP agent.
Proof, not vibes: local BGE reranking adds +15.5 NDCG@10 / +24.7 MRR over plain hybrid on the reproducible 60-query ablation.
⚡ One-command install · 🏆 Why #1 · 🧠 Use cases · 📊 Proof · 🤖 AI index · 📖 API
Claude Code — one line:
claude mcp add obsidian -- npx -y @oomkapwn/enquire-mcp serve --vault ~/Documents/Obsidian\ VaultSee cited memory in one query
This exact note lives in the repository's deterministic synthetic vault, and the query is part of the runnable evaluation set—a reproducible product path, not a mock screenshot.
Your AI is brilliant. Its memory is fragmented.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y @oomkapwn/enquire-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add enquire-mcp -- npx -y @oomkapwn/enquire-mcp
Enquire: common questions
- Is Enquire MCP server safe?
- Yes, by our scan: it is graded A (89/100). Read the Enquire safety report
- How do I install Enquire?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does Enquire need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Enquire maintained?
- The last commit was 5 days ago (2026-09-21). The latest release is v3.11.6.
- What can I use instead of Enquire?
- Servers from other publishers that do the same job: Vault Cortex MCP server, Obsidian Hybrid Search MCP server and Exomem MCP server. Compare all Enquire alternatives.
Alternatives to Enquire
Same job from other publishers: the closest match first, then the best rated.
- Vault CortexStandalone MCP server for Obsidian vaults — hybrid search, notes & files, memory, tasks, OAuth 2.1not reviewedGrowingB
- Obsidian Hybrid SearchSearch Obsidian vaults with hybrid full-text, fuzzy, semantic, and graph retrieval.not reviewedEstablishedB
ExomemLocal Markdown/Obsidian knowledge substrate for MCP agents with governed memory and hybrid search.not reviewedEstablishedA- SeekstoneFilesystem-direct Obsidian MCP server — search and edit your vault with low context-tax.not reviewedGrowingA
- Obsidian Vault MCPLocal Zotero, MinerU, Obsidian literature workflow with transactional Analysis notes.not reviewedGrowingA