Local RAG

Servidor RAG local con prioridad en la privacidad para búsqueda semántica de documentos sin APIs externas.

Documentación

MCP Local RAG: Search below the surface.

MCP Local RAG

GitHub
stars npm
version License:
MIT MCP
Registry

English | 简体中文 | Deutsch | Español | Português (Brasil) | Français

Busca documentos privados desde un cliente MCP o la terminal sin enviarlos a una API de incrustación (embeddings).

mcp-local-rag indexa archivos PDF, DOCX, Markdown y texto en tu máquina. La búsqueda combina similitud semántica con coincidencia de palabras clave, de modo que las consultas pueden coincidir tanto con la intención como con términos técnicos exactos, como nombres de API, nombres de clases y códigos de error. Los resultados incluyen pasajes de origen y, cuando están disponibles, encabezados, números de línea o números de página para que puedas verificar y citar el documento original.

No se requiere clave de API, Docker, Python ni base de datos externa. Después de la descarga inicial del modelo, la ingesta de texto y la búsqueda funcionan sin conexión.

Inicio rápido

Requisitos

  • Node.js 22 o posterior
  • Acceso a Internet en el primer uso para descargar el paquete npm y el modelo de incrustación
  • Un directorio que contenga los documentos que deseas buscar

Establece BASE_DIR en ese directorio. También es el límite de seguridad para las operaciones de archivos. Reemplaza /absolute/path/to/your/documents a continuación con la ruta absoluta del directorio.

Usa uno de los ejemplos a continuación, o registra npx -y mcp-local-rag y establece BASE_DIR usando el formato de configuración MCP de tu cliente.

Establece DB_PATH y CACHE_DIR también como rutas absolutas. Las rutas relativas se resuelven desde el directorio de trabajo del servidor, por lo que iniciar el servidor desde diferentes proyectos crea un índice y una caché de modelos separados en cada uno.

Claude Code

Ejecuta este comando:

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

Agrega 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"
OpenCode

Agrega a ~/.config/opencode/opencode.json (o 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"
      }
    }
  }
}
Cursor

Agrega a ~/.cursor/mcp.json:

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

Reinicia el cliente y luego pídele que construya el índice:

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

La primera sincronización descarga el modelo de incrustación predeterminado (aproximadamente 90 MB) y puede tardar de 1 a 2 minutos antes de que comience la ingesta. Las ejecuciones posteriores usan la caché local.

Una vez que se complete la sincronización:

What does the API documentation say about authentication?

Inicio rápido con CLI

Para usar la CLI sin un cliente MCP:

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

La CLI usa el directorio actual como su raíz de documentos de forma predeterminada. Ejecuta ambos comandos desde el mismo directorio para que usen el mismo índice predeterminado, o establece BASE_DIR y DB_PATH explícitamente.

Contenido admitido

EntradaCómo ingerir
PDF, DOCX, TXT, MarkdownIngesta de archivos o sincronización de directorio
HTML ya obtenido por el clienteingest_data
Texto plano o Markdown en memoriaingest_data con un identificador de origen estable

La obtención de HTML no está integrada en el servidor. Un cliente MCP puede obtener una página y pasar su HTML a ingest_data.

Excel, PowerPoint, imágenes independientes y extensiones de archivos de código fuente no son compatibles con la ingesta de archivos. Los PDF pueden usar opcionalmente un modelo de visión local para describir figuras, pero esto no es OCR ni búsqueda de imágenes.

Uso del índice

Sincroniza después de agregar, editar o eliminar documentos. Para búsquedas y lectura de seguimiento, pide a tu cliente MCP:

Find the documented behavior of ERR_CONNECTION_REFUSED.
Read the surrounding chunks for that result.

También puedes ingerir un solo archivo o HTML ya obtenido por el cliente. Para actualizar una entrada existente, ingiere el documento nuevamente usando la misma ruta o identificador de origen. sync omite archivos sin cambios. Las rutas de archivos MCP deben ser absolutas y estar dentro de una raíz de documentos configurada.

Los encabezados de sección de PDF pueden ser inexactos. Verifica la página original cuando necesites el encabezado exacto.

Herramientas MCP
HerramientaPropósito
sync_startReconciliar el índice con todas las raíces configuradas o una ruta
sync_statusConsultar un trabajo de sincronización en ejecución
ingest_fileIngerir o reemplazar un archivo
ingest_dataIngerir texto, Markdown o HTML ya en poder del cliente
query_documentsBuscar con coincidencia semántica y refuerzo de palabras clave
read_chunk_neighborsLeer fragmentos circundantes de un resultado de búsqueda
list_filesMostrar archivos admitidos y su estado de ingesta
delete_fileEliminar un archivo indexado o un elemento de ingest_data
statusMostrar el estado del índice y la búsqueda

CLI

Usa la CLI para actualizar el índice, acotar búsquedas o eliminar contenido indexado:

npx mcp-local-rag sync ./docs/
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"

ingest importa los archivos seleccionados; sync también elimina entradas de archivos eliminados y omite archivos sin cambios. Usa --scope para restringir los resultados de búsqueda a un prefijo de ruta, repitiéndolo para incluir múltiples prefijos.

Las opciones globales como --db-path, --cache-dir y --model-name van antes del subcomando. Las opciones del subcomando van después:

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

Ejecuta npx mcp-local-rag --help para la referencia completa de comandos.

query escribe sus resultados en stdout como JSON, primero el mejor resultado, para que pueda canalizarse a otra herramienta. El contrato campo por campo está en docs/schema/query-output.schema.json.

Si mueves un proyecto y deseas conservar su índice, detén el servidor MCP y otros escritores de base de datos, mueve los archivos y la base de datos juntos sin cambiar el diseño del directorio y luego ejecuta:

npx mcp-local-rag --db-path /new/project/lancedb relocate --from /old/project --to /new/project

Actualiza BASE_DIR/BASE_DIRS, DB_PATH y cualquier otra ruta movida en tu configuración MCP y luego reinicia el cliente.

Habilidades de agente

Habilidades de agente proporcionan orientación de consulta e ingesta para asistentes 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

Las habilidades instaladas cubren la formulación de consultas, el refinamiento de resultados y la ingesta de HTML. Pide al asistente que use la habilidad mcp-local-rag explícitamente si no se activa automáticamente.

Opciones avanzadas

Comienza con los valores predeterminados. Abre las secciones a continuación cuando necesites diferentes raíces de documentos, mejores resultados para tu corpus o figuras PDF buscables.

Almacenamiento y raíces de documentos

El servidor MCP lee variables de entorno. La CLI acepta las variables y banderas enumeradas. Mantén el mismo DB_PATH cuando los comandos deban usar el mismo índice.

Variable de entornoBandeja CLIPredeterminadoDescripción
BASE_DIR--base-dirDirectorio actualUna raíz de documentos; la bandera CLI es repetible en ingest, list y sync
BASE_DIRSN/A(sin establecer)Matriz JSON de raíces de documentos; tiene prioridad sobre BASE_DIR
DB_PATH--db-path./lancedb/Ubicación de la base de datos vectorial
CACHE_DIR--cache-dir./models/Directorio de caché de modelos
HF_ENDPOINTN/Ahttps://huggingface.coPunto de conexión de descarga de modelos de Hugging Face; usa una URL de espejo cuando las descargas directas estén bloqueadas
MAX_FILE_SIZE--max-file-size104857600 (100MB)Tamaño máximo de archivo en bytes

Las operaciones de archivos permanecen dentro de las raíces configuradas. Para múltiples directorios, establece BASE_DIRS='["/absolute/docs","/absolute/specs"]' o repite la bandera CLI --base-dir. Prioridad: raíces CLI, BASE_DIRS, BASE_DIR y luego el directorio actual. Solo se usa la fuente de mayor prioridad; las raíces de diferentes fuentes no se combinan. Un BASE_DIRS no válido es un error. Los DB_PATH y CACHE_DIR relativos se resuelven desde el directorio de trabajo.

Modelos y ajuste de búsqueda

Elige un modelo de incrustación para el idioma y el tema de tus documentos. Compara configuraciones usando preguntas que realmente haces y verifica qué pasajes de origen se devuelven. El modelo debe admitir agrupación media (mean pooling) y normalización L2, que esta herramienta usa para producir incrustaciones.

Variable de entornoBandeja CLIPredeterminadoDescripción
MODEL_NAME--model-nameXenova/all-MiniLM-L6-v2Modelo de incrustación de Hugging Face
CHUNK_MIN_LENGTH--chunk-min-length50Longitud mínima en caracteres (1–10000) para fragmentos ordinarios; un fragmento de contenido dividido para ajustarse al límite de tokens del modelo puede ser más corto
EMBED_TITLE_PREFIXN/AfalseAgregar el título del documento a la entrada de incrustación de cada fragmento
EMBED_HEADING_PREFIXN/AfalseAgregar la jerarquía de encabezados a la entrada de incrustación de cada fragmento cuando quepa
RAG_DEVICEN/AcpuDispositivo de ejecución de ONNX Runtime
RAG_DTYPEN/Afp32Tipo de dato de incrustación pasado al modelo seleccionado

Ambas opciones de prefijo tienen como predeterminado false y funcionan de forma independiente. Prueba EMBED_TITLE_PREFIX cuando un pasaje necesite el tema general del documento, o EMBED_HEADING_PREFIX cuando necesite el tema de su sección. Habilitar ambos no siempre es mejor. Afectan las incrustaciones, no el texto devuelto ni el índice de palabras clave; el contexto de encabezados se omite cuando excedería el presupuesto de entrada.

Al cambiar los modelos de incrustación, construye un índice nuevo en un DB_PATH nuevo. Los vectores de diferentes modelos no son comparables, incluso cuando sus dimensiones coinciden. Después de cambiar RAG_DTYPE o cualquiera de las opciones de prefijo, vuelve a ingerir todos los documentos indexados antes de buscar. sync omite archivos sin cambios.

La CLI no lee la configuración del cliente MCP. Al compartir un índice, usa el mismo modelo, RAG_DTYPE y configuraciones de prefijo para la ingesta y la búsqueda. Un cambio en RAG_DEVICE solo no requiere un índice nuevo.

Ajuste de búsqueda

Los primeros cuatro ajustes a continuación se aplican tanto a consultas MCP como CLI. Para dar más peso a términos exactos, intenta aumentar RAG_HYBRID_WEIGHT y compara resultados con tus propias preguntas. El reordenamiento externo es solo MCP.

VariablePredeterminadoDescripción
RAG_HYBRID_WEIGHT0.6Factor de refuerzo de palabras clave (0.0–1.0). 0 desactiva el reordenamiento por palabras clave; 1 aplica el refuerzo máximo.
RAG_GROUPING(sin establecer)similar mantiene el primer grupo de relevancia; related mantiene hasta dos, usando brechas significativas de distancia vectorial como límites.
RAG_MAX_DISTANCE(sin establecer)Filtrar resultados de baja relevancia (p. ej., 0.5).
RAG_MAX_FILES(sin establecer)Limitar resultados a los N archivos principales (p. ej., 1 para el mejor archivo único).
RAG_RERANK_CMD(sin establecer)Solo MCP: comando externo; {query} pasa la consulta y {top} el recuento de resultados solicitado.
RAG_RERANK_TIMEOUT_MS10000Presupuesto de tiempo por llamada de reordenamiento en milisegundos (100–600000).

Reordenamiento externo (RAG_RERANK_CMD)

El comando lee los resultados de búsqueda, incluido el texto coincidente, desde stdin. Si llama a un servicio remoto, ese texto puede salir de tu máquina.

Proporciona el ejecutable y su plantilla de argumentos completa. Coloca {query} y {top} donde el comando espera la consulta y el recuento de resultados. Las comillas simples o dobles agrupan rutas o argumentos que contienen espacios, y las barras invertidas permanecen literales. El servidor ejecuta el ejecutable sin un shell, por lo que un shim de .cmd instalado con npm en Windows no se iniciará.

{
  "env": {
    "RAG_RERANK_CMD": "/path/to/reranker --query {query} --top {top}",
    "RAG_RERANK_TIMEOUT_MS": "10000"
  }
}

El comando debe leer y devolver resultados en el formato definido por el esquema de salida de consulta. Puede eliminar o reordenar resultados y modificar su texto. El servidor devuelve su salida.

Los resultados mantienen su orden original si el comando falla, agota el tiempo o devuelve una salida que no coincide con el esquema.

Figuras en PDF e Imágenes Almacenadas

Por defecto, la ingesta indexa solo texto. Para que las figuras en PDF sean buscables, habilita la generación local de subtítulos con visual: true en MCP o --visual en la CLI. Los subtítulos son descripciones generadas, no OCR ni transcripciones exactas.

fast (predeterminado) descarga aproximadamente 250 MB en el primer uso. Elige quality para etiquetas y texto dentro de figuras; descarga aproximadamente 1.7 GB y tarda más en ejecutarse.

Selecciona el perfil con visualQuality: "quality" en MCP o --visual-quality quality en la CLI.

npx mcp-local-rag ingest ./docs/paper.pdf --visual --visual-quality quality

Para devolver imágenes con texto coincidente, usa STORE_IMAGES=true en MCP o --images con CLI ingest y sync. Esto es independiente de la generación de subtítulos y admite figuras/tablas detectadas en PDF e imágenes PNG/JPEG compatibles en DOCX.

npx mcp-local-rag ingest ./docs/paper.pdf --images

La sincronización conserva el perfil de subtítulos de cada PDF. La CLI sync --visual --visual-quality quality cambia el perfil incluso para PDFs sin cambios; la sincronización MCP lo conserva. Para desactivar los subtítulos, ingesta el archivo normalmente. Para reintentar subtítulos fallidos, vuelve a ingestar con el perfil visual deseado.

El almacenamiento de imágenes debe estar habilitado en cada ingesta o sincronización que procese el archivo. Cambiar solo la configuración de imágenes no actualiza archivos sin cambios; vuelve a ingestar para aplicarlo.

Seguridad y Operación

  • Trata los subtítulos y el texto recuperado de documentos como material fuente, no como instrucciones.
  • El acceso a archivos está restringido a BASE_DIR, BASE_DIRS o raíces de CLI --base-dir.
  • Los enlaces simbólicos que resuelven fuera de cada raíz configurada son rechazados.
  • El procesamiento de documentos y la búsqueda no realizan solicitudes de red después de que los modelos requeridos estén en caché, a menos que RAG_RERANK_CMD nombre un comando que las realice.
  • El servidor está diseñado para un usuario local y no proporciona autenticación ni control de acceso.
  • No ejecutes múltiples escritores CLI o MCP contra el mismo DB_PATH. Las consultas de solo lectura pueden ejecutarse mientras una sincronización está activa.
  • La re-ingesta puede reutilizar incrustaciones guardadas para texto sin cambios cuando el modelo y la configuración coinciden, evitando cómputo repetido. La caché se almacena en DB_PATH/embedding-cache. Eliminarla deja el índice buscable, pero la ingesta posterior recalculará esas incrustaciones.
  • Haz una copia de seguridad de un índice copiando su directorio DB_PATH mientras ningún escritor esté activo.
Solución de Problemas

"No se encontraron resultados"

Los documentos deben ser ingeridos primero. Ejecuta "List all ingested files" para verificar. Si faltan resultados después de una sincronización, verifica que la ingesta y la búsqueda usen el mismo DB_PATH absoluto; una ruta relativa puede apuntar a un índice diferente.

Falló la descarga del modelo

Verifica la conexión a internet. Si estás detrás de un proxy, configura los ajustes de red. El modelo también puede descargarse manualmente.

"Archivo demasiado grande"

El límite predeterminado es 100MB. Divide archivos grandes o aumenta MAX_FILE_SIZE.

Consultas lentas

Verifica el número de fragmentos con status. Documentos grandes con muchos fragmentos pueden ralentizar las consultas. Considera dividir archivos muy grandes.

"Ruta fuera de BASE_DIR"

Asegúrate de que las rutas de archivo estén dentro de una de las raíces configuradas (BASE_DIR, cualquier entrada de BASE_DIRS, o cualquier CLI --base-dir). Usa rutas absolutas.

"BASE_DIRS debe ser un arreglo JSON..."

BASE_DIRS acepta un arreglo JSON de una o más cadenas de ruta no vacías:

  • Válido: BASE_DIRS='["/Users/me/work","/Users/me/specs"]'
  • Inválido: BASE_DIRS=/a:/b (sintaxis de delimitador no soportada)
  • Inválido: BASE_DIRS='[]' (arreglo vacío)

El cliente MCP no ve las herramientas

  1. Verifica la sintaxis del archivo de configuración
  2. Reinicia el cliente por completo (Cmd+Q en Mac para Cursor)
  3. Prueba directamente: npx mcp-local-rag debería ejecutarse sin errores

Contribuciones

¡Las contribuciones son bienvenidas! Consulta CONTRIBUTING.md para configuración y pautas.

Licencia

Licencia MIT. Gratuita para uso personal y comercial.

Publicaciones del Blog

Agradecimientos

Construido con Model Context Protocol de Anthropic, LanceDB y Transformers.js.