Skip to main content
Glama
Blender Finisher

Blender Finisher

by OhaoTech

Blender Finisher

tests

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? Read START_HERE.md — one page, then come back.

architecture

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 bpy

✅ (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. verify

Then finish the benchmark fixtures:

python scripts/run_skill.py --skill bake_and_finish --port 8765 --outdir /tmp/niua_finish

install_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 here

The 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, everything

Develop

NIUA_SKIP_BLENDER=1 python -m pytest -q   # unit only
python -m pytest -q                       # + smoke if blender is installed

Three 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 (src/) — never imports bpy

Apache-2.0

Blender add-on (blender_addon/) — runs inside Blender

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

Available Tools

305 tools
anim-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.

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-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-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-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_moveC

Move an object to exactly one target collection

Inputs: object (required), collection (required).

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-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-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-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

    C2.4/5.0

    Scored across 305 tools

    Disambiguation2/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      An 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
      -
    • A
      license
      A
      quality
      D
      maintenance
      MCP server for AI-assisted Blender automation, providing layered tools for perception, declarative and imperative writing, and fallback operations.
      29
      85 PyPI
      7
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server for AI-driven Blender↔Unreal Engine bridge, providing 62 tools for 3D modeling, scene validation, and asset transfer across both engines.
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP 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.
      27
      1
      MIT