dcc-mcp-openscad 0.1.0__tar.gz

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 (28) hide show
  1. dcc_mcp_openscad-0.1.0/.github/workflows/ci.yml +56 -0
  2. dcc_mcp_openscad-0.1.0/.github/workflows/release.yml +66 -0
  3. dcc_mcp_openscad-0.1.0/.gitignore +8 -0
  4. dcc_mcp_openscad-0.1.0/.release-please-manifest.json +3 -0
  5. dcc_mcp_openscad-0.1.0/CHANGELOG.md +9 -0
  6. dcc_mcp_openscad-0.1.0/LICENSE +6 -0
  7. dcc_mcp_openscad-0.1.0/PKG-INFO +129 -0
  8. dcc_mcp_openscad-0.1.0/README.md +92 -0
  9. dcc_mcp_openscad-0.1.0/docs/assets/dcc-mcp-openscad-dark.svg +22 -0
  10. dcc_mcp_openscad-0.1.0/docs/assets/dcc-mcp-openscad.svg +22 -0
  11. dcc_mcp_openscad-0.1.0/examples/production_smoke.scad +35 -0
  12. dcc_mcp_openscad-0.1.0/pyproject.toml +69 -0
  13. dcc_mcp_openscad-0.1.0/release-please-config.json +15 -0
  14. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/__init__.py +3 -0
  15. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/__version__.py +1 -0
  16. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/bridge.py +589 -0
  17. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/server.py +62 -0
  18. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skill_tools.py +18 -0
  19. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/SKILL.md +36 -0
  20. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/export_model.py +8 -0
  21. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/get_capabilities.py +8 -0
  22. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/get_status.py +9 -0
  23. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/inspect_source.py +9 -0
  24. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/render_preview.py +8 -0
  25. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/validate_model.py +8 -0
  26. dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/tools.yaml +132 -0
  27. dcc_mcp_openscad-0.1.0/tests/test_bridge.py +211 -0
  28. dcc_mcp_openscad-0.1.0/tests/test_contracts.py +49 -0
@@ -0,0 +1,56 @@
1
+ name: CI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches: [main, "release-please--branches--**"]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ test:
19
+ name: Test Python ${{ matrix.python }} on ${{ matrix.os }}
20
+ runs-on: ${{ matrix.os }}
21
+ timeout-minutes: 15
22
+ strategy:
23
+ fail-fast: false
24
+ matrix:
25
+ include:
26
+ - {os: ubuntu-22.04, python: "3.7"}
27
+ - {os: windows-2022, python: "3.7"}
28
+ - {os: ubuntu-latest, python: "3.9"}
29
+ - {os: windows-latest, python: "3.9"}
30
+ - {os: macos-latest, python: "3.9"}
31
+ - {os: ubuntu-latest, python: "3.12"}
32
+ - {os: windows-latest, python: "3.12"}
33
+ - {os: macos-latest, python: "3.12"}
34
+ steps:
35
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
36
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
37
+ with:
38
+ python-version: ${{ matrix.python }}
39
+ - run: python -m pip install --upgrade pip
40
+ - run: python -m pip install -e ".[test]"
41
+ - run: python -m pytest -m "not openscad"
42
+
43
+ lint-and-build:
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 15
46
+ steps:
47
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
48
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
49
+ with:
50
+ python-version: "3.12"
51
+ - run: python -m pip install --upgrade pip
52
+ - run: python -m pip install -e ".[dev]"
53
+ - run: python -m ruff check src tests
54
+ - run: python -m ruff format --check src tests
55
+ - run: python -m build
56
+ - run: python -m twine check dist/*
@@ -0,0 +1,66 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+ inputs:
8
+ tag_name:
9
+ description: Existing tag to rebuild and publish
10
+ required: false
11
+ default: ""
12
+ publish_to_pypi:
13
+ description: Publish a manually rebuilt tag to PyPI
14
+ type: boolean
15
+ required: false
16
+ default: false
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: false
21
+
22
+ permissions:
23
+ contents: write
24
+ pull-requests: write
25
+
26
+ jobs:
27
+ release-please:
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 10
30
+ if: github.ref == 'refs/heads/main'
31
+ outputs:
32
+ release_created: ${{ steps.release.outputs.release_created }}
33
+ tag_name: ${{ steps.release.outputs.tag_name || inputs.tag_name }}
34
+ steps:
35
+ - uses: googleapis/release-please-action@0dfd8538845b8e92600d271a895a5372865d4062 # v5
36
+ id: release
37
+ with:
38
+ token: ${{ github.token }}
39
+ config-file: release-please-config.json
40
+ manifest-file: .release-please-manifest.json
41
+
42
+ build-and-publish:
43
+ needs: release-please
44
+ if: needs.release-please.outputs.release_created == 'true' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '' && inputs.publish_to_pypi)
45
+ runs-on: ubuntu-latest
46
+ timeout-minutes: 15
47
+ environment:
48
+ name: pypi
49
+ url: https://pypi.org/p/dcc-mcp-openscad
50
+ permissions:
51
+ contents: read
52
+ id-token: write
53
+ steps:
54
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
55
+ with:
56
+ ref: ${{ needs.release-please.outputs.tag_name || inputs.tag_name }}
57
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
58
+ with:
59
+ python-version: "3.12"
60
+ - run: python -m pip install --upgrade pip build twine
61
+ - run: python -m build
62
+ - run: python -m twine check dist/*
63
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
64
+ with:
65
+ verbose: true
66
+ print-hash: true
@@ -0,0 +1,8 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .pytest_cache/
4
+ .ruff_cache/
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.0"
3
+ }
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-08-10)
4
+
5
+
6
+ ### Features
7
+
8
+ * add experimental OpenSCAD adapter ([86c0df9](https://github.com/dcc-mcp/dcc-mcp-openscad/commit/86c0df91044b09f2ac0fb174fbff31c084ef408b))
9
+ * make OpenSCAD adapter production ready ([#1](https://github.com/dcc-mcp/dcc-mcp-openscad/issues/1)) ([fe7b4dc](https://github.com/dcc-mcp/dcc-mcp-openscad/commit/fe7b4dce023d61acda6ba8c0c2a798842436dce2))
@@ -0,0 +1,6 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 loonghao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies.
6
+
@@ -0,0 +1,129 @@
1
+ Metadata-Version: 2.4
2
+ Name: dcc-mcp-openscad
3
+ Version: 0.1.0
4
+ Summary: Production OpenSCAD adapter for deterministic DCC-MCP model validation, export, and rendering
5
+ Project-URL: Homepage, https://github.com/dcc-mcp/dcc-mcp-openscad
6
+ Project-URL: Repository, https://github.com/dcc-mcp/dcc-mcp-openscad
7
+ Project-URL: Issues, https://github.com/dcc-mcp/dcc-mcp-openscad/issues
8
+ Author-email: loonghao <hal.long@outlook.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: automation,cad,dcc,mcp,openscad,parametric-modeling
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.7
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Requires-Python: >=3.7
23
+ Requires-Dist: dcc-mcp-core<1.0.0,>=0.19.91
24
+ Provides-Extra: dev
25
+ Requires-Dist: build>=1.2; extra == 'dev'
26
+ Requires-Dist: pytest<8,>=7.4; (python_version < '3.8') and extra == 'dev'
27
+ Requires-Dist: pytest>=8; (python_version >= '3.8') and extra == 'dev'
28
+ Requires-Dist: pyyaml>=6; extra == 'dev'
29
+ Requires-Dist: ruff>=0.8; extra == 'dev'
30
+ Requires-Dist: twine>=6; extra == 'dev'
31
+ Provides-Extra: test
32
+ Requires-Dist: pytest<8,>=7.4; (python_version < '3.8') and extra == 'test'
33
+ Requires-Dist: pytest>=8; (python_version >= '3.8') and extra == 'test'
34
+ Requires-Dist: pyyaml>=6; extra == 'test'
35
+ Requires-Dist: ruff>=0.8; extra == 'test'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # dcc-mcp-openscad
39
+
40
+ <p align="center">
41
+ <img src="docs/assets/dcc-mcp-openscad.svg" alt="DCC-MCP · OPENSCAD" width="600">
42
+ </p>
43
+
44
+ Production OpenSCAD adapter for deterministic model inspection, validation,
45
+ geometry export, and PNG rendering through DCC-MCP.
46
+
47
+ ## Capabilities
48
+
49
+ - Detect the standalone OpenSCAD CLI and report version-specific capabilities.
50
+ - Inspect modules, functions, variables, and `include`/`use` references without
51
+ executing source.
52
+ - Validate a parameterized model with structured warning/error diagnostics.
53
+ - Export STL (explicit binary or ASCII), 3MF, AMF, OFF, CSG, DXF, SVG, PDF,
54
+ and OpenSCAD diagnostic formats.
55
+ - Render bounded PNG previews or full geometry renders with typed camera,
56
+ projection, color-scheme, size, and parameter inputs.
57
+ - Stage outputs atomically and return file size plus SHA-256 provenance.
58
+
59
+ The adapter does not accept arbitrary OpenSCAD command-line arguments or raw
60
+ `-D` expressions. JSON scalar/array parameters are encoded by the adapter.
61
+
62
+ ## Requirements
63
+
64
+ - Python 3.7+
65
+ - `dcc-mcp-core` 0.19.91+
66
+ - OpenSCAD 2021.01 or newer
67
+
68
+ On Windows, point to `openscad.com` when possible; if `openscad.exe` is
69
+ configured and a sibling `openscad.com` exists, the adapter selects the console
70
+ launcher automatically.
71
+
72
+ ## Install
73
+
74
+ ```bash
75
+ python -m pip install dcc-mcp-openscad
76
+ dcc-mcp-openscad
77
+ ```
78
+
79
+ For development:
80
+
81
+ ```bash
82
+ python -m pip install -e ".[dev]"
83
+ python -m pytest
84
+ ```
85
+
86
+ ## Configuration
87
+
88
+ | Variable | Purpose | Default |
89
+ | --- | --- | --- |
90
+ | `DCC_MCP_OPENSCAD_EXECUTABLE` | Exact OpenSCAD executable or install directory | `PATH` and standard install locations |
91
+ | `DCC_MCP_OPENSCAD_ALLOWED_ROOTS` | `os.pathsep`-separated source/output roots | server working directory |
92
+ | `DCC_MCP_OPENSCAD_MAX_SOURCE_BYTES` | Maximum source size | 4 MiB |
93
+ | `DCC_MCP_OPENSCAD_MAX_TIMEOUT_SECS` | Maximum per-call deadline | 1800 seconds |
94
+ | `DCC_MCP_OPENSCAD_PORT` | Fixed adapter port when direct addressing is required | OS-assigned |
95
+
96
+ The service registers as a standalone DCC-MCP instance. It has no bound GUI
97
+ PID and needs no OpenSCAD window.
98
+
99
+ ## Agent workflow
100
+
101
+ Use the standard discovery path:
102
+
103
+ ```bash
104
+ dcc-mcp-cli list
105
+ dcc-mcp-cli search --query "OpenSCAD validate export STL"
106
+ dcc-mcp-cli load-skill openscad-pipeline --dcc-type openscad --instance-id <instance-short>
107
+ dcc-mcp-cli describe openscad.<instance-short>.openscad_pipeline__validate_model
108
+ ```
109
+
110
+ Then call `inspect_source` → `validate_model` → `export_model` or
111
+ `render_preview`. Long calls are asynchronous and should be polled through the
112
+ core job tools returned by the call.
113
+
114
+ `examples/production_smoke.scad` is a parameterized enclosure used by the live
115
+ acceptance test. Override `width`, `depth`, `height`, `wall`, `corner_radius`,
116
+ or `vent_count` to verify safe parameter encoding and reproducible artifacts.
117
+
118
+ ## Safety contract
119
+
120
+ - Source and output paths must remain under configured allowed roots.
121
+ - Existing outputs are never replaced unless `overwrite=true` is explicit.
122
+ - Exports use sibling temporary files and become visible only after success.
123
+ - Parameter names, values, nesting, count, image dimensions, formats, and
124
+ deadlines are bounded.
125
+ - Cancellation and timeouts terminate the owned OpenSCAD child process.
126
+ - Captured process output is limited to 64 KiB per stream.
127
+
128
+ OpenSCAD CLI reference:
129
+ <https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_OpenSCAD_in_a_command_line_environment>
@@ -0,0 +1,92 @@
1
+ # dcc-mcp-openscad
2
+
3
+ <p align="center">
4
+ <img src="docs/assets/dcc-mcp-openscad.svg" alt="DCC-MCP · OPENSCAD" width="600">
5
+ </p>
6
+
7
+ Production OpenSCAD adapter for deterministic model inspection, validation,
8
+ geometry export, and PNG rendering through DCC-MCP.
9
+
10
+ ## Capabilities
11
+
12
+ - Detect the standalone OpenSCAD CLI and report version-specific capabilities.
13
+ - Inspect modules, functions, variables, and `include`/`use` references without
14
+ executing source.
15
+ - Validate a parameterized model with structured warning/error diagnostics.
16
+ - Export STL (explicit binary or ASCII), 3MF, AMF, OFF, CSG, DXF, SVG, PDF,
17
+ and OpenSCAD diagnostic formats.
18
+ - Render bounded PNG previews or full geometry renders with typed camera,
19
+ projection, color-scheme, size, and parameter inputs.
20
+ - Stage outputs atomically and return file size plus SHA-256 provenance.
21
+
22
+ The adapter does not accept arbitrary OpenSCAD command-line arguments or raw
23
+ `-D` expressions. JSON scalar/array parameters are encoded by the adapter.
24
+
25
+ ## Requirements
26
+
27
+ - Python 3.7+
28
+ - `dcc-mcp-core` 0.19.91+
29
+ - OpenSCAD 2021.01 or newer
30
+
31
+ On Windows, point to `openscad.com` when possible; if `openscad.exe` is
32
+ configured and a sibling `openscad.com` exists, the adapter selects the console
33
+ launcher automatically.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ python -m pip install dcc-mcp-openscad
39
+ dcc-mcp-openscad
40
+ ```
41
+
42
+ For development:
43
+
44
+ ```bash
45
+ python -m pip install -e ".[dev]"
46
+ python -m pytest
47
+ ```
48
+
49
+ ## Configuration
50
+
51
+ | Variable | Purpose | Default |
52
+ | --- | --- | --- |
53
+ | `DCC_MCP_OPENSCAD_EXECUTABLE` | Exact OpenSCAD executable or install directory | `PATH` and standard install locations |
54
+ | `DCC_MCP_OPENSCAD_ALLOWED_ROOTS` | `os.pathsep`-separated source/output roots | server working directory |
55
+ | `DCC_MCP_OPENSCAD_MAX_SOURCE_BYTES` | Maximum source size | 4 MiB |
56
+ | `DCC_MCP_OPENSCAD_MAX_TIMEOUT_SECS` | Maximum per-call deadline | 1800 seconds |
57
+ | `DCC_MCP_OPENSCAD_PORT` | Fixed adapter port when direct addressing is required | OS-assigned |
58
+
59
+ The service registers as a standalone DCC-MCP instance. It has no bound GUI
60
+ PID and needs no OpenSCAD window.
61
+
62
+ ## Agent workflow
63
+
64
+ Use the standard discovery path:
65
+
66
+ ```bash
67
+ dcc-mcp-cli list
68
+ dcc-mcp-cli search --query "OpenSCAD validate export STL"
69
+ dcc-mcp-cli load-skill openscad-pipeline --dcc-type openscad --instance-id <instance-short>
70
+ dcc-mcp-cli describe openscad.<instance-short>.openscad_pipeline__validate_model
71
+ ```
72
+
73
+ Then call `inspect_source` → `validate_model` → `export_model` or
74
+ `render_preview`. Long calls are asynchronous and should be polled through the
75
+ core job tools returned by the call.
76
+
77
+ `examples/production_smoke.scad` is a parameterized enclosure used by the live
78
+ acceptance test. Override `width`, `depth`, `height`, `wall`, `corner_radius`,
79
+ or `vent_count` to verify safe parameter encoding and reproducible artifacts.
80
+
81
+ ## Safety contract
82
+
83
+ - Source and output paths must remain under configured allowed roots.
84
+ - Existing outputs are never replaced unless `overwrite=true` is explicit.
85
+ - Exports use sibling temporary files and become visible only after success.
86
+ - Parameter names, values, nesting, count, image dimensions, formats, and
87
+ deadlines are bounded.
88
+ - Cancellation and timeouts terminate the owned OpenSCAD child process.
89
+ - Captured process output is limited to 64 KiB per stream.
90
+
91
+ OpenSCAD CLI reference:
92
+ <https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_OpenSCAD_in_a_command_line_environment>