@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,9 @@
1
+ **
2
+ !Dockerfile
3
+ !pyproject.toml
4
+ !uv.lock
5
+ !README.md
6
+ !LICENSE
7
+ !src/
8
+ !src/openscad_mcp/
9
+ !src/openscad_mcp/*.py
@@ -0,0 +1,40 @@
1
+ name: Test
2
+ on:
3
+ push:
4
+ pull_request:
5
+ permissions:
6
+ contents: read
7
+ jobs:
8
+ linux:
9
+ runs-on: ubuntu-24.04
10
+ strategy:
11
+ matrix:
12
+ python: ["3.12", "3.13"]
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: astral-sh/setup-uv@v6
16
+ with:
17
+ python-version: ${{ matrix.python }}
18
+ - name: Install OpenSCAD and headless display
19
+ run: sudo apt-get update && sudo apt-get install -y openscad xvfb
20
+ - run: uv sync --locked --group dev
21
+ - run: uv run ruff check src/openscad_mcp tests scripts
22
+ - run: uv run ruff format --check src/openscad_mcp tests scripts
23
+ - name: Test real geometry and both MCP transports
24
+ run: xvfb-run -a uv run pytest -q
25
+
26
+ docker:
27
+ strategy:
28
+ matrix:
29
+ runner: [ubuntu-24.04, ubuntu-24.04-arm]
30
+ runs-on: ${{ matrix.runner }}
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+ - uses: astral-sh/setup-uv@v6
34
+ with:
35
+ python-version: '3.13'
36
+ - run: uv sync --locked --group dev
37
+ - name: Build headless image
38
+ run: docker build --tag openscad-mcp:ci .
39
+ - name: Test real container MCP and rendering without network or GPU
40
+ run: uv run python scripts/test_docker.py --image openscad-mcp:ci
@@ -0,0 +1,29 @@
1
+ FROM python:3.13-slim-bookworm AS builder
2
+
3
+ # Match the lockfile tooling used for the native installation.
4
+ RUN python -m pip install --no-cache-dir uv==0.6.3
5
+ WORKDIR /app
6
+ COPY pyproject.toml uv.lock README.md LICENSE ./
7
+ COPY src/openscad_mcp ./src/openscad_mcp
8
+ ENV UV_PROJECT_ENVIRONMENT=/opt/venv UV_LINK_MODE=copy
9
+ RUN uv sync --locked --no-dev --no-editable
10
+
11
+ FROM python:3.13-slim-bookworm AS runtime
12
+ RUN apt-get update && apt-get install -y --no-install-recommends \
13
+ openscad xvfb xauth libgl1-mesa-dri fonts-liberation tini \
14
+ && rm -rf /var/lib/apt/lists/* \
15
+ && useradd --create-home --uid 10001 app \
16
+ && mkdir -p /data /tmp/runtime-app \
17
+ && chown app:app /data /tmp/runtime-app \
18
+ && chmod 700 /tmp/runtime-app
19
+ COPY --from=builder /opt/venv /opt/venv
20
+ ENV PATH="/opt/venv/bin:$PATH" \
21
+ OPENSCAD_OUTPUT_DIR=/data \
22
+ LIBGL_ALWAYS_SOFTWARE=1 \
23
+ XDG_RUNTIME_DIR=/tmp/runtime-app \
24
+ PYTHONUNBUFFERED=1
25
+ USER app
26
+ WORKDIR /data
27
+ # MCP uses stdin/stdout. Xvfb supplies a headless display; no GPU is required.
28
+ # tini forwards termination to the entire process group, including renderers.
29
+ ENTRYPOINT ["tini", "-g", "--", "xvfb-run", "-a", "-s", "-screen 0 1024x768x24 -nolisten tcp", "openscad-mcp"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jack Hacksman
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,154 @@
1
+ # OpenSCAD MCP Server
2
+
3
+ A local MCP server that turns OpenSCAD source or explicit primitive dimensions into editable SCAD, STL geometry, and four PNG previews. The connected assistant can write SCAD for complex designs; this server compiles and renders it with the installed OpenSCAD executable.
4
+
5
+ **Status:** the supported implementation is in `src/openscad_mcp`. The previous image generation, CUDA reconstruction, remote processing, and printer code is archived in [`legacy/`](legacy/README.md). It is unfinished and is not part of the installed server. See the [audit and machine test results](docs/audit.md).
6
+
7
+ ## Install
8
+
9
+ Requires Python 3.11+ and OpenSCAD. No API keys, CUDA, Open3D, or separate image renderer are required.
10
+
11
+ Install OpenSCAD using the [official downloads](https://openscad.org/downloads.html). On macOS, the current native Apple Silicon/Intel build is available with:
12
+
13
+ ```sh
14
+ brew install --cask openscad@snapshot
15
+ openscad --version
16
+ ```
17
+
18
+ On Debian/Ubuntu, `sudo apt-get install openscad` installs the distribution package. Linux PNG rendering may need an X display; use `xvfb-run -a` around the server or tests on a headless machine. Windows users can set `OPENSCAD_EXECUTABLE` to the full path of `openscad.exe`.
19
+
20
+ ```sh
21
+ git clone https://github.com/jhacksman/OpenSCAD-MCP-Server.git
22
+ cd OpenSCAD-MCP-Server
23
+ uv sync --locked
24
+ uv run openscad-mcp --help
25
+ ```
26
+
27
+ Alternatively, install into a virtual environment with `python -m pip install .` and run `openscad-mcp`. `requirements.txt` installs this same package. `uv.lock` pins the tested dependency resolution; the project metadata permits compatible updates.
28
+
29
+ On an external filesystem that cannot create symlinks, put the environment on the internal disk:
30
+
31
+ ```sh
32
+ export UV_PROJECT_ENVIRONMENT="$HOME/.cache/openscad-mcp-venv"
33
+ uv sync --locked
34
+ ```
35
+
36
+ ## Docker and Jetson
37
+
38
+ A headless stdio image is available through the root `Dockerfile`. See [Docker setup and verification](docs/docker.md) for build commands, MCP client configuration, persistent model storage, and Glama listing requirements. The image needs no GPU.
39
+
40
+ For the hardware question in issue #19, see [Jetson Orin Nano and CUDA](docs/jetson.md). The supported server does not use CUDA; the archived reconstruction prototype is not restored by this Docker support.
41
+
42
+ ## Connect an MCP client
43
+
44
+ Stdio is the default. Configure the client to launch the server process, using absolute paths:
45
+
46
+ ```json
47
+ {
48
+ "mcpServers": {
49
+ "openscad": {
50
+ "command": "/absolute/path/to/venv/bin/openscad-mcp",
51
+ "args": ["--output-dir", "/absolute/path/to/models"]
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ For clients supporting Streamable HTTP:
58
+
59
+ ```sh
60
+ uv run openscad-mcp --transport http --port 8000
61
+ ```
62
+
63
+ The MCP endpoint is **`http://127.0.0.1:8000/mcp`**. `/` is server information; `/health` reports the OpenSCAD version and primitive defaults. HTTP also serves preview pages and downloads. In stdio mode, use returned absolute file paths or `get_model_preview`; there is no HTTP listener.
64
+
65
+ ## Tools
66
+
67
+ | Tool | Purpose |
68
+ | --- | --- |
69
+ | `get_capabilities` | OpenSCAD version and supported primitives with default parameters |
70
+ | `create_3d_model` | Create a primitive using `model_type` and `parameters`, or a limited description |
71
+ | `create_model_from_scad` | Compile trusted `scad_code` for a custom 3D model |
72
+ | `modify_3d_model` | Change primitive parameters or replace a model's `scad_code` |
73
+ | `get_model` | Read a saved model and its artifact paths |
74
+ | `get_model_source` | Read saved SCAD source and its revision, including inside Docker |
75
+ | `get_model_preview` | Return a PNG image as MCP image content |
76
+ | `export_model` | Export `scad`, `stl`, `csg`, or `3mf` |
77
+
78
+ Example arguments to `create_3d_model`:
79
+
80
+ ```json
81
+ {
82
+ "model_type": "box",
83
+ "parameters": {"width": 40, "depth": 30, "height": 20, "thickness": 2}
84
+ }
85
+ ```
86
+
87
+ Dimensions are in millimeters. Supported types: `cube` (also rectangular blocks), `sphere`, `cylinder`, `box` (open hollow box), `rounded_box` (solid), `tube`, `cone`, `torus`, `prism` (right triangular cross-section), `hexagonal_prism`, and `text`. Call `get_capabilities` for each type's exact parameter names. A torus uses the radius to the tube center (`major_radius`) and the tube radius (`minor_radius`).
88
+
89
+ The optional description parser recognizes named dimensions such as `hollow box width 40 mm depth 30 mm height 20 mm thickness 2 mm` or `cube 2 cm wide 1 inch high`. It supports mm, cm, m, and inches; omitted units mean mm. It is a small parser, not a general natural-language model. Unspecified dimensions use the returned defaults. Prefer explicit parameters for precision. For arbitrary objects, have the assistant write self-contained SCAD and call `create_model_from_scad`.
90
+
91
+ ```json
92
+ {
93
+ "scad_code": "difference() { cube([40,30,8]); translate([20,15,-1]) cylinder(h=10,r=5,$fn=48); }",
94
+ "description": "Mounting plate with a through hole"
95
+ }
96
+ ```
97
+
98
+ To modify a primitive:
99
+
100
+ ```json
101
+ {"model_id": "ID_FROM_CREATION", "parameters": {"height": 25}}
102
+ ```
103
+
104
+ For custom models, call `get_model_source` with the model ID to retrieve `scad_code` and `revision` directly through MCP. Edit the returned source, then call `modify_3d_model` with the new `scad_code` and `expected_revision` set to the revision you read. No access to the server's filesystem is needed to read the source.
105
+
106
+ The same optional revision check works for primitive parameter edits:
107
+
108
+ ```json
109
+ {
110
+ "model_id": "ID_FROM_CREATION",
111
+ "parameters": {"height": 25},
112
+ "expected_revision": "REVISION_FROM_GET_MODEL"
113
+ }
114
+ ```
115
+
116
+ If another edit has already committed, the operation fails before rendering or changing files. MCP reports a tool error; the HTTP `/tool_call` API returns **409** with `current_revision`. Read the latest source/parameters and incorporate the intervening changes before retrying. Omitting `expected_revision` preserves the original unconditional edit behavior.
117
+
118
+ Only **SCAD** retains editable source parameters. CSG is an evaluated geometry tree. STL and 3MF are meshes; they do not preserve the design's parametric relationships. AMF (removed in current OpenSCAD builds), STEP, OBJ, 2D exports, image reconstruction, and printing are not offered.
119
+
120
+ ## HTTP smoke test
121
+
122
+ With the HTTP server running:
123
+
124
+ ```sh
125
+ curl --fail http://127.0.0.1:8000/tool_call \
126
+ -H 'Content-Type: application/json' \
127
+ -d '{"tool_name":"create_3d_model","tool_params":{"model_type":"box","parameters":{"width":40,"depth":30,"height":20,"thickness":2}}}'
128
+ ```
129
+
130
+ Open the returned `preview_url` on the same server. Download `/download/MODEL_ID?format=stl` or `?format=scad`. `/tool_call` is a convenience JSON API, separate from the actual MCP protocol at `/mcp`. Image retrieval over this API uses `/preview/VIEW/MODEL_ID`.
131
+
132
+ ## Behavior and limits
133
+
134
+ - Creation succeeds only after a real STL and all four PNGs have been generated. Renderer failures, empty output, and OpenSCAD warnings/errors are reported as failures; no placeholder geometry or preview is substituted.
135
+ - Edits create a new revision and update the manifest only after successful rendering. Earlier revisions remain on disk. Models survive server restarts.
136
+ - Default storage is `~/.local/share/openscad-mcp/models`. Override with `--output-dir` or `OPENSCAD_OUTPUT_DIR`. Each render subprocess has a 120-second timeout, configurable with `--timeout`. A model requires five subprocesses, so the total request can take longer.
137
+ - Run one server process per output directory. Renders and edits are serialized. There is no automatic disk cleanup, distributed job queue, or multi-process store coordination.
138
+ - This is a trusted local tool. Custom SCAD executes with the current user's file access, including OpenSCAD `import`, `include`, and `use`; it is not sandboxed. HTTP binds to loopback and rejects non-local Host/Origin headers. There is no authentication or supported public/LAN deployment.
139
+ - Tested locally on macOS arm64 and in Ubuntu 24.04 CI under Xvfb. Windows and other platform/display combinations are unverified. No hardware printer or remote GPU was exercised.
140
+
141
+ ## Development and verification
142
+
143
+ ```sh
144
+ uv sync --locked --group dev
145
+ uv run ruff check src/openscad_mcp tests scripts
146
+ uv run ruff format --check src/openscad_mcp tests scripts
147
+ uv run pytest -q
148
+ ```
149
+
150
+ The full suite requires OpenSCAD and fails if it is unavailable. Tests launch real stdio and HTTP server processes, use the official MCP client, download exports, decode PNGs, inspect mesh topology/dimensions/volume, test persistence and failed edits, and exercise invalid requests. `uv run pytest -m 'not integration'` runs the unit checks only and does not establish end-to-end correctness.
151
+
152
+ ## License
153
+
154
+ [MIT](LICENSE), copyright 2026 Jack Hacksman.
@@ -0,0 +1,56 @@
1
+ # Refresh audit — 2026-09-06
2
+
3
+ Reviewed upstream `6948c2d` on macOS 26.5.2 arm64. The starting workspace was empty; the repository was cloned and work isolated on `refresh/local-e2e`.
4
+
5
+ ## Verdict
6
+
7
+ The original checkout could not substantiate its advertised end-to-end workflow. The supported server has been replaced with a smaller implementation that directly compiles and renders OpenSCAD, exposes actual MCP transports, and verifies its outputs. Image reconstruction and printer features remain archived, not certified.
8
+
9
+ ## Confirmed problems and disposition
10
+
11
+ | Original problem | Evidence | Change |
12
+ | --- | --- | --- |
13
+ | Startup failure | The official installed `mcp` package raises `ImportError` for `MCPServer`; `main.py` also references a missing SAM module and undefined classes | Use official `FastMCP`; clean entrypoint and package |
14
+ | Missing MCP endpoint | `/tool_call` was a custom HTTP dispatcher; issue #18 asks where to connect | Real stdio and Streamable HTTP at `/mcp`, tested with official clients |
15
+ | Source/file confusion | `CodeGenerator.generate_code` returns a path, which `main.py` writes as SCAD source | One source-generation interface and self-contained SCAD |
16
+ | Fake outputs | CUDA converter writes a single hardcoded triangle; renderers substitute placeholders | Archive those paths; fail when actual rendering fails |
17
+ | Unfounded reconstruction | Identical synthetic camera poses and placeholder mesh conversion; tests mock outputs | Remove reconstruction from the supported tools and claims |
18
+ | Incorrect dimensions and type selection | Original shape matching selects cube before hollow/rounded box; unit handling and edit defaults are unreliable | Explicit primitive parameters, validation, limited parser with unit tests |
19
+ | False export promises | Mesh formats and evaluated CSG described as preserving parametric properties | Only SCAD is described as editable source; test portable SCAD and mesh exports |
20
+ | Broken current AMF support | Native OpenSCAD 2026.09.05 rejects `.amf` with “Invalid suffix amf” | Do not advertise AMF |
21
+ | Installation overload | Unconditional Open3D/CUDA/image dependencies; issue #20 reports M3 installation failure | Three direct runtime dependencies; lockfile and clean-wheel installation |
22
+ | State and error handling | In-memory models, blocking async routes, missing timeouts, permissive CORS | Persistent revision manifests; worker-thread dispatch; timeouts; loopback HTTP; explicit errors |
23
+
24
+ Related upstream reports: [startup #17](https://github.com/jhacksman/OpenSCAD-MCP-Server/issues/17), [endpoint #18](https://github.com/jhacksman/OpenSCAD-MCP-Server/issues/18), [Apple Silicon install #20](https://github.com/jhacksman/OpenSCAD-MCP-Server/issues/20). No claims are made that the archived CUDA/Jetson workflow is fixed.
25
+
26
+ ## Machine and dependency evidence
27
+
28
+ - macOS 26.5.2, arm64; Python 3.12.9.
29
+ - OpenSCAD 2026.09.05, installed through the official Homebrew `openscad@snapshot` cask. The old `openscad` cask is disabled; the [official downloads page](https://openscad.org/downloads.html) recommends the snapshot on macOS.
30
+ - MCP SDK 1.29.1, FastAPI 0.141.1, Uvicorn 0.52.4. Exact resolved dependencies are in `uv.lock`.
31
+ - The MEDIA volume does not support the virtual environment's links. The development environment is `/Users/jackhacksman/.cache/openscad-mcp-venv` on the internal disk. A separate wheel-check environment is `/Users/jackhacksman/.cache/openscad-mcp-wheel-check`.
32
+
33
+ ## Verification
34
+
35
+ `pytest -q`: **59 passed in 54.19 seconds**, no skipped tests. `ruff check`, `ruff format --check`, and `git diff --check` pass. Wheel and source-distribution builds succeed. A clean environment installs the wheel, exposes the CLI, and successfully creates a cylinder through stdio MCP from `/tmp`, then retrieves it after restart.
36
+
37
+ The suite exercises:
38
+
39
+ - All 11 supported primitives through the actual OpenSCAD executable; closed meshes, winding consistency, positive volume, and representative analytic dimensions/volumes.
40
+ - Four real PNG views, image decoding and distinct outputs.
41
+ - SCAD, STL, CSG and 3MF exports; exported SCAD compiles from a different directory without template files.
42
+ - Parameter edits, preservation of unrelated dimensions, state reload, and rollback after invalid source.
43
+ - Empty geometry, malformed SCAD, unknown modules and failed assertions.
44
+ - Real stdio subprocess initialization, tool discovery, generation, image content, modification, export, errors and persistence after restart.
45
+ - Real HTTP subprocess initialization and MCP calls, browser HTML, image and file downloads, legacy JSON API validation, escaping, bad model IDs, and Host/Origin rejection.
46
+ - Fault injection for timeouts, warnings, nonzero exit, zero-exit errors and empty output. These tests complement real rendering; they do not replace it.
47
+
48
+ A separately generated mounting plate was inspected in PNG files and the browser preview page. Its STL is watertight, has 1,052 triangles and measures exactly **60 × 40 × 6 mm**. Measured volume is **13,722.5055 mm³** versus **13,721.4160 mm³** analytically (0.00794% difference from faceted circular holes). All four offered exports exist.
49
+
50
+ Local artifacts are retained under `output/manual-e2e/`, indexed by `output/manual-e2e-result.json`. These generated files are intentionally gitignored.
51
+
52
+ ## Scope and remaining limits
53
+
54
+ This is a breaking replacement of the non-working prototype, not a repair of every archived experiment. The original source, scripts, and historical notes are preserved under `legacy/`; tracked bytecode was removed. The installable wheel contains only the supported package.
55
+
56
+ This macOS machine was exercised locally. The Ubuntu 24.04 CI run also passed all 59 tests in 14.71 seconds under Xvfb, plus lint and formatting ([run 34081686256](https://github.com/jhacksman/OpenSCAD-MCP-Server/actions/runs/34081686256)). Windows, other Linux/display configurations, remote GPUs, external image providers and hardware printers are not certified here. Custom SCAD is trusted code with the current user's filesystem access. One server process owns an output directory; edits are serialized and old revisions are retained. No public server deployment, mesh repair, slicing, or physical printing is claimed.
@@ -0,0 +1,66 @@
1
+ # Docker
2
+
3
+ The root `Dockerfile` builds a headless **stdio MCP** server. It includes OpenSCAD, Xvfb, software OpenGL, and Liberation fonts. The runtime uses an unprivileged user (UID 10001); no host display, GPU, CUDA, or API keys are needed. Python dependencies come from `uv.lock`. Debian packages and the Python base image receive upstream updates at build time.
4
+
5
+ ## Build and connect
6
+
7
+ ```sh
8
+ docker build -t openscad-mcp:local .
9
+ docker run --rm -i --network none \
10
+ -v openscad-models:/data \
11
+ openscad-mcp:local
12
+ ```
13
+
14
+ The process waits for MCP messages on stdin. Use `-i` and **do not use `-t`**, which would mix terminal output with protocol messages. Configure a local MCP client to run:
15
+
16
+ ```json
17
+ {
18
+ "mcpServers": {
19
+ "openscad": {
20
+ "command": "docker",
21
+ "args": [
22
+ "run", "--rm", "-i", "--network", "none",
23
+ "-v", "openscad-models:/data",
24
+ "openscad-mcp:local"
25
+ ]
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ The named volume preserves models across container restarts. A fresh named volume receives the image's `/data` ownership. If you use a bind mount or an existing volume, make sure UID 10001 can write to it. Run only one server per volume.
32
+
33
+ Returned paths such as `/data/MODEL_ID/REVISION/model.stl` are **inside the container**. `get_model_preview` returns the image directly over MCP. `get_model_source` returns the actual SCAD text and its revision, so a client can read and edit a custom model without a host filesystem mount. Pass that revision as `expected_revision` when submitting the edited source to avoid overwriting a newer edit. To copy an export to the host while the container is running, find its name with `docker ps`, then use the exact `model_file` returned by `export_model`:
34
+
35
+ ```sh
36
+ docker cp CONTAINER_NAME:/data/MODEL_ID/REVISION/model.stl ./model.stl
37
+ ```
38
+
39
+ The image does not expose an HTTP port. For browser previews and HTTP clients, use the native `--transport http` setup in the root README. Container port publishing does not make the server's loopback-only HTTP listener accessible.
40
+
41
+ Custom SCAD can access files within the container and any mounted directories. Mount only the model data and assets you intend it to read. Networking is not required for generation; the example disables it.
42
+
43
+ ## Test the image
44
+
45
+ Install development dependencies on the host, build the image, and run:
46
+
47
+ ```sh
48
+ uv sync --locked --group dev
49
+ uv run python scripts/test_docker.py --image openscad-mcp:local
50
+ ```
51
+
52
+ This starts disposable containers with networking disabled and an isolated named volume. It uses the actual MCP protocol, verifies non-root execution, creates a hollow box, checks mesh dimensions and volume, decodes all four views, retrieves every supported export, edits the model, rejects invalid SCAD without losing the good revision, and verifies persistence in a fresh container. The script removes its containers and test volume afterward.
53
+
54
+ On macOS, a Docker-compatible Linux VM is required. The local test used a dedicated Colima profile with Docker context `colima-openscad-mcp`; this does not require changing your default Docker context:
55
+
56
+ ```sh
57
+ colima start --profile openscad-mcp --vm-type vz --cpu 4 --memory 6 --disk 20 --activate=false
58
+ DOCKER_CONTEXT=colima-openscad-mcp docker build -t openscad-mcp:local .
59
+ DOCKER_CONTEXT=colima-openscad-mcp uv run python scripts/test_docker.py --image openscad-mcp:local
60
+ ```
61
+
62
+ ## Glama listing
63
+
64
+ `Dockerfile`, the MIT `LICENSE`, and `glama.json` identifying `jhacksman` as maintainer address the repository prerequisites discussed in issue #14. Glama documents the maintainer file and ownership synchronization in [What is glama.json?](https://glama.ai/blog/2025-07-08-what-is-glamajson).
65
+
66
+ A successful local image test is not a Glama deployment. After merging, sync/claim the existing listing through its owner account and run Glama's build/tool checks. No external account permissions, hosted deployment, or listing score changes are implied by these repository files.
@@ -0,0 +1,19 @@
1
+ # Issue follow-up — 2026-09-07
2
+
3
+ PR #21 is merged into `main`. Issues #17 (startup/demo), #18 (MCP endpoint), and #20 (Open3D installation) received replies with the merged fix, current commands, scope, and test evidence, and were closed.
4
+
5
+ ## Additional local verification
6
+
7
+ - Python **3.13.2**, macOS arm64: **59 tests passed in 22.00 seconds**, with actual OpenSCAD and both MCP transports. This verifies the Python 3.13 family on this Mac; it does not reproduce the reporter's exact M3/Conda/Python 3.13.11 installation.
8
+ - Built the root Dockerfile in a dedicated Colima Linux arm64 VM. The image runs Python 3.13, Debian Bookworm's OpenSCAD 2021.01, Xvfb, and software OpenGL.
9
+ - `scripts/test_docker.py` passed against the built image with **networking disabled**, no GPU, and UID **10001**. It exercised tool discovery, actual geometry and analytic volume, all four PNG views, SCAD/STL/CSG/3MF exports, modification, failed-edit rollback, and persistence after replacing the container.
10
+ - The Docker test cleans up its disposable containers and named volume. The image is retained locally as `openscad-mcp:issue14`; the dedicated Docker context is `colima-openscad-mcp`.
11
+ - `glama.json` validates against Glama's published JSON schema. The owner selected MIT; the root license and package license metadata have been added.
12
+
13
+ CI now includes native Python 3.12/3.13 tests and real Docker builds/tests on amd64 and arm64 runners. Remote results are tracked on the follow-up pull request.
14
+
15
+ ## Remaining external checks
16
+
17
+ The Jetson question is answered in [Jetson Orin Nano and CUDA](jetson.md). General CUDA capability and successful ARM64 container testing do not establish physical Jetson or archived reconstruction support.
18
+
19
+ The repository changes address the missing Dockerfile and license in #14. The [Glama owner listing](https://glama.ai/mcp/servers/jhacksman/OpenSCAD-MCP-Server) still needs to sync the merged revision and pass Glama's own build/tool checks. No Glama deployment or score improvement is claimed by the local test results.
@@ -0,0 +1,17 @@
1
+ # Jetson Orin Nano and CUDA
2
+
3
+ The Jetson Orin Nano supports CUDA workloads beyond robotics. NVIDIA's [CUDA setup guide](https://docs.nvidia.com/jetson/orin-nano-devkit/user-guide/setup_cuda.html) documents CUDA on the host and in Jetson-compatible containers. CUDA capability alone does not establish that an arbitrary project builds or runs correctly on the board.
4
+
5
+ ## Current OpenSCAD server
6
+
7
+ The supported server does **not use CUDA**. It compiles SCAD and renders previews with OpenSCAD. The Docker image uses software rendering and does not require `--gpus`, an NVIDIA runtime, or JetPack CUDA packages.
8
+
9
+ The image has been built and tested on Linux arm64 in a VM on an Apple Silicon Mac. That verifies the ARM64 Linux container path, not physical Jetson hardware, JetPack integration, performance, or memory limits. Build it on the target using the [Docker instructions](docker.md) and run the container smoke test to validate that environment. Native installation requires Python 3.11+; if a board's OS has an older Python, use a compatible virtual environment or the container's bundled Python 3.13.
10
+
11
+ ## Archived CUDA reconstruction prototype
12
+
13
+ The earlier README described remote CUDA reconstruction as supported. That was inaccurate: the integration generated artificial camera poses and wrote dummy OBJ geometry. It is now archived under `legacy/`, outside the installed server. Changing GPU hardware cannot fix that implementation.
14
+
15
+ The referenced [Fixstars CUMVS project](https://github.com/fixstars/cuda-multi-view-stereo#requirements) implements depth estimation and lists CUDA compute capability >= 6.0, OpenCV >= 4.6 with CUDA and Viz modules, and VTK >= 9.0. Its published benchmark uses an RTX 3080, not an Orin Nano. Those requirements and GPU benchmarks are not evidence of this repository's Jetson support.
16
+
17
+ Restoring a reconstruction feature would require a working ARM64 dependency build, real camera calibration/poses, actual mesh reconstruction, and tests with real image sets on the target GPU. No Jetson hardware or remote CUDA machine was used in this refresh, and no such support is claimed.
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://glama.ai/mcp/schemas/server.json",
3
+ "maintainers": ["jhacksman"]
4
+ }
@@ -0,0 +1,15 @@
1
+ # Archived prototype — unsupported
2
+
3
+ This directory preserves the previous implementation and its historical notes/tests for reference. It is **not installed, imported, or exposed** by the supported server. The old imports and entrypoints are not maintained. Do not use the original README here as setup instructions.
4
+
5
+ The September 2026 review found:
6
+
7
+ - `src/main.py` imports nonexistent MCP SDK classes, a removed SAM module, and several undefined components. Its `/tool_call` route is not an MCP transport.
8
+ - `CodeGenerator.generate_code` returns a filename, while the entrypoint treats it as source text. It also points at the wrong template directory.
9
+ - CUDA reconstruction synthesizes uncalibrated camera matrices and its OBJ conversion writes a dummy triangle. The provided mock tests do not establish working reconstruction.
10
+ - Printer discovery returns simulated printer entries.
11
+ - Renderer fallbacks produce placeholder images after errors.
12
+ - The original installation pulls heavy unrelated packages (including Open3D) into the base server, obstructing Apple Silicon installation.
13
+ - Parametric export claims incorrectly include mesh formats and evaluated CSG. Several helpers silently ignore unsupported operations or fall back to a cube.
14
+
15
+ The root README documents the replacement implementation. Historical tracked Python bytecode was removed rather than preserved. Reviving an experiment requires a separate implementation and genuine integration tests; passing the archived mocks would not establish support.