@hybridlabor-api/bdb-hardware-pcb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# OpenSCAD MCP Server
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server that enables users to generate 3D models from text descriptions or images, with a focus on creating parametric 3D models using multi-view reconstruction and OpenSCAD.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **AI Image Generation**: Generate images from text descriptions using Google Gemini or Venice.ai APIs
|
|
8
|
+
- **Multi-View Image Generation**: Create multiple views of the same 3D object for reconstruction
|
|
9
|
+
- **Image Approval Workflow**: Review and approve/deny generated images before reconstruction
|
|
10
|
+
- **3D Reconstruction**: Convert approved multi-view images into 3D models using CUDA Multi-View Stereo
|
|
11
|
+
- **Remote Processing**: Process computationally intensive tasks on remote servers within your LAN
|
|
12
|
+
- **OpenSCAD Integration**: Generate parametric 3D models using OpenSCAD
|
|
13
|
+
- **Parametric Export**: Export models in formats that preserve parametric properties (CSG, AMF, 3MF, SCAD)
|
|
14
|
+
- **3D Printer Discovery**: Optional network printer discovery and direct printing
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
The server is built using the Python MCP SDK and follows a modular architecture:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
openscad-mcp-server/
|
|
22
|
+
├── src/
|
|
23
|
+
│ ├── main.py # Main application
|
|
24
|
+
│ ├── main_remote.py # Remote CUDA MVS server
|
|
25
|
+
│ ├── ai/ # AI integrations
|
|
26
|
+
│ │ ├── gemini_api.py # Google Gemini API for image generation
|
|
27
|
+
│ │ └── venice_api.py # Venice.ai API for image generation (optional)
|
|
28
|
+
│ ├── models/ # 3D model generation
|
|
29
|
+
│ │ ├── cuda_mvs.py # CUDA Multi-View Stereo integration
|
|
30
|
+
│ │ └── code_generator.py # OpenSCAD code generation
|
|
31
|
+
│ ├── workflow/ # Workflow components
|
|
32
|
+
│ │ ├── image_approval.py # Image approval mechanism
|
|
33
|
+
│ │ └── multi_view_to_model_pipeline.py # Complete pipeline
|
|
34
|
+
│ ├── remote/ # Remote processing
|
|
35
|
+
│ │ ├── cuda_mvs_client.py # Client for remote CUDA MVS processing
|
|
36
|
+
│ │ ├── cuda_mvs_server.py # Server for remote CUDA MVS processing
|
|
37
|
+
│ │ ├── connection_manager.py # Remote connection management
|
|
38
|
+
│ │ └── error_handling.py # Error handling for remote processing
|
|
39
|
+
│ ├── openscad_wrapper/ # OpenSCAD CLI wrapper
|
|
40
|
+
│ ├── visualization/ # Preview generation and web interface
|
|
41
|
+
│ ├── utils/ # Utility functions
|
|
42
|
+
│ └── printer_discovery/ # 3D printer discovery
|
|
43
|
+
├── scad/ # Generated OpenSCAD files
|
|
44
|
+
├── output/ # Output files (models, previews)
|
|
45
|
+
│ ├── images/ # Generated images
|
|
46
|
+
│ ├── multi_view/ # Multi-view images
|
|
47
|
+
│ ├── approved_images/ # Approved images for reconstruction
|
|
48
|
+
│ └── models/ # Generated 3D models
|
|
49
|
+
├── templates/ # Web interface templates
|
|
50
|
+
└── static/ # Static files for web interface
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
1. Clone the repository:
|
|
56
|
+
```
|
|
57
|
+
git clone https://github.com/jhacksman/OpenSCAD-MCP-Server.git
|
|
58
|
+
cd OpenSCAD-MCP-Server
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
2. Create a virtual environment:
|
|
62
|
+
```
|
|
63
|
+
python -m venv venv
|
|
64
|
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
3. Install dependencies:
|
|
68
|
+
```
|
|
69
|
+
pip install -r requirements.txt
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
4. Install OpenSCAD:
|
|
73
|
+
- Ubuntu/Debian: `sudo apt-get install openscad`
|
|
74
|
+
- macOS: `brew install openscad`
|
|
75
|
+
- Windows: Download from [openscad.org](https://openscad.org/downloads.html)
|
|
76
|
+
|
|
77
|
+
5. Install CUDA Multi-View Stereo:
|
|
78
|
+
```
|
|
79
|
+
git clone https://github.com/fixstars/cuda-multi-view-stereo.git
|
|
80
|
+
cd cuda-multi-view-stereo
|
|
81
|
+
mkdir build && cd build
|
|
82
|
+
cmake ..
|
|
83
|
+
make
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
6. Set up API keys:
|
|
87
|
+
- Create a `.env` file in the root directory
|
|
88
|
+
- Add your API keys:
|
|
89
|
+
```
|
|
90
|
+
GEMINI_API_KEY=your-gemini-api-key
|
|
91
|
+
VENICE_API_KEY=your-venice-api-key # Optional
|
|
92
|
+
REMOTE_CUDA_MVS_API_KEY=your-remote-api-key # For remote processing
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Remote Processing Setup
|
|
96
|
+
|
|
97
|
+
The server supports remote processing of computationally intensive tasks, particularly CUDA Multi-View Stereo reconstruction. This allows you to offload processing to more powerful machines within your LAN.
|
|
98
|
+
|
|
99
|
+
### Server Setup (on the machine with CUDA GPU)
|
|
100
|
+
|
|
101
|
+
1. Install CUDA Multi-View Stereo on the server machine:
|
|
102
|
+
```
|
|
103
|
+
git clone https://github.com/fixstars/cuda-multi-view-stereo.git
|
|
104
|
+
cd cuda-multi-view-stereo
|
|
105
|
+
mkdir build && cd build
|
|
106
|
+
cmake ..
|
|
107
|
+
make
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
2. Start the remote CUDA MVS server:
|
|
111
|
+
```
|
|
112
|
+
python src/main_remote.py
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
3. The server will automatically advertise itself on the local network using Zeroconf.
|
|
116
|
+
|
|
117
|
+
### Client Configuration
|
|
118
|
+
|
|
119
|
+
1. Configure remote processing in your `.env` file:
|
|
120
|
+
```
|
|
121
|
+
REMOTE_CUDA_MVS_ENABLED=True
|
|
122
|
+
REMOTE_CUDA_MVS_USE_LAN_DISCOVERY=True
|
|
123
|
+
REMOTE_CUDA_MVS_API_KEY=your-shared-secret-key
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
2. Alternatively, you can specify a server URL directly:
|
|
127
|
+
```
|
|
128
|
+
REMOTE_CUDA_MVS_ENABLED=True
|
|
129
|
+
REMOTE_CUDA_MVS_USE_LAN_DISCOVERY=False
|
|
130
|
+
REMOTE_CUDA_MVS_SERVER_URL=http://server-ip:8765
|
|
131
|
+
REMOTE_CUDA_MVS_API_KEY=your-shared-secret-key
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Remote Processing Features
|
|
135
|
+
|
|
136
|
+
- **Automatic Server Discovery**: Find CUDA MVS servers on your local network
|
|
137
|
+
- **Job Management**: Upload images, track job status, and download results
|
|
138
|
+
- **Fault Tolerance**: Automatic retries, circuit breaker pattern, and error tracking
|
|
139
|
+
- **Authentication**: Secure API key authentication for all remote operations
|
|
140
|
+
- **Health Monitoring**: Continuous server health checks and status reporting
|
|
141
|
+
|
|
142
|
+
## Usage
|
|
143
|
+
|
|
144
|
+
1. Start the server:
|
|
145
|
+
```
|
|
146
|
+
python src/main.py
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
2. The server will start on http://localhost:8000
|
|
150
|
+
|
|
151
|
+
3. Use the MCP tools to interact with the server:
|
|
152
|
+
|
|
153
|
+
- **generate_image_gemini**: Generate an image using Google Gemini API
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"prompt": "A low-poly rabbit with black background",
|
|
157
|
+
"model": "gemini-2.0-flash-exp-image-generation"
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- **generate_multi_view_images**: Generate multiple views of the same 3D object
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"prompt": "A low-poly rabbit",
|
|
165
|
+
"num_views": 4
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
- **create_3d_model_from_images**: Create a 3D model from approved multi-view images
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"image_ids": ["view_1", "view_2", "view_3", "view_4"],
|
|
173
|
+
"output_name": "rabbit_model"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
- **create_3d_model_from_text**: Complete pipeline from text to 3D model
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"prompt": "A low-poly rabbit",
|
|
181
|
+
"num_views": 4
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
- **export_model**: Export a model to a specific format
|
|
186
|
+
```json
|
|
187
|
+
{
|
|
188
|
+
"model_id": "your-model-id",
|
|
189
|
+
"format": "obj" // or "stl", "ply", "scad", etc.
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- **discover_remote_cuda_mvs_servers**: Find CUDA MVS servers on your network
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"timeout": 5
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
- **get_remote_job_status**: Check the status of a remote processing job
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"server_id": "server-id",
|
|
204
|
+
"job_id": "job-id"
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
- **download_remote_model_result**: Download a completed model from a remote server
|
|
209
|
+
```json
|
|
210
|
+
{
|
|
211
|
+
"server_id": "server-id",
|
|
212
|
+
"job_id": "job-id",
|
|
213
|
+
"output_name": "model-name"
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
- **discover_printers**: Discover 3D printers on the network
|
|
218
|
+
```json
|
|
219
|
+
{}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
- **print_model**: Print a model on a connected printer
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"model_id": "your-model-id",
|
|
226
|
+
"printer_id": "your-printer-id"
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Image Generation Options
|
|
231
|
+
|
|
232
|
+
The server supports multiple image generation options:
|
|
233
|
+
|
|
234
|
+
1. **Google Gemini API** (Default): Uses the Gemini 2.0 Flash Experimental model for high-quality image generation
|
|
235
|
+
- Supports multi-view generation with consistent style
|
|
236
|
+
- Requires a Google Gemini API key
|
|
237
|
+
|
|
238
|
+
2. **Venice.ai API** (Optional): Alternative image generation service
|
|
239
|
+
- Supports various models including flux-dev and fluently-xl
|
|
240
|
+
- Requires a Venice.ai API key
|
|
241
|
+
|
|
242
|
+
3. **User-Provided Images**: Skip image generation and use your own images
|
|
243
|
+
- Upload images directly to the server
|
|
244
|
+
- Useful for working with existing photographs or renders
|
|
245
|
+
|
|
246
|
+
## Multi-View Workflow
|
|
247
|
+
|
|
248
|
+
The server implements a multi-view workflow for 3D reconstruction:
|
|
249
|
+
|
|
250
|
+
1. **Image Generation**: Generate multiple views of the same 3D object
|
|
251
|
+
2. **Image Approval**: Review and approve/deny each generated image
|
|
252
|
+
3. **3D Reconstruction**: Convert approved images into a 3D model using CUDA MVS
|
|
253
|
+
- Can be processed locally or on a remote server within your LAN
|
|
254
|
+
4. **Model Refinement**: Optionally refine the model using OpenSCAD
|
|
255
|
+
|
|
256
|
+
## Remote Processing Workflow
|
|
257
|
+
|
|
258
|
+
The remote processing workflow allows you to offload computationally intensive tasks to more powerful machines:
|
|
259
|
+
|
|
260
|
+
1. **Server Discovery**: Automatically discover CUDA MVS servers on your network
|
|
261
|
+
2. **Image Upload**: Upload approved multi-view images to the remote server
|
|
262
|
+
3. **Job Processing**: Process the images on the remote server using CUDA MVS
|
|
263
|
+
4. **Status Tracking**: Monitor the job status and progress
|
|
264
|
+
5. **Result Download**: Download the completed 3D model when processing is finished
|
|
265
|
+
|
|
266
|
+
## Supported Export Formats
|
|
267
|
+
|
|
268
|
+
The server supports exporting models in various formats:
|
|
269
|
+
|
|
270
|
+
- **OBJ**: Wavefront OBJ format (standard 3D model format)
|
|
271
|
+
- **STL**: Standard Triangle Language (for 3D printing)
|
|
272
|
+
- **PLY**: Polygon File Format (for point clouds and meshes)
|
|
273
|
+
- **SCAD**: OpenSCAD source code (for parametric models)
|
|
274
|
+
- **CSG**: OpenSCAD CSG format (preserves all parametric properties)
|
|
275
|
+
- **AMF**: Additive Manufacturing File Format (preserves some metadata)
|
|
276
|
+
- **3MF**: 3D Manufacturing Format (modern replacement for STL with metadata)
|
|
277
|
+
|
|
278
|
+
## Web Interface
|
|
279
|
+
|
|
280
|
+
The server provides a web interface for:
|
|
281
|
+
|
|
282
|
+
- Generating and approving multi-view images
|
|
283
|
+
- Previewing 3D models from different angles
|
|
284
|
+
- Downloading models in various formats
|
|
285
|
+
|
|
286
|
+
Access the interface at http://localhost:8000/ui/
|
|
287
|
+
|
|
288
|
+
## License
|
|
289
|
+
|
|
290
|
+
MIT
|
|
291
|
+
|
|
292
|
+
## Contributing
|
|
293
|
+
|
|
294
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Implementation Plan: OpenSCAD-MCP-Server with AI-Driven 3D Modeling
|
|
2
|
+
|
|
3
|
+
## 1. Project Structure Updates
|
|
4
|
+
|
|
5
|
+
### 1.1 New Modules
|
|
6
|
+
```
|
|
7
|
+
src/
|
|
8
|
+
├── ai/
|
|
9
|
+
│ ├── venice_api.py # Venice.ai API client
|
|
10
|
+
│ └── sam_segmentation.py # SAM2 integration
|
|
11
|
+
├── models/
|
|
12
|
+
│ └── threestudio_generator.py # threestudio integration
|
|
13
|
+
└── workflow/
|
|
14
|
+
└── image_to_model_pipeline.py # Workflow orchestration
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 1.2 Dependencies
|
|
18
|
+
Add to requirements.txt:
|
|
19
|
+
```
|
|
20
|
+
# Image Generation - Venice.ai API
|
|
21
|
+
# (using existing requests and python-dotenv)
|
|
22
|
+
|
|
23
|
+
# Object Segmentation - SAM2
|
|
24
|
+
torch>=2.0.0
|
|
25
|
+
torchvision>=0.15.0
|
|
26
|
+
opencv-python>=4.7.0
|
|
27
|
+
segment-anything>=1.0
|
|
28
|
+
|
|
29
|
+
# 3D Model Creation - threestudio
|
|
30
|
+
ninja>=1.11.0
|
|
31
|
+
pytorch3d>=0.7.4
|
|
32
|
+
trimesh>=3.21.0
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 2. Component Implementation
|
|
36
|
+
|
|
37
|
+
### 2.1 Venice.ai API Integration
|
|
38
|
+
- Create `VeniceImageGenerator` class in `venice_api.py`
|
|
39
|
+
- Implement authentication with API key
|
|
40
|
+
- Add image generation with Flux model
|
|
41
|
+
- Support image downloading and storage
|
|
42
|
+
|
|
43
|
+
### 2.2 SAM2 Integration
|
|
44
|
+
- Create `SAMSegmenter` class in `sam_segmentation.py`
|
|
45
|
+
- Implement model loading with PyTorch
|
|
46
|
+
- Add object segmentation from images
|
|
47
|
+
- Support mask generation and visualization
|
|
48
|
+
|
|
49
|
+
### 2.3 threestudio Integration
|
|
50
|
+
- Create `ThreeStudioGenerator` class in `threestudio_generator.py`
|
|
51
|
+
- Implement 3D model generation from masked images
|
|
52
|
+
- Support model export in formats compatible with OpenSCAD
|
|
53
|
+
- Add preview image generation
|
|
54
|
+
|
|
55
|
+
### 2.4 OpenSCAD Integration
|
|
56
|
+
- Extend `OpenSCADWrapper` with methods to:
|
|
57
|
+
- Import 3D models from threestudio
|
|
58
|
+
- Generate parametric modifications
|
|
59
|
+
- Create multi-angle previews
|
|
60
|
+
- Export in various formats
|
|
61
|
+
|
|
62
|
+
### 2.5 Workflow Orchestration
|
|
63
|
+
- Create `ImageToModelPipeline` class to coordinate the workflow:
|
|
64
|
+
1. Generate image with Venice.ai API
|
|
65
|
+
2. Segment object with SAM2
|
|
66
|
+
3. Create 3D model with threestudio
|
|
67
|
+
4. Import into OpenSCAD for parametric editing
|
|
68
|
+
|
|
69
|
+
## 3. MCP Tool Integration
|
|
70
|
+
|
|
71
|
+
Add new MCP tools to main.py:
|
|
72
|
+
- `generate_image_from_text`: Generate images using Venice.ai
|
|
73
|
+
- `segment_object_from_image`: Segment objects using SAM2
|
|
74
|
+
- `generate_3d_model_from_image`: Create 3D models using threestudio
|
|
75
|
+
- `generate_model_from_text`: End-to-end pipeline from text to 3D model
|
|
76
|
+
|
|
77
|
+
## 4. Hardware Requirements
|
|
78
|
+
|
|
79
|
+
- SAM2: NVIDIA GPU with 6GB+ VRAM
|
|
80
|
+
- threestudio: NVIDIA GPU with 6GB+ VRAM
|
|
81
|
+
- Consider implementing fallback options for environments with limited GPU resources
|
|
82
|
+
|
|
83
|
+
## 5. Implementation Phases
|
|
84
|
+
|
|
85
|
+
### Phase 1: Basic Integration
|
|
86
|
+
- Implement Venice.ai API client
|
|
87
|
+
- Set up SAM2 with basic segmentation
|
|
88
|
+
- Create threestudio wrapper with minimal functionality
|
|
89
|
+
- Extend OpenSCAD wrapper for model import
|
|
90
|
+
|
|
91
|
+
### Phase 2: Workflow Orchestration
|
|
92
|
+
- Implement the full pipeline
|
|
93
|
+
- Add MCP tools for each component
|
|
94
|
+
- Create end-to-end workflow tool
|
|
95
|
+
|
|
96
|
+
### Phase 3: Optimization and Refinement
|
|
97
|
+
- Optimize for performance
|
|
98
|
+
- Add error handling and recovery
|
|
99
|
+
- Implement corrective cycle for mesh modification
|
|
100
|
+
- Add user interface improvements
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import logging
|
|
4
|
+
import requests
|
|
5
|
+
import argparse
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from tqdm import tqdm
|
|
8
|
+
|
|
9
|
+
# Configure logging
|
|
10
|
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
# SAM2 checkpoint URLs
|
|
14
|
+
CHECKPOINT_URLS = {
|
|
15
|
+
"vit_h": "https://dl.fbaipublicfiles.com/segment_anything_2/sam2_vit_h.pth",
|
|
16
|
+
"vit_l": "https://dl.fbaipublicfiles.com/segment_anything_2/sam2_vit_l.pth",
|
|
17
|
+
"vit_b": "https://dl.fbaipublicfiles.com/segment_anything_2/sam2_vit_b.pth"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Checkpoint sizes (approximate, in MB)
|
|
21
|
+
CHECKPOINT_SIZES = {
|
|
22
|
+
"vit_h": 2560, # 2.5 GB
|
|
23
|
+
"vit_l": 1250, # 1.2 GB
|
|
24
|
+
"vit_b": 380 # 380 MB
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
def download_checkpoint(model_type="vit_b", output_dir="models"):
|
|
28
|
+
"""
|
|
29
|
+
Download SAM2 checkpoint.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
model_type: Model type to download (vit_h, vit_l, vit_b)
|
|
33
|
+
output_dir: Directory to save the checkpoint
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
Path to the downloaded checkpoint
|
|
37
|
+
"""
|
|
38
|
+
if model_type not in CHECKPOINT_URLS:
|
|
39
|
+
raise ValueError(f"Invalid model type: {model_type}. Available types: {list(CHECKPOINT_URLS.keys())}")
|
|
40
|
+
|
|
41
|
+
url = CHECKPOINT_URLS[model_type]
|
|
42
|
+
output_path = os.path.join(output_dir, f"sam2_{model_type}.pth")
|
|
43
|
+
|
|
44
|
+
# Create output directory if it doesn't exist
|
|
45
|
+
os.makedirs(output_dir, exist_ok=True)
|
|
46
|
+
|
|
47
|
+
# Check if checkpoint already exists
|
|
48
|
+
if os.path.exists(output_path):
|
|
49
|
+
logger.info(f"Checkpoint already exists at {output_path}")
|
|
50
|
+
return output_path
|
|
51
|
+
|
|
52
|
+
# Download checkpoint
|
|
53
|
+
logger.info(f"Downloading SAM2 checkpoint ({model_type}) from {url}")
|
|
54
|
+
logger.info(f"Approximate size: {CHECKPOINT_SIZES[model_type]} MB")
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
# Stream download with progress bar
|
|
58
|
+
response = requests.get(url, stream=True)
|
|
59
|
+
response.raise_for_status()
|
|
60
|
+
|
|
61
|
+
# Get total file size
|
|
62
|
+
total_size = int(response.headers.get('content-length', 0))
|
|
63
|
+
|
|
64
|
+
# Create progress bar
|
|
65
|
+
with open(output_path, 'wb') as f, tqdm(
|
|
66
|
+
desc=f"Downloading {model_type}",
|
|
67
|
+
total=total_size,
|
|
68
|
+
unit='B',
|
|
69
|
+
unit_scale=True,
|
|
70
|
+
unit_divisor=1024,
|
|
71
|
+
) as pbar:
|
|
72
|
+
for chunk in response.iter_content(chunk_size=8192):
|
|
73
|
+
if chunk:
|
|
74
|
+
f.write(chunk)
|
|
75
|
+
pbar.update(len(chunk))
|
|
76
|
+
|
|
77
|
+
logger.info(f"Checkpoint downloaded to {output_path}")
|
|
78
|
+
return output_path
|
|
79
|
+
|
|
80
|
+
except requests.exceptions.RequestException as e:
|
|
81
|
+
logger.error(f"Error downloading checkpoint: {str(e)}")
|
|
82
|
+
# Remove partial download if it exists
|
|
83
|
+
if os.path.exists(output_path):
|
|
84
|
+
os.remove(output_path)
|
|
85
|
+
raise
|
|
86
|
+
except KeyboardInterrupt:
|
|
87
|
+
logger.info("Download interrupted by user")
|
|
88
|
+
# Remove partial download if it exists
|
|
89
|
+
if os.path.exists(output_path):
|
|
90
|
+
os.remove(output_path)
|
|
91
|
+
sys.exit(1)
|
|
92
|
+
|
|
93
|
+
def main():
|
|
94
|
+
"""Main function to parse arguments and download checkpoint."""
|
|
95
|
+
parser = argparse.ArgumentParser(description="Download SAM2 checkpoint")
|
|
96
|
+
parser.add_argument("--model_type", type=str, default="vit_b", choices=list(CHECKPOINT_URLS.keys()),
|
|
97
|
+
help="Model type to download (vit_h, vit_l, vit_b). Default: vit_b (smallest)")
|
|
98
|
+
parser.add_argument("--output_dir", type=str, default="models",
|
|
99
|
+
help="Directory to save the checkpoint")
|
|
100
|
+
|
|
101
|
+
args = parser.parse_args()
|
|
102
|
+
|
|
103
|
+
# Print model information
|
|
104
|
+
logger.info(f"Selected model: {args.model_type}")
|
|
105
|
+
logger.info(f"Approximate sizes: vit_h: 2.5 GB, vit_l: 1.2 GB, vit_b: 380 MB")
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
checkpoint_path = download_checkpoint(args.model_type, args.output_dir)
|
|
109
|
+
logger.info(f"Checkpoint ready at: {checkpoint_path}")
|
|
110
|
+
except Exception as e:
|
|
111
|
+
logger.error(f"Failed to download checkpoint: {str(e)}")
|
|
112
|
+
sys.exit(1)
|
|
113
|
+
|
|
114
|
+
if __name__ == "__main__":
|
|
115
|
+
main()
|