Skip to main content
Glama
README.md
## View the Demo Here!

https://drive.google.com/file/d/1VHnKps0HPqw4ipIw1GG_X68u8iuSRbCK/view


## Prerequisites

Before you begin, make sure you have:

- **Python 3.13+** installed
- **Blender 5.0+** installed at `/Applications/Blender.app/Contents/MacOS/Blender` (macOS)
  - For Linux/Windows: Update the `blender_path` in `blender_mcp_filter.py`
- **Claude Desktop** installed (for AI agent integration)

## How to Install Dependencies

```bash
cd /path/to/blender_takehome
pip install -e .
```

This installs:
- `fastmcp>=2.12.4` - MCP server framework
- `pydantic>=2.0.0` - Input validation
- `fake-bpy-module-latest` - Type stubs for development

## How to Run the Server

This is the easiest way to use the server with Claude Desktop:

1. **Copy the configuration file**:
   ```bash
   cp claude_desktop_config.json ~/Library/Application\ Support/Claude/claude_desktop_config.json
   ```

2. **Edit the configuration file** and update the paths to match your project location:
   ```json
   {
     "mcpServers": {
       "blender-server": {
         "command": "python3",
         "args": [
           "/YOUR/PATH/TO/blender_takehome/blender_mcp_filter.py"
         ],
         "env": {
           "PYTHONPATH": "/YOUR/PATH/TO/blender_takehome:/YOUR/PATH/TO/blender_takehome/src"
         }
       }
     }
   }
   ```

3. **Now Open Blender** -- the Blender MCP server will automatically be running now.

4. **Restart Claude Desktop** - it will automatically launch the Blender MCP server when you start a conversation.

5. **Start Experimenting**: Ask Claude to create a cube in Blender. You should see Blender open and a cube appear!

## List of Tools Implemented

The server provides 22 tools organized into the following categories:

### Object Creation (5 tools)
- `create_cube_tool` - Create a cube primitive
- `create_sphere_tool` - Create a UV sphere primitive  
- `create_cylinder_tool` - Create a cylinder primitive
- `create_plane_tool` - Create a plane primitive
- `duplicate_object_tool` - Duplicate an existing object

### Object Manipulation (5 tools)
- `move_object_tool` - Move an object to a new location
- `rotate_object_tool` - Rotate an object
- `scale_object_tool` - Scale an object
- `delete_object_tool` - Delete an object from the scene
- `select_object_tool` - Select an object in the scene

### Scene Management (3 tools)
- `list_objects_tool` - List all objects in the scene
- `get_object_info_tool` - Get detailed information about an object
- `clear_scene_tool` - Remove all objects from the scene

### Camera Operations (1 tool)
- `set_active_camera_tool` - Set the active camera for rendering

### Materials (2 tools)
- `create_material_tool` - Create a new material with a base color
- `assign_material_tool` - Assign a material to an object

### Rendering (3 tools)
- `create_camera_tool` - Create and configure a camera
- `create_light_tool` - Create a light source
- `render_scene_tool` - Render the scene to an image file

### File Operations (3 tools)
- `get_scene_filepath_tool` - Get the current Blender file path
- `save_file_tool` - Save the scene to a file
- `open_file_tool` - Open an existing Blender file

## Usage Examples

Once connected to Claude Desktop, you can ask Claude to:

- "Create a red cube at position (2, 0, 0)"
- "Add a sphere with radius 1.5"
- "Create a material called 'Metal' with color (0.8, 0.8, 0.9)"
- "Render the scene to /path/to/output.png"
- "List all objects in the scene"
- "Save the current file as "_______/Project.blend"

Claude will use the MCP tools to execute these commands in Blender.


## Project Structure

```
blender_takehome/
├── src/
│   ├── models.py      # Pydantic input validation models
│   ├── operations.py   # Pure Blender operations (bpy API)
│   ├── tools.py       # MCP tool wrappers
│   └── server.py      # FastMCP server setup
├── blender_mcp_filter.py    # Launches Blender and filters stdout
├── blender_mcp_server.py   # Entry point script for Blender
├── claude_desktop_config.json  # Claude Desktop configuration
└── pyproject.toml      # Python dependencies
```

## Design Choices

The server follows a three-layer architecture:

1. **Models** (`src/models.py`) - Pydantic models validate all inputs
2. **Operations** (`src/operations.py`) - Pure functions that interact with Blender's bpy API
3. **Tools** (`src/tools.py`) - MCP tool wrappers that expose operations to AI agents

I decided to separate this project into this three-layer architecture in order to isolate where errors were occuring very easily. This helped a lot in the debugging process. This has also simplified the creation of adding new tools within the MCP arsenal.

All that needs to be done to add a new tale is:

1. **Add model** in `src/models.py`:
   ```python
   class MyToolInput(BaseModel):
       param: str = Field(...)
   ```

2. **Add operation** in `src/operations.py`:
   ```python
   def my_operation(input: MyToolInput) -> str:
       # Blender code here
       return "Success: ..."
   ```

3. **Add tool** in `src/tools.py`:
   ```python
   @mcp.tool()
   async def my_tool_tool(param: str) -> str:
       input_model = MyToolInput(param=param)
       return my_operation(input_model)
   ```

That's it! FastMCP automatically registers the tool.

### Tool Call Flow

```
1. Claude Desktop sends JSON-RPC request:
   {"method": "tools/call", "params": {"name": "create_cube_tool", "arguments": {...}}}

2. FastMCP receives request, routes to create_cube_tool()

3. tools.py: create_cube_tool() validates input with CreateCubeInput

4. operations.py: create_cube() executes bpy.ops.mesh.primitive_cube_add()

5. Blender creates cube, updates scene

6. operations.py: Returns success message string

7. tools.py: Returns string to FastMCP

8. FastMCP sends JSON-RPC response:
   {"result": {"content": [{"type": "text", "text": "Successfully created cube..."}]}}

9. Claude Desktop receives response
```

### Error Flow

```
1. Invalid input (e.g., size = -1.0)

2. Pydantic validation fails in models.py

3. ValidationError raised with clear message

4. tools.py catches exception, returns "Error: size must be > 0.001"

5. FastMCP sends error response to Claude Desktop

6. Server continues running (no crash)
```