{"name":"io.github.oomkapwn/enquire-mcp","slug":"oomkapwn-enquire-mcp","title":null,"description":"Long-term memory for AI agents — your Obsidian vault as searchable persistent memory.","url":"https://mcp.market/server/oomkapwn-enquire-mcp","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":39,"stars":33,"forks":7,"downloads_week":88,"last_push_at":"2026-09-21T03:08:29.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/oomkapwn/enquire-mcp","website":null,"version":"3.11.6","remotes":[],"packages":[{"registryType":"npm","identifier":"@oomkapwn/enquire-mcp","version":"3.11.6","transport":{"type":"stdio"},"runtimeArguments":[{"description":"Subcommand: serve (stdio MCP), serve-http (remote MCP), setup (download model + build indexes), doctor (health check) — run with no subcommand for the full list.","isRequired":true,"format":"string","value":"serve","type":"positional","valueHint":"subcommand"},{"description":"Path to your Obsidian vault root directory","isRequired":true,"format":"string","type":"named","name":"--vault"}]}],"tools":[{"name":"obsidian_append_to_note","description":"Append 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_archive_note","description":"Convenience 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_chat_thread_append","description":"Add 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_chat_thread_read","description":"Parse 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_context_pack","description":"Given 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_create_note","description":"Create 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"obsidian_dataview_query","description":"Run 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"obsidian_embeddings_search","description":"ML-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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_find_path","description":"Multi-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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_find_similar","description":"Given 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_frontmatter_get","description":"Return parsed YAML frontmatter for a note. With `key`, returns just that field's value. Without `key`, returns the whole frontmatter object. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_frontmatter_search","description":"Find 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_frontmatter_set","description":"Surgical 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_full_text_search","description":"BM25-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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_backlinks","description":"List every note in the vault that links (or embeds) the target note. Returns ranked hits with snippets and link kind (wikilink/embed/mixed).","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_communities","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_note_neighbors","description":"Return 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'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_outbound_links","description":"List every link this note points to — wikilinks and (optionally) embeds, with each one's resolution status. Symmetric counterpart to obsidian_get_backlinks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_recent_edits","description":"List notes ordered by most recent modification. Useful for picking up where work was left off.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_get_unresolved_wikilinks","description":"Find 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_hyde_search","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_lint_wiki","description":"Comprehensive 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_list_bases","description":"v3.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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_list_canvases","description":"Lists `.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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_list_notes","description":"List notes in the vault. Filter by tag, folder, or modified-since date. Returns title, path, frontmatter, tags, and mtime — newest first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_list_pdfs","description":"Lists `.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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_list_tags","description":"List every unique tag in the vault with usage counts (frontmatter vs inline). Sorted by count desc.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_mark_useful","description":"Close 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_ocr_pdf","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_open_in_ui","description":"Returns 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_open_questions","description":"Walks 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_paper_audit","description":"For 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_query_base","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_read_base","description":"v3.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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_read_canvas","description":"Parses 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_read_note","description":"Read 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_read_pdf","description":"Extracts 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_rename_note","description":"Atomically 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_replace_in_notes","description":"Walks 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_resolve_wikilink","description":"Resolve an Obsidian [[wikilink]] (or ![[embed]]) to a vault file. Handles aliases (Note|alias), sections (Note#Heading), block refs (Note^block), and ../-relative paths.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_search","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_search_text","description":"Case-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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_semantic_search","description":"Pure-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","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_stale_notes","description":"List 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_stats","description":"Vault-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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"obsidian_validate_note_proposal","description":"Lint 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","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-25T17:21:17.250Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:21:17.199Z","components":{"code":{"score":25,"max":25,"notes":["87 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 5 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@oomkapwn/enquire-mcp","version":"3.11.6","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-07-22T12:22:24.227Z","repositoryUrl":"git+https://github.com/oomkapwn/enquire-mcp.git","weeklyDownloads":88}],"repo":{"found":true,"owner":"oomkapwn","repo":"enquire-mcp","archived":false,"pushedAt":"2026-09-21T03:08:29Z","stars":33,"forks":7,"openIssues":9,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/274092130?v=4","ownerCreatedAt":"2026-04-06T19:07:05Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":33,"forks":7,"downloadsWeek":88,"license":"MIT","lastPushAt":"2026-09-21T03:08:29.000Z","score":39}}}},"grade_history":[],"reviews":[]}