Skip to main content
Glama

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

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:

    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:

    {
      "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:

    class MyToolInput(BaseModel):
        param: str = Field(...)
  2. Add operation in src/operations.py:

    def my_operation(input: MyToolInput) -> str:
        # Blender code here
        return "Success: ..."
  3. Add tool in src/tools.py:

    @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)
-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gajanm/afterquery_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server