FessをMCPサーバーとして利用する

Fessを生成AIと連携させたいという要望が増えてきています。そこで、FessをMCP(Model Context Protocol)サーバーとして利用できるプラグインを公開しました。これにより、Claude DesktopなどのMCP対応AIクライアントからFessの検索機能を直接利用できるようになります。

MCPとは

MCPは、生成AIとデータソースを接続するためのオープンなプロトコルです。Anthropic社が策定したもので、AIアシスタントが外部のツールやデータにアクセスするための標準的な方法を提供します。

Fessをこのプロトコルに対応させることで、AIとの対話の中でFessの検索を行い、検索結果をAIの回答生成に活用できるようになります。

必要な環境

  • Fess 15.x 以降
  • Java 21 以降

インストール方法

fess-webapp-mcpプラグインをインストールすることで、FessがMCPサーバーとして機能するようになります。(管理画面からもインストールできます)

  1. Maven RepositoryからプラグインのJARファイルをダウンロード
  2. ダウンロードしたJARファイルをFessのプラグインディレクトリ(app/WEB-INF/plugin/)に配置
  3. Fessを再起動

再起動後、http://<fess-server>:<port>/mcp でMCPサーバーのエンドポイントが有効になります。

Claude Desktopとの連携

このプラグインの代表的な使い方として、Claude Desktopとの連携があります。Claude Desktopの設定ファイル(claude_desktop_config.json)に以下のように設定を追加します。

{
  "mcpServers": {
    "Fess": {
      "url": "http://localhost:8080/mcp"
    }
  }
}

設定後、Claude Desktopを再起動すると、Fessの検索機能がClaude上で利用できるようになります。

利用できる機能

MCPサーバーとして以下の機能を提供しています。

検索(search)

Fessの全文検索機能を呼び出せます。検索クエリ、件数、ソート順、言語フィルタなどのパラメータを指定できます。AIが対話の中で必要に応じて検索を実行し、その結果を回答に活用します。

インデックス統計情報(get_index_stats)

Fessに登録されているドキュメント数などのインデックス統計情報を取得できます。

設定情報の参照

Fessの各種設定情報(ラベル、パスマッピングなど)をAIが参照できるようになっています。

使い方の例

Claude Desktopで以下のような使い方ができます。

  • 「Fessで〇〇について検索して」と依頼すると、AIがFessに検索を実行し、検索結果をもとに回答を作成
  • 「社内ドキュメントから〇〇に関する情報を探して」といった自然言語での検索依頼が可能
  • 検索結果の要約や、複数の検索結果を横断した分析をAIに依頼

まとめ

fess-webapp-mcpプラグインにより、Fessの検索機能を生成AIから活用できるようになります。RAGのような大規模な仕組みを構築しなくても、既存のFess環境にプラグインを追加するだけで、AIとの連携が実現できます。

プラグインの詳細についてはGitHubを参照してください。

Fess 15.4.0のリリース

Fess 15.4.0をリリースしました。いつもは、codelibs/fessのリポジトリで修正件数は10件いかないくらいだと思いますが、今回はこんな感じで、52件に達しました。大幅に増えた感じではありますが、量だけでなく、質も向上している気はしますが、多くのことをClaude Codeで対応したので、生産性が爆上がりみたいな感じになっています。Fessの開発は、関連する依存ライブラリも毎回修正しているので、実際には52件以上の修正が入っている感じではあります。

コードの修正だけでも結構あったなという感じではありますが、ドキュメントやリリース作業周りでも活用することでかなり楽になりました。ドキュメントに関しても、fess.codelibs.orgでは、7言語で提供しているので、これを手動で作業すると、リリースするのにも数日かかりそうな感じになってしまいますが、Claude Codeに前回リリース作業を理解してもらって、任せることで、待っていれば、そのうち修正が終わるみたいな楽に更新ができるようになりました。

そのほかにもリリースノートの文面も修正内容をまとめるのも数が増えると面倒になりますが、Claude Codeがghコマンドを活用することで、修正内容をピックアップして、いい感じの文面を作って、リリースノートのドラフトまで作成できるので、あとはリリース物をアップロードして、公開するだけになりました。

という感じで、今回のリリースは開発の大幅な効率化して、いろいろと修正してみたリリースになるので、利用してみてください。

Fessにリクエスト制限機能を追加

最近、Fessを公開していると、AIクローラーなどが激しくクロールしてきて、サーバーに負荷がかかることがあります。このような問題に対応するため、Fess 15.4でIPベースのリクエスト制限機能を追加しました。

リクエスト制限機能とは

この機能は、特定のIPアドレスからの短時間での大量リクエストを検出し、自動的にブロックすることでサーバーを保護します。デフォルトでは無効になっているので、必要に応じて有効にしてください。

主な特徴は以下の通りです。

  • IPアドレスごとにリクエスト数をカウント
  • 一定時間内に許可されたリクエスト数を超えると自動的にブロック
  • ブロックされたIPは一定時間後に自動解除
  • ホワイトリストで特定のIPを除外可能
  • ブラックリストで特定のIPを常時ブロック可能

設定方法

fess_config.propertiesに以下の設定を追加することで有効にできます。

# リクエスト制限を有効にする
rate.limit.enabled=true

# 1分間に許可するリクエスト数(デフォルト: 100)
rate.limit.requests.per.window=100

# 計測するウィンドウサイズ(ミリ秒、デフォルト: 60000 = 1分)
rate.limit.window.ms=60000

# 制限超過時のブロック時間(ミリ秒、デフォルト: 300000 = 5分)
rate.limit.block.duration.ms=300000

# Retry-Afterヘッダーの値(秒、デフォルト: 60)
rate.limit.retry.after.seconds=60

ホワイトリストとブラックリスト

特定のIPアドレスを制限から除外したり、常時ブロックしたりすることができます。

# 制限から除外するIPアドレス(カンマ区切り)
rate.limit.whitelist.ips=127.0.0.1,::1,192.168.1.100

# 常時ブロックするIPアドレス(カンマ区切り)
rate.limit.blocked.ips=203.0.113.50,198.51.100.25

リバースプロキシ環境での設定

NginxやApacheなどのリバースプロキシを使用している場合、クライアントの実際のIPアドレスを取得するために、信頼できるプロキシのIPアドレスを設定する必要があります。

# 信頼するプロキシのIPアドレス(カンマ区切り)
rate.limit.trusted.proxies=127.0.0.1,::1,10.0.0.1

この設定がない場合、すべてのリクエストがプロキシのIPアドレスとして認識されてしまい、正しく制限が機能しません。

制限超過時の動作

リクエスト制限を超えた場合、HTTPステータス429(Too Many Requests)が返されます。レスポンスにはRetry-Afterヘッダーが含まれ、何秒後に再試行できるかが示されます。

ブラックリストに登録されたIPからのアクセスの場合は、HTTPステータス403(Forbidden)が返されます。

注意事項

  • この機能はFess 15.4以降で利用可能です
  • デフォルトでは無効になっています
  • 設定値は環境に応じて適切に調整してください
  • ホワイトリストにはローカルホスト(127.0.0.1, ::1)がデフォルトで含まれています