Install any skill in seconds. Free to start, no credit card required.
Get Started Free →ivanmurzak/unity-skill-create
Create a new skill (MCP tool) for the Unity Editor by writing a C# (.cs) file that Unity compiles into the project. After compilation the new tool becomes callable through MCP. The file must be a partial class decorated with [AiToolType], each tool method must be decorated with [AiTool], the class name should match the file name, all Unity API calls must run via com.IvanMurzak.ReflectorNet.Utils.MainThread.Instance.Run(), and the method should either return a structured data model (for parseable
Passed 20 of 22 test cases with the skill, and 3 of 22 without it.
and 31 more in the full report
17 fixed3 passed either way2 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
This benchmark measured an earlier version of the skill.
A newer attempt on gemini-3.8-flash on 10/19/2026 did not produce a publishable comparison (not comparable). The snapshot above is the previously measured run.
One of 17 test cases the skill fixed. Same model, same prompt, with and without the skill.
Write the namespace and class header declaration for a custom Unity MCP tool class named Tool_AudioUtilities.
| Checked | Without skill | With skill |
|---|---|---|
| Places the class in namespace com.IvanMurzak.Unity.MCP.Editor.API. | Missed | Passed |
| Declares the class as public partial class Tool_AudioUtilities. | Missed | Passed |
The instructions your model reads when the skill loads.
#nullable enable
using System;
using System.ComponentModel;
using com.IvanMurzak.McpPlugin;
using com.IvanMurzak.ReflectorNet.Utils;
using com.IvanMurzak.Unity.MCP.Editor.Utils;
using AIGD;
using UnityEditor;
using UnityEngine;
namespace com.IvanMurzak.Unity.MCP.Editor.API
{
[AiToolType]
public partial class Tool_Sample
{
[AiTool("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);
});
}
[AiTool("sample-rename", Title = "Sample / Rename")]
[Description("Renames a GameObject.")]
public void Rename
test cases passed, vs 3 / 22 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.