blender-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| COMFY_URLS | No | ComfyUI instances sharing the GPU (GPU guard) | http://127.0.0.1:8188,http://127.0.0.1:8189 |
| BLENDER_EXE | No | Path to blender.exe; default is the newest install under Program Files\Blender Foundation | |
| BLENDER_MCP_HOST | No | Host running Blender | 127.0.0.1 |
| BLENDER_MCP_PORT | No | Addon socket port | 9876 |
| MIN_FREE_VRAM_GB | No | GPU guard threshold | 6 |
| ASSET_VALIDATOR_PY | No | Path to a validate_asset.py exposing validate(path, height_m, tri_budget, tol, nonmanifold_max) (and optionally validate_with_doc). Its deps: uv sync --extra validate |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| blender_statusB | Is Blender's MCP addon socket reachable right now? |
| blender_startB | Launch Blender (optionally opening No-op if it is already up. Finds blender.exe in Program Files or via $BLENDER_EXE. |
| blender_stopA | Quit Blender. Refuses when the file has unsaved changes unless force=True (which kills it). |
| blender_scene_infoB | Summary of the open Blender scene (objects, counts, active camera). |
| blender_object_infoC | Transform, dimensions, materials and mesh stats for one object. |
| blender_run_pythonB | Run Python inside Blender (bpy available). The reply is the code's stdout: use print(). Executes arbitrary code in the user's Blender session. Keep edits reproducible: record meaningful changes in your build scripts, not only in the live scene. |
| blender_screenshotB | Screenshot of the Blender 3D viewport (needs the Blender UI open). Returns an image. |
| blender_turntableA | Render evenly spaced turntable views of all visible meshes; returns the images. View 0 = front (-Y). mode: material (scene materials + temporary offset key light of strength |
| blender_renderB | Render explicit camera views: views=[{"az": degrees, "el": degrees}, ...] (az 0 = front/-Y, +az toward +X,
el = elevation). |
| blender_render_sceneB | Render through the scene's OWN active camera and lights (shot rendering), one image per frame.
mode: beauty | mask (needs |
| blender_import_glbB | Import a GLB/glTF/FBX into the open scene. Returns new objects, triangle count and dimensions (x,y,z in m). |
| blender_export_glbA | Export to a .glb. With |
| blender_openC | Open a .blend (replaces the current scene; unsaved changes are lost). |
| blender_saveB | Save the current file, or save as |
| blender_new_sceneB | Remove all objects (orphan data purged). keep: object types to keep, e.g. ["CAMERA", "LIGHT"]. |
| blender_validate_assetA | Run the asset validator (dims within tol of height_m, tri budget, NaN, zero-area faces, non-manifold, PBR maps). With asset_json also cross-checks the sidecar. Needs ASSET_VALIDATOR_PY (see README). |
| blender_rig_infoC | Bones (name, parent, head/tail in rest pose) of an armature and the meshes bound to it. |
| blender_set_poseA | Set local Euler rotations (degrees) on pose bones: rotations={"bone": [x, y, z]}. reset=True clears other bones first. Use blender_reset_pose afterwards to go back to rest. |
| blender_pose_aimA | Pose by direction, no bone-axis knowledge needed: aim={"RightArm": [1, 0, 0.2], "Spine": [0, 0, 1]} points each bone's limb (its head to the head of its continuing child, not the bone tail) along that WORLD direction, parents first. Returns the residual angle per bone in degrees. Prefer this over blender_set_pose for authoring poses. |
| blender_key_poseA | Keyframe the current pose of the armature at |
| blender_timelineB | Set the frame range / fps and/or jump to a frame (which evaluates existing keyframes). |
| blender_reset_poseC | Return all pose bones of the armature to the rest pose. |
| blender_pose_metricsB | Deformation metrics of the CURRENT pose vs rest: face-area ratio percentiles, fraction of faces stretched >2x or squashed <0.4x, volume ratio (volume loss = candy-wrapper joints), and the number of vertices with zero skin weight. |
| blender_rom_testA | Range-of-motion test: for each pose apply it, measure deformation and render. Returns a JSON report followed by one image per pose; the rig is reset to rest afterwards. poses={"name": {"bone": [x, y, z]}} in degrees. Default is a Mixamo-named table whose rotation axes are NOT calibrated: check the images and pass your own poses if they look wrong. |
| blender_compare_refB | Coarse likeness check: silhouette IoU between an orthographic render of the model (from azimuth/ elevation) and a reference image (alpha, or plain background). Both are cropped to their bounding boxes, so position/scale are ignored; aspect_ratio_diff reports proportion mismatch. Returns JSON and an overlay image (red = reference only, green = render only, yellow = both). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 25 tools
Most tools target clearly distinct operations, and the render family (blender_turntable, blender_render, blender_render_scene) is carefully differentiated by camera source. The pose tools (blender_set_pose vs blender_pose_aim) overlap slightly, but descriptions explicitly state when to prefer each.
Every tool uses the same blender_ snake_case prefix, and names read as clear verb_noun or noun_noun constructs. Minor verb-placement variation (blender_render_scene vs blender_scene_info) does not break the pattern.
25 tools is on the heavy side, but the surface genuinely spans several subdomains (file/lifecycle, rendering, rigging/posing, validation). Each tool maps to a distinct capability rather than redundant variants.
The set covers lifecycle (start/stop/status, open/save/new), import/export, scene/object inspection, rendering, rigging/posing/keyframing, and validation/comparison. Gaps like direct object deletion or material editing exist but are largely workable via blender_run_python.