Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Mesh2cad

by emirmrkaljevicversion 0.23.0i★ –iRuns on your computer
Registry nameio.github.emirmrkaljevic/mesh2cad

Install

Overview

Description from the maker (original English)

Mesh (STL/OBJ/PLY) to editable STEP, CadQuery, OpenSCAD or FreeCAD, with a fidelity report

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Other

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "mesh2cad": {
      "command": "uvx",
      "args": [
        "mesh2cad",
        "mcp"
      ]
    }
  }
}

Run this in your terminal

claude mcp add mesh2cad -- uvx mesh2cad mcp

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "mesh2cad": {
      "command": "uvx",
      "args": [
        "mesh2cad",
        "mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "mesh2cad": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "mesh2cad",
        "mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account emirmrkaljevic, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Otheri

  • More stars than 0% of the other 18613 servers in this category
  • Published to the registry more recently than 96% of the other 18613 servers in this category
  • Basic checks equal to or better than 100% of the other 18613 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Mesh2cad safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.23.0) reached the registry yesterday.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: Spec Driven Development, Remote Desktop Commander, DECIDE: Migration Discovery Risk Review

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Spec Driven Development

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

by formulahendryEarly↓ 66/wk★ 440Updated 14 months ago

Runs on your computer

Remote Desktop Commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

by desktop-commanderGrowing★ 211Updated 3 days ago

Runs in the cloud✓ desktopcommander.app

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

mesh2cad

If you find this useful, you can support me by getting a SkinToScan pack, my other project. It's a one-time purchase that directly funds my open-source work.

Turn 3D meshes (STL/OBJ/PLY) into real, editable CAD (STEP): fitted planes, cylinders, spheres, cones, and constant-radius fillets instead of triangle soup. CLI + MCP server for AI agents. MIT, pure Python on top of OpenCascade.

Try it in the browser: the example gallery shows four real printer parts in 3D before and after, with the STEP files and the generated CadQuery/OpenSCAD scripts to download.

*Left: 21k-triangle mesh with 0.1 mm noise. Right: the STEP mesh2cad writes: 10 planes + 2 cylinders, max deviation 0.05 mm from the true part.*

30-second quickstart

pip install mesh2cad

mesh2cad convert part.stl -o part.step --report report.md

Open `part.step` in FreeCAD, Fusion, Onshape or any CAD tool: you get real planes, cylinders and fillets you can select and dimension. `report.md` says how close the result is to the mesh, and mesh2cad falls back to faceted output instead of guessing when a fit is bad.

Using an AI agent (Claude Desktop, Cursor, any MCP client)? pip install "mesh2cad[mcp]" and add:

{ "mcpServers": { "mesh2cad": { "command": "mesh2cad", "args": ["mcp"] } } }

Proof on real parts: all 6 tested Original Prusa i3 MK3S parts convert to exact STEP, and all 6 also to an editable CadQuery, OpenSCAD, or FreeCAD script (see Real parts).

Install

pip install mesh2cad              # CLI + STEP

pip install "mesh2cad[mcp]" # + MCP server pip install "mesh2cad[cadquery]" # + run/verify generated CadQuery scripts

OpenSCAD scripts are plain text. Verifying one needs the `openscad` program ([openscad.org](https://openscad.org)); it is not a Python dependency. Without it the `.scad` file is still written.

FreeCAD macros are plain text too. Verifying one needs freecadcmd (the FreeCAD console, from freecad.org). It is not a Python dependency. Without it the .FCMacro file is still written. Ubuntu 24.04 does not ship a freecad apt package, so install the console build and put freecadcmd on PATH.

Use

mesh2cad convert part.stl -o part.step --tol 0.1 --report report.md

mesh2cad report part.stl --json

`--tol` ≈ the noise / accuracy of your mesh in model units (default 0.1 % of the bounding-box diagonal).

Output: STEP + fidelity report: method (exact / faceted-hybrid / faceted), face types, solid validity, two-sided Hausdorff / RMS deviation, volume error, % area per surface type.

Editable parametric CadQuery script

For simple prismatic parts mesh2cad can also write a CadQuery Python script where every dimension is a named parameter, so you change a number and re-run instead of editing B-rep faces:

mesh2cad convert bracket.stl --cadquery bracket.py   # add -o bracket.step to also write STEP

python bracket.py # -> bracket.step

```python

--- parameters ---

base_x = 40.0 # base length (X) base_y = 30.0 # base width (Y) base_t = 6.0 # base thickness (Z) ... hole_1_d = 6.0 # diameter hole_1_x = 0.0 hole_1_y = 0.0 hole_1_csk_d = 12.0 # countersink diameter hole_1_csk_angle = 90.0 # countersink angle

Make the hole 2 mm bigger: `mesh2cad edit bracket.py --set hole_1_d=8 --in-place -o bracket.step`, or set `hole_1_d = 8.0` and run the script yourself. A plate or block whose four vertical corners share one radius also gets `fillet_r` and `.edges("|Z").fillet(fillet_r)`, so the same edit grows the round. A quarter-torus fillet on a vertical boss or hole is a parameter of that feature: `boss_1_fillet` where a straight boss meets the top face, `hole_1_rim_r` on the top rim of a hole, `hole_1_bot_rim_r` on the bottom rim, and `hole_1_floor_r` where a blind hole's floor meets the wall. `mesh2cad edit part.py --set boss_1_fillet=3` rebuilds that round. A box with all twelve edges filleted at one radius gets `edge_fillet_r` and `.edges().fillet(edge_fillet_r)`. The box size stays `base_x`, `base_y`, and `base_t`. `mesh2cad edit part.py --set edge_fillet_r=4` rebuilds every round. An Ø8 through-hole whose wall clears those rounds is cut after the fillet (`hole_1_d` and its position). A straight boss on the top face whose wall clears those rounds is fused after the fillet (`boss_1_d`, `boss_1_h`, and its position).

A hole or boss on a side face uses the same kind of parameter. This is the block below (60×40×36, an Ø8 hole through X, an Ø6 hole 12 deep opening on +Y, an Ø10 boss 8 tall on +X):

boss_1_d     = 10.0  # diameter

boss_1_h = 8.0 # height from the +X face boss_1_y = 10.0 boss_1_z = 8.0 hole_1_d = 8.0 # diameter (axis X) hole_1_y = 0.0 hole_1_z = -6.0 hole_2_d = 6.0 # diameter (axis Y) hole_2_x = -12.0 hole_2_z = 8.0 hole_2_depth = 12.0 # blind depth from the +Y face

Set hole_1_d = 10.0 and run the script again. The volume drops by π(5²−4²)·60 mm³, the analytic change for that through hole.

A part that is one straight extrusion of a 2D outline is the same kind of script. An L, a notched plate, or a block with a slanted face, extruded along X, Y, or Z, becomes extrude_len plus an outline list. plug-aligner (the printed part in the table below, 7.3×17.7×5.5 mm) is a 5.5 mm extrusion along Z of an eight-point outline with a rectangular slot:

extrude_len = 5.5  # length along Z

extrude_0 = 0.0 # start along Z

outline in the XY plane, (x, y)

outline = [ (0.0, 0.0), (6.1, 0.0), (6.1, 6.95), (7.3, 6.95), (7.3, 10.75), (6.1, 10.75), (6.1, 17.7), (0.0, 17.7), ]

through opening in the outline

cutout_1 = [ (0.45, 1.85), (5.65, 1.85), (5.65, 15.85), (0.45, 15.85), ]

Set extrude_len = 7.5 and the part is 2 mm thicker. A corner moves when one pair in outline changes. A round through-hole on an extrusion is still hole_1_d, with hole_1_y and hole_1_z when the hole runs along X. cutout_1 is a polygonal slot that goes all the way through. An extrusion along Y stores the outline as (x, z); along X, as (y, z).

Supported: a Z-up box/plate base, rectangular pads on the top face, holes along X, Y, or Z (through, blind, countersunk when the axis is vertical, and counterbored on any of those axes), bosses along X, Y, or Z (straight, and drafted or chamfered when the axis is vertical), that one vertical corner radius, one radius on all twelve edges of a rectangular box (edge_fillet_r), a through-hole cut after that fillet when its wall clears the rounds, a straight boss fused after that fillet when its wall clears the rounds, a quarter-torus fillet on a vertical boss or hole (boss_N_fillet, hole_N_rim_r, hole_N_bot_rim_r, hole_N_floor_r), and one straight extrusion of a 2D outline along X, Y, or Z, including a polygonal through-slot and round through-holes. A counterbored hole is hole_N_d for the through diameter, hole_N_cbore_d for the large diameter, and hole_N_cbore_depth for how far that large diameter goes in from the face it opens on. A part that is a few of those extrusions is their intersection, or one of them minus straight cuts along the other axes. Two or three outlines use extrude_z_len / outline_z (and the same for X and Y); a single outline keeps extrude_len and outline. A cut is cut_1_len, cut_1_0, and cut_1. Up to four faces tilted to X, Y, and Z are planar clips (clip_1_x, clip_1_y, clip_1_z, clip_1_d). The box script is the one that is written when it already reproduces the mesh, so a plain plate stays base_x / base_y / base_t and does not become an outline list. A rectangular plate with a counterbored hole stays on those base parameters. Values are rounded to clean numbers (5.997 → 6.0) when that stays within --tol. Before writing, the script is executed and compared with the mesh (needs cadquery installed); if the part is outside this vocabulary or the script deviates, nothing is written and the command exits with code 2 and the reason. Use STEP output for everything else.

Editable parametric OpenSCAD script

The same parts can be written as OpenSCAD, which is what the 3D-printing Customizer on Thingiverse and Printables edits. Names and values match the CadQuery script. --openscad and --cadquery can be combined, and -o still writes STEP.

mesh2cad convert plate.stl --openscad plate.scad

openscad -o plate.stl plate.scad

A 40×30×6 plate with a Ø10 hole comes out as below, plus a short header. Before:
// --- parameters ---

/* [Base] */ // base length (X) base_x = 40.0; // base width (Y) base_y = 30.0; // base thickness (Z) base_t = 6.0; base_cx = 0.0; base_cy = 0.0; // bottom face height base_z0 = -3.0;

/* [Holes] */ // diameter hole_1_d = 10.0; // [0.2:0.1:30] hole_1_x = 0.0; hole_1_y = 0.0;

/* [Hidden] */ $fn = 96; // circle segments

// --- model --- module mesh2cad_part() { difference() { translate([base_cx, base_cy, base_z0 + base_t / 2]) cube([base_x, base_y, base_t], center=true); translate([hole_1_x, hole_1_y, base_z0 - 1]) cylinder(h=base_t + 2, d=hole_1_d); } }

mesh2cad_part();

After, the hole is 2 mm bigger: one number changes, then re-render:

hole_1_d = 12.0; // [0.2:0.1:30]

Re-render (F6) and export STL. A drafted boss is a cylinder with r1/r2, a chamfer or countersink is the same, and the four vertical corners of a rectangular base are offset(r=fillet_r) on a smaller square, then extruded. A box with every edge rounded is edge_fillet_r: three cubes for the flat faces, twelve cylinders for the edges, and eight spheres for the corners. A through-hole that clears those rounds is a cylinder subtracted after that union. A boss that clears those rounds is a cylinder added after that union. A boss-base fillet, a hole-rim round, and a blind-floor fillet are a rotate_extrude() of a square with a quarter circle taken out of it, using boss_1_fillet, hole_1_rim_r, or hole_1_floor_r. The profile overlaps the sharp solid by 0.02 mm so the union stays closed. A hole or boss whose axis is X or Y is the same cylinder, turned with rotate so it points along that axis; its parameters are the diameter and the two coordinates of the axis (hole_1_y / hole_1_z for an X hole). A straight extrusion is linear_extrude(extrude_len) of polygon(outline), with polygon(cutout_1) subtracted in 2D when the outline has a slot. An extrusion along Y or X is that solid turned so the outline sits in the XZ or YZ plane. A counterbored hole is a secon

Only the beginning is shown; read the rest in the repo

Ask PopNx