🔍

File Search MCP: ローカルファイルを検索するMCPサーバー

に公開

これは何?

https://x.com/Krgm4D/status/1909638930867306926

これは自分が作成したRust製のModel Context Protocol (MCP) サーバー「File Search MCP」の紹介記事です。

MCP(Model Context Protocol)とは、AIエージェントが外部ツールと連携するための仕組みで、この File Search MCP はローカルファイルの全文検索と内容表示に特化した MCP サーバーです。

どんなことができるの?

例えば「このディレクトリにある情報をLLMによしなに使ってほしいな〜」ってときにこれを使うと、

  1. ローカルディレクトリ内のテキストファイルを全文検索する
  2. ファイルの内容を読み取る

という感じで情報を取ってきてくれます。

なんかそういうMCPサーバーすでにありそうな気がするけど、見つからなかったので作った次第です。
Anthropic公式で出してるやつとかあったらこの話は終わりになるので、もしあったら教えてください。

応用

これを応用すると、以下のようなことができるようになります。

  • Dartのように仕様がオープンソースとして公開されている言語仕様をLLMから参照できる
  • Obsidian等ローカルで管理しているナレッジをLLMから気軽に参照できる
    • Obsidianは公式でMCPサーバーがあるけど、こっちはより汎用的

技術的な仕組み

File Search MCP は以下の技術スタックで構築しています。

  • Rust: パフォーマンス、安全性、並行処理能力に優れたプログラミング言語
  • Tantivy: Rust製の全文検索エンジンライブラリ
  • RMCP: Model Context Protocol の Rust 実装

全文検索を気軽に使えるライブラリが使いたくて色々調べていたところ、Tantivyを見つけたので自動的にRustで作る羽目になりました。
なおRustコードはちょっとだけ触ったことがあるものの、今回はほぼLLMに書かせたので内容の理解度は低いです。改善点等あればぜひPRを送ってください。

動作の仕組み

AIとの会話の中でFile Search MCPが検索命令を受け取ると、以下の流れで動作します:

  1. 指定されたディレクトリ内のテキストファイルをインデックス化(バイナリファイルは除外)
  2. テキストファイルの内容を処理してメモリ内の Tantivy インデックスに追加
  3. 検索クエリが実行されると、インデックスから一致するものを検索し、関連度によってランク付け
  4. 結果はファイルパスと関連スコアとともに返される

この処理はすべてメモリ上で行われるため、実行速度が非常に速いのが特徴です。また、必要なときだけインデックスを作成して、使い終わったら破棄するので、ディスク容量も圧迫しません。

使い方

インストール方法

まず、Rust のインストールが必要です。

次に、リポジトリをクローンします:

git clone git@github.com:Kurogoma4D/file-search-mcp.git
cd file-search-mcp

コンパイルします:

cargo build --release

MCP設定への追加

お使いのAIエージェント(Claude、Cursor など)のMCP設定に以下を追加します:

  • command: <リポジトリへのパス>/target/release/file-search-mcp

<リポジトリへのパス> はクローンしたリポジトリの実際のパスに置き換えてください。

今後の展望

必要に応じて機能を拡張していくのはもちろん、使用メモリの観点等まだ全然チェックしていない部分が多いのでそのへんを改善していければと思ってます。
あと、read_file_content は現状ヒットしたファイルの内容を丸々持ってくる仕様なので、ヒットした前後の文脈とかをピンポイントで持ってこれるとよりコンテキストウィンドウに優しいツールになるんじゃなかろうかと思ってます。

さいごに

File Search MCP は、AIアシスタントがローカルファイルシステムと安全かつ効率的に対話するための橋渡しとなるツールです。Rustで実装することで、高速な検索と安全な実行環境を実現しています。

まだ改良の余地はたくさんありますが、基本的な機能は一通り実装できたので公開することにしました。ぜひ試してみて、フィードバックをいただければ幸いです。プルリクエストも歓迎します🫰

Discussion