<?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/jp/search-labs/author/enrico-zimuel</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/enrico-zimuel</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/enrico-zimuel.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 11:48:25 GMT</lastBuildDate>
  <item>
    <title><![CDATA[MastraとElasticsearchを使用してエージェント型AIアプリケーションを構築する方法]]></title>
    <description><![CDATA[MastraとElasticsearchを使用してエージェント型AIアプリケーションを構築する方法を実例を通じて学びましょう。]]></description>
    <content:encoded><![CDATA[<p>この記事では、<a href="https://mastra.ai/">Mastra</a> TypeScriptフレームワークを使用して、<a href="https://www.elastic.co/elasticsearch">Elasticsearch</a>と連携するエージェント型アプリケーションを構築する方法をご紹介します。</p><p>最近、<a href="https://github.com/mastra-ai/mastra">mastra-ai/mastra</a>オープンソースプロジェクトに、ベクトルデータベースとしてのElasticsearchのサポートを追加しました。この新機能により、MastraでElasticsearchをネイティブに使用して埋め込みを保存できます。ベクターに加えて、Elasticsearchはコンテキストエンジニアリングの要件を満たすための高度な機能群を提供します（例：<a href="https://www.elastic.co/search-labs/blog/context-engineering-hybrid-search-evolution-agentic-ai">ハイブリッド検索と再ランク付け</a>）。</p><p>この記事では、Elasticsearchを使用したRetrieval-Augmented Generation（RAG）アーキテクチャを実装するエージェントの作成について詳しく説明します。エージェント的なアプローチを使用して、Elasticsearchに保存されているSF映画データのコーパスを操作するデモプロジェクトを紹介します。このプロジェクトは<a href="https://github.com/elastic/mastra-elasticsearch-example">elastic/mastra-elasticsearch-example</a>で入手できます。</p><h2>Mastra</h2><p>Mastraは、エージェント型AIアプリケーションを作成するためのTypeScriptフレームワークです。</p><p>Mastraのプロジェクト構造は以下のようになります：</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>Mastraでは、<a href="https://mastra.ai/docs/agents/overview">エージェント</a>、<a href="https://mastra.ai/docs/agents/using-tools">ツール</a>、<a href="https://mastra.ai/docs/workflows/overview">ワークフロー</a>、<a href="https://mastra.ai/docs/evals/overview">スコア</a>を作成できます。</p><p><strong>エージェント</strong>は、インプットとしてメッセージを受け取り、アウトプットとして回答を生成するクラスです。エージェントは、ツール、大規模言語モデル（LLM）、およびメモリを使用できます（図1）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f7484f7501997dc/6a170417cdacbffb5a7d28f6/f6aca2dcc7fcc45d25e06681649be1b2b7eb6781-706x721.png" alt="Mastraでエージェントがどのように動作するかを示す図です。" /><p>エージェントの<strong>ツール</strong>は、「外部の世界」と対話することを可能にします。たとえば、ウェブAPIと通信したり、Elasticsearchにクエリを実行するような内部操作を行ったりします。<strong>メモリ</strong>コンポーネントは、過去の入力と出力を含む会話の履歴を格納するために非常に重要です。この格納されたコンテキストにより、エージェントは過去の対話を活用して、将来の質問に対してより情報に基づいた関連性の高い回答を提供できます。</p><p><strong>ワークフロー</strong>を使用すると、単一のエージェントの推論に頼るのではなく、明確で構造化されたステップを使用して複雑なタスクのシーケンスを定義できます（図2）。タスクをどのように分割し、データをどのように移動させ、何をいつ実行するかを網羅的に制御できます。ワークフローは、デフォルトで組み込みの実行エンジンを使用して実行されますが、<a href="https://mastra.ai/docs/deployment/workflow-runners">ワークフローランナー</a>にデプロイすることもできます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd82ea661569e1018/6a170419dc55de3adde00cc9/0dce161cf7891207015dc87532b5b90df1822432-880x252.png" alt="Mastraのワークフローの例。" /><p>Mastraでは、スコアを定義することもできます。スコアは、モデル評価、ルールベース、統計的な方法を用いてエージェントの出力を評価する自動テストです。スコアラーは<em>スコア</em>を返します。これは、出力が評価基準をどれだけ満たしているかを定量化する数値（通常0から1の間）です。これらのスコアにより、パフォーマンスを客観的に追跡し、さまざまなアプローチを比較し、AIシステムの改善すべき分野を特定することができます。スコアラーは、独自のプロンプトやスコアリング関数でカスタマイズできます。</p><h2>Elasticsearch</h2><p>デモプロジェクトを実行するには、Elasticsearchインスタンスを実行する必要があります。<a href="https://www.elastic.co/cloud">Elastic Cloud</a>で無料トライアルを有効化するか、<a href="https://github.com/elastic/start-local"><code>start-local</code></a>スクリプトを使ってローカルにインストールできます。</p>curl -fsSL https://elastic.co/start-local | sh<p>これにより、ElasticsearchとKibanaがコンピュータにインストールされ、Mastraインテグレーションの設定に使用するAPIキーが生成されます。</p><p>APIキーは前のコマンドの出力として表示され、elastic-start-localフォルダー内の<strong>.env</strong>ファイルに保存されます。</p><h2>デモをインストールして設定</h2><p>デモプロジェクトのソースコードを含む <a href="https://github.com/elastic/mastra-elasticsearch-example">elastic/mastra-elasticsearch-example</a> リポジトリを作成しました。リポジトリに記載されている例は、Elasticsearchからドキュメントを取得するためのRAGアーキテクチャを実装したエージェントをMastraで作成する方法を示しています。</p><p>SF映画のデモ用データセットを提供しました。<a href="https://www.kaggle.com/datasets/rajugc/imdb-movies-dataset-based-on-genre/versions/2?select=scifi.csv">Kaggle</a>上のIMDbデータセットから500本の映画を抽出しました。</p><p>最初のステップは、次のコマンドを使用してnpmでプロジェクトの依存関係をインストールします：</p>npm install<p>次に、設定内容を格納する<strong>.env</strong>ファイルを構成する必要があります。以下のコマンドを使用して、 <strong>.env.example</strong>ファイルの構造をコピーすることで、このファイルを生成できます。</p>cp .env.example .env<p>これで、.envを編集できるようになりました。不足している情報を追加します：</p>OPENAI_API_KEY=
ELASTICSEARCH_URL=
ELASTICSEARCH_API_KEY=
ELASTICSEARCH_INDEX_NAME=scifi-movies<p>Elasticsearchインデックスの名称は <strong><code>scifi-movies</code></strong>です。必要であれば、環境変数 <code>ELASTICSEARCH_INDEX_NAME</code>を使って変更できます。</p><p>OpenAIを埋め込みサービスとして使用しました。これは、<code>OPENAI_API_KEY</code>環境変数にOpenAIのAPIキーを提供する必要があることを意味します。</p><p>例で使用されている埋め込みモデルは <a href="https://developers.openai.com/api/docs/models/text-embedding-3-small">openai/text-embedding-3-small</a> であり、埋め込み次元は1,536です。</p><p>最終的な答えを導き出すために、<a href="https://developers.openai.com/api/docs/models/gpt-5-nano">openai/gpt-5-nano</a> モデルを使用してコストを削減しました。</p><p>RAGアーキテクチャでは、回答の妥当性を検証するという重労働は検索コンポーネント（この場合は Elasticsearch）が行うため、それほど強力ではない（そして一般的に安価な）最終的なLLMモデルを使用することができます。</p><p>小規模なLLMは主に2つのタスクを担当します：</p><ul><li><p><strong>クエリの言い換え/埋め込み：</strong>ユーザーの自然言語の質問をセマンティック検索用のベクトル埋め込みに変換します。</p></li><li><p><strong>回答の合成：</strong>取得された関連性の高いコンテキストの断片（文書/動画）を取り出し、提示された指示に従って、首尾一貫した最終的な人間が読める回答に合成します。</p></li></ul><p>RAGプロセスは回答に必要とされる<strong>正確な事実的文脈を提供する</strong>ため、最終的なLLMは大規模または高度に複雑である必要はなく、必要な知識をすべて自らのパラメータ内に持つ必要もありません（それは大規模で高価なモデルが優れている領域です）。本質的には、本格的なナレッジベースとしてではなく、Elasticsearchが提供するコンテキストの洗練されたテキストサマライザーおよびフォーマッターとして機能します。これにより、コストやレイテンシーの最適化に<code>gpt-5-nano</code>のようなモデルを活用できます。</p><p>.envファイルの設定後、次のコマンドで映画をElasticsearchに取り込むことができます。</p>npx tsx src/utility/store.ts<p>次のような出力が表示されるはずです。</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>scifi-moviesインデックスのマッピングには、次のフィールドが含まれています。</p><ul><li><p><strong>埋め込み</strong>、1536次元のdense_vector、コサイン類似度。</p></li><li><p><strong>説明</strong>、映画の説明を含むテキスト。</p></li><li><p><strong>監督</strong>、監督の名前を含むテキスト。</p></li><li><p><strong>タイトル</strong>、映画のタイトルを含むテキスト。</p></li></ul><p>タイトルとディスクリプションを使用して埋め込みを生成しました。タイトルとディスクリプションは2つの別個のフィールドであるため、両者を連結することで、結果として得られる埋め込みベクトルが、映画の具体的で独自の特徴（タイトル）と豊かな説明的コンテキスト（内容説明）の両方を捉えることができます。これにより、より正確で包括的なセマンティック検索結果が得られます。この結合されたインプットにより、埋め込みモデルは類似度マッチングに向けて、ドキュメントのコンテンツをより適切に単一のベクトル表現として捉えることができます。</p><h2>デモを実行</h2><p>次のコマンドでデモを実行できます：</p>npm run dev<p>このコマンドを実行すると<strong>localhost:4111</strong>でWebアプリケーションが起動し、Mastra Studioにアクセスできるようになります（図3）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8a539df677a33b36/6a17041a47d49c36842d88a0/1567e309df21a12bcf1dfef4429f82342549956c-1705x1079.png" alt="Elasticsearch Agentの例を使用したMastra Studioのスクリーンショット。" /><p><a href="https://mastra.ai/docs/getting-started/studio">Mastra Studio</a> はエージェントの構築とテストのためのインタラクティブなUIを提供し、さらにMastraアプリケーションをローカルサービスとして公開するREST APIも備えています。これにより、統合を気にせずにすぐに構築を始められます。</p><p>Elasticsearchを使ったセマンティック検索を実行するツールとして、Mastraの<a href="https://mastra.ai/reference/tools/vector-query-tool">createVectorQueryTool</a>を使った<strong>Elasticsearch Agent</strong>を提供しました。このエージェントは、RAGアプローチを使用して関連文書（つまり映画）を検索し、ユーザーの質問に答えます。</p><p>このエージェントは以下のプロンプトを使用します：</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><code>Mastra Studio &gt; Agents</code>メニューをクリックして<strong>Elasticsearch Agent</strong>を選択すると、チャットシステムを使用してエージェントをテストできます。たとえば、SF映画に関する情報を次のような質問で尋ねることができます。</p><p><em>UFOを題材にした映画またはテレビシリーズを5つ見つけてください</em>。</p><p>エージェントがvectorQueryToolを実行することがわかります。起動したツールをクリックすると、入力と出力を確認できます。実行の最後に、LLMはElasticsearchのscifi-moviesインデックスから得られたコンテキストに基づいて、あなたの質問に回答します（図4）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda92a9b6e56528d3/6a17041c2b835f9724f4b0d6/d9998d4f687984de98845dae52d1288166abf448-1344x1071.png" alt=" Elasticsearch Agentを使用したLLMからの対応。" /><p>Mastraは内部で以下の手順を実行します：</p><ol><li><p><strong>ベクトル変換：</strong>ユーザーの質問「<em>UFOに関する映画やテレビシリーズを5つ探して</em>」は、OpenAIの<code>openai/text-embedding-3-small</code>モデルを使ってベクトル埋め込みに変換されます。</p></li><li><p><strong>ベクトル検索：</strong>この埋め込みはその後、Elasticsearchに対してベクトル検索を用いてクエリを実行するために使用されます。</p></li><li><p><strong>結果の取得：</strong>Elasticsearchは、クエリに非常に関連性の高い10本の映画（つまり、ユーザーのクエリベクトルに最も近いベクトルを持つ映画）を返します。</p></li><li><p><strong>回答生成：</strong>取得された映画と元のユーザーの質問は、具体的には<code>openai/gpt-5-nano</code> LLM に送信されます。LLMはこの情報を処理し、最終的な回答を生成することで、ユーザーの5つの結果への要望を確実に満たします。</p></li></ol><h2>Elasticsearch エージェント</h2><p>ここではElasticsearch Agentのソースコードを報告しました。</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><strong>vectorQueryTool</strong>は、RAGの例における取得部分を実装するために呼び出されるツールです。MastraにElasticが提供した<a href="https://mastra.ai/reference/vectors/elasticsearch">ElasticSearchVector</a>実装を使用しています。</p><p>エージェントは、vectorQueryTool、プロンプト、およびメモリを消費するエージェントクラスのオブジェクトです。ご覧のように、Elasticsearchをエージェントに接続するために必要なコードはごくわずかです。</p><h2>まとめ</h2><p>この記事では、ElasticsearchとMastraフレームワークを統合し、洗練されたエージェント型AIアプリケーションを構築することのシンプルさとパワーについて実証しました。具体的には、Elasticsearchでインデックス化されたSF映画データのコーパスに対してセマンティック検索を実行できるRAGエージェントの作成について説明しました。</p><p>重要なポイントは、ElasticがMastraのオープンソースプロジェクトに直接貢献し、ベクターストアとしてのElasticsearchをネイティブサポートしていることです。この統合により、導入時の障壁が大幅に低下します。これは、 <strong>Elasticsearch Agent</strong>のソースコードを見れば明らかです。<code>ElasticSearchVector</code>と<code>createVectorQueryTool</code>を使用することで、Elasticsearchをエージェントに接続するための総合的なセットアップが、最小限の設定コード行数で済みます。</p><p>Elasticsearchは、結果の関連性を高めるためのいくつかの高度な機能を提供しています。例として、<a href="https://www.elastic.co/elasticsearch/hybrid-search">ハイブリッド検索</a>は、語彙検索とベクトル検索を組み合わせることで、精度を大幅に向上させます。もう一つの興味深い機能は、ハイブリッド検索の最後に適用できる最新の<a href="https://www.elastic.co/search-labs/tutorials/jina-tutorial/jina-reranker-v3">Jinaモデル</a>を使用した再ランク付けです。これらの技術についてさらに詳しく知るには、Elasticsearch Labsの以下の記事を参照してください。</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">Elasticsearchのハイブリッド探索</a> by ヴァレンティン・クレっタス</p></li><li><p><a href="https://www.elastic.co/search-labs/blog/jina-models-elasticsearch-guide">Jinaモデル入門、その機能、Elasticsearchでの利用</a> by スコット・マーテンス</p></li></ul><p>また、提供されている例を参考に、MastraとElasticsearchを使って独自のデータ駆動型エージェントを構築し始めることをお勧めします。Mastraについての詳細は、 <a href="https://mastra.ai/docs">こちら</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[エージェント型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[ElasticsearchのGemini CLI拡張機能（ツールとスキル付き）]]></title>
    <description><![CDATA[GoogleのGemini CLIでElasticsearchのデータを検索、取得、分析するためのElasticの拡張機能（開発者およびエージェントのワークフロー向け）をご紹介します。
]]></description>
    <content:encoded><![CDATA[<p>GoogleのGemini CLI用のElastic拡張機能のリリースを発表できることを嬉しく思います。これにより、<a href="https://www.elastic.co/elasticsearch">Elasticsearch</a>と<a href="https://www.elastic.co/elasticsearch/agent-builder">Elastic Agent Builder</a>のパワーを、AI開発ワークフローに直接組み込むことができます。この拡張機能には、Elasticsearchを操作するための最近開発されたエージェントスキルもいくつか用意されています。</p><p>この拡張機能はオープンソースプロジェクトとして<a href="https://github.com/elastic/gemini-cli-elasticsearch">こちら</a>から利用できます。</p><h2>Gemini CLIの概要とインストール方法</h2><p><a href="https://geminicli.com/">Gemini CLI</a> は、GoogleのGeminiモデルを直接コマンドラインに取り込むオープンソースのAIエージェントです。ターミナルからAIと対話することで、コードの生成、ファイルの編集、シェルコマンドの実行、ウェブからの情報の取得などのタスクを実行できます。</p><p>一般的なチャットインターフェースとは異なり、Gemini CLIはローカル開発環境と統合されます。つまり、プロジェクトのコンテキストを理解し、ファイルを変更し、ビルドやテストを実行し、ワークフローをターミナル内で直接自動化することができます。開発者、サイト信頼性エンジニア（SRE）、コマンドラインのワークフローを離れることなくAI支援のコーディングと自動化を求めるエンジニアにとって役立ちます。</p><p>Gemini CLIは複数のパッケージマネージャーを使ってインストール可能です。最も一般的な方法はnpm経由です。</p>npm install -g @google/gemini-cli<p>その他のインストール方法については、<a href="https://geminicli.com/docs/get-started/installation/">公式のインストールページ</a>を参照してください。</p><p>インストール後、以下のコマンドを実行してCLIを起動します。</p>gemini<p>図1に示すような画面が表示されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ff43abe550941b4/6a17072ba29299fc2ad00fa4/6dfcec4a77b3dc83bf0d974417bf2e211abb1f4f-876x468.png" alt="Gemini CLIのスクリーンショット。" /><h2>Elasticsearchを構成</h2><p>Elasticsearchインスタンスを実行する必要があります。モデルコンテキストプロトコル（MCP）サーバーを使用するには、Kibana 9.3以降もインストールする必要があります。Elasticsearchクエリ言語 (ES|QL) スキル (<code>esql</code>) を使用するためにKibanaは必要ありません。</p><p><a href="https://www.elastic.co/cloud">Elastic Cloud</a>で無料トライアルを有効化するか、<a href="https://github.com/elastic/start-local"><code>start-local</code></a>スクリプトを使ってローカルにインストールできます。</p>curl -fsSL https://elastic.co/start-local | sh<p>これにより、ElasticsearchとKibanaがコンピュータにインストールされ、Gemini CLIの設定に使用するAPIキーが生成されます。</p><p>APIキーは前のコマンドの出力として表示され、 <strong><code>elastic-start-local</code></strong>フォルダ内の<strong>.env</strong>ファイルに保存されます。</p><p>オンプレミスのElasticsearchを使用している場合（例えば、<code>start-local</code>）、MCPでElastic Agent Builderを使用するには、大規模言語モデル（LLM）を接続する必要があります。さまざまなオプションを理解するには、<a href="https://www.elastic.co/docs/explore-analyze/ai-features/llm-guides/llm-connectors">このドキュメントページ</a>をご覧ください。</p><p>Elastic Cloud（またはサーバーレス）を使用している場合は、LLM接続が事前構築されています。</p><h2>Elasticsearch拡張機能をインストールしてください</h2><p>次のコマンドを使用して、Gemini CLI用のElasticsearch拡張機能をインストールできます。</p>gemini extensions install https://github.com/elastic/gemini-cli-elasticsearch<p>Geminiを開き、以下のコマンドを実行することで、拡張機能が正常にインストールされたことを確認できます。</p>/extensions list<p>Elasticsearch拡張機能が利用可能になっているはずです。</p><p>MCP統合を使用するには、Elasticsearch 9.3以降のバージョンがインストールされている必要があります。<a href="https://www.elastic.co/kibana">Kibana</a>からMCPサーバーのURLを取得する必要があります。</p><ul><li><p>MCPサーバーのURLは、[エージェント] &gt; [すべてのツールを表示] &gt; [MCPの管理] &gt; [MCPサーバーのURLをコピー] から取得できます。</p></li><li><p>URLは次のようになります：https://your-kibana-instance/api/agent_builder/mcp</p></li></ul><p>ElasticsearchエンドポイントのURLが必要です。これは通常、Kibana Elasticsearchページの最上部に表示されます。Elasticsearchを<code>start-local</code>で実行している場合、 <code>start-local</code> .envファイルの<code>ES_LOCAL_URL</code>キーにエンドポイントが既に存在します。</p><p>APIキーも必要です。Elasticsearchを<code>start-local</code>で実行している場合、 <code>start-local</code> .envファイルには既に<code>ES_LOCAL_API_KEY</code>が含まれています。それ以外の場合は、<a href="https://www.elastic.co/docs/deploy-manage/api-keys/elasticsearch-api-keys">こちらに</a>記載されているように、Kibanaインターフェースを使用してAPIキーを作成できます。</p><ul><li><p>Kibanaでは、[スタック管理] &gt; [セキュリティ] &gt; [APIキー] &gt; [APIキーの作成] の順に操作します。</p></li><li><p>API キーには読み取り権限のみを設定し、<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/permissions#grant-access-with-roles">ここに</a>記載されているように<code>feature_agentBuilder.read</code>権限を有効にすることをお勧めします。</p></li><li><p>エンコードされたAPIキーの値をコピーしてください。</p></li></ul><p>シェルで必要な環境変数を設定してください。</p>export ELASTIC_URL="your-elasticsearch-url"
export ELASTIC_MCP_URL="your-elasticsearch-mcp-url"
export ELASTIC_API_KEY="your-encoded-api-key"<h2>サンプルデータセットをインストールする</h2><p>Kibanaから入手可能な<strong>eCommerce orders</strong>データをインストールできます。このデータベースには、eコマースWebサイトからの4,675件の注文に関する情報を含む<strong><code>kibana_sample_data_ecommerce</code></strong>という単一のインデックスが含まれています。各注文について、次の情報があります。</p><ul><li><p>顧客情報（名前、ID、生年月日、メールなど）。</p></li><li><p>注文日。</p></li><li><p>注文ID。</p></li><li><p>商品（価格、数量、ID、カテゴリー、割引、その他の詳細を含む全商品のリスト）</p></li><li><p>SKU。</p></li><li><p>合計金額（税抜、税込）。</p></li><li><p>合計数量。</p></li><li><p>地理情報（都市、国、大陸、場所、地域）。</p></li></ul><p>サンプルデータをインストールするには、Kibanaの<strong>統合</strong>ページを開き（検索トップバーで「Integration」を検索）、<strong>Sample Data</strong>をインストールしてください。詳細については、<a href="https://www.elastic.co/docs/explore-analyze/#gs-get-data-into-kibana">こちらの</a>ドキュメントを参照してください。</p><p>この記事の目的は、Gemini CLIをElasticsearchに接続し、<strong><code>kibana_sample_data_ecommerce</code></strong>インデックスとやり取りするのがいかに簡単かを示すことです。</p><h2>Elasticsearch MCPの使用方法</h2><p>Geminiで以下のコマンドを使用して接続状況を確認できます。</p>/mcp list<p>図2に示すように、 <strong><code>elastic-agent-builder</code></strong>が有効になっているはずです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt52b85e7255360f3b/6a17072da929cf33d3ae08f5/1508423bc1d1bc3c04a1cb01e2d59495a3516ed1-1465x844.png" alt="ツールのリストを備えた「elastic-agent-builder」MCPサーバー。" /><p>Elasticsearchはデフォルトのツールセットを提供しています。詳細は<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/tools/builtin-tools-reference">こちらを</a>ご覧ください。</p><p>これらのツールを使用して、Elasticsearchと対話し、次のような質問をすることができます。</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>質問に応じて、Geminiは利用可能なツールの一つ以上を使って回答を試みます。</p><h2>/elasticコマンド</h2><p>Gemini CLIのElasticsearch拡張機能では、さらに<strong><code>/elastic</code></strong>コマンドを追加しました。</p><p><strong><code>/help</code></strong>コマンドを実行すると、利用可能なすべての<code>/elastic</code>オプション（図3）が表示されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt741c7451ecab10d2/6a17072ea6c2b9ccd6e79643/5b2a0727ce7a04354878dd048253d3f4d062324b-1983x230.png" alt="利用可能な `/elastic` コマンド。" /><p>これらのコマンドは、<code>elastic-agent-builder</code> MCPサーバーの特定のツールを直接実行したい場合に便利です。例えば、以下のコマンドを使用すると、 <code>kibana_sample_data_ecommerce</code>のマッピングを取得できます。</p>/elastic:get-mapping kibana_sample_data_ecommerce<p>これらのコマンドは、どのツールを呼び出すかをGeminiモデルに頼るのではなく、基本的に特定のツールを実行するためのショートカットです。</p><h2>Elasticsearchスキルの使用方法</h2><p>この拡張機能には、Elasticsearchで利用可能な<a href="https://www.elastic.co/docs/explore-analyze/discover/try-esql">Elasticsearchクエリ言語</a>である<a href="https://github.com/elastic/gemini-cli-elasticsearch/tree/main/skills/esql">ES|QL用のエージェントスキル</a>も付属しています。<a href="https://agentskills.io/home">エージェントスキル</a> は、Gemini CLIのようなAIコーディングエージェントに特定のタスクに合わせたカスタム指示を提供するオープンフォーマットです。<em>段階的開示</em>と呼ばれる概念を採用しており、最初のシステムプロンプトにスキルの簡単な説明のみを追加します。エージェントにElasticsearchへのクエリなどのタスクを実行するように依頼すると、リクエストが関連するスキルと照合され、詳細な指示が動的に読み込まれます。これは、トークン予算を効率的に管理すると同時に、AIが必要とする正確なコンテキストを提供する方法です。</p><p><strong><code>esql</code></strong><strong>スキル</strong>は、Gemini CLIがES|QLクエリを直接クラスターに対して書き込み、実行するように設計されています。ES|QLは強力なパイプクエリ言語で、データ調査、ログ分析、アグリゲーションを非常に直感的に行うことができます。このスキルを有効にすると、ES|QLの構文を調べる必要はなくなり、Gemini CLIにデータについて自然言語で質問するだけであとはエージェントが処理します。</p><p>実行は、ターミナルで実行されるシンプルな<a href="https://curl.se/">curl</a>コマンドを使用して行われます。これは、Elasticsearchが豊富なREST APIを提供し、システムをあらゆるアーキテクチャに容易に統合できるためです。</p><p><strong><code>esql</code></strong><strong>スキルが提供するもの：</strong></p><ul><li><p><strong>インデックスとスキーマの検出：</strong>エージェントは、スキルに搭載されたツールを使用して、利用可能なインデックスを一覧表示し、フィールドマッピングを取得できます。例えば、eCommerce データセットのクエリを書く前に、エージェントは <strong><code>kibana_sample_data_ecommerce</code></strong> でスキーマチェックを実行して、<strong><code>taxful_total_price</code></strong> や <strong><code>category</code></strong> のような利用可能なフィールドを理解することができます。</p></li><li><p><strong>シームレスな自然言語翻訳：</strong>スキルはエージェントに単なるリファレンスマニュアルにとどまらず、ユーザーの意図を解釈するための具体的なガイドを提供します。「サービス別にグループ化された平均応答時間を表示して」といった自然言語によるリクエストを入力すると、エージェントはスキルのバンドルされたパターンマッチングを使用して、入力された言葉を即座に正しいES|QLアグリゲーション、フィルタ、コマンドに変換します。</p></li><li><p><strong>自動修正：</strong> クエリが失敗した場合（例：タイプミスマッチや構文エラーなど）、スキルは生成されたクエリとElasticsearchのエラーを正確に返します。これにより、エージェントは即座にクエリを修正して再試行でき、介入する必要がありません。</p></li></ul><p><code>esql</code>スキルは<code>elastic-agent-builder</code> MCPサーバーのツールとしても利用できるため、このサーバーを一時的に無効にする必要があります。以下のコマンドを使用して無効にすることができます。</p>/mcp disable elastic-agent-builder<p>そうすれば、Gemini CLIに次のようなプロンプトを入力するだけで済みます。</p>Find the top 5 product categories by total sales revenue in the kibana_sample_data_ecommerce index<p>エージェントは以下を実行します：</p><ul><li><p><code>esql</code> スキルの必要性を認識します。</p></li><li><p><strong><code>kibana_sample_data_ecommerce</code></strong>のスキーマを確認してください。</p></li><li><p><code>FROM kibana_sample_data_ecommerce | STATS total_revenue = SUM(taxful_total_price) BY category.keyword | SORT total_revenue DESC | LIMIT 5</code> のようなES|QLクエリを構築します。</p></li><li><p>Elasticsearch APIに対してクエリを実行します。</p></li><li><p>最終的な答えを端末に直接表示します。</p></li></ul><p>ここでは、前回の質問に対するGeminiからの回答例を報告します。</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>Geminiモデルが最終的な応答を生成する際にどのような手順を踏むかは非常に興味深い点です。ここでは、モデルの推論プロセスにおけるスキルの影響が明確に見て取れます。モデルがスキルを使用する必要がある、またはシェルコマンドを実行する必要があると初めて認識したとき、ヒューマン・イン・ザ・ループ方式を使用して許可を要求します。</p><p>スキーマの発見、クエリの生成、実行といった面倒な作業を<code>esql</code>スキルが処理することで、回答を得るための仕組みではなく、回答そのものに集中できるようになります。必要なデータが、適切な形式でターミナルに直接表示されます。構文を記述したり、別のアプリケーションに切り替えたりする必要は一切ありません。</p><h2>まとめ</h2><p>この記事では、最近リリースしたGemini CLI用のElasticsearch拡張機能を紹介しました。この拡張機能を使用すると、GeminiおよびElastic Agent Builderが提供するElasticsearch MCPサーバー（バージョン 9.3.0 以降で利用可能）と<code>/elastic</code>コマンドを使用してElasticsearchインスタンスとやり取りできます。</p><p>さらに、この拡張機能には、ユーザーの自然言語からのリクエストをES|QLに変換する <code>esql</code>スキルも含まれています。このスキルは、MCPサーバーが使用できない場合に特に役立ちます。なぜなら、基本的な通信はターミナルで実行されるシンプルなcurlコマンドによって行われるためです。Elasticsearchは、あらゆるプロジェクトに簡単に統合できる豊富なREST APIセットを提供します。これは特にエージェント型AIアプリケーションの開発時に有用です。</p><p>Gemini CLI拡張機能の詳細については<a href="https://github.com/elastic/gemini-cli-elasticsearch">こちら</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[統合]]></category>
    <category><![CDATA[エージェント型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[Google MCP Toolbox for DatabasesにElasticsearchサポートを導入]]></title>
    <description><![CDATA[Google MCP Toolbox for Databasesで利用可能になったElasticsearchサポートの詳細を確認し、ES|QLツールを活用してインデックスを任意の MCP クライアントと安全に統合します。]]></description>
    <content:encoded><![CDATA[<p>この記事では、Google MCP Toolboxと<a href="https://github.com/elastic/elasticsearch">Elasticsearch</a>を併用し、Elasticsearchインデックスから情報を抽出する簡単なツールを構築する方法を解説します。</p><p>当社は最近、<a href="https://github.com/googleapis/genai-toolbox">Google MCP Toolbox for Databases</a>のオープンソースプロジェクトに貢献し、Elasticsearchをデータベースとしてサポートしました。</p><p>この新しい機能により、Google MCP Toolboxを使用してElasticsearchに接続し、データと直接「会話」できるようになりました。</p><h2>Elasticsearch</h2><p>Elasticsearchインスタンスを実行する必要があります。<a href="https://www.elastic.co/cloud">Elastic Cloud</a>で無料トライアルを有効化するか、<a href="https://github.com/elastic/start-local">start-local</a>スクリプトを使ってローカルにインストールできます。</p>curl -fsSL https://elastic.co/start-local | sh<p>これにより、ElasticsearchとKibanaがコンピュータにインストールされ、Google MCP Toolboxの設定に使用するAPIキーが生成されます。</p><p>APIキーは前のコマンドの出力として表示され、elastic-start-localフォルダー内の.envファイルに保存されます。</p><h2>サンプルデータセットをインストールする</h2><p>インストール後、ユーザー名<em>elastic</em>とstart-localスクリプトによって生成されたパスワード（.envファイルに保存）を使用してKibanaにログインできます。</p><p>Kibanaから入手可能な<strong>eCommerce orders</strong>データをインストールできます。このデータベースには、eコマースWebサイトからの4,675件の注文に関する情報を含む<strong>kibana_sample_data_ecommerce</strong>という単一のインデックスが含まれています。各注文について、次の情報があります。</p><ul><li><p>顧客情報（氏名、ID、生年月日、メールアドレスなど）</p></li><li><p>注文日</p></li><li><p>注文ID</p></li><li><p>商品（価格、数量、ID、カテゴリー、割引などを含む全商品のリスト）</p></li><li><p>SKU</p></li><li><p>合計金額（税抜、税込）</p></li><li><p>合計数量</p></li><li><p>地理情報（都市、国、大陸、場所、地域）</p></li></ul><p>サンプルデータをインストールするには、Kibanaの<strong>統合</strong>ページを開き（検索トップバーで「Integration」を検索）、「Sample Data」をインストールしてください。詳細については、ドキュメント<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>この記事の目的は、Google MCP ToolboxがElasticsearchに接続し、自然言語で<strong>kibana_sample_data_ecommerce</strong>インデックスとやり取りするのがいかに簡単かを示すことです。</p><h2>Google MCP Toolbox</h2><p>Google MCP ToolboxはオープンソースのMCPサーバーで、アプリケーションやAIエージェントが安全かつ効率的にデータベースとやり取りできるように設計されています。以前は「GenAI Toolbox for Databases」と呼ばれていたこのプロジェクトは、<a href="https://www.anthropic.com/news/model-context-protocol">モデルコンテキストプロトコル</a>（MCP）との完全な互換性を採用した後に改名されました。その目的は、エージェントをデータベースに接続する際に従来必要とされていた接続プーリング、認証、オブザーバビリティ、その他の運用上の懸念をバックエンドで処理することで、重労働を排除することです。</p><p>Toolboxの本質は、開発者がデータベースのやり取りをカプセル化する再利用可能な高レベルのツールを定義できるようにすることです。これらのツールは、AIエージェントなどのMCP互換クライアントならどれでも起動できます。クライアントが低レベルのSQLクエリを実装したり、データベース接続を管理したりする必要はありません。このアプローチにより、データベース対応エージェントの構築に必要な定型コードの量が大幅に削減され、わずか数行のアプリケーションロジックに高度なデータ操作を統合できるようになります。ツールが定義されると、複数のエージェント、フレームワーク、言語間で共有できます（図1）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte90070297ee83546/6a16fa29964cea694b08b972/137cea290bb70ad5da21853f9a6358cef4cf7451-1248x1056.png" alt="" /><p>Toolboxを使用する大きな利点は、組み込まれたセキュリティモデルです。OAuth2やOIDCなどの認証フローはネイティブにサポートされているため、開発者はデータベースの機密認証情報をエージェントで処理したり格納したりする必要がありません。このプラットフォームは、デバッグ、監視、本番環境への導入に不可欠な、OpenTelemetryによる指標やトレースなどの観測機能も提供します。全体として、MCP Toolboxは、あらゆるMCP対応システムのデータを操作するための、統一された安全で拡張可能なインターフェースとして機能します。</p><h2>MCP Toolboxのインストール方法</h2><p>MCP ToolboxサーバーをLinuxにインストールするには、次のコマンドを使用します。</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>macOSまたはWindowsにインストールする場合は、<a href="https://googleapis.github.io/genai-toolbox/getting-started/introduction/#installing-the-server">ここに</a>記載されている手順に従ってください。</p><h2>Elasticsearch向けにToolboxを構成する</h2><p>Elasticsearch向けにMCP Toolboxを構成するには、次のように<strong>tools.yaml</strong>ファイルを作成する必要があります。</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><strong>&lt;insert-here-api-key&gt;</strong>値を有効なElasticsearch APIキーに置き換える必要があります。start-localを使用してElasticsearchをローカルで実行している場合は、start-localによって生成された.envファイルの<strong>ES_LOCAL_API_KEY</strong>変数の下にAPIキーがあります。Elastic Cloudを使用している場合は<a href="https://www.elastic.co/docs/deploy-manage/api-keys/elastic-cloud-api-keys">ここで</a>説明した手順に従うことでAPIキーを生成できます。</p><p>前のツールには、Elasticsearch用の次のES|QLクエリが含まれています。</p><p>ES|QLに慣れていない方のために説明すると、ES|QLはSQLと同様にElasticが開発したクエリ言語で、1つ以上のインデックスを検索するために使用できます。ES|QLの詳細については<a href="https://www.elastic.co/docs/reference/query-languages/esql">こちらの</a>公式ドキュメントをご覧ください。</p><p>上記のクエリは、<strong>kibana_sample_data_ecommerce</strong>インデックスに格納されている指定顧客名を含むすべての注文を<strong>?name</strong>パラメーター（疑問符はパラメーターを示します）を用いて検索します。</p><p>顧客名は、以前のYAML設定で文字列型と「顧客名」という記述で定義されています。</p><p>このツールを使用すると、顧客の注文に関する質問に答えることができます。たとえば、<em>「顧客Fooは2025年10月に何件の注文をしましたか？」</em></p><p>ツールとそのパラメーターの説明は、ユーザーの自然言語リクエストから関連情報を抽出するために不可欠です。この抽出は、大規模言語モデル（LLM）の<strong>関数呼び出し</strong>機能を使用して実行されます。実際には、LLMは、必要な情報を取得するためにどの機能（ツール）を実行する必要があるかを判断し、その機能に適したパラメーターも取得できます。</p><p>詳細については、<a href="https://www.elastic.co/search-labs/blog/function-calling-with-elastic">Elasticsearchを使用したOpenAIの関数呼び出し</a>に関するAshish Tiwariの記事を読むことをお勧めします。</p><h2>Toolboxサーバーを実行する</h2><p>次のコマンドで、以前のtools.yamlファイルを使用してMCPツールボックスを実行できます。</p>./toolbox --tools-file tools.yaml --ui<p><strong> –ui</strong>パラメーターは<a href="http://127.0.0.1:5000/ui">http://127.0.0.1:5000/ui</a>のウェブアプリケーションを実行します（図2）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0fb3953fae603572/6a16fa2aa6c2b92763e794fb/3caf2339b632bafd5847af1ed8b33b518a25b8a2-1600x314.png" alt="" /><p><strong>[ツール]</strong> &gt; <strong>[customer-orders]</strong> を選択し、パラメータ<strong>名</strong>に顧客名（例：Gwen Sanders）を挿入して <strong>[ツールを実行]</strong> ボタンをクリックします。図3に示すように、JSON応答が表示されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltca02df8c78cb39ff/6a16fa2c961e6909b5c4cd22/b167e0142afb8919d9cedf6d0fa431d33d0e55f8-1600x933.png" alt="" /><p>セットアップが完了すると、MCP Toolboxは<strong>customer-orders</strong>ツールを実行してElasticsearchと通信し、ES|QLクエリを実行できるようになります。</p><h2>Gemini CLIでのMCP Toolboxの使用</h2><p>任意のMCPクライアントを使用して、MCP Toolbox for Databasesと通信できます。例えば、<a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a>というコマンドラインツールを使ってGeminiを使うことができます。Gemini CLIのインストールは、<a href="https://geminicli.com/docs/get-started/installation/">こちら</a>の手順に従って行うことができます。</p><p>Gemini CLIは、MCP Toolbox用の事前設定された拡張機能を提供しており、<a href="https://github.com/gemini-cli-extensions/mcp-toolbox">gemini-cli-extensions/mcp-toolbox</a>で入手できます。この拡張機能は次のコマンドを実行してインストールできます。</p>gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox<p>インストール後、MCP Toolbox用のtools.yaml設定ファイルを格納したディレクトリに移動し、以下のようにGemini CLIを実行する必要があります（この手順は、Gemini CLIをMCP Toolboxで自動的に設定するために必要です）。</p>gemini<p>図4に示すように出力広告が表示されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf7245c10b9e32cd6/6a16fa2d964cea073208b976/0f22df6d3da13c1dc50dcb560414fa7c630eb9a7-1434x341.png" alt="" /><p>次のコマンドを使用して、MCP Toolboxが接続されているかどうかを確認できます。</p>/mcp list<p><strong>mcp_toolbox</strong>と<strong>customer-orders</strong> ツールが一覧に表示されているはずです（図5）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte857b42dbe604203/6a16fa2f8b73cb531b189e33/97edbc40de9e44f469f6f3a09427532be167de0e-493x155.png" alt="" /><p>MCP ToolboxがGemini CLI に接続されている場合は、「<em>顧客Gwen Sandersの注文を教えてください</em>」などの質問をいくつか試すことができます。Gemini CLIは、mcp_toolboxサーバーからcustomer-ordersツールを実行する許可を要求します（図6を参照）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfb7ea752c1a39da7/6a16fa30cdacbfdf937d27ff/c052f3b5e49436903b804280c0065f67ee02444b-1432x284.png" alt="" /><p>確認後、Gemini CLIはMCP Toolboxへのリクエストを実行し、結果としてJSON応答を取得し、それを使用して応答をフォーマットします（図7）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb9f6e04987137a9f/6a16fa320811ae2297e9fef7/7ea5128f1705951c2757af6da4b456d394d4a080-1432x734.png" alt="" /><p>Gemini CLIからの応答で、Gwen Sandersが2つの製品を1回の注文で、合計132ユーロの価格で購入したことがレポートされます。</p><h2>MCP Toolbox SDKs</h2><p>Google MCP Toolboxは、Go、Python、Javascriptで書かれたプログラムからすべての機能にアクセスするためのSDKも提供しています。</p><p>例えば、Python SDKはGithubの次のページ<a href="https://github.com/googleapis/mcp-toolbox-sdk-python">https://github.com/googleapis/mcp-toolbox-sdk-python</a>で入手可能です。</p><p>MCP Toolboxに接続するための簡単なエージェントを作成する必要があります。次のパッケージをインストールする必要があります。</p>pip install toolbox-core
pip install google-adk<p>次のコマンドを使用して、新しいエージェントプロジェクトを作成します。</p>adk create my_agent<p>これにより、ファイル<strong>agent.py</strong>を持つ新しいディレクトリが<strong>my_agent</strong>として作成されます。</p><p>Toolboxに接続するには、次の内容で<strong>my_agent/agent.py</strong>を更新します。</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>Google APIキーを使用して<strong>.env</strong>ファイルを作成します。</p>echo 'GOOGLE_API_KEY="YOUR_API_KEY"' &gt; my_agent/.env<p>最後に、エージェントを実行して結果を確認します。エージェントを実行するには、次のコマンドを実行します。</p>adk run my_agent<p>または、Webインターフェース経由で提供することもできます。</p>adk web --port 8000<p>両方の場合において、Q&amp;Aインターフェースを使用してMCP Toolboxと対話することができます。たとえば、先程の質問「<em>顧客Gwen Sandersの注文を教えてください</em>」をすることができます。</p><p>さまざまなSDKの詳細については、<a href="https://googleapis.github.io/genai-toolbox/sdks/">このドキュメントページ</a>をご参照ください。</p><h2>まとめ</h2><p>この記事では、Google MCP Toolbox for DatabasesのElasticsearch統合について説明しました。シンプルなYAML設定ファイルを使用して、自然言語の質問をES|QL言語を使用してElasticsearchクエリに変換する一連のツールを定義できます。</p><p>eコマースWebサイトからの注文を含むkibana_sample_data_ecommerceデータセットとの対話方法を示しました。この設定ファイルを使用すると、MCP Toolboxサーバーを簡単に実行し、任意のMCPクライアントから接続できます。</p><p>最後に、Gemini CLIをクライアントとして使用してMCP Toolbox for Databasesに接続し、Elasticsearchに保存されているeコマースデータをクエリする方法を示しました。特定の顧客の名前で識別された注文情報を取得するために自然言語クエリを実行しました。</p><p>MCPエコシステムが成長し続けるにつれて、このパターン（安全で本番環境ですぐに使えるインフラストラクチャーに裏打ちされた軽量なツール定義）は、最小限の労力で、ますます有能でデータを認識するエージェントを構築する新しい機会を生み出します。MCP Toolboxは、Elasticのサンプルデータセットを使ってローカルで実験する場合でも、大規模なアプリケーションに検索機能を統合する場合でも、自然言語を使ってElasticsearchのデータを操作するための、信頼性と拡張性に優れた基盤を提供します。</p><p>エージェントAIアプリケーションの開発の詳細については、Anish MathurとDana Juratoniによる記事<a href="https://search-labs-redesign.vercel.app/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">「Elasticsearchを使用したAI エージェントワークフローの構築」</a>をお読みください。</p><p>Google MCP Toolboxの詳細については、<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[エージェント型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[ES|QLからPHPオブジェクトへ]]></title>
    <description><![CDATA[PHP で ES|QL クエリを実行および管理する方法を学びます。ES|QL の結果を PHP オブジェクトまたはカスタム クラスにマップするには、このガイドに従ってください。]]></description>
    <content:encoded><![CDATA[<p>elasticsearch-php <a href="https://github.com/elastic/elasticsearch-php/releases/tag/v8.13.0">v8.13.0</a>以降では、 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>クエリを実行し、結果を<a href="https://www.php.net/manual/en/class.stdclass.php">stdClass</a>の PHP オブジェクトまたはカスタム クラスにマップできます。</p><h2>ES|QL</h2><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>は、Elasticsearch 8.11.0 で導入された新しい Elasticsearch クエリ言語です。現在、テクニカル プレビューで利用可能です。Elasticsearch に保存されているデータをフィルタリング、変換、分析するための強力な方法を提供します。</p><p>「パイプ」（ <code>|</code> ）を使用して、データを段階的に操作および変換します。このアプローチにより、ユーザーは一連の操作を構成でき、1 つの操作の出力が次の操作の入力となり、複雑なデータ変換と分析が可能になります。</p><p>たとえば、次のクエリは、 <code>sample_data</code>インデックスの最初の 3 つのドキュメント (行) を返します。</p>FROM sample_data
| LIMIT 3
<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b0310cb335872b7/6a17d7eab1e113258679f0df/c23aee777bacdf90c63b717fd9458207dfc0511d-864x284.png" alt="ES|QLはテーブルを生成する" /><h2>ユースケース: 公式 PHP クライアントの ES|QL 機能</h2><p>公式 PHP クライアントで開発された ES|QL 機能を説明するために、次の情報を含む 81,828 冊の書籍 (54.4 MB) の<a href="https://github.com/elastic/elasticsearch-php-examples/blob/main/examples/ESQL/data/books.csv">CSV ファイルを</a>Elasticsearch に保存しました。</p>Title;Descrition;Author;Year;Publisher;Ratings
<p>このリストは、公開されている<a href="https://www.kaggle.com/datasets/mohamedbakhet/amazon-books-reviews">Amazon Books Reviews データセット</a>から抽出しました。</p><p>次の Elasticsearch マッピングを使用して<code>books</code>インデックスを作成しました:</p>'mappings' : {
    'properties': {
        'title': {
            'type': 'text'
        },
        'description': {
            'type': 'text'
        },
        'author': {
            'type': 'text'
        },
        'year': {
            'type': 'short'
        },
        'publisher': {
            'type': 'keyword'
        },
        'rating': {
            'type': 'half_float'
        }
    }
}
<p><code>rating</code>値は、2.9 GB の<a href="https://www.kaggle.com/datasets/mohamedbakhet/amazon-books-reviews?select=Books_rating.csv">Books_rating.csv</a>ファイルから取得されたランキングレビューの平均です。</p><p><a href="https://github.com/elastic/elasticsearch-php-examples/blob/main/examples/ESQL/bulk.php">ここでは、</a> Elasticsearch にすべての書籍を一括インポートするために使用した PHP スクリプトを見つけることができます。一括操作には PHP 8.2.17 を使用して 7 秒と 28 MB の RAM が必要でした。提案されたマッピングでは、Elasticsearch のインデックス サイズは約 62 MB になります。</p><h2>ES|QL の結果を PHP オブジェクトまたはカスタム クラスにマッピングする</h2><p><code>esql()-&gt;query()</code>エンドポイントを使用して、PHP で ES|QL クエリを実行できます。このクエリの結果はテーブル データ構造になります。これは、 <code>columns</code>フィールドと<code>values</code>フィールドを使用して JSON で表現されます。<code>columns</code>フィールドには<code>name</code>と<code>type</code>定義があります。</p><p>以下は、ユーザーのランキングレビュー順に並べられた、Stephen King が書いたトップ 10 の本を取得する ES|QL クエリの例です。</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>Elasticsearch からの JSON 結果は次のようになります。</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>この例では、書籍に関連する 6 つのプロパティ (著者、説明、出版社、評価、タイトル、年) と 10 件の結果 (すべて Stephen King の書籍) があります。</p><p>ES|QL でサポートされているすべてのタイプのリストは<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-limitations.html#esql-supported-types">ここに</a>記載されています。</p><p><code>$result</code>応答オブジェクトには、配列、文字列、またはオブジェクトとしてアクセスできます (詳細については、<a href="https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/connecting.html#client-usage">ここを</a>参照してください)。</p><p>オブジェクト インターフェイスを使用すると、プロパティとインデックスを使用して値にアクセスできます。たとえば、 <code>$result-&gt;values[0][4]</code>リストの最初の本 (0) のタイトル (4) を返し、 <code>$result-&gt;values[1][3]</code> 2 番目の本 (1) のランク スコア (3) を返します。PHP の配列のインデックスは 0 から始まることに注意してください。</p><p>このインターフェースは、いくつかのユースケースでは十分ですが、ほとんどの場合、結果としてオブジェクトの配列を取得したいと考えます。</p><p>結果をオブジェクトの配列にマップするには、elasticsearch-php の新しい<a href="https://github.com/elastic/elasticsearch-php/issues/1398">mapTo()</a>機能を使用できます。</p><p>この関数は、 <a href="https://github.com/elastic/elasticsearch-php/blob/main/src/Response/Elasticsearch.php">Elasticsearch レスポンス オブジェクト</a>で直接使用できます。つまり、次のようにアクセスできます。</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>カスタム Book クラスがある場合は、次のようにそれを使用して結果をマップできます。</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>クラスに ES|QL 結果に含まれるプロパティに加えて他のプロパティがある場合も、これは同様に機能します。<code>mapTo()</code>関数は、ES|QL 結果の列として返されるプロパティのみを使用します。</p><p>この記事で報告されているすべての例は、<a href="https://github.com/elastic/elasticsearch-php-examples/tree/main/examples/ESQL">ここから</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>