Skip to content

Latest commit

History

178 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

DocsHaven

License: MITPyPI versionGitHub starsGitHub last commitCIPythonCoverage

Your AI agent keeps forgetting what it learned last session. DocsHaven fixes that.

Add your repos, and your agent always has them at hand. DocsHaven is a local knowledge base that lets you index any GitHub repository, search it instantly, and keep your agent informed across sessions. Works with any MCP-compatible agent — Claude, Cursor, Gemini, Codex.

Why DocsHaven?

  • 🧠 Add repos once, search forever — your agent always has the knowledge it needs
  • Instant search — SQLite FTS5 finds relevant docs in <100ms
  • 🔌 Works with any AI agent — Claude, Cursor, Gemini, Codex via MCP
  • 🏠 100% local — no cloud, no API keys, no data leaves your machine
  • 📦 Minimal dependencies — only mcp[cli], no Docker or external services

Features

  • SQLite FTS5 search — BM25 ranking with LIKE fallback, score explanation
  • URI routing — organize knowledge by domain: core://, ref://, guide://
  • Git sync — compressed chunks for multi-machine sync (no merge conflicts)
  • Conflict detection — flag contradictions when adding documents
  • MCP server — 20 tools for any MCP-compatible agent
  • Document chunking — split long documents for better search precision
  • Result type — Pydantic v2 models with Ok/Err pattern
  • Input validation — URL, collection names, query length validated

Installation

pip install docs-haven

Or with uv (recommended):

uv pip install docs-haven

Or from source:

git clone https://github.com/Cipher208/docs-haven.git
cd docs-haven
uv sync
With test dependencies
uv sync --extra test

How to Use

1. Add Repositories to Your Knowledge Base
fromstorageimportStoragefrompathlibimportPathstorage=Storage(Path.home() /".docshaven")
# Add a GitHub repo (clones and indexes markdown files)result=storage.add_repo(
url="https://github.com/fastapi/fastapi",
description="FastAPI web framework",
)
print(f"Indexed {result['files_indexed']} files in {result['chunks']} chunks")
# Add with custom file mask (index Python files)result=storage.add_repo(
url="https://github.com/pallets/flask",
mask="**/*.py",
)
2. Search Your Knowledge Base
# Basic searchresults=storage.search("dependency injection")
forrinresults:
print(f"{r['score']:.2f} [{r['collection']}] {r['title']}")
print(f" {r['content'][:100]}...")
print()
# Search with filtersresults=storage.search(
"async middleware",
collections=["fastapi"],
limit=5,
min_score=0.3,
)
# Use auto strategy (fts for short queries, hybrid for long)results=storage.search("how to use Depends()", strategy="auto")
3. Organize with URI Routing
fromuriimportURI, URIRouter# Parse URIsuri=URI.parse("core://fastapi/dependencies")
print(uri.domain) # "core"print(uri.path) # "fastapi/dependencies"print(uri.to_collection()) # "core__fastapi"# Search within a URI scoperouter=URIRouter(storage)
results=router.search_by_uri("core://fastapi", limit=5)
# List all domainsdomains=router.list_all_domains()
# {'core': {'count': 3, 'doc': 'Core documentation'}, 'ref': {'count': 2, ...}}

Available domains:core, ref, guide, lib, src, test, note

4. Detect Conflicts
fromconflictsimportConflictDetectordetector=ConflictDetector(storage)
result=detector.detect(
title="FastAPI dependency injection",
content="How to use Depends()...",
)
ifresult.has_conflicts:
print(f"Found {len(result.candidates)} similar documents:")
forcinresult.candidates:
print(f" - {c['title']} (score: {c['score']})")
print(f" {c['snippet'][:80]}...")
# Record judgmentdetector.judge("new_doc_id", "existing_doc_id", "supersedes")
5. Sync Between Machines
fromsyncimportSyncerfrompathlibimportPathsyncer=Syncer(Path.home() /".docshaven-sync")
# On machine A: exportresult=syncer.export(
{"fastapi": docs, "sqlalchemy": docs},
created_by="alice",
)
print(f"Exported chunk {result['chunk_id']}")
# On machine B: importresult=syncer.import_chunks()
print(f"Imported {result['chunks_imported']} chunks")
# Check statusstatus=syncer.status()
print(f"Chunks: {status['local_chunks']}")
6. Use as MCP Server

Add to your MCP client config (Claude Desktop, Cursor, etc.):

{
"mcpServers": {
"docs-haven": {
"command": "python",
"args": ["/path/to/docs-haven/server.py"]
}
}
}

Then ask your agent:

"Search for FastAPI middleware examples" "What documentation do we have about SQLAlchemy?" "Check if this new doc conflicts with existing ones"

MCP Tools (20)

ToolDescription
kb_searchSearch with BM25 ranking + highlighted excerpts
kb_add_repoClone and index a GitHub repo
kb_getGet document content
kb_updateUpdate document content
kb_deleteDelete document from knowledge base
kb_list_collectionsList all collections
kb_statsDatabase statistics
kb_collection_renameRename a collection
kb_context_addAdd context attachment
kb_context_listList context attachments
kb_context_rmRemove context attachment
kb_uri_resolveURI to collection mapping
kb_uri_searchSearch within URI scope (supports wildcards)
kb_uri_listList URIs in domain
kb_uri_domainsAll domains with counts
kb_sync_exportExport compressed chunk
kb_sync_importImport chunks
kb_sync_statusSync status
kb_conflict_checkDetect conflicts
kb_conflict_judgeRecord judgment

Comparison

FeatureDocsHavenQMDElasticsearchContext7
Dependencies1 (mcp)1 (npm)JVM + pluginsExternal service
Setup time10 seconds5 minutes30+ minutesAPI key needed
MCP serverBuilt-inNoNoYes
URI routingYesNoNoNo
Conflict detectionYesNoNoNo
Git syncCompressed chunksNoNoNo
CostFreeFreeFree (self-hosted)Paid tiers

FAQ

What is DocsHaven?

DocsHaven is a local knowledge base designed for AI agents. It provides full-text search via SQLite FTS5, organizes knowledge by URI domains (core://, ref://, guide://), and detects contradictions when adding new documents. It runs as an MCP server with 20 tools.

How is this different from just using SQLite?

DocsHaven adds a complete knowledge management layer on top of SQLite: automatic document chunking, BM25 ranking with LIKE fallback, URI-based organization, conflict detection, and compressed multi-machine sync — all exposed via MCP tools.

Can I use this with Claude Desktop / Cursor / other AI agents?

Yes. DocsHaven runs as an MCP server. Add it to your MCP client config and all 20 tools become available to your agent.

How fast is search?

SQLite FTS5 with BM25 ranking handles 1,000+ documents in under 100ms on modern hardware. No network latency since everything is local.

Is my data sent anywhere?

No. DocsHaven is fully local. The only network operation is cloning GitHub repositories (which you initiate). All search and storage happens on your machine.

Architecture

docs-haven/
├── server.py # MCP server (20 tools)
├── storage.py # SQLite FTS5 backend + Result types
├── vector.py # TF-IDF vector search (optional)
├── uri.py # URI routing
├── sync.py # Git sync (compressed chunks)
├── conflicts.py # Conflict detection
├── result.py # Ok/Err Result type (Pydantic v2)
├── cli.py # CLI interface (11 commands)
├── templates.py # Collection templates
├── import_guard.py # Import validation
├── alias.py # LLM argument aliasing
├── benchmark.py # Performance benchmarks
├── tests/ # pytest test suite (282 tests)
├── docs/ # Documentation + 10 ADRs
└── pyproject.toml # Package config (uv)

Performance

Benchmarked on Linux (Python 3.14, SQLite FTS5):

OperationTime
Index 1,000 docs0.076s (13,219 docs/sec)
Search (avg)3.3ms
Search (P95)4.3ms
Throughput299 queries/sec

Run benchmark: uv run python benchmark.py

Integrations

ClientConfigStatus
Claude Desktopclaude_desktop_config.json
Cursor.cursor/mcp.json
Gemini CLIgemini mcp add
VS Code (Copilot).vscode/mcp.json
Codex.codex/config.toml

Development

# Install with test dependencies
uv sync --extra test# Run tests
uv run pytest tests/ -v
# Run linting
uv run ruff check .# Run formatting
uv run ruff format .# Run type checking
uv run mypy . --ignore-missing-imports
# Run coverage
uv run pytest tests/ --cov --cov-report=term-missing

Security

  • SQLite FTS5 with parameterized queries (no SQL injection)
  • Input validation on all MCP tool parameters
  • No external network dependencies (local-only operation)
  • Secret scanning via GitHub Actions (gitleaks)

See SECURITY.md for vulnerability reporting.

Author

Built with ❤️ by Cipher208

License

MIT

About

Add repos, and your agent always has them at hand. Local knowledge base with instant search, zero dependencies. MCP server for Claude, Cursor, Gemini, Codex.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages