Blender Finisher
This server is an LLM-controllable interface to Blender for creating, editing, analyzing, and exporting 3D assets, with visual feedback "eyes" for quality control.
Animation: Manage timeline range, current frame, keyframes, interpolation, and action/animation reports.
Application/File Management: Create/open/save/revert .blend files, get runtime info, switch workspaces, manage add-ons/preferences, undo/redo.
Capability Discovery: List tools/domains, search the Blender API, get operator parameter schemas, and invoke any Blender operator with validated arguments.
Context/Selection: Report and set active object/selection/mode, select/deselect, switch interaction and mesh edit modes, check operator poll state.
Visual Feedback ("Eyes"): Render topology overlays, UV checkers with stretch analytics, normal/backface orientation, wire-shaded views, turntables, silhouettes with proportion/symmetry analysis, and multi-angle captures.
Geometry Creation: Create curves, text, NURBS surfaces, metaballs, grease pencil objects, lattices, and light probes; convert non-mesh geometry to mesh.
Geometry Nodes, Modifiers & Constraints: Create and link Geometry Nodes nodes, manage modifiers/constraints, and set RNA properties on constraints.
Mesh Editing: Extrude, bevel, inset, subdivide, fill, recalculate normals, select/delete/dissolve/merge elements, convert tris/quads, shade smooth/flat, and get topology reports.
Import/Export: Import GLTF/GLB/OBJ/FBX/STL/USD/PLY/DAE/ABC; export scenes/objects as GLB/FBX/OBJ with options for applying transforms/modifiers.
Info/RNA & Safety: Access Info editor messages, describe/search Blender operators and RNA types; Python execution is off by default and the bridge is localhost-only.
Provides tools for interacting with Blender, enabling AI agents to create and edit meshes, apply modifiers, UV unwrap, bake textures, generate LODs and collision proxies, and visually inspect results through renders, topology overlays, and quality metrics to produce game-ready assets.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Blender Finisher bake and finish this rough mesh for a game prop"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Blender Finisher
Rough mesh → measured game-ready asset. An MCP server with a ruler.
Point an LLM at a dense, generated mesh and get back a budgeted, baked, importable game asset — where every step that cannot be proven to preserve the form is reverted.
Package name is
niua-blender-mcp; the product is the finisher. New here? ReadSTART_HERE.md— one page, then come back.
What makes it different
Most Blender integrations answer “can an LLM drive Blender?” — that is strata ①–②, and this repo has one of the larger ones. What it adds is stratum ③: eyes. The agent can look at what it just did — silhouette, wireframe density, UV stretch, a lit turntable — instead of driving blind and hoping.
Typical Blender MCP | This one | |
Drive Blender from an LLM | ✅ | ✅ 292 tools, 48 domains, schema-validated |
Run arbitrary | ✅ (usually ungated) | ✅ off by default |
See the result | ✖ | ✅ silhouette · topology · UV checker · wire-shaded · turntable |
Decide what "good" means | — | you do. No budgets, no gates, no house style |
That last row is deliberate. An earlier version shipped an opinionated finisher — triangle
budgets per asset class, readiness gates, a retopo recipe. It is still in this repo and
still runs under scripts/, but it is not in the release, because it is not good
enough to stand behind: the reducer hits budget on simple props and cannot take a dense
character there without wrecking it. A tool that fails on the hard case makes the whole
MCP look broken when the Blender surface underneath is fine.
So the released MCP does not decide anything for you. modifiers.add with a DECIMATE
modifier does exactly what it does in Blender; how far to take it is the agent's call, and
the eyes are there to check the answer.
Status of the held-back layer: src/niua_blender_mcp/finishing/,
domains/policy/, and the benchmark under evals/. It ships when a dense character
survives the round trip. See ARCHITECTURE.md.
Related MCP server: Blender MCP
Install
Let your agent do it
Paste this into Claude Code, Cursor, or any coding agent with shell access:
Install the Blender Finisher MCP server here. Follow these steps in order and STOP and
report if any check fails — do not improvise around a failure.
1. Check prerequisites: `blender --version` (need 4.0+) and `python --version` (need 3.11+).
If Blender is missing, stop and tell me how to install it for this OS.
2. Clone and install the server:
git clone https://github.com/OhaoTech/niua-blender-mcp && cd niua-blender-mcp
python -m pip install -e .
3. Install the Blender add-on (this asks Blender where its add-ons live, so no guessing):
python scripts/install_addon.py
Expect "add-on symlinked" (or "copied") and "__init__.py present = True".
4. Start the bridge. Blender must be VISIBLE, not headless — quality measurement needs
OpenGL, and headless runs will revert finishing moves instead of passing them blind:
blender --python scripts/blender_gui.py -- ./blender_addon 8765
(Or open Blender normally → Preferences → Add-ons → enable "Niua MCP Bridge" →
press N in the viewport → Niua tab → Start.)
5. Verify the bridge is alive:
python scripts/bridge_call.py 8765 system.health '{}'
Expect {"bridge": "alive", ...}. If not, report the exact error and stop.
6. Register the MCP server in my client config:
{"mcpServers": {"blender-finisher": {"command": "python",
"args": ["-m", "niua_blender_mcp"]}}}
7. Confirm the tool surface loaded — around 305 tools across domains including
mesh, object, uv, shading, modifiers, io and feedback.
Wire tool names use ``domain-action`` (e.g. ``system-health``, ``object-create``),
not dots and not ``domain__action``. Hosts such as Grok reject ``.`` in tool names
and also namespace tools as ``server__tool``, so a double-underscore separator
collides and the host keeps zero tools. The bridge still speaks the dotted
command form internally.
Then tell me: Blender version, whether the add-on is symlinked or copied, and the
health-check output.Or by hand
python -m pip install -e . # 1. server
python scripts/install_addon.py # 2. add-on → Blender's add-ons dir
# 3. enable "Niua MCP Bridge" in Preferences → Add-ons
python scripts/bridge_call.py 8765 system.health '{}' # 4. verifyThen finish the benchmark fixtures:
python scripts/run_skill.py --skill bake_and_finish --port 8765 --outdir /tmp/niua_finishinstall_addon.py supports --copy, --blender /path/to/blender, and --uninstall.
Status — honest
Pre-1.0. Latest acceptance run (full report), objective benchmark against real generator meshes:
Assets measured | 4 of 5 |
Reached triangle budget, form preserved, imports clean | 3 |
Assets harmed | 0 |
Mean surface fidelity | 0.945 |
Clear the strict full-readiness bar (0.85) | 0 — mean 0.75 |
Two open issues, stated plainly: real_character holds form beautifully (fidelity 0.990)
but no current reducer can take it to budget without destroying it — both paths scored
~0.3 and were reverted, so it ships 4× over budget or not at all. And real_prop timed out
in feedback.readiness, which left it unmeasured and correctly invalidated the run's grade.
Those numbers exist because the ruler exists. The claim worth attention is not the score — it is that the tool can tell you at all, and reverts what it cannot prove instead of shipping it.
Layout
▪ ships · ▫ stays in the repo (policy, harness, evidence)
START_HERE.md ← read this first
▪ src/niua_blender_mcp/ ← MCP server (Apache-2.0, never imports bpy)
▪ bridge.py / server.py MCP ↔ Blender socket
▪ domains/ the tool surface, minus policy/
▫ domains/policy/ budgets, gates, retopo/LOD/collision recipes
▫ finishing/ asset classes + the finisher skills
▫ evals/ benchmark harness (fixtures ~72 MB, untracked)
▪ blender_addon/niua_mcp_bridge/ ← Blender add-on (GPL-3.0, imports bpy)
▪ domains/eyes.py the eyes: topology, UV checker, wire-shaded
▪ domains/objects.py create, transform, shrinkwrap, bake_transfer
▫ domains/policy/ · finishing/ same held-back layer, add-on side
▫ tests/ · scripts/ ← how we prove it works
▫ docs/reports/ ← what we proved, and when
▫ docs/superpowers/ ← ARCHIVE (old plans) — do not start hereThe split is enforced, not just described. Domains are discovered by module presence, so
an artifact without domains/policy/ is one where those tools do not exist — there is no
flag to forget. CI builds both artifacts and fails if a policy file appears in either;
tests/test_product_surface.py fails if a policy tool is ever registered from a module
that ships. Build the release add-on yourself with:
python scripts/build_addon_zip.py # the pure MCP (62 files)
python scripts/build_addon_zip.py --include-policy # dev build, everythingDevelop
NIUA_SKIP_BLENDER=1 python -m pytest -q # unit only
python -m pytest -q # + smoke if blender is installedThree invariants are enforced by the test suite: the interface never imports finishing, the server never
imports bpy, and every server tool has a matching add-on handler.
Optional: the export check imports the finished .glb into a headless game engine to
prove it loads outside Blender — it uses a godot binary if one is on PATH purely as a
reference importer, and reports unmeasured (never a fake pass) when none is found. The
finisher itself has no engine dependency.
Security
system.execute_python is off by default; the bridge is localhost-only. Enable Python
only for trusted local sessions (NIUA_BLENDER_MCP_ALLOW_PYTHON=1, or the N-panel toggle).
License
Two programs, two licenses, split on a real process boundary:
Component | License |
MCP server ( | Apache-2.0 |
Blender add-on ( | GPL-3.0-or-later |
The add-on calls bpy, so Blender's GPL applies to it; the server is a separate process
that talks over a socket and is permissively licensed. See LICENSING.md.
Deeper docs
ARCHITECTURE.md— the four strata and the loopLICENSING.md— why the server is Apache-2.0 and the add-on is GPLdocs/reports/— live run evidence, including the honest failuresdocs/DESIGN.md— original full design (historical)
Available Tools
305 toolsanim-delete_keyframeB
Delete a keyframe on an object property at a frame
Inputs: data_path (required), frame, index, object.
anim-insert_keyframeB
Insert a keyframe on an object property at a frame
Inputs: data_path (required), frame, index, object.
anim-keyframesC
Detailed f-curve and keyframe report for an object
Inputs: object.
anim-list_actionsA
List the actions in the file (read-only)
Inputs: no named parameters.
anim-reportA
Animation report for an object: frame range, f-curve count (read-only)
Inputs: object.
anim-set_frameB
Set the current scene frame (playhead)
Inputs: frame (required).
anim-set_interpolationA
Set interpolation for all keyframes on an object's f-curves
Inputs: interpolation (required), object.
anim-set_timelineB
Set scene timeline range, current frame, and frame rate
Inputs: fps, frame_end, frame_start, frame_current.
anim-timelineA
Report scene timeline range, current frame, and frame rate
Inputs: no named parameters.
api-reportC
Report live Blender API operator/type metadata surface
Inputs: no named parameters.
api-searchB
Search live Blender API operators and RNA types
Inputs: limit, query.
app-addon_disableB
Disable an installed Blender add-on module
Inputs: module (required).
app-addon_enableC
Enable an installed Blender add-on module
Inputs: module (required).
app-addonsA
List available Blender add-ons with enabled and loaded state
Inputs: no named parameters.
app-file_newB
Empty the scene in-place (keeps the live bridge); force is required if dirty
Inputs: force.
app-file_openA
Open an existing .blend file by absolute path; force is required if current file is dirty
Inputs: path (required), force.
app-file_revertA
Reload the current file from disk; force is always required
Inputs: force.
app-file_saveA
Save the current file, or save to an absolute path if the file is unsaved
Inputs: path.
app-file_save_asA
Save the current file to a new absolute path and make it active
Inputs: path (required).
app-file_save_copyA
Save a copy of the current file without changing the active file path
Inputs: path (required).
app-infoB
Report Blender runtime, active file, dirty state, scene, workspace, and render engine
Inputs: no named parameters.
app-preferences_saveA
Save current Blender user preferences
Inputs: no named parameters.
app-preferences_summaryB
Report safe high-level user preference values
Inputs: no named parameters.
app-redoB
Run Blender redo for the active session
Inputs: no named parameters.
app-undoB
Run Blender undo for the active session
Inputs: no named parameters.
app-workspacesA
List workspaces and report the active workspace
Inputs: no named parameters.
app-workspace_setC
Switch the active window to a named workspace
Inputs: name (required).
asset_class-describeB
Describe one Layer 2 game-asset class profile
Inputs: asset_class (required).
asset_class-listA
List Layer 2 game-asset class profiles
Inputs: no named parameters.
camera-createA
Create a camera and optionally make it the active scene camera
Inputs: lens, name, type, active, +5 more.
camera-listB
List scene cameras and active camera
Inputs: no named parameters.
camera-reportA
Report one camera, defaulting to the active scene camera
Inputs: camera.
camera-setC
Set common camera data properties
Inputs: camera (required), lens, type, clip_end, +2 more.
camera-set_activeB
Set the active scene camera
Inputs: camera (required).
capabilities-describeA
Get the full typed parameter schema for one operation before calling it
Inputs: id (required).
capabilities-domainsA
List the craft domains and how many operations each exposes
Inputs: no named parameters.
capabilities-invokeC
Run any Blender operator with args validated against its schema (undo-safe)
Inputs: idname (required), args, mode, object, +1 more.
capabilities-searchA
Search ALL of Blender for a capability by keyword, ranked (start here)
Inputs: query (required), kind, limit, domain.
capabilities-toolsA
Navigate THIS server's tools: no args -> domain map; {domain} -> its tools; {name} -> one schema
Inputs: name, domain.
compositor-add_nodeC
Add a node to the scene compositor node tree
Inputs: type (required), name.
compositor-enableB
Enable or disable scene compositor nodes
Inputs: enable.
compositor-linkC
Link two compositor node sockets
Inputs: to_node (required), from_node (required), to_socket (required), from_socket (required).
compositor-reportB
Report scene compositor node tree
Inputs: no named parameters.
constraints-addC
Add an object or pose-bone constraint
Inputs: type (required), object (required), bone, name, +1 more.
constraints-listC
List object or pose-bone constraints
Inputs: object (required), bone, owner.
constraints-removeB
Remove a named object or pose-bone constraint
Inputs: name (required), object (required), bone, owner.
constraints-reportB
Report live RNA properties for object or pose-bone constraints
Inputs: object (required), bone, name, owner.
constraints-setC
Set one RNA property on an object or pose-bone constraint
Inputs: name (required), value (required), object (required), property (required), +2 more.
context-areasA
List available editor areas for context overrides
Inputs: no named parameters.
context-infoB
Report active object, selected objects, mode, mesh select mode, and available areas
Inputs: no named parameters.
context-mesh_select_modeC
Set mesh edit selection mode
Inputs: mode (required).
context-mode_setB
Switch Blender interaction mode, optionally activating an object first
Inputs: mode (required), object, select.
context-poll_operatorC
Check whether a Blender operator polls in the current or proposed context
Inputs: idname (required), mode, object, select.
context-select_allA
Select, deselect, or invert selection for all scene objects
Inputs: action.
context-select_objectsC
Update object selection by comma-separated object names
Inputs: objects (required), action, active.
context-set_activeC
Set the active object and optionally select it
Inputs: object (required), select.
feedback-captureB
Render one view (named or the live scene camera) to a PNG the agent can see
Inputs: res, view, object, shading.
feedback-capture_intakeC
Record the do-no-harm baseline: fixed-frame ortho alpha silhouettes + bbox + a session checkpoint
Inputs: object.
feedback-capture_viewsC
Render a multi-angle preset (the anti-blob) as several images
Inputs: res, object, preset, shading.
feedback-critiqueB
One observe call to judge a model: multi-angle images + mesh/UV report bundled
Inputs: res, object, preset, shading.
feedback-lookdevC
Render a material-shaded lookdev turntable and return quality analytics
Inputs: res, count, object.
feedback-orientationC
Render a normal/backface orientation eye and return orientation analytics
Inputs: res, view, object.
feedback-preservationB
Do-no-harm metric: mean/min silhouette IoU of current form vs the stored intake baseline + bbox delta (read-only, no revert)
Inputs: object.
feedback-qualityC
Objective quality metrics for a mesh: topology, UVs, orientation, symmetry, proportion, scale, engine/material readiness (read-only)
Inputs: object, min_lods, name_regex, asset_class, +14 more.
feedback-readinessB
Objective game-ready scorecard: fraction of all objective gates passed, order-free + deduped (no judge, no images)
Inputs: object, asset_class.
feedback-silhouetteB
Flat silhouette from preset angles + proportion/symmetry — the form eye.
Inputs: res, object, preset.
feedback-topologyA
Render a topology overlay: n-gons red, tris orange, quads grey, plus wireframe
Inputs: res, view, object.
feedback-turntableC
Orbit the object/scene and return a sequence of images
Inputs: res, count, object, shading.
feedback-uvC
Render a UV checker eye and return structured UV analytics
Inputs: res, view, object, texture_size.
feedback-wire_shadedC
Render shaded material view with real wire geometry overlay and quality analytics
Inputs: res, view, object.
geometry-convert_to_meshB
Convert a non-mesh geometry object to a mesh
Inputs: object (required), name, keep_original.
geometry-create_curveC
Create a curve primitive
Inputs: type (required), name, scale, radius, +2 more.
geometry-create_grease_pencilC
Create a grease pencil object
Inputs: name, type, scale, radius, +3 more.
geometry-create_metaballC
Create a metaball primitive
Inputs: name, type, scale, radius, +2 more.
geometry-create_surfaceD
Create a NURBS surface primitive
Inputs: type (required), name, scale, radius, +2 more.
geometry-create_textC
Create a text object
Inputs: body, name, size, scale, +4 more.
geometry_nodes-add_nodeB
Add a node to a Geometry Nodes modifier group
Inputs: type (required), object (required), name, modifier.
geometry_nodes-create_modifierB
Create a Geometry Nodes modifier with Blender's default node group
Inputs: object (required), name.
geometry_nodes-linkC
Create a link between two Geometry Nodes sockets
Inputs: object (required), to_node (required), from_node (required), to_socket (required), +2 more.
geometry_nodes-reportC
Report a Geometry Nodes modifier and its node group
Inputs: object (required), modifier.
geometry-reportC
Report non-mesh geometry object data
Inputs: object (required).
geometry-set_bezier_splineC
Replace a curve's spline with bezier control points; the modeling curve
Inputs: object (required), points (required), closed, handles.
geometry-set_curveD
Set curve-like geometry data fields
Inputs: object (required), extrude, fill_mode, dimensions, +5 more.
geometry-set_textC
Set text object fields
Inputs: object (required), body, size, align_x, +4 more.
info-messagesC
Return Info editor report messages when exposed by Blender RNA
Inputs: limit.
info-reportB
Report Info editor areas and available report operators
Inputs: no named parameters.
io-exportA
Export the scene or selected objects; format can be inferred from the path
Inputs: path (required), y_up, format, objects, +1 more.
io-importB
Import a mesh/scene file; format inferred from the extension by default
Inputs: path (required), format.
io-prepare_assetB
Optionally apply transforms on one object, then export just that object
Inputs: path (required), object (required), y_up, format, +2 more.
io-profile_validateB
Validate an object against a parameterized export profile without exporting
Inputs: object (required), y_up, format, profile, +5 more.
lattice-createC
Create a lattice object
Inputs: name, location.
lattice-point_setB
Set one lattice point's deformed coordinate
Inputs: index (required), object (required), co_deform (required).
lattice-reportB
Report lattice object, data, and point state
Inputs: object (required).
lattice-setD
Set one RNA property on lattice data
Inputs: value (required), object (required), property (required).
light-createC
Create a light object
Inputs: name, size, type, color, +5 more.
light-listC
List scene lights
Inputs: no named parameters.
lightprobe-createC
Create a light probe object
Inputs: type (required), name, location.
lightprobe-listB
List light probe objects
Inputs: no named parameters.
lightprobe-reportC
Report live RNA properties for a light probe
Inputs: name (required).
lightprobe-setC
Set one RNA property on a light probe data-block
Inputs: name (required), value (required), property (required).
light-reportB
Report one light, or all scene lights if omitted
Inputs: light.
light-setD
Set common light data properties
Inputs: light (required), size, color, energy, +2 more.
mesh-bevelC
Bevel the selected edges/vertices
Inputs: object, offset, segments.
mesh-deleteC
Delete selected mesh elements
Inputs: type, object.
mesh-dissolveC
Dissolve selected mesh elements
Inputs: type, object, use_verts, angle_limit, +1 more.
mesh-edge_face_addD
Create an edge or face from selected elements
Inputs: object.
mesh-extrudeC
Extrude the selected region and translate it
Inputs: object, translate.
mesh-fillC
Fill selected edges
Inputs: beauty, object.
mesh-insetB
Inset the selected faces
Inputs: object, thickness.
mesh-mergeC
Merge selected vertices
Inputs: uvs, type, object.
mesh-quads_to_trisC
Convert selected faces to triangles
Inputs: object, ngon_method, quad_method.
mesh-recalc_normalsC
Recalculate the mesh normals consistently
Inputs: inside, object.
mesh-remove_doublesC
Merge duplicate vertices
Inputs: object, threshold.
mesh-reportC
Analytic topology report for a mesh (read-only)
Inputs: object.
mesh-select_allC
Select, deselect, invert, or toggle all mesh elements
Inputs: action, object.
mesh-select_by_indexC
Select mesh elements by zero-based index
Inputs: mode (required), object (required), indices (required), action.
mesh-selection_reportC
Report selected vertices, edges, and faces
Inputs: object.
mesh-shade_smoothA
Toggle smooth/flat shading on the object
Inputs: object, smooth.
mesh-subdivideC
Subdivide the selected edges/faces
Inputs: cuts, object.
mesh-tris_to_quadsC
Convert selected triangles to quads
Inputs: object, face_threshold, shape_threshold.
modifiers-addC
Add a modifier to an object's stack
Inputs: type (required), name, object.
modifiers-applyC
Apply (bake) a modifier into the mesh
Inputs: name (required), object.
modifiers-copyB
Copy a modifier in the stack
Inputs: name (required), object, new_name.
modifiers-listA
List the modifier stack of an object (read-only)
Inputs: object.
modifiers-moveC
Move a modifier to a stack index
Inputs: name (required), index (required), object.
modifiers-removeB
Remove a modifier from the stack without applying it
Inputs: name (required), object.
modifiers-setC
Set a property on an existing modifier
Inputs: name (required), value (required), property (required), object.
modifiers-set_visibilityC
Set common modifier stack visibility flags
Inputs: name (required), cage, object, render, +3 more.
modifiers-typesA
List modifier types supported by the running Blender
Inputs: no named parameters.
object-bake_transferB
Bake high->low detail (normal/AO) from a source mesh into a target mesh's maps
Inputs: source (required), target (required), maps, size, +1 more.
object-boundsA
Read an object's local and world bounds
Inputs: object (required).
object-collision_hulls_createB
Create split box collision hulls across an object's bounds using generic Asset_COL_## names
Inputs: object (required), axis, count, margin, +1 more.
object-collision_proxy_createB
Create a simple collision proxy around an object's bounds using a generic Asset_COL naming convention
Inputs: object (required), name, shape, margin.
object-createC
Create a common mesh primitive or empty
Inputs: type (required), name, size, depth, +14 more.
object-deleteC
Delete one or more objects
Inputs: objects (required).
object-duplicateD
Duplicate an object
Inputs: object (required), name, linked, offset.
object-lod_createC
Create a decimated LOD duplicate using a generic Asset_LOD# naming convention
Inputs: object (required), name, apply, level, +1 more.
object-origin_setC
Set an object's origin
Inputs: object (required), type, center.
object-renameC
Rename an object
Inputs: name (required), object (required).
object-retopoA
Retopologize a mesh to a face budget (voxel+decimate, or decimate-only when voxel is unsafe)
Inputs: object (required), target_faces (required), mode, adaptivity, +3 more.
object-shrinkwrapA
Snap a mesh's vertices onto a target object's surface via a SHRINKWRAP modifier
Inputs: object (required), target (required), apply, offset.
object-transform_applyD
Apply an object's transform
Inputs: object (required), scale, location, rotation, +2 more.
object-transform_getC
Read an object's transform state
Inputs: object (required).
object-transform_setC
Set an object's transform fields
Inputs: object (required), scale, location, rotation, +4 more.
outliner-collection_createB
Create a collection under the scene root or a named parent collection
Inputs: name (required), parent.
outliner-collection_deleteB
Delete a collection; force is required when it contains objects or child collections
Inputs: collection (required), force.
outliner-collection_renameC
Rename a collection
Inputs: name (required), collection (required).
outliner-collection_visibility_setA
Set collection-level viewport/render/selectability restrictions
Inputs: collection (required), render, viewport, selectable.
outliner-describeC
Describe one object, collection, scene, or view layer by name
Inputs: target (required), kind.
outliner-findB
Search objects, collections, scenes, and view layers by name
Inputs: query (required), kind, limit.
outliner-layer_collection_setC
Set view-layer collection restrictions for one collection
Inputs: collection (required), view_layer (required), exclude, holdout, +2 more.
outliner-object_linkA
Link an object into a collection without removing existing collection membership
Inputs: object (required), collection (required).
outliner-object_moveC
Move an object to exactly one target collection
Inputs: object (required), collection (required).
outliner-object_unlinkB
Unlink an object from a collection; force is required if it is the final collection
Inputs: object (required), collection (required), force.
outliner-orphansB
List zero-user datablocks in high-value Outliner categories
Inputs: no named parameters.
outliner-orphans_purgeB
Purge orphan datablocks; force is always required
Inputs: force.
outliner-parent_clearA
Clear an object's parent, preserving world transform by default
Inputs: object (required), keep_transform.
outliner-parent_setA
Set an object's parent, preserving world transform by default
Inputs: object (required), parent (required), keep_transform.
outliner-treeA
Return the logical scene tree: scenes, view layers, collections, objects, and hierarchy
Inputs: no named parameters.
outliner-view_layer_createC
Create a view layer
Inputs: name (required).
outliner-view_layer_deleteA
Delete a view layer; force is required and the last layer cannot be deleted
Inputs: name (required), force.
outliner-view_layersA
List view layers and their layer-collection restriction trees
Inputs: no named parameters.
outliner-visibility_setB
Set object-level viewport/render/selectability restrictions
Inputs: object (required), render, viewport, selectable.
particles-addC
Add a particle system to an object
Inputs: object (required), name.
particles-removeB
Remove a named particle system from an object
Inputs: name (required), object (required).
particles-reportB
Report live RNA properties for one or all particle systems
Inputs: object (required), name.
particles-setC
Set one RNA property on a particle system or its settings
Inputs: name (required), value (required), object (required), property (required).
particles-systemsB
List particle systems on an object
Inputs: object (required).
physics-addB
Add a physics stack to an object
Inputs: type (required), object (required).
physics-field_reportB
Report an object's force field settings
Inputs: object (required).
physics-field_setC
Set one RNA property on an object's force field
Inputs: value (required), object (required), property (required).
physics-removeC
Remove a physics stack from an object
Inputs: type (required), object (required).
physics-reportB
Report all physics stacks on an object
Inputs: object (required).
physics-setB
Set one RNA property on a physics stack
Inputs: type (required), value (required), object (required), property (required).
pointcloud-attributesC
List point cloud geometry attributes and color attributes
Inputs: name_or_object (required).
pointcloud-listB
List point cloud objects and data-blocks
Inputs: no named parameters.
pointcloud-reportC
Report live RNA properties for a point cloud
Inputs: name_or_object (required).
pointcloud-setB
Set one writable RNA property on a point cloud data-block
Inputs: value (required), property (required), name_or_object (required).
project-filesB
List files for the active or detected Blender project
Inputs: no named parameters.
project-reportB
Report active or detected Blender project state and project editor areas
Inputs: no named parameters.
project-settingsC
Report project preferences, active project fields, and project.toml data
Inputs: no named parameters.
properties-getA
Read a stable Properties path such as object:Cube/location or object:Cube/idprops/foo
Inputs: path (required).
properties-object_reportC
Report all live RNA properties for an object, its data, modifiers, and custom props
Inputs: object (required), include_data, include_values, include_modifiers.
properties-reportC
Report all live RNA properties for any stable Properties path target
Inputs: path (required), include_values.
properties-setB
Set a stable Properties path; value is JSON-encoded
Inputs: path (required), value (required).
properties-unsetA
Unset a custom property or resettable RNA property by stable Properties path
Inputs: path (required).
render-set_settingsC
Set common render settings
Inputs: engine, filepath, transparent, image_format, +2 more.
render-settingsA
Report active render settings
Inputs: no named parameters.
render-stillB
Render a still image to disk, restoring prior scene settings after
Inputs: path (required), camera, engine, image_format, +2 more.
rig-add_armatureA
Create a new armature (skeleton) object
Inputs: name, location.
rig-add_boneB
Add an edit bone to an armature (head/tail in armature-local space)
Inputs: name (required), armature (required), head, tail.
rig-assign_weightsB
Assign vertex weights to a named vertex group by vertex index
Inputs: mesh (required), group (required), vertices (required), mode, +1 more.
rig-clear_poseA
Clear all pose bone transforms back to rest values
Inputs: armature (required).
rig-constraint_addC
Add a pose bone constraint
Inputs: bone (required), type (required), armature (required), name, +3 more.
rig-constraint_removeC
Remove a named pose bone constraint
Inputs: bone (required), name (required), armature (required).
rig-constraintsA
List pose bone constraints on one bone or the whole armature
Inputs: armature (required), bone.
rig-list_bonesA
List an armature's bones with head/tail positions (read-only)
Inputs: armature (required).
rig-parent_with_auto_weightsA
Parent a mesh to an armature with automatic skinning weights
Inputs: mesh (required), armature (required).
rig-pose_reportB
Report pose bone transforms and constraints
Inputs: armature (required), bone.
rig-reportB
Report rest bones, pose bones, constraints, and child meshes
Inputs: armature (required).
rig-set_bone_transformB
Set an existing bone's head and/or tail position
Inputs: bone (required), armature (required), head, tail.
rig-set_pose_boneB
Set a pose bone's location, Euler rotation, and/or scale
Inputs: bone (required), armature (required), scale, location, +2 more.
rig-vertex_group_createD
Create a mesh vertex group
Inputs: mesh (required), name (required).
rig-vertex_groupsA
List mesh vertex groups and assigned vertex weights
Inputs: mesh (required).
rna-call_operatorC
Run any bpy.ops operator, with args validated against its RNA
Inputs: idname (required), args, mode, object, +1 more.
rna-describeA
Describe a Blender operator or type via RNA (e.g. 'op:mesh.bevel', 'type:Object')
Inputs: path (required).
rna-get_propertyA
Read a data property by path under bpy.data (read-only)
Inputs: path (required).
rna-searchA
Search the live Blender API for operators/types matching a query, ranked by relevance
Inputs: query (required), kind, limit, category.
rna-set_propertyC
Set a data property by path under bpy.data (value is JSON-encoded)
Inputs: path (required), value (required).
scene-create_objectC
Create a primitive object in the scene
Inputs: type (required), name, location.
scene-infoA
Summarize the current scene (objects, materials)
Inputs: no named parameters.
scene-set_transformC
Set an object's location/rotation/scale
Inputs: object (required), scale, location, rotation.
script-pathsA
List Blender script search paths and configured script directories
Inputs: no named parameters.
script-reloadB
Reload Blender scripts when Python execution is trusted
Inputs: no named parameters.
script-reportB
Report script-space operators, preferences, paths, and editor areas
Inputs: no named parameters.
script-run_fileA
Run a Python file through Blender's script operator when Python execution is trusted
Inputs: path (required).
sequencer-modifier_addC
Add a strip modifier to a sequence strip
Inputs: name (required), type (required), modifier_name.
sequencer-modifier_removeB
Remove a strip modifier
Inputs: name (required), modifier (required).
sequencer-modifiersB
List strip modifiers on a sequence strip
Inputs: name (required).
sequencer-modifier_setC
Set one RNA property on a strip modifier
Inputs: name (required), value (required), modifier (required), property (required).
sequencer-reportB
Report sequence strips in the active scene
Inputs: no named parameters.
sequencer-strip_addC
Add a sequence strip
Inputs: type (required), name, path, channel, +1 more.
sequencer-strip_removeA
Remove a sequence strip by name
Inputs: name (required).
sequencer-strip_setB
Set one RNA property on a sequence strip
Inputs: name (required), value (required), property (required).
session-checkpointB
Snapshot an object's mesh data + transform so an edit can be rolled back
Inputs: label, object.
session-list_checkpointsA
List stored checkpoints for an object, or all objects (read-only)
Inputs: object.
session-revertB
Restore an object from a checkpoint (most recent if no label); one undo step
Inputs: label, object.
shaderfx-addB
Add a shader effect to a Grease Pencil object's stack
Inputs: type (required), object (required), name.
shaderfx-listA
List shader effects on a Grease Pencil object
Inputs: object (required).
shaderfx-removeC
Remove a named shader effect
Inputs: name (required), object (required).
shaderfx-reportB
Report live RNA properties for one or all shader effects
Inputs: object (required), name.
shaderfx-setC
Set one RNA property on a shader effect
Inputs: name (required), value (required), object (required), property (required).
shaderfx-typesB
List shader effect types supported by the running Blender
Inputs: no named parameters.
shading-add_image_textureB
Wire an image-texture node to a Principled BSDF target
Inputs: material (required), image_path (required), target.
shading-add_nodeB
Add a shader node to a material node tree
Inputs: type (required), material (required), name.
shading-assign_materialA
Assign a material to an object (creates it if missing)
Inputs: object (required), material (required).
shading-create_materialC
Create a new node-based material
Inputs: name.
shading-link_nodesB
Link two shader node sockets
Inputs: to_node (required), material (required), from_node (required), to_socket (required), +1 more.
shading-list_materialsA
List materials in the file (read-only)
Inputs: object.
shading-prepare_pbr_mapsB
Create node-based PBR image slots for BASE_COLOR, NORMAL, ROUGHNESS, AO, and CAVITY
Inputs: maps, size, object, prefix, +1 more.
shading-reportB
Report a material, object material slots, and shader node tree
Inputs: object, material.
shading-set_node_inputB
Set a shader node input default value from JSON
Inputs: node (required), input (required), value (required), material (required).
shading-set_principledB
Set Principled BSDF parameters on a material
Inputs: alpha, object, material, metallic, +3 more.
speaker-createC
Create a speaker object
Inputs: name, location.
speaker-listB
List speaker objects
Inputs: no named parameters.
speaker-reportC
Report live RNA properties for a speaker
Inputs: name (required).
speaker-setC
Set one writable RNA property on a speaker data-block
Inputs: name (required), value (required), property (required).
spreadsheet-columnsA
List spreadsheet columns derived from object geometry attributes
Inputs: object, component.
spreadsheet-reportC
Report spreadsheet editor state and object table shape
Inputs: object, component.
spreadsheet-rowsB
Return paginated spreadsheet rows derived from object geometry attributes
Inputs: limit, object, offset, component.
statusbar-reportC
Report Status Bar context and scene statistics
Inputs: no named parameters.
system-cancelA
Request cooperative cancellation of a queued/running operation (takes effect at the operation's next check), by id from system.operations
Inputs: op_id (required).
system-execute_pythonA
Run Python inside Blender; returns captured stdout and a 'result' variable if set
Inputs: code (required).
system-healthC
Bridge health: Blender version, open .blend, queue depth, last-error ring buffer
Inputs: no named parameters.
system-operationsA
List in-flight and recent operations with progress (works even while the main thread is busy)
Inputs: no named parameters.
text-appendC
Append to a Text data-block body
Inputs: body (required), name (required).
text-createC
Create a Text data-block
Inputs: name (required), body.
text-listC
List Text data-blocks
Inputs: no named parameters.
text-openC
Open a text file into a Text data-block
Inputs: path (required), name.
text-readC
Read a Text data-block
Inputs: name (required).
text-removeC
Remove a Text data-block
Inputs: name (required).
text-saveC
Save a Text data-block to disk
Inputs: name (required), path.
textures-listB
List image datablocks
Inputs: no named parameters.
textures-loadC
Load an image datablock from disk
Inputs: path (required), name.
textures-reportC
Report one image datablock
Inputs: name (required).
text-writeB
Replace a Text data-block body
Inputs: body (required), name (required).
tool-activeC
Report the active workspace tool for an editor/mode
Inputs: mode, area_type.
tool-setC
Switch the active workspace tool by idname
Inputs: idname (required), mode, area_type.
tool-setting_getC
Read one ToolSettings path
Inputs: path (required).
tool-settingsC
Report active tool and live ToolSettings RNA properties
Inputs: mode, area_type.
tool-setting_setC
Set one ToolSettings path
Inputs: path (required), value (required).
topbar-command_searchB
Search Blender commands exposed through bpy.ops without opening modal UI
Inputs: limit, query.
topbar-reportB
Report active topbar context, workspace, scene, and search capability
Inputs: no named parameters.
tracking-clip_loadC
Load a movie clip or image sequence source
Inputs: path (required), name.
tracking-clipsA
List loaded movie clips
Inputs: no named parameters.
tracking-marker_reportC
Report markers for each track in a clip
Inputs: clip (required).
tracking-reportB
Report MovieClip and tracking state
Inputs: no named parameters.
tracking-track_reportC
Report tracks for a clip
Inputs: clip (required).
ui-operator_invokeB
Run any Blender operator with explicit editor area context and undo-safe dispatch
Inputs: idname (required), area, args, mode, +6 more.
ui-operator_pollA
Check whether a Blender operator polls in an explicit editor area context
Inputs: idname (required), area, mode, object, +5 more.
ui-redrawC
Request a Blender UI redraw when wm.redraw_timer is available
Inputs: type, iterations.
ui-screenshotB
Capture Blender's UI screenshot when screen.screenshot is available
Inputs: path (required), full.
ui-stateB
Report Blender UI availability, active window, and foreground-only capability flags
Inputs: no named parameters.
ui-windowsA
List Blender windows, screens, workspaces, areas, regions, and UI geometry
Inputs: no named parameters.
uv-average_islands_scaleC
Average the texel density / scale of all UV islands
Inputs: object.
uv-cube_projectB
Cube-project the selected faces onto the UV map
Inputs: object, cube_size.
uv-export_layoutC
Export the mesh UV layout as an image file
Inputs: path (required), size, format, object, +3 more.
uv-layer_createC
Create a UV layer
Inputs: name, object, do_init.
uv-layer_deleteB
Delete a UV layer by name
Inputs: name (required), object.
uv-layersC
List UV layers and active UV layer
Inputs: object.
uv-layer_set_activeB
Set the active UV layer by name
Inputs: name (required), object.
uv-pack_islandsB
Pack the UV islands to fit the [0,1] UV space
Inputs: margin, object.
uv-reportA
Analytic UV report for a mesh: layers, has_uvs, island count (read-only)
Inputs: object.
uv-seamsC
Report seam edge indices
Inputs: object.
uv-set_seamsC
Set, add, remove, or clear seam edge flags
Inputs: edges, action, object.
uv-smart_unwrapC
Smart UV project the selected faces (angle-based auto seams)
Inputs: object, angle_limit, island_margin.
uv-sphere_projectB
Sphere-project the selected faces onto the UV map
Inputs: object.
uv-unwrapC
Unwrap the selected faces along existing seams
Inputs: method, object, island_margin.
volume-create_emptyC
Create an empty volume object
Inputs: name, location.
volume-importB
Import an OpenVDB volume file
Inputs: path (required), name.
volume-listB
List volume objects and data-blocks
Inputs: no named parameters.
volume-reportC
Report live RNA properties for a volume
Inputs: name_or_object (required).
volume-setC
Set one writable RNA property on a volume data-block or nested settings object
Inputs: value (required), property (required), name_or_object (required).
world-reportB
Report scene world color and background strength
Inputs: no named parameters.
world-setB
Set scene world color and/or background strength
Inputs: color, strength.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 305 tools
Multiple near-duplicate clusters exist: three tools invoke any Blender operator (capabilities-invoke, rna-call_operator, ui-operator_invoke), four search the API (capabilities-search, api-search, rna-search, topbar-command_search), and property access is split confusingly between properties-get/set and rna-get_property/set_property. Object creation and transform are also duplicated (object-create vs scene-create_object; object-transform_set vs scene-set_transform). An agent must read carefully to avoid misselection.
The vast majority of tools follow a consistent domain-verb_noun snake_case pattern (object-create, mesh-bevel, modifiers-add, uv-pack_islands), making the set predictable. Minor deviations exist: asset_class- uses an underscore in the domain, tool-settings vs tool-setting_get/set mixes plural and singular, and a handful of report tools use bare nouns (anim-timeline, uv-layers, sequencer-modifiers) instead of verb_noun.
305 tools is an extreme count that far exceeds the 50+ threshold for a mismatch. Even with strong domain organization, the sheer volume creates enormous selection overhead and makes it impractical for an agent to audit or reliably choose from the surface. Blender's breadth does not justify this many curated entry points when generic invoke/search tools already exist.
The curated surface is very broad: mesh editing, modifiers, materials, UV, rigging, animation, particles, physics, rendering, compositing, import/export, and scripting are all covered with mostly complete lifecycles. However, notable Blender workflows are absent from the curated set — sculpting, texture painting, object join/separate, NLA/drivers, and armature bone deletion — with generic invoke-any-operator tools papering over those gaps rather than filling them.
Maintenance
Related MCP Connectors
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
An MCP server that provides asset auto generator
Create, inspect, validate, and save editable 3D building scenes with Pascal's MCP server.
An MCP server that automatically collects feedback on your MCP server.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server for 3D model processing that provides automated retopology, decimation, and quality analysis for OBJ and GLB files. It integrates Instant Meshes, pymeshlab, and Blender 3.6 to support smart simplification, texture preservation, and structured model archiving.2-
- AlicenseAqualityDmaintenanceMCP server for AI-assisted Blender automation, providing layered tools for perception, declarative and imperative writing, and fallback operations.2985 PyPI7MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for AI-driven Blender↔Unreal Engine bridge, providing 62 tools for 3D modeling, scene validation, and asset transfer across both engines.1MIT
- AlicenseAqualityDmaintenanceMCP server for Blender that connects to the official Blender Lab add-on, exposing 27 tools for scene manipulation, object editing, materials, rendering, and Python execution through the add-on's actual wire protocol.271MIT