Repository avatar
AI Tools
v1.0.1
active

khive

ai.khive/khive

Persistent memory, knowledge graph, task management and more for AI agents via MCP.

Documentation

khive

CI crates.io License: Apache 2.0 Docs Discord

Documentation · Discord

Vector search finds similar text. A knowledge graph finds structure: lineages, dependencies, contradictions, gaps. khive gives your research agent a typed, queryable graph that grows as it works. Read a paper and entities and edges fall out. Make a connection and it's traversable immediately. Come back next session and the graph remembers what you built.

There's no Neo4j to run and no separate SPARQL endpoint to deploy. It's SQLite on disk, MCP over stdio, and cargo test finishes in 4 seconds.

khive also runs hosted, as memory and a knowledge graph your agents reach over MCP: https://khive.ai/?utm_source=github&utm_campaign=khive-readme


What you get

CapabilityHow
162 verbs, 14 packsKG, GTD, memory, brain, comm, schedule, knowledge, session, tool, exec, git, code, workspace, blob: all load by default
Typed entities9 closed kinds: concept, document, dataset, project, person, org, artifact, service, resource
Typed edges20 closed relations in 10 categories (structure, derivation, provenance, temporal, dependency, impl, lateral, annotation, epistemic, ownership)
Typed notes5 closed kinds: observation, insight, question, decision, reference
Hybrid retrievalFTS5 + vector RRF with embedding rerank; shipped BM25, HNSW, Vamana, and fusion crates for pack-specific retrieval paths
Graph traversalBFS with depth/direction/relation filters, bidirectional shortest path
GQL + SPARQL queriesParse to SQL, run against the same SQLite backend
Salience-weighted notesNotes carry salience scores; search ranks by semantic relevance × salience
Cross-substrate linksNotes annotate entities (and vice versa) via the same edge system
Soft delete + supersedeHistory-preserving: old records stay, newer ones supersede via graph edges
Namespace attributionEvery record is stamped with a namespace and all records share one store by default. Operators can supply a custom Gate for namespace-scoped enforcement

The three substrates

Everything in khive is one of three things:

SubstrateWhat it isMutabilityExample
EntityA graph node with typed edgesMutable + soft-deleteLoRA (concept), arxiv:2106.09685 (document)
NoteA temporal observation about the worldMutable + soft-delete"FlashAttention gains scale with seq len, not batch"
EventAn audit log entryImmutablecreate(kind="entity", ...) was called at T

Entities are things. Notes are what you think about things. Events are what happened.


The MCP verb surface

One MCP tool: request (ADR-016 + ADR-027). Every verb is a parsed op inside it.

request(ops="verb(arg=value, arg=value)")              # single op
request(ops="[v1(...), v2(...), v3(...)]")             # parallel batch (max 100)
request(ops="[{\"tool\":\"v1\",\"args\":{...}}, ...]") # equivalent JSON form

All 14 packs load by default, giving 162 verbs out of the box (updated from the current handler declarations; verify again with request(ops="verbs()") before editing this table):

PackPrefixVerbsWhat it does
kg(bare)31Entities, edges, notes, graph queries, reference resolution, caller identity, WAL diagnostics
gtdgtd.8Task lifecycle, per-assignee counts, timestamp census, and explicit historical repair
memorymemory.6Salience-weighted remember / decay-ranked recall
brainbrain.17Bayesian user profiles + feedback loop
commcomm.15Threaded messaging with sender-side internal delivery confirmation
scheduleschedule.4Reminders and scheduled verb execution
knowledgeknowledge.21Atom-based KB with embedding rerank search
sessionsession.7Session records, dependency-gated mirror search, store stats, and compaction (store/list/resume/export/search/stats/vacuum)
tooltool.14Capability registry, discovery by capability, and use policy: check/request/grant (ADR-180)
execexec.9One declared command in a sandbox over a materialized tree, receipts for every run (ADR-181)
gitgit.17Provenance ingest, branch/commit/update_ref/push writes (ADR-108), dev-loop verbs: checkout, diff, gates, receipts, reconcile, status, log, init, PR open/review/merge (ADR-182)
codecode.4Source ingest and registered-map list, search, dependency reads (ADR-085, ADR-139)
workspace(none)0Adds the workspace entity kind + contains endpoint rules to git/gtd/session notes (#873)
blobblob.9Content-addressed put/get/stat, staged begin/put_part/commit/abort, and opt-in blob.import/blob.export file transfers over BlobStore (ADR-111, ADR-173)

create, list, search take kind=entity|note (or kind=edge for list). get, update, delete, merge are UUID-only: they auto-detect the record type.

Agents reach khive via MCP stdio, using Python, TypeScript, Rust, or any MCP-compatible client, so there is no language SDK to learn.


What typed edges add beyond vector similarity

A vector index returns "these two texts are close." It has no idea that document B introduced concept A, that concept C is a variant of concept A, or that concept D was superseded by concept E last month. Cosine distance carries no direction and no type. It can't tell you what a relationship is, only that something is nearby.

khive's graph carries both signals. Every edge is one of 20 closed relations across 10 categories: structure (contains, part_of, instance_of, links_to, located_in), derivation (extends, variant_of, introduced_by, supersedes), provenance (derived_from), temporal (precedes), dependency (depends_on, enables), implementation (implements), lateral (competes_with, composed_with), annotation (annotates), epistemic (supports, refutes), and ownership (owns, owner → owned).

The following example, run against a scratch database, shows the difference in practice (full transcript in demos/research-ingest.md):

request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"FlashAttention\")")
request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"FlashAttention-2\", description=\"Improved parallelism and work partitioning over FlashAttention\")")
request(ops="link(source_id=\"<fa2_id>\", target_id=\"<fa_id>\", relation=\"extends\")")
request(ops="traverse(roots=[\"<fa_id>\"], max_depth=2)")

traverse returns the lineage directly: FlashAttention-2 reaches FlashAttention across one extends edge, with the edge id and relation name attached to the path. A vector search over the same two entities returns a similarity score between two chunks of text, with no way to tell which one came first or which direction the relationship runs.

khive runs both signals together. search combines FTS5 and vector similarity through RRF fusion to find candidates. traverse, neighbors, and GQL/SPARQL walk the typed edges to show how those candidates actually relate. Similarity surfaces what's nearby in meaning. The graph records what's connected, in which direction, and why.


Architecture

┌──────────────────────────────────────────────────────────────┐
│  kkernel mcp:     stdio MCP server (the `kkernel` binary)     │
│  khived:          persistent daemon (ADR-049): warm runtime   │
│                     auto-spawned on first request             │
│  1 tool: `request` (ADR-016 + ADR-027): parses DSL,           │
│  dispatches each op through the VerbRegistry                  │
└──────────────────────────────────────────────────────────────┘
                            ↕ VerbRegistry dispatch
┌──────────────────────────────────────────────────────────────┐
│  khive-pack-kg:        KG vocabulary + 31 public verbs        │
│  khive-pack-gtd:       task lifecycle (8 verbs)               │
│  khive-pack-memory:    salience + decay recall (6 verbs)      │
│  khive-pack-brain:     Bayesian profiles (17 verbs)           │
│  khive-pack-comm:      threaded messaging (15 verbs)          │
│  khive-pack-schedule:  reminders + scheduled ops (4 verbs)    │
│  khive-pack-knowledge: atom KB + embedding rerank (21 verbs)  │
│  khive-pack-session:   session records, search, stats, vacuum (7 verbs)    │
│  khive-pack-git:       provenance ingest + writes (17 verbs)  │
│  khive-pack-code:      source ingest (L1 manifest + L1.5      │
│                        import-scan) + map reads (4 verbs)                   │
│  khive-pack-workspace: workspace entity + contains endpoint   │
│                        rules (0 verbs)                        │
│  khive-pack-blob:      content-addressed object storage       │
│                        (9 verbs)                              │
│  khive-pack-tool:      tool/skill/plugin registry, capability │
│                        discovery, use policy (14 verbs)       │
│  khive-pack-exec:      sandboxed run over a materialized tree │
│                        (9 verbs)                              │
└──────────────────────────────────────────────────────────────┘
                            ↕ in-process
┌──────────────────────────────────────────────────────────────┐
│  khive-runtime, khive-request, khive-query, khive-db,         │
│  khive-storage, khive-score, khive-types                      │
└──────────────────────────────────────────────────────────────┘

Embedded SQLite storage with FTS5 trigram text search and sqlite-vec vector search. Retrieval ships in-process BM25, HNSW, Vamana, and fusion crates for hybrid and pack-specific search paths. One binary, one DB file, no external services to run.

The khived daemon (ADR-049) keeps the runtime warm between MCP sessions: the embedding model stays loaded, SQLite connections stay open, and pack registries stay initialized. It auto-spawns on first request and persists in the background, eliminating cold-start overhead on reconnect.

HTTP gateway and visual frontend are planned for future releases. The kkernel admin CLI (migrations, reindexing, data import/export, diagnostics) ships today, documented in docs/operations.md.


Performance

Knowledge search runs on an in-process Vamana ANN index (khive-vamana). On the standard SIFT-1M benchmark, the index returns recall@10 of 0.95 at a p50 query latency of 171µs over 1,000,000 vectors, measured on a single laptop (macos-arm64, commit eb6696c). Tail latency stays under 250µs and the index scales sublinearly as the corpus grows from 100K to 1M vectors:

VectorsRecall@10p50p95p99Build
100K0.950471µs93µs102µs11.1s
316K0.9523130µs177µs200µs54.6s
1M0.9521171µs216µs234µs320.8s

Query latency grows about 2.4x while the corpus grows 10x, so the search path is sublinear in corpus size over this range. Index build is a one-time cost paid at construction; it grows super-linearly here (about 29x build time for the 10x corpus).

The speedups over exhaustive search implied by these latencies (89x at 100K, 153x at 316K, 341x at 1M) are computed against a back-derived brute-force baseline rather than a directly measured one (see #167); treat them as indicative, not as a measured headline figure. The benchmark harness lives in perf/; raw data is in perf/ledger.csv. New latency and throughput claims used as decision evidence must follow the cache-state and warm-up protocol.


Crates

CratePurpose
khive-typesDomain types, Pack trait, closed enums
khive-scoreDeterministic i64 fixed-point scoring
khive-storageTrait-only capability surface (zero implementations)
khive-dbSQLite backend: entity/note/edge tables, FTS5 TextSearch, current sqlite-vec VectorStore compatibility
khive-retrievalHybrid retrieval primitives
khive-fusionRRF, weighted, union, vector-only, and keyword-only fusion strategies
khive-bm25BM25 keyword index
khive-hnswHNSW vector index
khive-vamanaVamana ANN index used by knowledge search
khive-querySPARQL / GQL → SQL compiler
khive-runtimeService API + VerbRegistry + PackRuntime trait
khive-requestRequest DSL parser (function-call, JSON; pipe / LNDL planned). Transport-agnostic AST.
khive-pack-kgKG pack: vocabulary, verb handlers, kind validation
khive-pack-gtdGTD pack: task lifecycle over the notes substrate
khive-pack-memoryMemory pack: salience-weighted remember/recall with decay
khive-pack-brainBrain pack: Bayesian user profiles, feedback, resolution
khive-pack-commComm pack: threaded messaging with inbox
khive-pack-scheduleSchedule pack: reminders and scheduled verb execution
khive-pack-knowledgeKnowledge pack: atom-based KB with embedding rerank search
khive-pack-sessionSession pack: session record persistence
khive-pack-gitGit pack: provenance ingest and git write verbs
khive-pack-codeCode pack: L1 manifest + L1.5 import-scan source ingestion
khive-pack-workspaceWorkspace pack: workspace entity kind + contains endpoint rules
khive-pack-toolTool pack: capability registry, discovery, use policy (ADR-180)
khive-pack-execExec pack: sandboxed run of a registered tool over a materialized tree (ADR-181)
khive-pack-blobBlob pack: content-addressed object storage
khive-mcpMCP server library: single request tool dispatching through the VerbRegistry (served by kkernel mcp)
kkernelThe single shipped binary: kkernel mcp serves MCP; admin subcommands (exec, reindex, db, …)

Dependency direction (storage stack): types → score → storage → db → query → runtime → packs → mcp. Side input: request → mcp (the DSL parser is consumed only at the MCP dispatch boundary; packs do not depend on it). Storage is trait-only; backends (SQLite today, Postgres tomorrow) implement the traits without touching consumers.


Quick start

Use khive cloud for the hosted service.

Run it locally from source

For local development, install Rust via rustup if needed, then install kkernel from a source checkout:

git clone https://github.com/ohdearquant/khive.git && cd khive
cargo install --path crates/kkernel --locked

kkernel is the single shipped binary; kkernel mcp serves the MCP request surface.

Add to your MCP config (.mcp.json in your project, or ~/.claude/mcp.json for global):

{ "mcpServers": { "khive": { "command": "kkernel", "args": ["mcp"] } } }

Verify:

kkernel --version   # confirms the binary and version you just installed

All 14 packs load by default, a background daemon auto-spawns to keep the runtime warm, and any MCP client discovers the request tool with the full 162-verb catalog.

Usage

The agent expresses verbs as DSL ops inside the single request tool:

request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"LoRA\")")
request(ops="search(kind=\"entity\", query=\"parameter efficient fine-tuning\")")
request(ops="link(source_id=\"<uuid>\", target_id=\"<uuid>\", relation=\"variant_of\")")

# Batch multiple ops in one call:
request(ops="[create(...), create(...), link(...)]")

Claude Desktop

Add the same server entry to claude_desktop_config.json:

{ "mcpServers": { "khive": { "command": "kkernel", "args": ["mcp"] } } }

See docs/guide/getting-started.md for the config file location on each platform.

Claude Code plugin (skills + agents)

For guided workflows, install the marketplace plugin:

/plugin marketplace add ohdearquant/khive
/plugin install khive

This adds one pattern skill per pack (kg, gtd, memory, brain, comm, schedule, knowledge), four kg workflow skills, and six kg stewardship agents:

SkillWhat it does
/khive:digestIngest material into the graph: extract entities, link, verify
/khive:gapSurvey the graph's structural gaps: read-only frontier ranking
/khive:expandGrow the graph to close one strategic gap, with create caps
/khive:polishAudit and fix: orphans, low-degree nodes, duplicates

The agents (khive:digester, khive:gap-analyst, khive:expander, khive:polisher, khive:librarian, khive:researcher) and the pattern skills are described in marketplace/khive/README.md.

Configuration

khive mcp                                     # Default: ~/.khive/khive.db
khive mcp --db /path/to/my.db                # Custom DB path
khive mcp --db :memory:                       # Ephemeral (testing)
khive mcp --namespace my-project              # Default namespace (default: "local")
khive mcp --no-embed                          # Disable local embedding model
khive mcp --log debug                         # Log level (default: warn)

Environment variables: KHIVE_DB, KHIVE_NAMESPACE, KHIVE_NO_EMBED, KHIVE_LOG.

For config file discovery order, the [[backends]] model, and how --db interacts with a declared backend topology, see docs/configuration.md.

For the kkernel admin CLI (migrations, reindexing, data import/export, diagnostics), see docs/operations.md.

Development

cd crates && cargo test --workspace
make ci  # Full CI: fmt, clippy, test, build

Prerequisites: Rust 1.95+ (workspace MSRV) (via rustup), Deno 2.x (for the TypeScript CLI layer, optional)

  • Node.js 20+ and pnpm (for frontend, optional)

Demos

Runnable, copy-pasteable transcripts against a scratch database. See demos/:

Docs: ohdearquant.github.io/khive (agents: fetch /llms.txt). Questions and discussion: Discord.


Contributing

  • Feature branches + PRs. Never push directly to main.
  • make ci must pass (fmt, clippy, test, no-default-features check, release build).
  • Conventional commits: feat(types): add NoteKind taxonomy.
  • Schema/interface changes need a design doc. Propose it in the PR or as an issue.
  • See CLAUDE.md for the developer guide, AGENTS.md for agent usage.

Status

162 verbs across 14 packs, 9 entity kinds, 20 edge relations, daemon warm startup (ADR-049), knowledge search with embedding rerank, Bayesian brain profiles, threaded messaging, scheduled verb execution. Ready for use with Claude Code and any MCP-compatible agent.

License

Apache 2.0. See LICENSE.

No installation packages available.

Remote