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
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
| Entrada | Cómo ingerir |
|---|---|
| PDF, DOCX, TXT, Markdown | Ingesta de archivos o sincronización de directorio |
| HTML ya obtenido por el cliente | ingest_data |
| Texto plano o Markdown en memoria | ingest_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
| Herramienta | Propósito |
|---|---|
sync_start | Reconciliar el índice con todas las raíces configuradas o una ruta |
sync_status | Consultar un trabajo de sincronización en ejecución |
ingest_file | Ingerir o reemplazar un archivo |
ingest_data | Ingerir texto, Markdown o HTML ya en poder del cliente |
query_documents | Buscar con coincidencia semántica y refuerzo de palabras clave |
read_chunk_neighbors | Leer fragmentos circundantes de un resultado de búsqueda |
list_files | Mostrar archivos admitidos y su estado de ingesta |
delete_file | Eliminar un archivo indexado o un elemento de ingest_data |
status | Mostrar 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 entorno | Bandeja CLI | Predeterminado | Descripción |
|---|---|---|---|
BASE_DIR | --base-dir | Directorio actual | Una raíz de documentos; la bandera CLI es repetible en ingest, list y sync |
BASE_DIRS | N/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_ENDPOINT | N/A | https://huggingface.co | Punto 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-size | 104857600 (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 entorno | Bandeja CLI | Predeterminado | Descripción |
|---|---|---|---|
MODEL_NAME | --model-name | Xenova/all-MiniLM-L6-v2 | Modelo de incrustación de Hugging Face |
CHUNK_MIN_LENGTH | --chunk-min-length | 50 | Longitud 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_PREFIX | N/A | false | Agregar el título del documento a la entrada de incrustación de cada fragmento |
EMBED_HEADING_PREFIX | N/A | false | Agregar la jerarquía de encabezados a la entrada de incrustación de cada fragmento cuando quepa |
RAG_DEVICE | N/A | cpu | Dispositivo de ejecución de ONNX Runtime |
RAG_DTYPE | N/A | fp32 | Tipo 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.
| Variable | Predeterminado | Descripción |
|---|---|---|
RAG_HYBRID_WEIGHT | 0.6 | Factor 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_MS | 10000 | Presupuesto 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_DIRSo 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_CMDnombre 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_PATHmientras 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
- Verifica la sintaxis del archivo de configuración
- Reinicia el cliente por completo (Cmd+Q en Mac para Cursor)
- Prueba directamente:
npx mcp-local-ragdeberí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
- Construyendo un Local RAG para Codificación Agéntica: Análisis técnico profundo del diseño de fragmentación semántica y búsqueda híbrida.
Agradecimientos
Construido con Model Context Protocol de Anthropic, LanceDB y Transformers.js.