Query Markup Documents - On-device hybrid search for markdown files with BM25, vector search, and LLM reranking
Obsidian is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Self-hosted agent memory as a markdown vault: semantic and keyword search, wikilink graph, OAuth
Quickstart
This image runs as a local HTTP server (Streamable HTTP), not over stdio, and the port it listens on is not recorded here, so there is no line to print: start it the way its own source says, publishing that port with -p, then add its address to your client as a remote server.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Obsidian as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. It has not been scanned here, so read the surface, and its source, before you approve it.
This image runs as a local HTTP server (Streamable HTTP), not over stdio, and the port it listens on is not recorded here, so there is no line to print: start it the way its own source says, publishing that port with -p, then add its address to your client as a remote server.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Full-text keyword search via PostgreSQL tsvector. Use this for exact identifiers, code symbols, proper nouns, titles, or known phrases — anywhere semantic noise hurts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Keywords or phrase to match (websearch tsquery syntax: "foo bar", "foo OR bar", "-bar"). |
| folder | string | no | Optional folder prefix (e.g. "Cards/", "Projects/"). |
| limit | integer | no | Maximum number of results (default 20). |
| tags | array | no | Optional list of tag names; only notes carrying ALL listed tags match (e.g. ["project", "active"]). |
| frontmatter | object | no | Optional dict of frontmatter key/value pairs; only notes whose JSONB frontmatter contains every pair match. Strict type matching — string "0" does not match integer 0 (e.g. {"status": "draft"}). |
Read a note from the Obsidian vault by its relative path.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the note (e.g. "Cards/My Note.md") |
| section | string | no | Optional ATX heading to read instead of the whole note. Plain text ("Balance Sheet"), a path-style chain ("Parent/Child") when the heading appears under different parents, or a "#N" ordinal ("#7", 1-b |
| offset | integer | no | Character offset to start reading from (default 0); continue from the reported next_offset. |
| limit | integer | no | Maximum characters of content to return. Only lowers the server cap; it cannot raise it. |
List notes in a vault folder, sorted by most recently modified.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | Vault-relative folder path (e.g. "Cards/", "Projects/"). Empty for vault root. |
| limit | integer | no | Maximum number of results (default 50). |
| tags | array | no | Optional list of tag names; only notes carrying ALL listed tags match (e.g. ["idea"]). |
| frontmatter | object | no | Optional dict of frontmatter key/value pairs; strict type match (e.g. {"status": "active"}). |
List all tags used across the vault with note counts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Maximum number of tags to return (default 50) |
Get recently modified notes, newest first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Number of recent notes to return (default 20). |
| folder | string | no | Optional folder prefix to filter (e.g. "Projects/"). |
| tags | array | no | Optional list of tag names; only notes carrying ALL listed tags match (e.g. ["meeting"]). |
| frontmatter | object | no | Optional dict of frontmatter key/value pairs; strict type match (e.g. {"status": "active"}). |
Vector similarity search over the vault's chunk embeddings. Use this for conceptual or paraphrased queries — anywhere exact word matching would miss the point.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Natural language description of what you're looking for. |
| limit | integer | no | Maximum number of distinct notes to return (default 15). |
| folder | string | no | Optional folder prefix (e.g. "Projects/"). |
| tags | array | no | Optional list of tag names; only notes carrying ALL listed tags match (e.g. ["product"]). |
| frontmatter | object | no | Optional dict of frontmatter key/value pairs; strict type matching — string "0" does not match integer 0 (e.g. {"status": "active"}). |
Create a new markdown note in the Obsidian vault. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path for the new note (e.g. "Cards/New Topic.md"). The .md extension is added if missing. |
| content | string | yes | Full markdown content for the note, including any frontmatter. |
| expected_hash | string | no | Accepted and always refused as no_incumbent, so the refusal is a normal result rather than a protocol error. |
Edit an existing note in the Obsidian vault. Requires write permission (a readwrite API key or OAuth scope).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | — |
| content | string | yes | — |
| append | boolean | no | — |
| operation | string | no | — |
| find | string | no | — |
| section | string | no | — |
| replace_all | boolean | no | — |
| dry_run | boolean | no | — |
| replace_frontmatter | boolean | no | — |
| expected_hash | string | no | — |
Returns a two-part guide for working with this Obsidian vault:
Takes no parameters.
Notes that link TO path. Use this to discover what references a given note — projects citing a card, daily notes mentioning a person, etc.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the target note (e.g. "Cards/Foo.md"). |
| limit | integer | no | Maximum results (default 50, hard cap 500). |
Outgoing links from path — both resolved and dangling.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the source note. |
| limit | integer | no | Maximum links returned (default 100, hard cap 500). |
The connected subgraph reachable from path via links or backlinks, up to depth hops (treated as undirected).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the seed note. |
| depth | integer | no | Maximum BFS depth (default 1, capped at 5). |
| limit | integer | no | Maximum distinct neighbor notes (default 50, hard cap 200). |
Semantically similar notes based on the source note's chunk embeddings, averaged then queried via pgvector.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the source note. |
| limit | integer | no | Maximum results (default 10, hard cap 50). |
Notes with zero incoming AND zero outgoing resolved links — useful for vault hygiene ("what's disconnected?") and cleanup decisions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | Optional vault-relative folder prefix to scope the search (e.g. "Cards/"). |
| limit | integer | no | Maximum results (default 50, hard cap 500). |
Move or rename a note inside the vault. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| from_path | string | yes | Vault-relative path of the existing note. |
| to_path | string | yes | Vault-relative path of the destination. |
| rewrite_links | boolean | no | Also rewrite incoming links in source notes (off by default). |
| expected_hash | string | no | from_path's content_hash as you last read it. |
Delete a note from the vault. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the note. |
| permanent | boolean | no | If True, unlink instead of soft-deleting. |
| expected_hash | string | no | The note's content_hash as you last read it. Refuses the delete, changing nothing, if the note has changed since. |
Mutate a note's YAML frontmatter without touching its body. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the note. |
| updates | object | no | Mapping of keys to set. Use the empty dict (or omit) to skip. |
| remove | array | no | List of keys to delete from the frontmatter. Missing keys are ignored (and, on their own, make the call a no-op rather than a write). |
| expected_hash | string | no | The note's content_hash as you last read it. Refuses the write, changing nothing, if the note has changed since. |
Read any file in the vault — including non-markdown (PDFs, images, skill HTML/JS, data files). Peer to read_note, which stays markdown-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the file (e.g. "Reference Docs/spec.pdf"). |
| encoding | string | no | One of "auto" (default), "text", or "base64". |
| offset | integer | no | Character offset to start a text read from (default 0). Use the value the truncation notice reports to continue. |
| limit | integer | no | Maximum characters to return for a text read. Only lowers the server cap; it cannot raise it. |
| hash_only | boolean | no | Return only path, byte count, MIME and hash, with no content. |
Write a file into the vault — including non-markdown (e.g. save a generated PDF or image). Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative destination path (e.g. "Outputs/report.pdf"). |
| content | string | yes | File contents — base64 string (default) or UTF-8 text. |
| encoding | string | no | "base64" (default) or "text". |
| overwrite | boolean | no | If True, replace an existing file. Off by default. |
| expected_hash | string | no | Optional whole-file raw-byte digest of the incumbent. |
Browse the vault filesystem (ls-style), including non-markdown files.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | Vault-relative folder (default "." = vault root). |
| pattern | string | no | Glob applied to file names (default "*"). |
| recursive | boolean | no | If True, descend into subfolders. Off by default. |
| limit | integer | no | Maximum entries to return (default 200, hard cap 1000). |
Get a short-lived link a person can use to put a file into the vault.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative destination (e.g. "Attachments/photo.png"). |
| overwrite | boolean | no | If True, allow replacing an existing file at path. |
| expires_in | integer | no | Seconds until the link dies. Clamped to 60–3600; defaults to TRANSFER_TOKEN_TTL_SECONDS (600). A link can never outlive the credential you are calling with, so the deadline in the result may be earl |
Ask what happened to an upload link you minted with request_upload.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| upload_id | string | yes | The upload_id that request_upload returned. |
Get a short-lived link a person can use to save a vault file. Peer to read_file, which returns the bytes to you — use this one when the file is for the human, not for you.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path of the file to share. |
| expires_in | integer | no | Seconds until the link dies. Clamped to 60–3600; defaults to TRANSFER_TOKEN_TTL_SECONDS (600). A link can never outlive the credential you are calling with, so the deadline in the result may be earl |
Fetch a file from a public https URL straight into the vault. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Public https URL of the file, at most 8,192 characters; a longer one is refused with argument_too_long before anything is fetched. |
| path | string | yes | Vault-relative destination (e.g. "Attachments/paper.pdf"). |
| overwrite | boolean | no | If True, allow replacing an existing file at path. |
Delete a non-markdown file from the vault. Requires write permission — a readwrite API key, or an OAuth token carrying the readwrite scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Vault-relative path to the file. |
| permanent | boolean | no | If True, unlink instead of moving to .trash/. |
| expected_hash | string | no | Optional whole-file raw-byte digest of the incumbent. |
List checkbox tasks (- [ ] …) across the vault in one call, from the index — no note is read.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | Only notes under this path prefix (e.g. "Projects/"). |
| status | string | no | open (default), done, cancelled or all. |
| due_by | string | no | YYYY-MM-DD; only tasks due on or before this date. Tasks with no due date are excluded when it is given. |
| scheduled_by | string | no | YYYY-MM-DD; only tasks scheduled on or before this date. Tasks with no scheduled date are excluded when it is given. |
| tags | array | no | Only tasks carrying every one of these inline tags on the task line itself (a leading # is optional; note-level tags are not consulted). At most 32, each 1–128 characters. |
| limit | integer | no | Maximum tasks per page (1–500, default 100). The response size cap can end a page sooner; next then continues it. |
| cursor | string | no | The next value from the previous page of the same query. |
List what changed in your vault after a cursor: one line per note created, modified, moved or deleted, oldest first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| since | string | yes | A next_since cursor (ev:<n>) or a UTC date/datetime. |
| folder | string | no | Only events whose path or source path is under this prefix (a move out of the folder counts). |
| kinds | array | no | Subset of created, modified, moved, deleted. |
| by | string | no | any (default); me (your exact credential — the same API key, or the same OAuth grant across token refreshes); agents (any MCP caller of this vault); human (human/sync, discovered by the inde |
| limit | integer | no | Events per page (1–500, default 50). A full page says more: true; pass its next_since to continue. |
Keyword and semantic search fused into one ranking, for a query that is not clearly an identifier or a paraphrase.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | What you are looking for — words, a phrase or a question. |
| limit | integer | no | Maximum number of results (default 10, at most 50). |
| folder | string | no | Optional folder prefix (e.g. "Projects/"). |
| tags | array | no | Optional list of tag names; only notes carrying ALL listed tags match. |
| frontmatter | object | no | Optional dict of frontmatter key/value pairs; strict type matching — string "0" does not match integer 0 (e.g. {"status": "active"}). |
| rerank | boolean | no | Reorder the first 50 fused candidates with the deployment's reranker (default false). |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Obsidian or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing ships as a container image. The scanner reads packages on npm and PyPI and public source; an image is neither, so there is no grade here — not a withheld one, an unmeasured one.
Release history
It installs from a container image rather than from a versioned package, so the command cannot be pinned to a release. The history below is for reading; the current release on file is 1.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Obsidian can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.