Skip to main content
Glama

Blender MCP Server

Control Blender from any AI assistant using the Model Context Protocol (MCP).

27 tools across 7 namespaces — create objects, assign materials, render images, export scenes, execute Python scripts, manage async jobs, and more.

Demo render — scene built entirely through MCP tools

How It Works

┌─────────────┐      stdio       ┌──────────────────┐    JSON/TCP     ┌─────────────────┐
│  MCP Client │ ◄──────────────► │  MCP Server      │ ◄─────────────► │  Blender Add-on │
│  (any host) │                  │  (Python)        │  localhost:9876 │  (runs in bpy)  │
└─────────────┘                  └──────────────────┘                 └─────────────────┘
  1. The Blender add-on runs inside Blender and listens on localhost:9876.

  2. The MCP server connects to your AI client via stdio and forwards tool calls to Blender over TCP.

  3. You ask the AI → it calls MCP tools → Blender executes commands → results flow back.

Related MCP server: blender-mcp

Quick Start

1. Install the MCP Server

git clone https://github.com/djeada/blender-mcp-server.git
cd blender-mcp-server
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

This creates the executable .venv/bin/blender-mcp-server.

2. Install the Blender Add-on

Build the add-on zip:

./scripts/build_addon_zip.sh

Then in Blender:

  1. Go to Edit → Preferences → Add-ons → Install.

  2. Select dist/blender_mcp_bridge.zip and enable Blender MCP Bridge.

  3. In the 3D Viewport, press N → open the MCP tab.

  4. Confirm it shows Listening on 127.0.0.1:9876.

3. Connect Your MCP Client

Add to your config file:

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "blender": {
      "command": "/absolute/path/to/blender-mcp-server/.venv/bin/blender-mcp-server"
    }
  }
}

Replace the path with the actual location of your clone.

Register the server once:

codex mcp add blender -- /absolute/path/to/blender-mcp-server/.venv/bin/blender-mcp-server

Verify with codex mcp list. Then start Codex from any directory — it launches the server automatically.

Point any MCP-compatible client at the server executable:

/absolute/path/to/blender-mcp-server/.venv/bin/blender-mcp-server

The server uses stdio transport. No additional flags are needed.

4. Start Using It

Make sure Blender is open with the add-on listening, then ask your AI assistant:

  • "What objects are in my Blender scene?"

  • "Create a cube named TestCube at [0, 0, 1]"

  • "Render the scene to /tmp/render.png"

The AI calls MCP tools like blender_scene_list_objects and blender_object_create, which the server forwards to Blender.

Example Prompts

  • "What objects are in my scene?"

  • "Show me the transform of the Camera object"

  • "List all materials in the file"

  • "Create a sphere named 'Earth' at position [0, 0, 2] with size 3"

  • "Add a cylinder at the origin, then scale it to [0.5, 0.5, 4] to make a tall pillar"

  • "Create 5 cubes in a row spaced 3 units apart"

  • "Create a red material and assign it to the Cube"

  • "Make a material called 'Ocean' with color [0.0, 0.3, 0.8] and assign it to the Sphere"

  • "Change the color of 'RedMaterial' to orange"

  • "Move the Cube up 2 units on the Z axis"

  • "Rotate the Cylinder 45 degrees on the Z axis"

  • "Scale the Sphere to [2, 2, 2]"

  • "Render the scene at 1920×1080 and save it to /tmp/render.png"

  • "Export the scene as a GLB file to /tmp/scene.glb"

  • "Run this Blender Python: bpy.ops.mesh.primitive_monkey_add(location=(0,0,2))"

  • "Execute the fluid_domain.py script from the library with resolution 128"

  • "Start an async bake job for the fluid simulation and tell me the job ID"

  • "Undo the last change"

  • "Redo what was just undone"

Tool Reference

Scene Inspection

Tool

Description

blender_scene_get_info

Scene metadata — name, frame range, render engine, resolution, object count

blender_scene_list_objects

List all objects, optionally filter by type (MESH, CAMERA, LIGHT, …)

blender_object_get_transform

Get position, rotation, and scale of an object by name

blender_object_get_hierarchy

Parent/child hierarchy tree (full scene or subtree)

Object Manipulation

Tool

Description

blender_object_create

Create primitives: cube, sphere, cylinder, plane, cone, torus

blender_object_delete

Delete an object by name

blender_object_translate

Move — absolute location or relative offset

blender_object_rotate

Set rotation [x, y, z] in degrees (default) or radians

blender_object_scale

Set scale [x, y, z]

blender_object_duplicate

Duplicate with optional new name

Materials

Tool

Description

blender_material_list

List all materials in the file

blender_material_create

Create a material with optional base color [r, g, b] (0–1)

blender_material_assign

Assign a material to an object

blender_material_set_color

Set the Principled BSDF base color

blender_material_set_texture

Set an image texture as base color

Rendering & Export

Tool

Description

blender_render_still

Render still image — output path, resolution, engine

blender_render_animation

Render animation — frame range, output path, engine

blender_export_gltf

Export as glTF/GLB

blender_export_obj

Export as OBJ

blender_export_fbx

Export as FBX

History

Tool

Description

blender_history_undo

Undo the last operation

blender_history_redo

Redo the last undone operation

Python Execution

Tool

Description

blender_python_exec

Run a Python script synchronously. Accepts code or script_path, optional args, timeout_seconds, and transport (bridge or headless).

blender_python_exec_async

Start a long-running script asynchronously. Returns a job_id.

blender_job_status

Poll an async job's status, result, stdout, stderr, and error.

blender_job_cancel

Cancel a running or queued async job.

blender_job_list

List known async jobs with IDs, status, and creation time.

Script Library

Pre-built scripts in scripts/library/ for use with blender_python_exec via script_path:

Script

Description

create_mesh.py

Create primitive meshes through the data API (no bpy.ops)

fluid_domain.py

Create a Mantaflow fluid domain

fluid_inflow.py

Create an inflow source

effector.py

Set objects as collision effectors

rigid_body.py

Add rigid body physics

frame_range.py

Set scene frame range

camera.py

Create and configure a camera

keyframes.py

Insert transform keyframes

collections.py

Organize objects into collections

apply_transforms.py

Apply transforms to objects

save_blend.py

Save the .blend file

See scripts/library/README.md for full argument docs and a dam-break walkthrough.

Tips for physics workflows:

  • Prefer create_mesh.py (data API) over bpy.ops.mesh.primitive_*_add in live sessions — the operator path can destabilize view-layer updates around fluid setup.

  • Keep Mantaflow liquid modifiers hidden in the viewport to avoid crashes in Blender 4.x.

  • Use transport="headless" for heavy physics bakes — this runs scripts in a separate blender -b process.

Safety & Security

Feature

Description

Automatic undo push

Mutation tools push an undo step before executing (Python exec excluded for stability).

Safe Mode

Restricts file I/O to the project directory only.

Tool whitelist

Limits which commands the bridge accepts.

Script path restrictions

script_path must be under configured approved roots.

Inline code toggle

Disable inline code execution via add-on preferences.

Module blocklist

subprocess, shutil, socket, webbrowser, ctypes, multiprocessing are blocked by default.

Add-on Preferences

In Blender → Edit → Preferences → Add-ons → Blender MCP Bridge:

Setting

Default

Description

Safe Mode

Off

Restrict file I/O to the project directory

Port

9876

TCP port for the MCP bridge

Allow Inline Code

On

Allow python.execute to run inline code strings

Approved Script Roots

(blend file dir)

Semicolon-separated directories for script file access

Advanced Usage

The helper scripts in scripts/ connect directly to the Blender add-on on 127.0.0.1:9876, bypassing the MCP server entirely. Useful for verifying the add-on works:

python3 scripts/blender_scene_info.py
python3 scripts/blender_create_test_cube.py --name TestCube --x 0 --y 0 --z 1 --size 2
python3 scripts/blender_bridge_request.py scene.get_info
python3 scripts/blender_bridge_request.py object.translate --params '{"name":"TestCube","offset":[0,0,2]}'

All scripts accept --host, --port, and --timeout flags.

Run Blender without a GUI for automation:

blender -b --python your_script.py

Where your_script.py starts the MCP bridge:

import sys
sys.path.insert(0, "/path/to/blender-mcp-server")
from addon import CommandHandler, BlenderMCPServer

server = BlenderMCPServer()
server.start()

import socket
s = socket.socket()
s.bind(("127.0.0.1", 9877))
s.listen(1)
s.accept()  # Blocks until shutdown signal

Inline code — create a fluid domain:

{
  "tool": "blender_python_exec",
  "args": {
    "code": "import bpy\nbpy.ops.mesh.primitive_cube_add(size=4, location=(0,0,2))\ndomain = bpy.context.active_object\ndomain.name = 'FluidDomain'\nbpy.ops.object.modifier_add(type='FLUID')\ndomain.modifiers['Fluid'].fluid_type = 'DOMAIN'\nsettings = domain.modifiers['Fluid'].domain_settings\nsettings.domain_type = 'LIQUID'\nsettings.resolution_max = 64\n__result__ = {'domain': domain.name, 'resolution': 64}",
    "args": {"resolution": 64}
  }
}

Script file — set up colliders:

{
  "tool": "blender_python_exec",
  "args": {
    "script_path": "scripts/library/effector.py",
    "args": {
      "objects": ["Ground", "Building_01", "Building_02"],
      "effector_type": "COLLISION"
    }
  }
}

Async bake and poll:

{"tool": "blender_python_exec_async", "args": {"code": "import bpy\nbpy.ops.fluid.bake_all()\n__result__ = {'baked': True}", "timeout_seconds": 1800}}

{"job_id": "job-f8e2a1b3"}

{"tool": "blender_job_status", "args": {"job_id": "job-f8e2a1b3"}}

Development

git clone https://github.com/djeada/blender-mcp-server.git
cd blender-mcp-server
pip install -e ".[dev]"

pytest tests/ -v

Project Structure

blender-mcp-server/
├── addon/                        # Blender add-on (TCP server + command handlers + job manager)
├── src/blender_mcp_server/       # MCP server (stdio transport + tool definitions)
├── scripts/
│   ├── library/                  # Reusable Blender scripts for common tasks
│   ├── demos/                    # End-to-end demo scenes
│   └── blender_bridge_request.py # Direct bridge test helpers
├── tests/                        # Unit tests (mocked bpy, no Blender required)
├── docs/                         # Architecture & design docs
├── pyproject.toml
└── README.md

Contributing

  1. Fork the repository.

  2. Create a feature branch.

  3. Add tests for your changes.

  4. Run pytest tests/ -v to verify all tests pass.

  5. Submit a pull request.

License

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    Enables AI-powered control of Blender through natural language, allowing users to create, manipulate, and automate 3D scenes, objects, materials, animations, and more via Claude or other MCP clients.
    71
    44
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables connecting Blender 3D to AI assistants via MCP, allowing prompt-driven 3D modeling, scene editing, and real-time manipulation. Supports object/material control, scene inspection, viewport screenshots, and integrations with Poly Haven, Sketchfab, and AI model generators.
    22
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables any MCP client to control Blender 5.2 LTS via natural language, including scene creation, object manipulation, material assignment, rendering, and Python execution.
    MIT