Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/coplaydev/unity-mcp/blender-to-unitynpx skills add CoplayDev/unity-mcp --skill blender-to-unitygit clone --depth 1 https://github.com/CoplayDev/unity-mcpWhat 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 | $0.00091 | $0.02546 |
| Opus 5 | $0.00046 | $0.01273 |
| Sonnet 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 3d 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.
- 3d 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 (13,817 stars, last pushed today), licensed MIT. It adds 91 tokens to every session and 2,546 once invoked, about $0.0005 per session on Opus 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
assets-shader-get-data
Get detailed data about a shader asset — properties, subshaders, passes, compilation messages, and supported status. Supports token-saving path-scoped reads via paths or viewQuery. Use 'assets-find' with t:Shader or 'assets-shader-list-all' to locate the shader first.
gameobject-component-get
Get detailed information about a specific Component on a GameObject — type, enabled state, and (optionally) serialized fields and properties. Supports token-saving path-scoped reads via paths or viewQuery. Use 'gameobject-find' to list components first.
gameobject-find
Find a specific GameObject in the opened Prefab (preferred when present) or the active Scene. Optionally include editable data, components preview, bounds, and limited hierarchy. Supports token-saving path-scoped reads via paths or viewQuery.
gameobject-component-modify
Modify a specific Component on a GameObject in opened Prefab or in a Scene. Allows direct modification of component fields and properties without wrapping in GameObject structure. Use 'gameobject-component-get' first to inspect the component structure before modifying. Three modification surfaces are available…
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. Three modification surfaces are available per GameObject (gameObjectDiffs, pathPatchesPerGameObject…
object-modify
Modify a Unity UnityEngine.Object's serializable fields/properties. Three modification surfaces are available (objectDiff, pathPatches, jsonPatch) — see the skill body. Use 'object-get-data' first to inspect the object structure.