Skip to content

Quickstart

Kivgraph serves queries from a published generation. Nothing answers until one exists, so the order below is the whole setup: register, check, index, connect.

Terminal window
kivgraph init \
--repository project=/absolute/path/to/project \
--languages go,typescript,rust

--repository NAME=PATH may be repeated. The name is an identifier, compared exactly — two repositories differing only in case are two repositories — and it travels inside the stable keys of everything the repository declares.

--languages accepts ten tokens: go, typescript, javascript, ts, js, rust, rs, python, py and dart. The five languages are not resolved to the same standard. Go, TypeScript and Rust edges are type-checked; Dart edges are resolved by Dart Analysis Server; Python uses exact semantic facts when a configured analyzer provides them and CANDIDATE facts in its bundled AST fallback.

Terminal window
kivgraph doctor

doctor reports the configuration, the toolchains it found and the state of the published graph. It names the language version ceiling this binary type-checks Go with, which is not the go on your PATH and is the number that decides whether a module can be indexed at all.

Terminal window
kivgraph index --full

The pass analyses every registered repository, validates the canonical graph and publishes it as a new generation. Publication is atomic: a candidate that fails integrity or validation never becomes CURRENT, and the previous generation keeps serving.

Configure any MCP client to start the server over stdio:

{
"mcpServers": {
"kivgraph": {
"command": "/home/user/.local/bin/kivgraph",
"args": [
"serve",
"--config",
"/home/user/.config/kivgraph/config.yaml"
]
}
}
}

Most clients can be wired automatically. kivgraph mcp install has five targets — claude-code, claude-desktop, codex, opencode and oh-my-pi — and takes --scope user|project (default user), --dry-run and --force. Claude Desktop is user-scope only and is the one target that installs no local skill. See Clients.

With no published generation there is no query surface. serve completes the handshake, publishes only index_project — which is how a client with no graph builds its first one — and puts the rebuild command in its instructions. It does not exit: a client launches the process itself, so exiting reads as a crash.

The process writes MCP framing exclusively to stdout and logs to stderr. It follows the published generation: it loads the HotSnapshot at start and republishes when the CURRENT pointer advances, so an index --full in another terminal cannot leave a server answering from a graph that no longer exists on disk.