Blender-MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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_pingA | Check whether Blender is running and the bridge addon is reachable. Use this as the first step before any other tool to confirm the integration is live. Returns:
JSON with Example: blender_ping() → {"status": "success", "result": {"reachable": true}} |
| blender_get_scene_infoA | Get an overview of the current Blender scene. Returns scene name, frame range, render engine, and total object count. Args: params: GetSceneInfoInput with response_format ('markdown' or 'json'). Returns: Markdown summary or JSON object describing the scene. Example: blender_get_scene_info(response_format="json") |
| blender_list_objectsA | List objects in the current Blender scene, optionally filtered by type. Args:
params: ListObjectsInput with optional Returns: Markdown table or JSON list of objects with name, type, and location. Example: blender_list_objects(object_type="MESH", response_format="json") |
| blender_get_object_infoA | Get detailed information about a specific object by name. Returns transform, dimensions, material slots, and type-specific data (mesh stats for MESH, light settings for LIGHT, focal length for CAMERA). Args:
params: GetObjectInfoInput with the object Returns: Markdown summary or JSON with full object properties. Example: blender_get_object_info(name="Cube") |
| blender_save_fileA | Save the current Blender scene to a .blend file. Args:
params: SaveFileInput with optional Returns: JSON with the path the file was saved to. Example: blender_save_file(filepath="/tmp/my_scene.blend") blender_save_file() # saves to current file path |
| blender_open_fileA | Open a .blend file in Blender, replacing the current scene. WARNING: Unsaved changes to the current scene will be lost. Args:
params: OpenFileInput with Returns: JSON confirming the file that was opened. Example: blender_open_file(filepath="/home/user/projects/scene.blend") |
| blender_get_viewport_screenshotA | Capture a screenshot of the current Blender 3D viewport. Renders using OpenGL and returns the image inline. Great for inspecting the current state of the scene visually. Args:
params: ViewportScreenshotInput with Returns: An inline PNG image of the viewport, or an error string if capture fails. Example: blender_get_viewport_screenshot(max_size=1024) |
| blender_create_primitiveA | Create a primitive mesh (cube, sphere, cylinder, etc.) in the scene. Args: params: CreatePrimitiveInput with primitive_type, optional name, location (x, y, z), and size. Returns: JSON describing the newly created object. Example: blender_create_primitive(primitive_type="cube", name="MyCube", location=(0,0,1)) |
| blender_transform_objectA | Set location, rotation, and/or scale of an existing object. Any field left as Args:
params: TransformObjectInput with the target object name and any
combination of Returns: JSON with the updated transform values. Example: blender_transform_object(name="Cube", location=(1,0,0), scale=(2,2,2)) |
| blender_delete_objectA | Delete an object from the scene by name. DESTRUCTIVE: permanently removes the object. Idempotent: deleting a missing object returns success with a note. Args:
params: DeleteObjectInput with the exact Returns: JSON confirming the deletion. Example: blender_delete_object(name="Cube") |
| blender_set_materialA | Apply a PBR material to an object using Principled BSDF. Creates or updates a material with the given base color, metallic, roughness, and optional emission. Assigns it to the first material slot of the object. Args: params: SetMaterialInput with object_name, color (RGBA), metallic, roughness, optional material_name, and optional emission. Returns: JSON with the material name and applied properties. Example: blender_set_material(object_name="Cube", color=(0.2, 0.4, 0.8, 1.0), metallic=0.9) |
| blender_add_lightA | Add a light source to the scene. Supports POINT (omnidirectional), SUN (directional), SPOT (cone), and AREA (panel) lights. Args: params: AddLightInput with light_type, optional name, location, energy, color, and type-specific settings (spot_size, size, etc.). Returns: JSON with the light object name and properties. Example: blender_add_light(light_type="POINT", location=(0, 0, 4), energy=2000) |
| blender_set_cameraA | Configure a camera's position, aim target, and focal length. Uses the active scene camera if no name is given. Creates a new camera if the scene has none. Optionally points the camera at a 3D target point. Args: params: SetCameraInput with optional name, location, target (point to aim at), lens (focal length in mm), and set_active flag. Returns: JSON with the camera name, location, rotation, and lens. Example: blender_set_camera(location=(5, -5, 3), target=(0, 0, 0), lens=50) |
| blender_render_imageA | Render a frame using Blender's render engine and return the result inline. Blocks until the render is complete. For fast previews use EEVEE; for photorealistic output use CYCLES (much slower — increase timeout_seconds). Returns both a JSON metadata block and an inline image preview. If output_path is given the full-resolution render is also saved to disk. Args: params: RenderImageInput with optional frame, output_path, engine override, Cycles sample override, preview size, and timeout. Returns: List of [metadata JSON string, inline PNG preview Image]. Example: blender_render_image(engine="BLENDER_EEVEE", frame=1, max_preview_size=512) blender_render_image(engine="CYCLES", samples=64, timeout_seconds=600) |
| blender_execute_pythonA | Execute arbitrary Python code inside Blender (escape hatch for advanced ops). The code runs with DESTRUCTIVE: arbitrary code can modify or delete anything in the scene. Args:
params: ExecutePythonInput with the Returns:
JSON with the value of Example: code = "result = [obj.name for obj in bpy.data.objects if obj.type == 'MESH']" |
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 15 tools
Each tool has a clearly distinct purpose: scene overview, object listing, detailed object info, file operations, viewport capture, primitive creation, transformation, deletion, material application, light addition, camera setup, and rendering. The Python escape hatch is explicitly marked as a fallback, avoiding confusion.
All tools follow a strict blender_verb_noun pattern (e.g., get_scene_info, create_primitive, set_material). This consistent convention makes the tool set predictable and easy to navigate.
With 15 tools, the set is well-scoped for a Blender automation workflow. Each tool covers a necessary operation from scene inspection to rendering, and the count remains within the ideal 3-15 range without bloat.
The tool set covers the full CRUD lifecycle for objects, plus materials, lights, camera, and rendering. Advanced Blender features like modifiers, animation, and mesh editing are not directly exposed, but the blender_execute_python escape hatch covers these gaps, so agents won't hit dead ends.