Skip to main content

Geometry Tools

The cad-geometry-mcp server provides mesh geometry operations powered by manifold-3d, a WASM-compiled C++ geometry engine that runs in-process inside Node.js — no Python, no external process.

Engine: manifold-3d WASM

manifold-3d is compiled to WebAssembly and loaded directly into the Node.js worker. This means:

  • No subprocess overhead — geometry runs in the same process as the MCP server
  • Reliable manifold guarantees — manifold-3d enforces watertight, manifold meshes
  • Fast boolean ops — union, difference, intersection at native speed
  • No Python dependency — unlike OpenSCAD or FreeCAD integrations

Core Tools

ToolDescription
inspect_meshReport vertex count, face count, bounding box, volume, surface area, manifold status
repair_meshFix non-manifold geometry, fill holes, remove degenerate faces
scale_meshScale uniformly or per-axis; optionally fit to max dimension
translate_meshMove mesh by X/Y/Z offset
rotate_meshRotate around X, Y, or Z axis by degrees
boolean_meshUnion, difference, or intersection of two meshes
export_meshWrite mesh to STL or OBJ

Workflow Tools

ToolDescription
split_meshSplit a mesh into parts by cutting planes or connected components
add_dowel_connectorsDetect seams between parts and add mating dowel holes/pins
export_parts_as_3mfPackage multiple parts into a single 3MF archive
analyze_printabilityCheck each part for overhangs, thin walls, minimum feature size

Examples

inspect_mesh

{
"name": "inspect_mesh",
"arguments": {
"input": "/models/ramp.stl"
}
}

Response:

{
"vertices": 15420,
"faces": 30836,
"bounding_box": {
"min": [0, 0, 0],
"max": [320.5, 180.2, 95.0]
},
"volume_cm3": 482.3,
"surface_area_cm2": 1204.7,
"is_manifold": true
}

scale_mesh

{
"name": "scale_mesh",
"arguments": {
"input": "/models/ramp.stl",
"output": "/models/ramp_scaled.stl",
"fit_max_dimension": 256.0
}
}

Scales the mesh so its longest bounding box dimension equals 256 mm, preserving aspect ratio.

Alternatively, scale per-axis:

{
"name": "scale_mesh",
"arguments": {
"input": "/models/ramp.stl",
"output": "/models/ramp_scaled.stl",
"x": 0.5,
"y": 0.5,
"z": 0.5
}
}

split_mesh

{
"name": "split_mesh",
"arguments": {
"input": "/models/ramp_scaled.stl",
"output_dir": "/models/parts/",
"cuts": [
{ "axis": "x", "position": 128.0 },
{ "axis": "x", "position": 64.0 }
]
}
}

Produces /models/parts/part_0.stl, part_1.stl, part_2.stl. Each cut is a planar slice perpendicular to the specified axis.

add_dowel_connectors

{
"name": "add_dowel_connectors",
"arguments": {
"parts_dir": "/models/parts/",
"diameter_mm": 6.0,
"depth_mm": 10.0,
"clearance_mm": 0.2,
"output_dir": "/models/parts_connected/"
}
}

Detects which faces of adjacent parts share a seam, validates surface contact, and subtracts mating dowel cylinders from each part. See Connector System for details on how seam detection works.