はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】AssetBundleを解析してくれるMCP Server「AssetBundleMCP」をOSSとして公開しました

はじめに

先日AssetBundleMCPというAssetBundleを解析するMCP Serverを公開しました。

github.com

今回は背景、概要、使い方、あと技術的な話も書こうと思います。

背景

まずAssetBundleの解析についてですが、公式が出しているUnityDataToolsを利用することで可能です。
github.com

ただこれセットアップが結構めんどくさいのが大きいのと、コマンドラインで色々と操作しないといけないのでUnityしか普段触られていない方にとっては結構ハードル高いなという印象がありました。実際にネットで調べてもそこまで記事が出てこないので、そんなに知名度がなく使われていなそうな気がします。

そんなときにmcp-dotnetという、dnlibを活用して.NETアセンブリを解析するMCP ServerがOSSとして公開されていることを知りました。
github.com

これと同じ発想で、AssetBundleをAIで解析しつつ、セットアップを徹底的に簡単にすることでより便利かつ広がりやすいのかなと思い作成に至ります。

概要

AssetBundleを解析してくれるMCP Serverですが、もっと分かりやすく書くとGemini CliやCopilot Agnet、Claude Code、CursorなどからAssetBundleの解析を自然言語を通して行うことができるようになります。

以下はGemini Cliで実際に行ってみたやり取りの一部です。

╭────────────────────────────────────────────────────────────────────────────╮
│  > C:/Users/..../sampleassetbundleのパスにあるアセットバンドルを             │
│    解析してください。                                                       │
╰────────────────────────────────────────────────────────────────────────────╯

✦ アセットバンドルを解析します。
 
✦ アセットバンドルの解析が完了しました。どのような情報を表示しますか?

╭────────────────────────────────────────────────────────────────────────────╮
│  > アセットバンドルにはどんなアセットが含まれますか?表形式で回答してください。  │
╰────────────────────────────────────────────────────────────────────────────╯

 
✦ 以下にアセットの一覧をテーブルで示します。


  ┌─────────────────────────┬───────────┬──────┬──────────┐
  │ アセット名               │ 種類      │ 名前  │ サイズ   │
  ├─────────────────────────┼───────────┼──────┼──────────┤
  │ assets/sampledata/3.png │ Sprite    │ 31.1 KB   │
  │ assets/sampledata/3.png │ Texture2D │ 3256.2 KB │
  │ assets/sampledata/1.png │ Sprite    │ 1868.0 B  │
  │ assets/sampledata/1.png │ Texture2D │ 1256.2 KB │
  │ assets/sampledata/2.png │ Texture2D │ 2256.2 KB │
  │ assets/sampledata/2.png │ Sprite    │ 21.0 KB   │
  └─────────────────────────┴───────────┴──────┴──────────┘

また結構いろいろなことを知ることができまして、テクスチャのWidthHeightやバイト数だったり、マテリアルがどのシェーダーやテクスチャを参照しているかだったり、アセットバンドル間の依存だったりも知ることができます。

READMEにある利用可能なツール一覧を見ることでも、ある程度できることが分かるかと思います。
github.com

使い方

以下の3ステップが一通りの流れになります。
1. 対象のAssetBundleをロードする
2. 情報を取得する
3. AssetBundleの解析結果を破棄する

1. 対象のAssetBundleをロードする

まずは対象のAssetBundle、もしくはAssetBundleを含むディレクトリへのパスを指定してロードをしてもらいます。ロードをすることで、カレントディレクトリにSQLiteが出力されます。(一応出力先も指定できます)

# User
> C:/path/to/your/assetbundlesにあるAssetBundleを解析してください

仮にディレクトリへのパスを指定した場合、その中を再帰的に調べます。アセットバンドル以外のファイルは無視されるのでご安心ください。

2. 情報を取得する

あとは知りたい情報を聞きます。毎回ロードする必要はないので、何回も質問して大丈夫です。

# User
> ロードしたAssetBundleに含まれるアセットの一覧を表形式で教えて下さい

またロードの際に生成したSQLiteを参照しているので、途中でAssetBundleに変更を加えても反映されないので注意してください。

3. AssetBundleの解析結果を破棄する

もう解析をする必要がなくなった場合は、解析結果が格納されているSQLiteを削除して、キャッシュを削除します。

# User
> ロードしたAssetBundleをアンロードしてください。

アンロードした後は、再度別のAssetBundleをロードすることが可能です。

技術的な話

ロードとアンロード

まずロードが実行されるとUnityDataToolsを活用してSQLiteを出力します。そしてアンロードでSQLiteを削除します。

毎回Toolを呼び出すたびにAssetBundleを読み込むのも考えたのです、パフォーマンス的な意味と外部連携の意味で見送りました。一応冒頭で紹介したmcp-dotnetも最初にロードするタイプになります。
GitHub - neoz/mcp-dotnet

おそらくパフォーマンス的な面は体感許容できる範囲かなという気もしているのですが、出力したSQLiteを外部ツールなどで利用するみたいなケースでも使えるの結構魅力的かもなと思っています。SQLiteの後始末がまあちょっと面倒ではありますが。


また同じ理由で見送りましたが、Microsoft.Data.SqliteのInMemory機能を利用して、ストレージにSQLiteを配置しないのも検討しました。もしかしたらオプションでメモリにデータを保存できるもあったら面白いかもしれませんね。
learn.microsoft.com

配布方法に関して

NuGetで配布しているのですが、.NET10の最新機能であるdnxを活用すると、設定ファイルに記述するだけでセットアップは終わります。
www.nuget.org
www.hanachiru-blog.com

{
  "mcpServers": {
    "AssetBundleMCP": {
      "command": "dnx",
      "args": [
        "AssetBundleMCP",
        "--yes"
      ]
    }
  }
}

自身の環境に.NET10をインストールしないといけないのは注意点なのですが、是非この際に入れてみてはいかがでしょうか。とても便利なので入れる価値はあると思います。
dotnet.microsoft.com

AIにSQLを書かせる

個人的にかなり面白いと感じたものが、AIにクエリを書かせるということです。具体的にはexecute_sql_queryというToolを用意しているのですが、意外とAIが正しいクエリを書いてくれます。

╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮
│  > クエリを用いてassets/sampledata/1.pngというアセットがどのAssetBundleに所属しているのかを教えてください。  │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯

 
✦ assets/sampledata/1.pngというアセットはsampleassetbundleに所属しています。

╭───────────────────────────────────────────╮
│  > 具体的にどういうクエリを実行しましたか?     │
╰───────────────────────────────────────────╯

✦ SELECT asset_bundle FROM asset_view WHERE asset_name = 'assets/sampledata/1.png' というクエリを実行しました。

スキーマ構造であったり、クエリのサンプルはMCP ServerのResourceで提供しています。ちゃんとそれを読んでくれているのかは分かりませんが、AIすごいです。

最近Julesを触ったりもしているのですが、もはや仮想環境を用意してAIに自由にやらせた方が良いアウトプットが得られるという、令和プログラミングの片鱗を感じています。

さいごに

もしよければスターをしていただけると、モチベーションアップに繋がります!
github.com

今後はOSS活動にも力を入れていきたいなーと思っています。