Local RAG

Servidor RAG local com foco em privacidade para busca semântica de documentos sem APIs externas

Documentação

MCP Local RAG: Search below the surface.

MCP Local RAG

GitHub stars npm version License: MIT MCP Registry

Pesquise documentos privados a partir de um cliente MCP ou do terminal sem enviá-los a uma API de embedding.

O mcp-local-rag indexa arquivos PDF, DOCX, Markdown e texto na sua máquina. A busca combina similaridade semântica com correspondência de palavras-chave, para que as consultas possam corresponder tanto à intenção quanto a termos técnicos exatos, como nomes de APIs, nomes de classes e códigos de erro.

Recursos

  • Execução local: análise de documentos, embeddings, armazenamento e busca são executados na sua máquina. Após o download inicial do modelo, a ingestão de texto e a busca funcionam offline.
  • Busca híbrida: a recuperação semântica encontra conceitos relacionados, enquanto a correspondência de palavras-chave reforça termos técnicos exatos.
  • Fragmentação semântica: os documentos são divididos em limites de tópico, em vez de contagens fixas de caracteres. Blocos de código Markdown permanecem intactos.
  • MCP e CLI: use o mesmo índice a partir de uma ferramenta de codificação com IA ou diretamente do terminal.

Nenhuma chave de API, Docker, Python ou banco de dados externo é necessário.

Início Rápido

Requisitos

  • Node.js 22 ou posterior
  • Acesso à internet no primeiro uso para baixar o pacote npm e o modelo de embedding
  • Um diretório contendo os documentos que você deseja pesquisar

Defina BASE_DIR para esse diretório. Ele também é o limite de segurança para operações de arquivo. Substitua /absolute/path/to/your/documents abaixo pelo caminho absoluto do diretório.

O mcp-local-rag usa o protocolo MCP padrão por meio de um servidor stdio local, portanto funciona com ferramentas de codificação com IA e outros hosts MCP que suportam servidores MCP locais.

Use um dos exemplos abaixo ou registre npx -y mcp-local-rag e defina BASE_DIR usando o formato de configuração MCP do seu cliente.

Para Claude Code: Execute este comando:

claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag

Para Codex: Adicione a ~/.codex/config.toml:

[mcp_servers.local-rag]
command = "npx"
args = ["-y", "mcp-local-rag"]

[mcp_servers.local-rag.env]
BASE_DIR = "/absolute/path/to/your/documents"

Para OpenCode: Adicione a ~/.config/opencode/opencode.json (ou opencode.jsonc):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "local-rag": {
      "type": "local",
      "command": ["npx", "-y", "mcp-local-rag"],
      "environment": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

Para Cursor: Adicione a ~/.cursor/mcp.json:

{
  "mcpServers": {
    "local-rag": {
      "command": "npx",
      "args": ["-y", "mcp-local-rag"],
      "env": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

Reinicie o cliente e peça a ele para construir o índice:

Sync all documents in the configured root and wait until it finishes.

A primeira sincronização baixa o modelo de embedding padrão (cerca de 90 MB) e pode levar de 1 a 2 minutos antes que a ingestão comece. Execuções posteriores usam o cache local.

Quando a sincronização for concluída:

What does the API documentation say about authentication?

Início Rápido com CLI

Para usar a CLI sem um cliente MCP:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag query "authentication API"

A CLI usa o diretório atual como raiz de documentos por padrão. Execute ambos os comandos no mesmo diretório para que usem o mesmo índice padrão, ou defina BASE_DIR e DB_PATH explicitamente.

Por Que Isso Existe

Alguns conjuntos de documentos não podem ser enviados a um serviço de embedding hospedado por questões de confidencialidade ou política organizacional. Manter o índice local torna esses documentos pesquisáveis sem adicionar um custo de API por consulta.

A busca semântica sozinha pode perder identificadores exatos que são importantes na documentação técnica. A reclassificação por palavras-chave mantém esses termos visíveis sem abrir mão da recuperação em linguagem natural.

Conteúdo Suportado

EntradaComo ingerir
PDF, DOCX, TXT, MarkdownIngestão de arquivo ou sincronização de diretório
HTML já obtido pelo clienteingest_data; limpo com Readability e convertido para Markdown
Texto simples ou Markdown mantido em memóriaingest_data com um identificador de origem estável

A obtenção de HTML não está integrada ao servidor. Um cliente MCP pode obter uma página e passar seu HTML para ingest_data.

Excel, PowerPoint, imagens avulsas e extensões de arquivos de código-fonte não são suportados pela ingestão de arquivos. PDFs podem opcionalmente usar um modelo de visão local para descrever figuras, mas isso não é OCR nem busca de imagens.

Ferramentas MCP

FerramentaFinalidade
sync_startReconciliar o índice com todas as raízes configuradas ou um caminho
sync_statusConsultar um trabalho de sincronização em execução
ingest_fileIngerir ou substituir um arquivo
ingest_dataIngerir texto, Markdown ou HTML já mantido pelo cliente
query_documentsBuscar com correspondência semântica e reforço de palavras-chave
read_chunk_neighborsLer fragmentos ao redor de um resultado de busca
list_filesMostrar arquivos suportados e seu estado de ingestão
delete_fileExcluir um arquivo indexado ou um item ingest_data
statusMostrar status do índice e da busca

Sincronizando uma Raiz de Documentos

sync_start ingere arquivos novos e alterados, ignora arquivos idênticos em bytes e remove entradas de índice para arquivos que não existem mais:

Sync everything under the configured document roots and wait for completion.

A ferramenta retorna um jobId imediatamente. Os clientes devem consultar sync_status até que seu estado se torne succeeded ou failed. Não há modo visual durante a sincronização; PDFs alterados são ingeridos como texto.

Apenas um trabalho de sincronização é retido pelo processo do servidor. Um trabalho mais recente substitui um registro concluído, e reiniciar o servidor o descarta.

Ingerindo um Arquivo

ingest_file aceita PDF, DOCX, TXT e Markdown. Os caminhos de arquivo MCP devem ser absolutos e permanecer dentro de uma raiz de documentos configurada:

Ingest the document at /Users/me/docs/api-spec.pdf.

Reingerir o mesmo caminho substitui seus fragmentos existentes.

Buscando e Lendo Mais Contexto

What does the API documentation say about authentication?
Find the documented behavior of ERR_CONNECTION_REFUSED.

Os resultados contêm o texto, o caminho de origem, o título, o índice do fragmento e a pontuação de relevância. Passe o chunkIndex e o filePath ou o source de um resultado para read_chunk_neighbors quando a resposta precisar de mais contexto:

Read the surrounding chunks for that authentication result.

Tanto query_documents quanto list_files aceitam um prefixo de caminho scope absoluto opcional, ou uma lista de prefixos. Um prefixo corresponde ao caminho exato e aos seus descendentes.

Ingerindo HTML

Use ingest_data depois que o cliente MCP obtiver uma página:

Fetch https://example.com/docs and ingest the HTML.

O servidor extrai o artigo principal, converte-o para Markdown e o armazena sob o identificador de origem fornecido. Reutilizar a mesma origem atualiza o conteúdo existente.

Respeite os termos e os direitos autorais do site de origem ao indexar conteúdo externo.

Figuras em PDF

O modo visual adiciona uma legenda gerada para páginas de PDF com muitas figuras. Ele é opcional e não carrega um modelo de visão durante a ingestão normal.

Ingest /Users/me/docs/research-paper.pdf with visual: true.
npx mcp-local-rag ingest ./docs/research-paper.pdf --visual
PerfilCache do modeloCaso de uso
fast (padrão)cerca de 250 MBIndexação visual leve
qualitycerca de 2,9 GBFiguras contendo rótulos, anotações ou outro texto dentro da imagem

Selecione o modelo maior com visualQuality: "quality" via MCP ou --visual-quality quality via CLI. A inferência medida em CPU foi cerca de duas vezes mais lenta que fast, embora os resultados dependam do hardware e das atualizações do modelo.

As legendas são texto auxiliar, não transcrições fiéis. Trate legendas recuperadas e texto de documentos como entrada não confiável, e não como instruções.

CLI

A CLI usa o mesmo analisador, embedder e armazenamento vetorial sem um cliente MCP:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag sync ./docs/
npx mcp-local-rag query "authentication API"
npx mcp-local-rag query "auth" --scope /docs/api --scope /docs/guide
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
npx mcp-local-rag list
npx mcp-local-rag status
npx mcp-local-rag delete ./docs/old.pdf
npx mcp-local-rag delete --source "https://example.com/docs"

Opções globais como --db-path, --cache-dir e --model-name vão antes do subcomando. As opções do subcomando vão depois dele:

npx mcp-local-rag --db-path ./my-db query "authentication"

Execute npx mcp-local-rag --help para a referência completa de comandos.

A CLI não lê a configuração do cliente MCP. Defina as mesmas variáveis de ambiente ou flags se ambas as interfaces devem compartilhar um índice. Em particular, MODEL_NAME e a --model-name da CLI devem corresponder para um banco de dados compartilhado.

Ajuste de Busca

O reforço de palavras-chave está habilitado por padrão. O agrupamento por lacuna de relevância e os filtros de distância e de arquivo são controles opcionais para corpora que precisam de uma seleção de resultados mais restrita.

VariávelPadrãoDescrição
RAG_HYBRID_WEIGHT0.6Fator de reforço de palavras-chave (0,0–1,0). 0 desativa a reclassificação por palavras-chave; 1 aplica o reforço máximo.
RAG_GROUPING(não definido)similar mantém o primeiro grupo de relevância; related mantém até dois, usando lacunas significativas de distância vetorial como limites.
RAG_MAX_DISTANCE(não definido)Filtrar resultados de baixa relevância (por exemplo, 0.5).
RAG_MAX_FILES(não definido)Limitar resultados aos N principais arquivos (por exemplo, 1 para o melhor arquivo único).

Para especificações de API e outros documentos que contêm muitos identificadores, um peso de palavra-chave mais forte pode melhorar a classificação por termos exatos:

"env": {
  "RAG_HYBRID_WEIGHT": "0.7"
}
  • 0.7: reclassificação por termos exatos ligeiramente mais forte que o padrão
  • 1.0: reforço máximo de palavras-chave

Como Funciona

Durante a ingestão:

  1. O analisador extrai texto para o formato de entrada.
  2. O fragmentador semântico encontra limites de tópico e preserva blocos de código Markdown.
  3. O Transformers.js cria embeddings localmente.
  4. O LanceDB armazena os fragmentos, metadados, vetores e o índice de texto completo.

Durante a busca:

  1. A consulta é incorporada com o mesmo modelo.
  2. A busca vetorial recupera fragmentos semanticamente relacionados.
  3. Filtros opcionais de distância e de grupo de relevância restringem os candidatos quando configurados.
  4. Correspondências de texto completo reforçam os termos exatos da consulta.

Habilidades do Agente

Agent Skills fornecem orientação de consulta e ingestão para assistentes de IA:

npx mcp-local-rag skills install --claude-code
npx mcp-local-rag skills install --claude-code --global
npx mcp-local-rag skills install --codex

As habilidades instaladas cobrem formulação de consultas, refinamento de resultados e ingestão de HTML. Peça ao assistente para usar a habilidade mcp-local-rag explicitamente se ela não ativar automaticamente.

Configuração

O servidor MCP lê variáveis de ambiente. A CLI aceita as mesmas variáveis mais as flags listadas, com as flags da CLI tendo precedência.

Variável de AmbienteFlag da CLIPadrãoDescrição
BASE_DIR--base-dirDiretório atualUma raiz de documentos; a flag da CLI é repetível em ingest, list e sync
BASE_DIRSN/A(não definido)Array JSON de raízes de documentos; tem precedência sobre BASE_DIR
DB_PATH--db-path./lancedb/Localização do banco de dados vetorial
CACHE_DIR--cache-dir./models/Diretório de cache do modelo
MODEL_NAME--model-nameXenova/all-MiniLM-L6-v2Modelo de embedding Hugging Face
MAX_FILE_SIZE--max-file-size104857600 (100MB)Tamanho máximo de arquivo em bytes
CHUNK_MIN_LENGTH--chunk-min-length50Comprimento mínimo do fragmento em caracteres (1–10000)
RAG_DEVICEN/AcpuDispositivo de execução do ONNX Runtime
RAG_DTYPEN/Afp32Tipo de dados (dtype) de embedding fornecido pelo modelo selecionado

Raízes de Documentos (BASE_DIR e BASE_DIRS)

O mcp-local-rag só permite operações de arquivo dentro das raízes configuradas. Para múltiplas raízes, BASE_DIRS deve ser um array JSON de caminhos não vazios:

export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'

A configuração de raízes é resolvida nesta ordem:

  1. Flags --base-dir <path> da CLI (repetíveis em ingest, list e sync)
  2. BASE_DIRS
  3. BASE_DIR
  4. Diretório atual

Cada fonte substitui a fonte de prioridade mais baixa em vez de se mesclar com ela. Uma configuração BASE_DIRS inválida falha em vez de recorrer a BASE_DIR ou ao diretório atual. status permanece disponível no MCP para que o cliente possa relatar o erro de configuração.

npx mcp-local-rag ingest --base-dir /Users/me/work --base-dir /Users/me/specs /Users/me/work/readme.md
npx mcp-local-rag list --base-dir /Users/me/work --base-dir /Users/me/specs
npx mcp-local-rag sync --base-dir /Users/me/work --base-dir /Users/me/specs
BASE_DIRS='["/Users/me/work","/Users/me/specs"]' npx mcp-local-rag list

Armazenamento e Modelos

DB_PATH e CACHE_DIR são relativos ao diretório de trabalho do processo por padrão. Defina caminhos absolutos quando o cliente MCP puder iniciar o servidor a partir de diretórios de projeto diferentes.

Alterar MODEL_NAME, RAG_DEVICE ou RAG_DTYPE pode tornar os vetores existentes incompatíveis. Use um novo DB_PATH ou exclua o índice existente e reingira após alterar a configuração de embedding.

Exemplos de modelos:

  • Documentos multilíngues: onnx-community/embeddinggemma-300m-ONNX
  • Artigos científicos: sentence-transformers/allenai-specter

Segurança e Operação

  • O acesso a arquivos é restrito às raízes BASE_DIR, BASE_DIRS ou --base-dir da CLI.
  • Links simbólicos que resolvem para fora de toda raiz configurada são rejeitados.
  • O processamento de documentos e a busca não fazem solicitações de rede após os modelos necessários serem armazenados em cache.
  • O servidor foi projetado para um único usuário local e não fornece autenticação ou controle de acesso.
  • Não execute vários gravadores CLI ou MCP contra o mesmo DB_PATH. Consultas somente leitura podem ser executadas enquanto uma sincronização está ativa.
  • Faça backup de um índice copiando seu diretório DB_PATH enquanto nenhum gravador estiver ativo.
Solução de problemas

"Nenhum resultado encontrado"

Os documentos devem ser carregados primeiro. Execute "List all ingested files" para verificar.

Falha no download do modelo

Verifique a conexão com a internet. Se estiver atrás de um proxy, configure as configurações de rede. O modelo também pode ser baixado manualmente.

"Arquivo muito grande"

O limite padrão é 100MB. Divida arquivos grandes ou aumente MAX_FILE_SIZE.

Consultas lentas

Verifique a contagem de chunks com status. Documentos grandes com muitos chunks podem tornar as consultas lentas. Considere dividir arquivos muito grandes.

"Caminho fora de BASE_DIR"

Garanta que os caminhos de arquivo estejam dentro de uma das raízes configuradas (BASE_DIR, qualquer entrada de BASE_DIRS ou qualquer --base-dir da CLI). Use caminhos absolutos.

"BASE_DIRS deve ser um array JSON..."

BASE_DIRS aceita um array JSON de uma ou mais strings de caminho não vazias:

  • Válido: BASE_DIRS='["/Users/me/work","/Users/me/specs"]'
  • Inválido: BASE_DIRS=/a:/b (sintaxe de delimitador não suportada)
  • Inválido: BASE_DIRS='[]' (array vazio)

O cliente MCP não vê as ferramentas

  1. Verifique a sintaxe do arquivo de configuração
  2. Reinicie o cliente completamente (Cmd+Q no Mac para Cursor)
  3. Teste diretamente: npx mcp-local-rag deve ser executado sem erros

Contribuindo

Contribuições são bem-vindas! Veja CONTRIBUTING.md para configuração e diretrizes.

Licença

Licença MIT. Gratuita para uso pessoal e comercial.

Postagens do Blog

Agradecimentos

Construído com Model Context Protocol da Anthropic, LanceDB e Transformers.js.