Skip to main content
Glama
README.md
# 3D MCP Server

MCP server for AI-driven 3D model generation using [OpenSCAD](https://openscad.org). Create, combine, transform, and export 3D models through natural language via any MCP-compatible AI client.

## Installation

```bash
npm install -g @jagjerez-org/3d-mcp-server
```

### Prerequisites

Install OpenSCAD for export and preview rendering:

```bash
# Ubuntu/Debian
sudo apt install openscad

# macOS
brew install openscad

# Windows — download from https://openscad.org/downloads.html
```

> **Note:** OpenSCAD is only required for `export` and `preview` tools. Scene building and SCAD code generation work without it.

## Quick Start

### With Claude Desktop

Add to your Claude Desktop config (`~/.config/claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "3d": {
      "command": "3d-mcp-server"
    }
  }
}
```

Then ask Claude: *"Create a box with a cylindrical hole through the center and export it as STL"*

### With Cursor

Add to `.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "3d": {
      "command": "3d-mcp-server"
    }
  }
}
```

## Tools

### Primitives

| Tool | Description |
|------|-------------|
| `create_primitive` | Create cube, sphere, cylinder, cone, or torus |
| `create_text` | Create 3D extruded text |
| `create_polyhedron` | Create custom mesh from vertices and faces |
| `custom_scad` | Add raw OpenSCAD code directly |

### Transformations

| Tool | Description |
|------|-------------|
| `transform` | Translate, rotate, scale, mirror, or color an object |

### Boolean Operations

| Tool | Description |
|------|-------------|
| `boolean_op` | Union, difference, or intersection of multiple objects |

### Extrusions

| Tool | Description |
|------|-------------|
| `linear_extrude` | Extrude 2D shape (circle, square, polygon) into 3D |
| `rotate_extrude` | Create solid of revolution from 2D profile |

### Scene Management

| Tool | Description |
|------|-------------|
| `status` | Check OpenSCAD installation and scene info |
| `scene_list` | List all objects in the scene |
| `scene_clear` | Clear the entire scene |
| `remove_object` | Remove a specific object |

### Output

| Tool | Description |
|------|-------------|
| `get_scad` | Get the full OpenSCAD source code |
| `save_scad` | Save scene as .scad file |
| `export` | Export to STL, OBJ, 3MF, AMF, OFF, DXF, SVG, CSG |
| `preview` | Render a PNG preview image |

## Examples

### Box with hole

```
AI: "Create a 30x30x10 box with a 5mm radius hole through the center"

→ create_primitive(shape: "cube", width: 30, depth: 30, height: 10)
→ create_primitive(shape: "cylinder", radius: 5, height: 12)
→ boolean_op(operation: "difference", objectIds: ["abc", "def"])
→ export(format: "stl")
```

### Phone stand

```
AI: "Make a phone stand at 60 degrees"

→ create_primitive(shape: "cube", width: 80, depth: 50, height: 5, name: "base")
→ create_primitive(shape: "cube", width: 80, depth: 5, height: 100, name: "back")
→ transform(objectId: "...", operation: "rotate", x: -60)
→ boolean_op(operation: "union", objectIds: [...])
→ preview()
→ export(format: "stl")
```

### Gear

```
AI: "Create a simple gear with 12 teeth"

→ custom_scad(code: "...", name: "gear")
→ preview()
```

## Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `OPENSCAD_BIN` | `openscad` | Path to OpenSCAD binary |
| `SCAD_WORK_DIR` | `/tmp/3d-mcp-work` | Working directory for files |

## How It Works

1. **Scene graph** — Objects are tracked in memory with unique IDs
2. **OpenSCAD codegen** — Each operation generates clean OpenSCAD code
3. **Boolean CSG** — Objects combine via union/difference/intersection
4. **Export** — OpenSCAD CLI renders the final SCAD to STL/PNG/etc.

The AI builds models step by step: create shapes → transform → combine → export.

## License

MIT