Skip to main content
Glama
archimedes-market

mcp-openscad-render-loop

README.md
[![Archimedes Trust Report — VERIFIED 92/100](https://img.shields.io/badge/Archimedes_Trust-VERIFIED_92%2F100-10B981?style=flat-square)](https://archimedes.market/assets/46d1682f-6ceb-4288-97ae-8a05a4ab9c86)

> Verified asset on [**Archimedes Market**](https://archimedes.market). View the full 4-dimension Trust Report (security · quality · license · complexity) and the curated catalog on the [asset page](https://archimedes.market/assets/46d1682f-6ceb-4288-97ae-8a05a4ab9c86).

---

# MCP OpenSCAD Render Loop

OpenSCAD wrapped as an MCP server so an agent can iterate on parametric CAD designs without bouncing in and out of the GUI. Render `.scad` source with parameter overrides, run parameter sweeps, validate syntax, extract module signatures, and compute STL geometry metrics.

## Tools

- `render_stl` — render a `.scad` file or inline source to STL with `-D` parameter overrides
- `render_png` — preview render to PNG with camera + image-size control
- `parametric_sweep` — Cartesian sweep over one or more parameter ranges, returns a manifest of outputs
- `validate_scad` — syntax check via `openscad --check` (no render)
- `list_modules` — extract top-level `module foo(...)` and `function bar(...)` signatures with defaults
- `compute_metrics` — bounding box, volume, surface area, triangle count from an STL

## Why this server exists

OpenSCAD's CLI is well-designed but verbose. Most agent CAD workflows do the same loop: edit parameters → render → measure → adjust. This server collapses that to one tool call per iteration and returns geometry metrics directly so the agent doesn't have to parse STL bytes itself.

## Quick start

```bash
# 1. Install OpenSCAD (must be on PATH)
brew install openscad      # macOS
apt-get install openscad   # Debian/Ubuntu

# 2. Install the MCP server
pip install mcp-openscad-render-loop

# 3. Set output directory and run
export MCP_OPENSCAD_OUTPUT_DIR="/tmp/scad-renders"
mcp-openscad-render-loop serve
```

Claude Desktop config:

```json
{
  "mcpServers": {
    "openscad": {
      "command": "mcp-openscad-render-loop",
      "args": ["serve"],
      "env": {
        "MCP_OPENSCAD_OUTPUT_DIR": "/tmp/scad-renders",
        "MCP_OPENSCAD_BINARY": "/usr/local/bin/openscad"
      }
    }
  }
}
```

## Typical agent workflow

```
Agent: "Design an enclosure for a 60x40x15mm PCB with 2mm walls and M3 mounting posts."
↓
1. list_modules on enclosure.scad → finds module enclosure(pcb_l, pcb_w, pcb_h, wall, post_dia)
2. render_stl with pcb_l=60, pcb_w=40, pcb_h=15, wall=2, post_dia=3 → enclosure_v1.stl
3. compute_metrics on enclosure_v1.stl → bbox 66x46x21, volume 18.4cm³, 1,240 triangles
4. parametric_sweep on wall ∈ [1.5, 2.0, 2.5] → 3 STLs + metrics → wall=2 is the strength/weight knee
5. render_png at iso camera → preview image attached to agent's reply
```

## Safety

- `MCP_OPENSCAD_OUTPUT_DIR` is the only writable path. Any output path outside this dir is rejected.
- Each render is hard-capped at 60 seconds (configurable). Long sweeps run renders sequentially, not in parallel — keeps memory bounded.
- Inline `.scad` source is written to a temp file inside the output dir; nothing executes outside `openscad`.
- No `import("/some/path.dxf")` traversal — relative paths in `.scad` are resolved against the output dir or the source file's dir, never against `/`.

## License

MIT.