blender-core
Skill779 starsChanged 14 days agoMITView on GitHub
Foundation for any Blender 5.2+ task an agent drives - running bpy via MCP (live) or headless CLI, context overrides, locale-safe node lookup, enum discovery, 5.x API changes, verification. Use first for any Blender, bpy, .blend or 3D-asset request; routes to the specialized blender-* skills.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- blender-addon-developmentSkill
- blender-animationSkill
- blender-asset-qaSkill
- blender-character-riggingSkill
- blender-clothingSkill
- blender-environment-kitsSkill
- blender-export-pipelinesSkill
- blender-facial-shapekeysSkill
- blender-game-optimizationSkill
- blender-geometry-nodesSkill
- blender-hair-groomingSkill
- blender-hardsurface-modelingSkill
- blender-lighting-lookdevSkill
- blender-pbr-materialsSkill
- blender-pipeline-automationSkill
- blender-renderingSkill
- blender-retopology-uvSkill
- blender-scene-setupSkill
- blender-sculptingSkill
- blender-simulationSkill
- blender-stylized-nprSkill
- blender-texture-bakingSkill
- blender-texturingSkill
- blender-time-of-daySkill
- blender-video-editingSkill
- blender-weather-fxSkill
- blender-workflow-recipesSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 0 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 60
Data API over operators: use bpy.data, bmesh, mesh.attributes, and foreach_get/set with numpy.
- Very specific: line 61
If an operator is unavoidable: with bpy.context.temp_override(object=ob, active_object=ob, selected_objects=[ob], …
- Very specific: line 64
Enums: read the valid values with [i.identifier for i in T.bl_rna.properties[p].enum_items].
- Very specific: line 66
Evaluated data: use ob.evaluated_get(depsgraph), then .to_mesh(), then always .to_mesh_clear().
- Very specific: line 71
Live sessions are the user's work: never read_factory_settings, never delete data you didn't create, and save a backup copy before …
- Very specific: line 72
GPU module in background: call gpu.init() first (5.2+).
- Very specific: line 73
Big meshes: no per-vertex bpy.ops. Use numpy foreach_get (see references/bpy-patterns.md).
- Very specific: line 81
Look at it: MCP look (mode="angles", shading material/wireframe).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Blender Core (5.2 LTS+)
Route to the specialized skill
| Task | Skill |
| Units, collections, naming, linking, asset libraries | blender-scene-setup |
| Hard-surface modeling, bevels, booleans, normals | blender-hardsurface-modeling |
| Sculpting, multires, remesh | blender-sculpting |
| Retopology, UV unwrap, texel density | blender-retopology-uv |
| PBR materials, color spaces, texture sets | blender-pbr-materials |
| Wear, grime, dust, decals, trim sheets, texture painting | blender-texturing |
| Baking high→low maps (normal, AO, curvature, ...) | blender-texture-baking |
| Geometry Nodes, procedural modeling | blender-geometry-nodes |
| Body rigging, Rigify, weight painting | blender-character-rigging |
| Face rig, shape keys, ARKit, visemes | blender-facial-shapekeys |
| Keyframes, actions, NLA, mocap retarget, loops, root motion | blender-animation |
| Garments, layered clothing, body poke-through | blender-clothing |
| Hair, fur, grooming, hair cards | blender-hair-grooming |
| Poly budgets, LODs, draw calls, cleanup | blender-game-optimization |
| Export: glTF/FBX/USD to Roblox, Unity, Unreal, Godot, web | blender-export-pipelines |
| Cycles/EEVEE settings, compositor, batch render | blender-rendering |
| Lighting, HDRI, camera, turntable | blender-lighting-lookdev |
| Toon/cel/anime shading, outlines, Line Art, Grease Pencil | blender-stylized-npr |
| Terrain, biome scatter, modular kits | blender-environment-kits |
| Video editing (VSE), motion tracking, camera solve | blender-video-editing |
| Time of day, night, sunset, fog, mood (cyberpunk, horror...) | blender-time-of-day |
| Rain, snow, wet surfaces, puddles, lightning, dust/embers | blender-weather-fx |
| Cloth, rigid body, fluids, hair, GN physics | blender-simulation |
| Writing add-ons / extensions | blender-addon-development |
| Batch/headless pipelines, file conversion | blender-pipeline-automation |
| Checking a mesh/asset before delivery (always) | blender-asset-qa |
| End-to-end playbooks (prop, character, Roblox, product shot) | blender-workflow-recipes |
Execute
Live (blender-mcp execute_blender_code): work in small steps and print only what you need. To call a skill script, import it:
import sys, importlib; sys.path.insert(0, r"<skills_dir>/blender-asset-qa/scripts")
import qa_check; importlib.reload(qa_check); print(qa_check.run(objects=["Chair"]))Each MCP call runs in a fresh namespace: re-import in every call. That's cheap because modules stay cached in sys.modules. reload only after editing a script.
Headless (any agent with a shell): this prints only the script's JSON (@@JSON@@ lines):
python <skills_dir>/blender-core/scripts/run_in_blender.py --blend in.blend <script.py> -- --objects Chair --save out.blend
python <skills_dir>/blender-core/scripts/run_in_blender.py --expr "import bpy; print(len(bpy.data.objects))"Raw form: blender -b in.blend --factory-startup --python-exit-code 1 -P x.py -- args. Every script here exposes run(**kw) -> dict and the same flags after --.
First call in a session: scripts/env_report.py, which returns the version, engines, GPU, add-ons, units, color management and scene counts.
Rules
- Data API over operators: use
bpy.data,bmesh,mesh.attributes, andforeach_get/setwith numpy. Operators depend on context and selection, and many need a 3D View, which background mode doesn't have. - If an operator is unavoidable:
with bpy.context.temp_override(object=ob, active_object=ob, selected_objects=[ob], selected_editable_objects=[ob]): bpy.ops.... Check that the result is{'FINISHED'}. - Edit mode isolation:
ob.dataisn't updated while in Edit Mode. Usebmesh.from_edit_mesh+bmesh.update_edit_mesh, or switch to OBJECT mode before reading. - Nodes: find them by
type(n.type == "BSDF_PRINCIPLED"), never byname, because names are localized. Sockets by English name oridentifierare fine. - Enums: read the valid values with
[i.identifier for i in T.bl_rna.properties[p].enum_items]. Dynamic enums (render.engine,view_transform,look) under-report, so assign them insidetry/except TypeError(the message lists the valid values). - Engines:
BLENDER_EEVEE,CYCLES,BLENDER_WORKBENCH. Cycles device:scene.cycles.device = "GPU"+ preferencescompute_device_type. - Evaluated data: use
ob.evaluated_get(depsgraph), then.to_mesh(), then always.to_mesh_clear(). Callview_layer.update()before readingmatrix_worldafter a change. - Freed data: applying or removing a modifier, or removing an object or ID, frees it. Collect names first (
[m.name for m in ob.modifiers]) and never touch the old Python reference afterward, because it returns garbage or crashes. - Never trust default names ("Cube.001"). Keep object references, rename explicitly, and look objects up via
bpy.data.objects[name]. - Scale: 1 unit = 1 m. Apply rotation/scale (
transform_apply) before bevels, modifiers with distances, rigging, physics, baking and export. - Paths:
bpy.path.abspath("//textures/x.png")resolves relative to the .blend. Save explicitly; usesave_as_mainfile(filepath=..., copy=True)for backups. - Live sessions are the user's work: never
read_factory_settings, never delete data you didn't create, and save a backup copy before destructive batch edits. - GPU module in background: call
gpu.init()first (5.2+).bglno longer exists. - Big meshes: no per-vertex
bpy.ops. Use numpyforeach_get(see references/bpy-patterns.md).
5.x API changes that break old tutorials/LLM memory
action.fcurves → channelbags · scene.node_tree → scene.compositing_node_group · material.use_nodes is deprecated (new materials already have nodes) · mod["Socket_2"] → mod.properties.inputs.Socket_2.value (5.2) · BLENDER_EEVEE_NEXT → BLENDER_EEVEE · Boolean FAST → FLOAT · bone layers → bone collections · bl_info add-ons → extensions (blender_manifest.toml) · bpy.props values are no longer dict-accessible (scene["cycles"]). Full table: references/api-changes-5x.md.
Verify (required before saying "done")
- Numbers, not adjectives: report tris, objects, materials, dimensions (
ob.dimensions) and the output files written. - Geometry changed → run
blender-asset-qaqa_check.py(z-fighting, detached parts, non-manifold, flipped normals, scale). - Look at it: MCP
look(mode="angles", shadingmaterial/wireframe). Headless:blender-asset-qa/scripts/review_shots.pyrenders contact sheets. - Re-read your own output: confirm that exported files exist and that their size is non-zero.
References
- references/api-changes-5x.md: 4.x→5.2 migration table. Load it when code fails with AttributeError/KeyError.
- references/bpy-patterns.md: verified snippets for bmesh, attributes, numpy, temp_override, depsgraph, drivers, append/link, handlers and timers.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

