Unity製ゲームのランタイムに組み込んでAIエージェントにゲームをプレイさせるためのMCPサーバパッケージを公開しました。 Unityエディタを操作するMCPサーバは多数公開されていますが、これは操作対象がゲーム本体で、エディタ内だけでなくプレイヤービルドでも動作するものです*1。
基本的なツールの実装を終えた状態で、バージョンは 0.3.0 です*2。
MCPサーバ部分には MCP C# SDK を採用、ゲームタイトルで自由にカスタムツールを追加できます。 uGUI要素の操作は DeNA/Anjin でも使用されている UI Test Helper を使用しており、GameObjectの出現を(固定時間でなく)ポーリングで待ったり、ユーザの操作をブロックするオブジェクトがあるときは操作できないと判断するなど、UIテストに必要な機能を備えています。また、ゲームタイトル固有のカスタムUIフレームワークにも対応できます。
ビルトインツール
ビルトインで提供しているツールは次の5つです。
list_available_actions
画面に表示されている操作可能な*3 GameObject と、可能な操作(クリック、ドラッグなど)の組み合わせを返します。 モデルはこの中から次のアクションを選択できます。
invoke_action
対象 GameObject と操作を指定して、操作を実行します。
inspect_game_object
GameObject を、name, path*4, text*5, texture*6 を指定して検索し、プロパティを取得します。 表示まで時間がかかる場合でも GameObject の出現を一定時間ポーリングして待ちます。 操作の結果、表示されるはずの GameObject を確認するのに使用できます。
take_screenshot
スクリーンショットを撮影して返します*7。
list_scenes
ロードされているSceneを返します。簡易的なゲームの状態確認ツールです。
カスタムツールの実装
ゲームタイトル固有のカスタムツールを追加できます。たとえば次のような用途を想定しています。
- 現在のゲームの状態を返す
- uGUI以外の操作
- デバッグコマンドの実行
カスタムツールは、次のように MCP C# SDK の [McpServerToolType] および [McpServerTool] 属性を配置することで認識されます。
// Assets/Scripts/Runtime/MyGameTools.cs (custom tools created by the game title) // Just add [McpServerToolType] and it's registered automatically! [McpServerToolType] public class MyGameTools { [McpServerTool(Name = "get_player_status", ReadOnly = true, Destructive = false)] [Description("Returns the player's current status as JSON.")] public async Task<string> GetPlayerStatus(CancellationToken ct = default) { await UniTask.SwitchToMainThread(ct); var player = GameObject.FindWithTag("Player"); return JsonSerializer.Serialize(new { hp = player.GetComponent<Health>().Current }); } }
なお、たとえばゲームの状態を返すツールを実装したことによって list_scenes ツールが不要になったときは、次のように無効化できます。
var config = new McpConfig(); config.DisabledTools.Add("mygame.list_scenes");
使用方法
インストール
あらかじめ MCP C# SDK v1.0.0 以降をインストールします。 NuGetパッケージなので NuGetForUnity などを利用してください*8。NuGetForUnityの使いかたについては過去記事を参照してください。
続いて Gameplay MCP Server for Unity パッケージをOpenUPMからインストールします*9。
- Project Settings ウィンドウを Editor > Project Settings で開き、Package Manager タブを選択
- Scoped Registries 下の + ボタンをクリックして次のように入力します
- Name:
package.openupm.com - URL:
https://package.openupm.com - Scope(s):
com.nowsprintingandcom.cysharp
- Name:
- Package Manager ウィンドウを Window > Package Manager で開き、My Registries タブを選択
- Gameplay MCP を選択して Install ボタンをクリック
MCPサーバの起動
MCPサーバは次のコードで起動できます。
[RuntimeInitializeOnLoad] 属性などでゲーム起動時に常に起動したり、デバッグメニューから起動するなどします。
var config = new McpConfig { OperatorPool = new OperatorPool() .Register<UguiClickOperator>() .Register<UguiDragAndDropOperator>() .Register<UguiTextInputOperator>() }; var server = new McpServer(config); server.StartAsync().Forget();
McpConfigには使用するオペレーターのほか、GameObjectを探す GameObjectFinder、操作可能の判断に使用するストラテジ関数などを指定できます。
これらはUI Test Helperパッケージの機能なので、詳細はUI Test Helperのドキュメントを見てください。
なお、サーバの待ち受けポートは McpConfig のほか、コマンドライン引数でも指定できます。マルチプレイヤーでも安心。
AIエージェントの設定
次のように設定します。Claude Codeの例:
{ "mcpServers": { "gameplay": { "type": "http", "url": "http://localhost:8010/mcp" } } }
Agent Skills
MCPサーバだけでも操作手順を指示する形であれば動くはずですが、ゲームを自律的プレイさせるには、ゲームのルール、目的などをAgent Skillsとして与える必要があります。
また、uGUIの操作ができなかったときなどの問題の切り分けのために、UI Test Helperのトラブルシュート資料もスキル化しておくと役立つはずです。
今後の展望
あといくつかツールを追加*10するほか、UI Test Helperの Paginator 関連の機能追加などを予定しています。
*1:IL2CPPビルドでも動作しますが、仕組み上WebGLは対象外です
*2:中途半端ですが、なんとなく今週アナウンスしようという気持ちになたっため
*3:interactable=true かつ、カメラからレイキャストが通る(ほかのオブジェクトにブロックされていない)もの
*4:ヒエラルキーのパス
*5:ボタンなどの表示テキスト
*6:ボタンなどのテクスチャファイル名
*7:スクリーンショットは補助的な、結果確認用ツールの位置づけなのですが、エージェントは割と安易に使ってきます。無駄なトークン消費を抑えるためには、Agent Skillsで用途を限るように書くなどして抑制してください
*8:UnityNuGetには登録済みで、レジストラへの反映待ち
*9:git urlでもインストールできますが、その場合は依存パッケージを手動でインストールしてください
*10:persistentDataPathアクセスなどを予定