Indexes folders of your documents locally and answers with the passages it found; embeddings are computed on your machine.
Offline knowledge desk
Searches what you keep on your own machine — documents, mail archives, notes, papers and an offline Wikipedia — and can answer with a local model.
Built for: The person who would rather their documents never leave the laptop: a researcher, a journalist, anyone working on a plane or under a policy.
The button opens the checkout, where the 6 servers and 2 skills are listed one by one. Every member is free, so the checkout lists them and asks for no card.
What your agent can do with this
The reason to buy a stack rather than five listings: each line below needs more than one member connected at the same time.
- 01
Index a folder of documents and answer a question with the passages it came from, without sending the files anywhere.
- 02
Look something up in an offline copy of Wikipedia or Stack Exchange with no connection.
- 03
Search years of exported mail and find the thread with the attachment you remember.
- 04
Pull the papers, notes and annotations on a topic out of Zotero and Obsidian into one summary.
The assembly, part by part
What each part contributes, and why it was picked over the obvious alternative. Prices and permissions are read from the listings, so nothing here can disagree with the catalogue.
Searches ZIM archives offline — Wikipedia, Wiktionary, Stack Exchange and other Kiwix downloads.
Searches .mbox and .eml mail archives on disk, with no account and no OAuth.
Your Zotero library — items, full text, notes and annotations — in local mode against the Zotero app on your machine.
Reads, searches and edits notes in an Obsidian vault through its Local REST API plugin.
Runs models through a local Ollama — list, pull and chat — for the answers that should not go to a hosted model.
Converts Office files, PDFs and other documents to Markdown with Microsoft's MarkItDown, so they can be indexed.
Anthropic's PDF skill for extracting text and tables before a document is indexed.
What it costs, and on what assumption
Every member is free, so the monthly figure is $0 whatever you do with the stack: nothing here is billed by the call, and only adding a paid member could change it.
| Part | What you are paying for | Monthly, as quoted |
|---|---|---|
| Local Rag | Free | — |
| Openzim | Free | — |
| Mbox | Free | — |
| Zotero | Free | — |
| Obsidian | Free | — |
| Ollama | Free | — |
| Skills | ||
| MarkItDown | Free · context cost only | — |
| PDF Processing Guide | Free · context cost only | — |
| Everything above | $0 of servers plus $0 of skills, the same in a quiet month and a busy one | $0/mo |
Subscriptions at their monthly plan price; one-off licences spread over 12 months.
Install only these and the bill is nothing: 6 servers and 2 skills, and all 75 tools.
Nothing in this stack carries a call allowance, so nothing here can run out before the month does. The bill is decided when you install it, not when you use it.
The spend cap is one figure for the whole account, set in your dashboard and checked when an order is placed. On the call path what stops a retry loop is the plan's call allowance and its rate limit, and a refused call is never billed.
Setting it up, in order
The steps below come before the install lines: what to decide and scope before connecting anything, in the order it matters. The lines themselves follow, part by part, for the client you pick.
npx mcprush@latest stack add offline-desk writes all 6 servers into Claude Code’s config in one go — or run the lines below one by one. The 2 skills are not included — add them with lines 07–08.
- Obsidian
OBSIDIAN_API_KEY— Bearer token for the Obsidian Local REST API plugin (Settings → Community Plugins → Local REST API)
Set it where you start Claude Code — export OBSIDIAN_API_KEY=… in your shell profile on macOS and Linux, setx OBSIDIAN_API_KEY "…" on Windows, then open a new terminal. Claude Code reads it at start; the config keeps only the name.
Openzim: Put your own value in place of <zim_directory> before you run this.
# 01 · Local Rag
claude mcp add --scope user local-rag-mcp '--' npx -y mcp-local-rag
# 02 · Openzim
claude mcp add --scope user openzim-mcp '--' uvx openzim-mcp '<zim_directory>'
# 03 · Mbox
claude mcp add --scope user mbox-mcp '--' npx -y mbox-mcp
# 04 · Zotero
claude mcp add --scope user 54yyyu-zotero-mcp '--' uvx zotero-mcp-server serve
# 05 · Obsidian
claude mcp add --scope user --env 'OBSIDIAN_API_KEY=${OBSIDIAN_API_KEY}' --transport stdio cyanheads-obsidian-mcp '--' npx -y obsidian-mcp-server
# 06 · Ollama
claude mcp add --scope user ollama-mcp '--' npx -y ollama-mcp-server
# 07 · MarkItDown
npx mcprush@latest skill add k-dense-ai/markitdown
# 08 · PDF Processing Guide
npx mcprush@latest skill add anthropics/pdf-processing-guideRequirements and Windows tips
- Node.js — the current LTS (24) is the safe choice (for
npx). - uv (for
uvx, docs.astral.sh/uv). - Windows PowerShell says 'running scripts is disabled on this system'? Run
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedonce, or typenpx.cmdinstead ofnpx(codex.cmd,gemini.cmd,grok.cmdlikewise). PowerShell 7 needs neither.
Nothing is connected until you approve it in Claude Code. mcprush is not in the path and meters nothing here.
- 2 members want an API key, set in your own client’s config on your machine — this marketplace never holds it.
- 4 members have not declared what credential they need — check each one’s own page before you start.
- What this stack can write is not recorded — 2 members of 6 have no imported tool surface. Section 05 says what is known before you approve anything.
- 6 members are connected straight from their own package or address — nothing in them goes through mcprush.
What the whole stack can reach
Installed together, these tool surfaces add up. It is the first thing a security reviewer asks for, so what has been counted — and what nobody has counted yet — is on the page rather than in a PDF.
| Member | Tool surface | Write tools |
|---|---|---|
| Zotero | imported | 19 |
| Ollama | imported | 4 |
| Local Rag | not imported | not recorded |
| Obsidian | not imported | not recorded |
A stack's blast radius is the union of its members, not the worst of them. That union cannot be taken here, because 2 members of 6 have no imported tool surface — so the figure a review asks for is missing rather than low, and a member marked not imported is one nobody has counted rather than one that cannot write.
Sensible swaps
A stack is a default, not a verdict. These are the substitutions the maintainer would make, and what each one costs or saves.
For a larger collection kept in a vector database, Chroma's own server manages collections and queries a local Chroma instead of a folder index.
Where this stack stops
Written by the maintainer, kept on the page rather than in a support thread.
The assistant you connect these to may still be a hosted model. For everything to stay local, the client itself has to run on a local model.
Local embeddings and local models are slower and weaker than hosted ones; a big archive takes time to index.
It does not sync or back anything up. Your files stay where they are, and so does the responsibility for them.
Who keeps this current
A stack has an owner: whoever keeps it re-checks the combination when a member changes, and the members themselves are published by the people named on each row.
Other ready-made stacks
Code review
Tools to inspect code changes, run checks and prepare a pull request review.
Bug reproduction
Tools to investigate a bug report and work toward a reproducible test case.
On-call
Tools to investigate alerts, check recent changes and follow the runbook.