OpenSCAD MCP Server

OpenSCAD MCP Server

Enables AI assistants to render 3D models from OpenSCAD code, generating single views or multiple perspectives with full camera control. Supports animations, custom parameters, and returns base64-encoded PNG images for seamless integration.

Category
访问服务器

README

OpenSCAD MCP Server

MCP Version FastMCP Test Status License

A production-ready Model Context Protocol (MCP) server that provides OpenSCAD 3D rendering capabilities to AI assistants and LLM applications. Built with FastMCP for robust, scalable performance.

🎯 Zero-Installation Execution

Run directly from GitHub without any setup:

uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp

Perfect for MCP clients, CI/CD pipelines, and instant deployment scenarios!

🚀 Quick Start

Zero-Installation Execution with uv

No installation required! Run directly from GitHub:

# Run via script entry point (recommended)
uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp

# Or run as Python module
uv run --with git+https://github.com/quellant/openscad-mcp.git python -m openscad_mcp

Traditional Installation (Optional)

# Clone and run locally
git clone https://github.com/quellant/openscad-mcp.git
cd openscad-mcp
uv run openscad-mcp

Configure with Claude Desktop

Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

Option 1: Direct from GitHub (Recommended)

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

Option 2: Local Installation

{
  "mcpServers": {
    "openscad": {
      "command": "uv",
      "args": ["run", "openscad-mcp"],
      "cwd": "/path/to/openscad-mcp",
      "env": {
        "OPENSCAD_PATH": "/usr/bin/openscad"
      }
    }
  }
}

🔒 Security: --allowedTools Requirement

IMPORTANT: When using the OpenSCAD MCP server with Claude CLI or other MCP clients, you MUST explicitly grant permissions using the --allowedTools flag for security. This prevents unauthorized tool usage and ensures controlled access to server capabilities.

Required Permissions

The OpenSCAD MCP server requires explicit permission for each tool:

  • openscad-mcp:check_openscad - Permission to check OpenSCAD installation
  • openscad-mcp:render_single - Permission to render single views
  • openscad-mcp:render_perspectives - Permission to render multiple perspectives

Example Usage with Claude CLI

# Start the server with uv and grant permissions
# (Create mcp-config.json with uv configuration first)

# Grant permission for a single tool
claude --config mcp-config.json \
       --allowedTools openscad-mcp:check_openscad \
       "Check if OpenSCAD is installed"

# Grant permission for multiple tools
claude --config mcp-config.json \
       --allowedTools openscad-mcp:check_openscad,openscad-mcp:render_single \
       "Render a cube with dimensions 30x30x30"

# Grant full permissions for all OpenSCAD tools
claude --config mcp-config.json \
       --allowedTools openscad-mcp:check_openscad,openscad-mcp:render_single,openscad-mcp:render_perspectives \
       "Create a gear model and show it from multiple angles"

Create mcp-config.json for Claude CLI:

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

Testing with Permissions

Use the provided test script to verify proper permission configuration:

# Run all permission tests
./test_claude_with_permissions.sh all

# Test individual tools
./test_claude_with_permissions.sh check        # Test check_openscad only
./test_claude_with_permissions.sh single       # Test render_single only
./test_claude_with_permissions.sh perspectives # Test render_perspectives only

# Launch interactive session with full permissions
./test_claude_with_permissions.sh interactive

# Show usage examples
./test_claude_with_permissions.sh examples

✨ Features

  • 🎯 Production-Ready: 100% test success rate with comprehensive integration testing
  • 🔧 Single View Rendering: Render OpenSCAD models from any camera angle with full control
  • 📐 Multiple Perspectives: Generate standard orthographic and isometric views automatically
  • 🎬 Animation Support: Create turntable animations for 360° model visualization
  • ⚡ Async Processing: Non-blocking renders using FastMCP framework for optimal performance
  • 🖼️ Base64 Encoding: Images returned as base64-encoded PNGs for seamless integration
  • ✅ Verified Compatibility: Fully compatible with FastMCP 2.11.3 and Pydantic 2.11.7

📋 Prerequisites

No additional Python packages required when using uv - all dependencies are handled automatically!

📦 Installation

Method 1: Zero-Installation with uv (Recommended)

No installation required! Just run directly:

# Run directly from GitHub - uv handles everything automatically
uv run --with git+https://github.com/quellant/openscad-mcp.git openscad-mcp

# All dependencies (FastMCP 2.11.3, Pydantic 2.11.7, etc.) are resolved and installed automatically

Method 2: Local Development with uv

# Clone for local development
git clone https://github.com/quellant/openscad-mcp.git
cd openscad-mcp

# Run with uv (installs dependencies automatically)
uv run openscad-mcp

# Or run as module
uv run python -m openscad_mcp

Method 3: Traditional pip Installation

# Only if you can't use uv
git clone https://github.com/quellant/openscad-mcp.git
cd openscad-mcp
pip install -e .
python -m openscad_mcp

⚙️ Configuration

Environment Variables

Create a .env file in the project root:

# OpenSCAD Configuration
OPENSCAD_PATH=/usr/bin/openscad  # Path to OpenSCAD executable
OPENSCAD_TIMEOUT=30               # Timeout for rendering operations (seconds)

# Server Configuration
MCP_SERVER_NAME=openscad-mcp
MCP_SERVER_VERSION=1.0.0
MCP_SERVER_TRANSPORT=stdio        # Transport: stdio, sse, or http

# Rendering Configuration
MCP_RENDER_MAX_CONCURRENT=4       # Max concurrent renders
MCP_RENDER_DEFAULT_WIDTH=800      # Default image width
MCP_RENDER_DEFAULT_HEIGHT=600     # Default image height

Configuration File (Optional)

Create config.yaml for advanced configuration:

server:
  name: "OpenSCAD MCP Server"
  version: "1.0.0"
  transport: stdio

openscad:
  timeout: 30
  default_color_scheme: "Cornfield"

rendering:
  max_concurrent: 4
  default_width: 800
  default_height: 600

🛠️ Available MCP Tools

1. render_single

Render a single view of an OpenSCAD model with complete camera control.

Parameters:

Parameter Type Required Description
scad_content string No* OpenSCAD code to render
scad_file string No* Path to .scad file
camera_position [x,y,z] No Camera position (default: [30,30,30])
camera_target [x,y,z] No Look-at point (default: [0,0,0])
camera_up [x,y,z] No Up vector (default: [0,0,1])
image_size [w,h] No Image dimensions in pixels
color_scheme string No OpenSCAD color scheme
variables dict No Variables to pass to OpenSCAD
auto_center bool No Auto-center the model

*Either scad_content or scad_file must be provided

Example Request:

{
  "tool": "render_single",
  "arguments": {
    "scad_content": "cube([10, 10, 10]);",
    "camera_position": [30, 30, 30],
    "image_size": [800, 600],
    "color_scheme": "Cornfield"
  }
}

Example Response:

{
  "success": true,
  "image": "data:image/png;base64,iVBORw0KGgo...",
  "metadata": {
    "width": 800,
    "height": 600,
    "render_time": 1.23
  }
}

2. render_perspectives

Generate multiple standard views of a model (front, back, left, right, top, bottom, isometric).

Parameters:

Parameter Type Required Description
scad_content string No* OpenSCAD code to render
scad_file string No* Path to .scad file
distance float No Camera distance from origin
image_size [w,h] No Image dimensions for each view
variables dict No Variables to pass to OpenSCAD
views list No Specific views to render

Example Request:

{
  "tool": "render_perspectives",
  "arguments": {
    "scad_file": "model.scad",
    "views": ["front", "isometric", "top"],
    "distance": 200,
    "image_size": [400, 400]
  }
}

3. check_openscad

Verify OpenSCAD installation and get version information.

Parameters:

Parameter Type Required Description
include_paths bool No Include searched paths in response

Example Request:

{
  "tool": "check_openscad",
  "arguments": {
    "include_paths": true
  }
}

📚 MCP Resources

resource://server/info

Get server configuration and capabilities.

Returns:

  • Server version and status
  • OpenSCAD version and path
  • Rendering capabilities
  • Active operations count
  • Configuration details

🏗️ Architecture

The server implements a clean architecture pattern:

┌─────────────────────────────────────┐
│         MCP Client (Claude)         │
└─────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────┐
│    FastMCP Server (Presentation)    │
│        - MCP Protocol Handler       │
│        - Tool Decorators            │
└─────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────┐
│     Application Layer (Business)    │
│        - Rendering Logic            │
│        - Parameter Validation       │
└─────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────┐
│   Infrastructure Layer (External)   │
│        - OpenSCAD CLI               │
│        - File I/O Operations        │
└─────────────────────────────────────┘

🧪 Testing

The server has achieved 100% test success rate across all integration tests:

# Run comprehensive test suite
python comprehensive_test.py

# Run MCP tools integration test
python test_mcp_tools.py

# Run server startup test
python test_server_startup.py

See Test Report for detailed results.

🔧 Development

Project Structure

openscad-mcp-server/
├── src/
│   └── openscad_mcp/
│       ├── __init__.py         # Package initialization
│       ├── __main__.py          # Entry point
│       ├── server.py            # FastMCP server implementation
│       ├── types.py             # Pydantic models & types
│       └── utils/
│           └── config.py        # Configuration management
├── tests/                       # Test suite
├── pyproject.toml              # Project configuration
├── README.md                   # This file
├── CHANGELOG.md               # Version history
├── API.md                     # Detailed API documentation
└── .env.example               # Environment template

Extending the Server

To add new rendering capabilities:

  1. Define parameter types in types.py:
class CustomRenderParams(BaseModel):
    # Your parameters here
    pass
  1. Add tool function in server.py:
@mcp.tool
async def custom_render(params: CustomRenderParams) -> RenderResult:
    """Your custom rendering logic"""
    # Implementation
    pass
  1. Update documentation in API.md

🐛 Troubleshooting

OpenSCAD Not Found

# Check OpenSCAD installation
which openscad

# Set environment variable
export OPENSCAD_PATH=/path/to/openscad

# Or add to .env file
OPENSCAD_PATH=/usr/local/bin/openscad

Permission Errors

# Ensure execute permissions
chmod +x /path/to/openscad

Rendering Timeouts

Increase timeout in configuration:

export OPENSCAD_TIMEOUT=60  # 60 seconds

FastMCP Compatibility Issues

Ensure correct versions:

pip install fastmcp==2.11.3 pydantic==2.11.7

📈 Performance

  • Single view rendering: ~1-3 seconds (complexity dependent)
  • Multiple perspectives: ~5-10 seconds for 8 views
  • Base64 encoding: < 0.1s overhead
  • Memory footprint: ~50 MB base + 10-20 MB per render
  • Concurrent renders: Up to 4 (configurable)

🚦 Production Status

Ready for Production

  • All tests passing (100% success rate)
  • FastMCP 2.11.3 compatibility verified
  • Comprehensive error handling
  • Async operation support
  • Resource management implemented
  • Documentation complete

📝 License

MIT License - See LICENSE file for details

🤝 Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📮 Support

🙏 Acknowledgments


Version: 1.0.0 | Status: Production Ready | Last Updated: 2025-08-25

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选