Content
# delapan
**The grounding engine behind context-aware AI tooling.** Capture intent, ground
every answer in a maintained knowledge base, and fill gaps from the web on demand —
**ground → grow → answer**.
delapan runs fully local (SQLite + `sqlite-vec`, no cloud, no account) or behind your
own storage via a small `Store` protocol. It ships as an MCP server, so any MCP client
(Claude Code, etc.) can use it out of the box.
## Install as a Claude Code plugin
Requires [uv](https://docs.astral.sh/uv/) (`curl -LsSf https://astral.sh/uv/install.sh | sh`).
claude plugin marketplace add anthonysuherli/delapan
claude plugin install delapan@delapan
First launch materializes the Python environment (via uv) and seeds a bundled
demo KB. **With zero keys configured** you can immediately run
`/delapan:projects` and `/delapan:resume` against the demo (project `delapan`,
kb `demo`). To unlock semantic search and web research on your own repos, copy
`.env.example` to `.env` in the plugin directory and set `AI_GATEWAY_API_KEY`
(plus `TAVILY_API_KEY` for `/delapan:explore`).
Skills: `/delapan:resume`, `/delapan:search`, `/delapan:explore`,
`/delapan:ingest`, `/delapan:backlog`, `/delapan:projects`, `/delapan:model`.
## Quickstart — local, no credentials
```bash
pip install "delapan[local]"
# MCP server for Claude Code / any MCP client (resume, search, explore, projects)
python -m delapan.mcp.server
# or a loopback HTTP API on 127.0.0.1 (health, projects, KG read/write,
# findings, synopsis, resume, explore-over-SSE under /api/*)
python -m delapan.api.main
```
MCP tools: **`delapan_resume`** (tap a KB → resume card), **`delapan_search`**
(semantic recall over findings), **`delapan_explore`** (gap-fill from the web,
needs LLM + Tavily keys), **`delapan_backlog`** (ranked gap/sparse queries the KB
was asked and couldn't answer), **`delapan_projects`** (cross-repo discovery).
KG co-design seam: **`delapan_propose_kg_schema`** → **`delapan_set_kg_schema`**
(draft a target ontology from the findings, then validate + persist the approved
version) and **`delapan_build_graph`** / **`delapan_get_kg_schema`** (build the
graph steered by the intent schema; compare intent vs emergent ontology).
```python
# the engine, on SQLite, with no cloud creds:
from delapan.store import get_store
from delapan.mcp.tenancy import resolve_tenant
ctx = resolve_tenant("my-repo", "main", create=True) # tenant on the local store
store = get_store()
print(store.count_findings(ctx.kb_id))
```
The local tier stores everything in `~/.delapan/delapan.db` (override with
`DELAPAN_DB_PATH`). No Supabase, no API key, loopback-only.
> **Status:** the engine core (grounding, exploration, findings, KB/project
> persistence), the `Store` seam, the MCP server, and the local HTTP API
> (`/api/*` — mirrors the MCP surface plus KG read/write for a control-panel
> frontend) all run on SQLite today — see [Roadmap](#status--roadmap).
## What's inside
| Capability | Module |
|---|---|
| **Coverage-banded grounding** — score how well the KB covers a query | `core/agent/` |
| **Gap-fill exploration** — plan → search → crawl → extract → merge | `core/exploration/` |
| **Write-time resolution** — ADD/UPDATE/NOOP/SUPERSEDE a candidate finding against its KB before persisting; nothing is ever deleted, only retired (bi-temporal `valid_from`/`invalidated_at`/`superseded_by`) | `core/memory/` |
| **Knowledge graph** — entities + relations over findings | `core/knowledge_graph/` |
| **Canvas surface** — `/canvas/search` (SSE: ephemeral web candidates + grounded streamed answer) and `/canvas/keep` (resolver-gated persistence returning ADD/UPDATE/NOOP/SUPERSEDE events) | `delapan/api/routes_canvas.py` + `delapan/core/canvas/` |
| **Pluggable storage** — `Store` protocol; ships SQLite, plus a Supabase/pgvector backend | `store/` |
| **MCP server** | `mcp/` |
| **Plugin launcher** — uv-run wrapper; materializes the environment on first run and starts the MCP server | `scripts/mcp-server.sh` |
| **Claude Code skills** — seven skills backing the `/delapan:*` slash commands (resume, search, explore, ingest, backlog, projects, model) | `skills/` |
| **Bundled demo KB** — seeded on first local server start so `/delapan:projects` + `/delapan:resume` work with zero keys | `data/demo.db` |
| **First-run onboarding** — KB-not-found guidance card + demo-KB seeding | `delapan/mcp/onboarding.py` |
| **Public `/api` auth** — config-forked bearer auth (Supabase JWT) + beta gate for the hosted tier; `auth: none` keeps the local tier byte-identical | `delapan/api/auth.py` |
| **Eval harness** — closed-book/production/oracle ablation, HHEM faithfulness, retrieval + verdict-calibration metrics, paired stats, reproducible run artifacts (`python -m evals run`); benchmark adapters for watsonxDocsQA + MultiHop-RAG (python -m evals.adapters.<name>) | `evals/` |
## Project tracking
Solo initiative status and prioritized backlog live in [`docs/tracking/`](docs/tracking/)
(markdown source of truth). See the [design spec](docs/superpowers/specs/2026-07-17-solo-project-tracker-design.md).
**Automatic sync**
- Local: `.git/hooks/post-commit` (installed from `.githooks/post-commit`) runs
`scripts/tracking_sync.py` after commits that touch `docs/tracking/`.
- CI: GitHub Action `tracking-sync` mirrors on push (needs secrets
`SUPABASE_URL` + `SUPABASE_SERVICE_ROLE_KEY`).
Manual:
```bash
uv run python scripts/tracking_sync.py --dry-run
uv run python scripts/tracking_sync.py
```
Findings, KBs, and projects are not separate submodules — that persistence lives
inside the `Store` implementations themselves (`store/sqlite.py`, `store/supabase.py`),
behind the one `Store` protocol below.
## Architecture — the storage seam
The engine **never** imports a storage client directly. It calls `get_store()`, which
returns a backend selected by `DELAPAN_BACKEND` (`local` | `cloud`, auto-detected from
creds when unset). Ship a new backend by implementing `store/base.py::Store`.
```python
from delapan.store import get_store
store = get_store() # SQLiteStore on the local tier
findings = store.match_findings(kb_id, embedding, limit=10)
```
Every write to `findings` goes through `core/memory/persist.py::resolve_and_persist`,
not straight to `insert_findings` — a resolver decides per candidate whether it's
genuinely new, refines an existing finding, merely corroborates one, or contradicts
one, and applies that via the `Store`'s `update_finding`/`invalidate_finding`/
`supersede_finding` primitives. Set `memory.enabled: false` in `config.yaml` to fall
back to plain append-only ADD. `scripts/dedup_backfill.py` retires duplicates
already sitting in an existing KB (dry-run by default); `scripts/calibrate_bands.py`
recalibrates the coverage-band thresholds above for whichever embedding model is
active. Schema changes for this land in `migrations/` (cloud tier only — SQLite
migrates itself in-process).
The open-core distribution ships the **SQLite** backend, at parity with the cloud
Supabase/pgvector backend for both retrieval and the write-resolution path above.
## Configuration
Copy `.env.example` and fill the **local** block (the cloud block is optional
and only needed for a self-hosted multi-tenant deployment):
```bash
cp .env.example .env
```
## Development
```bash
python3.11 -m venv .venv
.venv/bin/pip install -e ".[dev,local]"
pytest && ruff check .
```
## Status & roadmap
**Working today (verified on SQLite, no cloud deps):**
- The `Store` seam — `get_store()` → `SQLiteStore`; tenancy, project listing, findings, synopsis, KG.
- The engine core — `agent` (preamble/synopsis/resume), `exploration`, `memory` (resolver + persist), `knowledge_graph` models.
- The tenancy gateway — `resolve_tenant()` resolves a local tenant through the store.
- The MCP server — `delapan_resume` / `delapan_search` / `delapan_explore` / `delapan_backlog` / `delapan_projects` / `delapan_archive` (whole package imports; all 6 tools register and run).
- `python -m delapan.api.main` → `/health` plus the `/api/*` surface: projects,
per-KB graph read/write (nodes/edges CRUD, stats, schema), findings
list/get/delete, synopsis, resume, explore over SSE, and **canvas search/keep** over SSE.
CORS allows control-panel dev origins (`:5173`); `scripts/seed_demo_kb.py` seeds a
credential-free demo KB to point a frontend at.
- **Canvas phase 1** — `/canvas/search` (streamed candidates + grounded answer) and `/canvas/keep`
(resolver-gated persistence) landed; includes two loud-failure fixes: explore now fails the run
on provider quota/error (Tavily HTTP 432, etc.), and synopsis rebuild routes via gateway with
status reporting (`rebuilt`/`skipped`/`failed`).
- **Hosted-tier backend auth (build order phase 1 of [the public-release design](docs/truenorth/specs/2026-07-20-public-release-design.md))** —
`api.auth: none | supabase` config fork; local JWT verification against `SUPABASE_JWT_SECRET`
(`delapan/api/auth.py`), `beta_members` gate, org-scoped tenancy dependencies; slowapi rate
limiting keyed by verified subject; an RLS audit script covering all 29 tenant tables; a
two-user isolation acceptance test; `build_combined_app()` (`delapan/mcp/cloud_server.py`)
serves REST `/api` beside the MCP server for a single Fly deploy. The local tier is unaffected
(`auth: none` default).
- **Eval pipeline** — v1 ablation harness landed (spec: docs/truenorth/specs/2026-07-26-context-eval-pipeline-design.md); phase 2: LongMemEval adapter for externally comparable numbers.
- **Claude Code plugin shell** — shipped in-repo, marketplace-installable (2026-07-26): `scripts/mcp-server.sh` (uv-run launcher), seven skills under `skills/` backing the `/delapan:*` slash commands, a bundled demo KB (`data/demo.db`, project `delapan`/kb `demo`) seeded on first local start, and first-run onboarding (`delapan/mcp/onboarding.py`). Zero-key surface is `/delapan:projects` + `/delapan:resume` against the demo; `AI_GATEWAY_API_KEY` (plus `TAVILY_API_KEY`) unlocks search/explore on real repos.
**Next:**
- Public release phases 2–3: frontend auth screens, `/app` guard + waitlist gate, landing/legal
pages, GitHub OAuth, custom SMTP, Sentry/uptime/analytics wiring, and the Fly deploy of the
combined MCP+REST app — none of this is done yet (see the spec's build order).
- The capture HTTP route (mirror the remaining MCP-adjacent surface over FastAPI).
- Concepts, drift, deepen, bridges, monitoring, user-profile, research reports, and the broader MCP tool surface.
- Store-route or gate the remaining cloud-coupled surfaces (`userprofile`, generic `knowledge_graph/builder`) — currently `[cloud]`-gated at call-time.
LLM-backed features need keys — exploration: `TAVILY_API_KEY` + `AI_GATEWAY_API_KEY`
(the gateway covers LLM calls and embeddings; `OPENAI_API_KEY` is only the embeddings
fallback), synopsis rebuild: `ANTHROPIC_API_KEY`. Browse/tenant/persistence work without them.
## License
[AGPL-3.0-or-later](./LICENSE). Self-host freely; network-deployed modifications must
be shared under the same license. For commercial / non-AGPL licensing, contact the
maintainer.
MCP Config
Below is the configuration for this MCP Server. You can copy it directly to Cursor or other MCP clients.
mcp.json
Connection Info
You Might Also Like
everything-claude-code
Complete Claude Code configuration collection - agents, skills, hooks,...
markitdown
MarkItDown-MCP is a lightweight server for converting URIs to Markdown.
cc-switch
All-in-One Assistant for Claude Code, Codex & Gemini CLI across platforms.
servers
Model Context Protocol Servers
servers
Model Context Protocol Servers
Time
A Model Context Protocol server for time and timezone conversions.