Topic: openai
1,087 skills in this topic.
-
gameobject-component-get
Get detailed information about a specific Component on a GameObject. Returns component type, enabled state, and optionally serialized fields and properties. Use this to inspect component data before modifying it. Use 'gameobject-find' tool to get the list of all components on the GameObject.
IvanMurzak/Unity-MCP 2,087
-
scene-save
Save Opened scene to the asset file. Use 'scene-list-opened' tool to get the list of all opened scenes.
IvanMurzak/Unity-MCP 2,087
-
assets-create-folder
Creates a new folder in the specified parent folder. The parent folder string must start with the 'Assets' folder, and all folders within the parent folder string must already exist. For example, when specifying 'Assets/ParentFolder1/ParentFolder2/', the new folder will be created in 'ParentFolder2' only if ParentFolder1 and ParentFolder2 already exist. Use it to organize scripts and assets in the project. Does AssetDatabase.Refresh() at the end. Returns the GUID of the newly created folder, if successful.
IvanMurzak/Unity-MCP 2,087
-
unity-skill-generate
Generate all skills from the existed Tools in the Unity Project.
IvanMurzak/Unity-MCP 2,087
-
assets-modify
Modify asset file in the project. Use 'assets-get-data' tool first to inspect the asset structure before modifying. Not allowed to modify asset file in 'Packages/' folder. Please modify it in 'Assets/' folder.
IvanMurzak/Unity-MCP 2,087
-
build-cli
Build the unity-mcp-cli TypeScript CLI tool and link it globally for terminal use.
IvanMurzak/Unity-MCP 2,087
-
assets-prefab-close
Close currently opened prefab. Use it when you are in prefab editing mode in Unity Editor. Use 'assets-prefab-open' tool to open a prefab first.
IvanMurzak/Unity-MCP 2,087
-
github-pr-review-fix
Review and resolve PR comments from GitHub. Validates each comment, fixes legitimate issues.
IvanMurzak/Unity-MCP 2,087
-
script-update-or-create
Updates or creates script file with the provided C# code. Does AssetDatabase.Refresh() at the end. Provides compilation error details if the code has syntax errors. Use 'script-read' tool to read existing script files first.
IvanMurzak/Unity-MCP 2,087
-
script-read
Reads the content of a script file and returns it as a string. Use 'script-update-or-create' tool to update or create script files.
IvanMurzak/Unity-MCP 2,087
-
assets-copy
Copy assets at given paths and store them at new paths. Does AssetDatabase.Refresh() at the end. Use 'assets-find' tool to find assets before copying.
IvanMurzak/Unity-MCP 2,087
-
editor-selection-set
Set the current Selection in the Unity Editor to the provided objects. Use 'editor-selection-get' tool to get the current selection first.
IvanMurzak/Unity-MCP 2,087
-
assets-shader-list-all
List all available shaders in the project assets and packages. Returns their names. Use this to find a shader name for 'assets-material-create' tool.
IvanMurzak/Unity-MCP 2,087
-
gameobject-modify
Modify GameObject fields and properties in opened Prefab or in a Scene. You can modify multiple GameObjects at once. Just provide the same number of GameObject references and SerializedMember objects.
IvanMurzak/Unity-MCP 2,087
-
unity-skill-create
Create a new skill using C# code. It will be added into the project as a .cs file and compiled by Unity. The skill will be available for use after compilation.
It must be a partial class decorated with [McpPluginToolType]. Each tool method must be decorated with [McpPluginTool]. The class name should match the file name. All Unity API calls must use com.IvanMurzak.ReflectorNet.Utils.MainThread.Instance.Run(). Return a data model for structured output, or void for side-effect-only operations.
Full sample:
```csharp
#nullable enable
using System;
using System.ComponentModel;
using com.IvanMurzak.McpPlugin;
using com.IvanMurzak.ReflectorNet.Utils;
using com.IvanMurzak.Unity.MCP.Editor.Utils;
using com.IvanMurzak.Unity.MCP.Runtime.Data;
using UnityEditor;
using UnityEngine;
namespace com.IvanMurzak.Unity.MCP.Editor.API
{
[McpPluginToolType]
public partial class Tool_Sample
{
[McpPluginTool("sample-get", Title = "Sample / Get")]
[Description("Finds a GameObject and returns its ref data.")]
public GameObjectRef Get
(
[Description("Name of the GameObject to find.")]
string name
)
{
return MainThread.Instance.Run(() =>
{
var go = GameObject.Find(name)
?? throw new ArgumentException($"GameObject '{name}' not found.", nameof(name));
return new GameObjectRef(go);
});
}
[McpPluginTool("sample-rename", Title = "Sample / Rename")]
[Description("Renames a GameObject.")]
public void Rename
(
[Description("Current name of the GameObject.")]
string name,
[Description("New name to assign.")]
string newName
)
{
MainThread.Instance.Run(() =>
{
var go = GameObject.Find(name)
?? throw new ArgumentException($"GameObject '{name}' not found.", nameof(name));
go.name = newName;
EditorUtility.SetDirty(go);
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
EditorUtils.RepaintAllEditorWindows();
});
}
}
}
```
## Suggestions
### Refresh UI after visual changes
If the skill modifies anything visually in the Unity Editor (GameObjects, components, materials, etc.), call these two lines at the end of the tool method to apply changes to the UI immediately:
```csharp
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
EditorUtils.RepaintAllEditorWindows();
```
### Refresh AssetDatabase after asset or script changes
If the skill creates, modifies, or deletes any asset file or .cs script on disk outside of Unity API, call this inside a `MainThread.Instance.Run()` block to ensure Unity picks up the changes:
```csharp
MainThread.Instance.Run(() =>
{
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
});
```
### Use processing mechanic for long-running or domain-reload operations
Some operations take time to complete and may trigger a Unity domain reload (e.g. writing a .cs script, switching play mode, running tests, adding a package). In these cases the tool must NOT block and wait — instead it must:
1. Accept a `[RequestID] string? requestId` parameter.
2. Return `ResponseCallTool.Processing("...").SetRequestID(requestId)` immediately.
3. Schedule the actual work asynchronously via `MainThread.Instance.RunAsync(async () => { await Task.Yield(); ... })`.
4. When the operation finishes, send the final result by calling:
```csharp
_ = UnityMcpPluginEditor.NotifyToolRequestCompleted(new RequestToolCompletedData
{
RequestId = requestId,
Result = ResponseCallTool.Success("Operation completed.").SetRequestID(requestId)
});
```
If the operation may survive a domain reload (e.g. a .cs file was saved and Unity will recompile), use `ScriptUtils.SchedulePostCompilationNotification(requestId, filePath, operationType)` instead of calling `NotifyToolRequestCompleted` directly — it persists the pending notification to `SessionState` and sends it automatically after the domain reload completes. For package install/removal or other non-compilation domain reloads use `PackageUtils.SchedulePostDomainReloadNotification(requestId, label, action, expectedResult)` the same way.
### Return structured data with a typed response
Prefer returning a structured data model over a plain string so the AI can parse individual fields. Declare a nested class with `[Description]` on each property and use `ResponseCallValueTool<T>` as return type:
```csharp
// Return type:
public ResponseCallValueTool<MyResult> MyTool(...)
{
return ResponseCallValueTool<MyResult>.Success(new MyResult
{
Name = go.name,
InstanceID = go.GetInstanceID()
}).SetRequestID(requestId);
}
// Data model:
public class MyResult
{
[Description("Name of the GameObject.")]
public string? Name { get; set; }
[Description("Unity instance ID of the GameObject.")]
public int InstanceID { get; set; }
}
```
For simpler cases that do not need async/processing, you may return the model directly (without `ResponseCallValueTool<T>`) and Unity-MCP will wrap it automatically.
### Validate inputs early and throw clearly
Always validate required parameters at the top of the method before any Unity API calls. Throw `ArgumentException` or `InvalidOperationException` with descriptive messages so the AI knows exactly what went wrong and can self-correct:
```csharp
if (string.IsNullOrEmpty(name))
throw new ArgumentException("Name cannot be null or empty.", nameof(name));
```
### Always use MainThread for Unity API calls
All Unity API calls (including `GameObject.Find`, `AssetDatabase`, `EditorUtility`, etc.) MUST run on the main thread. Wrap them in `MainThread.Instance.Run(() => { ... })` for synchronous operations, or `MainThread.Instance.RunAsync(async () => { ... })` when you need to await inside.
IvanMurzak/Unity-MCP 2,087
-
tests-run
Execute Unity tests and return detailed results. Supports filtering by test mode, assembly, namespace, class, and method. Recommended to use 'EditMode' for faster iteration during development.
IvanMurzak/Unity-MCP 2,087
-
gameobject-set-parent
Set parent GameObject to list of GameObjects in opened Prefab or in a Scene. Use 'gameobject-find' tool to find the target GameObjects first.
IvanMurzak/Unity-MCP 2,087
-
scene-open
Open scene from the project asset file. Use 'assets-find' tool to find the scene asset first.
IvanMurzak/Unity-MCP 2,087
-
gameobject-component-add
Add Component to GameObject in opened Prefab or in a Scene. Use 'gameobject-find' tool to find the target GameObject first. Use 'gameobject-component-list-all' tool to find the component type names to add.
IvanMurzak/Unity-MCP 2,087
-
gameobject-find
Finds specific GameObject by provided information in opened Prefab or in a Scene. First it looks for the opened Prefab, if any Prefab is opened it looks only there ignoring a scene. If no opened Prefab it looks into current active scene. Returns GameObject information and its children. Also, it returns Components preview just for the target GameObject.
IvanMurzak/Unity-MCP 2,087
-
reflection-method-call
Call C# method. Any method could be called, even private methods. It requires to receive proper method schema. Use 'reflection-method-find' to find available method before using it. Receives input parameters and returns result.
IvanMurzak/Unity-MCP 2,087
-
scene-unload
Unload scene from the Opened scenes in Unity Editor. Use 'scene-list-opened' tool to get the list of all opened scenes.
IvanMurzak/Unity-MCP 2,087
-
assets-refresh
Refreshes the AssetDatabase. Use it if any file was added or updated in the project outside of Unity API. Use it if need to force scripts recompilation when '.cs' file changed.
IvanMurzak/Unity-MCP 2,087
-
console-clear-logs
Clears the MCP log cache (used by console-get-logs) and the Unity Editor Console window. Useful for isolating errors related to a specific action by clearing logs before performing the action.
IvanMurzak/Unity-MCP 2,087