A menudo, no. Para una carpeta de contratos, informes o correos electrónicos, un agente de IA con una herramienta de búsqueda de texto completo encuentra los archivos correctos, lee solo los pasajes coincidentes y los cita, y el índice se ejecuta localmente sin modelo de incrustación y sin almacén vectorial. GroupDocs.Search.Mcp brinda a Claude Desktop, Claude Code, Cursor o Copilot esa herramienta en un solo comando Docker:

Indexa la carpeta de contratos, luego dime qué contratos mencionan una penalidad por terminación y cita la cláusula.

La versión paso a paso con configuración y solución de problemas está en la documentación: Cómo buscar documentos con agentes de IA usando MCP.

¿Por qué todos recurren primero a las incrustaciones?

Porque la “generación aumentada por recuperación” llegó como una receta: dividir los documentos en fragmentos, incrustar cada fragmento, almacenar los vectores, incrustar la pregunta, tomar los fragmentos más cercanos y pegarlos en el prompt. Funciona, y para preguntas formuladas de manera muy distinta a los documentos es la herramienta adecuada. Pero es una canalización que requiere un modelo de incrustación para llamar, un almacén para ejecutar, ajuste de fragmentación y un trabajo de re‑incrustación cada vez que los documentos cambian. Para “cuáles de mis 300 contratos mencionan una penalidad por terminación”, esa maquinaria responde una pregunta que un índice de búsqueda responde directamente.

La evidencia ha alcanzado a la intuición. Un estudio publicado en arXiv a finales de 2025 (Keyword search is all you need) dio a un agente solo búsqueda por palabras clave y expresiones regulares sobre una carpeta y lo midió contra una canalización RAG estándar: más del 90 % de las puntuaciones RAG, sin base de datos vectorial, y mejor adaptado a colecciones que cambian con frecuencia. Los agentes de codificación ya habían mostrado el patrón en la práctica: buscan con grep, refinan y vuelven a buscar.

¿Qué hace el agente en su lugar?

Tres llamadas. GroupDocs.Search.Mcp expone ocho herramientas; el bucle necesita tres de ellas:

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index ------------------------->|  reads the
 |                 |   {"documentsPath":"contracts",           |  files once,
 |                 |    "indexName":"contracts"}               |  stores text
 |                 |<- "5 document(s) added, 5 in the index" --|
 |                 |-- search ------------------------------->|
 |                 |   {"query":"termination AND penalty"}     |
 |                 |<- {"documentsFound":3, "documents":[ ... |  which files
 |                 |-- get_text_fragments ------------------->|
 |                 |   {"query":"\"termination penalty\""}     |
 |                 |<- === contracts/acme-...-agreement.pdf ===|  the passages
 |<- "Two contracts carry one: Acme (3 monthly fees, 12.3),    |
 |    Globex (50% of the remaining fees). Initech excludes it."|

add_to_index lee los archivos una vez y mantiene el texto en un índice nombrado en disco. search devuelve los archivos coincidentes como JSON con recuentos de ocurrencias. get_text_fragments devuelve cada coincidencia con unas pocas palabras de contexto, de modo que el agente cita la cláusula en lugar de cargar todo el contrato.

Aquí está lo que el servidor devolvió realmente en nuestra prueba, contra cinco contratos sintéticos:

-> search {"query":"termination AND penalty","indexName":"contracts"}
<- documentsFound 3: acme-master-services-agreement.pdf,
   globex-consulting-agreement.docx, initech-nda.docx

-> get_text_fragments {"query":"\"termination penalty\"",...}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx (1 occurrence(s)) ===
     …Early termination penalty: the Client pays 50 percent of the fees…

Observe el tercer contrato. El NDA de Initech coincidió con termination AND penalty porque dice “there is no fee and no penalty associated with termination”. El pasaje es lo que diferencia una coincidencia de una mera mención, y un agente que lee los pasajes lo indica. Eso es la fundamentación: cada afirmación en la respuesta apunta a un archivo y a una oración que puedes abrir.

¿Dónde gana cada enfoque?

Embedding pipeline                       Agentic full-text search
-------------------------------------    -------------------------------------
split, embed, store in a vector store    add_to_index: a local full-text index
embed the question, take top-k chunks    agent searches, refines, searches again
paste the chunks into the prompt         get_text_fragments: quoted passages
re-embed when documents change           update_index re-reads what changed
needs an embedding model and a store     no model calls, no network at runtime
matches meaning; ranking is opaque       matches words; every hit is explainable

La búsqueda de texto completo pierde cuando la pregunta y el documento no comparten palabras: "¿qué contratos son riesgosos para nosotros?" no tiene palabras clave. Gana cuando el vocabulario es compartido, lo que describe la mayoría de las preguntas que la gente hace sobre sus propios documentos: un nombre de cláusula, un producto, un cliente, un número de factura, un rango de fechas. Cuando una consulta falla, el agente prueba renewal OR renews, o una coincidencia difusa, como lo haría una persona. El servidor ayuda: una consulta de dos palabras sin comillas no coincide con nada en GroupDocs.Search, y el resultado vacío lleva un hint que indica al agente que cite la frase.

¿Qué herramienta para qué pregunta?

El usuario pregunta El agente llama
“Indexa esta carpeta” add_to_index
“¿Qué archivos mencionan X?” search
“¿Qué dice sobre X?” get_text_fragments
“Los archivos cambiaron, refresca” update_index
“Olvida la carpeta de borradores” remove_from_index
“¿Qué hay en el índice?” get_index_info
“Crea un índice separado” create_index
“¿Por qué solo 10 resultados?” get_license_status

El índice comprende 82 formatos, incluidos PDF, Office, OpenDocument, HTML y archivos de correo electrónico (PST, OST, MSG, EML) con sus adjuntos.

¿Cómo lo ejecutas?

claude mcp add groupdocs-search -- docker run --rm -i \
  -v /path/to/documents:/data ghcr.io/groupdocs-search/search-net-mcp:latest

Cursor, Claude Desktop, VS Code con GitHub Copilot y los demás clientes usan el mismo contenedor en su propio archivo de configuración: Register in AI clients. En Linux agrega --user "$(id -u):$(id -g)" para que el contenedor pueda escribir su índice en tu carpeta. El servidor ejecuta el motor GroupDocs.Search 26.10, cuyo nuevo formato de índice hace los índices más pequeños y reduce aproximadamente a la mitad su uso de memoria (release notes).

Límites honestos

  • En modo de evaluación un índice contiene como máximo 100 documentos y una búsqueda devuelve como máximo 10; cada respuesta lo indica. Llama a get_license_status primero.
  • Es búsqueda de texto completo, no búsqueda semántica: coincide con palabras, no con significado.
  • No hay OCR: los PDFs escaneados sin capa de texto se indexan solo por sus propiedades de archivo.
  • Se distribuye únicamente como imagen Docker (la herramienta empaquetada supera el límite de tamaño de NuGet).

Preguntas frecuentes

¿Puede Claude buscar mis documentos locales sin subirlos?
Sí. El servidor se ejecuta en un contenedor en tu máquina y lee la carpeta que montas; solo los pasajes que el agente cita llegan al modelo.

¿Esto es RAG?
Es recuperación aumentada, pero agente‑céntrica: el modelo decide qué buscar y cuándo tiene suficiente, usando un índice de texto completo en lugar de incrustaciones.

¿Qué ocurre cuando mis documentos cambian?
Pide al agente que refresque. update_index vuelve a leer solo los archivos cambiados, añadidos y eliminados.

Profundiza