/qmd
Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents, inspect a wiki, answer from indexed markdown, or set up QMD access.
$ npx -y skills add tobi/qmd --skill qmd --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/qmd
Context preview
The summary Claude sees to decide when to auto-load this skill.
Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents, inspect a wiki, answer from indexed markdown, or set up QMD access.
SKILL.md
qmd.SKILL.mdname: qmd
description: Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents, inspect a wiki, answer from indexed markdown, or set up QMD access.
license: MIT
compatibility: Requires qmd CLI or MCP server. Install via `npm install -g @tobilu/qmd`.
metadata:
author: tobi
version: "2.2.0"
allowed-tools: Bash(qmd:*), mcp__qmd__*
QMD - Query Markdown Documents
How search works
QMD searches local markdown collections: notes, docs, wikis, transcripts, and project knowledge bases. Use it before web search when the answer may already be in indexed local files.
The workflow is always:
1. Search for candidate documents. 2. Retrieve the full source with `qmd get` or `qmd multi-get`. 3. Answer from retrieved text, citing paths or docids.
Do not answer from snippets alone when the user needs facts, decisions, quotes, or nuance. Snippets are only leads.
Typical loop:
qmd search "merchant reality support interviews" -n 5
# leads: #abc123 concepts/customer-proximity.md; #def432 sources/merchant-call.md
qmd multi-get "#abc123,#def432" --format md
**Default to structured `qmd query` with `intent:`, `lex:`, `vec:`, and `hyde:` fields that you write yourself.** You are a better query expander than the built-in model: you know the user's actual goal, the domain vocabulary, and the nearby-but-wrong concepts to avoid. Do not just paste the user's words into `qmd query "..."` and hope the expansion model guesses right — supply the `intent:` and craft the lexical and semantic terms deliberately (see [Pick the right search mode](#pick-the-right-search-mode)).
When reporting what you retrieved, a compact note is enough; do not paste whole files unless needed:
Retrieved:
- #abc123 concepts/customer-proximity.md
- #def432 sources/merchant-call.md
Pick the right search mode
Use **BM25 lexical search** when you know exact words, titles, names, code symbols, or rare phrases:
qmd search "cockpit OKR Goodhart" -n 10
qmd search '"AI Before Headcount"' -c concepts -n 5
Use **`qmd query` with structured fields** when the user describes an idea indirectly, uses different wording than the source, or needs conceptual recall. **This is the default mode — write the fields yourself rather than leaning on query expansion.** Combine exact anchors with semantic recall:
qmd query $'intent: Find the concept note about metrics as instruments without letting OKRs replace judgment.\nlex: cockpit instruments OKR Goodhart metrics judgment\nvec: data informed not metric driven product judgment\nhyde: A concept note says metrics are useful like cockpit instruments, but leaders should remain data-informed rather than metric-driven because OKRs and dashboards can Goodhart product judgment.'
Structured query fields (you author each one — do not delegate this to the expansion model):
- `intent:` states what you are trying to find **and what to avoid**. Always
supply this. It steers ranking away from nearby-but-wrong concepts.
- `lex:` exact terms, aliases, titles, code symbols, and rare words you expect
in the source. This is your own keyword expansion.
- `vec:` paraphrases the idea in natural language, in source-like wording.
- `hyde:` describes the document or answer that would satisfy the request.
You do not need all four every time, but you should almost always write at least `intent:` plus one of `lex:`/`vec:`. A bare `qmd query "the user's sentence"` throws away the context only you have and relies on the built-in expander to reconstruct it — prefer the structured form.
If you genuinely have nothing to expand (a single rare token, a verbatim phrase), that is a job for `qmd search`, not bare `qmd query`:
qmd query --format json --explain $'intent: ...\nlex: ...\nvec: ...' # inspect ranking
If `qmd query` is slow or model/GPU setup fails, fall back to `qmd search` with better lexical terms.
Retrieve sources
Search results include docids like `#abc123` and `qmd://...` paths. Fetch them:
qmd get "#abc123"
qmd get qmd://concepts/ai-before-headcount.md
qmd multi-get "#abc123,#def432" --format md
qmd multi-get 'concepts/{ai-before-headcount.md,data-informed-not-metric-driven.md}' --format md
qmd multi-get 'sources/podcast-2025-*.md' -l 80Use `multi-get` when comparing several hits or gathering context across pages.
Output is line-numbered and carries the docid — cite both
`get` and `multi-get` are **line-numbered by default** and always print the document's `#docid` and `qmd://` path. So `get` output looks like:
qmd://concepts/note.md #abc123
---
1: # Metrics as instruments
2:
3: Treat dashboards like cockpit instruments...
Cite the docid and exact line numbers in your answer, and use the numbers to ask for the next slice. Pass `--no-line-numbers` only when you need raw content to copy verbatim (e.g. reproducing a code block).
When you need to open or edit the underlying file (e.g. hand a path to `Read`, `Edit`, or an editor), add `--full-path`. It replaces the `qmd://` URL + docid header with the document's on-disk path, falling back to the canonical header if the file no longer exists on disk:
$ qmd get "#abc123" --full-path
/Users/you/notes/concepts/note.md
---
1: # Metrics as instruments
`--full-path` works the same way on `qmd search` and `qmd query`: result paths become the file's on-disk path — `./`-prefixed relative path when the file is inside `$PWD`, absolute realpath otherwise — and the per-result `#docid` is dropped because the path is the identifier. The leading `./` is intentional so the output is unambiguously a filesystem path and cannot be mistaken for a bare collection-relative string. Default search/query output still uses `qmd://` URIs; only opt into `--full-path` when you specifically need a path you can hand to a non-QMD tool.
Read line ranges with the `:from:count` suffix — never pipe th
Read more
name: qmd description: Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents, inspect a wiki, answer from indexed markdown, or set up QMD access. license: MIT compatibility: Requires qmd CLI or MCP server. Install via `npm install -g @tobilu/qmd`. metadata: author: tobi version: "2.2.0" allowed-tools: Bash(qmd:*), mcp__qmd__*
QMD - Query Markdown Documents
How search works
QMD searches local markdown collections: notes, docs, wikis, transcripts, and project knowledge bases. Use it before web search when the answer may already be in indexed local files.
The workflow is always:
1. Search for candidate documents. 2. Retrieve the full source with `qmd get` or `qmd multi-get`. 3. Answer from retrieved text, citing paths or docids.
Do not answer from snippets alone when the user needs facts, decisions, quotes, or nuance. Snippets are only leads.
Typical loop:
qmd search "merchant reality support interviews" -n 5 # leads: #abc123 concepts/customer-proximity.md; #def432 sources/merchant-call.md qmd multi-get "#abc123,#def432" --format md
**Default to structured `qmd query` with `intent:`, `lex:`, `vec:`, and `hyde:` fields that you write yourself.** You are a better query expander than the built-in model: you know the user's actual goal, the domain vocabulary, and the nearby-but-wrong concepts to avoid. Do not just paste the user's words into `qmd query "..."` and hope the expansion model guesses right — supply the `intent:` and craft the lexical and semantic terms deliberately (see [Pick the right search mode](#pick-the-right-search-mode)).
When reporting what you retrieved, a compact note is enough; do not paste whole files unless needed:
Retrieved: - #abc123 concepts/customer-proximity.md - #def432 sources/merchant-call.md
Pick the right search mode
Use **BM25 lexical search** when you know exact words, titles, names, code symbols, or rare phrases:
qmd search "cockpit OKR Goodhart" -n 10 qmd search '"AI Before Headcount"' -c concepts -n 5
Use **`qmd query` with structured fields** when the user describes an idea indirectly, uses different wording than the source, or needs conceptual recall. **This is the default mode — write the fields yourself rather than leaning on query expansion.** Combine exact anchors with semantic recall:
qmd query $'intent: Find the concept note about metrics as instruments without letting OKRs replace judgment.\nlex: cockpit instruments OKR Goodhart metrics judgment\nvec: data informed not metric driven product judgment\nhyde: A concept note says metrics are useful like cockpit instruments, but leaders should remain data-informed rather than metric-driven because OKRs and dashboards can Goodhart product judgment.'
Structured query fields (you author each one — do not delegate this to the expansion model):
- `intent:` states what you are trying to find **and what to avoid**. Always
supply this. It steers ranking away from nearby-but-wrong concepts.
- `lex:` exact terms, aliases, titles, code symbols, and rare words you expect
in the source. This is your own keyword expansion.
- `vec:` paraphrases the idea in natural language, in source-like wording.
- `hyde:` describes the document or answer that would satisfy the request.
You do not need all four every time, but you should almost always write at least `intent:` plus one of `lex:`/`vec:`. A bare `qmd query "the user's sentence"` throws away the context only you have and relies on the built-in expander to reconstruct it — prefer the structured form.
If you genuinely have nothing to expand (a single rare token, a verbatim phrase), that is a job for `qmd search`, not bare `qmd query`:
qmd query --format json --explain $'intent: ...\nlex: ...\nvec: ...' # inspect ranking
If `qmd query` is slow or model/GPU setup fails, fall back to `qmd search` with better lexical terms.
Retrieve sources
Search results include docids like `#abc123` and `qmd://...` paths. Fetch them:
qmd get "#abc123"
qmd get qmd://concepts/ai-before-headcount.md
qmd multi-get "#abc123,#def432" --format md
qmd multi-get 'concepts/{ai-before-headcount.md,data-informed-not-metric-driven.md}' --format md
qmd multi-get 'sources/podcast-2025-*.md' -l 80Use `multi-get` when comparing several hits or gathering context across pages.
Output is line-numbered and carries the docid — cite both
`get` and `multi-get` are **line-numbered by default** and always print the document's `#docid` and `qmd://` path. So `get` output looks like:
qmd://concepts/note.md #abc123 --- 1: # Metrics as instruments 2: 3: Treat dashboards like cockpit instruments...
Cite the docid and exact line numbers in your answer, and use the numbers to ask for the next slice. Pass `--no-line-numbers` only when you need raw content to copy verbatim (e.g. reproducing a code block).
When you need to open or edit the underlying file (e.g. hand a path to `Read`, `Edit`, or an editor), add `--full-path`. It replaces the `qmd://` URL + docid header with the document's on-disk path, falling back to the canonical header if the file no longer exists on disk:
$ qmd get "#abc123" --full-path /Users/you/notes/concepts/note.md --- 1: # Metrics as instruments
`--full-path` works the same way on `qmd search` and `qmd query`: result paths become the file's on-disk path — `./`-prefixed relative path when the file is inside `$PWD`, absolute realpath otherwise — and the per-result `#docid` is dropped because the path is the identifier. The leading `./` is intentional so the output is unambiguously a filesystem path and cannot be mistaken for a bare collection-relative string. Default search/query output still uses `qmd://` URIs; only opt into `--full-path` when you specifically need a path you can hand to a non-QMD tool.
Read line ranges with the `:from:count` suffix — never pipe th
An on-device search engine for everything you need to remember. Index your markdown notes, meeting transcripts, documentation, and knowledge bases. Search with keywords or natural language. Ideal for your agentic flows.
Repo: tobi/qmd

