● Case study · AI tooling

Let Claude read your notes.

mcp-markdown-kb connects an AI assistant to a folder of Markdown notes, so it can find the right note, follow the links between notes and quote from them, with no database and no API keys.

Rodz·4 min read·TypeScript · MCP
YOUR NOTES. SEARCHABLE. QUOTABLE. ASK CLAUDE “What do my notes say about rate limiting?” api-gateway.md [[Rate limiting strategies]] score 1.44 rate-limiting.md Token bucket allows bursts; sliding… score 2.48 redis-notes.md recipe.md

A lot of knowledge lives in plain Markdown files: an Obsidian vault, a docs/ folder, years of meeting notes. AI assistants are very good at answering questions, but only about what they can see, and your notes usually aren't part of that.

The Model Context Protocol (MCP) is an open standard for giving assistants tools they can call. mcp-markdown-kb is an MCP server: point it at a folder, connect it to Claude Desktop or Claude Code, and ask things like “what do my notes say about rate limiting?” or “which notes link to the API gateway design doc?”.

6tools the assistant can call
2runtime dependencies
0databases or API keys

01What the assistant can do

Each note is also published as an attachable resource, so assistants that support it can pull a specific note straight into the conversation.

02A real search

This is what comes back when the project's own code searches its four test notes for “rate limiting”, then asks which notes link to the top result:

search_notes · get_backlinks
search_notes { query: "rate limiting" }
2.4829  rate-limiting.md        Rate limiting strategies
        "Token bucket allows bursts; sliding window log is exac…"
1.4403  projects/api-gateway.md API gateway
        "Design doc for the gateway. Uses [[Rate limiting strategies]] per API key…"

get_backlinks { path: "rate-limiting.md" }
→ projects/api-gateway.md
Real output from the project's code on its test notes. The note about the topic ranks first; the design doc that links to it ranks second, and shows up again as a backlink.

03How it works

FIG. 01 — FROM QUESTION TO NOTE Claude Desktop / Code MCP · stdio MCP server · 6 tools search_notes read_note get_backlinks list_notes · list_tags reindex 5 of 6 marked read-only + every note as a resource in-memory knowledge base search index BM25 title, tags, headings weigh more than body link map [[wiki links]] relative .md links → backlinks path guard: nothing outside the folder built at startup · rebuilt on reindex ~/notes/**/*.md frontmatter · titles · tags parse
Everything runs locally. The notes are read once at startup into memory; nothing is sent anywhere except the answers the assistant asks for.

At startup the server walks the folder, parses every note (frontmatter, title, tags, headings and links) and builds two things in memory: a keyword search index and a map of which notes link to which. Words in a note's title, tags and headings count for more than words in the body, so a note about a topic outranks one that merely mentions it.

No database, no embeddings, no API keys. Just your files, indexed in memory.

04Decisions I made, and why

05Known limits

Search matches words, not meaning: a note about “throttling” won't be found by a search for “rate limiting” unless it uses those words. The frontmatter parser understands a small subset of YAML, not all of it. And after editing notes, the folder needs a re-scan (the assistant can trigger it with the reindex tool).

Try it or read the code

Open source under the MIT licence. Needs Node 22.18 or newer. With Claude Code:

git clone https://github.com/Rodzman/mcp-markdown-kb
cd mcp-markdown-kb && npm install && npm run build
claude mcp add markdown-kb -- node "$PWD/dist/cli.js" /path/to/notes
TypeScriptModel Context ProtocolMCP SDKZodBM25node:test