@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.
Files changed (192) hide show
  1. package/README.md +116 -0
  2. package/config/mcp/antigravity.json +22 -0
  3. package/config/mcp/claude.json +22 -0
  4. package/config/mcp/codex.toml +25 -0
  5. package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
  6. package/docs/review_documentation.md +121 -0
  7. package/installer.js +358 -0
  8. package/mcp_servers/kicad-mcp-server/.env.example +22 -0
  9. package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
  10. package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
  11. package/mcp_servers/kicad-mcp-server/README.md +316 -0
  12. package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
  13. package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
  14. package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
  15. package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
  16. package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
  17. package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
  18. package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
  19. package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
  20. package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
  21. package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
  22. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
  23. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
  24. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
  25. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
  26. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
  27. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
  28. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
  29. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
  30. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
  31. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
  32. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
  33. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
  34. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
  35. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
  36. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
  37. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
  38. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
  39. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
  40. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
  41. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
  42. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
  43. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
  44. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
  45. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
  46. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
  47. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
  48. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
  49. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
  50. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
  51. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
  52. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
  53. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
  54. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
  55. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
  56. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
  57. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
  58. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
  59. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
  60. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
  61. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
  62. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
  63. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
  64. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
  65. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
  66. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
  67. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
  68. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
  69. package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
  70. package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
  71. package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
  72. package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
  73. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
  74. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
  75. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
  76. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
  77. package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
  78. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
  79. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
  80. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
  81. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
  82. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
  83. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
  84. package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
  85. package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
  86. package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
  87. package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
  88. package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
  89. package/mcp_servers/openscad-mcp-server/README.md +154 -0
  90. package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
  91. package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
  92. package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
  93. package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
  94. package/mcp_servers/openscad-mcp-server/glama.json +4 -0
  95. package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
  96. package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
  97. package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
  98. package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
  99. package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
  100. package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
  101. package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
  102. package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
  103. package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
  104. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
  105. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
  106. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
  107. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
  108. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
  109. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
  110. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
  111. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
  112. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
  113. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
  114. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
  115. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
  116. package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
  117. package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
  118. package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
  119. package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
  120. package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
  121. package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
  122. package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
  123. package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
  124. package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
  125. package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
  126. package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
  127. package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
  128. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
  129. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
  130. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
  131. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
  132. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
  133. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
  134. package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
  135. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
  136. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
  137. package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
  138. package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
  139. package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
  140. package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
  141. package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
  142. package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
  143. package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
  144. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
  145. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
  146. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
  147. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
  148. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
  149. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
  150. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
  151. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
  152. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
  153. package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
  154. package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
  155. package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
  156. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
  157. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
  158. package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
  159. package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
  160. package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
  161. package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
  162. package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
  163. package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
  164. package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
  165. package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
  166. package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
  167. package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
  168. package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
  169. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
  170. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
  171. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
  172. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
  173. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
  174. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
  175. package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
  176. package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
  177. package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
  178. package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
  179. package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
  180. package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
  181. package/package.json +44 -0
  182. package/scripts/install_mcps.sh +86 -0
  183. package/scripts/openscad_wrapper.sh +62 -0
  184. package/scripts/run_kicad_mcp.sh +25 -0
  185. package/scripts/run_openscad_mcp.sh +41 -0
  186. package/scripts/test_mcp_connection.py +626 -0
  187. package/scripts/test_mcp_connection.sh +168 -0
  188. package/skills/code-first-hardware-design/SKILL.md +260 -0
  189. package/skills/pcb-constraint-definition/SKILL.md +236 -0
  190. package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
  191. package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
  192. 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()