Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

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