<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Enrico Zimuel - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Enrico Zimuel - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/es/search-labs/author/enrico-zimuel</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/enrico-zimuel</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/enrico-zimuel.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 14 Sep 2026 05:51:00 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Cómo construir aplicaciones de IA con agentes con Mastra y Elasticsearch]]></title>
    <description><![CDATA[Aprende a construir aplicaciones de IA agéntica usando Mastra y Elasticsearch a través de un ejemplo práctico.]]></description>
    <content:encoded><![CDATA[<p>En este artículo, haremos un recorrido por cómo usar el marco de trabajo <a href="https://mastra.ai/">Mastra</a> TypeScript para crear aplicaciones agénticas que interactúen con <a href="https://www.elastic.co/elasticsearch">Elasticsearch</a>.</p><p>Recientemente, contribuimos al proyecto de <a href="https://github.com/mastra-ai/mastra">mastra-ai/mastra</a> open source agregando soporte para Elasticsearch como base de datos vectorial. Con esta nueva característica, puedes usar Elasticsearch de forma nativa en Mastra para almacenar incrustaciones. Además de los vectores, Elasticsearch ofrece un conjunto de funciones avanzadas para satisfacer todas tus necesidades de ingeniería de contexto (por ejemplo, <a href="https://www.elastic.co/search-labs/blog/context-engineering-hybrid-search-evolution-agentic-ai">búsqueda híbrida y reordenamiento</a>).</p><p>En este artículo, se detalla la creación de un agente para implementar una arquitectura de Retrieval-Augmented Generation (RAG) con Elasticsearch. Te mostraremos un proyecto de demostración en el que se utiliza un enfoque agéntico para interactuar con un corpus de datos de películas de ciencia ficción almacenados en Elasticsearch. El proyecto está disponible en <a href="https://github.com/elastic/mastra-elasticsearch-example">elastic/mastra-elasticsearch-example</a>.</p><h2>Mastra</h2><p>Mastra es un marco de trabajo de TypeScript para crear aplicaciones de IA agéntica.</p><p>Una estructura de proyecto en Mastra se ve así:</p>src/
├── mastra/
│   ├── agents/
│   │   └── weather-agent.ts
│   ├── tools/
│   │   └── weather-tool.ts
│   ├── workflows/
│   │   └── weather-workflow.ts
│   ├── scorers/
│   │   └── weather-scorer.ts
│   └── index.ts
├── .env.example
├── package.json
└── tsconfig.json<p>En Mastra, puedes crear <a href="https://mastra.ai/docs/agents/overview">agentes</a>, <a href="https://mastra.ai/docs/agents/using-tools">herramientas</a>, <a href="https://mastra.ai/docs/workflows/overview">flujos de trabajo</a> y <a href="https://mastra.ai/docs/evals/overview">puntajes</a>.</p><p>Un <strong>agente</strong> es una clase que acepta un mensaje como entrada y produce una respuesta como salida. Un agente puede usar herramientas, modelos de lenguaje a gran escala (LLM) y una memoria (figura 1).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f7484f7501997dc/6a170417cdacbffb5a7d28f6/f6aca2dcc7fcc45d25e06681649be1b2b7eb6781-706x721.png" alt="Un diagrama que muestra cómo funciona un agente en Mastra." /><p>Las <strong>herramientas</strong> de un agente le permiten interactuar con el "mundo externo", como comunicarse con una API web o hacer una operación interna, como consultar Elasticsearch. El componente de <strong>memoria</strong> es crucial para almacenar el historial de conversaciones, incluidas las entradas y salidas pasadas. Este contexto almacenado permite que el agente proporcione respuestas más informadas y relevantes a preguntas futuras mediante el uso de sus interacciones pasadas.</p><p>Los <strong>flujos de trabajo</strong> te permiten definir secuencias complejas de tareas mediante pasos claros y estructurados, en lugar de depender del razonamiento de un solo agente (figura 2). Te brindan control total sobre cómo se desglosan las tareas, cómo se mueven los datos entre ellas y qué se ejecuta y cuándo. Los flujos de trabajo se ejecutan con el motor de ejecución integrado de forma predeterminada o se pueden desplegar en <a href="https://mastra.ai/docs/deployment/workflow-runners">ejecutores de flujos de trabajo</a>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd82ea661569e1018/6a170419dc55de3adde00cc9/0dce161cf7891207015dc87532b5b90df1822432-880x252.png" alt="Ejemplo de flujo de trabajo en Mastra." /><p>En Mastra, también puedes definir puntuaciones, que son pruebas automatizadas que evalúan las salidas de los agentes mediante métodos calificados por modelos, basados en reglas y estadísticos. Los evaluadores devuelven <em>puntuaciones</em>: valores numéricos (normalmente entre 0 y 1) que cuantifican qué tan bien una salida cumple con tus criterios de evaluación. Estas puntuaciones te permiten hacer un seguimiento objetivo del rendimiento, comparar diferentes enfoques e identificar áreas de mejora en tus sistemas de IA. Los evaluadores pueden personalizarse con tus propias solicitudes y funciones de puntuación.</p><h2>Elasticsearch</h2><p>Para ejecutar el proyecto de demostración, necesitamos tener una instancia de Elasticsearch en ejecución. Puedes activar una prueba gratis en <a href="https://www.elastic.co/cloud">Elastic Cloud</a> o instalarlo localmente usando el script <a href="https://github.com/elastic/start-local"><code>start-local</code></a>:</p>curl -fsSL https://elastic.co/start-local | sh<p>Se instalarán Elasticsearch y Kibana en tu computadora y se generará una clave API que se utilizará para configurar la integración de Mastra.</p><p>La clave de API se mostrará como salida del comando anterior y se almacenará en un archivo <strong>.env</strong> en la carpeta elastic-start-local.</p><h2>Instalar y configurar la demo</h2><p>Creamos un repositorio <a href="https://github.com/elastic/mastra-elasticsearch-example">elastic/mastra-elasticsearch-example</a> que contiene el código fuente del proyecto de demostración. El ejemplo reportado en el repositorio ilustra cómo crear un agente en Mastra que implemente una arquitectura RAG para recuperar documentos de Elasticsearch.</p><p>Proporcionamos un set de datos para la demostración sobre películas de ciencia ficción. Extrajimos 500 películas de los <a href="https://www.kaggle.com/datasets/rajugc/imdb-movies-dataset-based-on-genre/versions/2?select=scifi.csv">sets de datos</a> de IMDb en Kaggle.</p><p>El primer paso es instalar las dependencias del proyecto con npm, usando el siguiente comando:</p>npm install<p>Luego tenemos que configurar el archivo <strong>.env</strong> que contendrá la configuración. Podemos generar este archivo copiando la estructura del archivo <strong>.env.example</strong> , usando el siguiente comando:</p>cp .env.example .env<p>Ahora podemos editar el archivo .env, agregando la información faltante:</p>OPENAI_API_KEY=
ELASTICSEARCH_URL=
ELASTICSEARCH_API_KEY=
ELASTICSEARCH_INDEX_NAME=scifi-movies<p>El nombre del índice de Elasticsearch es <strong><code>scifi-movies</code></strong>. Si quieres, puedes cambiarlo usando la variable de entorno <code>ELASTICSEARCH_INDEX_NAME</code>.</p><p>Usamos OpenAI como servicio de incrustación, lo que significa que necesitas proporcionar una clave API para OpenAI en la variable <code>OPENAI_API_KEY</code> .env.</p><p>El modelo de incrustación empleado en el ejemplo es <a href="https://developers.openai.com/api/docs/models/text-embedding-3-small">openai/text-embedding-3-small</a>, con una dimensión de incrustación de 1536.</p><p>Para generar la respuesta final, empleamos el modelo <a href="https://developers.openai.com/api/docs/models/gpt-5-nano">openai/gpt-5-nano</a> para reducir costos.</p><p>La arquitectura RAG te permite usar un modelo LLM final menos potente (y generalmente menos costoso) porque el trabajo pesado de fundamentar la respuesta está a cargo del componente de recuperación (Elasticsearch en este caso).</p><p>El LLM más pequeño solo se encarga de dos tareas principales:</p><ul><li><p><strong>Reformulación/incrustación de la consulta:</strong> Convertir la pregunta en lenguaje natural del usuario en una incrustación de vectores para la búsqueda semántica.</p></li><li><p><strong>Sintetizar la respuesta:</strong> Se toman los fragmentos de contexto muy relevantes y recuperados (documentos/películas) y se los sintetiza en una respuesta coherente, final y legible por seres humanos, siguiendo las instrucciones del prompt proporcionado.</p></li></ul><p>Dado que el proceso RAG <strong>proporciona el contexto fáctico exacto</strong> necesario para la respuesta, el LLM final no necesita ser masivo o muy complejo y no necesita poseer todo el conocimiento requerido dentro de sus propios parámetros (que es donde sobresalen los modelos grandes y caros). Esencialmente actúa como un sofisticado resumidor y formateador de texto para el contexto proporcionado por Elasticsearch, en lugar de ser una base de conocimientos completa en sí mismo. Esto permite el uso de modelos como <code>gpt-5-nano</code> para optimizar costos y latencia.</p><p>Después de la configuración del archivo .env, puedes ingestar las películas a Elasticsearch usando el siguiente comando:</p>npx tsx src/utility/store.ts<p>Deberías ver una salida como la siguiente:</p>🚀 Starting ingestion of 500 movies from 500_scifi_movies.jsonl...
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 1/500 (0%) | ok:1 | fail:0 | chunks:1 | eta:19m 33s | current:Capricorn One
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 2/500 (0%) | ok:2 | fail:0 | chunks:2 | eta:10m 32s | current:Doghouse
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 3/500 (1%) | ok:3 | fail:0 | chunks:3 | eta:7m 33s | current:Dinocroc
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 4/500 (1%) | ok:4 | fail:0 | chunks:7 | eta:6m 10s | current:Back to the Future           
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 5/500 (1%) | ok:5 | fail:0 | chunks:9 | eta:5m 14s | current:The Projected Man            
Ingesting ░░░░░░░░░░░░░░░░░░░░░░░░ 6/500 (1%) | ok:6 | fail:0 | chunks:11 | eta:4m 41s | current:I, Robot
...
✅ Ingestion complete in 1m 46s. Success: 500, Failed: 0, Chunks: 693.<p>El mapping del índice de películas de ciencia ficción contiene los siguientes campos:</p><ul><li><p><strong>incrustación</strong>, dense_vector con 1536 dimensiones, similitud del coseno.</p></li><li><p><strong>descripción</strong>, texto que contiene la descripción de la película.</p></li><li><p><strong>director</strong>, texto que contiene el nombre del director.</p></li><li><p><strong>título</strong>, texto que contiene el título de la película.</p></li></ul><p>Generamos las incrustaciones usando el título + la descripción. Como el título y la descripción son dos campos separados, la concatenación de ambos asegura que el vector de incrustación resultante capture tanto la identidad única y específica (título) como el contexto rico y descriptivo (descripción) de la película, lo que lleva a resultados de búsqueda semántica más precisos y completos. Esta entrada combinada le brinda al modelo de incrustación una mejor representación del contenido del documento para la búsqueda por similitud.</p><h2>Ejecuta la demostración</h2><p>Puedes ejecutar la demo con el siguiente comando:</p>npm run dev<p>Este comando iniciará una aplicación web en <strong>localhost:4111</strong> para acceder a Mastra Studio (figura 3).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8a539df677a33b36/6a17041a47d49c36842d88a0/1567e309df21a12bcf1dfef4429f82342549956c-1705x1079.png" alt="Captura de pantalla de Mastra Studio con el ejemplo del agente de Elasticsearch." /><p><a href="https://mastra.ai/docs/getting-started/studio">Mastra Studio</a> ofrece una UI interactiva para crear y probar tus agentes, junto con una API REST que expone tu aplicación Mastra como un servicio local. Esto te permite comenzar a construir de inmediato sin preocuparte por la integración.</p><p>Proporcionamos un <strong>Agente Elasticsearch</strong> que emplea <a href="https://mastra.ai/reference/tools/vector-query-tool">createVectorQueryTool</a> de Mastra como herramienta para ejecutar búsqueda semántica usando Elasticsearch. Este agente emplea el enfoque RAG para buscar documentos relevantes (es decir, películas) que respondan a la pregunta del usuario.</p><p>Este agente usa el siguiente prompt:</p>You are a helpful assistant that answers questions based on the provided context.
Follow these steps for each response:

1. First, carefully analyze the retrieved context chunks and identify key information.
2. Break down your thinking process about how the retrieved information relates to the query.
3. Draw conclusions based only on the evidence in the retrieved context.
4. If the retrieved chunks don't contain enough information, explicitly state what's missing.

Format your response as:
THOUGHT PROCESS:
- Step 1: [Initial analysis of retrieved chunks]
- Step 2: [Reasoning based on chunks]

FINAL ANSWER:
[Your concise answer based on the retrieved context]

Important: When asked to answer a question, please base your answer only on the context provided in the tool. 
If the context doesn't contain enough information to fully answer the question, please state that explicitly and stop it.
Do not add more information than what is present in the retrieved chunks.
Remember: Explain how you're using the retrieved information to reach your conclusions.<p>Si haces clic en el menú <code>Mastra Studio &gt; Agents</code> y seleccionas <strong>Agente de Elasticsearch</strong>, puedes probar el agente usando un sistema de chat. Por ejemplo, puedes pedir información sobre películas de ciencia ficción con una pregunta como esta:</p><p><em>Encuentra 5 películas o series de TV sobre ovnis</em>.</p><p>Notarás que el agente ejecutará el vectorQueryTool. Puedes hacer clic en la herramienta invocada para ver la entrada y la salida. Al final de la ejecución, el LLM responderá tu pregunta, dado el contexto que proviene del índice de películas de ciencia ficción de Elasticsearch (figura 4).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda92a9b6e56528d3/6a17041c2b835f9724f4b0d6/d9998d4f687984de98845dae52d1288166abf448-1344x1071.png" alt=" Respuesta de LLM usando el agente de Elasticsearch." /><p>Mastra ejecuta los siguientes pasos internamente:</p><ol><li><p><strong>Conversión en vectores:</strong> La pregunta del usuario, <em>Encuentra 5 películas o series de televisión sobre ovnis,</em> se convierte en una incrustación de vectores mediante el modelo <code>openai/text-embedding-3-small</code> de OpenAI.</p></li><li><p><strong>Búsqueda de vectores:</strong> Esta incrustación se usa luego para hacer una búsqueda en Elasticsearch mediante una búsqueda de vectores.</p></li><li><p><strong>Recuperación de resultados:</strong> Elasticsearch devuelve una serie de 10 películas muy relevantes para la consulta (es decir, aquellas con vectores más cercanos al vector de consulta del usuario).</p></li><li><p><strong>Generación de respuestas:</strong> Las películas recuperadas y la pregunta original del usuario se envían al LLM, específicamente <code>openai/gpt-5-nano</code>. El LLM procesa esta información y genera una respuesta final, asegurando que se cumpla la solicitud del usuario para cinco resultados.</p></li></ol><h2>El agente de Elasticsearch</h2><p>Aquí presentamos el código fuente del agente de Elasticsearch.</p>import { Agent } from "@mastra/core/agent";
import { ElasticSearchVector } from '@mastra/elasticsearch';
import { createVectorQueryTool } from '@mastra/rag';
import { ModelRouterEmbeddingModel } from "@mastra/core/llm";
import { Memory } from "@mastra/memory";

const es_url = process.env.ELASTICSEARCH_URL;
const es_apikey = process.env.ELASTICSEARCH_API_KEY;
const es_index_name = process.env.ELASTICSEARCH_INDEX_NAME;
const prompt = 'insert here the previous prompt';

const esVector = new ElasticSearchVector({
  id: 'elasticsearch-vector',
  url: es_url,
  auth: {
    apiKey : es_apikey
  }
});

const vectorQueryTool = createVectorQueryTool({
  vectorStore: esVector,
  indexName: es_index_name,
  model: new ModelRouterEmbeddingModel("openai/text-embedding-3-small")
});

export const elasticsearchAgent = new Agent({
  id: "elasticsearch-agent",
  name: "Elasticsearch Agent",
  instructions: prompt,
  model: 'openai/gpt-5-nano',
  tools: { vectorQueryTool },
  memory: new Memory(),
});<p>El <strong>vectorQueryTool</strong> es la herramienta que se invoca para implementar la parte de recuperación del ejemplo de RAG. Emplea la implementación de <a href="https://mastra.ai/reference/vectors/elasticsearch">ElasticSearchVector</a> que Elastic aportó a Mastra.</p><p>El agente es un objeto de la clase agente que utiliza la herramienta vectorQueryTool, el prompt y una memoria. Como puedes ver, el código que necesitamos implementar para conectar Elasticsearch a un agente es muy sencillo.</p><h2>Conclusión</h2><p>En este artículo, se demostró la simplicidad y el poder de integrar Elasticsearch con el marco de trabajo Mastra para construir sofisticadas aplicaciones de IA agéntica. En concreto, te mostramos cómo crear un agente RAG capaz de efectuar búsquedas semánticas sobre un corpus de datos de películas de ciencia ficción indexados en Elasticsearch.</p><p>Una de las principales conclusiones es la contribución directa de Elastic al proyecto de código abierto Mastra, que ofrece compatibilidad nativa con Elasticsearch como almacén de vectores. Esta integración reduce considerablemente las barreras de acceso, como se puede ver en el código fuente del <strong>agente de Elasticsearch</strong>. Usando el <code>ElasticSearchVector</code> y <code>createVectorQueryTool</code>, la configuración completa para conectar Elasticsearch a tu agente requiere solo un número mínimo de líneas de código de configuración.</p><p>Elasticsearch ofrece varias características avanzadas para mejorar la relevancia de los resultados. Por ejemplo, la <a href="https://www.elastic.co/elasticsearch/hybrid-search">búsqueda híbrida</a> aumenta significativamente la precisión combinando la búsqueda léxica con la búsqueda de vectores. Otra característica interesante es la reclasificación con los últimos <a href="https://www.elastic.co/search-labs/tutorials/jina-tutorial/jina-reranker-v3">modelos de Jina</a>, que puede aplicarse al final de la búsqueda híbrida. Para obtener más información sobre estas técnicas, consulta los siguientes artículos de Elasticsearch Labs:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">Búsqueda híbrida Elasticsearch</a> de Valentin Crettaz</p></li><li><p><a href="https://www.elastic.co/search-labs/blog/jina-models-elasticsearch-guide">Introducción a los modelos de Jina, su funcionalidad y usos en Elasticsearch</a> de Scott Martens</p></li></ul><p>También te animamos a consultar el ejemplo proporcionado y comenzar a crear tus propios agentes basados en datos con Mastra y Elasticsearch. Para más información sobre Mastra, puedes consultar la documentación oficial <a href="https://mastra.ai/docs">aquí</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/build-agentic-ai-applications-mastra-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/build-agentic-ai-applications-mastra-elasticsearch</guid>
    <category><![CDATA[Agentic AI]]></category>
    <dc:creator><![CDATA[Enrico Zimuel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt083181bab7c0e2d0/6a17041eacf0880b70be99f5/ab30baf2f908534840c5d71a46705773807baf54-1280x720.png" length="0" type="image/png"/>
    <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Extensión CLI de Gemini para Elasticsearch con herramientas y habilidades]]></title>
    <description><![CDATA[Te presentamos la extensión de Elastic para la CLI de Gemini de Google, que te permite hacer búsquedas, recuperar y analizar datos de Elasticsearch en flujos de trabajo de desarrollo y de agentes.
]]></description>
    <content:encoded><![CDATA[<p>Nos complace anunciar el lanzamiento de nuestra extensión Elastic para la CLI de Gemini de Google, que trae todo el poder de <a href="https://www.elastic.co/elasticsearch">Elasticsearch</a> y <a href="https://www.elastic.co/elasticsearch/agent-builder">Elastic Agent Builder</a> directamente a tu flujo de trabajo de desarrollo de IA. Esta extensión también ofrece varias funciones de agente desarrolladas recientemente para interactuar con Elasticsearch.</p><p>La extensión está disponible como proyecto de open source <a href="https://github.com/elastic/gemini-cli-elasticsearch">aquí</a>.</p><h2>¿Qué es Gemini CLI y cómo lo instalas?</h2><p><a href="https://geminicli.com/">Gemini CLI</a> es un agente open source de IA que lleva los modelos Gemini de Google directamente a la línea de comando. Permite a los desarrolladores interactuar con la IA desde la terminal para hacer tareas como generar código, editar archivos, ejecutar comandos de shell y obtener información de la web.</p><p>A diferencia de las interfaces de chat típicas, Gemini CLI se integra con tu entorno local de desarrollo, lo que significa que puede entender el contexto del proyecto, modificar archivos, ejecutar compilaciones o pruebas, y automatizar flujos de trabajo directamente dentro de la terminal. Esto lo hace útil para desarrolladores, ingenieros de confiabilidad del sitio (SRE) e ingenieros que buscan codificación y automatización asistidas por IA sin salir de su flujo de trabajo de línea de comandos.</p><p>Gemini CLI puede instalarse usando diversos gestores de paquetes. El método más común es a través de npm:</p>npm install -g @google/gemini-cli<p>Si quieres conocer opciones de instalación alternativas, consulta la <a href="https://geminicli.com/docs/get-started/installation/">página de instalación oficial</a>.</p><p>Luego de la instalación, inicia la CLI ejecutando:</p>gemini<p>Verás una pantalla, como se muestra en la Figura 1:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ff43abe550941b4/6a17072ba29299fc2ad00fa4/6dfcec4a77b3dc83bf0d974417bf2e211abb1f4f-876x468.png" alt="Captura de pantalla de Gemini CLI." /><h2>Configurar Elasticsearch</h2><p>Es necesario tener una instancia de Elasticsearch en funcionamiento. Si quieres usar el servidor Model Context Protocol (MCP), también necesitas instalar Kibana 9.3+. Para emplear la habilidad del lenguaje de búsqueda Elasticsearch (ES|QL) (<code>esql</code>) descrito más abajo, Kibana no es obligatorio.</p><p>Puedes activar una prueba gratis en <a href="https://www.elastic.co/cloud">Elastic Cloud</a> o instalarlo localmente usando el script <a href="https://github.com/elastic/start-local"><code>start-local</code></a>:</p>curl -fsSL https://elastic.co/start-local | sh<p>Se instalarán Elasticsearch y Kibana en tu computadora y se generará una clave API que se utilizará para configurar Gemini CLI.</p><p>La clave de API se mostrará como salida del comando anterior y se almacenará en un archivo <strong>.env</strong> en la carpeta <strong><code>elastic-start-local</code></strong>.</p><p>Si usas Elasticsearch local (por ejemplo, usar <code>start-local</code>), y quieres usar Elastic Agent Builder con MCP, también necesitas conectar un modelo de lenguaje grande (LLM). Puedes leer <a href="https://www.elastic.co/docs/explore-analyze/ai-features/llm-guides/llm-connectors">esta página de documentación</a> para entender las diferentes opciones.</p><p>Si usas Elastic Cloud (o sin servidor), ya tienes una conexión con el LLM preconstruida.</p><h2>Instala la extensión de Elasticsearch</h2><p>Puedes instalar la extensión de Elasticsearch para Gemini CLI con el siguiente comando:</p>gemini extensions install https://github.com/elastic/gemini-cli-elasticsearch<p>Puedes verificar que las extensiones se hayan instalado correctamente abriendo Gemini y ejecutando el siguiente comando:</p>/extensions list<p>Deberías ver la extensión de Elasticsearch disponible.</p><p>Si quieres usar la integración de MCP, necesitas tener instalada una versión de Elasticsearch 9.3 o superior. Necesitas la URL de tu servidor MCP de <a href="https://www.elastic.co/kibana">Kibana</a>:</p><ul><li><p>Obtén la URL del servidor MCP desde Agentes &gt; Ver todas las herramientas &gt; Administrar MCP &gt; Copiar URL del servidor MCP.</p></li><li><p>La URL tendrá este formato: https://your-kibana-instance/api/agent_builder/mcp</p></li></ul><p>Necesitas la URL del endpoint de Elasticsearch. Esta generalmente se informa en la parte superior de la página de Kibana Elasticsearch. Si estás ejecutando Elasticsearch con <code>start-local</code>, ya tienes el endpoint en la clave <code>ES_LOCAL_URL</code>en el archivo <code>start-local</code>.env .</p><p>También necesitas una clave API. Si estás ejecutando Elasticsearch con <code>start-local</code>, ya tienes <code>ES_LOCAL_API_KEY</code> en el archivo <code>start-local</code> .env . De lo contrario, puedes crear una clave API desde la interfaz de Kibana, como se indica <a href="https://www.elastic.co/docs/deploy-manage/api-keys/elasticsearch-api-keys">aquí</a>:</p><ul><li><p>En Kibana: Stack Management &gt; Seguridad &gt; Claves de API &gt; Crear clave de API.</p></li><li><p>Sugerimos establecer solo los privilegios de lectura para la clave API, habilitando el privilegio <code>feature_agentBuilder.read</code> como <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/permissions#grant-access-with-roles">se informa aquí</a>.</p></li><li><p>Copia el valor de la clave API codificada.</p></li></ul><p>Configura las variables de entorno requeridas en tu shell:</p>export ELASTIC_URL="your-elasticsearch-url"
export ELASTIC_MCP_URL="your-elasticsearch-mcp-url"
export ELASTIC_API_KEY="your-encoded-api-key"<h2>Instala el set de datos de ejemplo</h2><p>Puedes instalar el set de datos de <strong>pedidos de comercio electrónico </strong>disponible desde Kibana. Incluye un único índice llamado <strong><code>kibana_sample_data_ecommerce</code></strong>, que contiene información sobre 4,675 pedidos de un sitio web de comercio electrónico. Para cada pedido, tenemos la siguiente información:</p><ul><li><p>Información del cliente (nombre, identificación, fecha de nacimiento, correo electrónico y más).</p></li><li><p>Fecha del pedido.</p></li><li><p>ID de pedido.</p></li><li><p>Productos (lista de todos los productos con precio, cantidad, identificación, categoría, descuento y otros detalles).</p></li><li><p>SKU.</p></li><li><p>Precio total (sin impuestos, con impuestos).</p></li><li><p>Cantidad total.</p></li><li><p>Información geográfica (ciudad, país, continente, ubicación, región).</p></li></ul><p>Para instalar los datos de muestra, abre la página <strong>Integraciones</strong> en Kibana (busca "Integración" en la barra superior de búsqueda) e instala los <strong>Datos de muestra</strong>. Para más detalles, consulta la documentación <a href="https://www.elastic.co/docs/explore-analyze/#gs-get-data-into-kibana">aquí</a>.</p><p>El objetivo de este artículo es mostrar lo fácil que es configurar la CLI Gemini para conectarse a Elasticsearch e interactuar con el índice <strong><code>kibana_sample_data_ecommerce</code></strong> .</p><h2>Cómo usar el MCP de Elasticsearch</h2><p>Puedes comprobar la conexión usando el siguiente comando en Gemini:</p>/mcp list<p>Deberías ver el <strong><code>elastic-agent-builder</code></strong> activado, como se muestra en la Figura 2:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt52b85e7255360f3b/6a17072da929cf33d3ae08f5/1508423bc1d1bc3c04a1cb01e2d59495a3516ed1-1465x844.png" alt="Servidor MCP &quot;elastic-agent-builder&quot; con la lista de herramientas." /><p>Elasticsearch proporciona un conjunto predeterminado de herramientas. Ve la descripción <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/tools/builtin-tools-reference">aquí</a>.</p><p>Con estas herramientas, puedes interactuar con Elasticsearch y hacer preguntas como:</p><ul><li><p><code>Give me the list of all the indexes available in Elasticsearch.</code></p></li><li><p><code>How many customers are based in the USA in the kibana_sample_data_ecommerce index of Elasticsearch?</code></p></li></ul><p>Dependiendo de la pregunta, Gemini usará una o varias de las herramientas disponibles para intentar responderla.</p><h2>Los comandos /elastic</h2><p>En la extensión Elasticsearch para Gemini CLI, también agregamos comandos<strong><code>/elastic</code></strong>.</p><p>Si ejecutas el comando <strong><code>/help</code></strong>, verás todas las opciones <code>/elastic</code> disponibles (Figura 3):</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt741c7451ecab10d2/6a17072ea6c2b9ccd6e79643/5b2a0727ce7a04354878dd048253d3f4d062324b-1983x230.png" alt="Los comandos disponibles de `/elastic`." /><p>Estos comandos pueden ser útiles si quieres ejecutar directamente una herramienta específica del servidor MCP <code>elastic-agent-builder</code>. Por ejemplo, usando el siguiente comando, puedes obtener el mapping del <code>kibana_sample_data_ecommerce</code>:</p>/elastic:get-mapping kibana_sample_data_ecommerce<p>Estos comandos son esencialmente atajos para ejecutar herramientas específicas, en lugar de depender del modelo Gemini para determinar qué herramienta debe invocarse.</p><h2>Cómo usar las habilidades de Elasticsearch</h2><p>Esta extensión también incluye una <a href="https://github.com/elastic/gemini-cli-elasticsearch/tree/main/skills/esql">habilidad de agente para ES|QL</a>, el <a href="https://www.elastic.co/docs/explore-analyze/discover/try-esql">lenguaje de búsqueda Elasticsearch</a> disponible en Elasticsearch. <a href="https://agentskills.io/home">Habilidades del Agente</a> es un formato abierto que proporciona a los agentes de codificación de IA, como Gemini CLI, instrucciones personalizadas para tareas específicas. Utilizan un concepto llamado <em>revelación progresiva</em>, lo que significa que solo se agrega una breve descripción de la habilidad a la indicación inicial del sistema. Cuando le pides al agente que haga una tarea, como consultar Elasticsearch, hace coincidir la solicitud con la habilidad relevante y carga dinámicamente las instrucciones detalladas. Esta es una forma eficaz de gestionar los presupuestos de tokens y, al mismo tiempo, proporcionar a la IA exactamente el contexto que necesita.</p><p>La <strong>habilidad</strong><strong><code>esql</code></strong> está diseñada para permitir que la CLI de Gemini escriba y ejecute consultas en ES|QL directamente en tu cluster. ES|QL es un poderoso lenguaje de búsqueda con barras verticales que hace que la exploración de datos, el análisis de logs y las agregaciones sean sumamente intuitivas. Con esta habilidad activada, no necesitas buscar la sintaxis de ES|QL; simplemente puedes hacer preguntas en lenguaje natural a la CLI de Gemini sobre tus datos, y el agente se encargará del resto.</p><p>Las ejecuciones se efectúan mediante comandos <a href="https://curl.se/">curl</a> sencillos ejecutados en una terminal. Esto es posible porque Elasticsearch ofrece un amplio conjunto de API REST que se pueden utilizar fácilmente para integrar el sistema en cualquier arquitectura.</p><p><strong>Lo que la </strong> habilidad<strong><code>esql</code></strong><strong> ofrece:</strong></p><ul><li><p><strong>Detección de índices y esquemas:</strong> El agente puede usar las herramientas integradas de la habilidad para mostrar los índices disponibles y obtener el mapping de campos. Por ejemplo, antes de escribir una consulta para el set de datos de comercio electrónico, el agente puede ejecutar una verificación de esquema en <strong><code>kibana_sample_data_ecommerce</code></strong> para comprender los campos disponibles, como <strong><code>taxful_total_price</code></strong> o <strong><code>category</code></strong>.</p></li><li><p><strong>Traducción perfecta al lenguaje natural:</strong> la habilidad le da al agente algo más que un simple manual de referencia; proporciona una guía específica para interpretar la intención del usuario. Cuando escribes solicitudes en lenguaje natural, como "Mostrar el tiempo de respuesta promedio agrupado por servicio", el agente utiliza la función de coincidencia de patrones integrada en la habilidad para traducir al instante tus palabras en las agregaciones, filtros y comandos en ES|QL correctos.</p></li><li><p><strong>Autocorrección:</strong> Si una consulta falla (por ejemplo, debido a una incompatibilidad de tipos o un error de sintaxis), la habilidad devuelve la consulta generada junto con el mensaje de error exacto de Elasticsearch, lo que permite al agente corregirla al instante y volver a intentarlo sin que tengas que intervenir.</p></li></ul><p>Dado que la habilidad <code>esql</code> también está disponible como una herramienta en el servidor MCP <code>elastic-agent-builder</code>, necesitamos deshabilitar este servidor momentáneamente. Puedes usar el siguiente comando para desactivarlo:</p>/mcp disable elastic-agent-builder<p>Entonces puedes simplemente escribir un mensaje como este en tu CLI de Gemini:</p>Find the top 5 product categories by total sales revenue in the kibana_sample_data_ecommerce index<p>El agente deberá:</p><ul><li><p>Reconoce la necesidad de la habilidad <code>esql</code> .</p></li><li><p>Verifica el esquema de <strong><code>kibana_sample_data_ecommerce</code></strong>.</p></li><li><p>Construye una consulta en ES|QL, como: <code>FROM kibana_sample_data_ecommerce | STATS total_revenue = SUM(taxful_total_price) BY category.keyword | SORT total_revenue DESC | LIMIT 5</code>.</p></li><li><p>Ejecutar la consulta en la API de Elasticsearch.</p></li><li><p>Presentar la respuesta final directamente en la terminal.</p></li></ul><p>Aquí, presentamos un ejemplo de respuesta de Gemini al mensaje anterior:</p>───────────────────────────────────────────────────────────
&gt; Find the top 5 product categories by total sales revenue in the kibana_sample_data_ecommerce index   ───────────────────────────────────────────────────────────
✓  Activate Skill "esql": Interact with Elasticsearch using ES|QL and curl. Use when querying, managing indices,  …
Skill esql activated. Resources loaded from /home/user/.gemini/extensions/elasticsearch/skills/esql: 
Showing up to 200 items (files + folders).                                                                     /home/user/.gemini/extensions/elasticsearch/skills/esql/                                                            ├───SKILL.md 
└───references/
├───esql-reference.md 
├───generation-tips.md 
└───query-patterns.md

✦ I will start by exploring the mapping of the kibana_sample_data_ecommerce index to identify the fields for product category and sales revenue. Then, I will construct and execute an ES|QL query to determine the top 5 product categories by total sales revenue.

✓  Shell curl -s "${ELASTIC_URL%/}/kibana_sample_data_ecommerce/_mapping" -H "Authorization: ApiKey $(printenv ELAS…                                                                                                                       {  
   "kibana_sample_data_ecommerce": { 
     "mappings": { 
       "properties": {
         "category": { 
           "type": "text", 
           "fields": {
             "keyword": {
               "type": "keyword"
             }
           }
         }, 
         "currency": {
           "type": "keyword"
         }, 

✦ Okay, I have the mapping. The category is products.category.keyword and sales revenue is taxful_total_price. I'll now execute the ES|QL query to get the top 5 categories by revenue.

✓  Shell curl -s -X POST "${ELASTIC_URL%/}/_query" \  -H "Authorization: ApiKey $(printenv ELASTIC_API_KEY)" \  -H …
{ 
   "took": 62,
   "is_partial": false, 
   "completion_time_in_millis": 1772805644164,
   "documents_found": 4675,
   "values_loaded": 12084, 
   "start_time_in_millis": 1772805644102, 
   "expiration_time_in_millis": 1773237644087,  
   "columns": [ 
     { 
       "name": "total_revenue",    
       "type": "double"  
     }, 
     {   
       "name": "products.category.keyword",

✦ The query for top 5 product categories by revenue was successful. I'll format the returned JSON values into a   user-friendly list.

 ✓  Shell 
                             
 Top 5 product categories by total sales revenue: 
 1. Men's Clothing: 149393.91
 2. Women's Clothing: 135099.91
 3. Women's Shoes: 105479.17
 4. Men's Shoes: 91797.92
 5. Women's Accessories: 60830.31 

✦ I've found the answer; now I'll format it for clarity.

 ✓  Shell 

 Here are the top 5 product categories by total sales revenue:                                                        
                                                                      
 | Rank | Category              | Total Revenue | 
 |------|-----------------------|---------------| 
 | 1    | Men's Clothing        | 149,393.91    |
 | 2    | Women's Clothing      | 135,099.91    |
 | 3    | Women's Shoes         | 105,479.17    |
 | 4    | Men's Shoes           | 91,797.92     | 
 | 5    | Women's Accessories   | 60,830.31     | 

✦ I've formatted and presented the answer. I'm finished.
 ───────────────────────────────────────────────────────────<p>Es interesante ver cómo el modelo Gemini genera la respuesta final mostrando todos los pasos que sigue. Aquí, puedes ver claramente la influencia de la habilidad en el proceso de razonamiento del modelo. La primera vez que el modelo reconoce que necesita usar una habilidad o ejecutar un comando de shell, pide permiso empleando el enfoque de intervención humana.</p><p>Al manejar el trabajo pesado de descubrimiento de esquemas, generación de consultas y ejecución, la habilidad <code>esql</code> te permite concentrarte completamente en las respuestas en lugar de en la mecánica para obtenerlas. Obtendrás los datos que necesitas, correctamente formateados y directamente en tu terminal, todo sin escribir una sola línea de sintaxis o cambiar de contexto a otra aplicación.</p><h2>Conclusión</h2><p>En este artículo, presentamos la extensión Elasticsearch para Gemini CLI que lanzamos recientemente. Esta extensión te permite interactuar con tu instancia de Elasticsearch mediante Gemini y el servidor MCP de Elasticsearch que ofrece Elastic Agent Builder, disponible a partir de la versión 9.3.0, así como el comando <code>/elastic</code> .</p><p>Además, la extensión también incluye una habilidad <code>esql</code> que convierte la solicitud del usuario de lenguaje natural en una consulta en ES|QL. Esta habilidad puede resultar especialmente útil cuando no se puede usar el servidor MCP, ya que la comunicación subyacente se gestiona mediante simples comandos curl ejecutados en una terminal. Elasticsearch ofrece un amplio conjunto de API REST que se pueden integrar fácilmente en cualquier proyecto. Esto es especialmente útil cuando se desarrollan aplicaciones de AI agéntica.</p><p>Para más información sobre nuestra extensión Gemini CLI, visita el repositorio del proyecto <a href="https://github.com/elastic/gemini-cli-elasticsearch">aquí</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/gemini-cli-extension-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/gemini-cli-extension-elasticsearch</guid>
    <category><![CDATA[Integraciones]]></category>
    <category><![CDATA[Agentic AI]]></category>
    <dc:creator><![CDATA[Walter Rafelsberger,Enrico Zimuel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ff43abe550941b4/6a17072ba29299fc2ad00fa4/6dfcec4a77b3dc83bf0d974417bf2e211abb1f4f-876x468.png" length="0" type="image/png"/>
    <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Introducción del soporte de Elasticsearch en Google MCP Toolbox for Databases]]></title>
    <description><![CDATA[Descubre cómo el soporte de Elasticsearch ya está disponible en Google MCP Toolbox for Databases y aprovecha las herramientas ES|QL para integrar de forma segura tu índice con cualquier cliente MCP.]]></description>
    <content:encoded><![CDATA[<p>En este artículo, explicaremos cómo usar Google MCP Toolbox con <a href="https://github.com/elastic/elasticsearch">Elasticsearch</a> para crear una herramienta sencilla que permita extraer información de un índice de Elasticsearch.</p><p>Recientemente contribuimos al proyecto open source <a href="https://github.com/googleapis/genai-toolbox">Google MCP Toolbox for Databases</a> agregando soporte para Elasticsearch como base de datos.</p><p>Con esta nueva característica, ahora puedes usar Google MCP Toolbox para conectarte a Elasticsearch y “conversar” directamente con tus datos.</p><h2>Elasticsearch</h2><p>Es necesario tener una instancia de Elasticsearch en funcionamiento. Puedes activar una prueba gratuita en <a href="https://www.elastic.co/cloud">Elastic Cloud</a> o instalarla localmente utilizando el script <a href="https://github.com/elastic/start-local">start-local</a>:</p>curl -fsSL https://elastic.co/start-local | sh<p>Esto instalará Elasticsearch y Kibana en tu computadora y generará una clave API que se utilizará para configurar Google MCP Toolbox.</p><p>La clave de API se mostrará como salida del comando anterior y se almacenará en un archivo .env. en la carpeta elastic-start-local.</p><h2>Instala el set de datos de ejemplo</h2><p>Tras la instalación, puedes iniciar sesión en Kibana con el nombre de usuario <em>elastic</em> y la contraseña generada por el script start-local (almacenada en un archivo .env).</p><p>Puedes instalar el conjunto de datos de <strong>pedidos de comercio electrónico </strong>disponible desde Kibana. Incluye un único índice llamado <strong>kibana_sample_data_ecommerce</strong> que contiene información sobre 4675 pedidos de un sitio web de comercio electrónico. Para cada pedido, tenemos la siguiente información:</p><ul><li><p>Información del cliente (nombre, identificación, fecha de nacimiento, correo electrónico, etc.)</p></li><li><p>Fecha del pedido</p></li><li><p>ID de pedido</p></li><li><p>Productos (lista de todos los productos con precio, cantidad, identificación, categoría, descuento, etc.)</p></li><li><p>SKU</p></li><li><p>Precio total (sin impuestos, con impuestos)</p></li><li><p>Cantidad total</p></li><li><p>Información geográfica (ciudad, país, continente, ubicación, región)</p></li></ul><p>Para instalar los datos de muestra, abre la página <strong>Integraciones</strong> en Kibana (busca “Integración” en la barra superior de búsqueda) e instala los “Datos de muestra”. Para obtener más detalles, consulta la documentación aquí: <a href="https://www.elastic.co/docs/explore-analyze/#gs-get-data-into-kibana">https://www.elastic.co/docs/explore-analyze/#gs-get-data-into-kibana</a>.</p><p>El objetivo de este artículo es mostrar lo fácil que es configurar Google MCP Toolbox para conectarse a Elasticsearch e interactuar con el <strong>índice de kibana_sample_data_ecommerce</strong> usando lenguaje natural.</p><h2>Google MCP Toolbox</h2><p>Google MCP Toolbox es un servidor MCP open source diseñado para facilitar la interacción segura y eficiente de aplicaciones y agentes de IA con bases de datos. El proyecto, anteriormente conocido como el “GenAI Toolbox for Databases”, cambió su denominación después de adoptar la compatibilidad total con el <a href="https://www.anthropic.com/news/model-context-protocol">Protocolo de contexto de modelo</a> (MCP). Su propósito es eliminar el trabajo pesado que tradicionalmente se requiere al conectar agentes con bases de datos, gestionando la agrupación de conexiones, autenticación, observabilidad y otras preocupaciones operativas en segundo plano.</p><p>Esencialmente, Toolbox permite a los desarrolladores definir herramientas reutilizables de alto nivel que encapsulan las interacciones con la base de datos. Estas herramientas pueden ser invocadas por cualquier cliente compatible con MCP (como un agente de IA) sin requerir que el cliente implemente consultas SQL de bajo nivel o administre conexiones de base de datos. Este enfoque reduce drásticamente la cantidad de código repetitivo necesario para crear agentes compatibles con bases de datos, lo que permite integrar operaciones de datos avanzadas en solo unas pocas líneas de lógica de aplicación. Una vez definida una herramienta, se puede compartir entre varios agentes, marcos de trabajo o lenguajes (Figura 1).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte90070297ee83546/6a16fa29964cea694b08b972/137cea290bb70ad5da21853f9a6358cef4cf7451-1248x1056.png" alt="" /><p>Una de las ventajas principales de usar la Toolbox es el modelo de seguridad integrado. Los flujos de autenticación como OAuth2 y OIDC son compatibles de forma nativa, lo que permite a los desarrolladores evitar manejar o almacenar credenciales confidenciales de bases de datos en agentes. La plataforma también ofrece características de observabilidad (como métricas y rastreo) a través de OpenTelemetry, que es esencial para la depuración, la supervisión y los despliegues de producción. En conjunto, MCP Toolbox sirve como una interfaz unificada, segura y extensible para interactuar con tus datos desde cualquier sistema compatible con MCP.</p><h2>Cómo instalar MCP Toolbox</h2><p>Puedes instalar el servidor MCP Toolbox en Linux usando el siguiente comando:</p>export VERSION=0.21.0
curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
chmod +x toolbox<p>Si quieres instalarlo en macOS o Windows, puedes seguir las instrucciones <a href="https://googleapis.github.io/genai-toolbox/getting-started/introduction/#installing-the-server">detalladas aquí</a>.</p><h2>Configura la Toolbox para Elasticsearch</h2><p>Para configurar el MCP Toolbox para Elasticsearch, necesitamos crear un archivo <strong>tools.yaml</strong>, de la siguiente manera:</p>sources:
  my-cluster:
    kind: elasticsearch
    addresses:
      - http://localhost:9200
    apikey: &lt;insert-here-api-key&gt;

tools:
  customer-orders:
    kind: elasticsearch-esql
    source: my-cluster
    description: Get the orders made by a customer identified by name.
    query: |
    	FROM kibana_sample_data_ecommerce | WHERE MATCH(customer_full_name, ?name, {"operator": "AND"})
    parameters:
      - name: name
        type: string
        description: The customer name.

toolsets:
  elasticsearch-tools:
    - customer-orders<p>Debes reemplazar el valor <strong>&lt;insert-here-api-key&gt;</strong> por una clave API válida de Elasticsearch. Si estás ejecutando Elasticsearch localmente usando start-local, puedes encontrar la clave de API en el archivo.env generado por start-local, bajo la variable <strong>ES_LOCAL_API_KEY</strong> . Si usas Elastic Cloud, puedes generar una clave API siguiendo el procedimiento <a href="https://www.elastic.co/docs/deploy-manage/api-keys/elastic-cloud-api-keys">descrito aquí</a>.</p><p>Las herramientas anteriores contienen la siguiente consulta ES|QL para Elasticsearch:</p><p>Si no estás familiarizado con ES|QL, es un lenguaje de búsqueda desarrollado por Elastic, similar a SQL, que puedes usar para buscar en uno o más índices. Puedes leer más sobre ES|QL en la documentación oficial <a href="https://www.elastic.co/docs/reference/query-languages/esql">aquí</a>.</p><p>La búsqueda anterior busca todos los pedidos almacenados en el <strong>índice kibana_sample_data_ecommerce</strong> que contienen el nombre del cliente especificado, usando el parámetro <strong>?name</strong> (el signo de interrogación indica un parámetro).</p><p>El nombre del cliente se define en la configuración YAML anterior empleando el texto de tipo y la descripción "El nombre del cliente".</p><p>Esta herramienta se puede usar para responder preguntas sobre los pedidos de un cliente, por ejemplo: <em>¿Cuántos pedidos realizó el cliente Foo en octubre de 2025?</em></p><p>Las descripciones de las herramientas y sus parámetros son esenciales para extraer la información relevante de la solicitud en lenguaje natural del usuario. Esta extracción se realiza utilizando la capacidad de <strong>llamada de función</strong> de un modelo de lenguaje grande (LLM). En la práctica, un LLM puede determinar qué función (herramienta) debe ejecutar para obtener la información necesaria, junto con los parámetros apropiados para esa función.</p><p>Para más información sobre las llamadas a funciones, sugerimos leer el artículo de <a href="https://www.elastic.co/search-labs/blog/function-calling-with-elastic">OpenAI sobre llamadas a funciones con Elasticsearch</a> de Ashish Tiwari.</p><h2>Ejecuta el servidor de Toolbox</h2><p>Puedes ejecutar la MCP Toolbox usando el archivo tools.yaml anterior con el siguiente comando:</p>./toolbox --tools-file tools.yaml --ui<p>El parámetro<strong> –ui</strong> ejecuta una aplicación sitio web en <a href="http://127.0.0.1:5000/ui">http://127.0.0.1:5000/ui</a> (Figura 2).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0fb3953fae603572/6a16fa2aa6c2b92763e794fb/3caf2339b632bafd5847af1ed8b33b518a25b8a2-1600x314.png" alt="" /><p>Puedes seleccionar la <strong>Herramientas</strong> &gt; <strong>pedidos-clientes</strong> e insertar un nombre de cliente en el parámetro <strong>nombre</strong> (por ejemplo, Gwen Sanders) y haz clic en el botón <strong>Ejecutar herramienta</strong>. Deberías ver una respuesta JSON como se indica en la Figura 3.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltca02df8c78cb39ff/6a16fa2c961e6909b5c4cd22/b167e0142afb8919d9cedf6d0fa431d33d0e55f8-1600x933.png" alt="" /><p>La configuración se ha completado y MCP Toolbox puede ejecutar la herramienta de <strong>pedidos de clientes</strong> para comunicarse con Elasticsearch, ejecutando la consulta ES|QL.</p><h2>Usar la herramienta MCP Toolbox con Gemini CLI</h2><p>Podemos usar cualquier cliente del MCP para comunicarnos con MCP Toolbox for Database. Por ejemplo, podemos usar <a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a>, una herramienta de línea de comandos, para usar Gemini. Puedes instalar Gemini CLI siguiendo las instrucciones indicadas <a href="https://geminicli.com/docs/get-started/installation/">aquí</a>.</p><p>Gemini CLI ofrece una extensión preconfigurada para MCP Toolbox, disponible en <a href="https://github.com/gemini-cli-extensions/mcp-toolbox">gemini-cli-extensions/mcp-toolbox</a>. Puedes instalar esta extensión ejecutando el comando siguiente:</p>gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox<p>Tras la instalación, debes ir al directorio donde almacenaste el archivo de configuración tools.yaml para MCP Toolbox y ejecutar la CLI Gemini de la siguiente manera (este paso es necesario para que la CLI Gemini se configure automáticamente con MCP Toolbox):</p>gemini<p>Deberías ver un anuncio de salida como el que se muestra en la Figura 4.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf7245c10b9e32cd6/6a16fa2d964cea073208b976/0f22df6d3da13c1dc50dcb560414fa7c630eb9a7-1434x341.png" alt="" /><p>Puedes comprobar si MCP Toolbox está conectada usando el siguiente comando:</p>/mcp list<p>Deberías ver el <strong>mcp_toolbox</strong> con las herramientas de<strong> customer-orders</strong> listadas (Figura 5).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte857b42dbe604203/6a16fa2f8b73cb531b189e33/97edbc40de9e44f469f6f3a09427532be167de0e-493x155.png" alt="" /><p>Si el MCP Toolbox está conectado a la CLI de Gemini, ahora podemos intentar hacer algunas preguntas, como: “<em>Dame los pedidos del cliente Gwen Sanders</em>”. La CLI de Gemini solicitará entonces permiso para ejecutar la herramienta de pedidos de clientes desde el servidor mcp_toolbox (ver Figura 6).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfb7ea752c1a39da7/6a16fa30cdacbfdf937d27ff/c052f3b5e49436903b804280c0065f67ee02444b-1432x284.png" alt="" /><p>Tras la confirmación, Gemini CLI ejecutará la solicitud a MCP Toolbox, obteniendo una respuesta JSON como resultado y utilizándola para dar formato a la respuesta (Figura 7).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb9f6e04987137a9f/6a16fa320811ae2297e9fef7/7ea5128f1705951c2757af6da4b456d394d4a080-1432x734.png" alt="" /><p>La respuesta de Gemini CLI será un reporte que indica que Gwen Sanders hizo solo un pedido de 2 productos, por un precio total de 132 euros.</p><h2>SDK de MCP Toolbox</h2><p>Google MCP Toolbox también ofrece un SDK para acceder a todas las funcionalidades desde un programa escrito en Go, Python y Javascript.</p><p>Por ejemplo, el SDK de Python está disponible en Github en la siguiente página: <a href="https://github.com/googleapis/mcp-toolbox-sdk-python">https://github.com/googleapis/mcp-toolbox-sdk-python</a>.</p><p>Es necesario crear un agente simple para conectarnos a MCP Toolbox. Debemos instalar los siguientes paquetes:</p>pip install toolbox-core
pip install google-adk<p>Además, crear un nuevo proyecto de agente usando los siguientes comandos:</p>adk create my_agent<p>Esto creará un nuevo directorio llamado <strong>my_agent</strong> con un <strong>archivo agent.py</strong>.</p><p>Actualiza <strong>my_agent/agent.py</strong> con el siguiente contenido para conectar con Toolbox:</p>from google.adk import Agent
from google.adk.apps import App
from toolbox_core import ToolboxSyncClient

client = ToolboxSyncClient("http://127.0.0.1:5000")

root_agent = Agent(
    name='root_agent',
    model='gemini-2.5-flash',
    instruction="You are a helpful AI assistant designed to search information about a dataset of ecommerce orders.",
    tools=client.load_toolset(),
)

app = App(root_agent=root_agent, name="my_agent")<p>Crea un archivo <strong>.env</strong> con tu clave de API de Google:</p>echo 'GOOGLE_API_KEY="YOUR_API_KEY"' &gt; my_agent/.env<p>Finalmente, podemos ejecutar el agente y observar los resultados. Para ejecutar el agente, puedes ejecutar el siguiente comando:</p>adk run my_agent<p>O bien, puedes servirlo a través de una interfaz web:</p>adk web --port 8000<p>En ambos casos, puedes interactuar con MCP Toolbox usando una interfaz de preguntas frecuentes. Por ejemplo, puedes hacer la pregunta anterior: <em>Dame las órdenes de la cliente Gwen Sanders</em>.</p><p>Para más información sobre los diferentes SDK, puedes consultar <a href="https://googleapis.github.io/genai-toolbox/sdks/">esta página de documentación</a>.</p><h2>Conclusión</h2><p>En este artículo, hemos mostrado la integración de Elasticsearch con Google MCP Toolbox for Databases. Mediante un sencillo archivo de configuración YAML, podemos definir un conjunto de herramientas que traducen preguntas en lenguaje natural a consultas de Elasticsearch utilizando el lenguaje ES|QL.</p><p>Mostramos cómo interactuar con el set de datos kibana_sample_data_ecommerce, que contiene pedidos de un sitio web de comercio electrónico. Con este archivo de configuración, podemos simplemente ejecutar el servidor MCP Toolbox y conectarnos a él desde cualquier cliente MCP.</p><p>Por último, mostramos cómo utilizar la CLI de Gemini como cliente para conectarse a MCP Toolbox for Databases y consultar los datos de comercio electrónico almacenados en Elasticsearch. Ejecutamos una consulta en lenguaje natural para recuperar información sobre pedidos para un cliente específico identificado por su nombre.</p><p>A medida que el ecosistema MCP sigue creciendo, este patrón (definiciones ligeras de herramientas respaldadas por infraestructuras seguras y listas para producción) crea nuevas oportunidades para construir agentes cada vez más capaces y conscientes de los datos con un esfuerzo mínimo. Ya sea que experimentes localmente con los sets de datos de muestra de Elastic o integres capacidades de búsqueda en una aplicación más amplia, MCP Toolbox ofrece una base fiable y extensible para interactuar con tus datos de Elasticsearch usando lenguaje natural.</p><p>Para obtener más información sobre el desarrollo de aplicaciones de IA agentic, puedes leer el artículo <a href="https://search-labs-redesign.vercel.app/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">Creación de flujos de trabajo de IA agentic con Elasticsearch</a> de Anish Mathur y Dana Juratoni.</p><p>Para obtener más información sobre Google MCP Toolbox, puedes visitar <a href="https://googleapis.github.io/genai-toolbox/getting-started/introduction/">https://googleapis.github.io/genai-toolbox/getting-started/introduction/</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/google-mcp-toolbox-elasticsearch-support</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/google-mcp-toolbox-elasticsearch-support</guid>
    <category><![CDATA[ES|QL]]></category>
    <category><![CDATA[Agentic AI]]></category>
    <dc:creator><![CDATA[Enrico Zimuel,Laurent Saint-Félix]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt72d49893c51407cf/6a16fa33cf4f2502bab2cf7e/425a48691f436ed47c9bdfaf5d561ac122b2c472-1062x668.png" length="0" type="image/png"/>
    <pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[De ES|Objetos de QL a PHP]]></title>
    <description><![CDATA[Aprende a ejecutar y gestionar ES|Consultas QL en PHP. Sigue esta guía para mapear ES|QL resulta en un objeto PHP o clase personalizada.]]></description>
    <content:encoded><![CDATA[<p>A partir de <a href="https://github.com/elastic/elasticsearch-php/releases/tag/v8.13.0">elasticsearch-php v8.13.0</a> puedes ejecutar <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a> consulta y mapea el resultado a un objeto PHP de <a href="https://www.php.net/manual/en/class.stdclass.php">stdClass</a> o a una clase personalizada.</p><h2>ES|QL</h2><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a> es un nuevo lenguaje de consulta Elasticsearch introducido en Elasticsearch 8.11.0. Ahora mismo, está disponible en vista previa técnica. Proporciona una forma poderosa de filtrar, transformar y analizar los datos almacenados en Elasticsearch.</p><p>Emplea "tuberías" (<code>|</code>) para manipular y transformar datos paso a paso. Este enfoque permite a los usuarios componer un serial de operaciones, donde la salida de una operación se convierte en la entrada para la siguiente, permitiendo transformaciones y análisis complejos de datos.</p><p>Por ejemplo, la siguiente consulta devuelve los primeros 3 documentos (filas) del índice <code>sample_data</code> :</p>FROM sample_data
| LIMIT 3
<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b0310cb335872b7/6a17d7eab1e113258679f0df/c23aee777bacdf90c63b717fd9458207dfc0511d-864x284.png" alt="ES|QL produce tablas" /><h2>Caso de uso: ES|Funciones de QL en el cliente oficial de PHP</h2><p>Para ilustrar el ES|Características de QL desarrolladas en el cliente oficial de PHP, almacenamos en Elasticsearch un <a href="https://github.com/elastic/elasticsearch-php-examples/blob/main/examples/ESQL/data/books.csv">archivo CSV</a> de 81.828 libros (54,4 MB) incluyendo la siguiente información:</p>Title;Descrition;Author;Year;Publisher;Ratings
<p>Extrajimos esta lista del <a href="https://www.kaggle.com/datasets/mohamedbakhet/amazon-books-reviews">conjunto de datos de Amazon Books Reviews</a>, disponible al público.</p><p>Creamos un índice <code>books</code> con los siguientes mapeos de Elasticsearch:</p>'mappings' : {
    'properties': {
        'title': {
            'type': 'text'
        },
        'description': {
            'type': 'text'
        },
        'author': {
            'type': 'text'
        },
        'year': {
            'type': 'short'
        },
        'publisher': {
            'type': 'keyword'
        },
        'rating': {
            'type': 'half_float'
        }
    }
}
<p>El valor <code>rating</code> es la media de las reseñas de clasificación tomadas del <a href="https://www.kaggle.com/datasets/mohamedbakhet/amazon-books-reviews?select=Books_rating.csv">archivo Books_rating.csv</a> de 2,9 GB.</p><p><a href="https://github.com/elastic/elasticsearch-php-examples/blob/main/examples/ESQL/bulk.php">Aquí</a> puedes encontrar el script PHP que usamos para importar en masa todos los libros en Elasticsearch. La operación a granel consumía 7 segundos y 28 MB de RAM usando PHP 8.2.17. Con el mapeo propuesto, el tamaño del índice en Elasticsearch es de unos 62 MB.</p><h2>Mapa ES|Resultados QL a un objeto PHP o clase personalizada</h2><p>Podemos ejecutar ES|Consulta QL en PHP usando el punto final <code>esql()-&gt;query()</code> . El resultado de esta consulta es una estructura de datos de tabla. Esto se expresa en JSON usando los campos <code>columns</code> y <code>values</code> . En el campo <code>columns</code> tenemos la definición de <code>name</code> y <code>type</code> .</p><p>Aquí tienes un ejemplo de ES|Consulta QL para recuperar los 10 mejores libros escritos por Stephen King ordenados por las reseñas de ranking de usuarios:</p>$query = &lt;&lt;&lt;EOD
    FROM books
    | WHERE author == "Stephen King"
    | SORT rating DESC
    | LIMIT 10
EOD;

$result = $client-&gt;esql()-&gt;query([
    'body' =&gt; ['query' =&gt; $query]
]);
<p>El resultado JSON de Elasticsearch es el siguiente:</p>{
    "columns": [
        { "name": "author", "type": "text" },
        { "name": "description", "type": "text" },
        { "name": "publisher", "type": "keyword" },
        { "name": "rating", "type": "double" },
        { "name": "title", "type": "text" },
        { "name": "year", "type": "integer" }
    ],
    "values": [
        [
            "Stephen King",
            "The author ...",
            "Turtleback",
            5.0,
            "How writers write",
            2002
        ],
        [
            "Stephen King",
            "In Blockade Billy, a retired coach...",
            "Simon and Schuster",
            5.0,
            "Blockade",
            2010
        ],
        [
            "Stephen King",
            "A chilling collection of twenty horror stories.",
            "Signet Book",
            4.55859375,
            "Night Shift (Signet)",
            1979
        ],
        ...
    ]
}
<p>En este ejemplo tenemos 6 propiedades (autor, descripción, editor, valoración, título, año) relacionadas con un libro y 10 resultados, todos libros de Stephen King.</p><p>Una lista de todos los tipos soportados en ES|Aquí <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-limitations.html#esql-supported-types">se</a> informa de QL.</p><p>El objeto de respuesta <code>$result</code> puede acceder como un array, una cadena o un objeto ( <a href="https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/connecting.html#client-usage">ver aquí</a> para más información).</p><p>Usando la interfaz objeto, podemos acceder a los valores mediante propiedades e índices. Por ejemplo, <code>$result-&gt;values[0][4]</code> devuelve el título (4) del primer libro (0) en la lista, <code>$result-&gt;values[1][3]</code> devuelve el puntaje de rango (3) del segundo libro (1), etc. Recuerda, el índice de un array en PHP empieza desde cero.</p><p>Esta interfaz puede ser suficientemente buena para algunos casos de uso, pero la mayoría de las veces nos gustaría tener una variedad de objetos como resultado.</p><p>Para mapear el resultado en un array de objetos podemos usar la nueva función <a href="https://github.com/elastic/elasticsearch-php/issues/1398">mapTo()</a> de elasticsearch-php.</p><p>Esta función está disponible directamente en el <a href="https://github.com/elastic/elasticsearch-php/blob/main/src/Response/Elasticsearch.php">objeto de respuesta Elasticsearch</a>. Eso significa que puedes acceder a él de la siguiente manera:</p>$books = $result-&gt;mapTo(); // Array of stdClass
foreach ($books as $book) {
    printf(
        "%s, %s, %d, Rating: %.2f\n",
        $book-&gt;author,
        $book-&gt;title,
        $book-&gt;year,
        $book-&gt;rating
    );
}
<p>Si tienes una clase Book personalizada, puedes mapear el resultado usándola de la siguiente manera:</p>class Book
{
    public string $author;
    public string $title;
    public string $description;
    public int $year;
    public float $rating;
}

$books = $result-&gt;mapTo(Book::class); // Array of Book
<p>Si tu clase tiene otras propiedades además de las incluidas en el ES|Resultado QL, esto también funcionará. La función <code>mapTo()</code> usará solo las propiedades devueltas como columnas del ES|Resultado de QL.</p><p>Puedes descargar todos los ejemplos que se mencionan en <a href="https://github.com/elastic/elasticsearch-php-examples/tree/main/examples/ESQL">este artículo aquí</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/esql-php-map-object-class</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/esql-php-map-object-class</guid>
    <category><![CDATA[ES|QL]]></category>
    <category><![CDATA[PHP]]></category>
    <dc:creator><![CDATA[Enrico Zimuel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt99f5ab85c0713977/6a17d7ebfbc5f8072b491918/aea56270f48cb64130d1b515b983434e0960dc2f-500x500.png" length="0" type="image/png"/>
    <pubDate>Mon, 08 Apr 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>