MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Design, modify, and verify 3D-printable parts and assemblies in OpenSCAD through the openscad-mcp tools.
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install RobertCoop/openscad-mcp openscad-design --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/openscad-design .claude/skills/openscad-design && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .claude/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-designType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install RobertCoop/openscad-mcp openscad-design --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/openscad-design .agents/skills/openscad-design && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .agents/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install RobertCoop/openscad-mcp openscad-design --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/openscad-design .cursor/skills/openscad-design && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .cursor/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/RobertCoop/openscad-mcp.git --path skills/openscad-design--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install RobertCoop/openscad-mcp openscad-design --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/openscad-design .gemini/skills/openscad-design && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .gemini/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install RobertCoop/openscad-mcp openscad-designInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/openscad-design .github/skills/openscad-design && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .github/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add RobertCoop/openscad-mcp --skill openscad-design -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install RobertCoop/openscad-mcp openscad-design --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RobertCoop/openscad-mcp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/openscad-design .opencode/skills/openscad-design && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "openscad-design" agent skill from https://github.com/RobertCoop/openscad-mcp/tree/main/skills/openscad-design into .opencode/skills/openscad-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openscad-design", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
openscad-designDesign, modify, and verify 3D-printable parts and assemblies in OpenSCAD through the openscad-mcp tools.
Openscad Design is an agent skill from RobertCoop/openscad-mcp. Design, modify, and verify 3D-printable parts and assemblies in OpenSCAD through the openscad-mcp tools. Use when the user asks for a bracket, enclosure, adapter, jig, or other parametric part, or wants an existing .scad file changed, measured, fit-checked, or exported for printing.
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers. The repository describes itself as: A Model Context Protocol (MCP) server for OpenSCAD 3D modeling and rendering. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit bde0b23. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are openscad).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Openscad Design loads about 3.9k tokens when it runs. Until then it costs about 75 tokens; SKILL.md has 1,945 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from RobertCoop/openscad-mcp at commit bde0b23, republished under its MIT licence (© RobertCoop). 1,945 words, ~3,860 tokens.
.claude/skills/openscad-design/SKILL.md (or your agent's skills folder).One rule sits above the rest: numbers decide, pictures confirm. A render is a
low-bandwidth summary of geometry. Vision models routinely rate a broken model as
fine, because a missing internal wall, a 0.02 mm gap, or a non-manifold seam looks
identical to a correct part at 800x600. Never conclude "that looks right" from an
image. Conclude it from measure and validate, then use the image to catch the
class of error numbers miss: wrong orientation, a feature on the wrong face, a part
that is inside-out.
Say these out loud in one or two lines, because they are invisible in the source and wrong in half of all first attempts:
Every number that the user might change, or that appears more than once, becomes a named variable at the top of the file. Derive the rest with expressions rather than retyping arithmetic. This is what makes step 6 cheap: an iteration becomes one variable edit, not a search-and-replace through solid geometry.
wall = 2.4; // 3 perimeters at 0.8 mm
inner_x = 60;
inner_y = 40;
inner_z = 25;
clearance = 0.2; // from reference(topic="fits")
eps = 0.01; // coplanar-face overlapvalidate(mode="syntax") firstBefore any render or export. OpenSCAD's exit code is not a success signal: a failed
assert(), an unknown module, a missing include, and an unclosed polyhedron all
exit 0 while printing to stderr. validate parses that stream. Read errors,
warnings, and hints on the response. Fix everything in errors before moving on
and read every warning, since "Ignoring unknown module" means a whole feature is
silently absent from the geometry you are about to measure.
measure before you trust any picturemeasure(mode="model") exports the mesh and returns exact numbers: bounding box,
dimensions, volume, surface area, component count, watertightness. Compare those
against the dimensions you intended. A bounding box 0.4 mm larger than expected is a
clearance bug you would never see in a render.
measure also accepts an existing STL through mesh=, so you can measure a file
the user already has without re-rendering it.
Modes: model for the whole thing, parts for per-solid numbers and the solid
count, section for a cut plane, mass for volume-times-density estimates. The
rest — probe, features, printability, orientation, anchors — are in the
tool reference at the end.
render(grounded=true), one to three viewsOnly after the numbers agree. Ask for the smallest number of views that answers the open question, usually one isometric plus one orthographic view of the face in question. More images degrade the model's own counting and comparison, so a four-view contact sheet is worse than one well-chosen view, not better.
Modes: views for standard camera positions, section for a cut, parts for
per-part colouring, compare for before/after.
module lid() { ... }, module body() { ... }, and a
separate assembly view that translates them into place. Never one monolithic union.eps so the parts genuinely interpenetrate, and subtract eps on
through-holes so the cutter pokes out both sides.reference(topic="fits"), not from memory. Press fit,
slip fit, and free fit differ by tenths of a millimetre and the right number
depends on the process. Related topics: fasteners, inserts, bearings,
magnets, joints, dfm, materials, conventions, cheatsheet.measure(mode="parts") should report exactly as many
components as you designed. Two when you expected one means a part is floating
free; one when you expected two means they fused and will print as a single lump.validate(mode="geometry") returns mesh_health. Look at
mesh_health.manifold: true is good, false names the defect in
mesh_health.issue, and null means the check was not performed, which is not the
same as passing.checkOnce a design has more than one part, stop reasoning from pictures and give the server the parts by name. Every part is exported separately (never unioned), so identity survives and every relation is a number in the assembly frame.
check(scad_file="assembly.scad", mode="interference",
parts=[{"name": "bracket", "code": "bracket();"},
{"name": "motor", "code": "motor();", "place": "translate(MOTOR_POS)",
"ghost": true, "mass_g": 34}])state is clear, contact, or interference. Flush contact is contact,
never interference; a sliding pair (a pinion on a plate) that reports contact is
the defect, so declare motion on the moving part and use contact with
kind="sliding".mode="clearance" gives the exact minimum distance and both closest points;
mode="motion" sweeps a part about an axis or along a vector and, for a full
turn, adds a certificate that says whether the parts can ever touch.mode="alignment" is the only check that sees a 0.6 mm hole misalignment:
interference and clearance both read zero there.rule: mass in a check file limits total mass, centre-of-mass offset from an
axis or point, and inertia about an axis, composed from the exported meshes
with each part's mass_g, material or density_g_cm3 (PLA if none, flagged).point: "[BOLT_R, 0, BASE_H]", min_mm: "GAP_MIN"), never as
copied numbers: a copied number keeps passing after the parameter changes.quality.fn. A distance smaller than the tessellation error
bound comes back UNRESOLVED; re-run with quality="high" or an integer $fn.measure(mode="probe") answers "is there material at this point, and whose",
ray casts ("does the scanner see the card"), and line-of-sight polylines.measure(mode="features") lists the holes a part cuts (axis, diameter, depth,
fit name) straight from the CSG tree, and reference(topic="fits", diameter_mm=3.3)
names what a hole is.frames, quality, parts, checks,
model) and re-run check(check_file=..., mode="rules") after every edit;
openscad-mcp check file.yaml does the same from a Makefile.Purchased parts. reference(topic="parts") lists the five sourced entries:
28byj-48, nema17, lazy-susan-4in, kw11-3z (snap-action microswitch) and
tcrt5000-module. model(action="create", template="part:28byj-48") writes
BOSL2 modules with named anchors, a clearance mask for difference(), and a
verify[] list of dimensions to confirm on your own motor. The module names come
from the entry, not from the id: 28byj-48 gives part_28byj48(),
part_28byj48_mask(), part_28byj48_mount_holes_mask() and
part_28byj48_info(). Design the pocket from the part's named numbers, then let check
prove it: the mask, not a minkowski() grow, is the pocket; hull() of two
poses is wrong for an insertion sweep.
Before printing. measure(mode="printability", orientation=[180,0,0]) gives
overhang patches with their unsupported reach, the wall-thickness distribution
against the nozzle, islands, and a support estimate. mode="orientation" lists
candidates but names no winner; you decide by which faces must look good.
validate(mode="printability") turns the facts into findings with thresholds.
Change one variable, re-run measure, compare the number to the previous number.
That is the whole inner loop. Use scad_eval to check a derived expression in the
design's own parameter space before you commit to a render: it evaluates expressions
against the file's variables and returns typed results, which is far cheaper than
rendering to find out that lid_inner came back undef.
export_model lastExport only once the numbers and the manifold check pass. STL for printing, 3MF when you want units and metadata preserved.
1. validate(mode="syntax", scad_content=...)
-> errors: [] warnings: [] hints: []
Nothing else runs until errors is empty.
2. reference(topic="fits")
-> pick the slip-fit clearance for a lid over a box; call it 0.2 mm.
3. scad_eval(scad_content=..., expressions=["outer_x", "lid_inner_x"])
-> confirm lid_inner_x == outer_x + 2*clearance before rendering anything.
A typed result of undef here means a variable name is wrong.
4. measure(mode="model", scad_content=...)
-> bbox and dimensions. Check against the intended outside size.
Check watertight == true.
5. measure(mode="parts", scad_content=...)
-> components == 2 (body, lid). If it says 1, the lid fused to the body:
clearance is zero or negative somewhere.
6. validate(mode="geometry", scad_content=...)
-> mesh_health.manifold == true. If false, read mesh_health.issue; the usual
cause is two solids meeting exactly on a face. Add eps and repeat.
7. render(mode="views", grounded=true, views=["isometric"], scad_content=...)
-> read the digest text before the image: confirm the stated bbox matches
step 4 and the lid sits on top rather than intersecting.
8. export_model(format="3mf", ...)What to read in every response, in order: errors, then warnings, then hints
(these carry the specific repair advice for the message class OpenSCAD emitted), then
the payload. On renders and measurements also check cached. A cached: true
response is a previous result replayed; if you edited an included file rather than
the top-level source and the flag says cached, the number you are looking at may
predate your edit. Force a fresh run or clear_cache before believing it.
Every render arrives as a text digest followed by an image. The digest is the part you reason from. It states the units, the up-axis and handedness, the exact camera eye, center, and up vectors, the projection, the view direction in plain language ("camera looks along +Y; +X is right, +Z is up"), the model's bounding box, and the scale in millimetres per pixel.
grounded=true gives orthographic projection and a real scale. The stated
mm/px is true everywhere in the frame, so you can measure a feature by counting
pixels and multiplying. Annotations and a scale bar are drawn into the image.--viewall fits the model to the frame, so a 2 mm cube and a 500 mm cube come out
pixel-identical. Use those images for shape and topology only. If a question is
about size, either read the bbox from the digest or ask for grounded=true.Variables are compile-time, not sequential. OpenSCAD assignments are resolved before evaluation, and the last assignment in a scope wins for the whole scope. This does not work:
h = 10;
if (tall) { h = 20; } // does not change h outside the ifUse a conditional expression instead: h = tall ? 20 : 10;. The same rule means you
cannot accumulate a value in a for loop; build a list and use a function.
difference() order matters. The first child is the base solid and every later
child is subtracted from it. Reordering children silently produces a different shape,
and a difference() whose first child is smaller than the rest yields nothing at
all. When a model renders empty, check this before anything else.
2D and 3D do not mix. square, circle, polygon, offset, and projection
produce 2D geometry. cube, cylinder, sphere, and linear_extrude produce 3D.
Combining them in one boolean gives "Mixing 2D and 3D objects is not supported" and
an unusable result. Extrude first, then combine.
$fn is a global trap. Left unset, curve resolution comes from $fa and $fs.
Setting $fn high at the top of the file applies it to every curved primitive at
once, which makes exports slow and huge. Set $fn locally on the primitives that
need it, or use the server's quality presets, and remember that $fn on a small
hole should be low, not high.
import() needs convexity. Without convexity=10 (or higher for complex
shapes), imported meshes render with holes and inverted surfaces in preview even
though the geometry is fine. The same applies to linear_extrude of complex
profiles and to %import("ref.stl", convexity=10) when ghosting a reference part.
Zero-thickness walls and exact touches. Anything with a dimension of exactly 0, or two solids that share a face precisely, produces geometry CGAL cannot resolve. Epsilon overlaps are not a hack here; they are the correct construction.
| Tool | Use it for |
|---|---|
check | interference, clearance, contact, alignment, motion, rules over named parts; check files (model, quality, frames, parts, checks); exit codes |
validate | syntax, geometry, predicates (+sweep), includes (+BOSL2 lint, autofix), printability |
measure | model, parts, section, mass, probe, features, printability, orientation, anchors; existing STL via mesh |
render | views, section, parts, compare; grounded=true for real scale; look_at, callouts |
scad_eval | typed evaluation of expressions in the design's parameter space |
reference | fits (also by diameter or shaft+bore), fasteners, inserts, bearings, magnets, joints, parts, conventions, cheatsheet, dfm, materials |
export_model | STL, 3MF, AMF, OFF, NEF3, DXF, SVG, PDF, CSG; parts= for a named-object 3MF |
model | `action=create |
check_openscad | binary presence, version, capabilities |
get_libraries | what is installed on this machine, and the exact import line |
get_project_files | .scad files and their references; mode=trace for a constant's dependents |
clear_cache | when a cached result may predate an edit to an included file |
© RobertCoop, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/openscad-design of RobertCoop/openscad-mcp.
Open the folder on GitHubat commit bde0b23
Openscad Design next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Openscad Design this skillRobertCoop/openscad-mcp | 149 | — | ~3.9k | Automated safety check: Pass | MIT | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| MCP Integration for Pluginsanthropics/claude-plugins-official | 38k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Microsoft Skill CreatorMicrosoftDocs/mcp | 1.9k | 3 repos | ~2.1k | Automated safety check: Pass | CC-BY-4.0 | |
| Crush Configurationcharmbracelet/crush | 29k | — | ~3.7k | Automated safety check: Pass | Custom licence |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
MicrosoftDocs/mcp
Create agent skills for Microsoft technologies using official documentation.
charmbracelet/crush
Explains how to configure the Crush coding agent with crushrc or crush.json, covering providers, models, LSPs, MCP servers, hooks, permissions and config precedence.
mksglu/context-mode
Routes large command, file, API and browser output through context-mode tools so only the needed result enters the agent's context, instead of dumping it via Bash.
Categories
Design, modify, and verify 3D-printable parts and assemblies in OpenSCAD through the openscad-mcp tools. Openscad Design is an agent skill from RobertCoop/openscad-mcp. Design, modify, and verify 3D-printable parts and assemblies in OpenSCAD through the openscad-mcp tools.
Openscad Design fits situations like: the user asks for a bracket; other parametric part; wants an existing .scad file changed; exported for printing.
Run `npx skills add RobertCoop/openscad-mcp --skill openscad-design -a claude-code`. Or copy the skill folder (skills/openscad-design in RobertCoop/openscad-mcp) into .claude/skills/openscad-design in your project. Claude Code loads it when a task matches its description.
Run `npx skills add RobertCoop/openscad-mcp --skill openscad-design -a codex`. Or copy the skill folder (skills/openscad-design in RobertCoop/openscad-mcp) into .agents/skills/openscad-design in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add RobertCoop/openscad-mcp --skill openscad-design -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/openscad-design, .gemini/skills/openscad-design, .github/skills/openscad-design and .opencode/skills/openscad-design in your project.
SKILL.md names no scripts, command-line tools or credentials: Openscad Design is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Openscad Design is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Openscad Design: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Microsoft Skill Creator (MicrosoftDocs/mcp, 1.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
RobertCoop (a GitHub user) maintains it in RobertCoop/openscad-mcp, which has 149 GitHub stars. The repository was last updated on September 10, 2026.
Source: RobertCoop/openscad-mcp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.