Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

OpenSearch 3.0 でMCPによるAgentとの連携を行ってみる

はじめに

こんにちは。データ分析エンジニアの木介です。
今回は、OpenSearch 3.0の最新リリースについての紹介と、新たに対応したMCP(Model Context Protocol)を用い外部リソースとOpenSearchの連携方法について解説していきます。
opensearch.org

OpenSearchでのMCPの利用方法は、以下の2つの構成があります。

構成①:OpenSearchからMCPを利用する
OpenSearch内でMCPクライアント/サーバーを構築し、ユーザーからの検索内容に応じてMCP経由でリソースを利用する方法。

構成➁:MCPサーバーからOpenSearchを呼び出す
ユーザーがMCPクライアントを用意し、OpenSearch内で構築されたMCPサーバー経由でLLMからOpenSearch内のリソースを操作する方法。

OpenSearch 3.0の更新点

まずOpenSearch 3.0では、以下のような主要な機能追加と改善が行われました。

opensearch.org

  1. MCP(Model Context Protocol)へのネイティブ対応
    • AIエージェントとの連携を容易にするための、MCPへの対応。
  2. Lucene 10およびJDK 21へのアップグレード
    • 検索性能が大幅に向上し、ベクター検索の処理速度が改善。
  3. PPL(Piped Processing Language)の強化
    • lookup、join、subsearchコマンドが追加され、ログの相関分析やリアルタイムなデータの補完が容易になった。
  4. ベクター検索機能の拡張
    • GPUによるベクターインデックスの構築が可能となり、インデックス作成速度が向上。
  5. ダッシュボード機能の強化
    • 「Workspaces」機能が追加され、ユーザーごとに異なるビューを提供可能となった。
  6. ストリーミングデータのプル型取り込みのサポート
  7. セキュリティ機能の強化
    • Java Security Managerの廃止に伴い、新たなJavaエージェントベースのセキュリティモデルの導入。

今回の記事では特にMCP(Model Context Protocol)に関する機能について実際に動かして解説を行っていきます。
opensearch.org

構成①:OpenSearchからMCPを利用する

まずはOpenSearchからMCPサーバーを利用する方法について紹介していきます。
OpenSearchからのMCPサーバーの利用については、以下の形で行われます。

  1. OpenSearch内部で動くAgentにリクエストを送信する。
  2. Agentが利用するMCPを決定する。
  3. Agentが必要な情報をMCPサーバー経由で取得する。

今回はAWS Documentation MCP ServerをOpenSearchから利用するMCPサーバーとして解説を行っていきます。
awslabs.github.io

1. OpenSearch 3.0の構築

今回利用するOpenSearch 3.0はdockerを使って構築していきます。
docker-compose.ymlは以下のレポジトリの物を利用しました。
docs.opensearch.org

また今回OpenSearchMCPによる利用のために以下の設定をopenserach.ymlに追加しています。
opensearch.yml

http.type: reactor-netty4


上記作成後に以下のコマンドを実行することでOpenSearch 3.0を利用可能です。

docker compose up -d

OpenSearchおよびOpenSearch DashboardへのURLは以下になります。

2. AWS Documentation MCP Serverの構築

以下のdocker-compose.ymlおよびDockerfileを用いて構築を行いました。
docker-compose.yml

services:
  aws-doc-mcp:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      FASTMCP_LOG_LEVEL: INFO


Dockerfile
こちらのDockerfileのCMD部分を以下の形に差し替える。
github.com

CMD ["python3", "-m", "awslabs.aws_documentation_mcp_server.server","--sse"]

上記ファイルをAWS Documentation MCP サーバーのソースコード内に配置後にdocker compose upコマンドを実行することでAWS Documentation MCP ServerがこちらのURLで立ちあがります。

http://aws-documentation-mcp-server-aws-doc-mcp-1:8888


docker compose up -d
# opensearchコンテナとネットワークを共有する。
docker network connect <OpenSearchコンテナネットワーク名> <MCPサーバーのコンテナネットワーク名>

3. OpenSearchの設定

以下のコマンドをOpenSearch DashboardのDevツール上でそれぞれ実行していきます。

1. MCPコネクタを作成する。

POST /_plugins/_ml/connectors/_create
{
  "name": "AWS Documentation MCP",
  "description": "Connects to the AWS Documentation MCP Server",
  "version": 1,
  "protocol": "mcp_sse",
  "url": "http://aws-documentation-mcp-server-aws-doc-mcp-1:8888",
  "credential": {
    "mcp_server_key": "dummy"
  },
  "headers": {
    "Authorization": "Bearer ${credential.mcp_server_key}",
    "Accept": "application/json, text/event-stream"
  }
}

2. Agentに利用するモデルの登録
OpenSearch内でMCPを外部ツールとして利用するAgentの設定を行います。
こちらを利用することでクエリから必要な情報をMCPサーバーを通じて取得することが出来ます。
docs.opensearch.org

今回はAgentに利用するモデルとしてはGPT-4oを利用しました。
OpenAI API Keyは適宜代入する必要があります。

POST /_plugins/_ml/models/_register
{
  "name": "My OpenAI model: gpt-4",
  "function_name": "remote",
  "description": "Test model registration (this example uses OpenAI, but you can register any model)",
  "connector": {
    "name": "My OpenAI Connector: gpt-4",
    "description": "Connector for the OpenAI chat model",
    "version": 1,
    "protocol": "http",
    "parameters": {
      "model": "gpt-4o"
    },
    "credential": {
      "openAI_key": "OpenAIのAPI Key"
    },
    "actions": [
      {
        "action_type": "predict",
        "method": "POST",
        "url": "https://api.openai.com/v1/chat/completions",
        "headers": {
          "Authorization": "Bearer ${credential.openAI_key}"
        },
        "request_body": "{ \"model\": \"${parameters.model}\", \"messages\": [{\"role\":\"developer\",\"content\":\"${parameters.system_instruction}\"},${parameters._chat_history:-}{\"role\":\"user\",\"content\":\"${parameters.prompt}\"}${parameters._interactions:-}], \"tools\": [${parameters._tools:-}],\"parallel_tool_calls\":${parameters.parallel_tool_calls},\"tool_choice\": \"${parameters.tool_choice}\" }"
      }
    ]
  }
}

3. Agentを登録する
以下の形でAgentを登録します。
モデルIDとMCPコネクタIDは上記で登録したものに置き換える必要があります。

POST /_plugins/_ml/agents/_register
{
  "name":        "AWS Documentation Bot",
  "type":        "conversational",
  "description": "Uses MCP to fetch AWS Documentation and OpenSearch indices",
  "llm": {
    "model_id": "登録したモデルID", 
    "parameters": {
      "max_iteration": 5,
      "system_instruction": "You are a helpful assistant.",
      "prompt": "${parameters.question}"
    }
  },
  "memory": {
    "type": "conversation_index"
  },
  "parameters": {
    "_llm_interface": "openai/v1/chat/completions",
    "mcp_connectors": [
      {
        "mcp_connector_id": "登録したMCPコネクタID",
        "tool_filters": [
          "^*"
        ]
      }
    ]
  },
  "tools": [
    { "type": "ListIndexTool" },
    { "type": "SearchIndexTool" }
  ],
  "app_type": "os_chat"
}

4. 実行結果

以下がOpenSearchからAWS Documentation MCP Server経由でクエリをかけた際の結果です。
実行クエリ

POST /_plugins/_ml/agents/CTknCZcBB9F2JENRZmHE/_execute
{
  "parameters": {
    "question": "AWS Bedrock カスタムオーケストレーションについて教えてください",
    "verbose": true
  }
}

実行結果

{
  "inference_results": [
    {
      "output": [
        {
          "name": "memory_id",
          "result": "kNaICZcByOz0c-V3RJjo"
        },
        {
          "name": "parent_interaction_id",
          "result": "kdaICZcByOz0c-V3RJj1"
        },
        {
          "name": "response",
          "result": """AWS Bedrock は、AI モデルの選択、カスタマイズ、デプロイを簡単に行うことができるマネージドサービスです。Bedrockのカスタムオーケストレーション機能を使用すると、生成AIアプリケーションにおけるさまざまなタスクを効率的に管理し、自動化することができます。

Bedrockのカスタムオーケストレーションでは以下のようなことが可能です:

1. **モデルのシーケンシャル実行**: 例えば、テキスト生成モデルの出力を評価モデルに渡して、生成結果の品質を評価する、といった一連の処理をシームレスに設定できます。

2. **条件分岐**: 異なる条件に基づいて異なるAIモデルや処理フローを実行することができます。例えば、入力の内容に応じて異なる自然言語処理モデルを選択することができます。

3. **ループ処理**: 特定の条件が満たされるまで同じモデルを何度も実行するような処理や、大規模なデータセットに対して繰り返し処理を行うことができます。

4. **イベント駆動型プロセス**: Amazon S3Amazon SNSLambda などの AWS サービスと統合することで、データの更新や特定のイベントに基づいて自動的にワークフローをトリガーできます。

5. **エラー処理とリトライ**: ワークフロー内でエラーが発生した場合の対処方法を定義したり、自動で再試行するよう設定することができます。

カスタムオーケストレーションは、AWS Step FunctionsAWS Lambda などのサービスと組み合わせて使用されることが多く、これにより非常に柔軟で拡張性のある処理フローを構築できます。これにより、生成AIを用いたアプリケーション開発が効率化され、開発者はアプリケーションのビジネスロジックに集中することができます。

Bedrock のカスタムオーケストレーションは、企業がAIを用いてビジネスプロセスを自動化する際に、きめ細かな制御と柔軟性を提供します。"""
        }
      ]
    }
  ]
}

AWS Documentation MCP Serverを利用したレスポンスを返せていることがわかります。
OpenSearch内のIndex情報を取得するMCPサーバーも組み込みで提供されているため、OpenSearch内部と外部の情報を組み合わせた検索を簡単に実現することが出来そうです。

構成➁:MCPサーバーからOpenSearchを呼び出す

では次にOpenSearchMCPサーバー経由で利用する方法について以下の記事を参考に紹介していきます。
opensearch.org

MCPクライアントとしてはClaude Desktop を使い、以下の形でOpenSearch内のデータについてMCPを使って質問を行えることを目的にします。

今回はOpenSearchからの検索対象として公式から提供されている以下のeCommerceについてのサンプルデータをあらかじめIndexに挿入しています。
github.com

以下の形で検索対象とするIndexなどを設定することで利用可能となります。

POST /_plugins/_ml/mcp/tools/_register
{
  "tools": [
    {
      "type": "ListIndexTool"
    },
    {
      "type": "SearchIndexTool",
      "attributes": {
        "input_schema": {
          "type": "object",
          "properties": {
            "input": {
              "type": "object",
              "properties": {
                "index": {
                  "type": "string",
                  "description": "OpenSearch index name. Example: opensearch_dashboards_sample_data_ecommerce",
                  "enum": ["opensearch_dashboards_sample_data_ecommerce"]
                },
                "query": {
                  "type": "object",
                  "description": "OpenSearch DSL query",
                  "properties": {
                    "match": {
                      "type": "object",
                      "properties": {
                        "customer_full_name": {
                          "type": "string",
                          "description": "Customer's full name to match"
                        }
                      },
                      "required": ["customer_full_name"]
                    }
                  },
                  "required": ["match"]
                }
              },
              "required": ["index", "query"]
            }
          }
        },
        "required": ["input"],
        "strict": false
      }
    }
  ]
}

早速Claude Desktopから利用してみましょう。

clade_desktop_config.jsonは以下の形に設定しました。

{
  "mcpServers": {

      "opensearch-mcp-server": {
        "command": "uvx",
        "args": [
            "test-opensearch-mcp"
        ],
        "env": {
            "OPENSEARCH_URL": "http://localhost:9200",

            "OPENSEARCH_USERNAME": "admin",
            "OPENSEARCH_PASSWORD": "OpenSearchのパスワード"
        }
    }
}

以下がClaude Desktopから利用してみた例になります。
質問

どのようなデータが入っていますか?

回答

指定したIndexに対して検索を行い回答が出来ていることがわかります。
この機能を用いることで既存のOpenSearchにあるデータも簡単にAgentで利用することが可能となりそうです。

まとめ

OpenSearch 3.0の新機能について特にMCP周りを重点的に紹介しました。
OpenSearchMCPをサポートすることで外部リソースとの連携が非常に簡単になったと感じます。
これからもOpenSearchMCP周りは追っていきたいですね。

Acroquest Technologyでは、キャリア採用を行っています。

  • Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com