Kivgraph
MCP local de código aberto para gráfico de código para agentes de codificação, com descoberta de código baseada em intenção, relacionamentos resolvidos por analisador e navegação entre repositórios.
Documentação
Kivgraph
[!NOTE] Kivgraph começou como um projeto de pesquisa. Ele explorou se um grafo de código semântico local poderia reduzir a quantidade de contexto que agentes de codificação precisam inspecionar.
A ferramenta resultante continua útil para navegação estruturada de código, relacionamentos entre repositórios e análise de impacto. No entanto, a pesquisa não demonstrou uma economia líquida confiável de tokens em conversas longas e de ponta a ponta com agentes. Embora algumas consultas isoladas possam usar substancialmente menos tokens do que
grepmais leituras de arquivos, essas economias não se traduziram consistentemente em menor uso de tokens em fluxos de trabalho realistas e de longa duração com agentes.Os resultados dos benchmarks e suas limitações estão preservados em
benchmarks/, incluindo o benchmark de agente de ponta a ponta.
Kivgraph é um servidor MCP local de inteligência de código entre repositórios para agentes de codificação de IA. Ele constrói um grafo de código semântico canônico em vários repositórios registrados e responde perguntas sobre símbolos, relacionamentos entre repositórios, chamadores, dependências e impacto de mudanças.
Assista ao vídeo de demonstração da interface do Kivgraph
kivgraph ui — visualização 3D somente leitura do grafo publicado.
Ele indexa um corpus uma vez e serve um grafo imutável: as arestas são resolvidas
por go/types, o verificador TypeScript e rust-analyzer, não por
correspondência de nomes. Essa é a diferença de uma ferramenta de busca, e é o
que torna uma resposta vazia algo valioso — uma lista de referências vazia
significa que ninguém chama isso, não que nada foi encontrado, e
grep não consegue distinguir essas situações.
Kivgraph é focado em relacionamentos semânticos de código, não na descoberta automática de todos os fluxos de tempo de execução HTTP, gRPC, Kafka ou banco de dados entre serviços.
Documentação
Leia a documentação do usuário do Kivgraph para instalação,
clientes MCP, inteligência de código, relacionamentos entre repositórios e
grafos de código de workspace. As mesmas páginas são a fonte de landing/src/content/docs
neste checkout, que é o que um leitor em um fork ou sem rede ainda possui.
O que cada ferramenta responde
| a pergunta | a ferramenta |
|---|---|
| quem chama isso, o que referencia isso | find_references |
| quem implementa um tipo ou método | find_implementations |
| o que quebra se eu mudar isso | get_blast_radius |
| o que isso alcança para fora | trace_dependencies |
| quem usa isso de outro repositório | find_cross_repo_consumers |
| onde isso é declarado | find_symbol |
| não sei como isso se chama, quais arquivos abrir | find_by_intent |
| o que é declarado neste pacote | get_file_outline |
| me dê o código desses símbolos | get_source |
| tudo sobre este único símbolo | get_symbol |
| o que está indexado e o grafo está atualizado | list_repositories, graph_status |
| como está progredindo uma indexação assíncrona | get_index_status |
Treze ferramentas somente leitura, mais duas mutações com consentimento
(index_project e start_index_project) que um cliente precisa autorizar antes que
qualquer uma possa registrar um repositório ou publicar uma geração.
Cada linha que nomeia um símbolo carrega seu repositório, caminho, nome qualificado e intervalo de linhas, para que possa ser aberta sem uma segunda chamada, e toda ferramenta aceita essa tríade no lugar de uma chave opaca.
Onde ele perde. Um nome raro em um pequeno repositório é mais barato com
grep, e indexar um arquivo pequeno custa mais do que lê-lo. Ele vence
em nomes comuns, em impacto transitivo, em consumidores em outro repositório e
em provar uma ausência. Medido em 29 perguntas contra um corpus de 37
repositórios (benchmarks/graph-tools-comparison/results-all.json, commit 954b9eb,
tokenizador o200k_base): 35,961 tokens para Kivgraph contra
267,980 para grep mais leitura, ambos exatos em 28 das 29,
mediana de 5.95x por pergunta a favor de Kivgraph. grep é
mais barato em 5 dessas 29, todas com recall total em ambos os lados:
T1_go_trivial pede um nome que o corpus declara duas vezes, e lá
grep custa 0.53x do que Kivgraph faz.
Um segundo harness, benchmarks/mcp-token-cost, compara com a saída da própria ferramenta
do host capturada literalmente, mas roda no repositório único do próprio
Kivgraph de 13.222 símbolos: 7.64x nas próprias respostas e
1.60x em uma sessão inteira, contra um piso de 2.41x
definido pelos corpos-fonte que ambos os lados pagam.
Status
Lançado e em uso. kivgraph version reporta o lançamento publicado; o backlog e o
portão de aceitação de cada fase estão em TASKS.md.
- Linguagens: Go, TypeScript, Rust, Python e Dart. Python usa o
worker AST empacotado em modo de fallback; essas referências inferidas são
CANDIDATE, nuncaEXACT. O modo Python exato usa o adaptador LSP Pyright empacotado com um servidor Pyright/BasedPyright instalado. Dart usa o Dart Analysis Server fornecido pelo SDK Dart ou Flutter. - Dependências semânticas: imports Python e Dart podem publicar uma dependência de pacote quando exatamente um provedor registrado possui o pacote solicitado; arestas entre repositórios no nível de símbolo exigem uma identidade de provedor explícita.
- Superfície: treze ferramentas somente leitura via STDIO, mais duas
mutações com consentimento (
index_projectestart_index_project). O contrato está em docs/protocol/mcp-surface-v3.md. - Armazenamento: LadybugDB é canônico; consultas são servidas de um HotSnapshot imutável publicado atomicamente, nunca do banco de dados.
- Plataformas:
linux/amd64,darwin/arm64ewindows/amd64. - Visualizador:
kivgraph uiserve uma visualização 3D somente leitura do grafo publicado.
Instalação
Instale o MCP com um script
O instalador detecta a plataforma, baixa o lançamento MCP publicado mais recente
para ela, verifica tanto o arquivo de lançamento quanto as somas de verificação
do pacote e o instala sem exigir Go ou pnpm. O lançamento contém o servidor Go,
a biblioteca LadybugDB fixada, o worker TypeScript, o worker Python AST
empacotado, o rust-analyzer fixado, o manifesto de gramática e o visualizador
web, cujos ativos são 2,3 MB do pacote. scripts/build-bundle.sh --mcp-only produz um pacote sem o
visualizador para quem quiser. --slim vai além para quem empacota um
.mcpb: ele deixa de fora o rust-analyzer fixado e todo símbolo que
um depurador leria, o que é 46,3 MB empacotados contra 24,9 MB. Ele não baixa
nada depois, então esse pacote lê Rust somente onde a máquina já tem um
analisador em seu PATH.
Pacotes publicados: Linux amd64, macOS arm64 e Windows
amd64.
Requisitos de tempo de execução: Bash no Linux e macOS ou PowerShell
5.1 ou posterior no Windows, Node.js 22 ou posterior,
Python 3.10 ou posterior ao indexar Python e, nas plataformas POSIX,
curl, tar e sha256sum ou shasum. O pacote
carrega seu próprio rust-analyzer; indexar repositórios Rust adicionalmente
precisa de cargo no PATH, e indexar Dart precisa do SDK
Dart ou Flutter. No Windows, o instalador também instala o redistribuível Visual
C++, sem o qual kivgraph.exe não inicia.
No macOS, os binários não são notarizados. Um lançamento baixado com
curl não é colocado em quarentena e executa; uma cópia baixada com
um navegador precisa de xattr -dr com.apple.quarantine. Veja
docs/development/macos.md.
Instale o lançamento mais recente em um comando. No Linux e macOS, a mesma linha
cobre ambos, porque o instalador lê uname e escolhe seu próprio
arquivo:
curl -fsSL https://kivgraph.dev/install.sh | bash
No Windows, onde install.sh não pode executar porque não há shell POSIX:
irm https://kivgraph.dev/install.ps1 | iex
install.ps1 é uma segunda implementação das mesmas verificações de
pré-extração, e internal/release/install_parity_test.go falha quando qualquer script ganha uma
verificação que o outro não tem. Canalizá-lo para Invoke-Expression transforma
seu #Requires -Version 5.1 em um comentário; baixe-o para um arquivo e execute-o como
um para manter essa proteção.
A partir de um checkout, qualquer instalador pode ser executado diretamente:
./scripts/install.sh
Para instalar um lançamento específico em vez do mais recente:
KIVGRAPH_VERSION=v0.9.10 ./scripts/install.sh
O script instala o pacote em ~/.local/opt/kivgraph e coloca lançadores em
~/.local/bin; no Windows é %LOCALAPPDATA%\Programs\kivgraph e %LOCALAPPDATA%\Programs\kivgraph-bin. Ele nunca
modifica um repositório registrado, cria um índice ou substitui arquivos de
configuração. Para usar um local diferente, defina KIVGRAPH_INSTALL_ROOT e
KIVGRAPH_BIN_DIR.
Adicione o diretório de lançadores ao shell atual e verifique ambos os tempos de execução:
export PATH="$HOME/.local/bin:$PATH"
kivgraph version
kivgraph-ts-worker <<'EOF'
hello
EOF
Verifique se há um lançamento mais recente ou atualize o pacote instalado:
kivgraph update --check
kivgraph update
A substituição do pacote é atômica, preserva a configuração e o estado do grafo,
verifica as somas de verificação do lançamento e do pacote e substitui o pacote
instalado. A atualização de tempo de execução pós-instalação pode concluir
parcialmente, falhar e fazer o comando sair com código não zero. Ela também
reinicia um daemon supervisionado instalado e atualiza hooks de usuário,
habilidades e registros MCP gerenciados pelo Kivgraph. Um supervisor obsoleto
retorna um erro e não é reiniciado. Integrações ausentes, estrangeiras e com
escopo de projeto são deixadas em paz. Processos serve e
ui de propriedade do cliente ainda precisam de uma reinicialização,
ou --stop, para usar o novo binário.
Builds de desenvolvimento usam um canal de pré-lançamento separado. Instale um explicitamente e selecione esse canal para verificações posteriores:
release=vX.Y.Z-dev.N
curl -fsSL \
"https://github.com/Luqueee/kivgraph/releases/download/$release/install.sh" |
KIVGRAPH_VERSION="$release" bash
kivgraph update --channel dev
Para um binário de pré-lançamento, omitir --channel já segue
dev; instalações estáveis continuam seguindo o canal estável.
KIVGRAPH_UPDATE_CHANNEL pode ser usado em vez da flag, inclusive para o aviso de
atualização interativo.
Para remover o pacote instalado e os lançadores sem excluir configuração, registros de repositório ou estado do grafo:
uninstall_url=https://github.com/Luqueee/kivgraph/releases/latest/download/uninstall.sh
curl -fsSL "$uninstall_url" -o /tmp/kivgraph-uninstall.sh
bash /tmp/kivgraph-uninstall.sh
Use bash /tmp/kivgraph-uninstall.sh --yes para uma remoção não interativa.
Usuários do Windows podem executar o uninstall.ps1 correspondente com
PowerShell.
Quando kivgraph é invocado sem um comando de um terminal interativo, ele
verifica se há um lançamento mais recente com um tempo limite de 800 ms e um
cache de 24 horas no diretório de cache da plataforma ($XDG_CACHE_HOME no
Linux e $HOME/Library/Caches no macOS), sob kivgraph/update-check.json. A verificação opcional
nunca bloqueia o comando quando a rede está indisponível.
A saída de comando interativa usa cores ANSI semânticas quando o destino é um
terminal. Defina NO_COLOR ou redirecione a saída para mantê-la simples.
Configure o Kivgraph e seus agentes de codificação
Após uma instalação de lançamento interativa, o instalador pergunta se deve executar esta mesma configuração guiada. Execute-a depois ou diretamente de um checkout:
kivgraph configure
configure abre um seletor para os agentes de codificação detectados nesta
máquina e instala cada superfície com escopo de usuário que o agente selecionado
suporta. Ele também adiciona instruções do Kivgraph no nível de usuário para
cada agente selecionado. Ele inicializa a configuração vazia do Kivgraph quando
necessário, mas não registra um repositório nem executa um índice. Repita
--target TARGET para configuração por script; omita-o para abrir o seletor.
Use ↑/↓ (ou j/k)
para mover, space para alternar um agente, a para
selecionar todos, n para selecionar nenhum, Enter para
confirmar e q ou Esc para cancelar. O daemon é
oferecido uma vez após a seleção; --daemon o exige sem perguntar e
--stdio mantém um processo serve por cliente.
--dry-run pré-visualiza cada superfície sem gravar.
Os alvos MCP suportados são claude-code, claude-desktop, codex, opencode,
e oh-my-pi. Os alvos de habilidade suportados são claude-code, codex, opencode,
e oh-my-pi; o Claude Desktop não possui alvo de habilidade local. Os comandos
autônomos usam user por padrão; use --scope project para configuração
local do projeto. Use --dry-run para inspecionar um plano sem gravar. Entradas
incompatíveis existentes param com um erro; --force é necessário para substituir ou
remover uma. Os arquivos existentes são gravados atomicamente com o modo 0600 e recebem
um backup *.kivgraph.bak antes da substituição ou remoção.
O portão de pré-uso de ferramenta suporta claude-code, claude-desktop, codex,
opencode e oh-my-pi. O Oh My Pi recebe uma extensão nativa sob
~/.omp/agent/extensions/ para o escopo do usuário ou .omp/extensions/ para o escopo do
projeto. O portão é de abertura automática quando sua consulta de grafo não pode ser respondida.
Pesquisas encapsuladas como rtk rg ... ou rtk proxy rg ... são classificadas pelo seu
comando interno, enquanto os comandos próprios do RTK são deixados intactos.
Adicionar Kivgraph às instruções do agente do usuário
Adicione as regras de navegação do Kivgraph ao contexto do usuário carregado por um agente de codificação:
kivgraph instructions install
# The selector can install one or more coding-agent destinations.
kivgraph instructions install --agent codex
kivgraph instructions install --agent claude
kivgraph instructions install --agent omp
Sem --agent ou --file, o seletor interativo permite que você escolha um ou
mais agentes de codificação. Cada instalação possui um prompt KIVGRAPH.md ao lado da
configuração do cliente. Codex (~/.codex/AGENTS.md), Claude Code/Desktop
(~/.claude/CLAUDE.md) e Oh My Pi (~/.omp/agent/AGENTS.md) recebem apenas uma
pequena referência de caminho absoluto gerenciada para KIVGRAPH.md. O OpenCode, em vez disso, adiciona
seu caminho canônico à lista nativa instructions de ~/.config/opencode/opencode.json; ele
não modifica o AGENTS.md do OpenCode. O seletor deduplica destinos
compartilhados. As instruções existentes são preservadas, a referência gerenciada é
idempotente e --dry-run visualiza a alteração. Um prompt ou referência do Kivgraph editado
requer --force para substituir. --file é mantido para compatibilidade
e seleciona todos os clientes globais correspondentes; prefira --agent para novas automações.
O comando nunca altera as instruções do repositório. Use configure quando você
quiser essas instruções e as integrações de cliente compatíveis em um único fluxo; os
comandos individuais permanecem disponíveis para alterações explícitas.
Quando definido, CODEX_HOME substitui ~/.codex e PI_CODING_AGENT_DIR substitui
~/.omp/agent, correspondendo às raízes de configuração que esses clientes usam.
Inspecione ou remova um registro explicitamente:
kivgraph mcp status --target claude-code --scope user
kivgraph mcp remove --target claude-code --scope user
kivgraph skill status --target claude-code --scope user
kivgraph skill remove --target claude-code --scope user
kivgraph hook status --target claude-code --scope user
kivgraph hook remove --target claude-code --scope user
Inicialize e publique um grafo antes de iniciar o servidor MCP:
kivgraph init \
--repository project=/absolute/path/to/project \
--languages go,typescript,rust
kivgraph doctor
kivgraph index --full
init grava uma configuração autocontida: com --config apontando
para outro lugar, seu estado, cache e registro dependem desse diretório, então um índice
descartável nunca toca o real. index --full republica atomicamente — uma
falha em qualquer estágio deixa a geração anterior em serviço. Um servidor já
em execução segue a nova geração por conta própria.
Quando você está dentro de um projeto, kivgraph index detecta suas linguagens
suportadas, cria ou reutiliza .kivgraph/, registra o projeto atual como
project em seu registro local e executa a mesma reconstrução completa. Sem
--config nem --repositories, ele não altera o registro de usuário compartilhado;
essas substituições selecionam intencionalmente a configuração e o registro a serem atualizados.
Use kivgraph index --full quando você quiser o fluxo de trabalho explícito de repositórios
registrados; ambas as formas preservam o contrato de indexação completa.
O comando não instala toolchains de linguagem implicitamente; kivgraph doctor
relata qualquer pré-requisito ausente no host. Analisadores opcionais podem ser
gerenciados explicitamente pelo Kivgraph:
kivgraph toolchain status
kivgraph toolchain install pyright
kivgraph index --full
toolchain install pyright fixa e instala o Pyright sob o estado do Kivgraph,
então ativa a análise exata de Python na configuração selecionada. Para uma
configuração local do projeto, passe --config .kivgraph/config.yaml. Removê-lo
requer uma confirmação explícita e restaura o fallback de Python empacotado
quando a configuração selecionada usa o analisador gerenciado:
kivgraph toolchain remove pyright --yes
A primeira instalação requer npm e acesso à rede. Verificações de status posteriores e a reutilização de uma versão instalada funcionam offline.
A família de comandos é intencionalmente agnóstica em relação à linguagem; mais analisadores
gerenciados podem usá-la sem fazer index mutar o host ou um repositório.
No dia a dia:
kivgraph graph status # what is published, and whether a tree has moved
kivgraph doctor # toolchains, storage, and the type-checking ceiling
kivgraph ui # read-only 3D viewer, default 0.0.0.0:7777
kivgraph logs --follow # aligned history of what it indexed, served and queried
kivgraph tool-stats # per-tool cost, calls, and failures
kivgraph stop # terminate this user's serve and ui, never an index
kivgraph clean --keep-active
kivgraph ui vincula um endereço não-loopback por padrão, porque o grafo é
indexado onde os repositórios estão e visualizado de outro lugar; não há
autenticação, então ele registra exatamente o que expõe e --addr o restringe.
logs e tool-stats leem um registro somente de acréscimo no diretório de estado
em vez de perguntar a um servidor, que é por que eles podem responder de qualquer forma: os
contadores por ferramenta que um serve mantém são cunhados quando ele inicia e desaparecem quando ele para.
Ler o arquivo também faz a resposta abranger todos os servidores que já rodaram.
logs renderiza uma tabela de colunas fixas. As linhas de ferramenta incluem um resumo de consulta limitado e na lista de permissões:
find_by_intent registra seu intent exato e qualquer keywords,
enquanto cursores opacos, sinalizadores de consentimento, chaves estáveis e caminhos absolutos de projeto
ficam fora do registro. --json preserva os registros individuais somente de acréscimo.
SYMBOL_NOT_FOUND é renderizado como o status neutro NOT_FOUND com zero resultados,
não como uma falha operacional.
Configure qualquer cliente MCP para iniciar o servidor via STDIO:
{
"mcpServers": {
"kivgraph": {
"command": "/home/user/.local/bin/kivgraph",
"args": [
"serve",
"--config",
"/home/user/.config/kivgraph/config.yaml"
]
}
}
}
kivgraph serve inicia antes de um grafo existir: sem uma geração publicada, ele
completa o handshake, não publica nenhuma ferramenta de consulta e coloca o comando de reconstrução em
instructions. Um cliente inicia o processo por conta própria, então sair seria lido como uma
falha. Ele grava o enquadramento MCP exclusivamente em stdout e registra em stderr.
Requisitos
- Go 1.26 ou posterior para compilar a partir do código-fonte. O indexador verifica tipos com o
go/typesvinculado ao binário, então ele só pode ler repositórios e dependências escritos para sua própria versão de linguagem ou mais antiga;kivgraph doctorrelata esse teto. - Indexar Rust requer
cargoerust-analyzer. O pacote de lançamento carrega o analisador; ele não carrega um toolchain Rust. - Indexar TypeScript requer Node.js 22 ou posterior para o worker.
- Indexar Python requer Python 3.10 ou posterior para o worker empacotado. É um fallback ciente de sintaxe e relata nomes dinâmicos ou não resolvidos explicitamente; o modo exato requer adicionalmente um servidor de linguagem compatível com Pyright.
- Indexar Dart requer o executável
dart; uma instalação Flutter o fornece. O carregador usa o protocolo Analysis Server e não modifica o projeto Flutter.
O que o grafo carrega e o que ele se recusa a carregar
Uma aresta é EXACT apenas com evidência suficiente e a proveniência correta. Ela
nunca é criada a partir de um nome, caminho, alias ou um único candidato, e uma
referência que não pode ser resolvida é publicada como UNRESOLVED com seu motivo,
repositório e linguagem em vez de ser descartada. graph_status relata ambos, detalhados.
É por isso que algumas respostas são ausências em vez de arestas. Com a biblioteca padrão
Rust indexada, impl Add for u32 é gerado por uma macro e não existe em nenhum
intervalo de código-fonte, então cada uso dele é declarado PROVIDER_DEFINITION_NOT_INDEXED
uma vez por símbolo em vez de se tornar uma aresta que ninguém poderia abrir.
Os provedores que o Kivgraph deriva da máquina — hoje a biblioteca padrão
Rust, nomeada rust:1.96.1 após o toolchain — são retidos dos resultados de leitura
por padrão: um toolchain tem cerca de vinte mil símbolos, e uma
busca por Clone responderia com core. include_derived os solicita, e
graph_status detalha o que eles contribuem para que os totais permaneçam legíveis.
Desenvolvimento
make build
make test
make semantic-coverage
make test-ladybug
make test-ladybug é a única maneira suportada de executar a tag que vincula a
biblioteca nativa fixada. As convenções de contribuição estão em
AGENTS.md, que CLAUDE.md vincula.
make semantic-coverage é o portão de lançamento para Go, TypeScript, Python e
Dart. Ele valida a matriz legível por máquina em
testdata/semantic-coverage/manifest.json, executa as suítes exatas de TypeScript, Go e
Dart, e requer um servidor de linguagem compatível com Pyright para a suíte
exata de Python. Uma linguagem não é considerada completa quando uma capacidade tem um
fixture, mas nenhum teste de regressão executável.
Benchmarks de armazenamento e grafo
A qualificação LadybugDB, o gerador de corpus sintético, os benchmarks de carga e consulta,
e os comandos doctor, rebuild, rollback e snapshot são
documentados em
docs/development/storage-benchmarks.md.
Ele conclui com ACCEPT_LADYBUGDB_WITH_LIMITS.
O site público
landing/ carrega a página inicial e a documentação do usuário. Ele não é enviado em nenhum
pacote de lançamento, é verificado com make landing-check e make landing-build,
e é servido na porta 6767. O que ele publica, como a referência MCP foi
capturada e o que ainda está aberto são registrados em
docs/development/landing-site.md.
Estrutura
cmd/kivgraph/ Main executable.
internal/ Kivgraph internal packages.
ts-worker/ TypeScript worker.
web/ Graph viewer served by `kivgraph ui`.
landing/ Landing page and documentation site (not part of any release).
testdata/ Test fixtures and corpora.
benchmarks/ Benchmark results.
docs/ Documentation and ADRs.
scripts/ Auxiliary automation.
Licença
O Kivgraph é distribuído sob a Apache License 2.0.
Licenças de terceiros
Avisos e licenças para dependências distribuídas com o Kivgraph são registrados em THIRD_PARTY_NOTICES.md. A lista é atualizada sempre que uma dependência é adicionada ao produto distribuível.
