Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
obsidian_list_notesA

List notes in the vault. Filter by tag, folder, or modified-since date. Returns title, path, frontmatter, tags, and mtime — newest first.

obsidian_read_noteA

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 standard YYYY-MM-DD/YYYY-Www/YYYY-MM names. Errors include Did you mean: ... suggestions on near-misses.

obsidian_resolve_wikilinkA

Resolve an Obsidian [[wikilink]] (or ![[embed]]) to a vault file. Handles aliases (Note|alias), sections (Note#Heading), block refs (Note^block), and ../-relative paths.

obsidian_get_recent_editsA

List notes ordered by most recent modification. Useful for picking up where work was left off.

obsidian_stale_notesA

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.

obsidian_get_backlinksA

List every note in the vault that links (or embeds) the target note. Returns ranked hits with snippets and link kind (wikilink/embed/mixed).

obsidian_list_tagsA

List every unique tag in the vault with usage counts (frontmatter vs inline). Sorted by count desc.

obsidian_dataview_queryA

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 unsupported set.

obsidian_get_unresolved_wikilinksA

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.

obsidian_get_outbound_linksA

List every link this note points to — wikilinks and (optionally) embeds, with each one's resolution status. Symmetric counterpart to obsidian_get_backlinks.

obsidian_validate_note_proposalA

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-blocking) + per-link/tag diagnostics. Always available — does NOT require --enable-write. Recommended workflow: validate → fix → obsidian_create_note.

obsidian_find_similarA

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 >5k notes prefer batching. v3.10: each result also carries age_days + a stale flag (from the note's live mtime) so you can prefer fresher related notes or flag aged ones.

obsidian_get_note_neighborsA

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'.

obsidian_statsA

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.

obsidian_lint_wikiA

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 that lack their own page). Each finding carries a path + suggestion shaped so the agent can fix via existing tools (validate_note_proposal → create_note / append_to_note / rename_note). Read-only.

obsidian_open_questionsA

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.

obsidian_paper_auditA

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 agent can apply via validate_note_proposal + create_note/append_to_note. Read-only.

obsidian_find_pathA

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 follow_embeds=false to skip them. Read-only.

obsidian_open_in_uiA

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.

obsidian_list_canvasesA

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.

obsidian_get_communitiesA

v3.4.0 — Computes structural communities over the vault's wikilink graph via greedy modularity optimization (single-phase Louvain). Returns community_count, modularity (∈ [-0.5, 1] — higher = stronger structure), iterations (greedy passes run) and converged (true if a stable partition was reached, false if it hit the 50-pass cap), communities[] (each with id/size/sorted-members/representative — the highest-in-community-degree note), and membership (path → id). Pure structural — no embeddings consulted. Server stays LLM-free; the agent can summarize a community by reading its representative + sample members. Computation is O(passes × edges); typical 8K-note vault completes in <500ms. The result is NOT cached — call once per session and reuse. First MCP server with native vault community detection.

obsidian_list_basesA

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.

obsidian_read_baseA

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.

obsidian_query_baseA

v3.2.0 (extended in v3.5.0) — Runs a .base file's filter against the vault's markdown notes, returning matching paths + the frontmatter values that contributed to the match. Supported DSL: tag == "x", taggedWith(file.file, "x"), linksTo(file.file, "Target") (v3.5.0 — outbound wikilink check, basename-resolved, case-insensitive), path startsWith "X" / path contains "X" / file.path startsWith "X" (v3.5.0 — file. prefix accepted), file.name == "X" / file.name != "X" (v3.5.0 — basename equality, .md stripped), <frontmatter_key> == <value>, <key> != <value>, <key> contains "<substr>", plus and / or / not combinators. Anything else (formula evaluation, date arithmetic, summaries) is fail-closed since v3.6.2 HN-2 — treated as false (excludes the row) and returned in unevaluated_predicates so callers see typo/unsupported expressions in the response. Pre-v3.6.2 the behavior was permissive (true); v3.6.2 flipped it after an external auditor flagged over-include risk. Pair with obsidian_search for retrieval-quality search; this is for explicit saved queries.

obsidian_read_canvasA

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 reference non-existent notes. Read-only.

obsidian_list_pdfsA

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.

obsidian_read_pdfA

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_read_note. Powered by Mozilla's PDF.js (Apache-2.0).

obsidian_ocr_pdfA

Runs Tesseract OCR over each page of an image-only / scanned PDF, returning per-page text + per-page confidence + mean confidence + the same shape as obsidian_read_pdf. Use this when obsidian_read_pdf returns has_text: false (typical for scans, photographed paper, image-only PDFs). Multilingual via lang (default 'eng'; multi-lang via '+', e.g. 'eng+rus'). Optional pages range and scale (DPI multiplier, default 2 ~ 150 DPI, capped at 4). ~1-2s per page on M1 CPU. Read-only. Powered by Tesseract.js (Apache-2.0; language trained-data must be pre-installed via enquire-mcp install-ocr-lang <code> — serve mode makes zero outbound network calls, so a language missing from the local cache fails closed with an install hint rather than downloading at runtime) + @napi-rs/canvas for PDF→bitmap rendering. Both gated to optionalDependencies so the markdown-only path stays zero-cost.

obsidian_hyde_searchA

v3.1.0 — HyDE retrieval (Gao et al 2023). Caller agent generates a synthetic answer to its own question, passes it as hypothetical_answer; the server embeds the answer (not the question) and retrieves against the answer-shaped vector. Typically beats raw-query embedding by +2-5 NDCG@10 on under-specified queries (e.g. "what did I learn about X" — the question vector is generic; the answer vector is topically anchored). Uses the same .embed.db as obsidian_embeddings_search. The agent SHOULD generate the hypothetical answer with no vault access (otherwise the loop is circular); 1-3 sentences in the same style/register as your notes. If hypothetical_answer is empty, falls back to embedding the raw query. Requires enquire-mcp build-embeddings first.

obsidian_searchA

The default search tool for v2.0. Auto-detects every available retrieval signal — BM25 via FTS5 (if --persistent-index), TF-IDF cosine (always), and ML embeddings (if enquire-mcp build-embeddings ran) — and fuses them with Reciprocal Rank Fusion (Cormack et al, 2009) for higher recall and better paraphrase / synonym matching than any single ranker. Equal weights, k=60. Gracefully degrades: with only TF-IDF available it produces TF-IDF-style ranking; with BM25+TF-IDF it does keyword-augmented retrieval; with all 3 it matches Smart Connections-quality retrieval — free / offline / open-source. Returns per-signal observability (per_signal: { bm25, tfidf, embeddings }) so you can see WHY each hit ranked. v2.8.0: when --include-pdfs was passed to serve (or enquire-mcp index --include-pdfs ran), PDF chunks are blended into results — each hit carries a kind: "md" | "pdf" flag and PDF chunks include [page: N] markers in snippets so agents can cite the right page. Use this instead of the individual _search_text / _full_text_search / _semantic_search / _embeddings_search tools unless you specifically need single-ranker output for diagnostics. v3.10 (forgetting-aware): every hit also carries age_days (whole days since the note was last edited, from its live mtime) and a stale boolean (true past ~1 year) — use these to flag a recalled fact as possibly out-of-date instead of stating it as current. Ranking stays relevance-driven by default; if the server was started with --recency-weight, fresher notes are blended upward.

obsidian_chat_thread_readA

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.

obsidian_context_packA

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.

obsidian_frontmatter_getA

Return 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_searchA

Find every note where frontmatter. 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).

Prompts

Interactive templates invoked by user choice

NameDescription
summarize_recent_editsUse obsidian_get_recent_edits + obsidian_read_note to summarize what was worked on recently.
review_tagPull every note with a given tag and surface the open questions / unresolved threads.
find_orphansIdentify notes with no inbound links — candidates for archiving or wiring up.
weekly_reviewAggregate the last 7 days of vault edits and surface what shipped, what's open, what's stuck.
extract_todosSurface every TODO / FIXME / QUESTION across the vault, grouped by note.
process_inboxFor every note in an inbox folder, propose where it should live and which existing notes link to it.
consolidate_tagsSurface near-duplicate or inconsistently-cased tags (#productivity vs #productive vs #Productivity) and propose unifications.
find_duplicatesWalk the vault for clusters of structurally similar notes (same tags, overlapping titles, shared backlinks) — candidates for merge.
lint_wikiRun Karpathy's lint workflow over the vault — orchestrate obsidian_lint_wiki + obsidian_open_questions + obsidian_paper_audit, surface every actionable issue, propose fixes the agent can apply via the existing write tools after validate_note_proposal. Read-only — proposes only, never modifies.
monthly_review30-day version of `weekly_review` — aggregates a month of vault activity, identifies themes, and surfaces what stalled.
search_with_query_expansionHigher-recall retrieval: paraphrase the query 3-5 ways, call obsidian_search per paraphrase, fuse results. Boosts recall on terse / ambiguous queries by 5-15 NDCG@10 over a single-pass search. Pure agent-side orchestration — no server-side LLM calls.
vault_synthKarpathy LLM-Wiki ingest workflow: take raw source(s), extract entities/concepts/claims, decide which existing notes to update vs which new wiki pages to create, then propose drafts. The agent decides; this prompt sequences the calls. Cites every claim with the source location for trust.
vault_wiki_compileThe LLM-Wiki maintenance step: scan the vault for new/updated notes since last compile, regenerate the top-level `index.md` (table of contents + concept clusters) and append to `log.md` (a chronological compile-log). Run weekly or after a batch ingest. Idempotent.
vault_lint_extendedBeyond the structural lint of `obsidian_lint_wiki`: this prompt sequences a deeper inspection — contradictions across notes (semantic search for opposing claims), stale claims (notes with date references > 6mo old), missing cross-references (notes that mention an entity by name without `[[wikilinking]]` to its wiki page).
vault_captureMem.ai-style 'write don't organize' UX: the user pastes a thought; we file it intelligently. Auto-detect destination (today's daily note vs new wiki page vs append to most-relevant existing note via hybrid search) and propose a diff for user approval before writing.
vault_persona_searchKhoj-style agent persona pattern: scope retrieval to a folder + apply a persona-specific lens to the response. Useful when you want 'research-assistant' behavior over `Research/` distinct from 'editor' over `Drafts/`. Pure prompt template — orchestrates existing search tools with a fixed scope/instructions.
vault_automation_setupWalks you through creating a cron'd vault query whose results land as a daily note or get appended to a digest. Bridges enquire-mcp tools + the host's `scheduled-tasks` MCP (or any cron tool the agent has access to). Pure orchestration — no server-side state.
vault_researchMulti-hop research workflow: break a complex question into 3-5 atomic sub-questions, retrieve per sub-question, synthesize a final answer with cited claims. Closes the gap to agentic-RAG patterns (sub-question decomposition + ReAct) without forcing the server to make LLM calls — the agent handles the decomposition.
vault_synthesis_pageTakes a topic the user already has scattered notes about and produces a single consolidated wiki page that cites every contributing note. Karpathy LLM-Wiki **synthesis** loop (vs `vault_synth` which is the *ingest* loop).

Resources

Contextual data attached and managed by the client

NameDescription
vault-infoRoot path, note count, write-enabled flag, and limits for the connected vault.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/oomkapwn/enquire-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server