はじめに
Claude CodeをMCP(Machine Control Protocol)を介してUnityと連携させることで、開発中に自律的なエラー検出と修正提案を自動化し、開発効率を向上させる方法をメモします。
Claude Codeって?
Claude Code は、Anthropic社が提供するAIベースの開発支援ツールで、自然言語による指示をもとにコード生成や補完、リファクタリングなどを行うことができます。Chatベースでの操作が可能で、開発者の意図をくみ取りながらリアルタイムにコードの品質向上や作業効率の最適化を支援します。
MCP(Machine Control Protocol)とは?
MCP(Machine Control Protocol) は、開発ツールやエディタと外部のAIエージェントを接続するためのインターフェース仕様です。Claude Codeにおいては、MCPを通じてエディタ(例:Visual Studio Code、Unity Editorなど)とAIエージェントが通信し、以下のような操作をAIから直接制御できます。
- ファイルの読み取り・書き込み
- コードの挿入・削除・置換
- ターミナルやビルドツールの操作
- エラー箇所の検出と修正提案の実行
これにより、AIが開発環境の状態を逐次取得・操作しながら、自律的にエラーチェックを行い、リアルタイムでフィードバックを提供することが可能になります。
なぜMCPが必要なのか
Claude CodeはCLIで動作するため、Unityのコンパイル結果を監視できません。(※厳密にはシェルスクリプトを駆使してEditorの立ち上げ処理とセットでチェックできますが、それは力業なので例外とします。)
そのため、MCPサーバーを介してUnityEditorとCLIをブリッジするような構成を実現する必要があります。
前提
WindowsでClaude Codeを利用する際はWSL環境上で動かす必要があります。その辺は調べたらたくさん出てくるので参考にしてみてください。
Claude Codeが動かせるようになったら、CLAUDE.mdというファイルを自身のプロジェクトのGit管理下に作成します。このファイルには汎用的なルールを記述していきます。MCPサーバーの使い方もこのファイルに記述して教えてあげると賢く使ってくれます。
また、Claude CodeにMCPサーバーを指定して利用させるための設定ファイルとして、claude_mcp_config.json
を定義します。
{
"mcpServers": {
"unity-compile-server": {
"command": "http",
"args": ["http://localhost:56780/mcp"],
"transport": "http",
"description": "Unity MCP Server"
}
}
}
私はRiderを使っているので以下のPluginを導入して、RiderのTerminalでClaude Codeを利用しています。
アーキテクチャ概要
今回、UnityEditor内で任意のEditorWindowを開くと、MCPサーバーが立ちあがるような仕組みとしました。以下に図解したように、MCPClientはユーザーの入力に応じてMCPサーバーを利用します。MCPサーバーは受け取った命令に応じて、任意のEditorScriptを実行し、その結果をMCPClientへ返します。
Unity Editor
Claude Code ┌────────────────────────────────────────────────────────┐
┌────────────┐ HTTP Request │ ┌──────────────┐ Compile Check ┌──────────────┐ │
│ │ ────────────────► │ │ │ ─────────────────► │ │ │
│ MCP Client │ │ │ MCP Server │ │ EditorScript │ │
│ │ ◄──────────────── │ │ │ ◄───────────────── │ │ │
└────────────┘ Json Response │ └──────────────┘ Compile Result └──────────────┘ │
▲ └────────────────────────────────────────────────────────┘
│
│
ユーザー入力
"エラーを修正して"
このフローをコード変更の際に必ず実行するようにCLAUDE.mdに記述しておけば、コードを書く→コンパイルエラーチェック→自身の変更に誤りがあれば再度修正を行う というフローを自律的に行うことができます。
発展として、この仕組みを使ってコードを書くたびにテストコードを実行するということも可能なので、より安全で正確にClaude Codeを動作させることができます。
MCPサーバーの処理の流れ
前提として、MCPサーバー自体の実装もほとんどClaudeCodeがやってくれました。
1. MCPサーバー起動
まずはMCPサーバーを立ち上げます。以下はコードの一部です。
public class McpStreamableHttpServer : IDisposable
{
private readonly HttpListener _listener;
public async UniTask StartServerAsync()
{
_listener.Prefixes.Add("http://*:56780/");
_listener.Start();
while (_listener.IsListening)
{
var context = await _listener.GetContextAsync();
await HandleRequestAsync(context);
}
}
}
以下画像のように、UnityEditorのEditorWindowを拡張する形でサーバー管理画面が実装されています。
2. ユーザーの入力に応じたAPIを実行
次に、ユーザーの入力に応じてClaude CodeがMCPサーバーのAPIを呼び出します。具体的には http://localhost:56780/mcp というエンドポイントに、リクエストボディとして必要な情報を渡して命令を実行します。
3. コンパイルを実行する
API呼び出しに応じて、コンパイル監視処理が実行されます。実施結果をテキストファイルとして任意のフォルダに保存する仕組みとなっています。Unity の CompilationPipeline
イベントを監視し、コンパイル状況を自動的に検出します。
static PipelineCompileCheck()
{
CompilationPipeline.compilationStarted += OnCompilationStarted;
CompilationPipeline.compilationFinished += OnCompilationFinished;
CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished;
}
コンパイル完了時にエラー情報を収集します。
private static void OnAssemblyCompilationFinished(string assemblyPath, CompilerMessage[] messages)
{
foreach (var message in messages)
{
if (message.type == CompilerMessageType.Error)
{
_lastCompileResult.errors.Add(new CompileError
{
file = message.file,
line = message.line,
column = message.column,
message = message.message
});
}
}
}
検出したエラー情報をJSONファイルとして保存します。
private static void SaveCompileResult()
{
var json = JsonUtility.ToJson(_lastCompileResult, true);
File.WriteAllText("Temp/mcp_compile_result.json", json);
}
↓ 保存されるファイル内容の例
{
"isCompiling": false,
"hasErrors": true,
"errors": [
{
"file": "Assets/Scripts/PlayerController.cs",
"line": 15,
"column": 10,
"message": "CS0103: The name 'moveSpd' does not exist in the current context"
}
],
"timestamp": "2025-07-04 14:30:15"
}
4. コンパイル結果を読み取り
コンパイル結果が保存されたJsonファイルを非同期で読み込みます。APIはこの読み取り結果をレスポンスとして返します。
public UniTask<McpToolResult> ExecuteAsync(Dictionary<string, object> arguments, CancellationToken cancellationToken = default)
{
if (_lastCompileResult == null)
{
if (File.Exists(_compileResultFilePath))
{
var json = File.ReadAllText(_compileResultFilePath);
_lastCompileResult = JsonUtility.FromJson<CompileResult>(json);
}
else
{
_lastCompileResult = new CompileResult();
}
}
_lastCompileResult.isCompiling = EditorApplication.isCompiling;
return UniTask.FromResult(new McpToolResult
{
content = JsonUtility.ToJson(_lastCompileResult, true),
isError = _lastCompileResult.hasErrors
});
}
Claude Code は受け取った JSON データを解析し、エラーの有無と詳細を確認することができます。
{
"isError": true,
"content": {
"hasErrors": true,
"errors": [
{
"file": "Assets/Scripts/PlayerController.cs",
"line": 15,
"message": "CS0103: The name 'moveSpd' does not exist in the current context"
}
]
}
}
この仕組みにより、「Unity でコンパイルエラーが発生」→「Claude Code が自動で検出」→「エラーを修正」 というワークフローが実現されています。
おわりに
ここまでの内容を駆使すれば、issue作成 → 実装 → コンパイルエラー修正 → テスト → コミット/プッシュ → PR作成までをClaude Codeに完全に丸投げして、あとはレビューするだけで良い状態にできます。
MCPで自動化させることにハードルを感じており、何から手を付けて良いかイメージがついてない場合、自律的なコンパイルを行えるように整備するだけでも十分にその真価を感じることができるのでおすすめです。
Claude Codeを駆使してMCPを整備しても良いですし、publicなMCPライブラリを使うのもありだと思います。
- 参考リンク