DocHarvest
Turn Any Documentation Site into LLM-Ready Markdown, Vector Context & Offline Books
Universal Agent Skill · Native FastMCP v2 Server (12 Tools) · Zero-Config CLI · Desktop GUI · Pure-Python PDF Studio
⚡ Overview
Your coding agent doesn't read documentation — it reads web pages. Navbars, cookie banners, search modals, and footer scripts make up 80–85% of a raw page's bytes before a single API fact arrives. Chunks captured without source URLs make hallucinations unfalsifiable, and per-page cloud scraping API bills spike the moment you index a real documentation portal.
DocHarvest (package: gitbook-downloader) compiles any technical documentation site into a pristine, structured local knowledge base with verifiable SHA-256 provenance:
- ⚡ Ultra-Fast Throughput: Reference capture of 673 pages in 18.2 seconds (~37 pages/sec) directly into SQLite FTS5 BM25 search and semantic graphs.
- 🎯 ~83% Token Reduction: Eliminates boilerplate DOM trees, sidebars, anchor spam, and tracking wrappers, delivering high-density context directly to your LLMs.
- 🧠 Universal Agent Skill (
SKILL.md): Bundled, harness-neutral intelligence that equips 14+ coding agents (Cursor, Claude Code, Windsurf, Gemini CLI, Oh My Pi, Codex) with self-orchestrated harvesting and retrieval workflows via a single install command (docharvest skill install docharvest -o <dir>). - 🔌 Native FastMCP v2 Server: 12 zero-friction tools, MCP Resources (
docs://{domain}/book), and MCP Prompts over stdio, ready out-of-the-box with zero API keys or cloud dependencies. - 🔒 Deterministic SHA-256 Provenance: Every page is stored with an exact SHA-256 content hash in YAML frontmatter for caching, version diffing, and citation verification.
Whether you are feeding 500-page API manuals to Cursor / Claude Code, building vector RAG pipelines with LangChain & LlamaIndex, reading offline on an airplane, or archiving technical libraries — every capture ends in the same verifiable shape: clean markdown ready for your agent or your bookshelf.
⏱️ 30-Second Start
# 1. Install via pip (FastMCP v2 server & bundled skill included)
pip install gitbook-downloader
# 2. Capture a complete docs site with RAG JSONL and offline PDF
docharvest capture https://docs.openalgo.in/ --rag --pdf
# 3. Equip your AI agent with the Universal DocHarvest Skill
docharvest skill install docharvest -o .cursor/skills # or .claude/skills, .agents/skills...
No API key. No account. No telemetry. When the command finishes you own a book.md, an llms.txt, a RAG JSONL dataset, and a printable PDF — all local, all MIT. Full install paths (standalone .exe, uvx, optional extras) are in Quick Start.
No API key. No account. No telemetry. When the command finishes you own a book.md, an llms.txt, a RAG JSONL dataset, and a printable PDF — all local, all MIT. Full install paths (standalone .exe, uvx, optional extras) are in Quick Start.
🧩 Supported Documentation Platforms (8 Real Providers)
DocHarvest features dedicated, priority-ordered parsers that extract clean article content and strip headers, footers, sidebars, anchor hashes, and cookie banners:
| Provider | Priority | Discovery Method | Clean Content Target |
|---|---|---|---|
| GitBook | 100 |
.md endpoint probing, sitemap, space discovery |
Native markdown or .page-inner / article |
| Mintlify | 90 |
mintlify.json, OpenAPI specs, CDN asset anchors |
#content, #main-content, article |
| Docusaurus | 80 |
sitemap.xml, docusaurus.config.js, sidebars |
article, .markdown, main .theme-doc-markdown |
| Nextra | 75 |
sitemap.xml, Next.js app routes, nextra scripts |
main.nextra-content, article |
| VitePress | 72 |
Sitemap, VitePress theme anchors, route index | div.vp-doc, div.VPContent, main.VPDoc |
| MkDocs | 70 |
search/search_index.json, sitemap |
article.md-content__inner, div.md-typeset |
| ReadMe.io | 65 |
sitemap.xml, /llms.txt, developer hub routes |
div.rm-Article, div.rm-Markdown, #content |
| ReadTheDocs | 60 |
Sphinx sitemap.xml, div.sphinxsidebar |
div.document[role="main"], div.body |
| Generic HTML / SPA | 0 |
BFS link crawl, llms.txt, sitemap.xml |
main, article, [role="main"], #content |
🌟 Key Capabilities
- 🤖 Zero-Noise LLM Context: Auto-detects 8 documentation frameworks, probes native
.mdendpoints, and cleans DOM trees — measured at ~83% token reduction vs raw pages. - 📦 Four-Part Output Contract: Every capture yields a modular
pages/tree with SHA-256 YAML frontmatter, a consolidatedbook.mdwith TOC, a standardizedllms.txtmanifest, and search index records. - 🚀 Export Studio & Local Search: RAG JSONL for vector databases, pure-Python PDF handbooks (
fpdf2, zero C-dependencies), and AST markdown chunks — all indexed into embedded SQLite FTS5 BM25 search. - 🔌 Native FastMCP v2 Server: 12 MCP tools plus resources and prompts over stdio, with ready-made configs for 14 AI clients (Cursor, Claude Code/Desktop, Windsurf, VS Code & more). Crash-safe atomic storage and semver snapshot diffing included.
What DocHarvest Is Not For
A tool that claims to do everything has earned none of your trust. Honest scope:
- Not for login-walled, paywalled, or CAPTCHA-protected content. DocHarvest is built for public technical documentation and will not bypass access controls.
- Not for internet-scale crawling. Millions of arbitrary URLs is Common Crawl / Scrapy territory; this is a documentation compiler, not a search-engine crawler.
- Not for e-commerce or social feeds. Product catalogs and social streams are out of scope by design.
- Not a cloud service. No dashboard, no subscription, no telemetry — because nothing of yours ever leaves your machine.
🖥️ Desktop GUI: Document Library & Management
The desktop application includes a dedicated Document Library for managing all harvested technical docs:
- Instant Search: Real-time filtering across downloaded portals.
- In-App Renaming: Organize project labels without breaking file paths.
- 1-Click Export Studio: Export selected docsets to Markdown, Vector JSONL, or PDF handbooks directly from the GUI.
- Direct Finder/Explorer Integration: Open raw markdown source folders with a single click.
📋 The Four-Part Output Contract
What a generic crawler hands your LLM (every page, every time):
<nav class="sidebar">…47 links…</nav>
<div class="cookie-banner">We value your privacy…</div>
<main>
<h1>OAuth 2.0<a class="anchor" href="#oauth2">¶</a></h1>
<pre><code><span class="token-keyword">import</span> <span class="token-variable">requests</span>…</code></pre>
</main>
What DocHarvest delivers — the same page, with cryptographic provenance:
---
source_url: https://docs.openalgo.in/v/v2.0/api-reference/oauth
title: "OAuth 2.0 Authentication"
content_hash: "sha256-2fa9ca2a57c4e974f1725657f88f757e25b90adee3e18ef809f65932d283746c"
---
# OAuth 2.0 Authentication
## Request Signature
```python
import requests
response = requests.post(
"https://api.openalgo.in/oauth/token",
json={"client_id": "pk_live_..."},
)
```
The content_hash is the real SHA-256 of the markdown body shown above — paste it into any SHA-256 tool and it verifies.
Every crawl produces the same standardized, deterministic directory structure:
~/.gitbook-downloader/docs/
└── docs.openalgo.in/
├── pages/ # Modular individual markdown files
│ ├── 001_quickstart.md
│ └── 002_api_reference.md
├── book.md # Consolidated single handbook with hierarchical TOC
├── llms.txt # Standardized AI discovery manifest
├── exports/
│ ├── openalgo_rag.jsonl # Tokenized vector chunks + metadata
│ └── openalgo_handbook.pdf # Publication-grade printable PDF (pure Python)
└── .manifest.json # Crawl metadata, engine version & cryptographic hashes
🚀 Quick Start
Option 1: Standalone Executable (Zero Setup)
Download docharvest-windows-latest.exe from the latest release:
- Double-click to launch the Desktop GUI Application.
- Or execute directly in your terminal:
.\docharvest-windows-latest.exe crawl https://docs.openalgo.in/ --rag --pdf
Option 2: Install via pip / PyPI
# Standard installation (100% local, zero C-dependencies)
pip install gitbook-downloader
# Optional headless browser rendering for dynamic JavaScript SPAs
pip install "gitbook-downloader[render]"
playwright install chromium
# MCP server: the FastMCP SDK ships in the base install — nothing extra needed.
# (The [mcp] extra is a backward-compatibility no-op; this line still resolves.)
pip install "gitbook-downloader[mcp]"
# Launch desktop GUI:
docharvest --gui
# Or run a CLI crawl:
docharvest capture https://docs.openalgo.in/ --rag --pdf
Option 3: Ultra-Fast One-Liner via uv / uvx
# Launch GUI instantly without permanent installation:
uvx gitbook-downloader --gui
# Or install as a global CLI tool:
uv tool install gitbook-downloader
💻 CLI Command Reference
# Basic Documentation Crawl (aliases: capture, dl, crawl)
# `docharvest capture` is the canonical verb; `crawl` remains as a documented alias.
docharvest capture https://docs.openalgo.in/
# Full Compilation (Markdown + RAG JSONL + llms.txt + PDF Handbook)
docharvest capture https://docs.openalgo.in/ --rag --pdf
# Crawl Dynamic Client-Rendered SPAs (Playwright Headless Browser)
docharvest capture https://omp.sh/docs --render
# Restrict Crawl to Specific Path Prefix & Limit Depth
docharvest capture https://docs.example.com/ --scope /api/ --max-pages 50
# Capture a Local Dev Docs Server (host:port domains are fully supported)
docharvest capture http://localhost:3000/docs --output library
# Full-Text BM25 Search across Harvested Docs
docharvest search "OAuth 2.0 authentication token"
# List Harvested Document Domains in Local Library
docharvest ls
# Show Snapshot History & Diff Versions
docharvest history docs.example.com
docharvest diff docs.example.com v1.0.0 v1.0.1
# Start FastMCP Server over Stdio for AI IDEs
docharvest --mcp
# List / Install the Bundled Agent Skill
docharvest skill list
docharvest skill install docharvest -o .claude/skills
# Launch Desktop GUI Application (native window or browser)
docharvest --gui
docharvest gui --browser zen
🧠 Agent Skills: Universal MCP Skill for Every Agent Harness
The FastMCP server gives an agent tools; the bundled docharvest skill gives it reasoning & workflow intelligence. It teaches LLM agents when and how to call tools without redundant network crawls, how to bound context windows to avoid token bloat, and how to verify cryptographic SHA-256 provenance.
One skill, one SKILL.md, universal cross-agent compatibility: the server speaks standard MCP over stdio and the skill format follows the universal open agent standard, allowing all 14+ MCP-capable agent harnesses to load and execute it natively.
🌐 Universal Harness Matrix (14+ Supported Environments)
Install the bundled skill into any agent's discovery directory in a single command with docharvest skill install docharvest -o <target_dir>:
| Agent / Harness | Skill Target Directory | 1-Command Skill Installation | Trigger / Invocation |
|---|---|---|---|
| Cursor | .cursor/skills |
docharvest skill install docharvest -o .cursor/skills |
Auto-invoked or @docharvest |
| Claude Code | .claude/skills |
docharvest skill install docharvest -o .claude/skills |
claude prompt / /skill:docharvest |
| Claude Desktop | ~/.claude/skills |
docharvest skill install docharvest -o ~/.claude/skills |
Natural language queries |
| Windsurf | .codeium/skills |
docharvest skill install docharvest -o .codeium/skills |
Cascade auto-dispatch |
| Oh My Pi (OMP) | .omp/skills |
docharvest skill install docharvest -o .omp/skills |
/skill:docharvest <query> |
| VS Code (Copilot/MCP) | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
Chat agent prompt |
| Antigravity / Gemini CLI | .gemini/skills |
docharvest skill install docharvest -o .gemini/skills |
CLI skill invocation |
| GitHub Copilot Workspace | .github/skills |
docharvest skill install docharvest -o .github/skills |
Workspace agent prompt |
| JetBrains AI Assistant | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
AI Assistant prompt |
| Zed | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
Context server prompt |
| Cline | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
Task auto-execution |
| Continue.dev | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
@docs context prompt |
| Kiro | .kiro/skills |
docharvest skill install docharvest -o .kiro/skills |
Kiro agent runner |
| OpenCode | .opencode/skills |
docharvest skill install docharvest -o .opencode/skills |
Agent command bar |
| OpenAI Codex CLI | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
CLI assistant prompt |
| Universal / Standard Agents | .agents/skills |
docharvest skill install docharvest -o .agents/skills |
Standard discovery loader |
What the Skill Encodes:
- Autonomous Two-Stage Lookup: Instructs the agent to check
list_domainsandfind_docsfirst, reusing local cached libraries before triggering network crawls. - AST-Aware Token Slicing: Employs
read_doc(domain, topic=..., max_tokens=4000)to pull precise sub-headings without splitting code blocks or tables. - Topological Traversal: Uses
query_doc_graphandget_related_conceptsto navigate prerequisite concepts and API references across complex documentation hierarchies. - Automated Version Audits: Executes
list_versions,diff_versions, andget_changelogto analyze documentation drifts and API updates over time. - Graceful CLI Seam: Transparently falls back to
docharvest captureanddocharvest searchwhen running in environments without active MCP server connections.
# Inspect all bundled skills:
docharvest skill list
# Install into your current workspace root:
docharvest skill install docharvest -o .agents/skills
🔌 AI Agent Integration: Native FastMCP v2 Server
DocHarvest includes a native FastMCP (Model Context Protocol v2) server exposing 12 high-level tools, MCP Resources, and MCP Prompts over standard input/output (stdio). It is compatible with mcp<2 and mcp>=2.1.
Zero-Dependency SDK: The
mcpSDK ships directly inside the base package.pip install gitbook-downloaderoruvx gitbook-downloader mcpworks out of the box with no extra steps.
All 12 Native MCP Tools
download_docs(url, max_pages=None, workers=8, path_scope=[], exclude_paths=[], site_versions=None, output_mode="both")Captures any documentation URL into Markdown,book.md, andllms.txt.search_docs(query, domain=None, limit=10)Full-text search across downloaded documentation via SQLite FTS5 BM25.find_docs(query, limit=10)Resolves library/framework names ("react", "nextjs") to indexed domains in the local library.read_doc(domain, path=None, topic=None, max_tokens=4000, version=None)Reads a specific page or topic section with AST-safe token bounding — code blocks and tables are never split.get_doc(domain, version=None)Retrieves the compiled documentation content or preview for a domain.list_domains()Returns metadata for all harvested documentation portals in local storage.query_doc_graph(domain, query, limit=10)Queries the semantic entity & concept graph to discover connected API endpoints and sections without reading full files.get_related_concepts(domain, concept)Returns 1-hop and 2-hop connected concepts and prerequisite sections.diff_versions(domain, v1, v2)Computes unified diffs and line change statistics between two snapshots.list_versions(domain)Lists available captured snapshots and timestamps for a domain.export_docs(domain, format="markdown")Exports documentation into"markdown","jsonl", or"rag"metadata formats.get_changelog(domain)Auto-generates version changelogs across captured snapshot iterations.
MCP v2 Resources & Prompts
- Resources:
docs://{domain}/book(full handbook),docs://{domain}/manifest(llms.txtindex). - Prompts:
prompt://search-docset(guided docset synthesis),prompt://summarize-library(library overview).
Zero-Setup MCP Configuration Snippets (14 Clients)
1. Claude Code
claude mcp add docharvest docharvest mcp
Or in ~/.claude.json:
{
"mcpServers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
2. Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"docharvest": {
"command": "uvx",
"args": ["gitbook-downloader", "mcp"]
}
}
}
3. Cursor (.cursor/mcp.json)
{
"mcpServers": {
"docharvest": {
"command": "python",
"args": ["-m", "gitbook_downloader.mcp"]
}
}
}
11 more client configs — Windsurf · VS Code · JetBrains · Zed · Cline · Continue · Kiro · OpenCode · Oh My Pi · Gemini CLI · Codex CLI
4. Windsurf (~/.codeium/windsurf/mcp_config.json)
{
"mcpServers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
5. VS Code (.vscode/mcp.json)
{
"servers": {
"docharvest": {
"type": "stdio",
"command": "docharvest",
"args": ["mcp"]
}
}
}
6. JetBrains AI Assistant / PyCharm / IntelliJ
Configure via Settings → Tools → Model Context Protocol (MCP):
- Server Name:
docharvest - Command:
docharvest - Arguments:
mcp
7. Zed (settings.json)
{
"context_servers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
8. Cline (cline_mcp_settings.json)
{
"mcpServers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"],
"disabled": false,
"autoApprove": ["search_docs", "get_doc", "list_domains", "query_doc_graph"]
}
}
}
9. Continue.dev (config.json)
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "docharvest",
"args": ["mcp"]
}
}
]
}
}
10. Kiro (.kiro/settings/mcp.json)
{
"mcp": {
"servers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
}
11. OpenCode (opencode.json)
{
"mcp": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
12. Oh My Pi (omp.sh) (.omp/mcp.json project · ~/.omp/agent/mcp.json user)
{
"$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/src/config/mcp-schema.json",
"mcpServers": {
"docharvest": {
"type": "stdio",
"command": "uvx",
"args": ["gitbook-downloader", "mcp"],
"timeout": 0
}
}
}
timeout: 0 disables the client-side request timeout. DocHarvest crawls a
documented site at roughly 0.075 s/page, so a full-site capture can exceed a
client's default timeout (OMP defaults to 30 s) and be aborted mid-crawl; set a
positive millisecond value instead if you prefer a hard ceiling, and use
max_pages to bound very large sites.
Not for Pi (
pi.dev): Pi keeps its MCP configuration elsewhere, which is outside OMP's discovery list — use Pi's own configuration file.
13. Antigravity / Gemini CLI (mcp/docharvest.json)
{
"name": "docharvest",
"command": "docharvest",
"args": ["mcp"]
}
14. OpenAI Codex CLI (codex_config.json)
{
"mcp_servers": {
"docharvest": {
"command": "docharvest",
"args": ["mcp"]
}
}
}
🐍 Python SDK Example
from gitbook_downloader.api import capture, CaptureOptions
# Configure capture options
options = CaptureOptions(
workers=8,
output_mode="both", # "both", "library", or "local"
render=False, # set True for dynamic JavaScript SPAs
)
# Execute deterministic capture
result = capture("https://docs.openalgo.in/", options=options)
print(f"Captured {result.pages_captured} pages using provider: {result.provider}")
print(f"Book file: {result.book_file}")
print(f"Manifest: {result.manifest_file}")
🧪 Test Suite & Quality Benchmarks
DocHarvest is continuously tested across Windows, Linux, and macOS:
- 686 Automated Tests: 100% pass rate across engine discovery, BFS crawling, provider extraction, storage safety, DocGraph semantic search, and MCP v2 tools (verified on this release).
- 73%+ Statement Coverage: Rigorous test suites covering error recovery, invalid signatures, domain locks, and AST link normalization.
- Windows CRLF Safe: All link and boilerplate stripping routines are cross-platform normalized against Windows CRLF and Unix LF linebreaks.
To run the test suite locally:
uv run pytest --cov=gitbook_downloader
👨💻 Author & Connect
Created with ❤️ by Rohan Shetty.
- 🌐 Website: rohannshetty.github.io/gitbook-downloader
- 🐙 GitHub: @RohannShetty
- 💼 LinkedIn: linkedin.com/in/rohan-shettyy
- 🐦 X (Twitter): @rohan__shetty
- 📧 Email: shettyrohan2@gmail.com
📄 License
This project is licensed under the MIT License.
Metadata
Release files for gitbook-downloader 11.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gitbook_downloader-11.1.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gitbook_downloader-11.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.6 MB
Release files / gitbook_downloader-11.1.0.tar.gz
| Download URL | gitbook_downloader-11.1.0.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b7e3f1270c602e249ad9dabfa582ac8b7ba14cdf3aca8e1c4e18217367167e22
|
|
BLAKE2b-256 checksum How to use checksums |
716aeea57aa5796bcda3e6f8bb065a3f80e6209527c9169da9068679a322be36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / gitbook_downloader-11.1.0-py3-none-any.whl
| Download URL | gitbook_downloader-11.1.0-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b726e41aba34ea072f537673ebf06ee8a826a6b0b45f905141123a0df3a3f6ca
|
|
BLAKE2b-256 checksum How to use checksums |
f90b5817b47cf636c156941b9915bcffa258dc81dbc5eabb93f78d6ecddfbfbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency log