お知らせ
先日、自身で作成しているUnityのMCPサーバーを公開しました!
Unityの基本的な機能はカバーできているのですが、まだ安定しないAPIは除外しております。
リクエストがあれば、遠慮なくお声がけ&Issue立ててください。
概要
MCPを導入すれば、AIがUnity Editorを直接操作できるようになります。
「Playerオブジェクトを作成して」と指示すれば、AIがMCPを通じてGameObjectを作成してくれる。
はずでした。
しかし実際には、MCPが正しく機能しない状況で、AIが予期しない行動を取ることがあります。
本記事では、実際に観察された事例をもとに、なぜそれが起きるのか、どう対処すべきかを解説します。
対象読者
- Unity開発者
- Claude Code等のAIアシスタントを開発に活用している方
- MCPを導入したが、期待通りに動かない経験がある方
観察された問題事例
事例1: GameObjectの作成でエディタスクリプトを生成する
MCPを通じてGameObjectを作成するよう指示したところ、AIが以下のようなコードを生成しました。
// AIが生成した「代替手段」
using UnityEditor;
using UnityEngine;
public class SceneSetup
{
[MenuItem("Tools/Setup Scene")]
public static void Setup()
{
var player = new GameObject("Player");
player.AddComponent<Rigidbody>();
UnityEditor.SceneManagement.EditorSceneManager.SaveScene(
UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()
);
}
}
問題点:
- MCPのAPIを使わず、エディタスクリプトを生成している
- ユーザーがメニューから手動実行する必要がある
- 対話的な操作が失われている
事例2: コンポーネント操作でEditorWindowを作成する
コンポーネントのプロパティを変更する指示に対して、AIがエディタウィンドウを作成し始めました。
// AIが生成した「代替手段」
using UnityEditor;
using UnityEngine;
public class ComponentEditor : EditorWindow
{
[MenuItem("Window/Component Editor")]
public static void ShowWindow()
{
GetWindow<ComponentEditor>("Component Editor");
}
private GameObject target;
private float speed = 5f;
void OnGUI()
{
target = (GameObject)EditorGUILayout.ObjectField("Target", target, typeof(GameObject), true);
speed = EditorGUILayout.FloatField("Speed", speed);
if (GUILayout.Button("Apply"))
{
var controller = target.GetComponent<PlayerController>();
if (controller != null)
{
var so = new SerializedObject(controller);
so.FindProperty("moveSpeed").floatValue = speed;
so.ApplyModifiedProperties();
}
}
}
}
問題点:
- GUIツールを作成してしまっている
- MCPを使えば1行で済む処理
- ユーザーの手作業が増えている
事例3: プレハブ作成でAssetDatabaseを直接操作する
プレハブを作成する指示に対して、AIがAssetDatabaseを直接操作しようとしました。
// AIが生成した「代替手段」
using UnityEditor;
using UnityEngine;
public static class PrefabCreator
{
public static void CreatePrefab(GameObject source, string path)
{
PrefabUtility.SaveAsPrefabAsset(source, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
問題点:
- MCPのAPIを使っていない
- パス指定を間違えるリスクがある
- 対話的なフィードバックが得られない
なぜこのような「暴走」が起きるのか
これらの事例に共通するのは、AIがMCPを使わずに目的を達成しようとしている点です。
なぜAIはMCPを使わなかったのでしょうか。
1. 接続エラー
MCP Bridgeとの接続が切れている、またはUnity側のサーバーが起動していない場合、AIはMCPを呼び出せません。
2. 過去の学習データの影響
AIはMCPが存在しなかった時代のUnityコードも大量に学習しています。そのため、エディタ拡張やAssetDatabase操作のパターンを「正解」として提案してしまいます。
3. APIの認識失敗
そして最も重要なのが、AIがMCPの利用可能なAPIを認識できていないケースです。
tools/listの役割
MCPにはtools/listというエンドポイントがあります。
これは、AIが「今、何ができるのか」を知るための仕組みです。
// tools/list のレスポンス例
{
"tools": [
{
"name": "unity.gameObject.create",
"description": "GameObjectを作成します",
"inputSchema": { ... }
},
{
"name": "unity.component.add",
"description": "コンポーネントを追加します",
"inputSchema": { ... }
}
]
}
AIはセッション開始時にこのエンドポイントを呼び出し、利用可能なツールの一覧を取得します。
この一覧に基づいて、AIは「どのAPIを使えばよいか」を判断します。
tools/listが正しく機能しない場合
tools/listが空のレスポンスを返す、またはエラーになる場合、AIは以下の状態に陥ります。
- 利用可能なAPIがわからない → 何を呼べばいいかわからない
- 自分の知識に頼る → 学習済みのUnityコード(エディタ拡張等)を使おうとする
- 代替手段を提案する → MCPを使わない方法を選択する
つまり、先ほどの「暴走」事例は、tools/listが正しく機能していなかった可能性が高いのです。
対処法
1. MCPの接続状態を確認する
Unityのコンソールで接続状態を確認します。
[MCP] Server started on port 5052
[MCP] Client connected
このログが表示されていない場合、セットアップを再実行してください。
2. tools/listが正しく返されているか確認する
MCPサーバーが起動していても、tools/listが空の場合があります。
Unity側のAPIが正しく登録されているか確認してください。
3. 「MCPを使って」と明示的に指示する
曖昧な指示ではなく、MCPの使用を明示します。
❌ 「Playerオブジェクトを作成して」
✅ 「MCPを使って、Playerオブジェクトを作成して」
4. エディタスクリプト生成を禁止する
必要に応じて、制約を明示します。
注意:
- AssetDatabaseを直接呼び出さないでください
- EditorWindowを作成しないでください
- 必ずMCPのAPIを通じて操作してください
5. エラー発生時は原因を確認する
AIが「別の方法」を提案してきた場合、それはMCPに問題があるサインです。
代替手段を受け入れるのではなく、なぜMCPが使えなかったのかを確認します。
- Unity Editorは起動しているか?
- MCP Serverは動作しているか?
-
tools/listは正しいレスポンスを返しているか?
Skillsによる解決
ここまで「MCPを使って」と明示的に指示する方法を紹介しました。
しかし、毎回これを書くのは面倒ですし、忘れることもあります。
tools/listはAIにAPIの存在を伝える仕組みですが、「必ずそれを使え」という強制力はありません。
AIは状況に応じて、学習済みの知識(エディタスクリプト等)を選択する可能性があります。
この問題を解決するのが、Claude Codeの**Skills(スキル)**機能です。
スキルは、特定の作業に対するカスタム指示をあらかじめ定義しておく仕組みです。
たとえば、Unity操作用のスキルに以下のような指示を組み込んでおきます。
Unity Editorの操作は、必ずMCPのAPIを通じて行ってください。
AssetDatabaseやEditorWindowを直接使用しないでください。
このスキルを有効にしておけば、ユーザーは単に「Playerオブジェクトを作成して」と指示するだけで済みます。
AIは自動的にMCPを使用し、エディタスクリプトの生成に逃げることはありません。
tools/listとSkillsの役割分担
| 仕組み | 役割 |
|---|---|
tools/list |
AIに「何ができるか」を伝える |
| Skills | AIに「何を使うべきか」を強制する |
tools/listだけでは不十分な場合、Skillsで補完することで、AIの暴走を防げます。
まとめ
| ポイント | 説明 |
|---|---|
| 暴走の原因 | MCPが機能しないとき、AIは代替手段を探す |
| 観察された代替手段 | AssetDatabase操作、エディタ拡張作成 |
| 暴走の本質 | 「暴走」ではなく目的達成への執着 |
| tools/listの限界 | APIの存在は伝えるが、強制力はない |
| Skillsの役割 | MCPの使用を強制できる |
AIは強力なツールですが、適切なレールを敷くことで、その力を正しい方向に導けます。
tools/listがレールの存在を示し、Skillsがそのレールの上を走ることを強制する。
この組み合わせが、安定したMCP運用の鍵です。
