Doctree Mcp

io.github.joesabyPublished by GitHub account joesabyv1.0.1Updated Oct 24, 2026

BM25 search + tree navigation over markdown docs for AI agents. No embeddings, no LLM calls.

VerifiedSTDIODesktop onlyFiles & StorageKnowledge & Memory

Overview

AI-generated overview

A local MCP server that gives an assistant BM25 keyword search and tree navigation over markdown, CSV and JSONL documents, with no embeddings or LLM calls.

What you can do
Search documents with BM25 keyword search, facet filters and glossary expansion across markdown, CSV and JSONL files, and look up exact rows in structured data by key. Browse a document tree to see headings, word counts and summaries, then read a section's full text or a section plus all its descendants. With write tools enabled, find near-duplicate entries, scaffold a new wiki entry with a suggested path and frontmatter, and write it with validation and dry-run.
When to use it
Useful when an assistant needs to answer questions from a local folder of docs, runbooks or notes and you want an auditable search-then-navigate trail rather than opaque similarity scores. Also fits building an agent-maintained wiki over raw source material.
Requirements
Runs locally over stdio, launched with bunx from the npm package doctree-mcp, so a Bun runtime is needed. Requires DOCS_ROOT (or DOCS_ROOTS for weighted collections); optional DOCS_GLOB, GLOSSARY_PATH and WIKI_WRITE. No authentication is declared.
Before you install
Write tools are off unless WIKI_WRITE is set to 1; when enabled they create or overwrite files under the docs root, so review dry-run output and path containment first. The server indexes whatever files the glob matches, so point it only at folders you are willing to expose to the assistant.

Installation

In SourceWeft

  1. Open Doctree Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

doctree-mcp

Agentic document retrieval over markdown, CSV, and JSONL. BM25 + tree navigation via MCP — no vector DB, no embeddings, no LLM calls at index time.

The pitch: MCP provides the structural primitives (a navigable tree, BM25, glossary, row lookup). The bundled skills provide the procedural knowledge (how to walk that tree). Together the agent behaves like a trained research librarian — not a one-shot searcher. See The Skill + MCP Pattern.


Quick Start

Have docs already? Point a client at them:

bash
# In your AI tool's MCP config — see docs/CLIENTS.md for per-tool snippets{ "mcpServers": { "doctree": {    "command": "bunx", "args": ["doctree-mcp"],    "env": { "DOCS_ROOT": "./docs", "WIKI_WRITE": "1" }} } }

Restart the tool → ask "search the docs for X" or invoke the doc-read prompt.

Starting fresh? Scaffold a Karpathy-style LLM wiki:

bash
bunx doctree-mcp init          # configure current toolbunx doctree-mcp init --all    # configure every supported clientbunx doctree-mcp init --dry-run

Creates docs/wiki/ (LLM-maintained) + docs/raw-sources/ (your inputs), writes the MCP config, installs a post-write lint hook, appends wiki conventions to CLAUDE.md / AGENTS.md / .cursor/rules/.


Operation Modes

ModeUse whenGuide
stdio (default)Local dev, agent on your machineClient setup
HTTP (Streamable HTTP)Teams, CI, hosted agentsDeployment — Railway · Fly · Render · Cloudflare Containers · Docker
CLIinit, lint, debug-indexOperation modes

Full decision tree: Operation Modes.


How It Works — Retrieve · Curate · Add

Agent: "How does token refresh work?"
→ search_documents("token refresh")  #1  auth/middleware.md § Token Refresh Flow       score: 12.4  #2  auth/oauth.md       § Refresh Token Lifecycle  score: 8.7
→ get_tree("docs:auth:middleware")  [n1] # Auth Middleware    [n4] ## Token Refresh Flow      [n5] ### Automatic Refresh
→ navigate_tree("docs:auth:middleware", "n4")   ← n4 + descendants

Core read tools (always on):

ToolPurpose
search_documentsBM25 keyword search + facet filters + glossary expansion (markdown · CSV · JSONL)
get_treeTable of contents — headings, word counts, summaries
get_node_contentFull text of a specific section by node ID
navigate_treeA section plus all descendants in one call
lookup_rowO(1) exact-key lookup for structured data rows (e.g. PROJ-44)

Wiki write tools (opt-in with WIKI_WRITE=1):

ToolPurpose
find_similarDuplicate detection with overlap ratios
draft_wiki_entryScaffold: suggested path, inferred frontmatter, glossary hits
write_wiki_entryValidated write: path containment, schema, duplicate guards, dry-run

Safety: path containment · frontmatter validation · duplicate detection · dry-run · overwrite protection.

Deprecated aliases (list_documents, find_files, find_symbol) are superseded by search_documents — still functional, no longer recommended.


The Skill + MCP Pattern

Most retrieval tools hand the agent a search box and hope for the best. doctree-mcp hands it a tree, and the bundled skills teach it how to walk one.

  • MCP = structural primitives. search_documents, get_tree, navigate_tree, get_node_content, lookup_row return tree positions the agent reasons over — not finished answers.
  • Skills = procedural knowledge. /doc-read, /doc-write, /doc-lint encode breadcrumb drill-down: search → outline → navigate → retrieve. The agent learns the policy, not just the API.

That pairing doesn't exist cleanly elsewhere:

ApproachPrimitiveSkill teachesGap
Managed hybrid RAG (Cloudflare AI Search, Nia)Flat chunks + similarity—Black-box score, no audit trail
Tool-returns-answer (Context7)2 tools returning answersQuery shapeAgent can't reason about skipped content
Skill-over-CLI (QMD)CLI over flat searchQuery expansionNo tree to navigate
doctree-mcp + /doc-readNavigable treeBreadcrumbs, multi-instance routing, wiki compilation—

Why iterative retrieval wins:

  • Context rot. Stuffing a 1M-token window with chunks degrades output. Breadcrumb navigation keeps working memory small.
  • Auditability. search_documents → get_tree → navigate_tree → get_node_content is a replayable trail. A cosine score is not. Regulated domains can ship the former.
  • Progressive disclosure. Fewer navigable primitives beat tool sprawl (cf. Cloudflare Code Mode).

Multi-instance = client-side federation. Register several doctree servers under different names; the /doc-read skill encodes the routing policy. Add or remove instances without touching the skill. See Client setup → Multi-instance routing.


The LLM Wiki Pattern

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐│  Raw Sources    │     │  The Wiki        │     │  The Schema     ││  (immutable)    │ ──→ │  (LLM-maintained)│ ←── │  (you define)   ││  notes · logs   │     │  runbooks · refs │     │  CLAUDE.md rules │└─────────────────┘     └─────────────────┘     └─────────────────┘

Inspired by Karpathy's LLM Wiki. Full walkthrough: docs/LLM-WIKI-GUIDE.md.


Configuration (summary)

yaml
---title: "Descriptive Title"description: "One-line summary — boosts ranking"tags: [relevant, terms]type: runbook          # runbook | guide | reference | tutorial | architecture | adrcategory: auth---

All non-reserved frontmatter fields become filter facets:

search_documents("auth", filters: { type: "runbook", tags: ["production"] })

Common env vars:

VariableDefaultDescription
DOCS_ROOT./docsDocs folder
DOCS_GLOB**/*.mdComma-separated globs (**/*.md,**/*.csv,**/*.jsonl)
DOCS_ROOTS—Weighted multi-collection (./wiki:1.0,./rfcs:0.5)
PORT3100HTTP mode port
WIKI_WRITE(unset)1 enables write tools
GLOSSARY_PATH$DOCS_ROOT/glossary.jsonQuery-expansion glossary

Full reference: docs/CONFIGURATION.md.

Glossary — place glossary.json in docs root for bidirectional query expansion:

json
{ "CLI": ["command line interface"], "K8s": ["kubernetes"] }

Acronym definitions like "TLS (Transport Layer Security)" are also auto-extracted.

Structured data — CSV/JSONL files become documents where each row is a tree node. Column roles (id, title, description, facets, URL) are auto-detected from headers. See docs/STRUCTURED-DATA.md.


Running from Source

bash
git clone https://github.com/joesaby/doctree-mcp.gitcd doctree-mcp && bun install
DOCS_ROOT=./docs bun run serve          # stdioDOCS_ROOT=./docs bun run serve:http     # HTTP (port 3100)DOCS_ROOT=./docs bun run index          # CLI: inspect indexed outputbun test

Performance

OperationTimeToken cost
Full index (900 docs)2–5s0
Incremental re-index~50ms0
Search5–30ms~300–1K tokens
Tree outline<1ms~200–800 tokens

Docs

Setup & operation

  • Operation Modes — stdio · HTTP · CLI
  • Client Setup — Claude Code · Cursor · Windsurf · Codex · OpenCode · Claude Desktop
  • Deployment — Railway · Fly.io · Render · Cloudflare Containers · Docker
  • Configuration — env vars, frontmatter, ranking tuning

Patterns & concepts

Source


Standing on Shoulders

License

MIT

Source: README.md at commit 1755742

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts