MCP server for controlling Blender via AI assistants
Project description
Blender MCP Server
Control Blender from AI assistants like Claude Desktop using the Model Context Protocol (MCP).
22 tools across 6 namespaces — create objects, assign materials, render images, export scenes, and more, all through natural language.
Scene above was created entirely through MCP commands: orange cube, blue sphere, stretched cylinder, and cone — with materials, transforms, and lighting.
How It Works
┌─────────────────┐ stdio ┌──────────────────────┐ JSON/TCP ┌────────────────────┐
│ Claude Desktop │ ◄──────────────► │ MCP Server (Python) │ ◄─────────────► │ Blender Add-on │
│ (MCP Client) │ │ src/server.py │ localhost:9876 │ (runs in Blender) │
└─────────────────┘ └──────────────────────┘ └────────────────────┘
- The Blender add-on runs inside Blender, opening a TCP socket on
localhost:9876 - The MCP server connects to Claude Desktop via stdio and forwards tool calls to Blender over TCP
- You talk to Claude → Claude calls MCP tools → Blender executes commands → results flow back
Quick Start
Step 1: Install the Blender Add-on
- Open Blender
- Go to Edit → Preferences → Add-ons → Install
- Select
addon/__init__.pyfrom this repository - Enable "Blender MCP Bridge"
- The TCP bridge starts automatically — you'll see "● Listening on 127.0.0.1:9876" in the sidebar panel
Step 2: Install the MCP Server
pip install blender-mcp-server
Or from source:
git clone https://github.com/your-org/blender-mcp-server
cd blender-mcp-server
pip install -e .
Step 3: Configure Claude Desktop
Add this to your Claude Desktop config file:
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": "blender-mcp-server"
}
}
}
Or with uvx (no install needed):
{
"mcpServers": {
"blender": {
"command": "uvx",
"args": ["blender-mcp-server"]
}
}
}
Step 4: Start Using It
- Make sure Blender is running with the add-on enabled
- Open Claude Desktop
- Start asking Claude to work with your Blender scene!
Example Prompts
Here's what you can ask Claude to do once everything is connected:
🔍 Inspecting Your Scene
"What objects are in my scene?"
"Show me the transform of the Camera object"
"List all materials in the file"
🔨 Creating Objects
"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"
🎨 Materials & Colors
"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"
📐 Transforming Objects
"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]"
📸 Rendering & Exporting
"Render the scene at 1920x1080 and save it to /tmp/render.png"
"Export the scene as a GLB file to /tmp/scene.glb"
⏪ Safety
"Undo the last change"
"Redo what was just undone"
Example Session
Here's a real session transcript showing every category of tool in action. All output below was produced by a live Blender 4.0.2 instance controlled through the MCP bridge:
📋 STEP 1: Get Scene Info
─────────────────────────
{
"name": "Scene",
"frame_current": 1,
"frame_start": 1,
"frame_end": 250,
"render_engine": "BLENDER_EEVEE",
"resolution_x": 1920,
"resolution_y": 1080,
"object_count": 3
}
📦 STEP 2: List Default Scene Objects
──────────────────────────────────────
• Cube (MESH ) at [0.0, 0.0, 0.0]
• Light (LIGHT ) at [4.1, 1.0, 5.9]
• Camera (CAMERA ) at [7.4, -6.9, 5.0]
🔨 STEP 3: Create Mesh Objects
───────────────────────────────
✅ Created MyCube at [0.0, 0.0, 0.0]
✅ Created MySphere at [3.0, 0.0, 0.0]
✅ Created MyCylinder at [-3.0, 0.0, 0.0]
✅ Created MyCone at [0.0, 3.0, 0.0]
🔄 STEP 4: Transform Objects
─────────────────────────────
✅ Moved MyCube to [0.0, 0.0, 2.0]
✅ Rotated MySphere Z=45°
✅ Scaled MyCylinder to [1.0, 1.0, 3.0]
📑 STEP 5: Duplicate Object
────────────────────────────
✅ Duplicated 'MyCube' → 'MyCube.Copy'
📐 STEP 6: Inspect Object Transform
────────────────────────────────────
{
"name": "MyCube",
"location": [0.0, 0.0, 2.0],
"rotation_euler": [0.0, 0.0, 0.0],
"scale": [1.0, 1.0, 1.0]
}
🎨 STEP 7: Create & Assign Materials
─────────────────────────────────────
✅ Created 'RedMaterial'
✅ Assigned 'RedMaterial' → 'MyCube'
✅ Created 'BlueMaterial'
✅ Assigned 'BlueMaterial' → 'MySphere'
✅ Changed RedMaterial color → orange
🎨 STEP 8: List Materials
─────────────────────────
• BlueMaterial (nodes: True, users: 1)
• Material (nodes: True, users: 1)
• RedMaterial (nodes: True, users: 1)
🌳 STEP 9: Scene Hierarchy
───────────────────────────
• Cube (MESH) • MyCube (MESH)
• Light (LIGHT) • MySphere (MESH)
• Camera (CAMERA) • MyCylinder (MESH)
• MyCone (MESH)
🗑️ STEP 10: Delete Object
──────────────────────────
✅ Deleted 'MyCube.Copy'
📸 STEP 12: Render Still Image
───────────────────────────────
✅ Rendered: /tmp/blender_mcp_render.png
Engine: BLENDER_EEVEE, Resolution: [640, 480]
⏪ STEP 13: Undo & Redo
───────────────────────
✅ undo
✅ redo
📦 FINAL: Scene Summary — 7 objects, 3 materials
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, etc.) |
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) |
Materials
| Tool | Description |
|---|---|
blender_material_list |
List all materials in the file |
blender_material_create |
Create a new 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 |
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 |
Rendering & Export
| Tool | Description |
|---|---|
blender_render_still |
Render still image — set output path, resolution, engine |
blender_render_animation |
Render animation — set 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 |
Safety Features
- Automatic undo push — every mutation tool pushes an undo step first, so you can always roll back
- Safe Mode — enable in add-on preferences to restrict file access to the project directory only
- Tool whitelist — limit which commands the bridge will accept
- No arbitrary code execution — the bridge only accepts predefined commands, never
execoreval
Add-on Preferences
In Blender → Edit → Preferences → Add-ons → Blender MCP Bridge:
| Setting | Description | Default |
|---|---|---|
| Safe Mode | Restrict file I/O to project directory | Off |
| Port | TCP port for the MCP bridge | 9876 |
Headless / Background Mode
You can also run Blender in background mode (no 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()
# Keep Blender alive (use your preferred method)
import socket
s = socket.socket()
s.bind(("127.0.0.1", 9877))
s.listen(1)
s.accept() # Blocks until shutdown signal
Development
# Clone and install with dev dependencies
git clone https://github.com/your-org/blender-mcp-server
cd blender-mcp-server
pip install -e ".[dev]"
# Run tests (no Blender required)
pytest tests/ -v
Project Structure
blender-mcp-server/
├── addon/
│ └── __init__.py # Blender add-on — TCP server + command handlers
├── src/blender_mcp_server/
│ ├── __init__.py
│ └── server.py # MCP server — stdio transport + 22 tool definitions
├── tests/
│ ├── test_addon.py # Add-on tests (mocked bpy)
│ └── test_server.py # MCP server tests
├── docs/
│ ├── architecture.md # Architecture documentation
│ └── images/
│ └── demo_render.png # Render from demo session
├── pyproject.toml
└── README.md
Contributing
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Run
pytest tests/ -vto verify all 23 tests pass - Submit a pull request
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blender_mcp_server-0.1.0.tar.gz.
File metadata
- Download URL: blender_mcp_server-0.1.0.tar.gz
- Upload date:
- Size: 233.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e625e8dc8749863bf4983d7904c271e1c56c8e73a7f4d718d00d26fb00f61bab
|
|
| MD5 |
fc96f9a4598b36b5b6ba6f696d4af6d7
|
|
| BLAKE2b-256 |
874e879358a90edc3f048b42891baeaefa7f1972edac994794faaf80c3d20a28
|
Provenance
The following attestation bundles were made for blender_mcp_server-0.1.0.tar.gz:
Publisher:
publish-pypi.yml on djeada/blender-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blender_mcp_server-0.1.0.tar.gz -
Subject digest:
e625e8dc8749863bf4983d7904c271e1c56c8e73a7f4d718d00d26fb00f61bab - Sigstore transparency entry: 1004406133
- Sigstore integration time:
-
Permalink:
djeada/blender-mcp-server@aea4d71426aa6789312839dd4b8cadf0931b8ab5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/djeada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@aea4d71426aa6789312839dd4b8cadf0931b8ab5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file blender_mcp_server-0.1.0-py3-none-any.whl.
File metadata
- Download URL: blender_mcp_server-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
813b42a79a3436e4435d6dff51172f847f2e684e14918de35d8701b7a4211ecb
|
|
| MD5 |
7fcf1b1d719d37623ea58bbabf260e28
|
|
| BLAKE2b-256 |
a29e861c937efe05da6921051900e8f0367b748cd7448f8f206fe776c58ea878
|
Provenance
The following attestation bundles were made for blender_mcp_server-0.1.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on djeada/blender-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blender_mcp_server-0.1.0-py3-none-any.whl -
Subject digest:
813b42a79a3436e4435d6dff51172f847f2e684e14918de35d8701b7a4211ecb - Sigstore transparency entry: 1004406140
- Sigstore integration time:
-
Permalink:
djeada/blender-mcp-server@aea4d71426aa6789312839dd4b8cadf0931b8ab5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/djeada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@aea4d71426aa6789312839dd4b8cadf0931b8ab5 -
Trigger Event:
push
-
Statement type: