Algolia 検索を活用した MCP サーバー構築と RAG 実現

Algoliaの検索APIを活用し、Cloudflare Workers上にMCPサーバーを構築。ベクトル検索なしでRAGを簡単に実現する方法を解説します。

広告ここから
広告ここまで

目次

    近年、RAG(Retrieval-Augmented Generation)を活用した AI アプリケーションが注目を集めています。しかし RAG のために新たにベクトル検索基盤を構築するとなると、データを同期・Embedding変換するパイプラインの構築や、ベクトル検索のためのDBサーバーの調達とその運用などを事前に計画する必要が生まれます。

    この記事では、できるだけ簡単に RAG 相当の仕組みを構築するため、 Algolia による検索 API を活用しする方法を紹介します。また RAG の検索部分だけを簡単にデモする方法として、 Algolia への検索を行う MCP(Model Context Protocol)サーバーとして Cloudflare Workers 上にデプロイ方法についても紹介します。

    目指すものについて

    今回の実装では、ベクトル検索を使わず、 Algoliaを使った検索 API をそのまま利用します。MCP サーバーのツールとして「search_algolia」を実装し、 RAG の「Retriever」として振る舞うように作ります。

    JavaScript で Algolia 検索を実装する

    Retriever を作るには、シンプルな検索処理を実装する必要があります。ここでは公式が提供する alogliasearch を利用した、シンプルな検索関数を実装します。

    export async function searchAlgolia(query) {
      const client = algoliasearch(
        process.env.ALOGLIA_APP_ID,
        process.env.ALGOLIA_APP_API_KEY,
        { requester: createFetchRequester() }
      );
      const { results } = await client.search([{
        indexName: "wp_searchable_posts",
        params: { 
          query: query,
          filters: 'NOT post_type_label:"固定ページ"'
        },
      }]);
      return results.hits
    }

    Algolia のクライアント初期化では、API キーと App ID を環境変数から取得しています。Cloudflare Workers でこの SDK を利用するため、createFetchRequester() を忘れずに設定しましょう。

    検索の実行時には、client.search メソッドで対象のインデックス(wp_searchable_posts)に対してクエリを発行します。params オブジェクトには検索キーワードのほか、固定ページを除外するフィルタも指定可能です。

    MCP サーバーへの組み込み

    検索を実施する関数が用意できたら、あとはこれをMCPサーバーのツールから呼び出すだけです。CloudflareのAgents SDKを利用した場合は、次のようなコードになります。

    export class MyMCP extends McpAgent<Cloudflare.Env, State, Props> {
      server = new McpServer({
        name: "Hello MCP",
        version: "0.0.1",
      });
      async init() {
        this.server.tool(
          "search_algolia",
          "Algoliaで検索します。",
          {
            query: z.string().describe("検索キーワード"),
          },
          async (params) => {
            const res = await searchAlgolia(params.query);
            return {
              content: [{ type: "text", text: JSON.stringify(res) }],
            };
          },
        );
        // ...(他ツールの登録)
      }
    }

    Agent SDKの場合、ツールの登録は this.server.tool メソッドを使用します。各ツールには一意の名前(ここでは search_algolia)と説明文を付与し、パラメータの型定義も Zod スキーマで明示的に指定します。Retrieverとしてツールを登録する場合、戻り値は content フィールドに文字列へ変換した形でオブジェクトを渡すことになります。

    Cloudflare Workers にデプロイする

    今回のMCPサーバーを Cloudflare へデプロイする場合、compatibility_flagsnodejs_compatnodejs_compat_populate_process_env の設定が必要です。これはAlgoliaへのアクセスにprocess.env を使用しているためです。

    {
      "name": "mcp-hono",
      "main": "src/index.tsx",
      "compatibility_date": "2024-05-01",
      "compatibility_flags": ["nodejs_compat", "nodejs_compat_populate_process_env"]
    }

    APIキー自体は wrangeler secretコマンドなどで設定するようにしましょう。.dev.varsに設定する場合はまとめてアップロードすることもできます。

    npx wrangler secret bulk .dev.vars

    まとめ

    今回の Algoliaを利用した Retriever MCPツールを実装する方法は、Algoliaにあるデータを活用しつつ、RAGにおけるクエリ生成や検索結果に基づく回答生成についても Claude / ChatGPTなどの既存 AIサービスを利用できることが強みです。これにより、最小限の開発コストで RAG のプロトタイプを作ることができます。データや検索精度と、想定していたユーザー体験の再現度合いなどをこれによって評価し、その上でベクトル検索を採用するかなどを検討しましょう。

    ただし、検索結果をそのまま LLM に渡すとコンテキストウィンドウを圧迫する可能性があります。そのため、検索結果のうち、タイトル・抜粋・本文の一部だけを渡すようにしたり、検索結果の上位数件のみを利用したりするなどの調整が必要になることもあります。また、検索結果の関連度スコアを活用して、より精度の高い情報選択を行うこともできるでしょう。

    本記事で紹介した実装方法を参考に、ぜひ自社の検索基盤を活用した RAG システムの構築を検討してみてください。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark