S.IASETUP.IA/kx
Open source · MIT v1.2.0 MCP server + CLI

O contexto do seu projeto, a 7 milissegundos do agente.

kx indexa documentação, código, configuração e notas num SQLite local e serve busca híbrida — semântica + BM25, fundidas por RRF, com impulso de recência e deduplicação. Sem cloud, sem API key, sem telemetria.

Funciona com Claude CodeCodexCursorqualquer cliente MCP
$ kx search "circuit-open" --top 4

[0.0399] .vault/decisions/2026-08-resiliencia.md [vault|ambas]
  Decisão: abrir o circuito após 5 falhas em 30s…
---
[0.0382] docs/runbooks/circuit-open.md [docs|ambas]
  Quando o alerta circuit-open disparar, verifique…
---
[0.0322] docs/resiliencia/visao-geral.md [docs|ambas]
  Retry, timeout e circuit breaker trabalham juntos…
---
[0.0210] src/resilience/CircuitBreakerConfig.ts [code|lexical]
  export const STATE_OPEN = 'circuit-open';

4 resultado(s) encontrado(s).
Projeto e resultados fictíciosformato real do CLI
descer

01 · O problema

Agente sem contexto adivinha. E adivinha caro.

Antes de escrever uma linha, o agente precisa saber como o projeto decide, nomeia e resolve as coisas. As saídas de sempre falham de jeitos previsíveis.

A · grep cego

Acha a string. Perde o conceito.

Busca textual devolve a linha exata, mas não sabe que “disjuntor”, “retry com backoff” e “circuit breaker” falam da mesma decisão espalhada em cinco arquivos.

→ várias listagens e leituras integrais até montar o quadro
B · CLAUDE.md gigante

Tudo no prompt, o tempo todo.

Despejar a documentação no arquivo de contexto cobra tokens em toda sessão. A Anthropic recomenda CLAUDE.md com menos de 200 linhas.

→ contexto extenso aumenta o consumo de reasoning tokens em até 20%
C · vetor puro

Entende paráfrase. Erra identificador.

Embeddings acham o conceito, mas tropeçam no que um dev mais procura: nomes de configuração, mensagens de erro, símbolos exatos.

→ em índice real de 75 mil chunks, circuit-open estava em 20 chunks e fora até do top-50 vetorial

02 · A resposta

Duas vias de busca. Um ranking.

O kx roda a via vetorial (sqlite-vec) e a via lexical (FTS5/BM25) sobre o mesmo índice e funde as duas por posição, com Reciprocal Rank Fusion. O conceito vem do vetor. O identificador exato vem do BM25. O agente recebe os dois.

Tudo roda na sua máquina: o modelo de embedding (all-MiniLM-L6-v2, ~23 MB) é baixado uma vez e depois o kx funciona 100% offline.

7mslatência p50
10mslatência p95
142/sbuscas · 8 workers

Números do README do projeto, medidos num corpus sintético de stress com o pipeline real. Variam com Node.js, sistema operacional e tamanho do índice.

03 · Anatomia de uma busca

Uma consulta, cinco decisões.

Role e acompanhe o que acontece entre a pergunta do agente e os chunks que ele recebe. As fórmulas são as do kx; o projeto e os arquivos são fictícios.

Consulta:search"circuit-open"
  1. 01 Consulta
  2. 02 Duas vias
  3. 03 RRF
  4. 04 Recência + dedup
  5. 05 Top-K

A consulta vira duas coisas ao mesmo tempo: um embedding de 384 dimensões e uma expressão MATCH com cada termo entre aspas.

Vetorial

sqlite-vec · top-200
  1. #1docs/resiliencia/visao-geral.md
  2. #2docs/resiliencia/visao-geral.mdcópiabyte-idêntico, outro repositório
  3. #3.vault/decisions/2026-08-resiliencia.md
  4. #4docs/adr/007-retry-backoff.md
  5. #5docs/runbooks/circuit-open.md
  6. —CircuitBreakerConfig.tsfora do top-50 vetorial
Reciprocal Rank Fusion · k = 60 score = 1/(60 + rankvet) + 1/(60 + rankbm25)
× recência1 + 0,3 · 2−idade/90d · teto +30%
dedupSHA-1 do conteúdo · fica a cópia mais bem colocada
  1. 1.vault/decisions/2026-08-resiliencia.mdRRF 0.0317 × 1,26 recente · ambas0.0399
  2. 2docs/runbooks/circuit-open.mdRRF 0.0315 × 1,21 · ambas0.0382
  3. 3docs/resiliencia/visao-geral.mdRRF 0.0318 × 1,01 antigo · ambas0.0322
  4. 4src/resilience/CircuitBreakerConfig.tssó o BM25 achou · lexical0.0210

Lexical

FTS5 · BM25 · top-200
  1. #1src/resilience/CircuitBreakerConfig.ts
  2. #2docs/runbooks/circuit-open.md
  3. #3.vault/decisions/2026-08-resiliencia.md
  4. #4config/resilience.yml
  5. #5docs/resiliencia/visao-geral.md
  6. …remove_diacritics 2“configuracao” casa com “configuração”

RRF funde por posição, não por valor: distância de cosseno e BM25 têm escalas incomensuráveis. A recência é multiplicativa e limitada — desempata a favor do recente, mas nunca promove um resultado irrelevante só por ser novo.

Pesos por fonte no .kx.json · recência desligável por projeto

04 · Como funciona

Do arquivo salvo à resposta do agente. Tudo local.

Um binário compartilhado, uma base SQLite por projeto. O MCP server lê e escreve; o CLI só lê. WAL mode permite os dois ao mesmo tempo.

01 · FONTES

Docs, código, config, vault

Markdown, TS/Java/SQL, YAML/JSON e notas do .vault/.

chokidar · reindex <10s
02 · CHUNKING

Por header e por função

Nenhum chunk passa do orçamento seguro do modelo.

EMBED_SAFE_TOKENS = 440
03 · DUAS REPRESENTAÇÕES

Embedding + índice lexical

Transformers.js in-process, sem servidor externo.

MiniLM-L6-v2 · 384d · FTS5
04 · SQLITE POR PROJETO

Um arquivo, isolado

Fácil de copiar, mover e apagar. Nada compartilhado entre projetos.

~/.kx/data/{projeto}.sqlite
05 · ENTREGA

MCP stdio e CLI

Tool nativa no agente; terminal para você, sem chamar LLM.

kx mcp · kx search
06 · AGENTE

Contexto antes do código

Claude Code, Codex, Cursor ou qualquer cliente MCP.

search → chunks relevantes

05 · Garantias

Feito para quem opera vários projetos com agentes.

Isolamento por projeto

Cada projeto aponta para o próprio .sqlite pela .kx.json. Uma denylist global impede que paths sensíveis entrem no índice.

indexing.deny: [".vault/private/**", "**/.env*"]

100% offline

Depois do download único do modelo, nada sai da máquina. Sem cloud, sem API key, sem telemetria.

embeddings in-process · ~23 MB

Watcher incremental

O Chokidar detecta o arquivo salvo e reindexa só o que mudou. No macOS, sobe sozinho via launchd.

kx watch · incremental <10s

Vault Obsidian

Notas pessoais, reuniões e decisões ficam no .vault/ do projeto e entram na busca. Repo Git é da equipe; o vault é seu.

--type vault

Asserção MCP fail-closed

Com mcp.projectId, toda tool exige UUID e raiz do projeto. Divergência falha antes de abrir o SQLite.

KX_PROJECT_MISMATCH

Registro de artefatos

Páginas publicadas pelo agente são registradas no vault e vinculadas à atividade em que o trabalho aconteceu.

.vault/ARTEFATOS.md

06 · Tools MCP

Onze tools. Três trabalhos.

O que o agente vê quando o kx está ativo. A busca é o centro; atividades e artefatos dão memória de trabalho ao projeto.

Núcleo

Buscar e indexar

O índice e a busca híbrida.

  • searchBusca híbrida em docs, código, config e vault. Filtros por tipo e top-K.
  • ingestIndexa um arquivo ou diretório específico.
  • reindexReindexação completa ou incremental.
  • statusDocumentos, chunks e distribuição por tipo.
Activity manager

Onde paramos

Atividades em Markdown no vault.

  • megabrain_addCria uma atividade e sincroniza o índice de atividades.
  • megabrain_updateRegistra avanço, bloqueio ou conclusão no log.
  • megabrain_statusPainel das últimas atividades e onde cada uma parou.
  • megabrain_getConteúdo completo de uma atividade.
Artifacts

O que foi publicado

Links vinculados ao trabalho que os gerou.

  • megabrain_artifact_addRegistra ou versiona um artefato publicado.
  • megabrain_artifactsLista links, versão atual e atividade de origem.
  • megabrain_artifact_linkVincula um artefato já registrado a uma atividade.

Com mcp.projectId configurado, todas exigem expected_project_id e expected_project_root.

07 · Configuração

Três arquivos. Nenhuma conta.

  1. .kx.json na raiz define fontes, índice e, opcionalmente, o UUID da asserção MCP.
  2. .mcp.json (ou config.toml no Codex) registra o kx com raiz explícita.
  3. kx index gera o índice; kx watch mantém em dia.

Instalação e requisitos (Node.js 22+) no README do repositório.

{
  "mcpServers": {
    "kx": {
      "command": "kx",
      "args": ["mcp", "--strict-project-root",
               "--project-root", "/caminho/absoluto/do/projeto"]
    }
  }
}
Exemplos — ajuste caminhos e nomes para o seu projeto.

08 · Quando usar

kx não substitui o rg. Complementa.

Recuperar alguns chunks relevantes costuma evitar listagens, buscas amplas e leituras integrais. O ganho depende da qualidade do índice e da consulta — e há casos em que outra ferramenta é melhor.

Use kx para

  • Conceitos espalhados entre arquivos: arquitetura, decisões, fluxos, regras.
  • Impacto provável de uma mudança antes de implementar.
  • Contexto para code review e para responder sobre o projeto.
  • Consultas rápidas no terminal durante uma reunião, sem LLM.

Use rg ou AST para

  • Símbolo exato quando você já sabe o nome.
  • Path conhecido.
  • Precisão de linha e refatoração mecânica.

Limites honestos

  • Não é cofre de segredos: credenciais ficam fora do índice via denylist.
  • Cada processo MCP carrega o modelo após a primeira busca (~380 MB de RAM); muitas sessões simultâneas somam.
  • Prefira top-K entre 3 e 5; aumente só se faltar contexto.
DesenvolvedoresTech leadsQuem opera vários projetos com agentes

Se o kx poupou um grep cego, deixe uma estrela.

É open source, roda na sua máquina e cresce com quem usa. A estrela ajuda outras pessoas a encontrarem o projeto.

MIT© 2026 distuv1.2.0Node.js 22+