Unity MCP connects AI coding assistants to the Unity Editor through the Model Context Protocol, letting them manage game assets, scenes, scripts, tests, and builds. It is for developers who want to control Unity workflows with natural-language requests, and the catalogue entries provide add-ons for using the project.
Borrowing it
Nothing to install: this file belongs to CoplayDev/unity-mcp. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/CoplayDev/unity-mcp/beta/.claude/skills/blender-to-unity/SKILL.mdgit clone --depth 1 https://github.com/CoplayDev/unity-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/coplaydev/unity-mcp/blender-to-unity)<a href="https://agentmods.dev/skills/coplaydev/unity-mcp/blender-to-unity"><img src="https://agentmods.dev/badge/skills/coplaydev/unity-mcp/blender-to-unity/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/coplaydev/unity-mcp/blender-to-unity"><img src="https://agentmods.dev/badge/skills/coplaydev/unity-mcp/blender-to-unity.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00091 | $0.02546 |
| Opus 5.5 | $0.00036 | $0.01018 |
| Sonnet 5.5 | $0.00018 | $0.00509 |
| Haiku 4.5 | $0.00009 | $0.00255 |
Grade A, and why
blender-to-unity scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 135 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Blender → Unity Model Handoff
Bring whatever model is currently in Blender into the open Unity scene. The seam is the local filesystem: Blender exports a file, Unity imports it. The two servers never talk directly.
Preconditions
- Both
mcp__blender__*tools and MCP for Unity tools are connected. - A model exists in the Blender scene (confirm with
mcp__blender__get_scene_info/mcp__blender__get_object_info). If empty, stop and tell the user — this skill does not generate models. import_model_fileis in theasset_gentool group, which is off by default (onlycoreloads). Enable it first withmanage_tools(enable theasset_gengroup), or call the C# handler straight throughbatch_execute—{"tool":"import_model_file","params":{"sourcePath":...,"name":...,"outputFolder":...}}(camelCase) — which dispatches by name regardless of group gating.
Steps
- Resolve the Unity project path. Read
mcpforunity://editor/statefor the project root (the editor dataPath's parent). Decide the export format:- GLB (glTFast) when the model has a rig, animation, PBR (metallic/roughness), emission, or transparency — glTFast carries all of these automatically, no post-processing (see references/bridge-fidelity.md). Multi-material zones survive either format, so they alone don't force GLB.
- FBX otherwise — when glTFast isn't installed, the model is plain geometry, or you
specifically need the built-in importer's humanoid-avatar pipeline. FBX drops emission/metallic
(Step 5 restores emission) and surfaces animation only with
animation_typeset (Step 3).
- Export from Blender to a temp path via
mcp__blender__execute_blender_code:
(glTF branch:import bpy, os, tempfile out = os.path.join(tempfile.gettempdir(), "blender_to_unity.fbx") # Export the selection if any, else the whole scene: bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects), apply_unit_scale=True, bake_space_transform=True) print(out)out_glb = os.path.join(tempfile.gettempdir(), "blender_to_unity.glb"), thenbpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)— its defaultuse_active_scene=Falsecan silently export a different open scene.) - Import into Unity with
import_model_file:import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>). For a rigged/animated FBX, also passanimation_type="generic"(or"humanoid";"legacy"targets the old Animation-component system) — the importer defaults to"none", which deliberately imports the mesh with zero animation clips. GLB ignores this (glTFast imports animation itself), so it's an FBX-only knob. It returns{ asset_path, asset_guid }. Passtarget_sizeas the intended final size, but treat it only as a hint: it rescales at import solely when the project's Auto-normalize pref is on, and even then is unreliable for Blender FBX (see the Scale note). Step 4 does the reliable normalization. - Place it in the scene, normalized to size. Ensure the scene has a camera + directional
light (
manage_scene/manage_gameobject). Instantiate the model at the chosen position viamanage_gameobject(action="create", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z]). Then normalize its size deterministically — Blender FBX commonly imports ~100× too large — by measuring the placed model's world bounds and scaling so its largest dimension equals your target size. Run viaexecute_code(substitute your object name and target meters):var go = GameObject.Find("<asset name>"); var rs = go.GetComponentsInChildren<Renderer>(); var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds); float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z)); float target = 2f; // intended size in meters if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim; - Restore emission FBX dropped (FBX path). Blender scenes commonly store their color/glow
in material emission (and other Principled-node inputs). FBX carries base/diffuse color but
not emission, so neon / "Tron" scenes import as dark bodies with black accents. If the
import looks flat vs. Blender, restore it:
a. Dump the emissive materials from Blender via
execute_blender_code:
b. In Unity (import bpy, json out = {} for m in bpy.data.materials: if not (m.use_nodes and m.node_tree): continue col, s = (0, 0, 0), 0.0 p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None) es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None) # 4.x / 3.x name if es: col = tuple(p.inputs[es].default_value)[:3] s = float(p.inputs['Emission Strength'].default_value) e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None) if e and s == 0: col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value) if s > 0 and sum(col) > 0.01: out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)] print(json.dumps(out))execute_code): extract the FBX's materials so they're editable (AssetDatabase.ExtractAssetperMaterial, thenImportAsset(fbx, ForceUpdate)), then for each dumped name set_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f),EnableKeyword("_EMISSION"), andglobalIlluminationFlags = RealtimeEmissive. Match names case-insensitively — FBX mangles case and can split one material into variants (EdgeCyan→EdgeCyan+EDGE_CYAN); set every match. Add a global Bloom volume and enable the camera'srenderPostProcessingso the emission actually glows. - Verify with
manage_camera(action="screenshot", include_image=true)and report the asset path + a screenshot.
What ships with it
2 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 135 lines · 91 tokens per session scan A 744edbee220f
blender-to-unity is a skill published in the GitHub repository CoplayDev/unity-mcp (15,028 stars, last pushed 9d ago), licensed MIT. It adds 91 tokens to every session and 2,546 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
tests-run
Execute Unity tests (EditMode or PlayMode) and return per-test results. Supports filtering by test assembly, namespace, class, and method. Refreshes the AssetDatabase first; defers execution across domain reloads if scripts changed. Precondition: every open scene must be saved — dirty scenes abort the run.
screenshot-isolated
Render a target GameObject from a chosen camera angle with optional layer-based isolation, configurable background (solid/skybox/transparent), multi-light setup via JSON, and Composite (2x2 Front/Right/Back/Top) mode. Returns a PNG image. When isolated=true, inactive children may briefly fire OnEnable — see the body…
script-execute
Compiles and executes C# code dynamically using Roslyn. Supports a full-code mode (default) and a body-only mode — see the skill body for the difference and for how to pass Unity object references as parameters.
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…
unity-rql
How to read and change anything in the Unity Editor with RQL (rql-query / rql-mutate / rql-schema): the query language, operators, sources (scene objects, assets, scenes, prefabs, console logs, Editor state), Editor operations (create, add components, scenes, prefabs, assets, selection, Play Mode) and what installed…
package-list
List all UPM packages installed in the Unity project — name, version, source, description. Optionally filter by source (registry, embedded, local, git, built-in, local tarball), by name/display/description substring, and by direct-dependency-only.