Skip to main content
Glama
quellant

OpenSCAD MCP Server

by quellant

OpenSCAD MCP Server

MCP FastMCP Tests Coverage License

A Model Context Protocol (MCP) server that gives AI assistants the ability to render, export, and analyze 3D models using OpenSCAD. Built with FastMCP for Python.

Prerequisites

  • OpenSCAD installed on your system

  • uv (recommended) or Python 3.10+

Related MCP server: OpenSCAD MCP Server

Installation

Claude Code

Add the server with a single command:

claude mcp add openscad --transport stdio -- \ uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp

Or, if OpenSCAD is not on your PATH:

claude mcp add openscad --transport stdio \ --env OPENSCAD_PATH=/path/to/openscad -- \ uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp

Use the --scope flag to control where the configuration is saved:

Scope

Flag

Effect

Local (default)

--scope local

Available only to you in the current project

Project

--scope project

Shared with the team via .mcp.json

User

--scope user

Available to you across all projects

Claude Desktop

Add to your configuration file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{ "mcpServers": { "openscad": { "command": "uv", "args": [ "run", "--with", "git+https://github.com/quellant/openscad-mcp.git", "openscad-mcp" ], "env": { "OPENSCAD_PATH": "/usr/bin/openscad" } } } }

Then restart Claude Desktop.

Cursor / Windsurf / VS Code

Add a .mcp.json file to your project root:

{ "mcpServers": { "openscad": { "command": "uv", "args": [ "run", "--with", "git+https://github.com/quellant/openscad-mcp.git", "openscad-mcp" ] } } }

Manual / Standalone

# Run directly from GitHub (no install required) uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp # Or clone and run locally git clone https://github.com/quellant/openscad-mcp.git cd openscad-mcp uv run openscad-mcp

Available Tools

Rendering

Tool

Description

render_single

Render a single view with camera control, quality presets, and view presets

render_perspectives

Render multiple standard views (front, back, left, right, top, bottom, isometric) in parallel

compare_renders

Side-by-side before/after renders for visual comparison

Export & Model Management

Tool

Description

export_model

Export to STL, 3MF, AMF, OFF, DXF, or SVG

create_model

Create a new .scad file in the workspace

get_model

Read a model file and its metadata

update_model

Update an existing model's content

list_models

List all models in the workspace

delete_model

Delete a model file

Analysis & Validation

Tool

Description

validate_scad

Syntax-check code without a full render (errors, warnings, echo output)

analyze_model

Compute bounding box, dimensions, and triangle count via STL export

get_libraries

Discover installed OpenSCAD libraries

check_openscad

Verify OpenSCAD installation and version

Project Support

Tool

Description

get_project_files

List .scad files and their include/use dependency graph

clear_cache

Clear the render cache

Usage Examples

Once connected, ask your AI assistant:

  • "Render a cube with rounded edges"

  • "Show me this model from all angles"

  • "Export my gear model to STL"

  • "Compare the model before and after changing the radius to 15"

  • "Validate this OpenSCAD code for errors"

  • "What are the dimensions of this model?"

Tool Parameters

render_single

Parameter

Type

Default

Description

scad_content

string

OpenSCAD code to render*

scad_file

string

Path to .scad file*

view

string

Preset view: front, back, left, right, top, bottom, isometric, dimetric

camera_position

list/string

[70,70,70]

Camera eye position [x,y,z]

camera_target

list/string

[0,0,0]

Camera look-at point

image_size

list/string

[800,600]

Output dimensions [w,h] or "800x600"

color_scheme

string

Cornfield

OpenSCAD color scheme

variables

dict

{}

OpenSCAD -D variables

quality

string

draft, normal, or high

include_paths

list

Extra -I include directories

output_format

string

auto

auto, base64, file_path, or compressed

*Exactly one of scad_content or scad_file must be provided.

All parameter parsers accept multiple input formats (JSON strings, lists, dicts, CSV) for AI assistant compatibility.

Configuration

Environment Variables

Variable

Description

Default

OPENSCAD_PATH

Path to OpenSCAD executable

Auto-detected

MCP_TEMP_DIR

Temporary file directory

/tmp/openscad-mcp

MCP_TRANSPORT

Transport type: stdio, http, sse

stdio

MCP_HOST

Host for HTTP/SSE transport

localhost

MCP_PORT

Port for HTTP/SSE transport

8000

MCP_MAX_CONCURRENT_RENDERS

Max parallel renders

5

MCP_RENDER_TIMEOUT

Render timeout in seconds

300

MCP_CACHE_ENABLED

Enable render caching

true

MCP_CACHE_SIZE_MB

Max cache size in MB

500

MCP_CACHE_TTL_HOURS

Cache TTL in hours

24

MCP_LOG_LEVEL

Logging level

INFO

MCP_MAX_FILE_SIZE_MB

Max SCAD file size

10

YAML Configuration

Create a config.yaml for advanced configuration:

server: name: "OpenSCAD MCP Server" version: "0.1.0" transport: stdio rendering: max_concurrent: 5 timeout_seconds: 300 default_color_scheme: Cornfield cache: enabled: true max_size_mb: 500 ttl_hours: 24 security: rate_limit: 60 max_file_size_mb: 10 allowed_paths: null # null = no restrictions

Security

  • Path validation: scad_file and include_paths validated against configurable allowed_paths

  • File size limits: Content checked against max_file_size_mb

  • Variable name validation: Only ^[a-zA-Z_][a-zA-Z0-9_]*$ allowed (prevents injection)

  • Subprocess timeout: Configurable, default 300s

  • Model name validation: Alphanumeric, hyphens, and underscores only; no path traversal

Development

# Clone the repo git clone https://github.com/quellant/openscad-mcp.git cd openscad-mcp # Install dependencies uv sync --dev # Run the server uv run openscad-mcp # Run tests uv run pytest # Lint & format uv run ruff check src/ tests/ uv run black --check src/ tests/ # Type check uv run mypy src/

Project Structure

openscad-mcp/ ├── src/openscad_mcp/ │ ├── __init__.py # Package exports │ ├── server.py # FastMCP server, all MCP tools and helpers │ ├── types.py # Pydantic models and enums │ └── utils/ │ └── config.py # Configuration with env/YAML/dotenv support ├── tests/ # 300 tests, 80%+ coverage ├── pyproject.toml └── README.md

Testing

# Run all tests with coverage uv run pytest # Run specific markers uv run pytest -m unit uv run pytest -m performance # Run a single file uv run pytest tests/test_helpers.py -v

Tests mock the OpenSCAD subprocess — no OpenSCAD installation required to run them. Coverage target: 80% minimum.

Troubleshooting

OpenSCAD Not Found

# Check if OpenSCAD is installed which openscad # Linux/macOS where openscad.exe # Windows # Set the path explicitly export OPENSCAD_PATH=/path/to/openscad

Server Not Connecting

# Verify the server starts correctly uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp # In Claude Code, check MCP status /mcp

Render Timeout

Increase the timeout:

export MCP_RENDER_TIMEOUT=600

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/my-feature)

  3. Make your changes with tests

  4. Ensure tests pass (uv run pytest)

  5. Open a Pull Request

Commit style: feat:, fix:, docs:, refactor:, chore:

License

MIT — see LICENSE

Acknowledgments

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - confirmed to work

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/quellant/openscad-mcp'

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