NativeCAD MCP server

The tool reference

Everything an agent can call on nativecad-mcp 0.27.0: 188 tools, grouped by subsystem, each with the input schema the server actually validates against — argument by argument, required and optional, with units, bounds and defaults.

This page is generated from the running server, not written. The modeling surface is derived (one tool per commands/schema op), so a hand-kept list would describe a product nobody receives. Every name, sentence and schema below is the same JSON a connected model is handed by tools/list, and the conventions and error codes are what cad_server_info reports about itself.

188tools
15subsystems
40read-only
26error codes

Conventions

There is no unit argument anywhere on this server. A number is millimetres or radians by position, and every tool below inherits these:

Length
millimetre
Angle
radian
Axes
right-handed, +Z up
Profiles
open point lists; outer loops CCW, hole loops CW
Body references
"<opId>" is body 0; "<opId>#<n>" addresses body n of a multi-body result

Profile winding is the single most common failure: a hole loop wound counter-clockwise either removes no material or produces a non-watertight solid, and the refusal you get back talks about watertightness rather than about winding. There is no native circular-hole profile — approximate a circle with a regular N-gon (N = 24–32 keeps the volume error under 1%), sampled clockwise for a hole.

Errors are refusals, and they tell you what to do

A failing call does not throw and does not return prose. It returns one envelope with a code from this closed vocabulary, a hint written for the caller, and recoverable — the honest answer to “is calling me again, with different arguments, worth it?”. A kernel refusal (E_GEOMETRY) is recoverable because a smaller radius often succeeds; an unsupported feature is not, and retrying it just burns turns.

CodeRetry worth it?What it means, and what to do
E_ASSEMBLY_UNSOUNDyesThe exported set is not a sound assembly: a part floats, interpenetrates another, or does not reach the floor. details.assembly.parts[] names each one with the measurement. Move or resize the offending part (cad_transform / cad_move_face) and export again — or drop "strict" to export it anyway with the same report attached as a warning.
E_BODY_IN_USEyesA later op in the same document references this body (or sketch), so removing it would silently remove that op's result as well. Delete the dependents listed in details.dependents first, last to first, or leave the body and build a fresh one.
E_CANCELLEDyesThis operation was cancelled at the client's request. The kernel worker was terminated to interrupt it and the document was replayed from its op journal, so every body built before the cancelled call is still addressable, and any partially-written output file was removed. Nothing needs repairing; re-issue the call (with a smaller request, if it was cancelled for being slow) when you want it.
E_CONFLICTyesThe request conflicts with the current model state. Re-read the state — it changed since you last looked — and rebuild the request from what is there now.
E_CONTEST_OFFLINEyesThe contest site could not be reached. Nothing was kept on disk and the build is still in this session — check the connection (or CADSOLVER_MCP_CONTEST_ENDPOINT) and call cad_contest submit again.
E_CONTEST_REJECTEDyesThe contest site refused the entry; details.status and details.reasons say why. Nothing was kept on disk and the build is still in this session — fix what it names and call cad_contest submit again.
E_CONTEST_SCOPEyesA contest build can only leave this machine as a contest entry: call cad_contest({action:"submit", title:"…", agree:true}) to enter it, or cad_contest({action:"end"}) to close the scope. To keep your own copy, register free at https://featureboard.ai/register?source=nativecad and activate the key with cad_license.
E_EVAL_CONSENT_REQUIREDyesThis session is unlicensed, so the evaluation runs under an agent-issued evaluation approval (LICENSE §2). Ask the human for their acceptance criteria and their agreement to the consent statement in details.consentStatement, then call again with criteria and consent. Registering a free key at https://featureboard.ai/nativecad/web/pricing.html removes the requirement entirely.
E_FURNITURE_UNSOUNDyesThe furniture ruleset raised an error-severity finding: a leg that reaches nothing, a member under its material's thickness floor, or an envelope outside the stated tolerance. details.furniture.rules[] names the rule, its band and its basis; each finding names the parts. Fix the geometry (cad_transform / cad_move_face) or correct the stated figures, and review again — or drop "strict" to get the same report as warnings.
E_GEOMETRYyesThe CAD kernel refused the operation. Change the parameters (smaller radius, thicker wall, different edge selection, coarser tolerance) and retry — do not repeat the identical call.
E_INTERNALnoUnexpected server fault — this is a bug in NativeCAD, not in your request. Report the tool name and arguments; retrying is unlikely to help.
E_INVALID_ARGSyesThe arguments did not match the tool's inputSchema. details.issues names the exact JSON path that failed — fix that path and call again.
E_IOyesA file could not be read or written. Check the path, and that the directory exists and is writable.
E_KERNEL_CRASHEDyesThe kernel worker died during this operation and was restarted with the document replayed from its op journal — every body built before this call is still addressable. Retry the call; if it dies again, the op itself is the trigger and is worth reporting.
E_KERNEL_OOMyesThe kernel worker hit its memory ceiling and was restarted; the document survived and was replayed. Retry with a coarser "tolerance" or a smaller "maxTriangles", export fewer bodies at once, or raise CADSOLVER_MCP_KERNEL_WORKER_MAX_OLD_MB if this machine has the headroom.
E_LICENSE_REQUIREDyesThis tool needs a licence key. Register free at https://featureboard.ai/register?source=nativecad, then call cad_license({action:"activate", key:"CSLV1-…"}) and retry. The evaluation loop (cad_evaluate and cad_eval_*) works without a key.
E_LIMITyesA budget was exceeded (size, element count, or step count). Reduce the resolution or scope of the request.
E_MULTI_BODY_HANDLEyesThis reference names a SET of bodies (a pattern, a split, a multi-body import) and this argument takes exactly one. Address a single body as "<id>#<n>" (0-based) — details.choices lists them — or use an aggregate tool (cad_mass_properties, cad_body_topology, cad_dfm_check, cad_export_body), which read the whole group.
E_NOT_FOUNDyesThe referenced id does not exist. List the current model state and use an id from that listing.
E_PRECONDITIONyesThe server is not in a state where this tool can run. Perform the missing setup step first, then retry.
E_STEP_SCHEMA_UNSUPPORTEDyesThe chosen STEP schema cannot carry part of this export (PMI and tessellation are AP242-only; AP203 ed1 has no colours, layers or validation properties). details.dropped / details.refused / details.leaked name what. Export as schema "ap242e2", or drop strict:true to write without it (the omission is reported).
E_TIMEOUTyesThe operation ran out of time. Retry with a coarser tolerance or a smaller model.
E_UNKNOWN_TOOLyesCall tools/list and use a name from that listing. Do not guess tool names.
E_UNSUPPORTEDnoThis build does not support the requested feature. Take a different modelling approach; retrying will not help.
E_VERSION_EXISTSyesThis document already has a version with that name. Pick another name — a version is never overwritten — or cad_restore the existing one if that is what you meant.
E_VERSION_UNKNOWNyesNo version by that id or name. Call cad_versions {document} for the versions this session holds (ids are "v1", "v2", …; names are per document) and use one from that listing. Versions are journal-backed, but cad_session_reset discards them with the documents.

Envelope: { "error": { "code", "message", "hint", "recoverable", "details?", "tool?" } } — delivered as a normal tool result with isError: true; the envelope is also in structuredContent.

The tools


188 tools

The read / write / destructive badge is the server's own readOnlyHint / destructiveHint annotation, not a guess from the name.

Primitives & sketches · 15

The shapes you start from: analytic solids, a planar sheet, and the sketch composer that turns a profile into geometry the rest of the surface can act on.

cad_box write Box

Rectangular block, axis-aligned.

Full description

A box of size dx*dy*dz (mm), min-corner at origin (default [0,0,0]). Call cad_help({tool:"cad_box"}) for the rest.

ArgumentTypeMeaning & bounds
dx requirednumber—
> 0
dy requirednumber—
> 0
dz requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_cylinder write Cylinder

Right circular cylinder, axis +Z from its base.

Full description

To put a cylinder ON a face of an existing body use cad_pad with a 16–32-gon outer; use cad_cylinder for standalone parts or as a boolean tool on plain faces. Radius r, height h (mm), base centred at origin (default [0,0,0]). Call cad_help({tool:"cad_cylinder"}) for the rest.

ArgumentTypeMeaning & bounds
h requirednumber—
> 0
r requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_cone write Cone

Right circular cone, axis +Z from its base.

Full description

Base radius r, height h (mm), apex on +Z above origin (default [0,0,0]). Call cad_help({tool:"cad_cone"}) for the rest.

ArgumentTypeMeaning & bounds
h requirednumber—
> 0
r requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_frustum write Frustum

Conical frustum (truncated cone), axis +Z from its base.

Full description

Base radius r0, top radius r1, height h (mm); either radius may be smaller than the other. Call cad_help({tool:"cad_frustum"}) for the rest.

ArgumentTypeMeaning & bounds
h requirednumber—
> 0
r0 requirednumber—
> 0
r1 requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sphere write Sphere

Sphere.

Full description

Radius r (mm), centred at origin (default [0,0,0]). Call cad_help({tool:"cad_sphere"}) for the rest.

ArgumentTypeMeaning & bounds
r requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_torus write Torus

Torus (donut), axis +Z.

Full description

Major radius R (centre of tube to torus axis) and minor radius rmin (tube radius), R > rmin, mm. Call cad_help({tool:"cad_torus"}) for the rest.

ArgumentTypeMeaning & bounds
R requirednumber—
> 0
rmin requirednumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_polyhedron write Polyhedron

Regular polyhedron.

Full description

kind selects the solid (tetrahedron/hexahedron/octahedron/dodecahedron/icosahedron/trapezohedron10); R is the circumradius (mm), centred at origin. Call cad_help({tool:"cad_polyhedron"}) for the rest.

ArgumentTypeMeaning & bounds
R requirednumber—
> 0
kind requiredenum—
one of "tetrahedron", "hexahedron", "octahedron", "dodecahedron", "icosahedron", "trapezohedron10"
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_planar_sheet write Planar sheet

Build a flat plate as an OPEN SHEET body (not a solid) from a planar profile — the input thicken consumes.

Full description

profile is a CCW, NOT-closed [[u,v],...] loop (mm) in plane's frame — the same convention extrude's outer uses, and the same plane ({origin,xAxis,yAxis} or a datum_plane id) sketch_begin/extrude take. Call cad_help({tool:"cad_planar_sheet"}) for the rest.

ArgumentTypeMeaning & bounds
profile requirednumber[][]>=3 [x,y], unclosed
≥ 3 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
plane optionalobject | stringframe or datum id
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_create_sketch write Create sketch

Draw a closed (or open, for rib) 2D sketch on a plane: lines/arcs/circles/points/polylines, mm and radians.

Full description

Returns a "sketch" handle for cad_extrude_profile's/cad_revolve_profile's {sketch:"<handle>"} profile field. Composes this kernel's sketch_begin+sketch_entity+sketch_end into one call. Call cad_help({tool:"cad_create_sketch"}) for the rest.

ArgumentTypeMeaning & bounds
entities requiredobject[]One or more 2D entities, added in order, in thi…
≥ 1 items
document optionalstringhandle or "new"
length ≥ 1
plane optionalobject | stringframe or datum id

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_dice_pips write Engrave dice pips

Engrave classic 1-6 die pips into a blended cube.

Full description

Retires of. Optional spread/pipRadius/pipDepth override defaults derived from face size. Purpose-built for a d6; for general text engraving use engrave_text. Example: {"op":"dicePips","id":"die","of":"rounded"}

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
pipDepth optionalnumber—
> 0
pipRadius optionalnumber—
> 0
spread optionalnumber—
> 0
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_padstack write Padstack

Build a PCB padstack — plated through hole, back-drill, microvia stack, pads, antipads, fill, cap plating, laminate and mask — as one watertight body PER MATERIAL, sharing its interface faces, with a closed-form volume for every body.

Full description

Call cad_help({tool:"cad_padstack"}) for the rest.

ArgumentTypeMeaning & bounds
stackup requiredobject[]—
≥ 1 items · ≤ 64 items
vias requiredobject[]—
≥ 1 items · ≤ 64 items
cell optionalobject—
cell.pitchnumber[]—
exactly 2 items
cell.ninteger[]—
exactly 2 items
cell.periodicboolean—
document optionalstring—
length ≥ 1
keepFailed optionalboolean—
laminateExtent optionalnumber[]—
exactly 2 items
mask optionalobject—
mask.thicknessnumber—
> 0
mask.materialstring—
mask.openingnumber—
> 0
mask.sidesenum—
one of "top", "bottom", "both"
resin optionalboolean | object—
suppressed optionalboolean—
voids optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_trace_section write Trace section

Build a transmission-line cross section — trapezoidal trace(s) from an etch factor or explicit top/bottom widths, foil + plating as two Cu bodies, ground and dielectric slabs, an optional conformal solder mask, and a neat-resin window between a stripline pair — as one watertight body per material/role, extruded alon…

Full description

g a straight… Call cad_help({tool:"cad_trace_section"}) for the rest.

ArgumentTypeMeaning & bounds
conductors requiredobject[]1 or 2 conductors…
≥ 1 items · ≤ 2 items
dielectrics requiredobjectthe dielectric(s) around th…
dielectrics.belowobject—
dielectrics.aboveobject—
bandFill optionalboolean | objectkind "stripline" only: fill…
document optionalstringhandle or "new"
length ≥ 1
ground optionalobjectthe ground plane…
ground.gapnumberkind "cpw" only: the cleara…
ground.thicknessnumberthe ground plane thickness…
> 0
ground.widthnumberthe ground plane / dielectr…
> 0
keepFailed optionalboolean—
kind optionalenum"microstrip"…
one of "microstrip", "stripline", "cpw", "diffpair"
length optionalnumber—
> 0
mask optionalobjecta conformal solder mask ove…
mask.thicknessnumberthe conformal solder mask t…
> 0
mask.conformalbooleandocuments the intent; the m…
mask.cornersenumthe mask's outer corners ov…
one of "mitre", "round"
mask.materialstringdefault "LPI"
resinWindow optionalobjectthe neat-resin region betwe…
resinWindow.widthnumbermm — must equal spacing…
> 0
resinWindow.materialstringdefault "resin"
route optionalobjecta swept route instead of `l…
sectionOrigin optionalnumber[][x,y,z] mm
exactly 3 items
spacing optionalnumber—
> 0
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_glass_weave write Glass Weave

Build the periodic woven-glass unit cell of a PCB laminate — warp and weft yarn bundles, the resin they sit in and an optional Cu trace at an angle — as one tagged B-rep body per yarn / resin / trace that exports to one STEP and meshes.

Full description

Call cad_help({tool:"cad_glass_weave"}) for the rest.

ArgumentTypeMeaning & bounds
cells optionalinteger[][nWarp, nWeft] — how many…
exactly 2 items
clearance optionalnumbermm, >= 0
≥ 0
document optionalstringhandle or "new"
length ≥ 1
fibreFraction optionalnumberthe glass fraction inside a…
> 0 · ≤ 1
keepFailed optionalboolean—
pattern optionalenumthe interlacing — 'plain'…
one of "plain"
resin optionalobject | stringthe resin the glass sits in
section optionalenumthe yarn bundle's section…
one of "lenticular", "ellipse"
sectionNodes optionalintegersegments per arc of the yar…
≥ 4 · ≤ 64
spread optionalboolean—
spreadFactor optionalnumber—
> 0
stationsPerPitch optionalintegerpath stations per pitch of…
≥ 4 · ≤ 128
style optionalobject | stringthe glass fabric.
suppressed optionalbooleantrue = not built
trace optionalboolean | objecta copper trace lying ON the…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_gear write Gear

Build an involute gear: external or internal, spur, helical or herringbone, or a straight or spiral bevel, with print-in-place backlash cut into the teeth.

Full description

Call cad_help({tool:"cad_gear"}) for the rest.

ArgumentTypeMeaning & bounds
addendumCoefficient optionalnumber—
> 0
allowUndercut optionalboolean—
backlashPerFlank optionalnumber—
bore optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
faceWidth optionalnumber—
> 0
hand optionalenumhelix hand; an external pair needs OPPOSITE han…
one of "right", "left"
helixDeg optionalnumber—
herringbone optionalboolean—
keepFailed optionalboolean—
kind optionalenumexternal, internal (ring gear), bevel…
one of "external", "internal", "bevel", "spiral_bevel", "hypoid"
mateTeeth optionalinteger—
≥ 1
module optionalnumber—
> 0
offset optionalnumber—
origin optionalnumber[][x,y,z] mm
exactly 3 items
pressureAngleDeg optionalnumber—
> 0
process optionalstringprocess name for the minimum-module gate…
profileShift optionalnumber—
rimWidth optionalnumber—
> 0
rootFillet optionalnumber—
sagitta optionalnumber—
> 0
sections optionalinteger—
≥ 1
shaftAngleDeg optionalnumber—
> 0
spiralAngleDeg optionalnumber—
suppressed optionalbooleantrue = not built
teeth optionalinteger—
≥ 1
tipClearance optionalnumber—
tipRelief optionalobjecttip relief: the outer band of each flank shaved…
tipRelief.depthnumbermm removed at the tip
> 0
tipRelief.heightnumbermm of radial ramp below the tip…
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sketch_solve write Solve a constrained 2D sketch

Solve a constrained 2D sketch (rough entities, or a cad_create_sketch handle as sketch) plus constraints: exact coordinates, DOF left and, if unsolvable, fewest constraints to delete.

Full description

Refs: an entity id or a point on it (L1.p0, L1.p1, L1.mid, A1.start, A1.end, C1.center); dimensions take a value (mm, rad) or driven:true to measure. Call cad_help({tool:"cad_sketch_solve"}) for the rest.

ArgumentTypeMeaning & bounds
constrain optionalobject[]With sketch: constraints (same shape as constraints) ADDED to the ones stored on it — stored only if the sketch still solves; an id already stored replaces that constraint.
≤ 256 items
constraints optionalobject[]What must hold. Each names its entities by ref; dimensions carry a value (mm, or radians for angle) unless driven:true. An empty list is legal (reports the free DOF). With sketch: for this call only, never stored.
≤ 256 items
drag optionalobjectMove the SOLVED sketch: pull one point toward a target. Everything else moves as little as the constraints allow; dof is unchanged. The reply adds drag {point, achieved, residual}.
drag.pointstringThe point to drag: a point id or a point ref (L1.p1, L1.mid, A1.start, C1.center).
length ≥ 1
drag.tonumber[]Target [x, y], mm. Out of reach: the point stops as close as the constraints allow.
exactly 2 items
drag.keepBranchbooleanWhen the drag would flip a tangent / perpendicular / side to its other branch: stay on the starting branch and stop short (drag.residual > 0, a warning names the constraint) instead of returning the flipped sketch. Default false.
drag.pinsstring[]Point refs to hold exactly where the solved sketch has them during the drag.
≤ 64 items
entities optionalobject[]The sketch geometry in plane coordinates (mm), where you roughly want it — the solve moves it. point {p}, line {p0, p1}, circle {center, r}, arc {center, r, a0, a1} (radians, swept CCW a0 to a1).
≥ 1 items · ≤ 128 items
options optionalobject—
options.acceptTolnumberResidual norm that counts as solved (default 1e-7).
> 0 · ≤ 0.001
options.maxIterintegerLevenberg-Marquardt iteration cap (default 100).
≥ 1 · ≤ 1000
sketch optionalstringA cad_create_sketch "sketch" handle, instead of entities: solve the sketch in the document. Its entities are e1, e2, … in drawing order (a polyline eN as its segments eN_1, eN_2, …); corners it joins are held (_j1, _j2, …).
length ≥ 1
unconstrain optionalstring[]With sketch: ids of STORED constraints to delete (applied before constrain). An id that is not stored is refused; the deletion is stored only if the sketch still solves.
≤ 256 items
write optionalbooleanWith sketch: write the solved coordinates into the document and rebuild everything that uses the sketch (waits for a write in flight). Default false: read-only.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

Returns no structured fields.

Exactly one of these argument shapes: status + dof + freeEntities + conflictSet + redundant + entities + dimensions + iterations + residual + geometryApplied + conflictSearch + warnings + units — or — spillPath + bytes + budgetBytes — or — error.

Features · 38

Everything that adds or removes material from an existing body - the verbs a machinist or a moulder would recognise, each one leaving a watertight solid behind.

cad_pad write Pad

Extrude a profile that lies ON a face and merge it into that solid (boss or, with negative length, pocket) — one body, no boolean needed.

Full description

Retires of, publishes ONE merged body under this op's id. Call cad_help({tool:"cad_pad"}) for the rest.

ArgumentTypeMeaning & bounds
face requiredobject | stringa face selector: raw STEP id | { normal:[x,y,z] } | { normal:[x,y,z], through:[x,y,z] } | { surface:"cylinder" } | { ref:"<provenance tag>" }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
extent optionalobjectEND CONDITION (CADSF-101462): a pad up to a face. Symmetric / two-sided / through-all / tapered features are extrude with operation join or cut (PAD_EXTENT_NEEDS_EXTRUDE)
extent.bodystringup_to_body: the body to pad up to; up_to_face: the body face is on (default of)
length ≥ 1
extent.faceobject | stringup_to_face: the end face (planar, parallel to the host face)
extent.flipbooleanup_to_next / up_to_body: look INTO the material (a pocket)
extent.offsetnumberup_to_*: mm past the face (+) or short of it (-)
extent.typeenumblind (length) | up_to_next | up_to_face | up_to_body — resolved to ONE signed length along the face normal
one of "blind", "up_to_next", "up_to_face", "up_to_body"
flush optionalboolean—
flushTol optionalnumber—
> 0
keepFailed optionalboolean—
length optionalnumbera signed number (must not be exactly 0) — a signed field where a negative value is meaningful (a pad with a negative length cuts a pocket) rather than an error; extrude depth (extrudeDepth) is the other
outer optionalarray | objectone closed loop: [[x,y],...] points, one {circle}/{slot}/{rect} primitive, or a {start,segments} line/arc loop (winding then inferred by containment)
profile optionalobjectthe pad/pocket footprint: { sketch: "<id>" } (read in the sketch's plane) or { outer } (read in the host face's plane)
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

Exactly one of these argument shapes: outer — or — profile. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_extrude_profile write Extrude profile

Extrude a closed 2D profile into a prism (a straight prism in free space — use pad instead when the profile lies ON an existing face).

Full description

End conditions, taper and join/cut/intersect: extent + operation + of. Call cad_help({tool:"cad_extrude_profile"}) for the rest.

ArgumentTypeMeaning & bounds
depth optionalnumberextrude depth in mm, signed: positive sweeps along the profile plane's normal, negative the other way (must not be exactly 0)
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
extent optionalobjectEND CONDITION (CADSF-101462) — blind (default: depth, signed) | symmetric (depth = TOTAL length, half each side) | two_sides (side 1 depth, side 2 depth2 the other way) | through_all (past every body ahead) | up_to_next (first parallel planar face the profile meets) | up_to_face (face) | up_to_body (body); plus taper / taper2 and up_to_* offset. Refusals are coded: EXTRUDE_UPTO_FACE_NOT_REACHED, EXTRUDE_UPTO_FACE_NOT_PARALLEL, EXTRUDE_TAPER_COLLAPSE, ... (entry.extent reports t0/t1)
extent.bodystringup_to_body: the body to extrude up to; up_to_face: the body face is on
length ≥ 1
extent.depth2numbertwo_sides: the second side's length (mm), opposite to depth
> 0
extent.faceobject | stringup_to_face: the end face (planar, parallel to the sketch plane), on body (or of)
extent.flipbooleanthrough_all / up_to_next / up_to_body: run against the plane normal
extent.offsetnumberup_to_*: mm past the face (+) or short of it (-)
extent.tapernumberdraft angle (radians, |a| < pi/2) of side 1 — positive shrinks the profile away from the sketch plane; walls stay exact (planes, cones)
extent.taper2numbertwo_sides / symmetric: side 2's draft angle (symmetric defaults to taper)
extent.typeenumblind (default: depth, signed) | symmetric (depth = TOTAL length, half each side) | two_sides (side 1 depth, side 2 depth2 the other way) | through_all (past every body ahead) | up_to_next (first parallel planar face the profile meets) | up_to_face (face) | up_to_body (body)
one of "blind", "symmetric", "two_sides", "through_all", "up_to_next", "up_to_face", "up_to_body"
holes optionalarray | object[]hole loops: each is [[x,y],...] (CW), one {circle}/{slot}/{rect} primitive or a {start,segments} line/arc loop (winding inferred)
keepFailed optionalboolean—
of optionalstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
operation optionalenumnew (default: a separate body) | join | cut | intersect — combined with of by the same boolean as cad_boolean_union / subtract / intersect, under this op's id
one of "new", "join", "cut", "intersect"
orient optionalboolean—
outer optionalarray | objectone closed loop: [[x,y],...] points, one {circle}/{slot}/{rect} primitive, or a {start,segments} line/arc loop (winding then inferred by containment)
plane optionalobject | stringa sketch/inline-profile plane: either an explicit frame object or the id string of an earlier datum_plane
profile optionalobjectthe closed profile to extrude: { sketch: "<id>" } or { outer, holes? } (mm). Each loop is [[x,y],...] (outer CCW, holes CW) OR one native primitive — {circle:{cx,cy,r}} (d/diameter accepted for r) | {slot:{x1,y1,x2,y2,width}} (the two END-ARC CENTRES; end radius = width/2) or {slot:{cx,cy,length,width,angle}} (length is OVERALL tip-to-tip, >= width; angle in RADIANS) | {rect:{x,y,w,h,cornerRadius}} (x,y is the CENTRE) — OR a free-form line/arc loop {start:[x,y], segments:[{to} | {to,center,ccw}]} (CADSF-2606; arcs exact, winding inferred)
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

Exactly one of these argument shapes: outer — or — profile. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_revolve_profile write Revolve profile

Revolve a 2D profile about the Z axis (shafts, bosses, hubs, pulleys, flanges).

Full description

A native primitive is accepted as the silhouette: {"circle":{"cx","cy","r"}} in the r-z half-plane sweeps an EXACT TORUS (needs cx > r), and {"slot"}/{"rect"} give a rounded / plain ring. Call cad_help({tool:"cad_revolve_profile"}) for the rest.

ArgumentTypeMeaning & bounds
profile requiredarray | objectthe profile to revolve abou…
angle optionalnumbersweep angle in RADIANS, (0…
> 0 · ≤ 6.283185308179586
arcs optionalobject[]marks profile segments as c…
≥ 1 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
orient optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sweep_profile write Sweep profile along a path

Sweep a closed section along an analytic path — rigid, or scaling/twisting/following guide curves.

Full description

The section is a closed loop of LINE and ARC segments drawn in its own 2-D (a,b) frame, with the path running through (a,b)=(0,0) and +b along the path plane's normal. Call cad_help({tool:"cad_sweep_profile"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredobjectthe analytic path: a coplanar polyline with corner fillets, or explicit line/arc legs. Straight and circular-arc legs only — there is no B-spline path in this kernel.
section requiredobjecta closed line/arc loop drawn CCW in the section's own (a,b) frame, in millimetres
section.segmentsobject[]segments in order; the last one must close back onto start. Two suffice when the loop curves (a circle is two semicircles); three otherwise.
≥ 2 items
section.startnumber[]the loop's first point [a,b] (mm) in the section frame
exactly 2 items
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
guideMode optionalenumwhich half of the guides' similarity fit to apply: "both" (scale + rotation, the default), "scale" (size only — the section keeps its orientation), "twist" (rotation only — the section keeps its size), or "none" (guides are measured and reported but do not move the section).
one of "both", "scale", "twist", "none"
guides optionalnumber[][][]guide curves: 3D polylines [[x,y,z],...] the section follows. Each guide must be OFFSET from the path and must cross every section plane along it. At each station the least-squares similarity (uniform scale + rotation) carrying every guide's starting offset onto its current one is applied to the section, so ONE guide makes the surface pass exactly through it and several split the difference. Anchor a guide ON the section's outline at the start if you want the finished face to contain it.
≥ 1 items
holes optionalobject[]inner loops subtracted from the section — a swept TUBE (bent pipe). Wind each one the opposite way from the outer section.
≥ 1 items
keepFailed optionalboolean—
maxBandAngle optionalnumber—
> 0
scale optionalnumber | object | stringvariable profile: how the section's SIZE changes along the path. A number scales it uniformly; a law s(t) varies it with normalised arc length; { a, b } scales the section's two axes independently. Must stay strictly positive — 0 collapses the section onto the path and negative turns it inside out, both refused.
sectionTolerance optionalnumber—
> 0
stations optionalinteger—
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
twist optionalnumber | stringtwist: rotation of the section about the path tangent, in RADIANS. Positive is CCW seen looking along the direction of travel.
up optionalnumber[][x, y, z] in millimetres
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_tube_sweep write Tube sweep

Sweep a closed section along a NON-PLANAR 3-D path (helix, 3-D polyline, B-spline) — coil spring, wound tube, routed pipe.

Full description

Use it, not sweep, once the path leaves a plane: sweep fits ONE plane through its path and refuses the first point off it (reasonCode "sweep_path_not_planar"), and has no helix. Call cad_help({tool:"cad_tube_sweep"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredobjectthe 3-D path: { helix: { radius, pitch, turns, hand } }, { points: [[x,y,z], ...] } (a 3-D polyline, coplanarity NOT required) or { bspline: { ctrl, degree, samples } }. A PLANAR line/arc path belongs to sweep, which builds it exactly; this op is the non-planar one.
section requiredobjecta closed line/arc loop drawn CCW in the section's own (a,b) frame, in millimetres
section.segmentsobject[]segments in order; the last one must close back onto start. Two suffice when the loop curves (a circle is two semicircles); three otherwise.
≥ 2 items
section.startnumber[]the loop's first point [a,b] (mm) in the section frame
exactly 2 items
bandStations optionalinteger | stringstations per B-spline skin band: an integer >= 1 (default 9), or "auto" for the longest bands that keep each merged wall face merged (fewer faces and entities; the display mesh grows by a bounded factor, analytic.bandPlan says what was chosen). Band length moves the exact volume of a B-spline path by ~1e-5 relative.
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
exactSection optionalboolean—
flowCompliant optionalbooleanraise bends to the flow rule minimum (1.5 D)
frame optionalenumhow the section is carried: "rmf" (default) in the plane normal to the path on a rotation-minimising frame; "axial" in the plane through a helix axis (screw motion — thread forms, square-wire springs; helix paths only); "fixed" translated with its normal held constant. twist adds on top of any of them.
one of "rmf", "axial", "fixed"
holes optionalobject[]inner loops subtracted from the section — a swept TUBE (bent pipe). Wind each one the opposite way from the outer section.
≥ 1 items
keepFailed optionalboolean—
maxTurnAngle optionalnumber—
> 0
sectionTolerance optionalnumber—
> 0
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
surfaces optionalenumWall surfaces: "analytic" by default on a round { points, bendRadius } tube, else "bspline". "bspline": every wall a B-spline skin (bandStations / wallFaces / exactSection keep it). "analytic" (CADSF-2568: the default there): on a { points, bendRadius } path with a round section (full circles centred on the path) the runs are published as exact CYLINDRICAL_SURFACE faces and the bends as TOROIDAL_SURFACE segments — fast to tessellate, exact volume, and the faces the boolean's analytic rungs take (use it for a tube that will be unioned or cut). Any other path or section is refused by name (tube_sweep_analytic_unsupported).
one of "bspline", "analytic"
twist optionalnumber—
up optionalnumber[][x, y, z] in millimetres
exactly 3 items
wallFaces optionalenum"segment" (default): a run of section nodes on one arc or straight line is ONE wall face per band; "strip": one wall face per section node (the older layout; same volume).
one of "segment", "strip"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_laminate write Laminate

Bend a laminated or steam-bent member: a rectangular section swept along a spine of straight runs and true corner bends, with an optional lamination count drawn as glue lines.

Full description

Call cad_help({tool:"cad_laminate"}) for the rest.

ArgumentTypeMeaning & bounds
bendRadius optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
layers optionalintegerlamination count.
≥ 0 · ≤ 64
maxBandAngle optionalnumber—
> 0
section optionalobjectthe rectangular section the member is bent from.
section.cornerRadiusnumberround the section's four corners, mm…
≥ 0
section.thicknessnumberthe section's dimension IN the bend plane, mm…
> 0
section.widthnumberthe section's dimension ALONG the bend axis…
> 0
spine optionalobjectthe member's centreline: { points, bendRadius |…
suppressed optionalbooleantrue = not built
up optionalnumber[][x,y,z] mm
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_lattice_fill write Lattice fill

Fill a solid's interior with a strut or TPMS-sheet lattice (see cell) under an optional solid skin, publishing a watertight mesh (default, of kept) or, for small results, a B-rep (of consumed) - with volume, density and cell/strut counts.

Full description

Call cad_help({tool:"cad_lattice_fill"}) for the rest.

ArgumentTypeMeaning & bounds
cell requiredenumTPMS (gyroid/schwarzP/schwarzD) uses sheetThick…
one of "gyroid", "schwarzP", "schwarzD", "sc", "bcc", "fcc", "octet", "diamond", "kelvin", "bccz", "fccz"
of requiredstringbody handle
length ≥ 1
buildDir optionalnumber[][x,y,z] mm
exactly 3 items
cavityH optionalnumberextraction grid step, mm; default set from stru…
> 0
cellAspect optionalnumber[][x,y,z] mm
exactly 3 items
cellSize optionalnumbercell edge or TPMS period, mm
> 0
density optionalobjectgraded feature size, mm…
density.kindenum—
one of "uniform", "gradient", "field", "distance", "fea", "expr"
document optionalstringhandle or "new"
length ≥ 1
drainHoles optionalobjectVent holes (mm).
drainHoles.diameternumber—
> 0
drainHoles.atnumber[][]—
≥ 1 items · ≤ 64 items
drainHoles.countinteger—
≥ 1 · ≤ 64
drainHoles.downnumber[][x,y,z] mm
exactly 3 items
drainHoles.pocketsboolean—
exchanger optionalobjectTwo-fluid exchanger: {a, b} port face lists…
fillet optionalnumbermm, >= 0
≥ 0
frame optionalobjectConformal lattice: cells mapped through the…
frame.kindenum—
one of "conformal"
frame.skinFacesstring[]—
≥ 1 items · ≤ 256 items
frame.thicknessnumber—
> 0
frame.curvedboolean—
h optionalnumberextraction grid step, mm; default set from stru…
> 0
keepFailed optionalboolean—
keepSolid optionalobject[]Hybrid: faces kept exact B-rep…
≥ 1 items · ≤ 64 items
maxTriangles optionalinteger—
≥ 1
origin optionalnumber[][x,y,z] mm
exactly 3 items
output optionalenummesh (default, source kept), brep…
one of "mesh", "brep", "field", "hybrid"
period optionalnumbercell edge or TPMS period, mm
> 0
sheetThickness optionalnumberTPMS wall thickness, mm
> 0
skin optionalnumbersolid wall kept inside the surface before the l…
≥ 0
strutRadius optionalnumberstrut radius, mm (strut cells)
> 0
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_picogk write

PicoGK voxel ops on bodies, as an async job: offset, shell, smoothen, boolean, TPMS, beam lattice.

Full description

Or cem: build + run your own PicoGK C# project headless (.NET SDK) and import its STL/VDB. Returns jobId; cad_job_result gives the body (to_brep: B-rep) + volume/bbox. mm. Needs the PicoGK add-on. Ops: cad_help.

ArgumentTypeMeaning & bounds
bodies optionalstring[]body handles; ops name them in body/with
≥ 1 items · ≤ 8 items
cem optionalobjectMODE cem (instead of bodies/ops): build and run YOUR PicoGK/ShapeKernel C# project headless (needs the .NET 9 SDK), then import every .stl/.vdb it writes under output_dir as a body. Paths resolve inside CADSOLVER_CEM_ROOT (default the output dir); others are refused. voxel_size_mm is the PicoGK Library voxel size. docs/interop/PICOGK.md.
cem.entrystringpublic static Namespace.Class.Method taking nothing or one string (params JSON), e.g. Leap71.CoolCube.HelixHeatX.Task
length ≥ 1
cem.project_pathstringa .csproj, a folder with one, or a folder of .cs sources (compiled with the PicoGK NuGet package; Program.cs files skipped)
length ≥ 1
cem.maxOutputMBnumbercap on what the run writes into output_dir (default 512)
> 0 · ≤ 8192
cem.output_dirstringwhere the run writes; the entry working directory and Library.strLogFolder (default <root>/picogk/cem-<time>)
length ≥ 1
cem.paramsobjectJSON handed to the entry point (also env NATIVECAD_CEM_PARAMS / NATIVECAD_CEM_PARAMS_FILE)
document optionalstringdocument the result lands in (default: the active one)
dryRun optionalbooleanvalidate and return the deck; run nothing (no runtime needed)
import optionalbooleanfalse (alias resultOnly:true): skip the import and return {stl, vdb, volumeMm3, bbox, triangles} from the host (default true); for printer prep, reports, million-triangle moulds
jobMode optionalbooleandefault true (async job); false runs inline
maxTriangles optionalintegerdecimate the result STL to at most this many triangles (vertex clustering, off-worker) before the import; a result over the worker limit is otherwise refused PICOGK_IMPORT_TOO_LARGE
≥ 1000
ops optionalobject[]Ops run in order on one field: each reads on (a field name; default the previous result) and names its result as. voxelize {body} (implicit first op on bodies[0]); offset {distanceMm, + grows}; shell {thicknessMm, inward wall}; smoothen {distanceMm}; boolean {mode: union|subtract|intersect, with: field or body} (aliases union/subtract/intersect); implicit {tpms: gyroid|schwarz_p|diamond, cellMm, wallMm} TPMS sheet clipped to the field (aliases gyroid/schwarz_p/diamond); lattice {cell: sc|bcc|fcc|octet|diamond|kelvin|bccz|fccz, cellMm, beamRadiusMm} NativeCAD unit-cell beams rendered by PicoGK, clipped to the field. Args may sit on the op or under args. Gyroid core with a 1 mm skin: [{op:"voxelize",as:"part"},{op:"shell",on:"part",thicknessMm:1,as:"skin"},{op:"offset",on:"part",distanceMm:-1},{op:"gyroid",cellMm:6,wallMm:0.8},{op:"union",with:"skin"}].
≥ 1 items · ≤ 32 items
outDir optionalstringcase directory (default <output dir>/picogk/case-<time>)
resultOnly optionalbooleanalias of import:false
timeoutSec optionalintegerhost wall clock limit (default 1800); cem: build + run
≥ 1 · ≤ 86400
to_brep optionalbooleanrun cad_mesh_to_brep on the result (STEP-ready body); default: a mesh body
vdb optionalbooleanalso keep the result as OpenVDB (result.vdb in the case directory)
voxel_size_mm optionalnumberPicoGK voxel size, mm (default 0.25); result error is about one voxel
> 0 · ≤ 100

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_weave write Weave

Weave a seat: paper cord, cane or webbing over a seat frame as a real strand pattern, with a coarse slab lod for previews and a fine per-strand lod for renders and export.

Full description

Call cad_help({tool:"cad_weave"}) for the rest.

ArgumentTypeMeaning & bounds
clearance optionalnumber—
coarseLines optionalintegerhow many strand centrelines…
≥ 0 · ≤ 64
cornerInset optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
frame optionalobjectthe seat frame the weave ha…
keepFailed optionalboolean—
lod optionalenumthe level of detail.
one of "coarse", "fine"
maxStrands optionalinteger—
≥ 1
pattern optionalenumthe weave.
one of "envelope", "plain", "cane"
sample optionalinteger—
≥ 1
strand optionalobjectthe stock the seat is woven…
strand.diameternumbera ROUND strand's diameter…
> 0
strand.kindenumthe stock: 'cord' = Danish…
one of "cord", "cane", "webbing"
strand.pitchnumberthe spacing between neighbo…
> 0
strand.sidesintegerhow many sides the round se…
≥ 6 · ≤ 64
strand.thicknessnumbera FLAT strand's thickness…
> 0
strand.widthnumbera FLAT strand's width, mm…
> 0
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0
wrapSegments optionalinteger—
≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_loft_profiles write Loft profiles

Loft two or more closed planar sections into one solid.

Full description

EITHER profileA+profileB (2-section RULED loft, straight side faces, zA/zB heights default 0/1) OR profiles: [...] (>=3-section CUBIC loft through every intermediate section, e.g. square -> rounded-square -> circle). Call cad_help({tool:"cad_loft_profiles"}) for the rest.

ArgumentTypeMeaning & bounds
breaks optionalany[]sectionCurve:"spline" only: vertex indices…
capFit optionalenumsectionFrame:"spatial" only: how the non-planar…
one of "interpolate", "approximate"
capGrid optionalinteger—
≥ 1
capGridU optionalinteger—
≥ 1
capGridV optionalinteger—
≥ 1
capPlanarTol optionalnumber—
> 0
capSamples optionalinteger—
≥ 1
capTol optionalnumber—
> 0
centerline optionalnumber[][]polyline, rising z
≥ 2 items
cornerAngleDeg optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
fallback optionalobjectladder opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
fitTol optionalnumber—
> 0
guides optionalnumber[][][]guide polylines
≥ 1 items
keepFailed optionalboolean—
levels optionalinteger—
≥ 1
profileA optionalnumber[][]>=3 [x,y], unclosed
≥ 3 items
profileB optionalnumber[][]>=3 [x,y], unclosed
≥ 3 items
profiles optionalarray | object[]>=2 sections
≥ 2 items
sectionCurve optionalenummust be "polyline"…
one of "polyline", "spline"
sectionFrame optionalenummust be "planar"…
one of "planar", "spatial"
suppressed optionalbooleantrue = not built
zA optionalnumber—
zB optionalnumber—
zs optionalnumber[]—

Exactly one of these argument shapes: profileA + profileB — or — profiles. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_loft_guided write Guided loft

Loft sections along guide curves and/or a centerline.

Full description

The guide-driven loft. Call cad_help({tool:"cad_loft_guided"}) for the rest.

ArgumentTypeMeaning & bounds
centerline optionalnumber[][]polyline, rising z
≥ 2 items
document optionalstringhandle or "new"
length ≥ 1
guides optionalnumber[][][]guide polylines
≥ 1 items
keepFailed optionalboolean—
levels optionalinteger—
≥ 1
profileA optionalnumber[][]>=3 [x,y], unclosed
≥ 3 items
profileB optionalnumber[][]>=3 [x,y], unclosed
≥ 3 items
profiles optionalarray | object[]>=2 sections
≥ 2 items
suppressed optionalbooleantrue = not built
zA optionalnumber—
zB optionalnumber—
zs optionalnumber[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_blade write Blade

Build a REAL turbomachinery blade or vane: an N-section aerofoil loft with twist, a root fillet (lofted, or a true rolling-ball blend), a platform with overhangs, a shank with angel wings, a dovetail or fir-tree root, and optional internal cooling (serpentine, film holes, TE slots), as ONE solid body.

Full description

Takes NO of — this op BUILDS a body. Call cad_help({tool:"cad_blade"}) for the rest.

ArgumentTypeMeaning & bounds
angelWings optionalobjectANGEL-WING seals…
angelWings.aftbooleandownstream (+y) w…
angelWings.dropnumberplatform undersid…
≥ 0
angelWings.forebooleanupstream (-y) win…
angelWings.lengthnumberaxial reach out o…
> 0
angelWings.lipnumberupturn at the tip…
≥ 0
angelWings.thicknessnumberwing thickness, mm
> 0
angelWings.widthnumbertangential width…
> 0
bow optionalnumber—
bowAxial optionalnumber—
cooling optionalobjectINTERNAL COOLING…
cooling.hubGapnumbercavity floor abov…
≥ 0
cooling.inletbooleanfeed pass 1 throu…
cooling.inletWidthnumberinlet width…
> 0
cooling.levelsintegerfitted radial lev…
≥ 3 · ≤ 40
cooling.minPassagenumbersmallest passage…
≥ 0.2 · ≤ 20
cooling.passesintegerradial passes of…
≥ 1 · ≤ 6
cooling.pressureSideobjectPRESSURE-SIDE fil…
cooling.ribWidthnumberrib between passe…
≥ 0.2 · ≤ 20
cooling.showerheadobjectleading-edge SHOW…
cooling.teSlotsobjectTRAILING-EDGE SLO…
cooling.tipWallnumbermetal above the c…
≥ 0.2
cooling.turnHeightnumberheight of each 18…
≥ 0.2
cooling.wallnumberminimum wall betw…
≥ 0.2 · ≤ 10
document optionalstringhandle or "new"
length ≥ 1
dovetail optionalobjectthe DOVETAIL ROOT…
dovetail.depthnumbertotal radial dept…
> 0
dovetail.baseWidthnumbertangential width…
> 0
dovetail.chamfernumberbreak on the two…
≥ 0
dovetail.flankFractionnumberfraction of `dept…
> 0 · ≤ 0.95
dovetail.neckFractionnumberfraction of `dept…
≥ 0 · ≤ 0.9
dovetail.neckWidthnumbertangential width…
> 0
embed optionalnumber—
emit optionalstringa string — for…
fillet optionalobjectthe ROOT FILLET…
fillet.radiusnumberfillet radius, mm…
≥ 0
fillet.kindenumCADSF-101414: "bl…
one of "blend", "lofted"
fillet.stepsintegerhow many section…
≥ 1
firtree optionalobjecta multi-lobe FIR-…
firtree.flankAnglenumberCONTACT flank ang…
≥ 10 · ≤ 70
firtree.lobeRadiusnumberradius of the con…
> 0
firtree.lobeWidthnumberMAXIMUM tangentia…
> 0
firtree.lobeWidthsnumber[]per-lobe maximum…
firtree.lobesintegernumber of lobes p…
≥ 1 · ≤ 6
firtree.lowerFlankAnglenumberlower (non-contac…
≥ 20 · ≤ 85
firtree.neckRadiusnumberradius of the con…
> 0
firtree.neckWidthnumberMINIMUM tangentia…
> 0
firtree.neckWidthsnumber[]per-neck minimum…
firtree.wedgeAnglenumberincluded taper an…
≥ 0 · ≤ 60
footMargin optionalnumber—
join optionalenum"imprint"…
one of "imprint", "union"
keepFailed optionalboolean—
leSteps optionalnumber—
> 0
lean optionalnumber—
leanDeg optionalnumber—
miterLimit optionalnumber—
> 0
platform optionalobjectthe PLATFORM…
platform.lengthnumberAXIAL length, mm
> 0
platform.thicknessnumberradial thickness, mm
> 0
platform.widthnumberTANGENTIAL width…
> 0
platform.axialCentrenumberaxial centre of t…
platform.chamfernumberbreak on the two…
≥ 0
platform.overhangAftnumberCADSF-101414: how…
≥ 0
platform.overhangForenumberCADSF-101414: how…
≥ 0
platform.tangentialCentrenumbertangential centre…
points optionalnumber—
> 0
root optionalenumthe root form bel…
one of "dovetail", "firtree", "none"
rotor optionalobjectTPI [3]: build a…
rotor.bladesintegermain blade count
≥ 2 · ≤ 40
rotor.assumptionsobjectprovenance notes…
rotor.backplateobject | boolean{thickness, stock…
rotor.betaobjectblade angles in D…
rotor.flankPointsintegerpoints per blade…
≥ 4 · ≤ 40
rotor.hubobject{bore (DIAMETER)…
rotor.hubArcPointsintegerpoints per hub ar…
≥ 1 · ≤ 20
rotor.kindenumdefault impeller
one of "impeller", "inducer", "wheel"
rotor.leanDegnumberconstant hub-to-s…
rotor.meridionalobjectthe meridional co…
rotor.processobject{minWall…
rotor.rakeDegnumberTE rake, deg: the…
rotor.ruledbooleanruled (flank-mill…
rotor.shroudobjectclosed impeller…
rotor.splittersobject | boolean | number{start} = one spl…
rotor.stationsintegeraxial loft statio…
≥ 4 · ≤ 60
rotor.thicknessobjectNORMAL blade thic…
rotor.wrapMatchenumgive every span t…
one of "shroud", "hub", "none"
sections optionalobject[]the aerofoil SECT…
≥ 2 items
shank optionalobjectthe SHANK between…
shank.heightnumberradial height, mm…
≥ 0
shank.topWidthnumbertangential width…
> 0
spanLevels optionalnumber—
squealerDepth optionalnumber—
> 0
squealerRim optionalnumber—
> 0
stack optionalstringa string — for…
suppressed optionalbooleantrue = not built
sweep optionalnumber—
sweepDeg optionalnumber—
teSteps optionalnumber—
> 0
tip optionalstringa string — for…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_thicken destructive Thicken

Thicken a sheet (open) body into a closed solid by offsetting it along its own face normal.

Full description

of names a SHEET body — a planar_sheet result (CADSF-541), or a stitch result that did NOT close (see each op's own description) — NOT an ordinary solid. Call cad_help({tool:"cad_thicken"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built
thickness optionalnumber—
thickness1 optionalnumber—
thickness2 optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_shell destructive Shell

Hollow a planar-faced solid to a wall thickness, opening the named faces.

Full description

Shell the plain blank BEFORE adding holes/bosses/fillets, with open faces named by normal; a part whose fillet radius ≤ thickness refuses with shell-radius-collapse. Retires of. Call cad_help({tool:"cad_shell"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
thickness requirednumber—
> 0
budgetMs optionalnumber—
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
fallback optionalobjectladder policy: maxRung = last rung (index or id); allowDegraded (default false) / allowTolerant (default true) admit degrading / tolerant rungs; disable = rung ids. A refusal's retry.argsPatch names the opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
keepFailed optionalboolean—
open optionalarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both (an empty array selects nothing, which is meaningful for shell's "open")
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_rib write Rib

Thicken an OPEN path into a standing stiffener wall, unioned into a base solid.

Full description

Retires of. Profile is EITHER inline path ([[x,y],...], open polyline, >=2 pts) OR profile: { sketch, entity? } (an open sketch entity). Call cad_help({tool:"cad_rib"}) for the rest.

ArgumentTypeMeaning & bounds
height requirednumber—
> 0
of requiredstringbody handle
length ≥ 1
thickness requirednumber—
> 0
attachZ optionalnumber—
direction optionalenum"linear" (default): thickne…
one of "linear", "normal"
document optionalstringhandle or "new"
length ≥ 1
draft optionalnumber | objectdraft taper (radians): a nu…
embed optionalnumber—
> 0
endHeight optionalnumber—
> 0
face optionalobject | stringa face selector
filletSteps optionalinteger—
≥ 1
keepFailed optionalboolean—
path optionalany[]the rib's open path
profile optionalobjecta rib's OPEN path taken fro…
profile.sketchstringthe "id" of an earlier op i…
length ≥ 1
profile.entitystringthe open entity id within t…
length ≥ 1
projectionTol optionalnumber—
> 0
pull optionalnumber[][x,y,z] mm
exactly 3 items
rootFillet optionalnumbermm, >= 0
≥ 0
side optionalenumwhich side of the path the…
one of "both", "symmetric", "left", "right"
suppressed optionalbooleantrue = not built
tipFillet optionalnumbermm, >= 0
≥ 0

Exactly one of these argument shapes: path — or — profile. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_draft destructive Draft

Taper selected walls away from a neutral plane — the mould-release feature.

Full description

Retires of, publishes ONE new solid. Call cad_help({tool:"cad_draft"}) for the rest.

ArgumentTypeMeaning & bounds
faces requiredarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both
neutral requiredobjectthe NEUTRAL PLANE: the plane the drafted faces pivot about, so geometry lying in it does not move. Its normal also supplies the default pull direction. It must be transverse to the pull — a neutral plane parallel to the pull separates nothing and is refused.
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
angle optionalnumber—
angles optionalobjectPER-FACE draft angles, keyed by raw STEP face id — a variable-angle draft in the sense that different walls taper by different amounts (an angle that varies ALONG one wall is not supported). Overrides angle for the faces it names; every face in faces needs one or the other.
≥ 1 keys
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
fallback optionalobjectladder policy: maxRung = last rung (index or id); allowDegraded (default false) / allowTolerant (default true) admit degrading / tolerant rungs; disable = rung ids. A refusal's retry.argsPatch names the opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
keepFailed optionalboolean—
parting optionalboolean—
pull optionalnumber[][x, y, z] in millimetres
exactly 3 items
strictCheck optionalboolean—
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fillet_edges destructive Fillet edges

Fillet (round) edges — constant radius, tip-weighted, law-driven variable radius around a rim, or a selected subset.

Full description

Blanket fillets partition: convex edges get rounded, edges that cannot be filleted are listed under partition.skipped with a reason code — read it rather than retrying with the same radius. Call cad_help({tool:"cad_fillet_edges"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
at optionalstringa string — for blend's at, one of "base" | "top" | "tip" | "all" (revolved-body fallback selector; see commands/schema.md's blend section)
continuity optionalstringa string — for blend's at, one of "base" | "top" | "tip" | "all" (revolved-body fallback selector; see commands/schema.md's blend section)
corner optionalnumber—
> 0
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
edges optionalarray | object | stringa edge selection: a raw edge id, a declarative selector object, or an array mixing both
engine optionalenumwhich engine may build the fillet. "brep" (default) is the exact B-rep rolling ball only, unchanged. "auto" / "implicit" try the B-rep FIRST and fall through to an implicit smooth-union fillet only when it refuses with blend_cyl_pinch_degenerate or saddle-runs-off-wall AND the body carries lattice provenance (a registered strut union); any other refusal stays a refusal. The implicit answer is a watertight MESH (not B-rep faces) reported with engine "implicit", k, h and its calibration, and is itself refused (implicit_fillet_degenerate) below a 20 degree minimum dihedral or when not watertight. "implicit" on a body without lattice provenance refuses implicit_fillet_not_lattice; "auto" there is plain B-rep
one of "brep", "auto", "implicit"
fallback optionalobjectladder policy: maxRung = last rung (index or id); allowDegraded (default false) / allowTolerant (default true) admit degrading / tolerant rungs; disable = rung ids. A refusal's retry.argsPatch names the opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
keepFailed optionalboolean—
law optionalstringa law: a scalar expression in the parameter t (theta is a synonym), e.g. "1 + 0.5*sin(3*t)". Operators + - * / ^ (^ is power, right-associative) and parentheses; functions abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, log10, max, min, pow, round, sign, sin, sqrt, tan; constants PI, E; and any named parameter of the document. For a blend, t is the angle in RADIANS around the rim (0..2π) and the value is the fillet radius in mm, so the law must come back to itself at 2π — use whole multiples of t inside sin/cos (sin(3*t), not sin(2.5*t)). This is not JavaScript or Python: no **, no Math., no assignments, no function definitions.
length 1–512
lobes optionalinteger—
≥ 1
max optionalnumber—
> 0
mid optionalnumber—
> 0
min optionalnumber—
> 0
order optionalenumthe order the radius LEVELS of a grouped blend are applied in. "auto" (default) is largest radius first — the ordering the kernel derives, because a large blend band cannot end on a small finished one; "input" applies them in the order given, which is how you reproduce a sequential result and is REFUSED by name (BLEND_GROUP_MIXED_RADIUS_VERTEX) when the order does not fit
one of "auto", "input"
partial optionalboolean—
perEdge optionalobject[]per-edge fillet radii for a grouped blend — every edge named must also appear in "edges"; any selected edge not named here takes the op's own "radius"/"corner"
≥ 1 items
phase optionalnumber—
pinchMinTipDeg optionalnumber—
propagate optionalboolean—
radius optionalnumber—
> 0
rho optionalnumber—
> 0
setback optionalenumsetback at a vertex patch. "auto" only: the distance is DETERMINED by the corner geometry (ops/vertexBlend.js) — a numeric setback is refused by name (BLEND_GROUP_SETBACK_FIXED). Passing "auto" is not a no-op: it selects the grouped route, with its per-corner classification report, for a uniform-radius selection
one of "auto"
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
toolMatch optionalboolean | object | stringCADSF-636 — match this feature to the shop's stocked tooling so it prices at the lowest tool-matched tier. Default (field omitted) is ADVISORY: the result entry carries a toolMatch record with the nearest stocked drill / ball-mill radius, the delta, and a machine-applicable fix {field, value} — and the geometry is untouched. Pass "snap" to opt in and have the dimension replaced. A tapped hole is exempt (its drill Ø is fixed by the thread). CADSB-517: pass process to name the manufacturing route — on a route with no stocked-tool catalogue, matching is suppressed entirely.
variable optionalobjectONE fillet band whose radius changes along a chain of straight edges between planar faces (CADSF-1043). Requires "edges" naming an OPEN chain (consecutive edges sharing a vertex, every edge convex). The sections are circular arcs of the local radius, tangent to both faces everywhere; the band is a B_SPLINE_SURFACE_WITH_KNOTS whose measured miss is declared as an edge tolerance. Each chain end must meet a planar cap perpendicular to its edge; an interior vertex must be a convex trihedral corner. Anything else refuses by name (BLEND_VARIABLE_*) with the input body unchanged. The same band is what a grouped blend (perEdge) falls back to where its stepped plan would refuse BLEND_GROUP_MIXED_RADIUS_VERTEX on such a chain
variable.radiinumber[]radius control values at the VERTICES of the picked chain, in chain order starting at the free end of the first listed edge — one more value than there are edges (two for a single edge: its two ends)
≥ 2 items
variable.lawenumhow the radius runs between two controls along the chain arclength: "linear" (default) or "smooth" (a C1 cubic that is flat at every control)
one of "linear", "smooth"

Exactly one of these argument shapes: radius — or — corner + mid — or — min + max — or — law. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_face_blend destructive Face blend / full round

Blend between two face sets that need not touch; omit the radius for the three-face blend (full round).

Full description

Call cad_help({tool:"cad_face_blend"}) for the rest.

ArgumentTypeMeaning & bounds
left requiredarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
right requiredarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both
crossSection optionalstringa string — for blend's at, one of "base" | "top" | "tip" | "all" (revolved-body fallback selector; see commands/schema.md's blend section)
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
holdLine optionalstringa string — for blend's at, one of "base" | "top" | "tip" | "all" (revolved-body fallback selector; see commands/schema.md's blend section)
keepFailed optionalboolean—
middle optionalarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both (an empty array selects nothing, which is meaningful for shell's "open")
radius optionalnumber—
> 0
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_ease_edges destructive Ease exposed edges

Ease every EXPOSED edge to the maker's radius (fillet, chamfer fallback), leaving faces that mate with other parts sharp.

Full description

Radius from radius or rule ("hardwood" 2 mm, "plywood" 1 mm, "aluminium" 1.5 mm); mating faces from mateWith ("auto": touching any other body) or excludeFaces. Call cad_help({tool:"cad_ease_edges"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
chamferDistance optionalnumber—
> 0
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
excludeFaces optionalstring[]an array of raw STEP face id strings (may be empty — an empty list means "open no faces")
fallback optionalenumdefault "chamfer" - what runs on the same edges when the kernel refuses the fillet; "none" refuses instead; "partial" (CADSB-100571) chamfers, and when that refuses too builds the edges that DO take the fillet and names each one it could not in ease.unbuilt - a best-effort finish instead of an all-or-nothing refusal
one of "chamfer", "none", "partial"
keepFailed optionalboolean—
mateWith optionalarray | stringwhich bodies this one mates with: faces touching them are never eased
radius optionalnumber—
> 0
rule optionalstringthe maker's edge rule the radius comes from (its band's typical value): a material kind - "hardwood"/"softwood" (2 mm, band 1-3), "plywood" (1 mm, band 0.5-1), "veneer-laminate" (0.8 mm), "aluminium"/"plastic" (cast/moulded parting line, 1.5 mm) - or a furniture-construction pack entry id ("finish-edge-solid-hardwood", "furniture-construction/finish-edge-ply-laminate"). "steel" (tube ends are capped) and soft parts refuse ease-rule-no-radius. An explicit "radius" wins over the rule's.
length ≥ 1
sharpDeg optionalnumberdefault 170 - a convex edge whose interior dihedral is under this is "sharp" (unbroken) and is eased
> 90 · < 180
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

Exactly one of these argument shapes: radius — or — rule. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_chamfer_edges destructive Chamfer edges

Flat bevel on selected convex edges, or on every convex edge.

Full description

Retires of. distance is the symmetric setback (mm) — the flat-bevel twin of blend. Call cad_help({tool:"cad_chamfer_edges"}) for the rest.

ArgumentTypeMeaning & bounds
distance requirednumber—
> 0
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
angle optionalnumberthe DISTANCE-ANGLE spelling of a chamfer (T-FLEX's "length-angle" — the machinist's callout, e.g. a 0.8 x 45deg edge break is distance-angle, not two distances). RADIANS, measured from the picked edge's FIRST support face (see "distance2"'s note on which face that is) to the chamfer plane; strictly between 0 and PI/2 (0deg and 90deg exclusive — a bevel needs to actually lean). The second setback is derived as distance * tan(angle) and reported as setbacks[].d2, so a 45deg angle reproduces the plain symmetric "distance" chamfer exactly (tan(45deg) = 1) — which is why a 45deg chamfer never needed this field; anything else was unreachable before CADSF-1612. Requires "edges" and may not be combined with "distance2".
> 0 · < 1.5707963267948966
distance2 optionalnumberthe SECOND setback (mm) — a distance-distance / asymmetric chamfer (OCCT's Add(d1,d2)). "distance" (the existing field) is always the setback against the picked edge's FIRST support face, this one against its SECOND. Requires "edges" (an asymmetric setback is a statement about a specific edge's two faces, and a whole-body chamfer — no "edges" — never resolves which face that is) and may not be combined with "angle" — they are two spellings of the same second setback. Which face is "first"/"second" is NOT the pick order: it is the order the body's own topology reports the edge's two support faces in, and it is EXPLICIT and DETERMINISTIC for a given body/edge — the result names it exactly, on setbacks[].faces = [firstFaceId, secondFaceId], alongside the d1/d2 that was actually built, so no caller ever has to guess.
> 0
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
edges optionalarray | object | stringa edge selection: a raw edge id, a declarative selector object, or an array mixing both
flip optionalbooleanFLIP the asymmetric pair: exchange which of the picked edge's two support faces takes "distance" and which takes the second setback ("distance2", or distance * tan(angle) for "angle"). Default false. Requires "distance2" or "angle" (an equal-distance chamfer has no second setback to swap; flip:true without one is refused as chamfer-asymmetric-unsupported). Removed volume is unchanged — it is the SIDE that moves; the result reports the swap on entry.flipped and the d1/d2 actually built on setbacks[].
keepFailed optionalboolean—
propagate optionalboolean—
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_drill_hole destructive Drill hole

Standards-driven manufacturing hole: plain drill, tapped, counterbore, or countersink, with the machinist-facing callout (thread spec / drill size / C'bore / CSK dims) computed from ISO 261 / ISO 273 / ISO 4762 / ISO 10642 tables.

Full description

Retires of. Call cad_help({tool:"cad_drill_hole"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
angle optionalnumberwith at: tilt of the drilling axis off the surface normal, in RADIANS, in the MERIDIAN plane (the plane through the revolve axis and the pick point) — the way a leaning port on a case leans. Must be inside ±90°. NOTE: a tilted axis is no longer perpendicular to the revolve axis, so it leaves the analytic rungs (ops/cylTorusEdge.js's closed form needs a radial axis) and falls to the general engine.
at optionalnumber[]PICK POINT [x, y, z] on the target face — the mouth of the hole, said by pointing at the wall instead of by typing an axis. The drilling axis is that face's outward normal there, RADIAL on a cylindrical, conical or toroidal wall (a cone's true normal leans off radial by its half-angle and a torus's by its meridian angle; neither is a direction any analytic rung pierces, and radial is what a case's ports are). A blind depth is measured from the wall's own outer surface along that axis, and a through hole spans the WALL plus a margin — the wall being read off the solid, not off its bounding box. Excludes center and start.
exactly 3 items
axis optionalnumber[]drilling DIRECTION [x, y, z] (magnitude ignored) — the drill travels this way INTO the material. Requires start and excludes center; omit both for the default top-face hole (equivalent to axis [0, 0, -1]).
exactly 3 items
center optionalnumber[][x, y] of the hole axis in millimetres (the axis runs +Z through the part's top face). CADSF-582: for any other direction give axis + start instead of center.
exactly 2 items
counterbore optionalobjectoverride the ISO 4762 counterbore dimensions derived from size (CADSB-167: use diameter, or the deprecated dia alias)
counterbore.depthnumbercounterbore depth below the top face, mm — must be less than both the part thickness and the hole depth
> 0
counterbore.dianumber(deprecated alias for diameter, CADSB-167) counterbore diameter, mm
> 0
counterbore.diameternumbercounterbore diameter, mm
> 0
counterbore.pilotDianumberpilot (through) hole diameter, mm — defaults to the ISO 273 medium clearance for size
> 0
countersink optionalobjectoverride the ISO 10642 countersink dimensions derived from size (CADSB-167: use diameter, or the deprecated dia alias)
countersink.anglenumberincluded angle in DEGREES (not radians — this is a drawing callout, not a geometric angle); default 90
> 0 · < 180
countersink.dianumber(deprecated alias for diameter, CADSB-167) countersink (mouth) diameter, mm
> 0
countersink.diameternumbercountersink (mouth) diameter, mm
> 0
countersink.pilotDianumberpilot (through) hole diameter, mm — defaults to the ISO 273 medium clearance for size
> 0
depth optionalnumber—
> 0
diameter optionalnumber—
> 0
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
face optionalstringwith at: the raw STEP face id to pick on, when the pick point is near more than one face. Omitted, the nearest face wins.
fit optionalstring—
length ≥ 1
keepFailed optionalboolean—
size optionalstring—
length ≥ 1
start optionalnumber[]with axis: the mouth centre [x, y, z] in millimetres — a point on the hole axis at the surface where the drill enters. A blind depth is measured from this point along axis (a through hole runs from here through the whole body).
exactly 3 items
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
thread optionalenum"modelled" = the real ISO 68-1 helical thread as geometry (tapped hole / bolt shank); default "cosmetic" = plain cylinder + callout.
one of "cosmetic", "modelled"
through optionalboolean—
tip optionalboolean | number | objectDRILL POINT (CADSF-1561): a blind hole ends in a CONE at the tool's included point angle — its base at depth and its apex (diameter/2)/tan(angle/2) further along the axis (Ø20 at 118° → 6.0 mm). depth stays the FULL-DIAMETER depth (drawing convention: depth to the shoulder, the point is extra). DEFAULT for a blind type "drill" hole on a planar face is 118°; pass false for a flat bottom (a machinist's exception, e.g. a milled pocket or a reamed seat). Through holes and holes whose depth reaches the far face have no point; tapped / counterbore / countersink holes and holes on a CURVED wall default to flat — pass a tip to point them. The result's feature.tip reports { angle, depth, built }. A point whose apex would break the far face is refused by name (shorten depth, drill through, or tip:false).
toolMatch optionalboolean | object | stringCADSF-636 — match this feature to the shop's stocked tooling so it prices at the lowest tool-matched tier. Default (field omitted) is ADVISORY: the result entry carries a toolMatch record with the nearest stocked drill / ball-mill radius, the delta, and a machine-applicable fix {field, value} — and the geometry is untouched. Pass "snap" to opt in and have the dimension replaced. A tapped hole is exempt (its drill Ø is fixed by the thread). CADSB-517: pass process to name the manufacturing route — on a route with no stocked-tool catalogue, matching is suppressed entirely.
type optionalenumdefault "drill". "drill" takes diameter; the other three take size (e.g. "M8") and read their dimensions out of ops/holes.js's ISO 261 / 273 / 4762 / 10642 tables. "tapped" also accepts ASME B1.1 Unified sizes (UNC/UNF #0 to 1", plus 1-32 UN): "1/4-20 UNC", "1/4-20", "#10-32 UNF", "1-32 UN", optional "-2B" class; the bore is the 75%-thread tap drill (1/4-20 -> #7, 5.105 mm) and the callout reads e.g. "1/4-20 UNC-2B ↧6.4, TAP DRILL #7 ↧8"
one of "drill", "tapped", "counterbore", "countersink"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_hole_pattern write Hole pattern

Array ONE hole feature across a bolt circle, a linear run, an XY grid, a point list, a revolve wall's polar or axial row, or a tube's radial rows — the whole pattern in one op.

Full description

Retires of. Call cad_help({tool:"cad_hole_pattern"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
pattern requiredobjectwhere the holes go. One of SEVEN kinds. On a PLANAR top face — "linear", "grid", "circular" (the bolt circle) or "points", each an [x, y] station. On a CURVED wall of a revolve (CADSF-1305) — "polar" ({kind:"polar", radius, station?, count, startAngle?, totalAngle?, axis?, origin?}: N holes AROUND the revolve axis at one height, the port ring) and "axial" ({kind:"axial", radius, angle?, station?, step, count}: N holes ALONG the axis at one clocking, the bolt line). Both emit a 3-D pick point and take their axis from the wall, so radius need only be the wall's approximate radius there — the pick is snapped onto the face it lands on. Millimetres and radians; every count INCLUDES the seed instance. CADSF-101574: "radial" ({kind:"radial", rows:[{station, count, diameter?, startAngle?, stagger?, walls?}], axis?, origin?}) cuts rows of plain radial THROUGH holes in the coaxial walls of a tube / tube-in-a-tube in ONE pass (the radial_hole_pattern op).
angle optionalnumberwith at: tilt of the drilling axis off the surface normal, in RADIANS, in the MERIDIAN plane (the plane through the revolve axis and the pick point) — the way a leaning port on a case leans. Must be inside ±90°. NOTE: a tilted axis is no longer perpendicular to the revolve axis, so it leaves the analytic rungs (ops/cylTorusEdge.js's closed form needs a radial axis) and falls to the general engine.
counterbore optionalobjectoverride the ISO 4762 counterbore dimensions derived from size (CADSB-167: use diameter, or the deprecated dia alias)
counterbore.depthnumbercounterbore depth below the top face, mm — must be less than both the part thickness and the hole depth
> 0
counterbore.dianumber(deprecated alias for diameter, CADSB-167) counterbore diameter, mm
> 0
counterbore.diameternumbercounterbore diameter, mm
> 0
counterbore.pilotDianumberpilot (through) hole diameter, mm — defaults to the ISO 273 medium clearance for size
> 0
countersink optionalobjectoverride the ISO 10642 countersink dimensions derived from size (CADSB-167: use diameter, or the deprecated dia alias)
countersink.anglenumberincluded angle in DEGREES (not radians — this is a drawing callout, not a geometric angle); default 90
> 0 · < 180
countersink.dianumber(deprecated alias for diameter, CADSB-167) countersink (mouth) diameter, mm
> 0
countersink.diameternumbercountersink (mouth) diameter, mm
> 0
countersink.pilotDianumberpilot (through) hole diameter, mm — defaults to the ISO 273 medium clearance for size
> 0
depth optionalnumber—
> 0
diameter optionalnumber—
> 0
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
face optionalobject | stringa face selector: raw STEP id | { normal:[x,y,z] } | { normal:[x,y,z], through:[x,y,z] } | { surface:"cylinder" } | { ref:"<provenance tag>" }
fit optionalstring—
length ≥ 1
keepFailed optionalboolean—
size optionalstring—
length ≥ 1
skipFailures optionalboolean—
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
through optionalboolean—
tip optionalboolean | number | objectDRILL POINT (CADSF-1561): a blind hole ends in a CONE at the tool's included point angle — its base at depth and its apex (diameter/2)/tan(angle/2) further along the axis (Ø20 at 118° → 6.0 mm). depth stays the FULL-DIAMETER depth (drawing convention: depth to the shoulder, the point is extra). DEFAULT for a blind type "drill" hole on a planar face is 118°; pass false for a flat bottom (a machinist's exception, e.g. a milled pocket or a reamed seat). Through holes and holes whose depth reaches the far face have no point; tapped / counterbore / countersink holes and holes on a CURVED wall default to flat — pass a tip to point them. The result's feature.tip reports { angle, depth, built }. A point whose apex would break the far face is refused by name (shorten depth, drill through, or tip:false).
toolMatch optionalboolean | object | stringCADSF-636 — match this feature to the shop's stocked tooling so it prices at the lowest tool-matched tier. Default (field omitted) is ADVISORY: the result entry carries a toolMatch record with the nearest stocked drill / ball-mill radius, the delta, and a machine-applicable fix {field, value} — and the geometry is untouched. Pass "snap" to opt in and have the dimension replaced. A tapped hole is exempt (its drill Ø is fixed by the thread). CADSB-517: pass process to name the manufacturing route — on a route with no stocked-tool catalogue, matching is suppressed entirely.
type optionalenumdefault "drill". "drill" takes diameter; the other three take size (e.g. "M8") and read their dimensions out of ops/holes.js's ISO 261 / 273 / 4762 / 10642 tables. "tapped" also accepts ASME B1.1 Unified sizes (UNC/UNF #0 to 1", plus 1-32 UN): "1/4-20 UNC", "1/4-20", "#10-32 UNF", "1-32 UN", optional "-2B" class; the bore is the 75%-thread tap drill (1/4-20 -> #7, 5.105 mm) and the callout reads e.g. "1/4-20 UNC-2B ↧6.4, TAP DRILL #7 ↧8"
one of "drill", "tapped", "counterbore", "countersink"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_feature_pattern destructive Pattern a feature (pad / pocket / hole) inside one body

Repeat a pad, pocket or hole already on a body, linear or circular, inside that ONE body (pattern copies whole bodies).

Full description

Pass the pad/pocket/hole as both of and feature; count includes the seed; linear: step [dx,dy,dz]; circular: center (+ axis, totalAngle). Retires of, publishes ONE body. Call cad_help({tool:"cad_feature_pattern"}) for the rest.

ArgumentTypeMeaning & bounds
count requiredintegeran integer >= 2
≥ 2
feature requiredstringbody handle
length ≥ 1
of requiredstringbody handle
length ≥ 1
type requiredenum"linear" (needs "step") or "circular"…
one of "linear", "circular"
axis optionalnumber[][x,y,z] mm
exactly 3 items
center optionalnumber[][x,y,z] mm
exactly 3 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
step optionalnumber[][x,y,z] mm
exactly 3 items
suppressed optionalbooleantrue = not built
totalAngle optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_engrave_text write Engrave text

Engrave arbitrary text (A-Z a-z 0-9 punctuation) into one planar OR CYLINDRICAL face as a watertight pocket.

Full description

Retires of. Needs text, face (selector) and either height (cap height, mm) or fit: {width,height} (auto-scale into a bounding box). Call cad_help({tool:"cad_engrave_text"}) for the rest.

ArgumentTypeMeaning & bounds
face requiredobject | stringa face selector
of requiredstringbody handle
length ≥ 1
text requiredstring—
length ≥ 1
align optionalenum—
one of "left", "center", "right"
angleDeg optionalnumber—
arcTolerance optionalnumber—
> 0
autoFit optionalboolean—
chordTolerance optionalnumber—
> 0
curveEdges optionalboolean—
curveTolerance optionalnumber—
> 0
cutterDiameter optionalnumber—
> 0
depth optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
draft optionalnumber—
embolden optionalnumber—
> 0
fit optionalobject—
fit.heightnumberbounding-box height to auto…
> 0
fit.widthnumberbounding-box width to auto-…
> 0
font optionalstringa bundled outline-font id…
length ≥ 1
gapCols optionalnumber—
height optionalnumber—
> 0
keepFailed optionalboolean—
legibility optionalobject | string—
lineBreaks optionalnumber[]—
lineHeightFrac optionalnumber—
> 0
lines optionalstring[]non-empty strings
≥ 1 items
maxLines optionalintegera positive integer
≥ 1
maxTurnDeg optionalnumber—
minHeight optionalnumber—
> 0
orient optionalarray | stringwhich way the text points…
origin optionalnumber[][x,y,z] mm
exactly 3 items
rotate optionalnumber—
spacing optionalnumber—
stations optionalobject—
stations.countintegernumber of stations round th…
≥ 1
stations.labelsstring[]explicit per-station labels…
stations.startDegnumberangle of the first station…
stations.startNumberintegerfirst station number substi…
stations.stepDegnumberangle between stations, deg…
stencil optionalboolean | object—
suppressed optionalbooleantrue = not built
through optionalboolean—
vAlign optionalenumbaseline-anchored by defaul…
one of "baseline", "middle", "center", "top"
z optionalnumber—

Exactly one of these argument shapes: height — or — fit. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_pushpull destructive Push / pull a face

Direct-edit press/pull: offset a planar face along its normal.

Full description

Retires of. faceId (raw STEP id, like delete_face) names the face; mode ("add"|"remove") picks material addition vs removal; distance (mm, >0) is the offset. Blind (fixed-distance) end condition only.

ArgumentTypeMeaning & bounds
distance requirednumber—
> 0
faceId requiredstring—
length ≥ 1
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
mode optionalenum"add" = add material, "remove" = cut material
one of "add", "remove"
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_move_face destructive Move face

Direct edit: move one face (plane, cylinder, cone or sphere) and regenerate its neighbours.

Full description

Retires of, publishes ONE new solid. Call cad_help({tool:"cad_move_face"}) for the rest.

ArgumentTypeMeaning & bounds
faceId requiredstring—
length ≥ 1
of requiredstringbody handle
length ≥ 1
check optionalenumwhich ops/check tier runs on the moved body.
one of "none", "local", "full"
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
offset optionalnumber—
rotate optionalobjecttilt the face: a rotation about an arbitrary axis.
rotate.anglenumberrotation angle about axis, in RADIANS.
rotate.axisnumber[]the rotation axis [x,y,z]…
exactly 3 items
rotate.originnumber[]the point the axis passes through, in mm — th…
exactly 3 items
suppressed optionalbooleantrue = not built
translate optionalnumber[][x,y,z] mm
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_delete_face destructive Delete face

Remove one face — re-cap the opening, or heal it by extending the neighbours.

Full description

Retires of. Call cad_help({tool:"cad_delete_face"}) for the rest.

ArgumentTypeMeaning & bounds
faceId requiredobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
extend optionalboolean—
heal optionalboolean—
keepFailed optionalboolean—
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sheet_fold write Sheet fold

Sheet-metal part as ONE folded body — a constant-thickness strip with a base flange and a train of bends — with the developed FLAT PATTERN reported alongside the solid.

Full description

Call cad_help({tool:"cad_sheet_fold"}) for the rest.

ArgumentTypeMeaning & bounds
baseFlange requirednumber—
> 0
bends requiredobject[]the bends in order from the…
≥ 1 items
thickness requirednumber—
> 0
width requirednumber—
> 0
bendTable optionalobjecta shop bend table: looked u…
bendTable.entriesobject[]rows keyed by…
≥ 1 items
bendTable.materialstringthe material this table is…
bendTable.namestringa label for this table…
bendTable.thicknessnumberthe stock thickness this ta…
> 0
bendTable.tolerancenumbermm band the part’s thickn…
> 0
document optionalstringhandle or "new"
length ≥ 1
gauge optionalnumbera stocked gauge number…
> 0
kFactor optionalnumberK-factor — the neutral ax…
> 0 · ≤ 0.5
keepFailed optionalboolean—
material optionalstring—
length ≥ 1
params optionalobjectoverrides for the gate's pa…
process optionalstringwhich shop's bend rule pack…
length ≥ 1
strict optionalboolean—
suppressed optionalbooleantrue = not built
thicknessTolerance optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sheet_box write Sheet box

Sheet-metal BOX as ONE folded body — a rectangular base with walls folded up on all four edges, corner-notched, with the developed FLAT PATTERN reported per axis.

Full description

A chassis, tray or lid as ONE watertight solid instead of a shell plus a butt-jointed ring. Call cad_help({tool:"cad_sheet_box"}) for the rest.

ArgumentTypeMeaning & bounds
base requiredobjectthe rectangular b…
base.lengthnumberbase panel length…
> 0
base.widthnumberbase panel width…
> 0
flanges requiredobjectthe walls, keyed…
≥ 1 keys
flanges.eobjectthe east (+X) wall
flanges.nobjectthe north (+Y) wall
flanges.sobjectthe south (−Y)…
flanges.wobjectthe west (−X) wall
thickness requirednumber—
> 0
bendTable optionalobjecta shop bend table…
bendTable.entriesobject[]rows keyed by…
≥ 1 items
bendTable.materialstringthe material this…
bendTable.namestringa label for this…
bendTable.thicknessnumberthe stock thickne…
> 0
bendTable.tolerancenumbermm band the part…
> 0
document optionalstringhandle or "new"
length ≥ 1
gauge optionalnumbera stocked gauge n…
> 0
kFactor optionalnumberK-factor — the…
> 0 · ≤ 0.5
keepFailed optionalboolean—
material optionalstring—
length ≥ 1
notch optionalobjecthow much clearanc…
notch.gapnumberextra corner reli…
≥ 0
notch.placementenumgap measured from
one of "tangent", "intersection"
notch.shapeenumcorner relief shape
one of "round", "square", "tear", "trimToBend", "linearWeld", "arcWeld", "laserWeld"
params optionalobjectoverrides for the…
process optionalstringwhich shop's bend…
length ≥ 1
strict optionalboolean—
suppressed optionalbooleantrue = not built
thicknessTolerance optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_offset_faces destructive Offset region (offset a face set)

Direct edit: OFFSET REGION — offset a SET of faces together by one distance, re-trimming everything around them.

Full description

Call cad_help({tool:"cad_offset_faces"}) for the rest.

ArgumentTypeMeaning & bounds
distance requirednumber—
faces requiredarray | object | stringa face selection: a raw face id, a declarative…
of requiredstringA body handle returned by an earlier modeling-t…
length ≥ 1
check optionalenumwhich ops/check tier runs on the moved body.
one of "none", "local", "full"
document optionalstringA session document handle returned by an earlie…
length ≥ 1
keepFailed optionalboolean—
propagate optionalenumwhich faces ride along with the set.
one of "tangent", "none"
suppressed optionalbooleantrue = this feature is DELIBERATELY not built…
tangentDeg optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_replace_face destructive Replace face

Direct edit: REPLACE FACE — swap one face's surface for another plane/cylinder (or another face's surface) and re-trim its neighbours.

Full description

Call cad_help({tool:"cad_replace_face"}) for the rest.

ArgumentTypeMeaning & bounds
faceId requiredobject | stringexactly ONE face: a raw STEP face id…
of requiredstringA body handle returned by an earlier modeling-t…
length ≥ 1
check optionalenumwhich ops/check tier runs on the moved body.
one of "none", "local", "full"
document optionalstringA session document handle returned by an earlie…
length ≥ 1
keepFailed optionalboolean—
offset optionalnumber—
suppressed optionalbooleantrue = this feature is DELIBERATELY not built…
surface optionalobjectthe explicit replacement surface: a plane { kin…
withFace optionalobject | stringexactly ONE face: a raw STEP face id…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_face_region destructive Face region

Direct edit: copy, pattern or cut a boss/pocket face region.

Full description

Call cad_help({tool:"cad_face_region"}) for the rest.

ArgumentTypeMeaning & bounds
faces requiredarray | object | stringa face selection: a raw face id, a declarative…
mode requiredenum"copy" pastes the region once under translate…
one of "copy", "pattern", "cut"
of requiredstringA body handle returned by an earlier modeling-t…
length ≥ 1
count optionalintegeran integer >= 2
≥ 2
document optionalstringA session document handle returned by an earlie…
length ≥ 1
keepFailed optionalboolean—
rotate optionalobjecta rotation, given EITHER as the Euler triple {…
rotate.anglenumberrotation angle about axis, radians
rotate.axisnumber[]rotation axis [x,y,z] (need not be unit length)…
exactly 3 items
rotate.centernumber[]rotation centre [x,y,z] in mm — default [0,0…
exactly 3 items
rotate.rxnumberrotation about the world +X axis, radians
rotate.rynumberrotation about the world +Y axis, radians
rotate.rznumberrotation about the world +Z axis, radians
suppressed optionalbooleantrue = this feature is DELIBERATELY not built…
target optionalstringA body handle returned by an earlier modeling-t…
length ≥ 1
translate optionalnumber[][x, y, z] in millimetres
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_defeature destructive Defeature (simplify by detail size)

Defeature / simplify by detail size: remove every hole, boss, fillet and chamfer under a size, or suppress the blend networks of the given faces.

Full description

Give at least one size threshold in mm, or faces. Call cad_help({tool:"cad_defeature"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-t…
length ≥ 1
blendNetworks optionalboolean—
bossDiameter optionalnumber—
> 0
chamferDistance optionalnumber—
> 0
document optionalstringA session document handle returned by an earlie…
length ≥ 1
faces optionalarray | object | stringa face selection: a raw face id, a declarative…
filletRadius optionalnumber—
> 0
holeDiameter optionalnumber—
> 0
keepFailed optionalboolean—
maxPasses optionalinteger—
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sheet_feature write Sheet feature

Sheet-metal part said the way a DRAWING says it: flange, hem, jog, sketched bend, tab, cross-break, vent, bend relief, closed corner -- each turned into the bends ops/sheetMetal folds, with the developed blank reported alongside.

Full description

cad_sheet_fold speaks the machine's language -- "bend -74.6 degrees over r2, then a flat of 11.3". Call cad_help({tool:"cad_sheet_feature"}) for the rest.

ArgumentTypeMeaning & bounds
baseFlange requirednumber—
> 0
features requiredobject[]the features in the order t…
≥ 1 items
thickness requirednumber—
> 0
width requirednumber—
> 0
cuts optionalobject[]holes and cutouts in the BL…
document optionalstringhandle or "new"
length ≥ 1
kFactor optionalnumberK-factor — the neutral ax…
> 0 · ≤ 0.5
keepFailed optionalboolean—
name optionalstring—
length ≥ 1
output optionalenum"folded" (default) publishe…
one of "folded", "blank"
params optionalobjectoverrides for the gate's pa…
process optionalstringwhich shop's bend rule pack…
length ≥ 1
strict optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sheet_miter write Sheet miter

A flange run along a CHAIN of base edges with the corners mitred: every corner's miter angle and measured gap, and the exact flat pattern leg by leg.

Full description

A report, not a body -- a mitred run has a bend axis per leg and no two of them are parallel. Call cad_help({tool:"cad_sheet_miter"}) for the rest.

ArgumentTypeMeaning & bounds
height requirednumber—
> 0
path requirednumber[][]open [x,y] polyline
≥ 2 items
thickness requirednumber—
> 0
angle optionalnumber—
closed optionalboolean—
document optionalstringhandle or "new"
length ≥ 1
gap optionalnumbermm, >= 0
≥ 0
gapFrom optionalenum"corner" (default) reads gap as the CLEAR DIS…
one of "corner", "trim"
heightFrom optionalenumwhere a flange height is measured from: "tangen…
one of "tangent", "outer", "mouldLine", "inside"
kFactor optionalnumberK-factor — the neutral axis position as a fra…
> 0 · ≤ 0.5
keepFailed optionalboolean—
radius optionalnumber—
> 0
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_sheet_convert write Sheet convert

Solid mould to sheet metal: flat blank, rips, unfold, cuts.

Full description

Call cad_help({tool:"cad_sheet_convert"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
thickness requirednumber—
> 0
autoRip optionalboolean—
bendTable optionalobjecta shop bend table: looked up per bend by (inside radius, angle) ahead of the published R/T table, and behind a gauge table and any per-bend bendAllowance/bendDeduction/kFactor
bendTable.entriesobject[]rows keyed by (radius, angle); at least one of allowance/deduction/kFactor per row
≥ 1 items
bendTable.materialstringthe material this table is FOR — reported, not enforced
bendTable.namestringa label for this table, e.g. the shop or brake it came from — carried onto every bend it drives (flatPattern.bends[].source) and the flat-DXF bend schedule
bendTable.thicknessnumberthe stock thickness this table is FOR, mm. When given, the part’s own thickness must match within tolerance (or the op’s thicknessTolerance) or the op refuses — a table applied to the wrong stock gives a wrong deduction.
> 0
bendTable.tolerancenumbermm band the part’s thickness is allowed to deviate from thickness by; default 0.1 mm
> 0
cuts optionalnumber[][][]closed cut polygons in FLAT-PATTERN coordinates (mm; the frame report.sheetConvert.flat.bbox and bends[].flat are in), subtracted from the blank and reported on the folded part
≥ 1 items · ≤ 64 items
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
fixedFace optionalobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
kFactor optionalnumberK-factor — the neutral axis position as a fraction of thickness from the INSIDE surface, in (0, 0.5]. Omit for the published air-bending R/T table (mild steel).
> 0 · ≤ 0.5
keepFailed optionalboolean—
open optionalarray | object | stringa face selection: a raw face id, a declarative selector object, or an array mixing both (an empty array selects nothing, which is meaningful for shell's "open")
radius optionalnumber—
> 0
ripGap optionalnumbera length in mm, zero or greater
≥ 0
rips optionalobject | string[]edges to RIP instead of bend: a raw edge id, an edge selector, or { edge, overlap } where overlap names the face that runs to the mould edge (the other butts against it); default overlap: the face nearer the fixed face
≥ 1 items · ≤ 256 items
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
unfold optionalarray | object | stringa edge selection: a raw edge id, a declarative selector object, or an array mixing both

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_corner_relief write Corner relief

DOGBONE / T-BONE relief on an inside corner — the over-cut that lets a square mating part seat in a pocket a round cutter made.

Full description

NOT a fillet. A round router bit cannot cut a square internal corner: whatever the drawing says, the corner comes out at the bit radius and a square peg will not seat in it. Call cad_help({tool:"cad_corner_relief"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
clearance optionalnumbermm, >= 0
≥ 0
corners optionalobject[]the inside corners to relieve, each as a vertex…
≥ 1 items
depth optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
meshFallback optionalboolean—
pocket optionalobjectan axis-aligned rectangle in the XY (tool) plan…
pocket.maxnumber[]upper corner [x, y], mm
exactly 2 items
pocket.minnumber[]lower corner [x, y], mm
exactly 2 items
style optionalenumrelief style — "dogbone" puts ONE bit-radius…
one of "dogbone", "tbone"
suppressed optionalbooleantrue = not built
through optionalboolean—
toolDia optionalnumber—
> 0
walls optionalenumT-bone only: which wall(s) carry the relief.
one of "both", "a", "b"

Exactly one of these argument shapes: corners — or — pocket. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_enclosure write Electronics enclosure from an envelope

Builds a box ENCLOSURE (base + lid) around a board envelope (envelope.json + config): port cut-outs from the max-plug keep-outs, process mounts (fdm heat-set boss, sheet PEM standoff, moulded drafted boss, cnc tapped boss), snap/screw/tray lid, vents sized to an open area.

Full description

Call cad_help({tool:"cad_enclosure"}) for the rest.

ArgumentTypeMeaning & bounds
envelope requiredstringenvelope.json path, or sample:<name>…
length ≥ 1
build optionalbooleanfalse: plan + box audit only, no kernel.
clearance optionalnumberPart-to-enclosure clearance, mm.
≥ 0
config optionalstringEnvelope config name. Default: the first.
detail optionalenumfull adds checks, design, sources.
one of "summary", "full"
extras optionalobject[]Extra material blocks / cuts (audited).
includeOps optionalbooleanReturn the executor ops (cad_build_plan).
lid optionalenumLid kind. Default per process.
one of "snap", "screw", "tray"
material optionalstringMaterial (snap strain). e.g. PETG, PLA.
mounts optionalenumMount kind. Default per process.
one of "standoff", "boss", "pem"
out optionalstringSTEP output path.
ports optionalstring[]Port ids to open. Default: edge ports.
process optionalenumManufacturing process. Default fdm.
one of "fdm", "sheet", "molded", "cnc"
requirements optionalstringrequirements.json path (standards).
vents optionalobject | booleanVent spec, or false for none.
wall optionalnumberWall / sheet thickness, mm.
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Freeform surfacing · 17

Surfaces built from curves rather than from a profile and a distance: boundary and net surfaces, hole fills that meet their neighbours tangentially, untrim and extend, and the curve fit that feeds them all. These publish sheet bodies - thicken one, or stitch a set of them, to get a solid.

cad_boundary_surface write Boundary surface

Build a sheet body inside a closed loop of 3 or more curves.

Full description

Four curves give one bilinearly blended COONS patch; any other count gives ONE sheet of N faces — N Coons sub-patches meeting at an interior centre, G1 across the shared spokes. Sides may be listed in any order and any direction — they are chained head to tail for you. Call cad_help({tool:"cad_boundary_surface"}) for the rest.

ArgumentTypeMeaning & bounds
boundaries requiredarray | object | string[]>=2 curves, chained
≥ 2 items
degree optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
reparam optionalenumcurve timing
one of "natural", "arclength"
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_ruled_surface write Ruled surface

Build a RULED sheet — straight lines between two curves, or off one curve along a direction.

Full description

SolidWorks / NX "Ruled Surface", ACIS api_make_ruled: the mould-maker's surface. Call cad_help({tool:"cad_ruled_surface"}) for the rest.

ArgumentTypeMeaning & bounds
curve optionalarray | object | stringid, polyline or spec
curves optionalarray | object | string[]>=2 curves, chained
≥ 2 items
direction optionalnumber[][x,y,z] mm
exactly 3 items
distance optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
flip optionalboolean | stringpair the second curve reversed (true), as given…
keepFailed optionalboolean—
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_offset_surface write Offset surface

Copy one B-spline face at a distance along its normal, as a new SHEET body.

Full description

Call cad_help({tool:"cad_offset_surface"}) for the rest.

ArgumentTypeMeaning & bounds
distance requirednumber—
face requiredobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
keepFailed optionalboolean—
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_flatten_surface write Flatten surface

Develop one curved B-spline face into a FLAT pattern (a planar sheet), with the stretch it costs measured.

Full description

SolidWorks "Surface Flatten" / NX "Flatten & Form": the cut pattern for a gasket, a composite ply, sheet trim or upholstery. Call cad_help({tool:"cad_flatten_surface"}) for the rest.

ArgumentTypeMeaning & bounds
face requiredobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
keepFailed optionalboolean—
plane optionalobject | stringa sketch/inline-profile plane: either an explicit frame object or the id string of an earlier datum_plane
samples optionalinteger—
≥ 1
strainTol optionalnumber—
> 0
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mutual_trim write Mutual trim

Trim two sheets against each other and keep one piece of each.

Full description

Call cad_help({tool:"cad_mutual_trim"}) for the rest.

ArgumentTypeMeaning & bounds
keep requiredobject[]per sheet, the piece to keep: { point } or { side }
exactly 2 items
sheets requiredstring[]the two sheets [a, b]
exactly 2 items
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
keepFailed optionalboolean—
result optionalenum"one" sewn sheet (default) or "two" (<id>, <id>#1)
one of "one", "two"
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_net_surface write Net surface

Build a sheet body through a NETWORK of curves running in two directions.

Full description

The Gordon surface — "Through Curve Mesh" in NX, "Boundary Surface" with both direction sets filled in, api_net_surface in ACIS. Call cad_help({tool:"cad_net_surface"}) for the rest.

ArgumentTypeMeaning & bounds
uCurves requiredarray | object | string[]>=2 curves, chained
≥ 2 items
vCurves requiredarray | object | string[]>=2 curves, chained
≥ 2 items
degree optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
reparam optionalenumcurve timing
one of "natural", "arclength"
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fill_patch write Fill patch

Fill a closed ring of boundary curves, meeting the neighbouring faces to G0/G1/G2 — and optionally sew the patch into the body.

Full description

The hole-patching operator. Call cad_help({tool:"cad_fill_patch"}) for the rest.

ArgumentTypeMeaning & bounds
boundaries requiredarray | object | string | object[]the closed ring of boundary sides to fill (>= 3).
≥ 3 items
degree optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
into optionalarray | stringthe body (or bodies) to sew the finished patch…
keepFailed optionalboolean—
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = not built
tangentScale optionalnumber—
> 0
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_untrim_face write Untrim face

Recover the full underlying surface behind a trimmed face, as a sheet body.

Full description

Publishes the face's own supporting surface over its NATURAL rectangular (u,v) domain — the knot-vector span of the B-spline patch — discarding whatever trim the face currently carries, and reports natural.uRange/vRange/corners. Call cad_help({tool:"cad_untrim_face"}) for the rest.

ArgumentTypeMeaning & bounds
face requiredobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
keepFailed optionalboolean—
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_extend_face write Extend face

Continue a face past its own edge by a distance, as a sheet body.

Full description

The natural (analytic) continuation of the surface, NOT a linear ramp off the end: the patch's own polynomial is evaluated UNCLAMPED past its knot domain, which is what makes an extended fillet or loft face still lie on the shape it came from. Call cad_help({tool:"cad_extend_face"}) for the rest.

ArgumentTypeMeaning & bounds
distance requirednumber—
> 0
face requiredobject | stringexactly ONE face: a raw STEP face id (from cad_body_topology), a declarative face selector object (surface, normal, radius, area, at, bbox, createdBy, largest/smallest, topmost/bottommost, extreme, tolDeg), { ref } or { normal, through }
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
degree optionalinteger—
≥ 1
direction optionalenumwhich parametric direction of the face to extend ("u" default)
one of "u", "v"
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
end optionalenumwhich end(s) of that direction to extend ("both" default)
one of "start", "end", "both"
keepFailed optionalboolean—
mode optionalenum"distance" (default) reads "distance" as millimetres; "percent" reads it as a percentage of the face's own current length in that direction
one of "distance", "percent"
samples optionalinteger—
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fit_curve write Fit a curve through points

Fit a NURBS curve through a list of 3D points.

Full description

Piegl & Tiller A9.1 global interpolation: the curve passes through EVERY point exactly (reported deviation is 0), centripetally parameterised. Call cad_help({tool:"cad_fit_curve"}) for the rest.

ArgumentTypeMeaning & bounds
points requirednumber[][]ordered [x,y,z] pts
≥ 2 items
closed optionalboolean—
continuity optionalenumcontinuity inside the fitted curve/face: simple…
one of "G2", "G3", "G4"
degree optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
minSpan optionalnumber—
> 0
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fit_surface write Fit a surface through points

Fit a NURBS surface through a rectangular grid of points, or least-squares through a scattered cloud.

Full description

Two fits in one verb, chosen by which data you give. Call cad_help({tool:"cad_fit_surface"}) for the rest.

ArgumentTypeMeaning & bounds
continuity optionalenumcontinuity inside the fitted curve/face: simple…
one of "G2", "G3", "G4"
degree optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
grid optionalnumber[][][]a RECTANGULAR grid of points to interpolate: gr…
≥ 2 items
keepFailed optionalboolean—
minSpan optionalnumber—
> 0
nu optionalinteger—
≥ 1
nv optionalinteger—
≥ 1
points optionalnumber[][]ordered [x,y,z] pts
≥ 2 items
samples optionalinteger—
≥ 1
smoothing optionalnumbermm, >= 0
≥ 0
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0
trim optionalnumber[][][]closed loops in the FITTED SURFACE's own parame…
≥ 1 items
trimSamples optionalinteger—
≥ 1
trimTol optionalnumber—
> 0
uDegree optionalinteger—
≥ 1
vDegree optionalinteger—
≥ 1

Exactly one of these argument shapes: grid — or — points. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mesh_to_brep write Mesh to B-rep

Rebuild a B-rep body from an imported triangle mesh: segment, recognise the analytic faces, fit the rest, sew.

Full description

of names that import. The mesh is segmented, recognised as plane/cylinder/cone/sphere/torus or fit as a B-spline, and sewn (mixed) into one solid when possible. Call cad_help({tool:"cad_mesh_to_brep"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
analyticFirst optionalboolean—
blends optionalenumwhat mesh_to_brep does with a band it RECOGNISED as a fillet or a chamfer (a constant-radius cylinder/torus region tangent to exactly two supports; a narrow inclined planar strip between two supports meeting it at 30-60 degrees). "keep" authors the fitted band as a trimmed face — correct geometry, but a DUMB band: nothing on the body says "r=4 fillet on this edge". "refit" rebuilds the body SHARP (the two supports intersected directly, so their loops re-close on one sharp edge) and re-applies the kernel's own fillet/chamfer at the MEASURED radius/setback, which is an EDITABLE blend cad_param_list and cad_design_review both read back. "auto" (the default) builds BOTH and ships whichever comes out closer to the mesh on ops/meshCompare.js's normalised Hausdorff distance, a tie going to the refit; the report carries both numbers, every recognised blend with its measured radius/setback and tangency, and the kernel's own reason code for any blend it refused
one of "keep", "refit", "auto"
budget optionalobjectwhen converge stops looking, whether or not the target was met. The report always says which of the two ran out ("stoppedBecause":"budget") and the best body found so far is still published
budget.candidatesintegerhow many candidates may be built, default 12. "candidates": 1 is the honest way to ask for exactly the first rung with its numbers measured
≥ 1
budget.msnumberwall-clock limit in milliseconds, default 60000. Checked BETWEEN candidates — a candidate that has started always finishes, because a measurement cut half way through is not a measurement
> 0
compare optionalboolean—
componentFineRetry optionalboolean—
componentFineRetryBudgetMs optionalnumber—
componentVerify optionalboolean—
components optionalboolean—
converge optionalboolean—
cornerConcurrency optionalboolean—
cuts optionalobject[]exact primitives for route "members": as "interfaces" they are UNITED as given (pads, feet, bosses, hubs — the faces the part bolts to); as "cuts" they are SUBTRACTED after every union (bores, clearance holes). "kind" is required
decimateBudget optionalinteger—
≥ 1
degree optionalinteger—
≥ 1
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
featureAngle optionalnumber—
> 0
heal optionalboolean—
healComponents optionalboolean—
hints optionalobject[]what you SAW, as a steer for the deterministic solver: [{region, kind}] (this region is really a cylinder — tried first, accepted at 2x tolerance), [{region, blendRadius}] (refit this fillet at r), [{axis:[x,y,z]}] (the part is extruded/revolved about this), [{merge:[i,j]}] (those two regions are ONE face). Region indices are report.faces[].index from the PREVIOUS run — faces[] carries centroid and bbox so you can map a coloured stripe in a mesh_compare diff PNG to a region. A hint LOOSENS, never forces: report.hints.rejected names any that missed, with the deviation measured.
≥ 1 items
interfaces optionalobject[]exact primitives for route "members": as "interfaces" they are UNITED as given (pads, feet, bosses, hubs — the faces the part bolts to); as "cuts" they are SUBTRACTED after every union (bores, clearance holes). "kind" is required
jobMode optionalboolean—
keepFailed optionalboolean—
maxRegions optionalinteger—
≥ 1
members optionalobjectroute "members"'s own tuning, forwarded verbatim to ops/meshMembers.js (its DEFAULTS): voxelMm (grid step, default bbox diagonal / 200 clamped to 0.4..2), coverMax (drop a strut/plate with >= this fraction inside plates/interfaces, 0.6), strutRadius ("uniform" — one radius per frame, exact nodes — or "measured"), fitVolume / maxGrow, gussets ("bridge" | "all" | "none"), jointBalls, minStrutRadius, autoInterfaces, autoSnapMm, budgetMs (per boolean in the emitted document, 60000). Every member is optional; an unknown one is ignored by the route
members.fullPlanbooleankeep the executor document on members.plan VERBATIM in the tool reply. By default the plan is compacted to an op census (count by op kind, resultId) so a many-strut frame fits the reply budget; the full document is what you re-run through cad_build_plan after editing a radius or a bore
minComponentTriangles optionalinteger—
≥ 1
mixed optionalboolean—
nu optionalinteger—
≥ 1
nv optionalinteger—
≥ 1
preflight optionalboolean—
preflightBudgetMs optionalnumber—
> 0
quad optionalobjectroute "quad"'s tuning: layout ("auto" = strut skeleton, else the general disk-partition layout; "skeleton"; "general"), tolerance (mm, drives the adaptive split), targetMm (region radius, default diagonal / 9), regions, spans, maxRefine (adaptive-split rounds, 3), and the switches below
quad.analyticenum—
one of "off", "hints", "auto"
quad.analyticAngleDegnumber—
≥ 0 · ≤ 90
quad.analyticBandMmnumber—
≥ 0
quad.analyticMinAreaFracnumber—
≥ 0 · ≤ 1
quad.analyticMinTrisinteger—
≥ 1
quad.analyticTolnumber—
> 0
quad.compactnessnumber—
≥ 0 · ≤ 100
quad.cornerTwistnumber—
≥ 0 · ≤ 1000000
quad.creaseDegnumber—
≥ 0 · ≤ 180
quad.cubeScalenumber—
> 0 · ≤ 10
quad.dataTangentWeightnumber—
≥ 0 · ≤ 1
quad.edgeChordnumber—
≥ 0 · ≤ 1
quad.edgeSamplesinteger—
≥ 4 · ≤ 400
quad.fanGapMinDegnumber—
≥ 0 · ≤ 60
quad.fitItersinteger—
≥ 0 · ≤ 200
quad.foldGridinteger—
≥ 4 · ≤ 64
quad.g1Blendboolean—
quad.g1Jointboolean—
quad.g1JointEndWeightnumber—
≥ 0 · ≤ 1
quad.g1JointWeightnumber—
≥ 0 · ≤ 1000000000
quad.g1Planesboolean—
quad.g1Polishinteger—
≥ 0 · ≤ 8
quad.g1PolishBandinteger—
≥ 1 · ≤ 3
quad.g1PolishDegnumber—
≥ 0 · ≤ 90
quad.g1PolishItersinteger—
≥ 1 · ≤ 50
quad.g1PolishStationsinteger—
≥ 4 · ≤ 64
quad.g1PolishWeightnumber—
≥ 0 · ≤ 1000000
quad.layoutenum—
one of "auto", "skeleton", "general"
quad.lloydItersinteger—
≥ 0 · ≤ 100
quad.maxArcsinteger—
≥ 0 · ≤ 64
quad.maxCornerDegnumber—
≥ 0 · ≤ 360
quad.maxRefineinteger—
≥ 0 · ≤ 12
quad.maxRegionsinteger—
≥ 1 · ≤ 5000
quad.maxSpansinteger—
≥ 1 · ≤ 16
quad.maxSplitPerRoundinteger—
≥ 1 · ≤ 1000
quad.mergeMmnumber—
≥ 0
quad.minFaceCosnumber—
≥ -1 · ≤ 1
quad.minStrutMmnumber—
≥ 0
quad.normalRadiusMmnumber—
> 0
quad.paramCorrectinteger—
≥ 0 · ≤ 8
quad.patchSamplesinteger—
≥ 4 · ≤ 200
quad.regionsinteger—
≥ 1 · ≤ 2000
quad.sectorCreaseWeightnumber—
≥ 0 · ≤ 1000000
quad.sectorPlanesboolean—
quad.skeletonobject—
quad.smoothnumber—
≥ 0 · ≤ 1
quad.smoothTwistnumber—
≥ 0 · ≤ 1000000
quad.spanGrownumber—
≥ 1 · ≤ 4
quad.spanRefineinteger—
≥ 0 · ≤ 12
quad.spansinteger—
≥ 1 · ≤ 16
quad.splitLowValenceboolean—
quad.straighteninteger—
≥ 0 · ≤ 20
quad.targetMmnumber—
> 0
quad.tolerancenumber—
> 0
quad.twistPlaneWeightnumber—
≥ 0 · ≤ 1000000000
quad.untangleFansboolean—
quad.vertexG1boolean—
quad.voxelMmnumber—
> 0
quad.wallSpansinteger—
≥ 1 · ≤ 32
recipe optionalboolean—
route optionalenumwhich rebuild runs. "auto" (default) is the surface ladder — analytic, polyhedral, recipe, mixed, spline — that asks "which SURFACE is this region". "members" asks "which MEMBER is this" instead: the mesh is voxelised and rebuilt as structural members — extruded plates, one-radius strut frames with exact cylinder-cylinder nodes, square tabs into bosses, planar gussets — united around the exact "interfaces" given, with "cuts" subtracted LAST so every bore is the exact cylinder asked for. It is the route for a topology-optimised or lattice part, whose organic skin no surface route can close as one body; the result is one watertight solid of planes, cylinders and spheres only, and the executor DOCUMENT that built it plus the feature tree ({plates, struts, joints, balls, tabs, gussets, interfaces, cuts}) and voxel statistics ride on the result's "members" (plan, stats, body). With neither "interfaces" nor "cuts", the mesh's own cylinder regions are read as bores and bosses (members.autoInterfaces).
one of "auto", "members", "quad"
samples optionalinteger—
≥ 1
segmentation optionalenumhow the triangles are grouped into regions before recognition. "fit" (default) grows each region while a MEASURED fit through its own points stays within "tolerance" — planes first, then cylinders/cones/spheres/tori, then whatever is left by the crease rule — which is the only way a TANGENT boundary is found: a fillet is G1 to both of its supports, so no edge on either side of it is a crease and the plane, the fillet and the next plane come back as ONE region that fits nothing. "dihedral" is CADSF-958's crease flood fill, unchanged, for a caller who wants exactly the behaviour that shipped. The report carries "segmentation.mode" and "segmentation.byKind" so you can see which regions the segmenter proposed as what
one of "fit", "dihedral"
smoothing optionalnumbera length in mm, zero or greater
≥ 0
ssi optionalboolean—
stitchTol optionalnumber—
> 0
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
target optionalobjectwhat "good enough" means for converge — the loop stops as soon as ONE candidate meets every member of this at once. Every member is optional and takes the default named below, so "converge": true on its own is already a complete ask. Whether each one was met, for the body that actually shipped, comes back on the report as "converge.met"
target.minIou2dnumberthe WORST cutting-plane station's 2-D section overlap (even-odd filled, so holes count). Default 0.99 — ops/meshCompare.js's own DEFAULT_SECTION_TARGETS, the number that sees INSIDE the part
≥ 0 · ≤ 1
target.minSilhouetteIoUnumberthe WORST of the 8 canonical views' silhouette IoU. Default 0.995. Only evaluated for candidates that already met every numeric target — rendering is earned, not spent up front — and not at all when rendering is off
≥ 0 · ≤ 1
target.normalisedHausdorffnumberthe TWO-SIDED Hausdorff distance between mesh and body as a fraction of the mesh's bounding-box diagonal. Default 2 x tolerance / diagonal — i.e. the plan's "within two tolerances everywhere" rule, expressed scale-free
≥ 0
target.volumeErrorPctnumberthe allowed |volume error| in per cent, body against the closed mesh. Default 0.5
≥ 0
target.worstAreaErrorPctnumberthe worst cutting-plane station's signed-area error, per cent. Default 1.0
≥ 0
tolerance optionalnumber—
> 0
verify optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mesh_section write Mesh section

Slice an imported mesh into closed section polylines and segment each into line / arc / B-spline spans.

Full description

Publishes NO body — a section is curves. of names an import that published a mesh. Call cad_help({tool:"cad_mesh_section"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
atRegions optionalboolean—
axis optionalarray | stringthe axis a stack of sections runs along…
cornerAngleDeg optionalnumber—
> 0
count optionalinteger—
≥ 1
document optionalstringhandle or "new"
length ≥ 1
featureAngle optionalnumber—
> 0
fit optionalboolean—
fitTol optionalnumber—
> 0
from optionalnumber—
inset optionalnumbermm, >= 0
≥ 0
keepFailed optionalboolean—
minSpanPoints optionalinteger—
≥ 1
plane optionalobjectone cutting plane: { origin: [x,y,z], normal: […
plane.normalnumber[]the plane's normal, [x, y, z]…
exactly 3 items
plane.originnumber[]a point ON the cutting plane, [x, y, z] in mill…
exactly 3 items
plane.xAxisnumber[]OPTIONAL: which in-plane direction the section'…
exactly 3 items
points optionalboolean—
spacing optionalnumber—
> 0
suppressed optionalbooleantrue = not built
to optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mesh_compare read Compare mesh to body

Measure a solid against the mesh it was reconstructed from, or any mesh — the SAME engine cad_mesh_to_brep's own compare:true calls, exposed on its own.

Full description

Call cad_help({tool:"cad_mesh_compare"}) for the rest.

ArgumentTypeMeaning & bounds
body requiredstringThe SOLID to measure — typically the body cad…
length ≥ 1
of requiredstringThe MESH to compare against — an .stl/.obj/.3…
length ≥ 1
imageSize optionalinteger—
≥ 1
outDir optionalstringDirectory rendered PNGs are written under…
length ≥ 1
overlay optionalbooleanAlso write an interactive HTML viewer showing t…
sections optionalboolean | objectfalse to skip the cutting-plane comparison, or…
tolerance optionalnumber—
> 0
views optionalarray | booleantrue (all 8 canonical views), false…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_surface_analysis read Surface analysis (class A)

Read-only class-A surface analysis of bodies or sheets.

Full description

continuity: G0 gap mm, G1 normal deg, G2 jump 1/mm per shared edge, sheet edge pair or in-face crease; PASS/FAIL at 0.001 mm / 0.2 deg. knots: B-spline face interior knot lines classed G0-G4 (Parasolid needs G1). curvature: per-face, min radius, comb. zebra: stripe jump per join. deviation: distance to ref. draft: face angle vs pull.

ArgumentTypeMeaning & bounds
kind requiredenum—
one of "continuity", "curvature", "zebra", "deviation", "draft", "knots"
of requiredstring | arrayBody/sheet handle(s); several pair their edges.
≥ 1 items · ≤ 8 items
chordTol optionalnumberTessellation chord, mm.
> 0
comb optionalobjectcurvature: comb on {edge} or {face, u|v 0..1}.
comb.edgestring—
comb.facestring—
comb.unumber—
≥ 0 · ≤ 1
comb.vnumber—
≥ 0 · ≤ 1
edges optionalbooleanknots: also grade shared edges.
faces optionalstring[]Only these face ids.
field optionalbooleanzebra: add the per-vertex stripe field.
light optionalnumber[]zebra: light direction (default 1,1,1).
exactly 3 items
minDraft optionalnumberdraft: floor, deg (default 1).
≥ 0
pull optionalnumber[]draft: pull direction (default +Z).
exactly 3 items
ref optionalstringdeviation: reference body, sheet or mesh.
samples optionalintegerSamples per edge / comb (default 24).
≥ 4 · ≤ 200
stripes optionalnumberzebra: stripe pairs per 180 deg (default 8).
> 0
target optionalenumknots: class to verify (default G2).
one of "G1", "G2", "G3", "G4"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
comb optionalobject—
creases optionalany[]—
edges optionalany[]—
faces optionalany[]—
field optionalobject—
kind optionalstring—
parasolid optionalobject—
summary optionalobject—
under optionalany[]—
verdict optionalstring—

cad_crease_repair destructive Crease repair

Repair the interior G1 creases Parasolid-based CAD splits on import: smooth the small ones, turn the rest into real edges.

Full description

Retires of (a solid or a sheet), publishes ONE body of the same kind. Call cad_help({tool:"cad_crease_repair"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
dryRun optionalboolean—
faceBudget optionalintegera positive integer
≥ 1
faces optionalstring[]an array of raw STEP face id strings…
keepFailed optionalboolean—
mode optionalenum"auto" = smooth the creases within smoothTol an…
one of "auto", "smooth", "split"
smoothTol optionalnumbermm, >= 0
≥ 0
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_shell_from_outline write Shell from outline

Press a MOULDED SHELL from a plan outline, a rim-height profile, a dish and a thickness — one closed solid with tangent-continuous walls, optionally with its swivel base.

Full description

For a moulded shell — an Egg, a Swan, a Series 7 seat pan — do NOT loft 40 cross sections and do NOT sweep a thin rectangle. Call cad_help({tool:"cad_shell_from_outline"}) for the rest.

ArgumentTypeMeaning & bounds
dish requirednumber | objecthow deep it dishes below the LOWEST rim point, and with what bowl / flare / profile shape
outline requiredarray | objectthe closed PLAN silhouette in mm, as [x, y] points; smoothed to a fair curve unless smooth:false
rimHeight requiredarray | numbera number, or PERIODIC {t,z}
thickness requirednumberINWARD from the OUTER face
> 0
base optionalboolean | objectalso build the swivel base (arms + hub disc + column) as a SECOND body beside the shell
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
flare optionalnumberalias for dish.flare: the wall's lean from VERTICAL at the rim, in degrees
> 0 · < 89
g1TolDeg optionalnumberthe tangent-continuity gate in degrees (default 1) — a bigger crease is refused by name
> 0
keepFailed optionalboolean—
samples optionalintegerfit grid per direction (default 17): higher fits closer and thickens slower
≥ 8 · ≤ 64
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
tol optionalnumberoffset tolerance in mm (default 1e-3 of the plan diagonal); much tighter is much slower
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Booleans, transforms & patterns · 13

Combining and rearranging bodies: the three booleans, rigid transforms, mirroring and patterning, the splits that divide a body or a face, and the stitch that closes a shell back into a solid.

cad_boolean_union destructive Boolean union

Boolean union: base plus tool (A u B).

Full description

Exact on planes, cylinders, cones and spheres — support matrix below. For a boss on a planar face, prefer cad_pad (analytic, instant); union with cad_cylinder is exact there too, fillets or holes included (measured on a filleted, drilled 40x40x10 plate: 15 faces in 0.05-0.1 s). Call cad_help({tool:"cad_boolean_union"}) for the rest.

ArgumentTypeMeaning & bounds
allowMultiLump optionalboolean—
analyticOnly optionalboolean—
bodies optionalstring[]non-empty strings
≥ 1 items
budgetMs optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
fallback optionalobjectladder opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
fuzzy optionalnumber—
implicitFallback optionalboolean—
keepFailed optionalboolean—
keepInputs optionalboolean—
meshFallback optionalboolean—
mitre optionalboolean—
of optionalstringbody handle
length ≥ 1
order optionalenumthe order a multi-tool union folds its tools in.
one of "input", "overlap", "many"
suppressed optionalbooleantrue = not built
tool optionalarray | stringhandle(s) or a group

Exactly one of these argument shapes: of + tool — or — bodies. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_boolean_subtract destructive Boolean subtract

Boolean subtract: base minus tool (A - B).

Full description

Exact on planes, cylinders, cones, tori and axis-clipped spheres — support matrix below. Call cad_help({tool:"cad_boolean_subtract"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
tool requiredarray | stringhandle(s) or a group
allowMultiLump optionalboolean—
budgetMs optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
fallback optionalobjectladder opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
fuzzy optionalnumber—
implicitFallback optionalboolean—
keepFailed optionalboolean—
keepInputs optionalboolean—
meshFallback optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_boolean_intersect destructive Boolean intersect

Boolean intersect: base and tool (A n B).

Full description

Exact for two axis-aligned boxes, a convex planar tool, and a ball clipped by a convex planar body on ANY number of axes — the rounded cube included — support matrix below. Call cad_help({tool:"cad_boolean_intersect"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
tool requiredarray | stringhandle(s) or a group
allowMultiLump optionalboolean—
budgetMs optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
fallback optionalobjectladder opt-in
fallback.allowDegradedboolean—
fallback.allowTolerantboolean—
fallback.disablestring[]—
fallback.maxRunginteger | string—
fuzzy optionalnumber—
keepFailed optionalboolean—
keepInputs optionalboolean—
meshFallback optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_transform write Transform

Rotate (any axis) and/or translate a solid — MOVES it by default.

Full description

Call cad_help({tool:"cad_transform"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
copy optionalboolean—
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
rotate optionalobjectEuler OR axis+angle
rotate.anglenumberradians about axis
rotate.axisnumber[][x,y,z], any length
exactly 3 items
rotate.centernumber[]fixed point, mm
exactly 3 items
rotate.rxnumberrad about world +X
rotate.rynumberrad about world +Y
rotate.rznumberrad about world +Z
rotateZ optionalobjecta rotation about the world +Z axis
rotateZ.anglenumberrotation angle about +Z, radians
rotateZ.centernumber[]rotation centre [x,y,z] in mm, default [0,0,0]
exactly 3 items
suppressed optionalbooleantrue = not built
translate optionalnumber[][x,y,z] mm
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mirror write Mirror

Mirror a solid across a plane through the origin.

Full description

normal [nx,ny,nz] defines the mirror plane (through the world origin). Example: {"op":"mirror","id":"mirrored","of":"src","normal":[1,0,0]}

ArgumentTypeMeaning & bounds
normal requirednumber[][x,y,z] mm
exactly 3 items
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_copy write Copy

Duplicate a solid unchanged.

Full description

A plain clone of of at the same location — the identity case of transform. Example: {"op":"copy","id":"dup","of":"src"}

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_pattern_copies write Pattern copies

Linear, circular or direction-driven array of copies of a solid.

Full description

Call cad_help({tool:"cad_pattern_copies"}) for the rest.

ArgumentTypeMeaning & bounds
count requiredintegeran integer >= 2
≥ 2
of requiredstringbody handle
length ≥ 1
type requiredenumpattern kind — "linear" (needs "step"), "circ…
one of "linear", "circular", "directions"
center optionalnumber[][x,y,z] mm
exactly 3 items
directions optionalnumber[][]one direction vector per pattern instance, inst…
≥ 2 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
step optionalnumber[][x,y,z] mm
exactly 3 items
suppressed optionalbooleantrue = not built
totalAngle optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_split_plane destructive Split by plane

Cut a solid with a plane — or with a curved SURFACE — and keep one half, or both lumps.

Full description

Retires of and the discarded half. point (any point on the cut plane) + normal define the plane; keep ("above"|"below", default "above") selects which side of the normal survives. Call cad_help({tool:"cad_split_plane"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
cutter optionalobjectthe SURFACE to cut with, extended infinitely: {…
cutter.kindenum—
one of "cylinder", "face", "sheet", "plane"
cutter.axisnumber[]cylinder: the axis direction
exactly 3 items
cutter.faceIdstringface: a raw STEP face id of ANY body in the doc…
length ≥ 1
cutter.normalnumber[]plane: the plane normal
exactly 3 items
cutter.pointnumber[]cylinder: a point on the axis · plane: a point…
exactly 3 items
cutter.radiusnumbercylinder: the cutter radius in millimetres
> 0
cutter.sheetBodyIdstringsheet: an OPEN sheet body id; every face of it…
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keep optionalenumwhich half-space to keep, relative to the cut p…
one of "above", "below"
keepFailed optionalboolean—
normal optionalnumber[][x,y,z] mm
exactly 3 items
point optionalnumber[][x,y,z] mm
exactly 3 items
suppressed optionalbooleantrue = not built

Exactly one of these argument shapes: point + normal — or — cutter. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_split_face destructive Split face

Split one face of a solid along a cutting plane into two (or more) pieces, without separating the solid.

Full description

Retires of, publishes ONE new solid — unlike split_plane, no material is removed and nothing is discarded. Call cad_help({tool:"cad_split_face"}) for the rest.

ArgumentTypeMeaning & bounds
faceId requiredstring—
length ≥ 1
normal requirednumber[][x,y,z] mm
exactly 3 items
of requiredstringbody handle
length ≥ 1
point requirednumber[][x,y,z] mm
exactly 3 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_split_edge destructive Split edge

Subdivide one edge of a solid into two edges sharing a new vertex, without changing geometry.

Full description

Retires of, publishes ONE new solid. Call cad_help({tool:"cad_split_edge"}) for the rest.

ArgumentTypeMeaning & bounds
edgeId requiredstring—
length ≥ 1
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
point optionalnumber[][x,y,z] mm
exactly 3 items
suppressed optionalbooleantrue = not built
t optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_split_periodic_face destructive Split periodic face

Split a periodic (single-seam) face at its seam into two non-periodic faces.

Full description

Retires of, publishes ONE new solid. Call cad_help({tool:"cad_split_periodic_face"}) for the rest.

ArgumentTypeMeaning & bounds
faceId requiredstring—
length ≥ 1
of requiredstringbody handle
length ≥ 1
angle optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_stitch write Stitch

Sew coincident-edge sheet bodies into ONE manifold solid.

Full description

bodies is a list of earlier op ids (NOT of/tool — there is no base/tool asymmetry among several sheets). tol has no default: resolved from the model's STEP tolerance, refusing to run if the resolved tolerance would bridge distinct corners. Call cad_help({tool:"cad_stitch"}) for the rest.

ArgumentTypeMeaning & bounds
bodies requiredstring[]non-empty strings
≥ 1 items
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built
tol optionalnumber—
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_segment_components read Segment a body into connected components

Group a body's own faces into CONNECTED COMPONENTS over shell adjacency (shared edges) — answers "is this one connected piece, or several disjoint ones sharing a single solid id" for a body a checked op never refused (every manifold/watertight check passes N disjoint watertight pieces just as cleanly as one).

Full description

Call cad_help({tool:"cad_segment_components"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringid or "<id>#<n>"
summary optionalbooleanCADSF-2183: counts + bounding boxes only -- omi…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Shaft features & turned parts · 6

Turned-part vocabulary as first-class operations, so a shaft — or a chair leg — is described the way it is manufactured rather than reconstructed from booleans.

cad_shaft_shoulder destructive Shaft shoulder / step

Turn a shaft down to a smaller diameter beyond a shoulder face, with an optional relief undercut.

Full description

Retires of. z is the shoulder face, diameter the turned-down diameter beyond it, side ("above" default, or "below") which end is reduced. Call cad_help({tool:"cad_shaft_shoulder"}) for the rest.

ArgumentTypeMeaning & bounds
diameter requirednumber—
> 0
of requiredstringbody handle
length ≥ 1
z requirednumber—
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
relief optionalobjectrelief undercut at the inside corner of the sho…
relief.depthnumberundercut depth below the turned diameter, mm
> 0
relief.formenumdefault "square" (a rectangular plunge recess)…
one of "square", "round"
relief.widthnumberundercut length along the axis, mm — omit for…
> 0
side optionalenumdefault "above" — which end of the shaft is t…
one of "above", "below"
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_shaft_groove destructive Shaft groove

Cut a circumferential groove in a turned shaft — square-shouldered (retaining-ring) or full-radius (seal).

Full description

Retires of. of must be a solid of revolution about +Z (a cylinder, a revolve, or the result of another shaft_* op). Call cad_help({tool:"cad_shaft_groove"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
width requirednumber—
> 0
z requirednumber—
depth optionalnumber—
> 0
diameter optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
form optionalenumdefault "rectangular" — the square-shouldered…
one of "rectangular", "round"
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built
surface optionalenumouter (default)|bore
one of "outer", "bore"
toolMatch optionalboolean | object | stringmatch stocked tools

Exactly one of these argument shapes: depth — or — diameter. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_shaft_keyway destructive Shaft keyway

Mill an axial parallel keyway (square-ended, BS 4235-1 / DIN 6885-1 form B) into a cylindrical section of a shaft.

Full description

Retires of. Call cad_help({tool:"cad_shaft_keyway"}) for the rest.

ArgumentTypeMeaning & bounds
length requirednumber—
> 0
of requiredstringbody handle
length ≥ 1
z requirednumber—
azimuth optionalnumber—
depth optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
standard optionalenumlook the key width b and the slot depth up from…
one of "BS4235", "DIN6885"
suppressed optionalbooleantrue = not built
surface optionalenumouter (default)|bore
one of "outer", "bore"
width optionalnumber—
> 0

Exactly one of these argument shapes: width + depth — or — standard. No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_shaft_center_drill destructive Shaft centre drill

Drill a centre hole (pilot bore + 60 degree protecting countersink) in a shaft end face.

Full description

Retires of. Call cad_help({tool:"cad_shaft_center_drill"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
pilotDepth requirednumber—
> 0
pilotDiameter requirednumber—
> 0
angle optionalnumberincluded angle in DEGREES…
> 0 · < 180
countersinkDiameter optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
end optionalenumdefault "top" — which end face is centre-dril…
one of "top", "bottom"
keepFailed optionalboolean—
pointAngle optionalnumber | nulldrill-point included angle in DEGREES at the pi…
> 0 · < 180
suppressed optionalbooleantrue = not built
toolMatch optionalboolean | object | stringmatch stocked tools

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_revolve_feature destructive Revolve grooves / steps / lands

Cut grooves, machined steps and seal lands into an existing solid of revolution — outer walls, bores, CONES and flange faces — many features in one rebuild.

Full description

Retires of. of must be a solid of revolution about +Z (a revolve, a cylinder, or another revolve_feature/shaft_* result). Call cad_help({tool:"cad_revolve_feature"}) for the rest.

ArgumentTypeMeaning & bounds
features requiredobject[]the features to cut/raise in ONE profile rebuil…
≥ 1 items
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_turned_leg write Turned leg

Turn a chair leg or spindle: a taper with beads, coves and an integral tenon or dowel end, stood on the floor at a splay with its top cut to mate the seat underside.

Full description

Call cad_help({tool:"cad_turned_leg"}) for the rest.

ArgumentTypeMeaning & bounds
bottomDiameter optionalnumber—
> 0
collar optionalnumber—
> 0
document optionalstringhandle or "new"
length ≥ 1
end optionalobject | stringthe integral end at the TOP of the leg, on the…
features optionalobject[]lathe details on the taper, in any order; each…
foot optionalobjecta straight FOOT band under the taper…
foot.heightnumberheight of the straight foot band from the floor…
> 0
foot.diameternumberfoot band diameter, mm…
> 0
keepFailed optionalboolean—
length optionalnumber—
> 0
margin optionalnumber—
> 0
placement optionalobjectwhere the leg stands and how it leans.
placement.anchorenumdefault "foot".
one of "foot", "top"
placement.floorZnumberthe floor plane the foot's lowest point rests o…
placement.pointnumber[]anchor "foot": the foot centre's plan position…
≥ 2 items · ≤ 3 items
placement.splayXnumberdegrees the leg's TOP leans toward +X (default 0).
placement.splayYnumberdegrees the leg's TOP leans toward +Y (default 0)
suppressed optionalbooleantrue = not built
topDiameter optionalnumber—
> 0
trimTopTo optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Joinery · 2

Real joints between two parts that stay two parts, and real standard fasteners through a stack of parts: the mortise is cut in one member and the tenon formed on the other, or a catalogue screw is placed on an axis and each part it passes gets the pilot, clearance, counterbore or countersink hole its material asks for.

cad_joint write Joint

Form a REAL joint between two named parts and keep them two parts: mortise-and-tenon, wedged through-tenon, dowel, half-lap, bridle or a revolute "pin" stack; CLEARANCE goes on the mortise, and "finger"/"dovetail" are refused by name.

Full description

The only verb that takes TWO bodies and leaves TWO. Call cad_help({tool:"cad_joint"}) for the rest.

ArgumentTypeMeaning & bounds
partA requiredstringbody handle
length ≥ 1
partB requiredstringbody handle
length ≥ 1
angle optionalnumber—
axis optionalenumthe WORLD axis the entering member (partA) tr…
one of "x", "y", "z"
bush optionalenumpin: bush in partA
one of "iso3547", "none"
clearance optionalnumber—
count optionalinteger—
≥ 1
depth optionalnumber—
> 0
diameter optionalnumber—
> 0
direction optionalenumwhich way along axis the entering member trav…
one of 1, -1
document optionalstringhandle or "new"
length ≥ 1
fit optionalstringpin: ISO 286 fit, default "H8/f7"
pattern ^[A-Z]\d{1,2}/[a-z]\d{1,2}$
float optionalnumber—
> 0
haunch optionalboolean | numbermortise_tenon only: keep a short strip of the e…
haunchLength optionalnumber—
> 0
journal optionalenumpin: default "bolt" under Ø8
one of "bolt", "sleeve"
keepFailed optionalboolean—
kerfDepth optionalnumber—
> 0
kerfWidth optionalnumber—
> 0
kind optionalenumdefault "mortise_tenon".
one of "mortise_tenon", "through_tenon_wedged", "dowel", "half_lap", "bridle", "pin", "finger", "dovetail"
offset optionalobjectshift the tenon off the entering member's secti…
offset.xnumbermm off the entering member's own section centre…
offset.ynumbermm off the entering member's own section centre…
offset.znumbermm off the entering member's own section centre…
pinAxis optionalnumber[][x,y,z] mm
exactly 3 items
pinPoint optionalnumber[][x,y,z] mm
exactly 3 items
position optionalnumber—
protrusion optionalnumber—
> 0
suppressed optionalbooleantrue = not built
tenonLength optionalnumber—
> 0
tenonThickness optionalnumber—
> 0
tenonWidth optionalnumber—
> 0
tol optionalnumber—
> 0
wedges optionalinteger—
≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fastener write Fastener

Place a STANDARD fastener; the part's MATERIAL decides the hole: PILOT, clearance or TAP DRILL, thread a SIMPLIFIED annotation.

Full description

Call cad_help({tool:"cad_fastener"}) for the rest.

ArgumentTypeMeaning & bounds
axis requiredenumthe direction the fastener…
one of "x", "-x", "y", "-y", "z", "-z"
kind requiredenumwhich STANDARD fastener to…
one of "socket_cap", "button", "hex_bolt", "wood_screw", "csk_100", "csk_iso7046", "csk_iso10642", "csk_raised_iso7047", "pan_iso7045", "connector_bolt", "dowel_pin", "insert", "stud"
point requirednumber[][x,y,z] mm
exactly 3 items
size requirednumber | stringthe nominal size.
allowGaps optionalboolean—
boltClearance optionalnumbermm, >= 0
≥ 0
clearanceGrade optionalenumdefault "medium" — which…
one of "fine", "medium", "coarse"
counterbore optionalboolean—
countersink optionalboolean—
document optionalstringhandle or "new"
length ≥ 1
drive optionalenumthe drive recess cut into t…
one of "pozidriv", "phillips", "hex", "torx", "none"
flangeMinWall optionalnumber—
host optionalstring[]non-empty strings
≥ 1 items
insert optionalobjectCADSF-102136: a POTTED INSE…
insert.lengthnumberoverall insert length along…
> 0
insert.odnumberbarrel outside Ø, mm
> 0
insert.boreDianumberinsert bore Ø, mm…
> 0
insert.flangeOdnumberflange Ø at the insert top…
> 0
insert.flangeThknumberflange thickness, mm
> 0
insert.topnumberlocal z of the insert top o…
keepFailed optionalboolean—
length optionalnumber | string—
materials optionalobjectREQUIRED with parts…
≥ 1 keys
name optionalstringa string — for blend's `a…
nut optionalboolean—
parts optionalstring[]non-empty strings
≥ 1 items
pottingGap optionalnumbermm, >= 0
≥ 0
suppressed optionalbooleantrue = not built
tapped optionalboolean—
thread optionalenum"modelled" = the real ISO 6…
one of "cosmetic", "modelled"
threadLength optionalnumber—
> 0
through optionalboolean—
tol optionalnumber—
> 0
washer optionalboolean | stringfit DIN 125-A plain washer(s).
wetted optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Datums, parameters & model state · 24

The parametric layer: datum geometry to build against, named parameters you can read and set, the plan normaliser that turns a spec into ops, and the document state itself.

cad_datum_plane write Datum plane

Construction reference PLANE (no B-rep, never written to STEP).

Full description

method: "offset" (of+face, or origin+normal, plus distance), "midplane" (of+faceA+faceB, must be parallel), "three_point" (points, 3x [x,y,z] — winding sets the normal by the right-hand rule). Its frame {origin,xAxis,yAxis,normal} can be used as a sketch's plane. Call cad_help({tool:"cad_datum_plane"}) for the rest.

ArgumentTypeMeaning & bounds
method requiredstring—
length ≥ 1
distance optionalnumber—
document optionalstringhandle or "new"
length ≥ 1
face optionalobject | stringa face selector
faceA optionalobject | stringa face selector
faceB optionalobject | stringa face selector
keepFailed optionalboolean—
normal optionalnumber[][x,y,z] mm
exactly 3 items
of optionalstringbody handle
length ≥ 1
origin optionalnumber[][x,y,z] mm
exactly 3 items
points optionalnumber[][]exactly 3 [x,y,z] points (mm)
exactly 3 items
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_datum_axis write Datum axis

Construction reference AXIS.

Full description

method: "two_point" (points, 2x [x,y,z]), "face_normal" (of+face+point), "cylinder" (of+face, the axis of a cylindrical/conical face). Example: {"op":"datum_axis","id":"ax1","method":"two_point","points":[[0,0,0],[0,0,100]]}

ArgumentTypeMeaning & bounds
method requiredstring—
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
face optionalobject | stringa face selector
keepFailed optionalboolean—
of optionalstringbody handle
length ≥ 1
point optionalnumber[][x,y,z] mm
exactly 3 items
points optionalnumber[][]exactly 2 [x,y,z] points (mm)
exactly 2 items
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_datum_point write Datum point

Construction reference POINT.

Full description

method: "vertex" (explicit point), "edge_midpoint" (of+edge, or explicit points 2x [x,y,z] endpoints). Example: {"op":"datum_point","id":"p1","method":"vertex","point":[10,10,0]}

ArgumentTypeMeaning & bounds
method requiredstring—
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
edge optionalstring—
length ≥ 1
keepFailed optionalboolean—
of optionalstringbody handle
length ≥ 1
point optionalnumber[][x,y,z] mm
exactly 3 items
points optionalnumber[][]exactly 2 [x,y,z] points (mm)
exactly 2 items
suppressed optionalbooleantrue = not built

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_param_get read Read a named parameter

Named parameters live OUTSIDE a command document's ops[] array (passed as run()'s opts.params, or a project file's reserved params key — see cli.js's runProjectFile) and are referenced from op fields as "param:name" or an inline expression string (commands/param-resolve.js).

Full description

This op reads back createParamTable().getParam(name). Call cad_help({tool:"cad_param_get"}) for the rest.

ArgumentTypeMeaning & bounds
name requiredstringparameter name
pattern ^[A-Za-z_][A-Za-z0-9_]*$

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_param_set write Create or update a named parameter

Expressions are evaluated by commands/expr.js's safe recursive-descent parser (no eval()/Function()); may reference any other parameter by name.

Full description

A cyclic reference, unknown name, or division-by-zero becomes a per-parameter .error string, never a throw. Wraps createParamTable().setParam(name, expr). Call cad_help({tool:"cad_param_set"}) for the rest.

ArgumentTypeMeaning & bounds
expr requiredstringe.g. "40", "width/2 + 5" — may reference othe…
length ≥ 1
name requiredstringmust start with a letter/underscore; letters, d…
pattern ^[A-Za-z_][A-Za-z0-9_]*$

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_param_list read List every named parameter

List every named parameter in the active document's parameter table: name, expression, current value, and any evaluation error (unknown reference, cyclic reference, division by zero).

Full description

Call this before cad_param_set on an unfamiliar model to see what already exists and what depends on what.

Takes no arguments.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_build_plan write Build plan

Run a whole BUILD PLAN — an ordered list of kernel operations — in ONE call, instead of one tool call per operation.

Full description

Pass cad_spec_configure's result (or just its "plan") straight through, unedited; a bare list of ops works too. A step "id" is not a body handle. Call cad_help({tool:"cad_build_plan"}) for the rest.

ArgumentTypeMeaning & bounds
plan requiredarray | objectthe operations to run, in order.
document optionalstringhandle or "new"
length ≥ 1
fill optionalobjectfields to merge into individual steps before ru…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_batch write Run several tool calls in one call

Run an ordered list of THIS SERVER'S OWN tool calls in one request, passing each result to the next.

Full description

Use it whenever you already know the next two or more calls: a nine-feature part is nine round trips otherwise, each paid for as a full result frame. Ops run serially in the same session, exactly as if you had called them one at a time. Call cad_help({tool:"cad_batch"}) for the rest.

ArgumentTypeMeaning & bounds
ops requiredobject[]The calls to run, in order.
≥ 1 items · ≤ 64 items
atomic optionalbooleanAll or nothing (default false): if any op fails…
result optionalenum"compact" (default): per-op {index, tool, ok, h…
one of "compact", "full"
stopOnError optionalbooleanStop at the first failing op and report it as t…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bytes optionalobjectops = summed size of the individual frames this…
completedOps optionalany[]Promoted batch: ops that finished before the so…
count optionalnumberOps actually run…
failedCount optionalnumberPresent when ok is false (stopOnError:false): h…
handles optionalobjectPresent when ok is false (stopOnError:false): l…
jobId optionalstringPromoted batch: the job running pendingOp.
mode optionalstring—
ok optionalbooleanTrue when every op succeeded…
ops optionalobject[]—
pendingOp optionalobjectPromoted batch: {index, tool} of the op now run…
pollAfterMs optionalnumber—
promoted optionalbooleanTrue when a long op was promoted to an async jo…
remainingOps optionalany[]Promoted batch: ops after pendingOp that were N…
result optionalobjectThe final op's full result ("compact" mode).

cad_list_model_state read List live documents and body handles

List every document and handle (solid/face/edge/sketch/sheet/group) currently live in this server's session: what a restart or a lost context cannot recover any other way.

Full description

Call this after an E_NOT_FOUND on a handle you expected to still exist, or at the start of a session to see what (if anything) is already there. Call cad_help({tool:"cad_list_model_state"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstringLimit the listing to one document handle…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
client optionalstring | nullThe client scope listed…
documents optionalobject[]—
humanEditsSinceLastCall optionalobject[]Live edit: what a person changed since your las…
journal optionalstring | nullPath to this session's op journal, or null when…
liveEdit optionalobject | nullLive-edit status; null when off.
restored optionalobject | nullNon-null when the documents below were rebuilt…
sessionEpoch optionalstring | null—
sessionReset optionalobject | nullNon-null when the PREVIOUS boot had live geomet…
usage optionalobjectsession.getUsage() for the active session — b…

cad_set_part write Name a body as a part (name, material, quantity, colour)

SAY WHAT A BODY IS.

Full description

Stamps a part name (and optionally a material and a quantity) onto one or more bodies, so a document of loose solids becomes an assembly of named parts. Call cad_help({tool:"cad_set_part"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstring | arrayThe body (or bodies) to stamp: a handle an earl…
part requiredstringThe part name or part number.
length 1–255
color optionalstring | arrayUS spelling of "colour" (same value)
colour optionalstring | arrayCADSF-2886: the part's colour, "#RRGGBB" / "#RG…
document optionalstringWhich session document the bodies are in.
flow optionalobject—
material optionalstringFree-text material label…
length ≤ 255
qty optionalintegerHow many of this part THIS BODY stands for…
≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
document optionalstring | null—
parts optionalobject[]One row per stamped body: {ref, solid, part, ma…
stamped optionalinteger—

cad_delete_body destructive Delete a body from its document

Remove ONE body (or sheet, mesh, group, sketch) from its document: the op that produced it is taken out of the document's op list, the rest is rebuilt, and its handles are released — so it stays gone across every later call, and cad_list_model_state no longer lists it.

Full description

Call cad_help({tool:"cad_delete_body"}) for the rest.

ArgumentTypeMeaning & bounds
body requiredstringThe handle a modelling call returned…
length ≥ 1
document optionalstringThe document the body is in.
force optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bodies optionalintegerLive bodies left in the document.
deleted optionalstringThe reference as given.
document optionalstring—
ops optionalobject[]Document ops removed: [{index, id, op}].
released optionalstring[]Session handles released.
remainingOps optionalinteger—

cad_snapshot write Freeze the document as a named version

Freeze a document's current state (its op list and handles) as a named version, cheaply — the op list is the model.

Full description

Keep modelling afterwards; cad_versions lists the versions, cad_restore rewinds to one, cad_branch forks a new document from one. Take one before a simulation or a risky edit so the result stays comparable. Names are unique per document (E_VERSION_EXISTS).

ArgumentTypeMeaning & bounds
name requiredstringThe version name, unique within the document…
length 1–64 · pattern ^[A-Za-z0-9][A-Za-z0-9 _.-]*$
document optionalstringThe document to snapshot.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
document optionalstring—
version optionalobject—
version.createdAtstring—
version.documentstring—
version.handlesinteger—
version.idstring—
version.namestring—
version.opCountinteger—
version.parentstring | nullparent version
version.resultsobject[][{tool,at,summary}]
version.summaryobject | null{bbox,volume,bodies}

cad_branch write Fork a new document from a version

Fork a NEW, independent document from a version: the version's ops are replayed into it and every body gets a fresh handle (handles maps the version's handles to the new ones).

Full description

The original document is untouched, so a variant can be modelled and simulated without contaminating the baseline. The new document starts with its own version named name (parent: from).

ArgumentTypeMeaning & bounds
from requiredstringThe version to fork: its id ("v2") or its name.
length ≥ 1
name requiredstringName of the new document's baseline version.
length 1–64 · pattern ^[A-Za-z0-9][A-Za-z0-9 _.-]*$

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
document optionalstringThe new document handle — pass it as `documen…
from optionalobject—
from.createdAtstring—
from.documentstring—
from.handlesinteger—
from.idstring—
from.namestring—
from.opCountinteger—
from.parentstring | nullparent version
from.resultsobject[][{tool,at,summary}]
from.summaryobject | null{bbox,volume,bodies}
handles optionalobjectVersion handle -> the new document's handle for…
replayed optionalinteger—
version optionalobject—
version.createdAtstring—
version.documentstring—
version.handlesinteger—
version.idstring—
version.namestring—
version.opCountinteger—
version.parentstring | nullparent version
version.resultsobject[][{tool,at,summary}]
version.summaryobject | null{bbox,volume,bodies}

cad_restore destructive Rewind a document to a version

Rewind a document to one of its versions: the op list becomes the version's and is rebuilt.

Full description

Handles minted after the version stop resolving (released); handles the version had come back under their original names. The current state is NOT saved first — cad_snapshot it if you may want it back. A version of another document is refused (E_CONFLICT): cad_branch it instead.

ArgumentTypeMeaning & bounds
version requiredstringThe version to rewind to: its id or its name in…
length ≥ 1
document optionalstringThe document to rewind.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bodies optionalinteger—
document optionalstring—
rebound optionalstring[]Handles the version had that are live again.
released optionalstring[]Handles minted after the version, now gone.
replayed optionalinteger—
version optionalobject—
version.createdAtstring—
version.documentstring—
version.handlesinteger—
version.idstring—
version.namestring—
version.opCountinteger—
version.parentstring | nullparent version
version.resultsobject[][{tool,at,summary}]
version.summaryobject | null{bbox,volume,bodies}

cad_versions read List a document's versions

List the versions of a document (or of every document), newest first: id, name, op count, bbox/volume/body count when taken, parent, and the simulation results (cad_wind_tunnel, cad_fea_*) recorded while the document sat at that version.

Full description

Versions survive a restart.

ArgumentTypeMeaning & bounds
document optionalstringThe document whose versions to list.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
current optionalstring | nullThe version the document sits at exactly…
document optionalstring | null—
versions optionalobject[]—

cad_session_reset destructive Close every document and start clean

Close EVERY document and handle in YOUR session on this server and forget the documents a previous boot's journal was holding, so the next modelling call starts in a fresh, empty document.

Full description

Call cad_help({tool:"cad_session_reset"}) for the rest.

ArgumentTypeMeaning & bounds
confirm requiredbooleanMust be exactly true.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
client optionalstring | nullThe client scope that was reset.
closedDocuments optionalstring[]Document handles that were live (or restorable)…
journal optionalstring | nullThe fresh journal file this session now writes…
sessionEpoch optionalstring | null—

cad_save destructive Save the document as STEP

Export every solid in the document to the STEP file path; schema picks AP203/AP214/AP242.

Full description

Call cad_help({tool:"cad_save"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredstring—
length ≥ 1
colors optionalobject—
≥ 1 keys
colours optionalobjectBody colours in the STEP.
≥ 1 keys
compress optionalboolean—
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
schema optionalenum—
one of "ap203e1", "ap203e2", "ap214", "ap242e1", "ap242e2", "ap242e3", "ap203", "ap242", "source"
strict optionalboolean—
suppressed optionalbooleantrue = not built
tessellated optionalenumAP242 mesh beside/instead of B-rep.
one of "none", "add", "only"
units optionalenumFile length unit.
one of "um", "mm", "cm", "m", "in", "ft"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_feature_diagnose read What is wrong with a feature (and the whole tree's state)

WHAT IS WRONG with a feature: every feature's state (ok / warning / error / suppressed / suppressedByFailure / stale), whether the document is PARTIAL because something did not build, and, for one named feature, its refusal, the feature that actually broke, and the repair verbs to try.

Full description

Call cad_help({tool:"cad_feature_diagnose"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstringWhich document. Omit for the default/active one.
featureId optionalstringThe feature to diagnose: the id a modelling cal…
length ≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
counts optionalobjectHow many features are in each state.
diagnosis optionalobject | nullPresent when "featureId" was given: {state, err…
document optionalstring | null—
featureRows optionalobjectOnly past 64 features: {listed, of, omittedOk…
features optionalobject[]One row per feature in program order: {index, f…
lastGood optionalobjectThe last feature up to which EVERY feature buil…
partial optionalbooleantrue when at least one feature contributed no g…
warning optionalstring | nullThe one-line "this is not the whole program" wa…

cad_feature_suppress write Suppress (or un-suppress) one feature

TURN ONE FEATURE OFF WITHOUT DELETING IT -- the feature tree's eye toggle: a suppressed feature is not built, features that reference it are skipped too, and everything independent of it still builds, so a document whose feature 7 of 20 cannot build becomes usable again while you work out the real fix.

Full description

Call cad_help({tool:"cad_feature_suppress"}) for the rest.

ArgumentTypeMeaning & bounds
featureId requiredstringThe feature: the id a modelling call returned…
length ≥ 1
document optionalstringWhich document. Omit for the default/active one.
force optionalboolean—
suppressed optionalbooleantrue (the default) suppresses the feature; fals…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
changed optionalbooleanfalse when the feature was already in that stat…
document optionalstring | null—
feature optionalstring | null—
featureRows optionalobjectOnly past 64 features, as cad_feature_diagnose.
features optionalobject[]—
index optionalinteger—
lastGood optionalobject—
op optionalstring | null—
partial optionalboolean—
replayed optionalintegerFeatures replayed.
suppressed optionalboolean—
warning optionalstring | null—

cad_feature_edit write Edit a feature

Change an existing feature's parameters in place ({"diameter": 6.6}) and rebuild what follows, instead of re-creating it.

Full description

Returns the before/after diff.

ArgumentTypeMeaning & bounds
featureId requiredstringId, index or body handle.
length ≥ 1
set requiredobject{param: value}; null removes.
document optionalstring—
force optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_edit_guarded write Edit with a firewall

Edit an existing model as param/feature changes (or one appended feature), recompute, and prove nothing outside the edit changed; on fail roll back (an .FCStd byte-identical).

Full description

FreeCAD .FCStd: call inspect:true first to list sketch constraints, geometry and patterns. Call cad_help({tool:"cad_edit_guarded"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstring—
dryRun optionalboolean—
edits optionalobject[]—
≥ 1 items
expect optionalobjectDeclared affected region {features:[names], bbo…
fcstd optionalstring.FCStd path; omit for the session document.
force optionalboolean—
inspect optionalbooleanFCStd: list sketches + patterns; edits nothing.
margin optionalnumber—
out optionalstringFCStd: write the result here instead of in place.
targets optionalobject[][{volume}|{bboxSize}|{cylinderDiameter, near?}|…
tolerance optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_job_status read Async job status

Status of an async job (a long op that returned a jobId, e.g.

Full description

cad_mesh_to_brep with jobMode:true): state queued/running/done/failed/cancelled/lost, stage, pct, progress.components {done,total} (component-route builds) with etaMs, elapsedMs, pollAfterMs, summary. Omit jobId to list this session's jobs. Call cad_help({tool:"cad_job_status"}) for the rest.

ArgumentTypeMeaning & bounds
jobId optionalstringthe jobId a long op returned
pattern ^job_[a-z0-9]{6,40}$

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_job_result read Async job result

The result of a finished async job: exactly the response the original tool would have returned inline (handle, document, report), plus _meta.job.

Full description

waitMs (<= 25000) waits for a running job first, so a short job needs one round trip. A job still running refuses E_PRECONDITION (poll cad_job_status); a failed job returns its own error.

ArgumentTypeMeaning & bounds
jobId requiredstringthe jobId a long op returned
pattern ^job_[a-z0-9]{6,40}$
waitMs optionalintegerwait up to this long
≥ 0 · ≤ 25000

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_job_cancel read Cancel async job

Cancel an async job: a queued job is dropped, a running one has its kernel-worker build terminated and its op rolled back (state becomes "cancelled"; cad_job_result then answers E_CANCELLED).

Full description

A finished job is left as it is.

ArgumentTypeMeaning & bounds
jobId requiredstringthe jobId a long op returned
pattern ^job_[a-z0-9]{6,40}$

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Query, measurement & preview · 12

Reading rather than changing: addressable topology, distances and angles, mass properties, tolerance stacks, the tessellation and image previews that let an agent SEE what it built, and the design-knowledge packs that supply a product type's real numbers before any of it is modelled.

cad_body_topology read List a body's faces and edges

Enumerate every face and edge of a body already built in the active session, by the exact DOCUMENT id cad_fillet_edges/cad_chamfer_edges' "edges" field accepts — the query a blend/chamfer refusal's "fillet the edges you want instead: edges:[...]" advice has always assumed exists.

Full description

Call cad_help({tool:"cad_body_topology"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringid or "<id>#<n>"
compact optionalbooleanReturn each edge as {edgeId, curveType, vertice…
include optionalenum[]Which topology to return; omit (or leave empty)…
limit optionalintegerPage the "edges" array to at most this many ent…
≥ 1
offset optionalintegerWith "limit": skip this many edges first — pa…
≥ 0 · default 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_face_edges read List one face's boundary edges, grouped into tangent chains

Given ONE face of a body already built in the active session, return its boundary as the structure the geometry has: face -> LOOPS (one outer bound plus one per hole/pocket) -> CHAINS (each loop split at its non-tangent corners) -> edge ids.

Full description

Call cad_help({tool:"cad_face_edges"}) for the rest.

ArgumentTypeMeaning & bounds
face requiredstringFace id to enumerate — a "faceId" from cad_bo…
solid requiredstringid or "<id>#<n>"
compact optionalbooleanReturn each "edges" entry as {edgeId, curveType…
include optionalenum[]Which sections to return; omit (or leave empty)…
kernelChains optionalbooleanCross-check each chain against the kernel's she…
limit optionalintegerPage the "edges" section (include:["edges"]) to…
≥ 1
mixedFamilies optionalbooleanTreat a tangent LINE->CIRCLE join as continuing…
offset optionalintegerWith "limit": skip this many edges first — pa…
≥ 0 · default 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_measure read Measure (point / ray / distance queries)

One schema, five query kinds selected by kind: "point_in_body" (classify a point in/out/on one solid), "closest_point" (nearest point on one solid's boundary to a query point), "ray_fire" (every forward hit of a ray against 1+ solids), "distance" (closest approach between two solids; 0 if touching or interpenetrat…

Full description

ing within tolerance). Call cad_help({tool:"cad_measure"}) for the rest.

ArgumentTypeMeaning & bounds
kind requiredenumWhich measurement to take — decides which oth…
one of "point_in_body", "closest_point", "ray_fire", "distance", "section"
direction optionalnumber[]ray direction (need not be unit length)
exactly 3 items
firstOnly optionalbooleanreturn only the single globally-nearest hit acr…
normal optionalnumber[]the cut plane's normal (need not be unit length)
exactly 3 items
origin optionalnumber[]ray origin, mm
exactly 3 items
point optionalnumber[]query point, mm
exactly 3 items
solid optionalstringbody handle
length ≥ 1
solidA optionalstringbody handle
length ≥ 1
solidB optionalstringbody handle
length ≥ 1
solids optionalarray | string—
tol optionalnumberoverride the default distance-to-boundary "on"…
> 0

Exactly one of these argument shapes: kind + solid + point — or — kind + solid + point — or — kind + solids + origin + direction — or — kind + solidA + solidB — or — kind + solid + point + normal.

cad_mass_properties read Mass properties (volume, area, centroid, inertia)

The exact feature vector an instant-quote / DFM front-end reads off an uploaded part (see GeometryStats.js's header — competitor-aware research citation: Paperless Parts / Xometry / Protolabs-style analysers).

Full description

Every number is derived from the watertight tessellation + B-rep topology, never hand-entered. Call cad_help({tool:"cad_mass_properties"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringbody handle
length ≥ 1
csys optionalobjectoptional: report centroid and inertia AGAIN, ex…
csys.originnumber[]the user CSYS origin, in world mm
exactly 3 items
csys.xAxisnumber[]the user CSYS +X direction, in world coordinate…
exactly 3 items
csys.yAxisnumber[]the user CSYS +Y direction, in world coordinate…
exactly 3 items
thinWallThreshold optionalnumbermm — when given, thinWallCount reports how ma…
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_tolerance_stack write Tolerance stack-up (worst case / RSS / Monte Carlo)

Add up a 1D chain of toleranced dimensions and report the resultant three ways: worst case, RSS, and, with "monteCarlo", a sampled distribution.

Full description

Call cad_help({tool:"cad_tolerance_stack"}) for the rest.

ArgumentTypeMeaning & bounds
members requiredobject[]The dimensions of the chain, IN CHAIN ORDER (face A to face B). Sources: cad_measure results, PMI read from an imported STEP file (cite it with "pmiId"), or a value the design assumes (supply "nominal"/"tolerance" and, to author it, "targets").
≥ 1 items
apply optionalbooleanAuthor the datum scheme ("datums") and every supplied member's dimensional tolerance onto "solid" (CADSF-961) — see the tool description. Default false: a stack is a report until you say otherwise. Requires "solid".
axis optionalnumber[]The stack's own traversal axis (unit vector, mm-space). Optional — when omitted, the axis is seeded from the first member that carries its own "axis". Only meaningful together with member "points" (see MEMBER_SCHEMA): without points on every member there is no geometry to check the axis against, and the chain is declared rather than verified either way.
exactly 3 items
datums optionalobject[]The datum scheme this stack assumes. Authored via cad_pmi_author (kind:"datum") when apply/dryRun is set; ignored otherwise. Optional — a stack runs without it, but then the toleranced dimensions apply/dryRun authors have no datum scheme behind them in the exported STEP.
dryRun optionalbooleanWith "apply" semantics active, report what WOULD be authored/updated (same "authoring" shape) without writing anything. Requires "solid".
limits optionalobjectRequirement on the resultant (e.g. a gap that must stay between 0.05 and 0.60 mm). Adds a pass/fail verdict per analysis, and a sampled yield to the Monte Carlo run.
limits.lowernumberLowest acceptable value of the RESULTANT, mm.
limits.uppernumberHighest acceptable value of the RESULTANT, mm.
monteCarlo optionalobjectRun a Monte Carlo simulation as well as the closed forms. Omit to skip it.
monteCarlo.distributionenumDefault distribution for members that do not name their own. Default "normal".
one of "normal", "uniform", "triangular"
monteCarlo.samplesintegerNumber of assemblies to sample. 10000 puts a 0.71% standard error on the spread (1/sqrt(2N)).
≥ 1 · ≤ 1000000
monteCarlo.seedintegerPRNG seed; the same seed returns the same numbers. Default 1392 (0x570).
name optionalstringOptional name for the stack, echoed in the report.
sigmaCap optionalnumberHow many standard deviations the ± band of a member spans. Default 3 (the ±3σ convention); 6 for a six-sigma process capability.
> 0
solid optionalstringBody handle already built in the active session (an earlier op's id, or "<id>#<n>"). Required by "apply"/"dryRun"; also used, when given, to resolve any member's "pmiId" against the model's live PMI even without applying.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_preview_body read Render a preview image

Render a headless PNG of a body (or the whole active document) and return it as an image so you can visually verify the part you just built — no browser or GPU is used, this is a pure-software rasterizer.

Full description

The image is capped at 512x512 pixels to keep the response small; ask for a smaller "width" if you only need a quick check. Call cad_help({tool:"cad_preview_body"}) for the rest.

ArgumentTypeMeaning & bounds
azimuth optionalnumberCamera azimuth in degrees around the model…
document optionalstringa document handle
length ≥ 1
elevation optionalnumberCamera elevation in degrees above the horizon…
handle optionalstringReuse a mesh handle from a prior cad_tessellate…
healGeometry optionalbooleanAttempt to heal small topology defects…
default false
height optionalintegerImage height in pixels, capped; defaults to "wi…
> 0 · ≤ 512
maxTriangles optionalintegerTriangle budget: the tessellator adapts its res…
> 0
of optionalstring"all" (every live body in the active document,…
default "all"
tile optionalintegerWith "views": pixels per square tile…
> 0 · ≤ 512
tolerance optionalnumberChord tolerance in mm: the max allowed deviatio…
> 0
views optionalenum[]Render several ORTHOGRAPHIC views as one contac…
≥ 1 items · ≤ 8 items
width optionalintegerImage width in pixels, capped at 512.
> 0 · ≤ 512 · default 512
wireframe optionalbooleanWith "views": add a hidden-line (HLR) wireframe…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_compare_silhouette read Compare a body's silhouette to a reference drawing

Score a body against a rights-cleared reference silhouette per view (front/side/top/iso...), returning per-view IoU and the largest mismatch region.

Full description

Call cad_help({tool:"cad_compare_silhouette"}) for the rest.

ArgumentTypeMeaning & bounds
references requiredobjectOne entry per view, keyed by view name…
≥ 1 keys
references.backobject—
references.bottomobject—
references.frontobject—
references.isoobject—
references.leftobject—
references.rightobject—
references.sideobject—
references.topobject—
align optionalenumfit (default): body bbox scaled/centred onto th…
one of "fit", "none"
document optionalstringa document handle
length ≥ 1
handle optionalstringReuse a mesh handle from a prior cad_tessellate…
image optionalbooleanAlso return a diff PNG per view…
maxRegions optionalintegerHow many mismatch regions to list per view…
≥ 1 · ≤ 32
maxTriangles optionalintegerTriangle budget: the tessellator adapts its res…
> 0
of optionalstring"all" (every live body in the active document,…
default "all"
tolerance optionalnumberChord tolerance in mm: the max allowed deviatio…
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_view_body write Write an interactive 3D view

Write a fully self-contained interactive 3D viewer (.html) of a body or the whole active document and return {path, bytes, triangles, renderer} — never the file contents.

Full description

A HUMAN opens it in a browser to orbit/zoom the part. Call cad_help({tool:"cad_view_body"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredstringOutput .html path. Absolute paths are used as-is; relative paths resolve against the configured output directory (CADSOLVER_MCP_OUTPUT_DIR) when set, else the server process's cwd. Parent directories are created as needed.
display optionalenumCADSF-610, "compact" renderer only (default "shaded+edges"): which display mode the page OPENS in — "shaded" (solid), "shaded+edges" (default: solid + B-rep edges), "hlr" (hidden-line removed, dark edges on a light ground, the solid drawn depth-only so it occludes but never paints), "wireframe" (every edge, hidden ones included). All four are switchable in the page itself (segmented control, or keys 1-4) whatever this is set to; it exists so an embedded/screenshotted view starts in the right one. Rejected with the "three" renderer, which has its own controls.
one of "shaded", "shaded+edges", "hlr", "wireframe"
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field — use this to target a document OTHER than the session's default (e.g. a second part built with a modeling call's {"document":"new"}). Omit to use the session's default/active document.
length ≥ 1
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating.
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
of optionalstring"all" (every live body in the active document, merged) — the default — "<opId>" (body 0 of that op), or "<opId>#<bodyIndex>" (one body of a multi-body op). For format:"step", "all"/omitted still serializes the whole assembled document, but naming ONE body writes a STEP file containing ONLY that body (CADSB-144) — this is what lets two parts in the same document export as two separate STEP files without needing two documents; a "document":"new" modeling-tool call plus this tool's own "document" field is the OTHER way, for two parts you want to keep fully independent.
default "all"
overlay optionalstringCADSF-1435: a second body/mesh ref drawn in the SAME scene as "of" — usually a mesh handle (the input STL) ghosted over "of" (the reconstructed solid); when "of" is itself a mesh, "overlay" may instead be a solid ref. Rejected together with "handle" or {"renderer":"compact"}.
overlayMaxTriangles optionalintegerCADSF-1435: triangle cap for the overlay layer (default 50000). An overlay mesh handle has no analytic surface to re-tessellate at a coarser tolerance (unlike "of"'s own LOD path), so a mesh over this cap is uniformly decimated (evenly-spaced triangle sampling) — the response's "overlay" field reports the exact ratio kept.
> 0
overlayMode optionalenumCADSF-1435: how the overlay layer draws — "ghost" (default): alpha-blended, depth-tested but not depth-writing, drawn after the opaque body. "wire": edges only, no fill.
one of "ghost", "wire" · default "ghost"
overlayOpacity optionalnumberCADSF-1435: the ghost layer's opacity (ignored for {"overlayMode":"wire"}'s line alpha, which uses the same value). Also adjustable live in the viewer.
≥ 0 · ≤ 1 · default 0.35
renderer optionalenumCADSF-416: "three" (default) is the full-featured three.js viewer (pan, wireframe toggle, ~0.65 MB fixed cost). "compact" builds on cad_mesh_payload's own encoder with a small hand-rolled WebGL renderer — no three.js, orbit + zoom + four real B-rep display modes, sub-500 KB even for large parts.
one of "three", "compact" · default "three"
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
title optionalstringCaption shown in the viewer's corner and the page title. Defaults to the part reference.
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bytes requiredinteger—
format requiredenum—
one of "html"
path requiredstring—
triangles requiredinteger—
display optionalenum—
one of "shaded", "shaded+edges", "hlr", "wireframe"
overlay optionalobject—
overlay.decimatedboolean—
overlay.distanceComputedboolean—
overlay.keepRationumber—
overlay.originalTrianglesinteger—
overlay.trianglesinteger—
renderer optionalenum—
one of "three", "compact"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_tessellate_body read Tessellate a body

Mesh a body (or the whole active document) at a requested tolerance/level-of-detail and return ONLY its triangle count, vertex count, and bounding box (mm) plus an opaque handle — never the triangle array itself.

Full description

Pass the handle to cad_export_body or cad_preview_body to reuse this exact mesh instead of re-tessellating. Call cad_help({tool:"cad_tessellate_body"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstringa document handle
length ≥ 1
healGeometry optionalbooleanAttempt to heal small topol…
default false
maxEdgeLength optionalnumberSplit any triangle edge lon…
> 0
maxTriangles optionalintegerTriangle budget: the tessel…
> 0
minTrianglesPerFace optionalintegerForce every face with fewer…
> 0
of optionalstring"all" (every live body in t…
default "all"
sizing optionalobjectSize field (mm): global max…
sizing.angularCapDegnumberNormal-deviation cap on cur…
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a th…
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp…
sizing.growthRationumberMax size ratio between neig…
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm.
> 0
sizing.hMinnumberHARD floor in mm.
> 0
sizing.maxDepthintegerOctree depth cap.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget fo…
> 0
sizing.proximitybooleanSet false to skip the gap/t…
sizing.regionsobject[]Refine-here regions: a box…
≤ 32 items
stream optionalbooleanNeeds an MCP progressToken.
default false
tolerance optionalnumberChord tolerance in mm: the…
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bbox requiredobject—
bbox.maxnumber[]—
exactly 3 items
bbox.minnumber[]—
exactly 3 items
handle requiredstring—
solidIds requiredstring[]—
triangleCount requiredinteger—
vertexCount requiredinteger—
lod optionalobject—
lod.achievedTrianglesinteger—
lod.methodenum—
one of "subdivision", "chord-tolerance", "coarsest-achievable"
lod.requestedMaxTrianglesinteger—
lod.bandAspectRelaxedboolean—
lod.saturatedboolean—
lod.shortfallboolean—
lod.tolerancenumber—
lodStream optionalobjectCADSF-423 streaming report…
lodStream.streamedboolean—
lodStream.coarseobject—
lodStream.finalbooleanTrue when every body reache…
lodStream.levelsintegerHow many LOD levels this ca…
lodStream.metaKeystringThe notification params._me…
lodStream.notificationsintegerProgress notifications emit…
lodStream.reasonstringPresent when streaming was…
lodStream.solidCountinteger—
lodStream.transportstring"notifications/progress" wh…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_mesh_payload write Get mesh data in-band for a viewer

Return the tessellated mesh ITSELF on the result's structuredContent.mesh (the text block is only a size summary) so a sandboxed viewer (a Claude artifact, a Cowork preview) can render the part.

Full description

Compact base64 buffers: quantized positions, octahedral normals, indices, per-face groups, B-rep edge polylines, bbox, iso camera. Call cad_help({tool:"cad_mesh_payload"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field — use this to target a document OTHER than the session's default (e.g. a second part built with a modeling call's {"document":"new"}). Omit to use the session's default/active document.
length ≥ 1
edges optionalbooleanInclude B-rep edge polylines sampled from the real STEP curves (not triangle boundaries), deduplicated and quantized on the same grid as the positions. Drawing them over the shaded mesh is the difference between a grey blob and a CAD model. Set false if you only need the surface.
default true
faceGroups optionalbooleanInclude the per-face partition (faces[]: triangle AND vertex ranges keyed by the face id cad_body_topology reports). This is what makes face picking and per-face colouring possible in the viewer. Set false only to save a few hundred bytes on a body you will never click.
default true
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating.
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
material optionalobject | stringCADSF-1202: a default KHR_materials_pbrMetallicRoughness-shaped material for a bare body (no per-face authored colour), shipped alongside the geometry as payload.material so a viewer can shade the part as machined stock instead of flat grey. Either a named stock ("6061-T6", "ti-6al-4v", "in718", "ss-304", "ss-316", "mild-steel", "brass-c360", "abs", "pla", "pa12", "acrylic" — exporters/materials.js STOCKS has the full table and each colour/roughness citation) or a full {baseColorFactor, metallicFactor, roughnessFactor, name?} object. An unrecognised stock name is refused, listing every known stock. A decoder that has never heard of "material" ignores the field and still gets a fully correct (if flat-shaded) body.
maxBytes optionalintegerRefuse rather than return an in-band payload larger than this many bytes of JSON (default 262144, ceiling 4194304). The refusal reports the actual size and a suggested maxTriangles that would fit. Ignored when "path" is given.
≥ 1024 · ≤ 4194304 · default 262144
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
normals optionalenumVertex normals. "oct8" (default) is octahedral-encoded to 2 bytes/vertex (~1 degree error, the glTF/meshoptimizer scheme); "float32" is 12 bytes/vertex; "none" omits them — use flat shading then, which looks right on planar faces and faceted on curved ones. Normals are area-weighted WITHIN each B-rep face, so edges stay crisp and cylinders stay smooth.
one of "oct8", "float32", "none" · default "oct8"
of optionalstring"all" (every live body in the active document, merged) — the default — "<opId>" (body 0 of that op), or "<opId>#<bodyIndex>" (one body of a multi-body op). For format:"step", "all"/omitted still serializes the whole assembled document, but naming ONE body writes a STEP file containing ONLY that body (CADSB-144) — this is what lets two parts in the same document export as two separate STEP files without needing two documents; a "document":"new" modeling-tool call plus this tool's own "document" field is the OTHER way, for two parts you want to keep fully independent.
default "all"
path optionalstringOptional .json output path. When given, the payload is WRITTEN there and the response carries only {path, bytes, counts, bbox, camera} — nothing in-band, no size cap. Use this when a viewer can read the filesystem (a Cowork/Claude Code artifact pipeline) and you would rather not spend context on the buffers. Relative paths resolve against the configured output directory.
positionBits optionalintegerQuantization precision, 8..16 bits per axis (ignored when positionEncoding is "float32"). 16 bits over a 100 mm part is +/-0.0008 mm. 8 or fewer packs one byte per component instead of two — a quarter of the position bytes, at ~0.4% of the model extent of error; good enough for a thumbnail, not for measuring.
≥ 8 · ≤ 16 · default 16
positionEncoding optionalenumHow vertex positions are packed. "quantized" (default) stores integers on a uniform grid over the body's bounding box with an affine decode (p = origin + q * scale, the glTF KHR_mesh_quantization convention) — half the bytes of float32 and the payload reports the exact worst-case error in mm as positions.maxErrorMm. "float32" only if you need raw floats.
one of "quantized", "float32" · default "quantized"
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
stream optionalbooleanNeeds an MCP progressToken. Streams LOD progress when the caller sent one (params._meta). No token, no coarse pass; the final result is byte-identical either way. See "lodStream" on the response.
default false
strict optionalbooleanCADSF-1377. Multi-body sets only. false/omitted (default): the finishing check's report rides the result as an "assembly" block and anything wrong is a WARNING — the file is still written. true: a part that floats, interpenetrates another part, or does not sit on z=0 (within 0.5 mm, for the parts that reach lowest) REFUSES the call as E_ASSEMBLY_UNSOUND before anything is written, with the same report in details.assembly. Use it as a release gate.
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
uv optionalstring | objectSceneReady uv0 (TEXCOORD_0, metric: 1 uv = 1 m) + uv1 (TEXCOORD_1, packed 0-1 atlas), 1:1 with positions. Omitted: ON unless over the in-band cap (result uv.omitted says so). "game": always. "none": never. Or {tangents?: bool, uvScale?: mm per uv0 unit (1000), atlasPx?: 64..16384 (1024), encoding?: "quantized" (default, 8 B/vertex) | "float32"} = "game" with options. Format: docs/FORMATS.md.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bytes requiredintegerSerialized JSON size of the payload.
triangleCount requiredinteger—
vertexCount requiredinteger—
assembly optionalobjectCADSF-1377 finishing check — present only when the exported set holds MORE THAN ONE body. Connectivity + interference over the exported parts: warnings[] is the headline (empty when the assembly is sound), parts[] carries per-part touches/penetrates/floating/offFloor/joints. With "strict":true the same report refuses the call as E_ASSEMBLY_UNSOUND instead of warning.
assembly.bodiesinteger—
assembly.checkedbooleanfalse when the check was skipped — note says why.
assembly.countsobject—
assembly.findingsobject[]—
assembly.floorRuleobject—
assembly.gapsobject[]CADSF-1376 — pairs that very nearly touch but do not: {a, b, distance, kind} in mm, nearest first, for every pair under the gap threshold (default 1 mm). A joint modelled a fraction of a millimetre short is the error floating cannot see. Omitted from an export envelope when non-empty, exactly as interference[] is; counts.gaps has the number.
assembly.interferenceobject[]CADSF-1376 — one row per INTERFERING PAIR: {a, b, volume} in mm^3. The pairwise view of the same penetrations parts[].penetrates carries per part; empty is the pass condition. On an EXPORT envelope the rows are omitted when there are any (counts.interferingPairs has the number, and the warnings name the pairs) — cad_design_review {"kind":"assembly"} returns them.
assembly.msnumber—
assembly.notestring—
assembly.partsobject[]—
assembly.unfastenedobject[]CADSF-1576 — LOAD-BEARING CONTACTS WITH NOTHING THROUGH THEM: {a, b, area} in mm^2, widest first, for every pair whose planar contact is at or above 100 mm^2 and which no cad_joint / cad_fastener record names and no hardware body bridges. A stated fixing is MODELLED: two parts merely in contact are an assembly that has not been fastened yet. Reported, never a refusal — counts.unfastenedContacts has the number, and the rows are omitted from an export envelope exactly as interference[] and gaps[] are.
assembly.unitsobject—
assembly.warningsstring[]—
bbox optionalobject—
bbox.maxnumber[]—
exactly 3 items
bbox.minnumber[]—
exactly 3 items
camera optionalobject—
edgeCount optionalinteger—
faceCount optionalinteger—
handle optionalstring—
lod optionalobject—
lod.achievedTrianglesinteger—
lod.methodenum—
one of "subdivision", "chord-tolerance", "coarsest-achievable"
lod.requestedMaxTrianglesinteger—
lod.bandAspectRelaxedboolean—
lod.saturatedboolean—
lod.shortfallboolean—
lod.tolerancenumber—
lodStream optionalobjectCADSF-423 streaming report: whether LOD levels were pushed over notifications/progress, and if not, why not.
lodStream.streamedboolean—
lodStream.coarseobject—
lodStream.finalbooleanTrue when every body reached the requested resolution.
lodStream.levelsintegerHow many LOD levels this call defines (coarse + final).
lodStream.metaKeystringThe notification params._meta key the structured level rides on.
lodStream.notificationsintegerProgress notifications emitted for this call.
lodStream.reasonstringPresent when streaming was declined — says exactly why.
lodStream.solidCountinteger—
lodStream.transportstring"notifications/progress" when streamed, "none" otherwise.
mesh optionalobjectThe payload itself (format "cadsolver.mesh/2"); absent when "path" was given. Full schema: cadsolver://schema/mesh-payload.
path optionalstring—
solidIds optionalstring[]—
uv optionalobject—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_design_knowledge write DFM knowledge packs — the numbers for a product type

BEFORE MODELLING A NAMED PRODUCT, look it up here.

Full description

Call cad_help({tool:"cad_design_knowledge"}) for the rest.

ArgumentTypeMeaning & bounds
action requiredenum—
one of "list", "load", "search", "laminate", "record"
kinds optionalenum[]search only: restrict to these entry kinds.
laminate optionalobject—
limit optionalintegersearch only: max rows (default 10).
≥ 1 · ≤ 50
maxEntries optionalintegerload only: page size in entries (default 40).
≥ 1 · ≤ 500
offset optionalintegerload only: first entry of the page (default 0).
≥ 0
query optionalstringsearch only: the user's own words.
rule optionalany—
sectors optionalstring[]Pack ids, sector words or aliases…
size optionalenumHow much of a pack: core…
one of "core", "standard", "full"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_interfaces read Extract mating interfaces (hole patterns, connectors, mount faces)

Read a part's CONNECTION POINTS off its B-rep as JSON, each with a mating frame {origin, zAxis, xAxis, yAxis} (mm, world frame; maps 1:1 to an Onshape mate connector: origin, primary axis Z, secondary X).

Full description

Call cad_help({tool:"cad_interfaces"}) for the rest.

ArgumentTypeMeaning & bounds
detail optionalenumfull: per-hole records + positions.
one of "summary", "full"
file optionalstringSTEP path (relative: outputDirectory).
length ≥ 1
include optionalenum[]Sections to return. Default all.
minHoleDiameter optionalnumberSkip holes under this diameter, mm. Default 1.
≥ 0
solid optionalstringOr: a session body handle.
length ≥ 1
tolerance optionalnumberPattern tolerance, mm. Default 0.01.
> 0 · ≤ 1
units optionalstringWith file: length unit override (mm, in, ...).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

GD&T and PMI · 4

Tolerancing carried on the model rather than in a note: datum features, the 14 Y14.5 characteristics with their modifiers and datum reference frames, and dimensional tolerances — authored against real faces and edges, validated as they are built, and exported as semantic AP242 PMI.

cad_pmi_author write Author a datum, feature control frame or dimensional tolerance

Put GD&T on the model itself.

Full description

ONE call authors ONE annotation against the faces/edges of a body already built in this session, and the set is carried on the document so cad_export_body writes it into the STEP file as SEMANTIC AP242 PMI — the same entities this kernel's own reader recovers, not a drawing note. Call cad_help({tool:"cad_pmi_author"}) for the rest.

ArgumentTypeMeaning & bounds
kind requiredenum"fcf" is a feature control frame.
one of "datum", "fcf", "dimension", "auto"
solid requiredstringBody handle from this session.
characteristic optionalenumkind "fcf" only: the characteristic.
one of "straightness", "flatness", "circularity", "cylindricity", "profileOfALine", "profileOfASurface", "angularity", "perpendicularity", "parallelism", "position", "concentricity", "coaxiality", "symmetry", "circularRunout", "totalRunout"
datumRefs optionalobject[]kind "fcf" only: datums, primary first.
description optionalstringkind "fcf" only: optional free-text note.
label optionalstringkind "datum" only: the datum letter.
lower optionalnumberkind "dimension" only: lower deviation, SIGNED.
measure optionalenumkind "dimension" only: what the dimension IS.
one of "linear", "diameter", "radius", "angular"
minus optionalnumberkind "dimension" only: lower deviation magnitude.
modifiers optionalenum[]kind "fcf" only: tolerance modifiers.
name optionalstringOptional human name for this annotation.
nominal optionalnumberkind "dimension" only: nominal, mm or degrees.
plus optionalnumberkind "dimension" only: upper deviation, signed.
process optionalstringkind "auto": process, cnc default.
replace optionalbooleankind "auto": replace PMI on the body.
symmetric optionalnumberkind "dimension" only: the ± half-band.
> 0
targets optionalobject[]Face/edge ids from cad_body_topology.
≥ 1 items
upper optionalnumberkind "dimension" only: upper deviation, SIGNED.
value optionalnumberkind "fcf" only: zone size in mm.
> 0
zone optionalenumkind "fcf" only: "diameter" = a Ø zone.
one of "diameter"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_pmi_list read List the PMI authored on a body

Read back every datum, feature control frame and dimensional tolerance authored on a body — with the id cad_pmi_remove takes, the callout text as it would be read off a print, and three things an agent cannot otherwise find out.

Full description

Call cad_help({tool:"cad_pmi_list"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringid or "<id>#<n>"
target optionalstringOptional: list only the annotations attached to…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_pmi_remove destructive Remove one authored PMI annotation

Remove one datum, feature control frame or dimensional tolerance from a body BY ID — the id cad_pmi_author returned and cad_pmi_list reports.

Full description

By id and not by description, so "remove the perpendicularity frame" cannot take the wrong one of two. Call cad_help({tool:"cad_pmi_remove"}) for the rest.

ArgumentTypeMeaning & bounds
id requiredstringThe annotation id from cad_pmi_author's respons…
solid requiredstringBody handle already built in the active session.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_gdt_position read Position tolerance from the fastener + MMC/LMC min-wall check

Size a hole pattern's position tolerance from its fastener (ASME Y14.5: floating T = H − F, fixed T1 + T2 = H − F), check a stated zone against it, and/or check that the Ⓜ/Ⓛ bonus zone keeps a minimum wall (bonus_breaks_min_wall names both diameters).

Full description

Pure arithmetic in your unit; no body.

ArgumentTypeMeaning & bounds
clearanceShare optionalnumberfixed only: fraction of H − F given to the cl…
> 0 · < 1
condition optionalenumfloating = bolt + nut, clearance holes in both…
one of "floating", "fixed"
engagement optionalnumberD: min thread engagement depth.
> 0
fastenerDia optionalnumberF: fastener major Ø at MMC.
> 0
features optionalobject[]Features whose zones bound a wall: {id, type…
≥ 1 items · ≤ 256 items
holeLmc optionalnumberClearance hole Ø at LMC (largest) — adds the…
> 0
holeMmc optionalnumberH: clearance hole Ø at MMC (smallest).
> 0
metric optionalobjectISO metric fastener instead of fastenerDia: F =…
metric.dnumber—
> 0
metric.gradeenum—
one of "fine", "medium", "coarse"
minWall optionalnumberRequired minimum wall for the min-wall check.
≥ 0
part optionalenumWhich part "stated" belongs to: 0 clearance…
one of 0, 1
precision optionalintegerCallout decimals, tolerances rounded DOWN…
≥ 0 · ≤ 6
projected optionalbooleanfixed only: true (default) = projected zone Ⓟ…
projection optionalnumberP: max fastener projection…
> 0
stated optionalnumberA stated position zone (at MMC) to check agains…
≥ 0
unit optionalenumPrinting only (".005" vs "0.005"); every number…
one of "mm", "in"
walls optionalobject[]Walls to check: {between:[idA,idB], spacing?}…
≥ 1 items · ≤ 1024 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Assemblies · 9

More than one part: reading a STEP assembly structure, solving mates over built bodies, checking a shaft/bore fit, reporting which faces actually touch before anything is analysed, and rolling the whole thing up into a bill of materials.

cad_assembly_import write Read a STEP file's assembly structure

Read a STEP file's PRODUCT STRUCTURE — its NEXT_ASSEMBLY_USAGE_OCCURRENCE graph — and return the component hierarchy: how many components, how they are nested, what each occurrence is called, and the fixed/floating state of every component in the mate set.

Full description

Call cad_help({tool:"cad_assembly_import"}) for the rest.

ArgumentTypeMeaning & bounds
file requiredstringPath to a STEP (AP203/AP214/AP242) file.
length ≥ 1
document optionalstringWhich session document to publish into…
maxNodes optionalintegerCap on the number of tree nodes returned…
≥ 1 · ≤ 400
publish optionalbooleanAlso BUILD the assembly into the session: one b…
publishMode optionalenumWhat "publish" builds: "occurrences" (default)…
one of "occurrences", "parts"
units optionalstringOverride the file's own length-unit declaration…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_mate read Build and solve a mate set over already-built bodies (assembly instance placement)

Given two or more already-built bodies as named "components" and a list of MATES between their faces (concentric, coincident, distance, angle, parallel, perpendicular, tangent, lock — AssemblyMates.js's full vocabulary), solve for where every ungrounded component must sit so all the mates are satisfied, and report it.

Full description

Call cad_help({tool:"cad_assembly_mate"}) for the rest.

ArgumentTypeMeaning & bounds
components requiredobject[]—
≥ 2 items · ≤ 32 items
mates requiredobject[]—
≥ 1 items · ≤ 64 items
acceptTol optionalnumberResidual norm below which the solve counts as c…
≥ 0
ground optionalstring[]Component names to ground, as an alternative to…
maxIter optionalintegerSolver iteration cap…
≥ 1 · ≤ 2000

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_fit read Check a shaft/bore diametral fit, or a planar face-pair fit (clearance, coaxiality/parallelism, interference)

Given TWO faces, one on each of two bodies already built in the active session, measure the fit between them.

Full description

Two modes, chosen automatically from the faces' own surface type: ROUND (both CYLINDRICAL_SURFACE) reports diametral clearance, "coaxial", and "minRadialGap" (worst-case radial gap once the measured axis offset eats into the nominal clearance). PLANAR (both PLANE, parallel) reports "gap" (signed normal distance at the overlap centroid), "overlapArea", and "minGap"/"maxGap" over the overlap footprint's own vertices — minRadialGap's planar analogue; "interferes" is minGap < 0 for an opposite-facing pair. A non-parallel or non-overlapping planar pair, or a CYLINDRICAL/PLANE mismatch, is refused by name. KEYED JOINT (ROUND mode, automatic): when the shaft carries a keyway and the hub a keyseat on the mated walls, "keyedJoint" reports each pair — shaft t1 + hub t2 − key height h against the key table's required clearance (BS 4235-1:1972 / DIN 6885-1:1968), axial engagement and angular offset — and a failing key is a finding; null on an unkeyed fit. READ-ONLY: publishes no body, mutates nothing.

ArgumentTypeMeaning & bounds
boreFace requiredstringA "faceId" from cad_body_topology on boreSolid…
length ≥ 1
boreSolid requiredstringThe other body — must resolve to the SAME doc…
length ≥ 1
shaftFace requiredstringA "faceId" from cad_body_topology on shaftSolid…
length ≥ 1
shaftSolid requiredstringOne body already built in the active session…
length ≥ 1
axisAngleTol optionalnumberROUND mode.
≥ 0
axisOffsetTol optionalnumberROUND mode.
≥ 0
keyStandard optionalenumROUND mode, keyedJoint only.
one of "BS4235", "DIN6885"
parallelTol optionalnumberPLANAR mode.
≥ 0
requireOppositeFacing optionalbooleanPLANAR mode.
transitionTol optionalnumberROUND mode.
≥ 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_bom read Bill of materials for a STEP assembly

Bill of materials for a STEP assembly: one row per unique PART NUMBER (STEP PRODUCT.id) with the quantity summed across every sub-assembly that uses it — a part used directly under the root AND nested inside a sub-assembly reused twice sums into ONE row, not two.

Full description

Call cad_help({tool:"cad_assembly_bom"}) for the rest.

ArgumentTypeMeaning & bounds
csvPath optionalstringWrite the FLAT parts list to this path as CSV.
length ≥ 1
density optionalnumberUniform density applied to every part's volume…
> 0
document optionalstringWhich session document to roll up…
file optionalstringPath to a STEP (AP203/AP214/AP242) assembly file.
length ≥ 1
massProperties optionalbooleanCompute per-part volume/mass…
maxRows optionalintegerCap on the rows returned per view (default 500).
≥ 1 · ≤ 500
structured optionalbooleanAlso return the indented, one-row-per-occurrenc…
units optionalstringOverride the file's own length-unit declaration…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_contacts read Face-pair contact set of a STEP assembly

WHICH FACES TOUCH, and by how much — the pre-flight a multi-body model owes any downstream analysis, because a solver bonds whatever touches and welds nothing that does not.

Full description

Call cad_help({tool:"cad_assembly_contacts"}) for the rest.

ArgumentTypeMeaning & bounds
file requiredstringSTEP file (or a .glb).
length ≥ 1
coincident optionalboolean | objectZ-fight check.
fits optionalobjectcad_joint fits.
includePolygons optionalbooleanOverlap hull rings.
maxClearance optionalnumberReport window, mm (default 1).
> 0
maxRows optionalintegerRows cap per kind (default 50)
≥ 1 · ≤ 200
minArea optionalnumberMin planar overlap, mm^2 (default 1e-4).
≥ 0
tol optionalnumberTouch tolerance, mm (default 0.001).
> 0
unbondedOnly optionalbooleanUnbonded list only.
units optionalstringUnit override (mm, cm, m, in, ft).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_flowpath read Flow-path audit: every tube end mates a port or is a declared terminal; no plenum has daylight

DOES EVERY TUBE CARRY WHAT IT IS SUPPOSED TO? Declare the flow path of a piped assembly built in the active session — every tube and plenum with its ports (centre, outward normal, inner radius, and whether the port is a system inlet/outlet, a joint, or an opening into a named plenum) — and the kernel checks it.

Full description

Call cad_help({tool:"cad_assembly_flowpath"}) for the rest.

ArgumentTypeMeaning & bounds
segments requiredobject[]The declared flow path.
≥ 1 items · ≤ 256 items
angleTol optionalnumberJoint port normals must be anti-parallel within…
> 0
expected optionalobjectHow many inlet / outlet terminals the system sh…
expected.inletsinteger—
≥ 0
expected.outletsinteger—
≥ 0
maxFindings optionalintegerCap on findings returned (default 200); counts…
≥ 1 · ≤ 200
posTol optionalnumberTwo ports closer than this (mm) are the same jo…
> 0
radiusTol optionalnumberJoint port radii must agree within this…
≥ 0
rays optionalintegerDirections over the sphere per plenum for the m…
≥ 8 · ≤ 2000
walls optionalstring[]Session bodies the fluid is contained by, for t…
≤ 256 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_assembly_sweep write Sweep a declared mechanism: min clearance over the motion, transmission/toggle, checks at every pose, end states + scrub

Declare a mechanism ONCE — revolute/prismatic joints (the hinge axes cad_joint builds and the pin centres cad_assembly_mate solves), loop closures, one driving parameter with its range, the end stops and named poses — over already-built bodies (each "component" rides a link; unlisted links are ground), and check the…

Full description

WHOLE motio… Call cad_help({tool:"cad_assembly_sweep"}) for the rest.

ArgumentTypeMeaning & bounds
components requiredobject[]—
≥ 2 items
mechanism requiredobjectDeclared once, in the AS-BU…
mechanism.driverobjectONE driver; driven joint =…
mechanism.jointsobject[]A TREE: each moving link is…
≥ 1 items
mechanism.closuresobject[]Loop pins: point stays co…
mechanism.namestring—
mechanism.posesobjecte.g. {"neutral":0,"full_up"…
mechanism.stopsobject[]—
capMm optionalnumberFarther pairs are only coun…
> 0
checks optionalobjectPer-pose checks.
checks.accessobject{tools:[{name, point, axis…
checks.coincidentboolean | objecttrue or {tol, angleDeg, min…
checks.contactsboolean | object—
checks.countinteger—
≥ 2 · ≤ 181
checks.omlobject{envelope:[bodies], members…
checks.posesstring | array"sweep" (default: count u…
confirm optionalbooleanAnalytic check of worst pos…
exclude optionalstring[][]—
export optionalobjectWrites <basename>_min/_max/…
export.basenamestring—
export.dirstring—
export.durationSnumber—
> 0
export.framesinteger—
≥ 2 · ≤ 721
only optionalstring[][]—
pressFits optionalstring[][]Declared fits…
resolutionMm optionalnumberDefault 0.02.
> 0
runningFits optionalobject[]One joint's bodies…
sampling optionalstring | object"adaptive" (default) or {co…
tightMm optionalnumberDefault 0.5.
≥ 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_scan_to_sim write Scan to simulation: a room scan (.ply) in, an articulated assembly out as MJCF, URDF, STEP and assembly.json

Reconstruct a ROOM from a scan and write a model a robot can use in a simulator.

Full description

Input: a .ply point cloud (ascii or binary, as LiDAR and photogrammetry tools export it) or a .ply mesh, in metres (a cloud over 100 units across is read as millimetres and says so). Call cad_help({tool:"cad_scan_to_sim"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredstringThe scan: a .ply point cloud or mesh.
length ≥ 1
complete optionalbooleanClose the room with an assumed ADA entrance…
formats optionalenum[]Default all; STEP for the highest level only.
≥ 1 items
importLevel optionalintegerLoad this level's STEP into the session…
≥ 0 · ≤ 4
lods optionalinteger[]Levels to write (default [0,1,2,3,4]).
≥ 1 items · ≤ 5 items
outDir optionalstringWhere the files go…
params optionalbooleanInclude the full fitted parameter set…
sim optionalbooleanExercise every model in MuJoCo + PyBullet…
units optionalenumDefault auto.
one of "auto", "m", "mm"
voxel optionalnumberDown-sample voxel, metres (default 0.015).
≥ 0.005 · ≤ 0.1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fastener_audit read Is every fastener in the live document SEATED?

IS EVERY FASTENER SEATED, or merely placed? Measures each against the other bodies and answers by code: does the head BEAR or stand off, is the SHANK in a hole, buried, or in air, how far is it ENGAGED, how far does it PROTRUDE, is it TILTED to its hole, is a nut on nothing.

Full description

Call cad_help({tool:"cad_fastener_audit"}) for the rest.

ArgumentTypeMeaning & bounds
bodies optionalstring[]Body handles to measure the fasteners AGAINST.
document optionalstringDocument handle to audit (e.g. "doc_1").
documents optionalstring[]Several live documents to audit TOGETHER, in wo…
fasteners optionalobject[]Audit these fasteners instead of the document's…
hardware optionalstring[]CADSF-102137: body handles that ARE fasteners…
inserts optionalstring[]CADSF-102137: body handles that are INSERTS or…
maxRows optionalintegerCap on findings and per-fastener rows returned…
≥ 1 · ≤ 200
rules optionalobjectTolerance overrides.
rules.bearTolnumberHow far below the head underside a face still c…
≥ 0
rules.chordnumberTessellation chord tolerance in mm (default 0.3).
> 0
rules.flangeMinWallnumberWall that must remain outside an insert / flang…
rules.headUncutTolnumberHost material inside the head volume that is he…
≥ 0
rules.holeSlacknumberHow far past the hole radius a wall still count…
≥ 0
rules.insertOverlapMm3numberInsert / host overlap that is insert-inside-hos…
≥ 0
rules.materialstringEngagement family for a landing body that decla…
rules.modelledSolidsbooleanCADSF-102137: false = the radial probes only…
rules.protrusionPitchesnumberShank allowed past the last clamped part, in th…
≥ 0
rules.shankSolidTolnumberHost material inside the shank span that is a s…
≥ 0
rules.socketClearMmnumberStraight room a socket needs off a nut's free f…
≥ 0
rules.stationStepnumberSpacing of the dense engagement/protrusion scan…
> 0
rules.tiltDegnumberHole-axis vs shank-axis angle that becomes a fi…
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Manufacturing review & simulation · 16

The checks that catch a part before a vendor does: DFM rules, moldability, a whole-design review, an aerodynamic pass over the shape, and a stress or modal case solved with CalculiX or MYSTRAN, and a topology optimisation that finds the lightest shape carrying the loads.

cad_dfm_check read DFM / validity check

Validity check (tier "local"|"full"); "process" adds its DFM pack: machining, molding, sheet, additive or vendor pack; route "scs_laser+scs_bend" gets the binding limit.

Full description

"approved" gates review; "params" = knobs; maxIssues pages. Call cad_help({tool:"cad_dfm_check"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringa solid id already built in this session (a document op's "id", or "<opId>#<bodyIndex>")
length ≥ 1
analytic optionalobjectoptional known-good volume/area to cross-check against (full tier only)
analytic.areanumber—
analytic.volumenumber—
drain optionalobjectFLOW-DRAIN: flag fluid trapped below every outlet invert (a sump). outlets: [{point (invert) | faceId, radius}]; gravity or orientations (depowder); fluid: domain body.
drain.outletsobject[]—
≥ 1 items · ≤ 16 items
drain.fluidstring—
length ≥ 1
drain.gravitynumber[]—
exactly 3 items
drain.orientationsnumber[][]—
≥ 1 items · ≤ 8 items
drain.resolutioninteger—
≥ 16 · ≤ 600
drain.tolerancenumber—
≥ 0
issueOffset optionalintegerWith maxIssues: skip this many grouped rows first — page via a prior response's page.nextOffset.
≥ 0 · default 0
maxIssues optionalintegerGroup findings by rule ({severity,reasonCode}, with a count) and cap the rows returned to this many; adds truncated/page. Omit for the full unbounded list.
≥ 1
pack optionalanyAlias of "process" (one pack name, a "+"-joined route, or an array). "process" wins when both are given.
params optionalobjectprocess parameters the pack's derived limits are computed from; every key defaults to the pack's own value
params.alloystringfoundrylab_dmc: the alloy being cast ("al", "zn", "mg", "cu"/"bronze"/"brass" pass; "stainless" is flagged coming; steel, iron and titanium are refused)
length ≥ 1
params.amsCompatiblebooleanfdm_x1c: this filament can run through the AMS (false for TPU and other soft filaments) — drives x1c_ams_tpu
params.amsSlotsobject[]fdm_x1c: [{ slot, material }] — the AMS filament mapping. A soft filament (TPU) in a slot is a refusal: it must run from the external spool
params.availableBendRadiinumber[]scs_bend: the inside bend radii this shop actually tools for this material, mm — a shop with fixed tooling has a LIST, not a range. Filled from every stocked gauge of the catalog material; bend_radius_available checks against it
params.axesintegerded: machine axes — >= 5 tilts (overhangs become ded_overhang_tilt info); default from the record's process text, else 3
≥ 3 · ≤ 9
params.axisymmetryToleranceDegnumberturning: how far a face normal may lean out of the (axis, radius) plane before the face counts as milled rather than turned, degrees (default 15)
> 0
params.ballMillRadiinumber[]scs_mill: stocked ball end-mill radii, mm — internal fillets off this list are flagged as un-tool-matched
≥ 1 items · ≤ 64 items
params.beadWidthnumberded: bead width, mm — the one-bead min wall; overrides the process figure
> 0
params.bedExcludeAreaobjectfdm_x1c: the refused rectangle in plate coordinates (default the X1C profile's front-left 0..18 x 0..28 mm bed_exclude_area)
params.bedPlacementarray | stringfdm_x1c: where the part sits on the plate — "centred" (what the slicer does on import, the default), "as-modelled" (the body's own coordinates read as bed coordinates), or [x, y] placing the footprint's min corner
params.bendRadiusnumberscs_bend: the shop's FIXED inside bend radius for this material + thickness, mm (SendCutSend offers no custom radius — read it off their bending calculator)
> 0
params.bendRadiusTolerancenumberscs_bend: tolerance on the fixed bend radius, mm (default max(0.05, 2% of bendRadius))
> 0
params.brimMmnumberfdm_x1c: brim width this filament wants, mm — quoted as the warping remedy
≥ 0
params.buildDirectionnumber[]additive packs (fdm/sla/sls/mjf/dmls): build/print direction (default [0,0,1]) — drives max_overhang_angle
exactly 3 items
params.buildVolumeMmnumber[]foundrylab_dmc: build volume X,Y,Z, mm (provisional default 304.8 cube = 1 ft^3)
exactly 3 items
params.catalogRowobjectscs_bend: DERIVED, not a setting — the data/scs/catalog.json row that was applied (material, thickness, capturedAt, snapshot hash, per-field provenance). Populated by resolvePack when params.material names a catalog row, and quoted by every catalog-driven verdict so a report can say which table decided. Passing it yourself only relabels the citation
params.chamberCnumberfdm_x1c: chamber temperature this filament wants, C (null for the ones that do not) — quoted as the warping remedy
≥ 0
params.colourPlanobjectfdm_x1c: { slabHeight, filaments: [{ id, colour: "light"|"dark"|"clear", zRange: [lo, hi] }] } — drives the multi-colour purge/prime-tower cost estimate
params.cupMinAreanumberresin: pocket floor area above which resin_suction_cup warns, mm2 (25)
≥ 0
params.cutterDiameternumbermachining: end-mill diameter, mm — drives the internal-corner-radius limit (>= 0.6 x cutterDiameter)
> 0
params.densitynumberfdm_x1c: filament density, g/cm3, as Bambu write it in filament_density — turns purge volume into grams
> 0
params.depositionProcessenumded: deposition process — selects the bead model; default from the printer record (technology / tech)
one of "ded_powder", "ded_wire", "waam", "ebam"
params.dieWidthnumberoshcut_bend / scs_bend: V-die opening, mm — the die contact band is half of this either side of the bend line (default 8 x materialThickness, the standard air-bending vee)
> 0
params.drainHoleCountintegerresin: drain holes each cavity needs (2: one lets resin out, one lets air in)
≥ 1
params.drainHoleMinnumberresin: smallest drain hole that drains, mm (3.5) — resin_hollow_drain
> 0
params.drainOutletsobject[]drainability: the declared outlet bore(s) of the internal fluid volume(s). Each is { a, b, r } (a segment spanning the bore from the cavity to past its outer mouth, radius mm) or { faceId } of a cylindrical bore face. Liquid that reaches an outlet leaves; liquid held below the lowest outlet invert after drain-down is measured in mL against rules.drainability.limit (default 0)
≥ 1 items · ≤ 32 items
params.drainPlugsobject[]drainability: every OTHER opening of the fluid volume (inlet ports, vents, sensor bores), same shape as drainOutlets — closed while the part drains, so the fluid volume is a closed cavity whose only exits are the outlets
≤ 64 items
params.drainVoxelnumberdrainability: voxel size, mm (default min(part size / 150, smallest port radius / 2.5), coarsened with a warning past 12M voxels). Pockets shallower than one voxel are not reported
> 0
params.elephantFootCompensationnumberfdm_x1c: elefant_foot_compensation, mm (profile default 0.15)
≥ 0
params.externalCornerRadiinumber[]scs_mill: stocked external corner radii, mm
≥ 1 items · ≤ 64 items
params.extrusionWidthnumberfdm/additive: nozzle extrusion width, mm — drives the min wall limit (2 x extrusionWidth)
> 0
params.fitsobject[]fdm_x1c: [{ name, class: "press"|"sliding"|"hinge"|"loose", clearance }] — from cad_tolerance_stack or cad_assembly_contacts
params.flangeMmnumberfoundrylab_dmc: flange / bolt-boss margin per side for the envelope check, mm (provisional default 15)
≥ 0
params.footprintGapMmnumberfoundrylab_dmc: clearance between moulds when counting moulds per build, mm (provisional default 5)
≥ 0
params.furnaceMaxCnumberfoundrylab_dmc: furnace ceiling, C (provisional default 1093 = 2000 F)
> 0
params.gaugingEdgeLengthnumberoshcut_bend: minimum length of a flat edge parallel to the bend line for the backgauge to square against, mm (default 6.35 = OSH Cut's published 0.25 in)
> 0
params.gearAnalyticobjectsingular convenience for gearTeeth: one gear descriptor instead of an array
params.gearTeethobject[]fdm_x1c (and any pack sharing ops/dfmRules.js's min_wall_thickness): gears this body carries, graded on their own tip land rather than the generic wall probe. See ops/gear.js gear()/gearGeometry()'s analytic block
params.gravitynumber[]drainability: the direction liquid falls in the INSTALLED orientation, body coordinates (default [0,0,-1])
exactly 3 items
params.greenScalenumber[]metal_fff: green oversize scale X,Y,Z (Ultrafuse 1.2,1.2,1.24); default from the vendor family, else not checked
exactly 3 items
params.holeCompensationnumberfdm_x1c: xy_hole_compensation, mm. Bambu ship 0, which is why x1c_hole_compensation fires on vertical holes; a non-zero value silences it
≥ 0
params.hoststringmetal_fff: a desktop FDM printer id/alias that prints Ultrafuse filament; its bed bounds the green part (also capped at 100 mm by the debind/sinter plate)
params.kFactornumberscs_bend: the shop's fixed K-factor for this material — carried on the pack for flat-pattern work; not itself a geometric check
params.kerfWidthnumberscs_laser: beam kerf width, mm — the minimum internal corner radius a laser can cut
> 0
params.layerHeightnumberfdm_x1c: layer height, mm — checked against the range the profile publishes for the fitted nozzle
> 0
params.loadAxisnumber[]fdm_x1c: the direction the part is loaded in. A load off the build axis takes x1c_z_anisotropy out of play, since the layer-bond weak axis is then not the loaded one
exactly 3 items
params.machiningStocknumberded: machining stock on every functional face, mm; overrides the process figure
> 0
params.machiningStockMmnumbercold_spray / metal_jetting / moldjet / metal_dlp: machining stock reserved on every face, mm, subtracted from the build envelope (no public allowance, so none is assumed)
> 0
params.materialstringoshcut_laser / scs_laser / scs_router: the material family being cut ("mild-steel", "stainless-steel", "aluminum", "copper", "brass", "bronze", "nickel", or an alias such as "304"/"6061"/"C110"). Applies that row's stocked thickness range on top of the shop-wide limits; anything you also pass explicitly wins. Omit and the pack uses the WIDEST published range and says so. lpbf / lpbf_printer: an LPBF alloy (Ti-6Al-4V, 316L, 17-4PH, IN718, IN625, AlSi10Mg, Scalmalloy, CuCrZr, GRCop-42, maraging, CoCr — or a registry spelling such as "Ni718"); applies that row's sourced limits and says where a figure is unverified. fictiv_mill (no catalog): "metal" (default) or "plastic" — selects the published minimum machined wall (0.8 mm vs 1.5 mm)
length ≥ 1
params.materialThicknessnumbersheet metal: sheet thickness, mm — drives the min hole diameter and corner radius limits
> 0
params.maxBendLengthnumberscs_bend: longest bend the brake will run for this material and thickness, mm (SendCutSend publish 16-44 in depending on both). Carried on the pack; no geometric rule enforces it yet
> 0
params.maxPartSizenumber[]maximum part size, mm, ascending (e.g. scs_mill [177.8, 177.8, 304.8] = 7in x 7in x 12in)
≥ 1 items · ≤ 64 items
params.maxSectionRationumberinvestment_casting: maximum ratio between the thickest and thinnest sampled section, x — drives max_section_ratio (default 6)
> 0
params.maxSwingDiameternumberturning: the lathe's swing, mm — the largest turned diameter that clears the bed
> 0
params.maxTurnedLengthnumberturning: distance between centres, mm — the longest part the machine holds
> 0
params.minCoredHoleMmnumberfoundrylab_dmc: minimum cored hole diameter, mm (provisional default 3)
> 0
params.minDraftDegnumberfoundrylab_dmc: minimum draft on pull faces, deg (provisional default 1)
≥ 0
params.minFeaturenumberresin: free-standing pin/wire floor, mm (sla 0.3, msla 0.5) — resin_min_feature
> 0
params.minFilletMmnumberinvestment_casting: minimum internal (concave) fillet radius on the casting pattern, mm — drives min_fillet_radius (default 0.5 mm)
> 0
params.minFlangenumberoshcut_bend / scs_bend: minimum flange length measured from the bend tangent, mm — both shops publish it per material in their catalogs (default dieWidth/2 + materialThickness)
> 0
params.minHolenumberresin: smallest hole that stays open, mm (0.5)
> 0
params.minHoleToBendnumberscs_bend: minimum distance from a hole edge to the CENTRELINE of a bend, mm. SendCutSend publish it as half the die width ("keep cut features at least half the die's width away from the bend line"); filled per material + thickness from data/scs/catalog.json when params.material names a row
> 0
params.minInternalRadiusnumberscs_mill: the shop's published absolute minimum internal corner radius, mm — the limit is max(this, 0.6 x cutterDiameter)
≥ 0
params.minPartSizenumber[]minimum part size, mm, ascending. TWO values are a sheet bound applied to the part's two largest dimensions; THREE bound all three (e.g. scs_router [25.4, 50.8] = 1in x 2in)
≥ 1 items · ≤ 64 items
params.minSeamGapnumberoshcut_bend / scs_bend: minimum clearance where two flanges meet at a seam, mm (default one materialThickness — the allowance for springback)
> 0
params.minSectionMmnumberinvestment_casting: minimum castable section (wall) thickness, mm — drives min_section (default 1.0 mm for a nickel-superalloy aerofoil at blade scale)
> 0
params.minTurnedDiameternumberturning: the smallest bar this route runs, mm
> 0
params.minWallFloornumberfdm_x1c: a filament-specific wall floor, mm, that overrides the 2 x line width one (filled filaments: 1.2)
> 0
params.minWallHotMouldMmnumberfoundrylab_dmc: hot-mould thin-wall limit, mm (provisional, by alloy; the conventional and die-cast references are reported beside it)
> 0
params.needsHardenedNozzlebooleanfdm_x1c: this filament is abrasive (CF/GF filled) and needs a hardened nozzle — drives x1c_nozzle_material_compat
params.nominalWallnumberinjection moulding: nominal wall, mm — drives the internal-radius limit (0.25 x nominalWall)
> 0
params.noseRadiusnumberturning: the finishing insert's NOSE radius, mm — the smallest internal corner a turning tool can leave in a shoulder (default 0.8)
> 0
params.nozzleenumfdm_x1c (0.2/0.4/0.6/0.8) and fdm + printer (the printer record's fitted set): fitted nozzle, mm. Selects the line-width / layer-height row — every wall and text limit is a function of it. 0.4 is hardened steel (takes CF/GF filament); 0.2 is stainless and is not (default "0.4")
one of "0.2", "0.25", "0.3", "0.4", "0.5", "0.6", "0.8", "1.0"
params.objectSpacingnumberfdm_x1c: centre-to-centre spacing of by-object neighbours, mm — one body does not carry the plate layout, so it is declared
> 0
params.outerWallLineWidthnumberfdm_x1c: override the nozzle row's outer wall line width, mm (0.42 at the 0.4 nozzle)
> 0
params.overhangDegnumberlpbf / lpbf_printer: self-supporting overhang angle past vertical, deg — from the material row where a public figure exists (316L 55), else the shared 45; your own number wins
> 0 · ≤ 90
params.overhangFailDegnumberfdm_x1c: overhang REFUSAL angle past vertical, deg — from the filament row (PLA/PETG 55, ABS/ASA/PC 50)
> 0
params.overhangWarnDegnumberfdm_x1c: overhang WARN angle past vertical, deg — from the filament row (PLA/PETG 45, ABS/ASA/PC 40)
> 0
params.plateThicknessnumberlpbf_dmp_flex350: build-plate thickness, mm — subtracted from the 420 mm Z envelope (3D Systems publish Z including the plate; the plate itself is unpublished)
≥ 0
params.pourTempCnumberfoundrylab_dmc: pour temperature, C; overrides the alloy typical value in foundrylab_alloy_window
> 0
params.printableAreanumber[]fdm_x1c: plate size [x, y] mm, for the bed-placement arithmetic (default [256, 256])
exactly 2 items
params.printerstringfdm / lpbf / binder_jet / ded / resin: a data/printers id or alias. process "fdm" + printer runs the registry-driven fdm_printer pack (fdm_x1c for the X1C); process "lpbf" + printer runs the registry-driven lpbf_printer pack (lpbf_dmp_flex350 for the DMP Flex 350); "ded" + a ded / waam / ebam printer runs the DED pack; resin: ops/resinRules.paramsForPrinter() turns it into tech + maxPartSize
params.pullDirectionnumber[]foundrylab_dmc: split axis for depowder and draft (default: best of X, Y, Z). injection moulding: mould pull / ejection direction (default [0,0,1])
exactly 3 items
params.reliefDepthnumberoshcut_bend / scs_bend: required bend-relief notch depth away from the bend line, mm (default inside bend radius + materialThickness)
> 0
params.reliefWidthnumberoshcut_bend / scs_bend: required bend-relief notch width along the bend line, mm (default one materialThickness)
> 0
params.sequentialPrintingbooleanfdm_x1c: by-object (sequential) printing — arms the extruder clearance envelope (90 mm to the lid, 68 mm radius)
params.sequentialRadiusnumberfdm_x1c: extruder clearance radius for by-object printing, mm (default 68)
> 0
params.shellMmnumberfoundrylab_dmc: mould shell thickness for the envelope check, mm (provisional default 6, copper 8)
> 0
params.shrinknumber[]binder_jet: linear sinter shrink X,Y,Z fractions; default from the material
exactly 3 items
params.shrinkPctnumberfoundrylab_dmc: REQUIRED linear shrink allowance for this job, percent. There is no default: Foundry Lab decide it case by case, and a call without it is refused (FOUNDRYLAB_SHRINK_REQUIRED)
> 0 · < 10
params.spindleAxisnumber[]turning: the axis the part is turned about (default [0,0,1] — what revolve and every shaft_* op build about)
exactly 3 items
params.standardDrillsnumber[]scs_mill: stocked drill diameters, mm — holes off this list are flagged as un-tool-matched (a cost warning, never a block)
≥ 1 items · ≤ 64 items
params.supportRegionsstring[]fdm_x1c: face ids the caller accepts support on — exempt from x1c_overhang, the bridge rules and x1c_unsupported_island
params.supportedWallnumberresin: supported-wall floor, mm (sla 0.4, msla 0.5) — min_wall_thickness
> 0
params.tapMajorDiametersnumber[]scs_mill: tap major diameters, mm — a tap-ready hole is modelled at major diameter and counts as tool-matched
≥ 1 items · ≤ 64 items
params.techenumresin: "sla" (Formlabs Form 4/4L, Formlabs design-guide numbers) or "msla" (consumer masked-LCD: Elegoo Saturn/Mars, Anycubic Photon — Hubs SLA numbers). Default "sla"
one of "sla", "msla"
params.textFeaturesobject[]fdm_x1c: [{ id, kind: "emboss"|"engrave", strokeWidth, depth|height, onFace: "top"|"vertical", faceId }] — cad_engrave_text reports the stroke it cut as dfm.strokeWidth
params.thicknessRangenumber[]stocked material thickness range [min, max] in mm, checked against the part's smallest bounding-box dimension
≥ 1 items · ≤ 64 items
params.toleranceTierstringfictiv_mill / fictiv_im: which published tolerance tier the quote is against ("iso2768m" = model with no drawing, "with_drawing" = +/-0.01 mm). Reported in pack.limits.tolerance; an inspection tolerance is not geometry, so no rule checks it
params.toolAxisnumber[]machining / sheet metal: tool (spindle or punch) axis (default [0,0,1])
exactly 3 items
params.toolMatchTolerancenumberscs_mill / fictiv_lathe: how close a feature must be to a stocked tool size to count as matched, mm (default 0.05)
> 0
params.trailingEdgeDihedralDegnumberinvestment_casting: the dihedral angle (through the material) below which two adjoining faces count as a knife-edge trailing-edge candidate, degrees (default 30)
> 0 · ≤ 180
params.trailingEdgeMinMmnumberinvestment_casting: minimum as-cast trailing-edge thickness, mm — drives min_trailing_edge_thickness (default 0.6 mm)
> 0
params.unsupportedWallnumberresin: unsupported-wall recommendation, mm (sla 0.6, msla 1.0) — resin_unsupported_wall
> 0
params.useAmsbooleanfdm_x1c: declare AMS use without a slot map
params.warpIndexnumberfdm_x1c: shrinkage class of the filament, 1 (PLA) to 5 (PC) — the material term of the warping score
≥ 0
params.wireDiameternumberded (ded_wire): wire diameter, mm — selects the Meltio min-wall row (0.8 / 1.0 / 1.2; default 1.0)
> 0
printer optionalstringA data/printers id or alias ("prusa-core-one", "x1c", "eos-m-290"). With pack fdm/lpbf/binder_jet runs that machine's registry pack; = params.printer.
length ≥ 1
process optionalarray | stringrun this process's DFM rule pack as well as the validity check. Omit for validity only (unchanged legacy behaviour). Name SEVERAL processes — ["scs_laser","scs_bend"] or "scs_laser+scs_bend" — when the part is made by a ROUTE: every pack is evaluated against the same body, each rule reports the BINDING limit (the most restrictive in the route) with the pack that publishes it in rules[].binding, every pack's own verdict in rules[].sources, and each violation the process(es) that flagged it at the worst of their severities. Severity does NOT escalate across packs: scs_bend's warning stays a warning even though scs_laser marks the same rule blocking at a looser number.
rules optionalobjectper-rule overrides so a shop can retune the gate without forking the pack; an unknown rule code is refused rather than ignored
rules.bend_radiusobject—
rules.bend_radius_availableobject—
rules.bend_reliefobject—
rules.binder_jet_depowderobject—
rules.binder_jet_green_envelopeobject—
rules.binder_jet_min_pinobject—
rules.binder_jet_min_slotobject—
rules.binder_jet_sinter_bridgeobject—
rules.binder_jet_wall_for_sizeobject—
rules.cold_spray_accessobject—
rules.cold_spray_line_of_sightobject—
rules.cold_spray_round_buildobject—
rules.ded_hole_stockobject—
rules.ded_overhangobject—
rules.ded_overhang_tiltobject—
rules.ded_substrateobject—
rules.die_keepout_clearobject—
rules.drainabilityobject—
rules.ebm_down_skin_angleobject—
rules.ebm_max_aspect_ratioobject—
rules.ebm_max_unsupported_bridgeobject—
rules.ebm_min_gapobject—
rules.ebm_min_pinobject—
rules.ebm_overhangobject—
rules.ebm_round_chamberobject—
rules.ebm_sintered_cake_removalobject—
rules.ebm_wall_printableobject—
rules.fdm_exclusion_zonesobject—
rules.fdm_nozzle_tempobject—
rules.fdm_round_bedobject—
rules.flange_lengthobject—
rules.flange_support_ratioobject—
rules.foundrylab_alloy_windowobject—
rules.foundrylab_depowder_accessobject—
rules.foundrylab_draftobject—
rules.foundrylab_hot_spotsobject—
rules.foundrylab_min_cored_holeobject—
rules.foundrylab_min_wallobject—
rules.foundrylab_mould_envelopeobject—
rules.foundrylab_shrink_allowanceobject—
rules.gauging_surfaceobject—
rules.hole_to_bendobject—
rules.lpbf_down_skin_angleobject—
rules.lpbf_max_aspect_ratioobject—
rules.lpbf_max_unsupported_bridgeobject—
rules.lpbf_min_gapobject—
rules.lpbf_min_pinobject—
rules.lpbf_overhangobject—
rules.lpbf_recoater_collisionobject—
rules.lpbf_round_plateobject—
rules.lpbf_trapped_powderobject—
rules.lpbf_wall_printableobject—
rules.material_needs_enclosureobject—
rules.material_thicknessobject—
rules.max_bend_angleobject—
rules.max_hole_depth_ratioobject—
rules.max_material_removalobject—
rules.max_overhang_angleobject—
rules.max_pocket_depth_ratioobject—
rules.max_rib_thickness_ratioobject—
rules.max_section_ratioobject—
rules.max_slendernessobject—
rules.metal_fff_aspectobject—
rules.metal_fff_green_envelopeobject—
rules.metal_fff_max_wallobject—
rules.metal_fff_min_pinobject—
rules.metal_fff_sinter_furnaceobject—
rules.min_bend_radiusobject—
rules.min_draft_angleobject—
rules.min_fillet_radiusobject—
rules.min_hole_diameterobject—
rules.min_internal_corner_radiusobject—
rules.min_sectionobject—
rules.min_trailing_edge_thicknessobject—
rules.min_wall_thicknessobject—
rules.min_web_vs_sheetobject—
rules.part_envelopeobject—
rules.resin_hollow_drainobject—
rules.resin_min_featureobject—
rules.resin_suction_cupobject—
rules.resin_unsupported_islandobject—
rules.resin_unsupported_wallobject—
rules.seam_gapobject—
rules.sinter_cavity_drainobject—
rules.sinter_green_envelopeobject—
rules.sinter_overhang_sagobject—
rules.tall_on_bedslingerobject—
rules.tool_matched_featuresobject—
rules.tpu_on_bowdenobject—
rules.turning_axisymmetryobject—
rules.turning_envelopeobject—
rules.x1c_ams_tpuobject—
rules.x1c_bed_edge_chamferobject—
rules.x1c_bed_exclusionobject—
rules.x1c_bridge_advisoryobject—
rules.x1c_bridge_spanobject—
rules.x1c_hole_compensationobject—
rules.x1c_horizontal_hole_teardropobject—
rules.x1c_mating_clearanceobject—
rules.x1c_min_pin_diameterobject—
rules.x1c_multicolour_costobject—
rules.x1c_nozzle_material_compatobject—
rules.x1c_overhangobject—
rules.x1c_pin_advisoryobject—
rules.x1c_recommended_wallobject—
rules.x1c_sequential_clearanceobject—
rules.x1c_text_legibilityobject—
rules.x1c_unsupported_islandobject—
rules.x1c_warp_riskobject—
rules.x1c_z_anisotropyobject—
tier optionalenumdefault "full"
one of "local", "full"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_moldability write Mouldability: sizing, parting, gate, blends, cast scan feedback

Post-draft mouldability finishing.

Full description

Two independent modes, and a call may use either or both. Call cad_help({tool:"cad_moldability"}) for the rest.

ArgumentTypeMeaning & bounds
alloy optionalstringal zn mg cu fe
blendRatio optionalnumberCorner radius / wall.
> 0
boss optionalobjectSize a boss.
boss.heightnumberBoss height, mm.
> 0
boss.wallnumberBase wall, mm.
> 0
boss.coreDraftnumberCore-pin draft, deg.
boss.draftnumberPer-side draft, deg.
boss.holeDiameternumberCored hole, mm (0 = solid).
boss.minWallnumberTop floor, mm.
> 0
castProcess optionalenum—
one of "printed", "sand", "die"
cavityPressureMPa optionalnumberCavity pressure, MPa.
> 0
feedback optionalobject—
feedback.actionenum—
one of "compare", "compensate", "learn", "recommend"
feedback.defectsstring[]—
feedback.gainnumber—
≥ 0.05 · ≤ 1.5
feedback.maxMovenumber—
> 0
feedback.outstring—
feedback.outputenum—
one of "mesh", "brep"
feedback.partstring—
feedback.scanstringSTL/OBJ/PLY
feedback.shrinknumber—
feedback.storestring—
flowRatioLimit optionalnumberMax flow:wall ratio.
> 0
minDraft optionalnumberMinimum draft, DEGREES.
minWall optionalnumberThinnest wall, mm.
> 0
process optionalenum"casting": cast-mould review.
one of "injection", "casting"
pull optionalnumber[]Pull vector.
exactly 3 items
resin optionalstringResin key for flow ratio an…
rib optionalobjectSize a rib.
rib.heightnumberRib height, mm.
> 0
rib.wallnumberBase wall, mm.
> 0
rib.draftnumberPer-side draft, deg.
rib.minWallnumberTip floor, mm.
> 0
rib.ribRationumberMax base / wall.
> 0
rib.sidesenum—
one of "both", "one"
solid optionalstringBody handle.
solidify optionalobjectaction check|simulate|loop…
wall optionalobjectSize a shelled wall.
wall.heightnumberWall height, mm.
> 0
wall.draftnumberPer-side draft, deg.
wall.minWallnumberFloor, mm. Default 1.
> 0
wall.partingbooleanParting splits the wall at…
wall.wallnumberNeutral-plane wall, mm.
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_design_review write Automated design review packet

Run a complete design review of one part in a single call and emit one packet.

Full description

Call cad_help({tool:"cad_design_review"}) for the rest.

ArgumentTypeMeaning & bounds
analytic optionalobjectExpected analytic volume/ar…
bodyIndex optionalintegerWhich solid of a multi-body…
≥ 0
checks optionalenum[]Extra checks.
complexity optionalobjectkind:"complexity" only…
complexity.mountnumber[]The point the stiffness pro…
exactly 3 items
complexity.processenumHow the part is made.
one of "machining", "printing", "fabrication"
dfmTier optionalenumops/check.js tier for the D…
one of "local", "full"
document optionalstringkind:"assembly"/"furniture"…
length ≥ 1
file optionalstringPath to the STEP…
length ≥ 1
furniture optionalobjectkind:"furniture" only — t…
furniture.edgeRadiusnumberThe maker's edge radius in mm.
> 0
furniture.envelopeobjectStated overall size in mm.
furniture.partCountobjectThe spec sheet's part-count…
furniture.seatHeightnumberIntended sitting-surface he…
> 0
furniture.symmetricbooleantrue: judge mirror symmetry…
includeHtml optionalbooleanReturn the full HTML report…
issueOffset optionalintegerWith maxIssues: skip this m…
≥ 0 · default 0
kind optionalenumWhat is being reviewed.
one of "part", "assembly", "furniture", "complexity"
label optionalstringTitle for the review, print…
length ≤ 200
material optionalstringRecorded and printed only.
length ≤ 120
maxIssues optionalintegerCap the grouped…
≥ 1 · default 20
notes optionalstringFree text printed under the…
length ≤ 2000
orientation optionalenum—
one of "landscape", "portrait"
outputDir optionalstringWhere to write the packet.
packetId optionalstringOverride the generated pack…
length ≤ 120
partNumber optionalstringPrinted in the header and t…
length ≤ 120
persist optionalbooleanWrite the packet to disk…
preparedFor optionalstringWho the review is for — a…
length ≤ 200
projection optionalenumView arrangement: "third"…
one of "first", "third"
reviewer optionalstring—
length ≤ 120
revision optionalstring—
length ≤ 60
sheetSize optionalstringDrawing sheet size for the…
solid optionalstringReview a body already built…
length ≥ 1
strict optionalbooleankind:"assembly"/"furniture"…
thinWallThreshold optionalnumberWall thickness below which…
> 0
titleBlockTemplate optionalstringTitle-block template key…
views optionalenum[]Standard views to draw.
≤ 7 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_wind_tunnel write Wind tunnel (CFD)

CFD on a solid: Cl/Cd/Cm around it, or (mode "internal") the flow through it.

Full description

Call cad_help({tool:"cad_wind_tunnel"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringA body handle returned by an earlier modeling-tool call (its "handle" value, or one entry of its "bodies"). Not a kernel op id, and not a "document" handle.
length ≥ 1
AoA optionalnumberangle in degrees, [-45, 45]
≥ -45 · ≤ 45
blockageMax optionalnumber—
> 0
bodies optionalstring[]a non-empty array of non-empty strings
≥ 1 items
cellsAcross optionalintegera positive integer
≥ 1
compressible optionalobjectthe compressible regime's inputs (regime "compressible" only): mach, the freestream (altitude, or pressure + temperature), gamma, model, backend, wallTemperature, refArea / refLength / momentCenter, saveVtk
compressible.machnumberfreestream Mach number, 0.3-25 (compressible-mach-range outside)
> 0
compressible.altitudenumbergeometric altitude, m, U.S. Standard Atmosphere 1976 (-610 m to ~86 km; default 0); not with pressure/temperature
compressible.backendenuma document op runs on the CPU; "gpu" is refused (compressible-gpu-unavailable)
one of "auto", "gpu", "cpu"
compressible.gammanumberratio of specific heats, 1.05-5/3 (default 1.4)
> 0
compressible.modelenum"euler" (default, slip wall) | "laminar" (no-slip, resolved wall) | "SA" (Spalart-Allmaras + equilibrium wall model); "wallModel" alone is refused (compressible-model-unsupported)
one of "euler", "laminar", "wallModel", "SA"
compressible.momentCenternumber[]moment reference point, model units (default: the bounding-box centre)
exactly 3 items
compressible.pressurenumberfreestream static pressure, Pa (with temperature, instead of altitude)
> 0
compressible.refAreanumberreference area, model units^2 (default: the frontal shadow area)
> 0
compressible.refLengthnumberreference length, model units (default: the largest bounding-box extent)
> 0
compressible.saveVtkstringpath of the volume VTK (relative to baseDir); <name>.surface.vtk is written beside it
length ≥ 1
compressible.temperaturenumberfreestream static temperature, K (with pressure, instead of altitude)
> 0
compressible.wallTemperaturenumberisothermal wall, K (viscous models only; default adiabatic)
> 0
conductivity optionalnumber—
> 0
density optionalnumber—
> 0
direction optionalnumber[][x, y, z] in millimetres
exactly 3 items
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field, or the literal "new" to start a SECOND, independent, empty document (for a separate part in the same session — each document builds and exports independently, so two parts in two documents export as two separate STEP files). Omit to use this session's default document (created automatically on first use).
length ≥ 1
dryRun optionalboolean—
duration optionalnumbertransient run length in SECONDS of simulated time (exactly one of duration / revolutions)
> 0
eddyViscosityCap optionalnumber | stringeddy-viscosity ceiling: "auto" = min(1.0, 0.01*U*L) (the CADSF-536 default), "legacy" = the flat 1.0 m^2/s ceiling that pre-dates it, or an explicit positive number of m^2/s
emitField optionalboolean—
emitVtk optionalboolean—
gridRes optionalinteger | stringnamed preset or an explicit integer grid resolution (>= 8 cells across the short axis)
groundVelocity optionalnumber—
heat optionalobject[]internal mode ports: inlets [{faces, velocity|massFlow, profile?, temperature?}], outlets [{faces, pressure?}], heat [{faces, power|temperature}]; every other face is a no-slip adiabatic wall
≥ 1 items
inlets optionalobject[]internal mode ports: inlets [{faces, velocity|massFlow, profile?, temperature?}], outlets [{faces, pressure?}], heat [{faces, power|temperature}]; every other face is a no-slip adiabatic wall
≥ 1 items
iterations optionalintegera positive integer
≥ 1
jobMode optionalboolean—
keepFailed optionalboolean—
kinematicViscosity optionalnumber—
> 0
minCellsAcrossThin optionalintegercells across the thinnest body axis; prefer 8-12
≥ 4
mode optionalenum"external" (default): Cl/Cd/Cm around the body. "internal": flow THROUGH it — the body is the fluid volume. "transient" (CADSF-102610): rotating bodies in a time-accurate run, with rotatingZones and duration | revolutions; dryRun:true returns the resolved zones and the cell estimate; without dryRun it is solved on the CPU reference within its limits, else refused rotating-transient-needs-gpu carrying the plan
one of "external", "internal", "transient"
movingWalls optionalobject[]per-surface moving-wall boundary conditions (rotating wheels, translating belts)
≥ 1 items
outlets optionalobject[]internal mode ports: inlets [{faces, velocity|massFlow, profile?, temperature?}], outlets [{faces, pressure?}], heat [{faces, power|temperature}]; every other face is a no-slip adiabatic wall
≥ 1 items
padding optionalobjectwind-tunnel domain sizing overrides, body-span multiples >= 0
padding.bottomnumberbottom domain padding, body-span multiples
≥ 0
padding.inletnumberinlet domain padding, body-span multiples
≥ 0
padding.leftnumberleft domain padding, body-span multiples
≥ 0
padding.outletnumberoutlet domain padding, body-span multiples
≥ 0
padding.rightnumberright domain padding, body-span multiples
≥ 0
padding.topnumbertop domain padding, body-span multiples
≥ 0
placementSensitivity optionalboolean—
preset optionalenumseeds a full CFD config; explicit fields override it
one of "external-aero", "automotive-ground", "quick-look"
projectionSweeps optionalintegera positive integer
≥ 1
refinement optionalobject—
refinement.zonesobject[]1-32 zones; overlapping ones merge to a union box
≥ 1 items · ≤ 32 items
refinementRatio optionalnumber—
> 0
regime optionalenum"incompressible" (default): the MAC-grid solve. "compressible": the mesh-free compressible solver (its inputs in "compressible": mach, altitude or pressure + temperature, gamma, model, ...); refusals carry compressible-* reasonCodes
one of "incompressible", "compressible"
residualTarget optionalnumbernormalized L-infinity velocity-change convergence target, (0, 1)
> 0 · ≤ 1
revolutions optionalnumbertransient run length in TURNS of the fastest rotating zone (needs a zone; exactly one of duration / revolutions)
> 0
reynolds optionalnumber—
> 0
rotatingZones optionalobject[]rotating zones (<= 16): mode "internal" maps them onto the steady rotating-frame solve (omega, axis, centre -> origin, radius -> rMax, +-halfHeight -> zMin/zMax; no inlets/outlets = a closed rotating cavity); mode "transient" resolves them into a dry-run plan; external mode refuses a non-empty list (rotating-zones-need-transient)
≤ 16 items
sampleEvery optionalnumbertransient sampling interval in the SAME unit as the run length given: seconds with duration, revolutions with revolutions
> 0
saveStl optionalstring—
length ≥ 1
scaleInvariant optionalboolean—
sideslip optionalnumberangle in degrees, [-45, 45]
≥ -45 · ≤ 45
sizing optionalobjectsizing field (CADSF-1564): "refine to h inside this region", MODEL frame, millimetres. Mutually exclusive with "refinement", which states the same zones in SI metres in the flow frame.
sizing.regionsobject[]up to 32 regions, one nested block each; overlapping regions merge (union box, finer ratio); over 800,000 fine cells across blocks is refused (sizing-cell-budget)
≥ 1 items · ≤ 32 items
sizing.angularCapDegnumber—
> 0 · ≤ 90
sizing.elementsAcrossGapinteger—
≥ 1
sizing.featureEdgesboolean—
sizing.growthRationumber—
≥ 1 · ≤ 2
sizing.hMaxnumber—
> 0
sizing.hMinnumber—
> 0
sizing.maxDepthinteger—
≥ 1 · ≤ 12
sizing.maxTrianglesinteger—
> 0
sizing.proximityboolean—
skinFriction optionalboolean | stringviscous wall-stress term in the force integration: false (default — the pressure-only form-drag integral), true (= "wallFunction"), or a named model. OPT-IN deliberately: CADSF-536 measured it worse on every validation case as a default
specificHeat optionalnumber—
> 0
stations optionalintegera positive integer
≥ 1
suppressed optionalbooleantrue = this feature is DELIBERATELY not built (the feature tree's eye toggle). It contributes no geometry and publishes no id, so an op that references it is skipped too (reported as "suppressedByFailure") while every feature independent of it still builds; the result carries "partial": true and a per-feature state. Default false. Un-suppressing rebuilds from that feature.
turbulence optionalenumplain "k-omega" (Wilcox) is NOT implemented and is rejected
one of "k-epsilon", "k-omega-sst", "laminar", "none"
turbulenceIntensity optionalnumberturbulence intensity, (0, 1)
> 0 · ≤ 1
turbulenceLengthScale optionalnumber—
> 0
units optionalenumunits the SOLID is modelled in — normalized to SI metres at the CFD boundary
one of "mm", "cm", "m", "in"
velocity optionalnumberinlet velocity, m/s (SI)
> 0 · ≤ 100
wallPressureSampling optionalenumhow the per-triangle force integration reads the pressure field: "nearest" = the floor-to-cell probe, "trilinear" = interpolated over the 8 surrounding fluid cells (the CADSF-536 default)
one of "nearest", "trilinear"
wallType optionalenum—
one of "slip", "noSlip", "movingGround"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_verify read Verify a part (render, diff, measure, heal)

Verify a built part before saving it: one report with validity (watertight, closed manifold, orientation, B-rep check, heal probe), topology (Betti numbers, holes, through holes), a spec check (named dimensions with tolerances, measured on the body, pass/fail + delta), an engineering-drawing check… Call cad_help({to…

Full description

ol:"cad_verify"}) for the rest.

ArgumentTypeMeaning & bounds
document optionalstringDocument handle (default: active).
drawing optionalobjectA PNG drawing sheet to diff against.
drawing.knownDimensionobjectSets the sheet scale: the extent of view alon…
drawing.pathstringPNG file path.
drawing.pngstringBase64 PNG.
drawing.projectionenumauto (default) detects it.
one of "auto", "first", "third"
drawing.viewsobjectOptional explicit view boxes in sheet px: {"fro…
export optionalobjectCheck the save path.
export.formatenum—
one of "fcstd"
export.freecadbooleanfalse skips the FreeCAD recompute.
gate optionalobject—
heal optionalenumprobe (default): when the body leaks, run the h…
one of "probe", "off"
images optionalintegerPNGs returned inline…
≥ 0 · ≤ 12
iouPass optionalnumberMin per-view IoU (default 0.95).
≥ 0 · ≤ 1
label optionalstringFile name stem (default "part").
of optionalstringBody handle or op id (default: all solids).
outDir optionalstringOutput folder (default verify/<label>).
qa optionalobjectAlso run the landed detector registry on this b…
reference optionalobject—
reference.pathstring.step/.stp, or .FCStd (needs FreeCAD).
spec optionalarray | stringNamed dimensions: a list of items, or text line…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_build_orientation read Build orientation (FDM and metal LPBF)

WHICH WAY UP to print a part, ranked and explained.

Full description

Candidates are the six axis-aligned directions, every planar face laid on the bed, and your hint; each is scored on support area, height, footprint, bed contact, cosmetic faces up and layer-bond anisotropy, using the fdm_x1c pack's own measurements. Call cad_help({tool:"cad_build_orientation"}) for the rest.

ArgumentTypeMeaning & bounds
solid requiredstringBody handle in this session…
length ≥ 1
allowCosmeticDown optionalbooleanLet a cosmetic face go on t…
autoCosmetic optionalbooleanfalse: only the declared co…
cosmeticFaces optionalstring[]Face ids that must finish w…
hint optionalnumber[]An extra build direction to…
exactly 3 items
loadAxis optionalnumber[]Direction the part is loade…
exactly 3 items
material optionalenumlpbf_dmp_flex350 alloy.
one of "Ti64", "IN718", "316L"
maxCandidates optionalintegerCap on candidates scored.
≥ 6 · ≤ 200
maxOverhangFaces optionalintegerCap on heat-map rows per ca…
≥ 1 · ≤ 500
pack optionalenumRule pack whose numbers sco…
one of "fdm_x1c", "lpbf_dmp_flex350"
params optionalobjectfdm_x1c pack params the swe…
params.bedExcludeAreaobjectThe refused plate rectangle…
params.materialstringFilament; tightens the over…
params.maxPartSizenumber[]Build volume, mm.
exactly 3 items
params.nozzlestringFitted nozzle, mm.
params.printableAreanumber[]Plate size, mm.
exactly 2 items
params.supportRegionsstring[]Face ids you accept support…
recoaterAxis optionalnumber[]lpbf: recoater travel direc…
exactly 3 items
supportAnalysis optionalbooleanScore the support term from…
threshold optionalnumberfdm_x1c: overhang angle pas…
> 0 · < 90
topN optionalintegerlpbf: candidates returned…
≥ 1 · ≤ 200
translate optionalenumbed (default) drops the par…
one of "bed", "none"
weights optionalobjectPer-term score weights; neg…
weights.anisotropynumberfdm_x1c anisotropy weight.
weights.buildHeightnumberlpbf buildHeight weight.
weights.contactnumberfdm_x1c contact weight.
weights.cosmeticnumberfdm_x1c cosmetic weight.
weights.distortionRisknumberlpbf distortionRisk weight.
weights.downSkinAreanumberlpbf downSkinArea weight.
weights.footprintnumberfdm_x1c footprint weight.
weights.heightnumberfdm_x1c height weight.
weights.keepOutnumberlpbf keepOut weight.
weights.partToPartnumberlpbf partToPart weight.
weights.recoaterRisknumberlpbf recoaterRisk weight.
weights.supportnumberfdm_x1c support weight.
weights.supportVolumenumberlpbf supportVolume weight.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

Returns no structured fields.

Exactly one of these argument shapes: pack + process + solidId + material + threshold + weights + candidates + best + stats + units — or — pack + solidId + threshold + weights + candidates + best + stats + units — or — error.

cad_fea_case write Write an FEA case (STL + BC patches + case.json)

Export a built body as a stress-analysis case: body.stl, one patch_<n>.stl per boundary condition and case.json (docs/FEA_CASE.md).

Full description

Needs no solver. BCs are face-selected by "faceId" from cad_body_topology; at least one fixed/sliding BC is required. Call cad_help({tool:"cad_fea_case"}) for the rest.

ArgumentTypeMeaning & bounds
boundaryConditions requiredobject[]At least one, and at least one of kind fixed/sliding — except a free-free modal case (solve.physics "modal" + solve.freeFree true), which is the one case that may pass [].
≥ 0 items
caseDir requiredstringDirectory to write the case into (created; relative paths resolve under the configured output directory). A previous results.json there is removed.
bodyLoads optionalobject[]—
exportDeck optionalenum[]"inp": case.inp, the CalculiX deck (Abaqus keyword dialect). "bdf": case.bdf, the Nastran/MYSTRAN deck (SOL 101 static, 103 modal, 105 buckling; single body, isotropic, no temperature field). Both are written on ONE mesh. Returned as decks[] {format, deckPath, howToRun, mesh}; a deck the case cannot have is {ok:false, error} by name and the other is still written. Nothing is solved.
lattice optionalobjectFast lattice FEA: {mode:"homogenised"|"explicit", cell (gyroid|schwarz-p|schwarz-d|cubic|bcc|fcc|octet|kelvin|diamond|fdm-<infill>), rho (number | {linear:{axis, from:[mm, rho], to:[mm, rho]}} | {points:[[x,y,z,rho]]}), cellSizeMm, skinMm?}. "homogenised": elements deeper than skinMm get RVE (anisotropic) lattice stiffness; the skin stays solid. "explicit": the body is the meshed lattice.
material optionalstring | objectA preset (steel, aisi-1018, stainless-304, aluminum, al-6061-t6, titanium, abs, nylon) or SI values; an object may name a preset and override fields. Default "steel". FDM presets (pla-fdm, petg-fdm, abs-fdm, asa-fdm, pa-cf-fdm) are orthotropic, XY vs Z, sourced (docs/FEA_CASE.md); with one an object takes only {preset, name, buildDirection}. Fatigue fields are read only by blade qualification.
provenance optionalobjectFree-form; copied into case.json (the demo loop records the fillet radius per iteration here).
rotor optionalobjectRotor block, same shape as cad_modal.rotor — axis {point, direction}, speedRpm, bladeCount, engineOrders, dampingRatio, excitation (docs/FEA_CASE.md § Rotor block). Requires solve.physics "modal"; a static case with a rotor is refused rotor_requires_modal.
solid optionalstringA body handle already built in the session (an op id, or "<id>#<n>"). One of solid or solids is required.
solids optionalobject[]MULTI-BODY case (case.json v2): one entry per part, each with its own material. The parts are solved as one scenario at the positions they are built at — the solver bonds domains that share a surface, so a flattened assembly analyses as an assembly. Use instead of "solid".
≥ 1 items
solve optionalobject—
solve.basisOrderenumMeshfree-adapter basis order (CalculiX ignores it). 2 resolves bending stress; 1 under-reads a fillet peak ~2x.
one of 1, 2 · default 2
solve.bucklingModesintegerbuckling only: load factors to extract; 5 if omitted.
≥ 1 · ≤ 50
solve.freeFreebooleanmodal: solve with NO restraint (free blade, panel); else a BC-less modal case is refused "unrestrained". Modes 1-6 are then rigid-body ~0 Hz.
solve.frequencyRangenumber[]modal: [lowHz, highHz] band; omit for the lowest modeCount.
exactly 2 items
solve.modeCountintegermodal only: how many eigenpairs to extract, lowest first; 10 if omitted. Refused on a static case.
≥ 1 · ≤ 200
solve.nonlinearobjectNonlinear static, CalculiX only: geometric (NLGEOM, default true), material elastic|plastic (plastic needs material.plasticCurve/tangentModulusPa; steel, al-6061-t6, abs, nylon carry cited curves), steps (10), maxIncrements (100), unload (residual state). Per-increment reaction + plastic strain out; a run short of full load is refused not_converged with lastConvergedLoadFraction.
solve.normalizationenummodal only: mode-shape scaling, "mass" (phi^T M phi = 1; default if omitted) or "max" (unit peak).
one of "mass", "max"
solve.physicsenum"linear-elastic"; "modal" (frequencies, needs densityKgM3, loads ignored); "buckling" (case loads as reference: load factors, critical load, verdict vs requiredFactor; C3D10; refused no_compression/load_required); "nonlinear-static" (set by solve.nonlinear).
one of "linear-elastic", "modal", "buckling", "nonlinear-static" · default "linear-elastic"
solve.requiredFactornumberbuckling only: factor the lowest mode must reach to pass; 3 if omitted.
> 0
solve.resolutionintegerTarget cell count: CalculiX sizes its tets from it (a meshfree adapter reads it as its resolution).
≥ 100 · ≤ 2000000 · default 20000
solve.sizingobjectVolume-mesh sizing: hMax / hMin (mm), maxTets (tet budget — the field is coarsened until the predicted count fits; refuses sizing_max_tets_unreachable).
temperatureField optionalstring | object | arrayLinear-static thermal load, prescribed nodal T (no conduction): an id (uniform|linear|radial_axial), {expression, params?, referenceC?, alphaPerC?}, or per-node degC ({nodalC} or a bare array). alphaPerC (1/degC) is required, here or from material. docs/FEA_CASE.md "Thermal load".
tessellation optionalobject—
tessellation.maxTrianglesinteger—
≥ 12
tessellation.tolerancenumberChord tolerance (mm) for body.stl; default is the kernel's.
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_fea_run write Run an FEA case and summarise the result

Solve a case written by cad_fea_case and return results.json (docs/FEA_CASE.md): max von Mises stress and where it is, max displacement, safety factor against the material yield, cell count, wall time — plus a one-line "summary" to quote.

Full description

Call cad_help({tool:"cad_fea_run"}) for the rest.

ArgumentTypeMeaning & bounds
caseDir requiredstringThe caseDir cad_fea_case returned.
deckOnly optionalbooleanWrite the CalculiX deck (case.inp, with this call's resolution / elementType / meshQuality) and STOP: deckPath + howToRun, no solve — for a machine with no solver or a run queued elsewhere. Needs no solver.
elementType optionalenumCalculiX only: force quadratic (C3D10) or linear (C3D4) tets for THIS run. Omit — the default — to let the case decide: solve.elementOrder from case.json wins, and 2 (C3D10) if it says nothing.
one of "C3D10", "C3D4"
lattice optionalenumOverride case.json lattice.mode for this run: "homogenised" (RVE stiffness in the lattice region) or "explicit" (solve the body as meshed).
one of "homogenised", "explicit"
manifest optionalbooleanAttach result.manifest: the reproducible run manifest (tools/cert/manifest.js, ADR-24) — sha256 of case.json, the deck and results.json, the solver binary sha256 + version, kernel and node version, options. CalculiX only; a manifest that cannot be built (no ccx identity) comes back as {error} and never fails the run.
meshQuality optionalboolean | objectCalculiX mesh-quality passes: ON by default (CADSF-1732), omit or true = deck default (featureDeg 30); false = opt out, raw mesh (qualityPasses false/false, slivers likely); object {featureDeg, improveSurface, improveQuality, improveOpts} tunes. results.mesh.qualityPasses / .quality say what ran and bought.
refinementStudy optionalobject—
refinementStudy.quantitiesobject[]—
≥ 1 items
refinementStudy.levelsinteger—
≥ 3 · ≤ 5
refinementStudy.rationumber—
≥ 1.3
resolution optionalintegerOverride case.json solve.resolution for this run.
≥ 100 · ≤ 2000000
solver optionalstring"auto" (default): every registered solver adapter in order, then CalculiX. "calculix": ccx only. An installed edition may register further names (cad_server_info lists them); naming one this deployment does not have is refused, never silently substituted.
default "auto"
targetSafetyFactor optionalnumberYour required safety factor on yield. Omit to judge against yield itself (fail < 1, marginal < 1.5). With it: fail < target, marginal < 1.2 x target.
> 0
timeoutSec optionalinteger—
≥ 10 · ≤ 3600 · default 600
writeField optionalbooleanAdapters that support it: also write results.vtu (the full field) next to results.json. CalculiX ignores it (it always leaves <job>.frd). The answer's verdict.viewer points at the field file on a fail/marginal result, else null + viewerReason.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_modal write Natural frequencies and mode shapes (modal analysis)

Natural frequencies (Hz) and mode shapes of a body already built in the session — the whole modal loop in one call.

Full description

It writes a modal FEA case, solves it with CalculiX *FREQUENCY or MYSTRAN SOL 103, and returns the modes lowest-first plus "frequencyTable", a small markdown table to quote. Call cad_help({tool:"cad_modal"}) for the rest.

ArgumentTypeMeaning & bounds
body requiredstringA body handle already built in the session (an op id, or "<id>#<n>").
material requiredstring | objectRequired — an eigenvalue problem has no frequency without mass. A preset (steel, aisi-1018, stainless-304, aluminum, al-6061-t6, titanium, abs, nylon, pla-fdm, petg-fdm, abs-fdm, asa-fdm, pa-cf-fdm) or SI values {youngsModulusPa, poissonRatio, densityKgM3, name?}; an object may name a preset and override fields. densityKgM3 > 0 is mandatory (density_required otherwise).
caseDir optionalstringDirectory to write the case into (created; a relative path resolves under the configured output directory). Defaults to "modal_<body>".
deckOnly optionalbooleanWrite the case and the solver deck and STOP — for handing the run to a workstation or a queue. Returns deckPath + howToRun instead of modes.
default false
elementOrder optionalenumTet order: 2 = C3D10 / 10-node CTETRA (the default — a linear tet reads a frequency 20-100 % HIGH, CADSF-1284/1289), 1 = C3D4 for a quick coarse pass.
one of 1, 2 · default 2
fixedFaces optionalstring[]"faceId" values from cad_body_topology, clamped in all dofs — the bolted/welded/clamped face. One of fixedFaces/slidingFaces is required unless freeFree is true.
≥ 1 items
freeFree optionalbooleanSolve UNRESTRAINED (a free blade, a satellite panel). Must be explicit: without it an unrestrained case is refused as "unrestrained". The first six modes are then rigid-body at ~0 Hz.
frequencyRange optionalnumber[][lowHz, highHz] band to search; omit for "the lowest modeCount modes".
exactly 2 items
modeCount optionalintegerHow many eigenpairs to extract, lowest first.
≥ 1 · ≤ 200 · default 10
normalization optionalenumMode-shape scaling: "mass" (phi^T M phi = 1, the usual) or "max" (unit largest component).
one of "mass", "max" · default "mass"
provenance optionalobjectFree-form; copied into case.json and echoed back, so an iteration is self-describing.
resolution optionalintegerTarget cell count for the volume mesh (case.json solve.resolution); default 20000.
≥ 100 · ≤ 2000000
rotor optionalobjectSpinning-structure definition for blade qualification (docs/FEA_CASE.md § Rotor block). Needs solve.physics "modal" (else rotor_requires_modal).
rotor.axisobjectThe rotation axis: a point on it (mm) and its direction (normalised for you; a zero direction is rotor_invalid).
rotor.bladeCountintegerBlades on the disk, N. sectorAngleDeg = 360/N is derived from it.
≥ 1
rotor.speedRpmnumberOperating speed (rpm). omegaRadS and the ccx CENTRIF magnitude (omega^2) are derived from it.
> 0
rotor.cyclicobjectCyclic-symmetry sector: the face ids of its two cut faces.
rotor.dampingRationumber | objectModal damping ratio zeta (not a %, not a Q). Default 0.002. Or {value, unit:"-", status:"ASSUMED", basis, range:{low,high}}.
default 0.002
rotor.engineOrdersinteger[]Excitation engine orders (kicks per revolution). Default [1, 2, V, 2V] from vaneCount; with no vaneCount there is no default (rotor_invalid) - a blade is kicked at the vane count, not its own bladeCount.
rotor.engineOrdersReasonstringWhy a stated engineOrders omits the vane passing order V or its harmonic 2V. Blade qualification refuses such a list without it (engine_orders_incomplete) and prints it on the report headline.
length ≥ 1
rotor.excitationobjectOptional forcing for the forced-response run (CADSF-1294). Carried through the contract as given.
rotor.sectorAngleDegnumberDerived (360/bladeCount). Pass it only to assert it — an inconsistent value is rotor_invalid.
> 0
rotor.speedRangeRpmnumber[]Campbell sweep [loRpm, hiRpm]; must contain speedRpm. Default [0, speedRpm].
exactly 2 items
rotor.speedStepsintegerHow many speeds in the sweep, inclusive of both ends — one prestressed modal solve each.
≥ 2 · ≤ 200 · default 16
rotor.vaneCountobjectUpstream vane count WITH its provenance (docs/FEA_CASE.md): {value, unit:"vanes", status, why | citation | basis+range}. A bare integer is refused. Blade qualification requires it.
slidingFaces optionalstring[]Faces restrained along their own normal only — a seated flange free to slide in-plane.
≥ 1 items
solver optionalenum"auto" = CalculiX if ccx is installed, else MYSTRAN, else write the deck and stop.
one of "auto", "calculix", "mystran" · default "auto"
targetHz optionalnumberMinimum first natural frequency you need (Hz), e.g. a drive or excitation frequency to stay above. Adds a pass / marginal / fail verdict (marginal = within 20 % above it).
> 0
tessellation optionalobject—
tessellation.maxTrianglesinteger—
≥ 12
tessellation.tolerancenumberChord tolerance (mm) for body.stl; default is the kernel's.
> 0
timeoutSec optionalinteger—
≥ 10 · ≤ 3600 · default 600

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_topopt write Topology optimisation (lightest shape that carries the loads)

Topology-optimise a body: the stiffest shape using volumeFraction of it, for several load cases at once.

Full description

keepIn faces stay solid; supports and loads take cad_body_topology face ids as in cad_fea_case (bearing = pin in a bore, moment = torque). mm, N. Writes <outDir>/topopt.stl + topopt.json. Next: cad_mesh_to_brep, then cad_fea_case/cad_fea_run. Minutes on a fine grid; streams progress.

ArgumentTypeMeaning & bounds
loadCases requiredobject[]—
≥ 1 items
outDir requiredstringoutput directory (created)
solid requiredstringdesign-space body handle
supports requiredobject[]—
≥ 1 items
crisp optionalbooleancrisp 0/1 result
default true
iterations optionalinteger—
≥ 1 · ≤ 1000 · default 120
keepIn optionalobject[]—
keepOut optionalobject[]—
material optionalstring | objectfeaCase preset or {youngsModulusPa, ...}
minMemberMm optionalnumbermin member radius
> 0
symmetry optionalobject—
symmetry.axisenum—
one of "x", "y", "z"
symmetry.atnumbermirror plane, mm
targetVoxels optionalintegergrid size if no voxelMm
≥ 1000 · ≤ 2000000 · default 40000
volumeFraction optionalnumbershare of the body to keep
> 0 · ≤ 1 · default 0.25
voxelMm optionalnumbergrid pitch
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_combustion read

Combustion chemistry (Cantera add-on).

Full description

Modes, args: cad_help.

ArgumentTypeMeaning & bounds
mode requiredenumequilibrium: adiabatic flame T (HP) + species; flame_speed: 1-D premixed laminar S_L; ignition_delay: const-p reactor, max dT/dt; reactor_network: spec.zones PSR/PFR chain -> outlet T, NOx/CO/UHC, combustion efficiency, spec.blowout
one of "equilibrium", "flame_speed", "ignition_delay", "reactor_network"
T optionalnumberunburnt mixture / air temperature, K
> 0 · ≤ 5000 · default 300
fuel optionalstringCH4 | C3H8 (GRI-Mech 3.0) | JetA_surrogate (n-dodecane, Wang et al. Fuel 136 (2014) 25), or any species of spec.mechanism
default "CH4"
p optionalnumberpressure, Pa
> 0 · ≤ 100000000 · default 101325
phi optionalnumber | arrayequivalence ratio, one value or a sweep (reactor_network: the overall phi, first value)
> 0 · ≤ 10 · ≥ 1 items · ≤ 40 items · default 1
spec optionalobjecteverything else (all optional)
spec.blowoutbooleanreactor_network: also search the first PSR's blowout residence time
spec.fuelMassFlowKgSnumberreactor_network fuel flow, default 0.01 kg/s
> 0
spec.fuelSpeciesstring—
length ≥ 1
spec.fuelTnumberreactor_network fuel temperature K, default T
> 0
spec.jobModebooleanrun as an async job (cad_job_status / cad_job_result)
spec.mechanismstringpath to a Cantera YAML mechanism YOU supply - needed for a custom fuel, and for a JetA_surrogate flame_speed (the bundled n-dodecane mechanism has no transport data). Never downloaded.
length ≥ 1
spec.oxidizerstringcomposition, default air O2:1, N2:3.76
length ≥ 1
spec.phasestringphase name inside the mechanism YAML
length ≥ 1
spec.tEndSnumberignition_delay window, default 0.1 s
> 0 · ≤ 100
spec.timeoutSecintegerworker wall clock, default 600
≥ 1 · ≤ 86400
spec.zonesobject[]reactor_network chain in flow order; airFraction = share of the total air added at that zone (all sum to 1, the first > 0)
≥ 1 items · ≤ 32 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_turbomachine write

Turbomachinery from a duty: meanline, curves/map, checks, B-rep assembly.

Full description

cad_help topic "turbomachine".

ArgumentTypeMeaning & bounds
duty requiredobjectpump: flowM3h|flowLs|Q|flowKgS + headM|dpBar|outletBar(+inletBar), npshA|inletBar, stages; compressor: m, PR|outletBar|boostBar, inletC|T01, inletBar|p01; turbopump: m, outletBar, inletBar
kind requiredenum—
one of "pump", "inducer", "compressor", "turbine", "turbocharger", "turbopump"
fluid optionalanyliquid name (water, seawater, LOX, RP-1, LCH4, LH2, light-oil), {rho, pVap}; air for a compressor. Default water / air / LOX
options optionalobjectbuild:false (meanline only), checks:false, sweep:{param, values}, volutes, shroud, inducer, u2Max, stage, map, casing, rotor, meanline, name
rpm optionalnumbershaft speed; omitted: chosen (motor speed for a pump, inducer Mach limit for a compressor, suction specific speed for a turbopump)
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_couple read

Couple a fast model with solver calibrators (outer loop, gates).

Full description

Args: cad_help.

ArgumentTypeMeaning & bounds
action requiredenumplan: validate + describe; run: execute the loop; replay: re-run a record with no solver; status: an async run (jobId)
one of "plan", "run", "replay", "status"
jobId optionalstringstatus: the jobId run returned
length ≥ 1
jobMode optionalbooleanrun: as an async job (poll status / cad_job_result)
record optionalobject | stringreplay: the coupling.run.v1 record a run returned, or a path to a saved one
length ≥ 1
spec optionalobject | stringcoupling spec (schema coupling.spec.v1: factors, model, calibrators, gates, loop, overrides), or a path to one; relative calibrator files resolve against its folder
length ≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_pcb read PCB analysis, BOM and revision impact diff

Analyse a PCB layout (.kicad_pcb, Gerber X2 folder, IPC-2581 .xml) without building solids.

Full description

action analyze: impedance, dc, ampacity, thermal, cert, returnPath. bom: the parts list. diff: two revisions (files or git refs) -> impactDiff v1. Every result carries an assumptions ledger; missing inputs are refused by name. Call cad_help({tool:"cad_pcb"}) for the rest.

Arguments common to every format

ArgumentTypeMeaning & bounds
action requiredenumanalyze | diff (two revisions -> impactDiff v1) | bom
one of "analyze", "diff", "bom", "package"
limit optionalintegerrows per analysis / impacts / BOM lines, worst first (default 20)
≥ 1 · ≤ 200
offset optionalintegerpaging into the same order
≥ 0
out optionalstringalso write the FULL result JSON here
project optionalstring | objecta path, or {repo,ref,path}; default: next to the board, same ref

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format-specific options (4 formats)

Format analyze

ArgumentTypeMeaning & bounds
ambientC optionalnumberthermal / ampacity ambient, C (default 25, ledgered)
analyses optionalenum[]default: every analysis whose required inputs are present
≥ 1 items
board optionalstring | object | objecta board: a path, {repo,ref,path} (git, no checkout) or {files}
cert optionalobjectUL 796 / IPC-6012 / creepage inputs
cert.altitudeMnumberm
≥ 0
cert.ctinumbercomparative tracking index, V
≥ 0
cert.drillPositionTolMmnumbermm
≥ 0
cert.fabstringfab profile id, e.g. jlcpcb
cert.innerRegistrationTolMmnumbermm
≥ 0
cert.ipcClassenum—
one of "2", "3", "3A", "DA"
cert.laminatestring—
cert.materialGroupenum—
one of "I", "II", "IIIa", "IIIb"
cert.motCnumberrequested MOT, C
cert.outerRegistrationTolMmnumbermm
≥ 0
cert.pairsobject[]creepage: net pairs and the voltage between them
≥ 1 items
cert.pollutionDegreeinteger—
≥ 1 · ≤ 3
cert.ruleenum—
one of "iec62368", "ipc2221"
defaults optionalenumtypical: cited typical values, ledgered; refuse: every gap is a refusal
one of "typical", "refuse"
jobMode optionalbooleantrue: return a job now; false: run inline even if large
netClasses optionalobjectimpedance targets per class: {<class>: {targetOhm, diffOhm, tolPct, nets}}
nets optionalstring[]restrict impedance / returnPath to these nets (glob allowed)
power optionalobject[]thermal: component dissipation
≥ 1 items
rails optionalobject[]dc / ampacity / thermal Joule heat: one entry per rail
≥ 1 items
returnPath optionalobject—
returnPath.netsstring[]net names, glob allowed ("DDR_*")
returnPath.riseTimeNsnumberedge rise time, ns
> 0
stackup optionalobjectoverrides the file's stackup
stackup.copperUmobjectcopper thickness per layer name, um
stackup.dielectricobject—
stackup.layersobject[]the whole stackup, top to bottom
≥ 1 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format bom

ArgumentTypeMeaning & bounds
board optionalstring | object | objecta board: a path, {repo,ref,path} (git, no checkout) or {files}
schematic optionalstring | objecta path, or {repo,ref,path}; default: next to the board, same ref

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format diff

ArgumentTypeMeaning & bounds
after optionalstring | object | objecta board: a path, {repo,ref,path} (git, no checkout) or {files}
ambientC optionalnumberthermal / ampacity ambient, C (default 25, ledgered)
analyses optionalenum[]default: every analysis whose required inputs are present
≥ 1 items
before optionalstring | object | objecta board: a path, {repo,ref,path} (git, no checkout) or {files}
cert optionalobjectUL 796 / IPC-6012 / creepage inputs
cert.altitudeMnumberm
≥ 0
cert.ctinumbercomparative tracking index, V
≥ 0
cert.drillPositionTolMmnumbermm
≥ 0
cert.fabstringfab profile id, e.g. jlcpcb
cert.innerRegistrationTolMmnumbermm
≥ 0
cert.ipcClassenum—
one of "2", "3", "3A", "DA"
cert.laminatestring—
cert.materialGroupenum—
one of "I", "II", "IIIa", "IIIb"
cert.motCnumberrequested MOT, C
cert.outerRegistrationTolMmnumbermm
≥ 0
cert.pairsobject[]creepage: net pairs and the voltage between them
≥ 1 items
cert.pollutionDegreeinteger—
≥ 1 · ≤ 3
cert.ruleenum—
one of "iec62368", "ipc2221"
defaults optionalenumtypical: cited typical values, ledgered; refuse: every gap is a refusal
one of "typical", "refuse"
jobMode optionalbooleantrue: return a job now; false: run inline even if large
netClasses optionalobjectimpedance targets per class: {<class>: {targetOhm, diffOhm, tolPct, nets}}
nets optionalstring[]restrict impedance / returnPath to these nets (glob allowed)
power optionalobject[]thermal: component dissipation
≥ 1 items
rails optionalobject[]dc / ampacity / thermal Joule heat: one entry per rail
≥ 1 items
returnPath optionalobject—
returnPath.netsstring[]net names, glob allowed ("DDR_*")
returnPath.riseTimeNsnumberedge rise time, ns
> 0
schematic optionalstring | objecta path, or {repo,ref,path}; default: next to the board, same ref
stackup optionalobjectoverrides the file's stackup
stackup.copperUmobjectcopper thickness per layer name, um
stackup.dielectricobject—
stackup.layersobject[]the whole stackup, top to bottom
≥ 1 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format package

ArgumentTypeMeaning & bounds
codesign optionalobjectaction:package: {ballMap, footprint, opts} die/package/board check
package optionalobject | stringaction:package -> cad_chip package (CADSF-100295): {fcbga|chiplet|hbm|wirebond: spec}

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

Returns no structured fields.

Exactly one of these argument shapes: action — or — spillPath + bytes + budgetBytes — or — error.

cad_rtl write RTL lint, simulate and coverage

Lint, simulate and cover Verilog/SystemVerilog.

Full description

lint: verilator file:line findings; sim: iverilog over a JSON test-vector table (or cocotb), per-test pass/fail, the first failing cycle with a waveform, optional VCD; cov: toggle coverage. Missing tools: tool_not_found; long sims run as async jobs.

Arguments common to every format

ArgumentTypeMeaning & bounds
action requiredenumlint | sim (test-vector table or cocotb) | cov (toggle coverage of the sim)
one of "lint", "sim", "cov"
files optionalstring[]Verilog / SystemVerilog source paths
≥ 1 items
jobMode optionalbooleantrue: run as an async job; false: force inline (default: long sims auto-route to a job)
sources optionalobject{"name.v": "source text"} inline sources (alternative or addition to files)
timeoutSec optionalintegerper-process limit, default 120
≥ 1 · ≤ 3600
top optionalstringtop module name (required for sim / cov)
length ≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format-specific options (3 formats)

Format cov

ArgumentTypeMeaning & bounds
vcdOut optionalstringwrite the VCD here (relative paths resolve against the output directory)
length ≥ 1
vectors optionalobject{clock?, signals:{name:{dir:"input"|"output", width?}}, vectors:[{test?, in:{sig:n}, expect:{sig:n}}]}: one row per cycle; inputs hold until changed; outputs are checked after the clock edge (no clock = combinational)

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format lint

ArgumentTypeMeaning & bounds
maxFindings optionalinteger—
≥ 1 · ≤ 500

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format sim

ArgumentTypeMeaning & bounds
after optionalintegerwaveform cycles after it (default 2)
≥ 0 · ≤ 32
before optionalintegerwaveform cycles before the first failure (default 3)
≥ 0 · ≤ 32
cocotb optionalobjectrun a cocotb test module instead of vectors
cocotb.modulestring—
length ≥ 1
cocotb.pythonPathstring—
length ≥ 1
cocotb.testcasestring—
length ≥ 1
vcdOut optionalstringwrite the VCD here (relative paths resolve against the output directory)
length ≥ 1
vectors optionalobject{clock?, signals:{name:{dir:"input"|"output", width?}}, vectors:[{test?, in:{sig:n}, expect:{sig:n}}]}: one row per cycle; inputs hold until changed; outputs are checked after the clock edge (no clock = combinational)
wave optionalbooleaninclude a waveform excerpt even when the sim passes
waveSignals optionalstring[]signals (name or hierarchical suffix) for the waveform; default the testbench ports

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
action requiredstring—
ok requiredboolean—
pass optionalboolean—

cad_synth write Yosys synthesis to a PDK

Synthesize Verilog to a PDK cell library with Yosys, after a clean cad_rtl lint.

Full description

Returns cells by type, area, flops, latch / loop / unmapped findings and the gate-level netlist. Missing yosys: tool_not_found; missing liberty: pdk_not_found.

Arguments common to every format

ArgumentTypeMeaning & bounds
pdk requiredenumtarget standard-cell library
one of "sky130_fd_sc_hd", "gf180mcu_fd_sc_mcu7t5v0", "sg13g2_stdcell"
top requiredstringtop module name
length ≥ 1
clock optionalobjecttarget clock: periodNs drives abc -D (timing-driven mapping)
clock.periodNsnumber—
> 0
clock.portstring—
length ≥ 1
files optionalstring[]Verilog / SystemVerilog source paths
≥ 1 items
jobMode optionalbooleantrue: run as an async job
liberty optionalstringliberty (.lib) path; default: found under pdkRoot / CADSOLVER_PDK_ROOT / PDK_ROOT
length ≥ 1
netlistOut optionalstringwrite the gate-level Verilog here (relative paths resolve against the output directory)
length ≥ 1
pdkRoot optionalstringdirectory holding the PDK checkout
length ≥ 1
sources optionalobject{"name.v": "text"} inline sources
statsOut optionalstringwrite the stats / findings JSON here
length ≥ 1
timeoutSec optionalintegerper-process limit, default 120
≥ 1 · ≤ 3600

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format-specific options (3 formats)

Format gf180mcu_fd_sc_mcu7t5v0

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format sg13g2_stdcell

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format sky130_fd_sc_hd

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
action requiredstring—
ok requiredboolean—

Import & export · 4

The formats the kernel reads and writes - STEP, IGES, Parasolid, SLDPRT, STL, glTF/GLB, 3MF, 3D PDF, DXF (in: the 2D profiles of a drawing as a sketch or, with a thickness, a flat part; out: wireframe, cut contour or flat pattern) - in and out of the same model, plus the repair pass for what comes in leaking.

cad_import write Import a CAD, mesh or PCB layout file

Import a STEP, IGES, Parasolid (.x_t/.x_b/.sldprt), ACIS SAT, or STL/OBJ mesh file and graft what it contains into this document; a .dxf drawing lands as a 2D sketch, or as an extruded flat part with thickness, or (mode "drawing") is split into its views, as is a vector .pdf drawing (mode "drawing" only); mode "pc…

Full description

b" reads a PCB layout… Call cad_help({tool:"cad_import"}) for the rest.

ArgumentTypeMeaning & bounds
path requiredstring—
length ≥ 1
annotate optionalboolean | stringa .dxf with mode…
assembly optionalenumpublish the file'…
one of "occurrences", "parts"
autoRemedy optionalboolean—
configuration optionalinteger | stringWhich CONFIGURATI…
content optionalstring—
length ≥ 1
displayMesh optionalboolean—
document optionalstringhandle or "new"
length ≥ 1
drawingView optionalobjectOne view's curves…
drawingView.viewstringa view name or id…
length ≥ 1
drawingView.annotationsstring[]annotation subtyp…
drawingView.kindsenum[]—
≥ 1 items
drawingView.limitinteger—
≥ 1 · ≤ 5000
drawingView.offsetinteger—
≥ 0
exactBrep optionalboolean—
excludeLayers optionalstring[]DXF only: layer n…
≥ 1 items · ≤ 4096 items
files optionalstring[]the files of ONE…
≥ 1 items · ≤ 4096 items
format optionalenumdefault auto…
one of "auto", "kicad_pcb", "gerber-set", "ipc2581", "odbpp"
gapTol optionalnumbermm, default 0.01…
> 0
heal optionalboolean—
healSimplify optionalboolean—
healStitchTol optionalnumber—
> 0
healTighten optionalboolean—
keepFailed optionalboolean—
layers optionalstring[]DXF only: layer n…
≥ 1 items · ≤ 4096 items
layout optionalstringpaper-space layou…
length ≥ 1
mode optionalenum"pcb": read a PCB…
one of "pcb", "drawing"
options optionalobjectPCB build options…
options.arcTolnumberchord sag mm, def…
> 0
options.bodyPerenumdefault layer_net…
one of "layer_net", "layer", "net"
options.checkboolean | stringcheckLocal per bo…
options.colourbooleanface colours by n…
options.copperStackingenumdefault: the file's
one of "outside", "inside"
options.cutoutobjectkeep only the boa…
options.dielectricenumdefault embedded…
one of "embedded", "conformal", "none"
options.dropVoidsBelownumberfill voids under…
≥ 0
options.exactDrillsbooleandefault true: dri…
options.faceBudgetnumberrefuse above this…
> 0
options.fillAllViasbooleandefault false: bu…
options.fillInnerbooleandefault true: die…
options.fillThermalReliefsanyPCB [8/10], not b…
options.keepUnnettedbooleanbuild copper on n…
options.layersstring[]copper layers to…
options.mergeViasanyPCB [8/10], not b…
options.minDistancenumberpoint merge / dri…
≥ 0
options.minFeaturenumberdrop islands unde…
≥ 0
options.minTraceWidthanyPCB [8/10], not b…
options.mirrorYbooleany -> -y; default…
options.netsinteger | string[]nets to build: na…
options.platingnumberbarrel wall mm, d…
≥ 0
options.prismenumdefault lean: pri…
one of "lean", "extrude"
options.removeNonFunctionalPadsanyPCB [8/10], not b…
options.removeSinglePinComponentsbooleandefault false: dr…
options.stackupobject | stringGerber: stackup.j…
options.tolerantbooleanGerber: an unread…
options.viaMaxDrillnumberGerber without X2…
> 0
options.viasenumdefault barrel…
one of "barrel", "solid"
page optionalintegera .pdf drawing on…
≥ 1
saveCurves optionalstringfile path…
length ≥ 1
searchPaths optionalstring[]Extra folders…
≥ 1 items · ≤ 64 items
space optionalenummode "drawing" on…
one of "auto", "model", "paper"
stitch optionalboolean—
stitchTol optionalnumber—
> 0
structureOnly optionalboolean—
subtree optionalstring—
length ≥ 1
suppressed optionalbooleantrue = not built
thickness optionalnumbermm — DXF only.
> 0
toBrep optionalboolean—
tolerant optionalboolean—
units optionalenumFile length unit.
one of "um", "mm", "cm", "m", "in", "ft"
voxelSize optionalnumber—
> 0
wetted optionalboolean—
wireframe optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_heal write Heal body

REPAIR an imported body: stitch, then merge the duplicate topology the translator emitted, then re-sew the gaps that survive at a tolerance measured from the gaps themselves (ops/healPipeline.js).

Full description

Call cad_help({tool:"cad_heal"}) for the rest.

ArgumentTypeMeaning & bounds
of requiredstringbody handle
length ≥ 1
document optionalstringhandle or "new"
length ≥ 1
keepFailed optionalboolean—
simplify optionalboolean—
stitchTol optionalnumber—
> 0
suppressed optionalbooleantrue = not built
tighten optionalboolean—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_export_body write Export a body to a file

Write a body (or the whole document) to a file in one of 21 formats; returns {path, bytes, format} + that format's report, never the contents.

Full description

Arguments are listed by name and type only; cad_help({tool:"cad_export_body", format}) gives one format's options. Call cad_help({tool:"cad_export_body"}) for the rest.

Arguments common to every format

ArgumentTypeMeaning & bounds
format requiredenumOutput file format. vehicle is a Space Program craft (ncsp.vehicle/1 folder or .zip; commercial seat) — CADSF-100529. picogk_stl is a watertight, normals-out binary STL in mm for LEAP 71 PicoGK, tessellated at voxelSize/4; vdb is the same body voxelised to OpenVDB by the optional picopie add-on (both need voxelSize) — CADSF-101045. ifc is IFC4, one element per body — CADSF-100415. x_t/x_b are Parasolid transmit (text/binary) — CADSF-741/742; 3mf is the core-spec additive package — CADSF-737; 3mf-bambu is the same package in the Bambu Studio project flavour (per-body filament slots, X1C profile, no "not from Bambu Lab" dialog) — CADSF-1774; 3mf-project is the vendor-neutral PrusaSlicer/OrcaSlicer project (one object per print, per-volume extruder) — CADSF-2501; 3mf-beamlattice is the 3MF Beam Lattice extension written from a strut list — CADSF-2127; ap242-xml is the AP242 domain-model XML assembly structure plus one .stp per part — CADSF-768; ply is binary PLY with shared (indexed) vertices, ~38% of a binary STL — CADSF-101149; fcstd is a native parametric FreeCAD 1.1 PartDesign document rebuilt from the whole op history, with fallbacks reported — CADSF-101947; qif is a QIF 3.0 inspection plan (characteristics, datums, plane/cylinder features) from the authored PMI of the document, refused when there is none — schema-unvalidated until the XSDs are installed.
one of "stl", "step", "svg", "dxf", "contour-dxf", "flat-dxf", "pdf", "prc", "gltf", "glb", "usda", "usdz", "x_t", "x_b", "3mf", "3mf-bambu", "3mf-project", "3mf-beamlattice", "sat", "ap242-xml", "ifc", "picogk_stl", "vdb", "ply", "vehicle", "fcstd", "qif"
path requiredstringOutput file path. Absolute paths are used as-is; relative paths resolve against the configured output directory (cad_configure's outputDirectory / CADSOLVER_MCP_OUTPUT_DIR) when set, else the user's Documents folder (never the server process's cwd). Parent directories are created as needed.
document optionalstringA session document handle returned by an earlier modeling-tool call's "document" field — use this to target a document OTHER than the session's default (e.g. a second part built with a modeling call's {"document":"new"}). Omit to use the session's default/active document.
length ≥ 1
of optionalstring"all" (every live body in the active document, merged) — the default — "<opId>" (body 0 of that op), or "<opId>#<bodyIndex>" (one body of a multi-body op). For format:"step", "all"/omitted still serializes the whole assembled document, but naming ONE body writes a STEP file containing ONLY that body (CADSB-144) — this is what lets two parts in the same document export as two separate STEP files without needing two documents; a "document":"new" modeling-tool call plus this tool's own "document" field is the OTHER way, for two parts you want to keep fully independent.
default "all"
strict optionalbooleanCADSF-1377. Multi-body sets only. false/omitted (default): the finishing check's report rides the result as an "assembly" block and anything wrong is a WARNING — the file is still written. true: a part that floats, interpenetrates another part, or does not sit on z=0 (within 0.5 mm, for the parts that reach lowest) REFUSES the call as E_ASSEMBLY_UNSOUND before anything is written, with the same report in details.assembly. Use it as a release gate.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format-specific options (27 formats)

Format 3mf

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
hybrid optionalenum3mf, lattice_fill hybrid body: one fused mesh (default) or split = 2 objects, exact shell + lattice core.
one of "fused", "split"
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
resolution optionalenumstl/3mf/ply of a lattice_fill field body (CADSF-101149): "full" (default) is the extraction as before; "print" decimates it within 0.02-0.05 mm of the true surface (adaptive to the thinnest wall; walls thin <= 3%), still watertight, 3MF coordinates at 1 um. Result exportProfile: bytes/triangles before and after. Over the in-memory budget (2M triangles) "print" streams chunk by chunk (CADSF-101300: seam vertices locked; result streamed:true).
one of "full", "print" · default "full"
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format 3mf-bambu

ArgumentTypeMeaning & bounds
bambu optionalobject3mf-bambu only (CADSF-1774): the Bambu project options. Everything is optional — with none of it the export is a single plate of PLA on slot 1 for a "Bambu Lab X1 Carbon" 0.4 nozzle with the stock 0.20mm Standard process.
bambu.allowFloatingbooleanCADSF-2282: write objects floating above the plate as-is (refused/dropped by default).
bambu.allowMirrorbooleanCADSF-2285: allow det<0 (mirroring) transforms.
bambu.allowMixedMaterialsbooleanCADSB-1437: allow PLA-family and ABS-family slots on one print (refused by default).
bambu.applicationstringOverride the Application metadata string. See BambuThreeMfWriter.js for exactly which reader check it is believed to satisfy.
bambu.assembleboolean | enumCADSF-2250: "auto" (default) writes bodies that touch or overlap as ONE Bambu object with each body a part (own slot), so Studio slices them as one print and runs no path-conflict check between them; "all" = one object; false = one object per body.
bambu.assembleGapnumberCADSF-2250: how close (mm) two bodies' boxes must come for "auto" to join them. Default 0.05.
≥ 0
bambu.bedTypestringBed type for every plate that does not name its own.
bambu.filamentsobject[]One entry per AMS slot, in slot order (slot 1 first).
≥ 1 items
bambu.forcebooleanExport a body the manifold gate refuses anyway, letting the slicer run its own repair.
bambu.lenientKeysbooleanCADSF-2286: ignore slots/transforms keys naming no body (refused by default).
bambu.maxSlotsintegerSlot ceiling (default 16). One AMS is 4.
≥ 1
bambu.platesobject[]Multi-plate layout. One plate holding every body when omitted.
≥ 1 items
bambu.primeTowerboolean | enumCADSB-1438: "auto" (default) turns the prime tower on only when some layer holds two filaments.
bambu.printSequencestringPrint sequence for every plate that does not name its own.
bambu.printerobject—
bambu.projectSettingsobjectExtra project_settings.config keys, merged last.
bambu.slotByColourobjectExplicit "#RRGGBB" -> 1-based filament slot.
bambu.slotsobjectExplicit body NAME -> 1-based filament slot. Beats every colour rule.
bambu.splitObjectsbooleantrue puts each mesh in its own 3D/Objects/object_N.model part, the way Bambu Studio splits a large project. Our own 3MF reader does not follow cross-part components, so the default (false) is the single-part form both read.
bambu.supportOnBuildPlateOnlybooleanDefault true: supports only grow from the bed, never inside print-in-place gaps.
bambu.supportTypeenumSupport style when supports are on. Default tree(auto).
one of "tree(auto)", "normal(auto)", "tree(manual)", "normal(manual)"
bambu.supportsboolean | enumCADSB-1436/CADSF-2160: "auto" (default) turns support on when the bodies overhang past 30° (tree(auto), build plate only); true/false force it. The decision and why are in the result.
bambu.thumbnailsbooleanfalse omits the placeholder PNGs (and the OPC thumbnail relationship).
bambu.transformsobjectBody NAME -> ROW-MAJOR 4x4 (translation in the last column), the print orientation CADSF-1773 computes. Identity when omitted.
bambu.unitsstringMillimetres only — a Bambu project has no other unit. Anything else is refused by name.
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format 3mf-beamlattice

ArgumentTypeMeaning & bounds
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
struts optionalobject[]3mf-beamlattice only (CADSF-2127): the strut list — [{p0:[x,y,z], p1:[x,y,z], r}] with optional r0/r1 (end radii, a tapered beam), cap/cap0/cap1 ("sphere" | "hemisphere" | "butt") and family (one beam set per family), ops/latticeCell.js's shape. "of" then names the solid the lattice FILLS, whose tessellation becomes the clipping mesh; omit "of" (or "all") for no clipping.
≥ 1 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format 3mf-project

ArgumentTypeMeaning & bounds
bambu optionalobject3mf-bambu only (CADSF-1774): the Bambu project options. Everything is optional — with none of it the export is a single plate of PLA on slot 1 for a "Bambu Lab X1 Carbon" 0.4 nozzle with the stock 0.20mm Standard process.
bambu.allowFloatingbooleanCADSF-2282: write objects floating above the plate as-is (refused/dropped by default).
bambu.allowMirrorbooleanCADSF-2285: allow det<0 (mirroring) transforms.
bambu.allowMixedMaterialsbooleanCADSB-1437: allow PLA-family and ABS-family slots on one print (refused by default).
bambu.applicationstringOverride the Application metadata string. See BambuThreeMfWriter.js for exactly which reader check it is believed to satisfy.
bambu.assembleboolean | enumCADSF-2250: "auto" (default) writes bodies that touch or overlap as ONE Bambu object with each body a part (own slot), so Studio slices them as one print and runs no path-conflict check between them; "all" = one object; false = one object per body.
bambu.assembleGapnumberCADSF-2250: how close (mm) two bodies' boxes must come for "auto" to join them. Default 0.05.
≥ 0
bambu.bedTypestringBed type for every plate that does not name its own.
bambu.filamentsobject[]One entry per AMS slot, in slot order (slot 1 first).
≥ 1 items
bambu.forcebooleanExport a body the manifold gate refuses anyway, letting the slicer run its own repair.
bambu.lenientKeysbooleanCADSF-2286: ignore slots/transforms keys naming no body (refused by default).
bambu.maxSlotsintegerSlot ceiling (default 16). One AMS is 4.
≥ 1
bambu.platesobject[]Multi-plate layout. One plate holding every body when omitted.
≥ 1 items
bambu.primeTowerboolean | enumCADSB-1438: "auto" (default) turns the prime tower on only when some layer holds two filaments.
bambu.printSequencestringPrint sequence for every plate that does not name its own.
bambu.printerobject—
bambu.projectSettingsobjectExtra project_settings.config keys, merged last.
bambu.slotByColourobjectExplicit "#RRGGBB" -> 1-based filament slot.
bambu.slotsobjectExplicit body NAME -> 1-based filament slot. Beats every colour rule.
bambu.splitObjectsbooleantrue puts each mesh in its own 3D/Objects/object_N.model part, the way Bambu Studio splits a large project. Our own 3MF reader does not follow cross-part components, so the default (false) is the single-part form both read.
bambu.supportOnBuildPlateOnlybooleanDefault true: supports only grow from the bed, never inside print-in-place gaps.
bambu.supportTypeenumSupport style when supports are on. Default tree(auto).
one of "tree(auto)", "normal(auto)", "tree(manual)", "normal(manual)"
bambu.supportsboolean | enumCADSB-1436/CADSF-2160: "auto" (default) turns support on when the bodies overhang past 30° (tree(auto), build plate only); true/false force it. The decision and why are in the result.
bambu.thumbnailsbooleanfalse omits the placeholder PNGs (and the OPC thumbnail relationship).
bambu.transformsobjectBody NAME -> ROW-MAJOR 4x4 (translation in the last column), the print orientation CADSF-1773 computes. Identity when omitted.
bambu.unitsstringMillimetres only — a Bambu project has no other unit. Anything else is refused by name.
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format ap242-xml

ArgumentTypeMeaning & bounds
colors optionalobjectUS spelling of "colours" (same map)
≥ 1 keys
colours optionalobjectstep / ap242-xml / x_t (CADSF-2886): body colours, { "<body ref | op id | part name>": "#RRGGBB" | [r,g,b] }. Each named body is written with one STYLED_ITEM/COLOUR_RGB (STEP) or SDL/TYSA_COLOUR (x_t), and the colour stays on the document for later exports. Colours already on the document (an imported file's, earlier calls') are always written, with or without this. A key naming no body is refused COLOUR_NO_BODY.
≥ 1 keys
transforms optionalobjectSTEP export only ("format":"step"): a per-body placement to write into the exported product structure, keyed by the same body reference "of" accepts (a handle, "<opId>", or "<opId>#<n>") — one entry per body that needs to move. This is the seam that turns a solved mate set into an assembled export: paste cad_assembly_mate's own per-component cadTransform ({ rotate: { axis, angle } | null, translate }, about the world origin) straight in as the value for that component's body ref — or pass the lower-level affine { m, t } form (a 3x3 rotation matrix + translation) if you built the placement some other way. A body named here gets its own PRODUCT/NAUO placement in the file instead of the shared identity one every other body keeps; only takes effect when the export covers more than one body (a single-body export has no assembly structure to place anything in). Refused for stl/svg/dxf.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format contour-dxf

ArgumentTypeMeaning & bounds
axis optionalenumSVG/DXF/contour-DXF only: which world axis to project along (drop) — "z" is a top/plan view. "auto" (contour-dxf only) picks the axis the part is thinnest along, i.e. the sheet normal.
one of "x", "y", "z", "auto" · default "z"
side optionalenumcontour-dxf only: take the contour from the face at the HIGH end of the view axis ("near", the default) or the low end ("far"). Only matters when the two faces differ.
one of "near", "far" · default "near"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format dxf

ArgumentTypeMeaning & bounds
axis optionalenumSVG/DXF/contour-DXF only: which world axis to project along (drop) — "z" is a top/plan view. "auto" (contour-dxf only) picks the axis the part is thinnest along, i.e. the sheet normal.
one of "x", "y", "z", "auto" · default "z"
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
units optionalenumx_t/x_b (CADSB-818): the unit the transmit's own numbers are written in, "m" or "mm". Default "m" — Parasolid's convention [S §4.2.1], the one every vendor transmit in this repo's corpus uses, so the file opens at the right size in SolidWorks/NX. Pass "mm" only to reproduce the pre-CADSB-818 byte shape (kernel mm written unscaled). dxf (CADSF-100617, wireframe and "view":"hlr"): the unit the drawing is written in — every coordinate is CONVERTED from the kernel's millimetres and the header declares it ($INSUNITS, with $MEASUREMENT). Default "mm", byte-identical coordinates to before; the document's declared import unit is not applied by itself, pass it here to get that unit. cm/in/ft/um are dxf only; contour-dxf and flat-dxf are always millimetres, and no other format takes a unit.
one of "m", "mm", "cm", "in", "ft", "um"
view optionalenumSVG/DXF only (CADSF-770): "wireframe" (default, unchanged) draws every tessellated-mesh edge with no occlusion test — see wireframe.js. "hlr" reuses ops/hlr.js's vector hidden-line-removal pipeline (CADSF-115): the body's real B-rep edges plus view-dependent silhouettes on curved faces (analytic where the surface is a plane/cylinder/cone/sphere/torus, tessellation-derived otherwise), occlusion-tested against the tessellated mesh via BVH raycast and split into visible/hidden runs — a drafting-grade view instead of a mesh dump: visible edges solid, hidden edges dashed on their own layer/group ("VISIBLE"/"HIDDEN" in DXF, id="visible"/id="hidden" groups in SVG). Reads "axis" for the camera direction the same three principal views wireframe mode offers ("auto" is not meaningful here and is treated as "z"); the response reports "visibleEdgeCount"/"hiddenEdgeCount" alongside the usual "edgeCount" (their sum). Refused for every format other than svg/dxf.
one of "wireframe", "hlr"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format fcstd

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format flat-dxf

ArgumentTypeMeaning & bounds
kFactor optionalnumberflat-dxf only: K-factor override for the developed length — the neutral-axis position as a fraction of thickness from the INSIDE surface, (0, 0.5]. Omit for the published air-bending R/T table. The DXF's TEXT layer records what was used per bend.
> 0 · ≤ 0.5

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format glb

ArgumentTypeMeaning & bounds
animations optionalobject[]gltf/glb only: authored node-TRS animation clips, passed through to the writer verbatim (kinematic SAMPLING from a solved mate set is CADSF-751, not this argument). Channel "node" indices address the exported scene's nodes: with bakeTransforms:true body i is node i; otherwise node 0 is the conversion root and body i is node i+1. "times" are seconds, strictly ascending; "values" is one [x,y,z] per key ([x,y,z,w] for "rotation").
≥ 1 items
bakeTransforms optionalbooleangltf/glb only: true bakes the mm→m scale and Z-up→Y-up rotation into the vertex buffers themselves; false (default) ships kernel-space coordinates under one root conversion node carrying that scale and rotation, so downstream tooling can still read kernel-space mm out of the buffers.
default false
compression optionalobjectgltf/glb only (CADSF-981, on CADSF-752's GltfCompression): shrink the written container. BOTH FLAGS DEFAULT OFF — omit this object and the file is byte-for-byte the uncompressed CADSF-753 export. Applied between the scene build and the encode, so it composes with "lods", "envelope" and authored "animations". Both extensions are declared in extensionsUsed AND extensionsRequired (a viewer that cannot decode them must refuse the file rather than draw it wrong), and both are read back by our own reader (web/src/glb-read.js) and poster renderer. Draco and meshopt are NOT here: each extension is defined by its encoder (a C++/WASM dependency), and neither is installed — ask for them and GltfCompression refuses by name.
compression.instancebooleanWrite EXT_mesh_gpu_instancing: childless, matrix-free sibling nodes that share one mesh collapse into a single node carrying a TRANSLATION/ROTATION/SCALE accessor per instance. Animated nodes, MSFT_lod nodes and the root are never collapsed, so a LOD ladder and authored clips survive.
compression.minInstancesintegerGroup size at which collapsing pays (default 4). Below it the nodes are left alone, because an instance accessor costs a buffer view.
≥ 2
compression.quantizebooleanWrite KHR_mesh_quantization: POSITION -> SHORT on a per-mesh power-of-two grid whose inverse is folded into the node transform, NORMAL -> normalized SHORT, TEXCOORD_0 -> normalized UNSIGNED_SHORT when the uvs stay in [0, 1]. Roughly a third off a geometry-heavy part. On a NODE-heavy scene quantization alone can GROW the file (every drawing node gains a dequantization transform) — pair it with "instance" there.
creaseAngleDeg optionalnumbergltf/glb only (CADSF-753): crease gate in degrees for the tessellator's shading-normal pass (CADSB-472) — edges whose faces meet more smoothly than this are welded to one shared normal, sharper ones keep a hard crease (duplicated rim vertices). SceneReady spec §4 default is 30. This gate is what makes a runtime renderer shade the part correctly instead of flat faces as gradients (CADSB-514).
> 0 · ≤ 180 · default 30
envelope optionalbooleangltf/glb only (CADSF-757): Envelope Export — ship only the bodies that participate in the model's exterior appearance; bodies that cannot be seen from outside are left out of the file entirely (smaller asset, and internal mechanisms never leave the source document). The result's "envelope" field reports what was kept and what stayed home. A body that must ship regardless belongs in "of".
envelopeViews optionalnumbergltf/glb only: sampling quality for envelope:true (default 26, minimum 20). Raise it if a body visible only through a small opening must survive the cut.
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
lodMode optionalenumgltf/glb only (CADSF-776), and only alongside "lods". "single" (default): ONE container holding every level, wired with the MSFT_lod vendor extension — the chain hangs off each highest-detail body node as extensions.MSFT_lod.ids (node indices of the lower levels, finest first) with extras.MSFT_screencoverage carrying the switch thresholds, and "MSFT_lod" declared in extensionsUsed. The lower-level nodes are reachable ONLY through those ids — not in the scene, not anyone's child — so a viewer that does not implement the extension loads the highest level and ignores the rest instead of drawing N overlapping copies. "files": N independent assets written beside the requested path as "<name>.lod0.glb", "<name>.lod1.glb", …, each a complete single-level scene with no MSFT_lod — the shape a streaming/CDN pipeline wants. Either way the response's "lod.levels" reports every file, budget and achieved triangle count.
one of "single", "files"
lods optionalobject[]gltf/glb only (CADSF-776): export N TESSELLATION LEVELS in this one call instead of one budgeted mesh — the LOD chain a game engine or digital twin actually wants. Each entry is one level's budget ("tolerance" mm chord and/or "maxTriangles"), listed FINEST FIRST; a list that runs coarse→fine is refused, not reordered. The top-level "tolerance"/"maxTriangles" are refused alongside this (one source of truth per number). Levels go through the honest CADSB-155 budget search (subdivision, then the chord-tolerance ladder), so the response's "lod" reports the triangle count each level ACHIEVED, the method, a per-level "shortfall" flag when even the coarsest achievable mesh missed the budget, and "monotonic" — whether counts really do fall level over level (chord tolerance only moves ANALYTIC curved faces; prebuilt faceted faces such as gear flanks, and planar faces, do not coarsen at all, so a badly chosen ladder can flatten out). See "lodMode" for the two shipping shapes.
≥ 2 items · ≤ 8 items
material optionalobject | stringgltf/glb only (CADSF-1202): a default KHR_materials_pbrMetallicRoughness material for a BARE body — one with no "materialsOverride"/authored per-face appearance. Either a named stock ("6061-T6", "ti-6al-4v", "in718", "ss-304", "ss-316", "mild-steel", "brass-c360", "abs", "pla", "pa12", "acrylic" — see exporters/materials.js STOCKS for the full table and each colour/roughness citation) resolved through GltfExporter's stock table, or a full PBR object ({baseColorFactor:[r,g,b,a], metallicFactor, roughnessFactor, name?} or a raw glTF material with "pbrMetallicRoughness"). Emitted ONCE and referenced by every primitive that does not already carry its own "material" index (materialsOverride wins per-body); an unrecognised stock name is refused (not guessed), listing every known stock. Without it, output is byte-identical to before this ticket — this is what let CADSB-746's imts-casing page drop its viewer-side fallback override once the shipped GLB carries a real material.
materialsOverride optionalobject[]gltf/glb only: glTF 2.0 material objects, passed through verbatim (kernel appearance→PBR mapping is CADSF-749; this is the manual override until then, and the override of it after). Pass ONE material (applied to every exported body) or exactly one per body in "of" resolution order — any other count is refused rather than guessed at.
≥ 1 items
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
quantize optionalbooleangltf/glb only: shorthand for compression:{quantize:true} (CADSF-981). Pass the object form when you also want "instance".
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tangents optionalbooleangltf/glb: also write TANGENT (VEC4) on TEXCOORD_0. Default false.
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
uv optionalenumgltf/glb/usd: texture coordinates. "game" (default, SceneReady): TEXCOORD_0 metric (1 uv = 1 m or "uvScale" mm, tiling) + TEXCOORD_1 packed non-overlapping 0-1 atlas (bakes, decals). No images; materials carry extras.materialClass/paletteId. "normalized": per-face [0,1]². "world": fixed physical size. "none": no uvs. UVs duplicate seam/face-boundary vertices; report in asset.extras.conversion.uv. Format: docs/FORMATS.md.
one of "game", "normalized", "world", "none" · default "game"
uvAtlasPx optionalintegeruv:"game": TEXCOORD_1 atlas size in texels (default 1024; 4-texel gutter).
≥ 64 · ≤ 16384
uvScale optionalnumbergltf/glb/usd: mm of surface per uv unit — uv:"game" (default 1000, never snapped) or uv:"world" (default 10, snapped to whole tiles per revolution).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format gltf

ArgumentTypeMeaning & bounds
animations optionalobject[]gltf/glb only: authored node-TRS animation clips, passed through to the writer verbatim (kinematic SAMPLING from a solved mate set is CADSF-751, not this argument). Channel "node" indices address the exported scene's nodes: with bakeTransforms:true body i is node i; otherwise node 0 is the conversion root and body i is node i+1. "times" are seconds, strictly ascending; "values" is one [x,y,z] per key ([x,y,z,w] for "rotation").
≥ 1 items
bakeTransforms optionalbooleangltf/glb only: true bakes the mm→m scale and Z-up→Y-up rotation into the vertex buffers themselves; false (default) ships kernel-space coordinates under one root conversion node carrying that scale and rotation, so downstream tooling can still read kernel-space mm out of the buffers.
default false
compression optionalobjectgltf/glb only (CADSF-981, on CADSF-752's GltfCompression): shrink the written container. BOTH FLAGS DEFAULT OFF — omit this object and the file is byte-for-byte the uncompressed CADSF-753 export. Applied between the scene build and the encode, so it composes with "lods", "envelope" and authored "animations". Both extensions are declared in extensionsUsed AND extensionsRequired (a viewer that cannot decode them must refuse the file rather than draw it wrong), and both are read back by our own reader (web/src/glb-read.js) and poster renderer. Draco and meshopt are NOT here: each extension is defined by its encoder (a C++/WASM dependency), and neither is installed — ask for them and GltfCompression refuses by name.
compression.instancebooleanWrite EXT_mesh_gpu_instancing: childless, matrix-free sibling nodes that share one mesh collapse into a single node carrying a TRANSLATION/ROTATION/SCALE accessor per instance. Animated nodes, MSFT_lod nodes and the root are never collapsed, so a LOD ladder and authored clips survive.
compression.minInstancesintegerGroup size at which collapsing pays (default 4). Below it the nodes are left alone, because an instance accessor costs a buffer view.
≥ 2
compression.quantizebooleanWrite KHR_mesh_quantization: POSITION -> SHORT on a per-mesh power-of-two grid whose inverse is folded into the node transform, NORMAL -> normalized SHORT, TEXCOORD_0 -> normalized UNSIGNED_SHORT when the uvs stay in [0, 1]. Roughly a third off a geometry-heavy part. On a NODE-heavy scene quantization alone can GROW the file (every drawing node gains a dequantization transform) — pair it with "instance" there.
creaseAngleDeg optionalnumbergltf/glb only (CADSF-753): crease gate in degrees for the tessellator's shading-normal pass (CADSB-472) — edges whose faces meet more smoothly than this are welded to one shared normal, sharper ones keep a hard crease (duplicated rim vertices). SceneReady spec §4 default is 30. This gate is what makes a runtime renderer shade the part correctly instead of flat faces as gradients (CADSB-514).
> 0 · ≤ 180 · default 30
envelope optionalbooleangltf/glb only (CADSF-757): Envelope Export — ship only the bodies that participate in the model's exterior appearance; bodies that cannot be seen from outside are left out of the file entirely (smaller asset, and internal mechanisms never leave the source document). The result's "envelope" field reports what was kept and what stayed home. A body that must ship regardless belongs in "of".
envelopeViews optionalnumbergltf/glb only: sampling quality for envelope:true (default 26, minimum 20). Raise it if a body visible only through a small opening must survive the cut.
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
lodMode optionalenumgltf/glb only (CADSF-776), and only alongside "lods". "single" (default): ONE container holding every level, wired with the MSFT_lod vendor extension — the chain hangs off each highest-detail body node as extensions.MSFT_lod.ids (node indices of the lower levels, finest first) with extras.MSFT_screencoverage carrying the switch thresholds, and "MSFT_lod" declared in extensionsUsed. The lower-level nodes are reachable ONLY through those ids — not in the scene, not anyone's child — so a viewer that does not implement the extension loads the highest level and ignores the rest instead of drawing N overlapping copies. "files": N independent assets written beside the requested path as "<name>.lod0.glb", "<name>.lod1.glb", …, each a complete single-level scene with no MSFT_lod — the shape a streaming/CDN pipeline wants. Either way the response's "lod.levels" reports every file, budget and achieved triangle count.
one of "single", "files"
lods optionalobject[]gltf/glb only (CADSF-776): export N TESSELLATION LEVELS in this one call instead of one budgeted mesh — the LOD chain a game engine or digital twin actually wants. Each entry is one level's budget ("tolerance" mm chord and/or "maxTriangles"), listed FINEST FIRST; a list that runs coarse→fine is refused, not reordered. The top-level "tolerance"/"maxTriangles" are refused alongside this (one source of truth per number). Levels go through the honest CADSB-155 budget search (subdivision, then the chord-tolerance ladder), so the response's "lod" reports the triangle count each level ACHIEVED, the method, a per-level "shortfall" flag when even the coarsest achievable mesh missed the budget, and "monotonic" — whether counts really do fall level over level (chord tolerance only moves ANALYTIC curved faces; prebuilt faceted faces such as gear flanks, and planar faces, do not coarsen at all, so a badly chosen ladder can flatten out). See "lodMode" for the two shipping shapes.
≥ 2 items · ≤ 8 items
material optionalobject | stringgltf/glb only (CADSF-1202): a default KHR_materials_pbrMetallicRoughness material for a BARE body — one with no "materialsOverride"/authored per-face appearance. Either a named stock ("6061-T6", "ti-6al-4v", "in718", "ss-304", "ss-316", "mild-steel", "brass-c360", "abs", "pla", "pa12", "acrylic" — see exporters/materials.js STOCKS for the full table and each colour/roughness citation) resolved through GltfExporter's stock table, or a full PBR object ({baseColorFactor:[r,g,b,a], metallicFactor, roughnessFactor, name?} or a raw glTF material with "pbrMetallicRoughness"). Emitted ONCE and referenced by every primitive that does not already carry its own "material" index (materialsOverride wins per-body); an unrecognised stock name is refused (not guessed), listing every known stock. Without it, output is byte-identical to before this ticket — this is what let CADSB-746's imts-casing page drop its viewer-side fallback override once the shipped GLB carries a real material.
materialsOverride optionalobject[]gltf/glb only: glTF 2.0 material objects, passed through verbatim (kernel appearance→PBR mapping is CADSF-749; this is the manual override until then, and the override of it after). Pass ONE material (applied to every exported body) or exactly one per body in "of" resolution order — any other count is refused rather than guessed at.
≥ 1 items
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
quantize optionalbooleangltf/glb only: shorthand for compression:{quantize:true} (CADSF-981). Pass the object form when you also want "instance".
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tangents optionalbooleangltf/glb: also write TANGENT (VEC4) on TEXCOORD_0. Default false.
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
uv optionalenumgltf/glb/usd: texture coordinates. "game" (default, SceneReady): TEXCOORD_0 metric (1 uv = 1 m or "uvScale" mm, tiling) + TEXCOORD_1 packed non-overlapping 0-1 atlas (bakes, decals). No images; materials carry extras.materialClass/paletteId. "normalized": per-face [0,1]². "world": fixed physical size. "none": no uvs. UVs duplicate seam/face-boundary vertices; report in asset.extras.conversion.uv. Format: docs/FORMATS.md.
one of "game", "normalized", "world", "none" · default "game"
uvAtlasPx optionalintegeruv:"game": TEXCOORD_1 atlas size in texels (default 1024; 4-texel gutter).
≥ 64 · ≤ 16384
uvScale optionalnumbergltf/glb/usd: mm of surface per uv unit — uv:"game" (default 1000, never snapped) or uv:"world" (default 10, snapped to whole tiles per revolution).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format ifc

ArgumentTypeMeaning & bounds
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format pdf

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
pdfa optionalenumpdf only (CADSF-729): write an ARCHIVAL container instead of a plain 3D PDF — XMP conformance claim, output intent with an embedded ICC profile, trailer /ID, no unembedded font (the page caption is dropped), and the source AP242 STEP plus a per-part validation report embedded as associated files. "3b" is ISO 19005-3 (PDF/A-3B), which is what a records group asks for BUT whose permitted-annotation list does not include /3D — a 3D PDF cannot validate at that level, and the call returns a warning saying so. "4e" is ISO 19005-4E, the engineering level that permits 3D artwork: use it when the file has to be both rotatable and valid.
one of "3b", "4e"
pmiFrom optionalstringpdf/prc only (CADSF-695): path to an AP242 STEP file whose GRAPHICAL PMI (tessellated annotation polylines — leaders, extension lines, callout glyph outlines) is read and written into the PRC as markup entities, with its saved camera(s) added to the PDF view list. Usually the same file the body was imported from; the importer does not retain its source path, so it is named explicitly.
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
stepFrom optionalstringpdf only (CADSF-729), with "pdfa": path to the authoritative AP242 STEP to embed VERBATIM as the /AFRelationship /Source attachment — normally the file the body was imported from. Omitted, the document is written to AP242 with StepWriter and that is embedded instead.
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format picogk_stl

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
voxelSize optionalnumberpicogk_stl / vdb only (CADSF-101045): the PicoGK voxel size in mm the file is prepared for. Sets the default chord tolerance (voxelSize/4) and, for vdb, the grid pitch.
> 0 · ≤ 100

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format ply

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
resolution optionalenumstl/3mf/ply of a lattice_fill field body (CADSF-101149): "full" (default) is the extraction as before; "print" decimates it within 0.02-0.05 mm of the true surface (adaptive to the thinnest wall; walls thin <= 3%), still watertight, 3MF coordinates at 1 um. Result exportProfile: bytes/triangles before and after. Over the in-memory budget (2M triangles) "print" streams chunk by chunk (CADSF-101300: seam vertices locked; result streamed:true).
one of "full", "print" · default "full"
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format prc

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
pmiFrom optionalstringpdf/prc only (CADSF-695): path to an AP242 STEP file whose GRAPHICAL PMI (tessellated annotation polylines — leaders, extension lines, callout glyph outlines) is read and written into the PRC as markup entities, with its saved camera(s) added to the PDF view list. Usually the same file the body was imported from; the importer does not retain its source path, so it is named explicitly.
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format qif

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format sat

No options beyond the arguments above.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format step

ArgumentTypeMeaning & bounds
colors optionalobjectUS spelling of "colours" (same map)
≥ 1 keys
colours optionalobjectstep / ap242-xml / x_t (CADSF-2886): body colours, { "<body ref | op id | part name>": "#RRGGBB" | [r,g,b] }. Each named body is written with one STYLED_ITEM/COLOUR_RGB (STEP) or SDL/TYSA_COLOUR (x_t), and the colour stays on the document for later exports. Colours already on the document (an imported file's, earlier calls') are always written, with or without this. A key naming no body is refused COLOUR_NO_BODY.
≥ 1 keys
compress optionalbooleanstep only (CADSF-100995): write the file gzipped — compressed STEP ("STEP-Zip"), what CATIA, SolidWorks, NX and most PDM systems open as .stpZ. A path ending in .stpZ / .stpz does this without the flag. "bytes" is then the compressed size and "uncompressedBytes" the Part 21 text. Refused for every other format (STEP_COMPRESS_FORMAT).
schema optionalstringstep only (CADSF-100990): the STEP application protocol / edition the file declares — "ap203" (= ap203e2), "ap203e1", "ap203e2", "ap214", "ap242" (= ap242e2, the default), "ap242e1", "ap242e2", "ap242e3", or "source" (keep the document's own). What a schema cannot carry (PMI and tessellation outside AP242; colours, layers and validation properties in AP203 ed1) is dropped and listed on the result's "schema"; with "strict":true it is refused E_STEP_SCHEMA_UNSUPPORTED instead, nothing written. Refused for every other format (STEP_SCHEMA_FORMAT).
pattern ^(ap203e1|ap203e2|ap214|ap242e1|ap242e2|ap242e3|ap203|ap242|source)$
tessellated optionalenumstep only (CADSF-100394): AP242 tessellation of each body — "add" writes it beside the exact B-rep (a hybrid file: CAD reads the B-rep, a viewer the mesh), "only" instead of it (a viewer/LOTAR payload). Both write CAx-IF tessellated validation properties (facet count, mesh area, its centre point). Default "none": the B-rep alone, byte for byte as before. Refused for every other format (STEP_TESS_FORMAT).
one of "none", "add", "only"
transforms optionalobjectSTEP export only ("format":"step"): a per-body placement to write into the exported product structure, keyed by the same body reference "of" accepts (a handle, "<opId>", or "<opId>#<n>") — one entry per body that needs to move. This is the seam that turns a solved mate set into an assembled export: paste cad_assembly_mate's own per-component cadTransform ({ rotate: { axis, angle } | null, translate }, about the world origin) straight in as the value for that component's body ref — or pass the lower-level affine { m, t } form (a 3x3 rotation matrix + translation) if you built the placement some other way. A body named here gets its own PRODUCT/NAUO placement in the file instead of the shared identity one every other body keeps; only takes effect when the export covers more than one body (a single-body export has no assembly structure to place anything in). Refused for stl/svg/dxf.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format stl

ArgumentTypeMeaning & bounds
binary optionalbooleanSTL only: true (default) for binary STL, false for streamed ASCII STL. (For glTF, binary is the format choice itself: "glb".)
default true
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
resolution optionalenumstl/3mf/ply of a lattice_fill field body (CADSF-101149): "full" (default) is the extraction as before; "print" decimates it within 0.02-0.05 mm of the true surface (adaptive to the thinnest wall; walls thin <= 3%), still watertight, 3MF coordinates at 1 um. Result exportProfile: bytes/triangles before and after. Over the in-memory budget (2M triangles) "print" streams chunk by chunk (CADSF-101300: seam vertices locked; result streamed:true).
one of "full", "print" · default "full"
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format svg

ArgumentTypeMeaning & bounds
axis optionalenumSVG/DXF/contour-DXF only: which world axis to project along (drop) — "z" is a top/plan view. "auto" (contour-dxf only) picks the axis the part is thinnest along, i.e. the sheet normal.
one of "x", "y", "z", "auto" · default "z"
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
view optionalenumSVG/DXF only (CADSF-770): "wireframe" (default, unchanged) draws every tessellated-mesh edge with no occlusion test — see wireframe.js. "hlr" reuses ops/hlr.js's vector hidden-line-removal pipeline (CADSF-115): the body's real B-rep edges plus view-dependent silhouettes on curved faces (analytic where the surface is a plane/cylinder/cone/sphere/torus, tessellation-derived otherwise), occlusion-tested against the tessellated mesh via BVH raycast and split into visible/hidden runs — a drafting-grade view instead of a mesh dump: visible edges solid, hidden edges dashed on their own layer/group ("VISIBLE"/"HIDDEN" in DXF, id="visible"/id="hidden" groups in SVG). Reads "axis" for the camera direction the same three principal views wireframe mode offers ("auto" is not meaningful here and is treated as "z"); the response reports "visibleEdgeCount"/"hiddenEdgeCount" alongside the usual "edgeCount" (their sum). Refused for every format other than svg/dxf.
one of "wireframe", "hlr"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format usda

ArgumentTypeMeaning & bounds
bakeTransforms optionalbooleangltf/glb only: true bakes the mm→m scale and Z-up→Y-up rotation into the vertex buffers themselves; false (default) ships kernel-space coordinates under one root conversion node carrying that scale and rotation, so downstream tooling can still read kernel-space mm out of the buffers.
default false
creaseAngleDeg optionalnumbergltf/glb only (CADSF-753): crease gate in degrees for the tessellator's shading-normal pass (CADSB-472) — edges whose faces meet more smoothly than this are welded to one shared normal, sharper ones keep a hard crease (duplicated rim vertices). SceneReady spec §4 default is 30. This gate is what makes a runtime renderer shade the part correctly instead of flat faces as gradients (CADSB-514).
> 0 · ≤ 180 · default 30
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
materialsOverride optionalobject[]gltf/glb only: glTF 2.0 material objects, passed through verbatim (kernel appearance→PBR mapping is CADSF-749; this is the manual override until then, and the override of it after). Pass ONE material (applied to every exported body) or exactly one per body in "of" resolution order — any other count is refused rather than guessed at.
≥ 1 items
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
upAxis optionalenumusda/usdz only (CADSF-777): which axis the STAGE declares as up — the USD metadatum admits exactly these two. "Z" (default for usda) is the kernel's own axis, so points are written verbatim with no rotation anywhere in the file. "Y" (default for usdz, because iOS AR Quick Look fixes Y as up) adds ONE root "xformOp:rotateX = -90" mapping (x,y,z)→(x,z,−y), or bakes it into the points with "bakeTransforms":true. Units are never carried by an xformOp: they are the stage's metersPerUnit (0.001, points in mm) unless "bakeTransforms" folds the scale in.
one of "Z", "Y"
uv optionalenumgltf/glb/usd: texture coordinates. "game" (default, SceneReady): TEXCOORD_0 metric (1 uv = 1 m or "uvScale" mm, tiling) + TEXCOORD_1 packed non-overlapping 0-1 atlas (bakes, decals). No images; materials carry extras.materialClass/paletteId. "normalized": per-face [0,1]². "world": fixed physical size. "none": no uvs. UVs duplicate seam/face-boundary vertices; report in asset.extras.conversion.uv. Format: docs/FORMATS.md.
one of "game", "normalized", "world", "none" · default "game"
uvAtlasPx optionalintegeruv:"game": TEXCOORD_1 atlas size in texels (default 1024; 4-texel gutter).
≥ 64 · ≤ 16384
uvScale optionalnumbergltf/glb/usd: mm of surface per uv unit — uv:"game" (default 1000, never snapped) or uv:"world" (default 10, snapped to whole tiles per revolution).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format usdz

ArgumentTypeMeaning & bounds
bakeTransforms optionalbooleangltf/glb only: true bakes the mm→m scale and Z-up→Y-up rotation into the vertex buffers themselves; false (default) ships kernel-space coordinates under one root conversion node carrying that scale and rotation, so downstream tooling can still read kernel-space mm out of the buffers.
default false
creaseAngleDeg optionalnumbergltf/glb only (CADSF-753): crease gate in degrees for the tessellator's shading-normal pass (CADSB-472) — edges whose faces meet more smoothly than this are welded to one shared normal, sharper ones keep a hard crease (duplicated rim vertices). SceneReady spec §4 default is 30. This gate is what makes a runtime renderer shade the part correctly instead of flat faces as gradients (CADSB-514).
> 0 · ≤ 180 · default 30
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
materialsOverride optionalobject[]gltf/glb only: glTF 2.0 material objects, passed through verbatim (kernel appearance→PBR mapping is CADSF-749; this is the manual override until then, and the override of it after). Pass ONE material (applied to every exported body) or exactly one per body in "of" resolution order — any other count is refused rather than guessed at.
≥ 1 items
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
upAxis optionalenumusda/usdz only (CADSF-777): which axis the STAGE declares as up — the USD metadatum admits exactly these two. "Z" (default for usda) is the kernel's own axis, so points are written verbatim with no rotation anywhere in the file. "Y" (default for usdz, because iOS AR Quick Look fixes Y as up) adds ONE root "xformOp:rotateX = -90" mapping (x,y,z)→(x,z,−y), or bakes it into the points with "bakeTransforms":true. Units are never carried by an xformOp: they are the stage's metersPerUnit (0.001, points in mm) unless "bakeTransforms" folds the scale in.
one of "Z", "Y"
uv optionalenumgltf/glb/usd: texture coordinates. "game" (default, SceneReady): TEXCOORD_0 metric (1 uv = 1 m or "uvScale" mm, tiling) + TEXCOORD_1 packed non-overlapping 0-1 atlas (bakes, decals). No images; materials carry extras.materialClass/paletteId. "normalized": per-face [0,1]². "world": fixed physical size. "none": no uvs. UVs duplicate seam/face-boundary vertices; report in asset.extras.conversion.uv. Format: docs/FORMATS.md.
one of "game", "normalized", "world", "none" · default "game"
uvAtlasPx optionalintegeruv:"game": TEXCOORD_1 atlas size in texels (default 1024; 4-texel gutter).
≥ 64 · ≤ 16384
uvScale optionalnumbergltf/glb/usd: mm of surface per uv unit — uv:"game" (default 1000, never snapped) or uv:"world" (default 10, snapped to whole tiles per revolution).

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format vdb

ArgumentTypeMeaning & bounds
handle optionalstringReuse a mesh handle from a prior cad_tessellate_body call instead of re-tessellating (stl/svg/dxf/3mf/3mf-bambu only).
healGeometry optionalbooleanAttempt to heal small topology defects (gaps, sliver faces) before tessellating.
default false
maxEdgeLength optionalnumberSplit any triangle edge longer than this many mm, repeatedly, until every edge is under it (or a generous pass cap is hit). New vertices sit at the exact chord midpoint; their normal is read from the face's own analytic surface where the edge borders exactly one such face, otherwise it is the average of the adjoining facets' normals. Face ids and watertightness are preserved. Omit for the tessellator's own chordal resolution only.
> 0
maxTriangles optionalintegerTriangle budget: the tessellator adapts its resolution (subdivision search, then chord-tolerance coarsening) to come in at or under this count, and the response's "lod" field reports what was achieved — including an explicit shortfall flag when even the coarsest achievable mesh exceeds the budget. Omit to let tolerance (or the kernel default) drive resolution instead.
> 0
minTrianglesPerFace optionalintegerForce every face with fewer triangles than this up to it, via the same conforming split as "maxEdgeLength" (and combinable with it). Useful for a large flat face a chordal tolerance leaves as 2 triangles but a field sampler needs many sample points across.
> 0
sizing optionalobjectSize field (mm): global max/min, N elements across thin gaps, and "refine here to h" regions. Replaces maxTriangles as the budget control.
sizing.angularCapDegnumberNormal-deviation cap on curved faces, degrees. 15-20; default 18. Stops hexagon fillets.
> 0 · ≤ 90
sizing.elementsAcrossGapintegerElements to fit across a thin wall or gap the mesh finds for itself. Default 3.
≥ 1
sizing.featureEdgesbooleanSet false to skip the sharp-edge source.
sizing.growthRationumberMax size ratio between neighbouring cells (gradation). 1.2-1.3; default 1.25.
≥ 1 · ≤ 2
sizing.hMaxnumberGlobal max element size in mm. No triangle edge ends up longer than this.
> 0
sizing.hMinnumberHARD floor in mm. No source can drive the size below it; this is what bounds the work.
> 0
sizing.maxDepthintegerOctree depth cap. Bounds memory and time absolutely. Default 8.
≥ 1 · ≤ 12
sizing.maxTrianglesintegerPer-body triangle budget for the refinement. hMin bounds the SIZE; this bounds the COUNT.
> 0
sizing.proximitybooleanSet false to skip the gap/thin-wall source.
sizing.regionsobject[]Refine-here regions: a box, sphere or cylinder plus the size h to use inside it.
≤ 32 items
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
voxelSize optionalnumberpicogk_stl / vdb only (CADSF-101045): the PicoGK voxel size in mm the file is prepared for. Sets the default chord tolerance (voxelSize/4) and, for vdb, the grid pitch.
> 0 · ≤ 100

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format vehicle

ArgumentTypeMeaning & bounds
tolerance optionalnumberChord tolerance in mm: the max allowed deviation between the tessellated triangles and the true surface. Smaller = finer mesh, more triangles, slower. Omit for the kernel default — except on a SWEPT or LOFTED body, where the default can exceed the host's call timeout: pass 1 mm or more (and edges:false on the mesh payload).
> 0
vehicle optionalobjectvehicle only (CADSF-100529): {class: aircraft|ship|ground|rocket|lander|object, preset, id, name, density, parts:{<body>:{role, mass, density, joint, kinematic}}}.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format x_b

ArgumentTypeMeaning & bounds
units optionalenumx_t/x_b (CADSB-818): the unit the transmit's own numbers are written in, "m" or "mm". Default "m" — Parasolid's convention [S §4.2.1], the one every vendor transmit in this repo's corpus uses, so the file opens at the right size in SolidWorks/NX. Pass "mm" only to reproduce the pre-CADSB-818 byte shape (kernel mm written unscaled). dxf (CADSF-100617, wireframe and "view":"hlr"): the unit the drawing is written in — every coordinate is CONVERTED from the kernel's millimetres and the header declares it ($INSUNITS, with $MEASUREMENT). Default "mm", byte-identical coordinates to before; the document's declared import unit is not applied by itself, pass it here to get that unit. cm/in/ft/um are dxf only; contour-dxf and flat-dxf are always millimetres, and no other format takes a unit.
one of "m", "mm", "cm", "in", "ft", "um"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Format x_t

ArgumentTypeMeaning & bounds
colors optionalobjectUS spelling of "colours" (same map)
≥ 1 keys
colours optionalobjectstep / ap242-xml / x_t (CADSF-2886): body colours, { "<body ref | op id | part name>": "#RRGGBB" | [r,g,b] }. Each named body is written with one STYLED_ITEM/COLOUR_RGB (STEP) or SDL/TYSA_COLOUR (x_t), and the colour stays on the document for later exports. Colours already on the document (an imported file's, earlier calls') are always written, with or without this. A key naming no body is refused COLOUR_NO_BODY.
≥ 1 keys
units optionalenumx_t/x_b (CADSB-818): the unit the transmit's own numbers are written in, "m" or "mm". Default "m" — Parasolid's convention [S §4.2.1], the one every vendor transmit in this repo's corpus uses, so the file opens at the right size in SolidWorks/NX. Pass "mm" only to reproduce the pre-CADSB-818 byte shape (kernel mm written unscaled). dxf (CADSF-100617, wireframe and "view":"hlr"): the unit the drawing is written in — every coordinate is CONVERTED from the kernel's millimetres and the header declares it ($INSUNITS, with $MEASUREMENT). Default "mm", byte-identical coordinates to before; the document's declared import unit is not applied by itself, pass it here to get that unit. cm/in/ft/um are dxf only; contour-dxf and flat-dxf are always millimetres, and no other format takes a unit.
one of "m", "mm", "cm", "in", "ft", "um"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bytes requiredinteger—
format requiredenum—
one of "stl", "step", "svg", "dxf", "contour-dxf", "flat-dxf", "pdf", "prc", "gltf", "glb", "usda", "usdz", "x_t", "x_b", "3mf", "3mf-bambu", "3mf-project", "3mf-beamlattice", "sat", "ap242-xml", "ifc", "picogk_stl", "vdb", "ply", "vehicle", "fcstd", "qif"
path requiredstring—
area optionalnumber—
assembly optionalobject—
attachments optionalobject[]—
axis optionalstring—
bambuAssembly optionalobject—
beamLattice optionalobject—
beamLattice.ballsinteger—
beamLattice.beamSetsinteger—
beamLattice.beamsinteger—
beamLattice.capenum—
one of "sphere", "hemisphere", "butt"
beamLattice.clippingBodystring—
beamLattice.clippingModeenum—
one of "none", "inside", "outside"
beamLattice.droppedobject—
beamLattice.minLengthnumber—
beamLattice.radiusnumber—
beamLattice.strutSourcestring—
beamLattice.strutsinteger—
beamLattice.unitstring—
bed optionalobject[]—
bendLines optionalinteger—
bendSchedule optionalobject[]—
binPath optionalstring—
blank optionalobject—
blank.areanumber—
blank.boundingAreanumber—
blank.lengthnumber—
blank.notchAreanumber—
blank.thicknessnumber—
blank.widthnumber—
buildObjects optionalinteger—
census optionalobject—
compression optionalobject—
compression.extensionsstring[]—
compression.instanceboolean—
compression.instancedNodesinteger—
compression.instancesinteger—
compression.meshesinteger—
compression.nodesAfterinteger—
compression.nodesBeforeinteger—
compression.quantizeboolean—
compression.quantizedMeshesinteger—
confidence optionalenum—
one of "confident", "candidate"
contours optionalinteger—
developedLength optionalnumber—
developedLengths optionalobject—
developedLengths.xnumber—
developedLengths.ynumber—
edgeCount optionalinteger—
entities optionalobject—
entities.arcinteger—
entities.circleinteger—
entities.lineinteger—
entities.polylineinteger—
entities.textinteger—
entities.totalinteger—
entries optionalstring[]—
envelope optionalobject—
envelope.bodiesinteger—
envelope.droppedinteger—
envelope.droppedNamesstring[]—
envelope.keptinteger—
envelope.resolutioninteger—
envelope.viewsinteger—
exportProfile optionalobject—
extraction optionalobject | string—
faceId optionalstring—
fcstd optionalobject—
fieldBody optionalstring—
filaments optionalobject[]—
geometricLength optionalnumber—
hiddenEdgeCount optionalinteger—
hint optionalstring—
hybrid optionalobject—
ifc optionalobject—
instances optionalinteger—
layers optionalobject—
layers.bendDownstring—
layers.bendUpstring—
layers.outlinestring—
layers.tangentstring—
layers.textstring—
lod optionalobject—
lod.levelCountinteger—
lod.levelsobject[]—
lod.modeenum—
one of "single", "files"
lod.monotonicboolean—
lod.extensionstring—
lod.screenCoveragenumber[]—
lod.totalBytesinteger—
markups optionalinteger—
materials optionalobject—
notches optionalobject[]—
objects optionalinteger—
openWith optionalstring—
partPaths optionalstring[]—
parts optionalinteger—
pdfa optionalobject—
pdfa.conformancestring—
pdfa.labelstring—
pdfa.levelenum—
one of "3b", "4e"
pdfa.partinteger—
pdfa.permits3Dboolean—
picogk optionalobject—
plates optionalinteger—
pmiFrom optionalstring—
primeTower optionalobject—
products optionalinteger—
profile optionalstring—
qif optionalobject—
resolution optionalenum—
one of "full", "print"
rotationBaked optionalboolean—
schema optionalobject—
schema.droppedany[]—
schema.expandedany[]—
schema.fileSchemastring | null—
schema.idstring | null—
schema.warningsstring[]—
semanticPmi optionalinteger—
slots optionalinteger[]—
source optionalenum—
one of "mesh", "implicit", "field"
stepFrom optionalstring—
streamed optionalboolean—
supports optionalobject—
tessellated optionalobject—
triangles optionalinteger—
uncompressedBytes optionalinteger—
units optionalobject—
units.appliedenum—
one of "m", "mm", "cm", "in", "ft", "um"
units.scalenumber—
usd optionalobject—
usd.meshesinteger—
usd.metersPerUnitnumber—
usd.upAxisenum—
one of "Z", "Y"
usd.verifiedboolean—
usd.alignmentinteger—
usd.entriesinteger—
usd.layerNamestring—
usd.materialsinteger—
usd.pointUnitsenum—
one of "mm", "m"
usd.pointsinteger—
uv optionalobject—
uv.atlasPxinteger—
uv.boxProjectedTrianglesinteger—
uv.chartsinteger—
uv.faceSplitVerticesinteger—
uv.gutterPxnumber—
uv.modeenum—
one of "game", "normalized", "world"
uv.seamVerticesinteger—
uv.tangentsboolean—
uv.tessellatedVerticesinteger—
uv.texcoord0string—
uv.texcoord1string—
uv.uvScaleMmnumber—
uv.verticesinteger—
validation optionalobject—
vehicle optionalobject—
vertices optionalinteger—
view optionalenum—
one of "wireframe", "hlr"
views optionalinteger—
visibleEdgeCount optionalinteger—
warnings optionalstring[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_drawing write Make the drawings

Make the drawings: one call turns a part or assembly (a session body, or a customer STEP via "file") into a shop-ready drawing set — planned views, sheet size and scale, a shop profile's title block and general tolerance block, the default GD&T scheme and its table, hole notes, an assembly parts list — written as PD…

Full description

F… Call cad_help({tool:"cad_drawing"}) for the rest.

ArgumentTypeMeaning & bounds
allowLintErrors optionalbooleanWrite a sheet that fails its tolerance lint…
default false
assembly optionalbooleanDraw the bodies as one assembly…
bom optionalbooleanAssembly parts list.
default true
dimensions optionalboolean—
default true
docMeta optionalobjectTitle block: title, partNumber, revision, mater…
document optionalstringDocument handle (default: the active one).
fasteners optionalobject[]Hardware per hole class…
file optionalstringA STEP file to draw instead of session bodies…
formats optionalenum[]Default all three; the PDF is one page per sheet.
≥ 1 items
gdt optionalenumauto: the default datum/position/profile scheme…
one of "auto", "off" · default "auto"
gdtStyle optionalenumDefault per process: lean for castings and cut…
one of "full", "lean"
holes optionalbooleanHole notes (with gdt auto they are always on).
default true
maxDimensions optionalinteger—
≥ 1 · ≤ 200 · default 60
name optionalstringFile stem; default partNumber.
of optionalstring | arrayBody handle(s) to draw; default every live body…
outDir optionalstringRelative paths resolve under the configured out…
process optionalstringSizes the profile zone: cnc, laser, waterjet, c…
default "cnc"
projection optionalenum—
one of "third", "first" · default "third"
scale optionalstring"auto" or "n:m".
default "auto"
shopProfile optionalstringasme-mm | asme-in | iso-2768-m | a saved profil…
size optionalstringForce a sheet size (A4..A0, ANSI_A..ANSI_E); de…
standard optionalenumSheet series (ANSI A-E / ISO A4-A0) and title-b…
one of "asme", "iso" · default "asme"
views optionalstring[]Keep only these planned views…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Quoting, evaluation & sharing · 12

What happens after the geometry is right: priced quote payloads and submissions, evaluation packets and reports, shareable results, and showcase-contest entries.

cad_quote_payload read Quote feature vector (process, material, thickness, finish)

The complete instant-quote FEATURE VECTOR for a solid already built in the active session, in one call.

Full description

Call cad_help({tool:"cad_quote_payload"}) for the rest.

ArgumentTypeMeaning & bounds
process requiredenumThe manufacturing route being quoted.
one of "laser", "waterjet", "router", "bend", "mill", "lpbf"
solid requiredstringid or "<id>#<n>"
dfm optionalbooleanRun the per-process DFM rule pack.
dfmParams optionalobjectParameters handed to the DFM rule pack, e.g. {"…
finish optionalstring[]Secondary services requested, as flags on the p…
material optionalstringStock material.
partId optionalstringCaller-side part identifier echoed into the pay…
partName optionalstringHuman-readable part name echoed into the payload.
quantity optionalintegerOrder quantity, echoed into the payload and int…
≥ 1
revision optionalstringRevision string echoed into the payload.
thickness optionalnumberStock thickness in mm.
> 0
thicknessIn optionalnumberStock thickness in inches (25.4 mm/in).
> 0
thinWallThreshold optionalnumbermm — wall samples under this are counted in g…
> 0
weld optionalobjectA cad_weld_schedule result to fold in.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_weld_schedule read Weld schedule and arc minutes for a STEP assembly

WELD LABOUR measured off the geometry.

Full description

Every contact in a STEP assembly is classified into a joint — fillet on a tee, corner or lap, groove on a butt, or a circumferential fillet at a coaxial engagement — with path length, AWS D1.1 minimum leg for the thinner member, weld position and a torch-access check. Call cad_help({tool:"cad_weld_schedule"}) for the rest.

ArgumentTypeMeaning & bounds
file requiredstringSTEP assembly or multi-body part file.
length ≥ 1
accessClearanceMm optionalnumberTorch corridor depth, mm. Default 25.
> 0
bothSidesTee optionalbooleanWeld tees both sides. Default true.
depositionRateKgH optionalnumberDeposition rate override, kg/arc-hour.
> 0
fitUpMinutesPerJoint optionalnumberFit-up and tack minutes per joint. Default 4.
≥ 0
jointsOnly optionalbooleanReturn totals and joints, drop the option echo.
legMm optionalnumberFillet leg override, mm.
> 0
maxClearance optionalnumberContact reporting window, mm. Default 1.
> 0
maxJoints optionalintegerCap on joints returned. Default 50.
≥ 1 · ≤ 200
minArea optionalnumberSmallest overlap worth welding, mm^2.
≥ 0
operatorFactor optionalnumberArc-on share of clock time. Default 0.35.
> 0 · ≤ 1
process optionalenumWelding process. Default gmaw.
one of "gmaw", "fcaw", "smaw", "gtaw"
thickness optionalobjectMember thickness overrides, mm, by body name.
tol optionalnumberCoincidence tolerance, mm. Default 0.001.
> 0
units optionalstringLength-unit override: mm, cm, m, in, ft.
up optionalnumber[]Build orientation up vector. Default 0,0,1.
exactly 3 items

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_quote_submit write Fabricator quote (DFM gate → package → submit)

Package a body this session built as an instant-quote submission for one fabrication route.

Full description

THE FIRST CALL SENDS NOTHING: it returns the verdict plus a "confirm" digest; call again with confirm:"<that digest>" to submit. Call cad_help({tool:"cad_quote_submit"}) for the rest.

ArgumentTypeMeaning & bounds
route requiredenumThe fabrication route to quote on.
one of "scs_laser", "scs_waterjet", "scs_router", "scs_bend", "scs_mill", "osh_laser", "osh_bend", "osh_tube", "fictiv_mill", "fictiv_im", "fictiv_print"
allowUnapproved optionalbooleanSubmit despite a DFM-gate block.
confirm optionalstringPreview digest; without it nothing is sent.
cutterDiameter optionalnumberMilling: end-mill Ø in mm, default 6.
encoding optionalenumWire shape, default multipart.
one of "multipart", "json"
endpoint optionalstringEndpoint override for this call.
file optionalstringA file you already exported.
material optionalstringMaterial, as the fabricator names it.
notes optionalstringFree-text note carried with the submission.
partName optionalstringName for the part on the quote.
quantity optionalintegerHow many parts. Default 1.
≥ 1
services optionalenum[]Post-process flags, never geometry.
solid optionalstringA body built in this session.
thickness optionalnumberMaterial thickness in MILLIMETRES.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_evaluate write Run the evaluation battery on customer geometry

Import one or more STEP files and run a battery of kernel operations against every body they contain.

Full description

Call cad_help({tool:"cad_evaluate"}) for the rest.

ArgumentTypeMeaning & bounds
files requiredstring[]STEP file paths to evaluate — absolute, or re…
≥ 1 items · ≤ 200 items
consent optionalobjectConsent to receive an IP-free evaluation report…
consent.contactobject—
consent.sendReporttrueMust be exactly true.
criteria optionalobject[]What would make this kernel adequate FOR YOU…
≥ 1 items · ≤ 50 items
maxBodiesPerFile optionalintegerPer-file cap on how many bodies get the full ba…
≥ 1
maxProbeEdges optionalintegerHow many convex edges the fillet probe selects…
≥ 1
outputDir optionalstringDirectory the evaluation-run JSON is written to.
persist optionalbooleanWrite the run document to disk.
probes optionalbooleanRun the MUTATING half of the battery…
runId optionalstringOverride the generated run id…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_eval_packet write Extract an IP-safe failure packet from an evaluation run

Turn the failures in a cad_evaluate run into a shareable packet that does NOT contain the customer's model.

Full description

Call cad_help({tool:"cad_eval_packet"}) for the rest.

ArgumentTypeMeaning & bounds
archive optionalbooleanAlso write the single-file .tar.gz archive…
disclosure optionalobject | stringHow much is disclosed per issue (default "L1").
issueIds optionalstring[]The issues to extract, by issues[].id in the ru…
≤ 200 items
keepBodyRegions optionalbooleanKeep bodies[].boundingRegion in the redacted ru…
keepOperationDetail optionalbooleanKeep operations[].detail in the redacted run…
maxIssueVolumeFraction optionalnumberPer-issue cap on disclosed volume, as a fractio…
> 0 · ≤ 1
maxIssues optionalintegerHow many issues to extract when issueIds is omi…
≥ 1 · ≤ 200
maxReproducers optionalintegerHow many distinct synthetic reproducers this pa…
≥ 0 · ≤ 20
maxTotalVolumeFraction optionalnumberCap on the WHOLE packet's disclosed volume, sam…
> 0 · ≤ 1
minBoxMm optionalnumberMinimum crop-box side, in mm (default 2).
> 0
minPadMm optionalnumberFloor on the padding, in mm (default 0.5).
≥ 0
onVolumeCapExceeded optionalenumWhat to do when a cap is exceeded…
one of "refuse", "omit"
outputDir optionalstringDirectory the packet is written to.
overwrite optionalbooleanReplace an existing packet for this run…
paddingFraction optionalnumberCrop padding as a fraction of the failure regio…
≥ 0 · ≤ 2
runDir optionalstringDirectory runId is resolved against.
runFile optionalstringPath to the evaluation-run JSON cad_evaluate wr…
length ≥ 1
runId optionalstringThe run id, resolved to <runDir>/<runId>.json…
length ≥ 1

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
archive optionalstring | null—
archiveBytes optionalinteger | null—
counts optionalobject—
manifest optionalobjectThe redaction manifest…
packetDir optionalstring—
summary optionalstringThe human-readable preview — identical to the…

cad_eval_report write Evaluation scorecard report

Turn a persisted cad_evaluate run into one self-contained, printable HTML scorecard for the customer whose data was evaluated: headline verdict, pass/fail by operation class, failure modes rolled up by cause, findings localised by bounding box, and marginal timings (the STEP-import replay carried by isolated probes …

Full description

is subtracted). Call cad_help({tool:"cad_eval_report"}) for the rest.

ArgumentTypeMeaning & bounds
run requiredstringThe evaluation run to report on: either the run…
length ≥ 1
datasetLabels optionalstring[]Names for the evaluated files, by position: dat…
≤ 200 items
gapCloseNarrative optionalstringYour own account, as the agent that ran this ev…
length ≤ 8000
incumbent optionalobjectYour results for the same battery on the same d…
incumbentFile optionalstringPath to a JSON file holding the same document a…
label optionalstringYour own title for this evaluation, printed as…
length ≤ 200
persist optionalbooleanWrite the report next to the run as "<runId>.re…
preparedFor optionalstringWho the report is for — a company, a team or…
length ≤ 200
runsDir optionalstringDirectory to look for a bare runId in.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_eval_share write Review, consent to and share an evaluation failure packet

Share the IP-safe failure packet for a cad_evaluate run with NativeCAD, and get a link to book an evaluation call — in two explicit steps.

Full description

Call cad_help({tool:"cad_eval_share"}) for the rest.

ArgumentTypeMeaning & bounds
runId requiredstringThe evaluation run to share the failure packet…
length 1–200
bookingUrl optionalstringBase URL of the booking page for the evaluation…
bundleDir optionalstringWhere the ready-to-send bundle is written.
confirm optionalbooleanActually share.
consentToken optionalstringThe token returned by the preview call.
intakeUrl optionalstringSubmit to this endpoint instead of the default…
note optionalstringYour own covering note to the vendor — what y…
length ≤ 4000
offline optionalbooleanNever use the network: write the ready-to-send…
requesterEmail optionalstringYour reply address, so the vendor can answer.
length ≤ 320
requesterName optionalstringWho is sending it — a person or a team.
length ≤ 200
resend optionalbooleanAllow a consent token that has already been use…
runsDir optionalstringDirectory holding the run, its packet, its repo…
updateReport optionalbooleanFill the "Share the findings" section of this r…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
booking optionalobject—
configuration optionalobject—
consent optionalobject—
delivery optionalobject—
disclosure optionalobject—
evaluation optionalobject | nullThe terms the report that comes back is owed ag…
files optionalany[]Every file inside the packet, with its size and…
history optionalobject—
instructions optionalstring[]—
nextCall optionalobject—
notice optionalstring—
packet optionalobject—
preview optionalstring | nullThe packet's own README.txt, verbatim.
record optionalobject—
report optionalobject—
runId optionalstring—
runSummary optionalobject—
shared optionalboolean—
stage optionalstring"preview" (nothing sent) or "submitted".
verification optionalobject—
warnings optionalstring[]—

cad_gap_registry read Capability-gap register and issue classifier

Register of known capability gaps — things this kernel cannot do, each with operation class, failure mode, evidence, status, ticket and day estimate.

Full description

action:"list" returns it (filter by status/opClass/failureMode/gapId) with an open-days roll-up. Call cad_help({tool:"cad_gap_registry"}) for the rest.

ArgumentTypeMeaning & bounds
action optionalenumlist — read the register (optionally filtered).
one of "list", "match" · default "list"
failureMode optionalenumlist: only gaps that fail this way.
one of "refused", "not-watertight", "wrong-volume", "divergent", "unchecked-failure", "timeout", "over-budget"
gapId optionalstringlist: one gap by id.
issues optionalobject[]match: the issues to classify…
≥ 1 items · ≤ 500 items
opClass optionalenumlist: only gaps filed under this operation class.
one of "import", "stitch", "validation", "tessellation", "massProperties", "boolean", "blend", "shell", "hole", "pattern", "loft", "rib", "draft", "topology", "export"
status optionalenumlist: only gaps in this state.
one of "open", "in-progress", "closed"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_cert write Certification evidence plan and packet

Certification-evidence engine in one tool.

Full description

action:"plan" turns a context of use + model influence + decision consequence into a V&V 40-style risk level and the evidence it needs: requiredEvidence (credibility goals), verificationCases (ids from the verification suite), analyses, and gaps (e.g. requirements with no linked analysis). Call cad_help({tool:"cad_cert"}) for the rest.

ArgumentTypeMeaning & bounds
action optionalenumplan - risk and evidence needed.
one of "plan", "run", "verify", "packet"
bodyId optionalstringplan: the body the plan is for…
consequence optionalenumplan: harm if the decision is wrong.
one of "low", "medium", "high"
contextOfUse optionalstringplan: the decision the analysis supports, in a…
length ≥ 1
evidenceDir optionalstringpacket: directory holding evidence under manife…
influence optionalenumplan: how much the model result drives the deci…
one of "low", "medium", "high"
outDir optionalstringpacket: directory the packet is written to.
physics optionalstringplan: restrict verification cases to one physic…
requirements optionalobject[]plan: [{id, text?, source?, acceptance:{quantit…
≤ 200 items
sign optionalbooleanpacket: sign with the ed25519 key in CADSOLVER_…
default true

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_spec_configure read Spec-driven part configurator (options → part number → build plan)

Configure a part the way a components catalogue does: a family plus options (or one part number) in; resolved parameters, a canonical part number, a kernel build plan and the quote route/material out.

Full description

These are NativeCAD's own families and codes, not any manufacturer's catalogue. Call cad_help({tool:"cad_spec_configure"}) for the rest.

ArgumentTypeMeaning & bounds
code optionalstringA part number to decode.
family optionalenumThe part family to configure.
one of "plate", "spacer", "shaft"
options optionalobjectOption values by key.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_configurator write Modular-product configurator (validate / enumerate / nearest fix / build)

Check a modular product configuration against its product family's compatibility rules, and build it.

Full description

Call cad_help({tool:"cad_configurator"}) for the rest.

ArgumentTypeMeaning & bounds
action requiredenumWhat to do with the configuration.
one of "validate", "enumerate", "nearestFix", "build"
config optionalobjectParameter values by name.
document optionalstringbuild: session document to build into.
family optionalobjectThe product family, inline.
familyPath optionalstringPath to a product-family JSON file.
fix optionalobjectenumerate: values held fixed.
limit optionalintegerenumerate: most variants returned.
≥ 1 · ≤ 500
lock optionalstring[]nearestFix: parameters it may not change.
modules optionalstring[]Optional modules selected.
required optionalstring[]Interfaces that must mate.
stepPath optionalstringbuild: also write the assembly as STEP here…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_contest write Enter a NativeCAD showcase contest

Enter a NativeCAD showcase contest with the default package, no licence key.

Full description

Get a ticket on the contest page ("contests" lists them). Call cad_help({tool:"cad_contest"}) for the rest.

ArgumentTypeMeaning & bounds
action optionalenumcontests: list open contests; start: check a ti…
one of "contests", "start", "status", "submit", "end" · default "status"
agree optionalboolean"submit": must be true — the entrant's consen…
animations optionalobject[]"submit": animation clips, as cad_export_body t…
≥ 1 items
builder optionalstring"submit": public display name…
length ≤ 60
contest optionalstringcontests: one slug to describe in full.
pattern ^[a-z0-9][a-z0-9-]{2,39}$
description optionalstring"submit": what it is (≤1200 chars).
length ≤ 1200
document optionalstring"submit": the document to read, as cad_export_b…
howItMoves optionalstring"submit": what the animation does (≤400 chars).
length ≤ 400
material optionalobject | string"submit": stock name or PBR material for bare b…
of optionalstring"submit": the body to enter; omit for the whole…
replaces optionalstring"submit": one of your own entry ids to update i…
pattern ^[a-z2-9]{14}$
tags optionalstring[]"submit": up to 5 tags, each ≤24 chars of [a-…
≤ 5 items
ticket optionalstring"start": the NCC1.… ticket e-mailed from the…
length ≤ 200
title optionalstring"submit": the entry's title (3-80 chars).
length 3–80

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Printing (Bambu Lab X1 Carbon) · 10

The additive path: slice a part with the user's own Bambu Studio, send the .gcode.3mf to an X1 Carbon over the LAN (or hand a human a Bambu Connect link), and watch the job. docs/PRINT_PIPELINE.md carries the whole pipeline, including what LAN-only + Developer Mode disconnects.

cad_print_prep write CAD to X1C, in one call

ONE CALL from a body you built to a file a Bambu Lab X1 Carbon prints: the fdm_x1c DFM pack, the build-orientation search, a Bambu 3MF carrying that orientation and the filament slots, a slice, and - with "send" - the print.

Full description

Call cad_help({tool:"cad_print_prep"}) for the rest.

ArgumentTypeMeaning & bounds
allowCosmeticDown optionalbooleanAllow lettering/colour face…
allowNozzleChange optionalbooleanDual-nozzle Bambu: allow on…
amsUnits optionalobject[]Bambu: the multi-material u…
≤ 16 items
bodies optionalstring[]Several handles on one plate.
≥ 1 items · ≤ 16 items
body optionalstringBody handle to print…
length ≥ 1
colours optionalstring[]One "#RRGGBB" per body.
≥ 1 items · ≤ 16 items
counts optionalinteger[]Copies per body; nested by…
≥ 1 items · ≤ 16 items
document optionalstringDocument to read the bodies…
fallback optionalenumNo slicer: "estimate"…
one of "estimate", "refuse"
force optionalbooleanCarry on past a failing DFM…
importCheck optionalbooleanfalse skips the Bambu Studi…
material optionalenumFilament for every body.
one of "PLA", "PETG", "ABS", "TPU"
materials optionalenum[]One per body, in the order…
≥ 1 items · ≤ 16 items
maxSwitches optionalintegerFilament-switch budget…
≥ 0
nest optionalbooleanSeveral bodies or counts go…
nozzle optionalenumFitted nozzle, mm.
one of 0.2, 0.4, 0.6, 0.8
nozzleBySlot optionalobjectDual-nozzle Bambu…
orient optionalenum"auto" (default) searches a…
one of "auto", "keep"
out optionalstringWhere to write the .3mf.
params optionalobjectfdm_x1c pack params for the…
printer optionalstringThe machine: any data/print…
length ≥ 1
process optionalstringStock process preset…
send optionalobjectSend the sliced file over t…
send.accessCodestringLAN access code, from the p…
send.ipstringThe printer's LAN IP.
send.serialstringSerial number.
supports optionalenum"auto" (default) generates…
one of "auto", "none", "painted-later"
timeoutSec optionalintegerWall-clock budget for the s…
≥ 10 · ≤ 7200

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
colourChanges requiredobject—
colourChanges.countinteger—
colourChanges.flushGnumber—
colourChanges.basisstring—
colourChanges.budgetinteger—
colourChanges.layerHeightnumber—
colourChanges.mixedobject[]—
colourChanges.predictedinteger—
colourChanges.purgeMm3number—
colourChanges.remedystring[]—
colourChanges.slotsinteger—
dfm requiredobject—
dfm.passboolean—
dfm.verdictsobject[]—
dfm.blockedBystring[]—
dfm.bodiesobject[]—
file requiredstring | null—
ms requiredinteger—
ok requiredboolean—
orientation requiredobject—
orientation.chosenstring | null—
orientation.supportAreaMm2number | null—
orientation.appliedboolean—
orientation.bedContactMm2number | null—
orientation.buildDirectionarray | null—
exactly 3 items
orientation.candidatesinteger—
orientation.fitsboolean | null—
orientation.fitsExclusionboolean | null—
orientation.footprintMm2number | null—
orientation.heightMmnumber | null—
orientation.sourcestring—
orientation.supportNeedMm2number | null—
orientation.supportVolumeEstMm3number | null—
orientation.supportsobject | nullCADSF-2164: "supports neede…
orientation.transformarray | null—
exactly 16 items
printer requiredstring—
stage requiredenum—
one of "dfm", "orientation", "export", "import_check", "slice", "print"
bodies optionalstring[]—
bytes optionalinteger—
estimate optionalobject—
estimate.bandobject—
family optionalobjectBambu beyond the X1C…
filaments optionalobject[]—
forced optionalboolean—
importCheck optionalobjectCADSF-2283: does the file l…
lettering optionalobject[]CADSF-2284: per body, how m…
nest optionalobject—
nozzle optionalnumber—
preview optionalobject—
preview.autoOrientFlipsboolean | null—
preview.bytesinteger—
preview.captionstring—
preview.handoffstring[]—
preview.heightinteger—
preview.letteringobject—
preview.orientationstring | null—
preview.pathstring—
preview.sizeMmnumber[]—
preview.tintedSharenumber—
preview.verdictstring—
preview.widthinteger—
print optionalobject—
print.connectUrlstring | null—
print.reasonstring | null—
print.startedboolean | null—
print.taskIdstring | null—
process optionalstring | null—
slice optionalobject—
slice.methodenum—
one of "slice", "estimate"
slice.filamentsobject[]—
slice.filestring | null—
slice.gcodeFilestring | null—
slice.gcodeMd5string | null—
slice.platesinteger—
slice.predictionSnumber | null—
slice.slicerstring | null—
slice.supportUsedboolean | null—
slice.weightGnumber | null—
supports optionalstring—
warnings optionalstring[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_am_prep write Prepare a metal LPBF build

Body to metal LPBF build (printer: any registry LPBF machine; default DMP Flex 350; cold spray / XJet / MoldJet / metal DLP printers get their DFM pack + STL/STEP/job.json instead) in one call: LPBF DFM (blocking finding refuses unless force), orientation, print body with machining allowance, supports, plate nest, t…

Full description

ime/cost quote, and fil… Call cad_help({tool:"cad_am_prep"}) for the rest.

ArgumentTypeMeaning & bounds
bodies requiredobject[]Session bodies to build, each with a copy count.
≥ 1 items · ≤ 16 items
document optionalstringDocument the handles belong to.
force optionalbooleanCarry on past a blocking DFM finding; it is rec…
gasFlowAxis optionalnumber[]Gas-flow direction in the plate plane…
≥ 2 items · ≤ 3 items
hip optionalbooleanInclude the optional HIP step in the post-proce…
layerThicknessMm optionalnumberCLI slice layer. Default 0.03.
> 0 · ≤ 0.2
machining optionalobjectPrint-body allowance.
machining.allowanceMmnumberStock per face, mm. Default 0.5.
> 0 · ≤ 10
machining.modeenumauto: the default faces; none: print body = part.
one of "auto", "faces", "none"
material optionalenumAlloy. Default Ti64.
one of "Ti64", "IN718", "316L"
orient optionalenum | objectauto (best of the LPBF orientation search, defa…
outDir optionalstringOutput folder (relative to the output dir).
plateAttachment optionalobjectdirect (fused + cut-off stock) or base…
plateAttachment.cutOffenum—
one of "wire-edm", "bandsaw"
plateAttachment.cutOffAllowanceMmnumber—
≥ 0 · ≤ 10
plateAttachment.modeenum—
one of "direct", "base"
postProcess optionalbooleanCold spray / metal jetting / MoldJet / metal DL…
printer optionalstringRegistry LPBF machine id/alias…
quote optionalobjectLPBF quote (ops/lpbfBuildCost).
quote.marginPercentnumberOverrides the profile margin…
≥ 0 · ≤ 500
quote.profilestringShop profile id or path.
quote.quantitiesinteger | "plate"[]Quantity breaks. Default 1, 5, 20, full plate.
≤ 12 items
recoaterAxis optionalnumber[]Recoater travel direction in the plate plane…
≥ 2 items · ≤ 3 items
refuseOn optionalenumDFM severity that refuses. Default error.
one of "error", "warning"
shrink optionalnumber[]Sintered printers…
exactly 3 items
spacingMm optionalnumberNest spacing between parts.
≥ 0
stepSchema optionalenumSTEP print-body schema. Default ap214.
one of "ap214", "ap242"
supports optionalenumauto: LPBF block supports…
one of "auto", "none"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_cast_mould write Design a printed casting mould

Part to a printable two-half ceramic casting mould (Foundry Lab style) in one call: pull + parting, reservoir-on-top orientation, conformal shell (shrink required), split, flange/bolts/keys/vents, cores, gating + charge, solidification check, DFM, STL/3MF/STEP per half, moulds per build, report.

Full description

stopAfter/resume for review. Fields: cad_help.

ArgumentTypeMeaning & bounds
alloy optionalstringAl (default), Zn, Mg or Cu alloy name…
bodyId optionalstringSession body to mould (or give file).
ceramicDensityGcc optionalnumberMould ceramic density for half masses.
> 0 · ≤ 10
compensation optionalobjectScan-feedback compensation: {shrink} replaces t…
copies optionalintegerMoulds wanted; the report gives builds needed.
≥ 1 · ≤ 10000
document optionalstringDocument the handle belongs to.
draftAllowance optionalenum | numberPattern draft allowance on 0 deg moulded walls…
file optionalstringSTEP/STL file to mould instead of a session body.
medallion optionalobjectCharge unit: {massG} or {diameterMm, thicknessMm}.
medallion.diameterMmnumber—
> 0
medallion.massGnumber—
> 0
medallion.thicknessMmnumber—
> 0
name optionalstringPart name in the report and file names.
outDir optionalstringOutput folder (relative to the output dir).
resume optionalobjectThe plan a stopAfter call returned…
shrink optionalobjectREQUIRED linear shrink allowance: {percent}…
shrink.conventionenum—
one of "multiply", "divide"
shrink.factornumber | number[]—
shrink.percentnumber | number[]—
steps optionalobjectPer-step overrides {<step>: {...params} | {skip…
stopAfter optionalenumStop after this step…
one of "import", "moldability", "orientation", "shell", "split", "features", "cores", "gating", "solidification", "dfm", "export", "nest"
thicknessMm optionalnumberShell wall. Default 6 mm (8 mm Cu).
> 0 · ≤ 50
voxelMm optionalnumberVoxel size when the shell takes the voxel route.
> 0 · ≤ 20

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_nest write Nest parts for printing

Nest bodies (with counts) on a plate (bambu_x1c; LPBF dmp_flex_350) or in a powder volume (sls_formlabs_fuse1, sls_eos_p396, mjf_hp_5200, {x,y,z}), prove clearance on the real triangles, write one 3MF (Bambu project, a plate per nest plate; or core 3MF).

Full description

Returns placements, unplaced + reasons, partsPerPlate, utilisation or packingDensity, buildHeight, verify.

ArgumentTypeMeaning & bounds
bodies requiredobject[]—
≥ 1 items · ≤ 32 items
document optionalstring—
export optionalobject—
export.bambuobject—
export.formatenum—
one of "3mf-bambu", "3mf", "none"
export.pathstring—
mode optionalenum—
one of "auto", "3d", "plate"
orientations optionalenum—
one of "auto", "fixed", "z90", "axis24"
printer optionalstring—
searchMs optionalinteger—
≥ 0 · ≤ 120000
seed optionalinteger—
spacingMm optionalnumber—
≥ 0
target optionalstring | object—
timeBudgetMs optionalinteger—
≥ 100
wallMarginMm optionalnumber—
≥ 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_slice write Slice for a Bambu Lab X1 Carbon

Slice a body (or a file you already exported) for a Bambu Lab X1 Carbon and return the .gcode.3mf the printer consumes, plus what the slicer measured: print time, filament grams per slot, whether support was used.

Full description

Call cad_help({tool:"cad_slice"}) for the rest.

ArgumentTypeMeaning & bounds
body optionalstringA body handle built in this session…
document optionalstringWhich document to read the body from.
fallback optionalenumWhat to do when no slicer is installed: "estima…
one of "estimate", "refuse"
filaments optionalobject | string[]One entry per filament slot, in slot order…
≤ 16 items
file optionalstringA file already on disk to slice: .3mf…
nozzle optionalenumNozzle diameter in mm.
one of 0.2, 0.4, 0.6, 0.8
orient optionalenum"keep" (the default) slices the part as it is…
one of "auto", "keep"
out optionalstringWhere to write the .gcode.3mf.
overrides optionalobjectRaw slicer process keys, e.g. {"sparse_infill_d…
printer optionalstringThe machine: "x1c" (default), or any Bambu Lab…
process optionalstringStock process preset name, e.g. "0.20mm Standar…
supports optionalbooleanTurn support generation on.
timeoutSec optionalintegerWall-clock budget for the slice. Default 900 s.
≥ 10 · ≤ 7200

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
method requiredenum"slice": measured by the slicer.
one of "slice", "estimate"
bytes optionalinteger—
estimate optionalobjectestimate only: ops/printEstimate.js's report.
file optionalstring | nullThe .gcode.3mf that was written.
input optionalobject—
input.bodystring | null—
input.filestringThe file handed to the slicer…
input.fromenum—
one of "body", "file"
ms optionalintegerWall time this call spent.
plates optionalobject[]slice only: one entry per plate, from Metadata/…
profile optionalobjectWhat the resulting package says it was built for.
profile.filamentsstring | null[]—
profile.nozzlestring | null—
profile.printerstring | null—
profile.printerVariantstring | null—
profile.processstring | null—
refusal optionalobjectestimate only: the coded refusal that stopped a…
refusal.advicestringHow to install a slicer on this OS.
refusal.codeenum—
one of "slicer_missing"
refusal.messagestring—
slicer optionalobjectslice only: which binary ran.
slicer.binstring—
slicer.flavourenum—
one of "bambu", "orca"
slicer.sourcestringHow it was found…
slicer.versionstring | null—
warnings optionalstring[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_print write Send a sliced plate to a Bambu Lab X1 Carbon

Send the .gcode.3mf cad_slice produced to a Bambu Lab X1 Carbon on your LAN and start it: FTPS upload to the SD card, then an MQTT project_file with the AMS trays mapped to the package's filament slots.

Full description

Call cad_help({tool:"cad_print"}) for the rest.

ArgumentTypeMeaning & bounds
accessCode optionalstringLAN Access Code (8 chars).
amsMapping optionalinteger[]Tray = ams_id * 4 + tray_id.
≤ 16 items
bedLevelling optionalbooleanLevel the bed. Default true.
bedType optionalstringPlate type.
ded optionalobject—
ded.bodystring—
ded.feednumber—
> 0
ded.robotstring—
ded.beadobject—
ded.cellobject—
ded.languageenum—
one of "rapid", "krl", "fanuc_tp", "inform"
ded.layersenum—
one of "planar", "auto", "conformal"
ded.outstring—
ded.planobject—
ded.postobject—
ded.surfaceobject—
file optionalstringThe .gcode.3mf from cad_slice.
flowCali optionalbooleanFlow calibrate. Default true.
ip optionalstringThe printer's IP on your LAN.
layerInspect optionalbooleanLayer-1 check. Default true.
mode optionalenumHow to send, or job control.
one of "lan", "connect", "pause", "resume", "stop", "ded"
name optionalstringSD-card file name.
plate optionalintegerPlate to print. Default 1.
≥ 1 · ≤ 64
printer optionalstringSaved name or id. Default "x1c".
serial optionalstringThe printer serial.
timelapse optionalbooleanDefault FALSE: timelapse.
timeoutSec optionalintegerConfirm wait, s. Default 30.
≥ 5 · ≤ 900
transport optionalstringForce a registry transport.
useAms optionalbooleanUse the AMS (default true).
vibrationCali optionalbooleanVibration cal. Default true.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
mode requiredenumWhich answer this is.
one of "lan", "connect", "pause", "resume", "stop", "ded"
amsMapping optionalarray | nullWhat was sent as ams_mapping.
amsRows optionalarray | nullThe same mapping, labelled.
bytes optionalinteger | null—
ded optionalobject | nullmode ded: language, stats, toolpath, reach, pre…
file optionalstring | nullThe .gcode.3mf on this machine.
instructions optionalstring | nullWhat the human must do (mode "connect" only).
md5 optionalstring | nullThe md5 the printer re-checks the transfer on.
ms optionalinteger—
name optionalstring | nullWhat the file was stored as on the SD card.
plate optionalinteger | null—
printer optionalobject | nullWhich machine answered.
remote optionalstring | nullIts path on the card.
request optionalobject | nullThe exact project_file request published.
started optionalboolean | nullTrue only if the printer said so itself.
status optionalobject | nullWhat the printer last said about itself.
steps optionalarray | nullWhat happened, in order.
url optionalstring | nullThe bambu-connect:// link (mode "connect" only).
useAms optionalboolean | null—
warnings optionalstring[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_print_status read Read an X1 Carbon's state and AMS

Ask a Bambu Lab X1 Carbon on your LAN what it is doing: job state, percent, layer, time left, nozzle / bed / chamber temperatures, any HMS faults, and WHAT IS IN EVERY AMS TRAY with the global tray index an ams_mapping uses.

Full description

Call this before a two-colour print to see the real spools, and after cad_print to follow the job. Call cad_help({tool:"cad_print_status"}) for the rest.

ArgumentTypeMeaning & bounds
accessCode optionalstringLAN Access Code (8 chars).
ip optionalstringThe printer's IP on your LAN.
printer optionalstringSaved name or id. Default "x1c".
serial optionalstringThe printer serial.
timeoutSec optionalintegerSeconds to wait for the first report. Default 10.
≥ 5 · ≤ 120
transport optionalstringForce a registry transport.
watchSec optionalnumberSeconds to keep watching.
≥ 0 · ≤ 300

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
status requiredobject | nullWhat the printer last said about itself.
lines optionalobject[]watchSec only.
machine optionalobjectBambu machines other than the X1C (CADSF-2506)…
messages optionalintegerHow many reports arrived.
ms optionalinteger—
printer optionalobject | nullWhich machine answered.
trays optionalobject[]What the AMS is holding.
warnings optionalstring[]—
watchedSec optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_print_in_place_check write Will the print-in-place part move, and stay together?

PROVE a print-in-place assembly (gears, hinges, chains - printed as one plate, never assembled) both MOVES and can NEVER come apart.

Full description

Call cad_help({tool:"cad_print_in_place_check"}) for the rest.

ArgumentTypeMeaning & bounds
bodies requiredobject[]The moving bodies, by handle. Tooth data turns on the gear checks and the screw probe.
≥ 2 items · ≤ 24 items
document optionalstringDocument to read the bodies from.
gaps optionalbooleanPer-pose gap curve per pair (heat-map data). Default true.
heatmap optionalboolean | objecttrue (or {}) also draws the gap map as a heat-map PNG - hot where two parts come close, cold where they are loose - and returns its path.
joints optionalobject[]How it moves. The one revolute joint with no drivenBy is the INPUT and turns 360 deg; a body with no joint stands still.
≤ 24 items
nozzle optionalenumDefaults layerHeight off the pack. Default 0.4.
one of 0.2, 0.4, 0.6, 0.8
params optionalobjectOverrides for the fdm_x1c printInPlace numbers.
params.blockMarginnumbermm past gapMin that is blocked, not a graze. Default 0.1.
≥ 0
params.captivityPosesintegerOf those, how many get the escape probe. Default 8.
≥ 1 · ≤ 72
params.escapeReachnumberProbe reach, in part sizes. Default 2.
> 0
params.escapeSamplesintegerProbe samples per body. Default 600.
≥ 50 · ≤ 5000
params.faceCapsbooleanA ring lip + sun flange hold the planets axially (carrier-less planetary). Default false: warns.
params.floatFailAboveMmnumberAnd fails. Default 1.0.
≥ 0
params.floatWarnAboveMmnumberCarrier-less sun/planet wander that warns. Default 0.55 (just over 2 x the 0.25 mm print gap).
≥ 0
params.fuseBelownumbermm; at or under it the pair prints as one. Default 0.15.
≥ 0
params.gapMinnumbermm, design clearance. Default 0.25.
≥ 0
params.layerHeightnumbermm; sets the Z floor with zGapMin.
> 0
params.stepsintegerPoses in the sweep. Default 72.
≥ 2 · ≤ 720
params.tiltDegnumberCocking allowed before walking it out. Default 30.
≥ 0 · ≤ 90
params.zGapMinnumbermm, horizontal floor. Default 0.30.
≥ 0

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
bodies requiredobject[]—
captive requiredobject[]—
gapMap requiredobject—
gapMap.pairsobject[]—
gapMap.windownumber—
ms requiredinteger—
ok requiredboolean—
params requiredobject—
poses requiredinteger—
verdicts requiredobject[]—
blockedBy optionalstring[]—
captivityPoses optionalinteger[]—
floatingTrain optionalobject | null—
heatmap optionalobject—
planetary optionalobject | null—
ratios optionalobject[]—
warnings optionalstring[]—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_support write Supports

Grow breakaway supports (tree|grid|linear, fdm|sla) for non-Bambu slicers/resin, or metal supports (profile lpbf: block|line|cone, teeth, fragmentation; lpbf:{params}), proven clear of the part.

Full description

Returns coverage, grams, contact area, removal access; export {path}: 3MF, one object per support.

ArgumentTypeMeaning & bounds
body requiredstring—
bedOnly optionalboolean—
blockFaces optionalstring[]—
buildDirection optionalnumber[]—
companions optionalstring[]—
cosmeticFaces optionalstring[]—
density optionalnumber—
document optionalstring—
export optionalobject—
interfaceGap optionalnumber—
lpbf optionalobject—
material optionalstring—
printer optionalstring—
profile optionalenum—
one of "fdm", "sla", "lpbf"
style optionalenum—
one of "tree", "grid", "linear", "block", "line", "cone"
tipDiameter optionalnumber—
transform optionalnumber[]—
xyGap optionalnumber—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_printer write Save, list, test and discover LAN 3D printers

Manage the saved-printer list every other print tool's printer argument reads from, so a call can say printer:"my-k2" instead of an ip/serial/access-code triple every time.

Full description

Call cad_help({tool:"cad_printer"}) for the rest.

ArgumentTypeMeaning & bounds
action requiredenumWhich operation to run.
one of "discover", "add", "list", "remove", "test"
credentials optionalobjectadd only: secrets for this machine, stored in t…
credentials.apiKeystring—
credentials.codestring—
credentials.keystring—
credentials.kindenum—
one of "access-code", "api-key", "basic", "digest", "none"
credentials.passwordstring—
credentials.secretstring—
credentials.tokenstring—
credentials.usernamestring—
host optionalstringadd only: IP or hostname on your LAN.
name optionalstringSaved printer name. Required for add/remove/test.
port optionalintegeradd only: overrides the transport's default port.
≥ 1 · ≤ 65535
printer optionalstringadd only: registry id or alias…
protocols optionalenum[]discover only: which LAN protocols to probe.
serial optionalstringadd only: device serial.
timeoutMs optionalintegerdiscover/test only. Default 3000/5000.
≥ 100 · ≤ 10000
transport optionalstringadd only: force one of the printer's registry t…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
action optionalenum—
one of "discover", "add", "list", "remove", "test"
addedAt optionalstring | null—
capabilities optionalobject | null—
code optionalstring | null—
conn optionalobject | null—
count optionalinteger | null—
details optionalobject | null—
found optionalarray | null—
hasCredentials optionalboolean | null—
host optionalstring | null—
name optionalstring | null—
ok optionalboolean | null—
port optionalinteger | null—
printer optionalstring | null—
printers optionalarray | null—
removed optionalboolean | null—
serial optionalstring | null—
transport optionalstring | null—

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Server, config & licence · 6

Session setup: where files are written, what this build is, and the licence the seat is running under.

cad_configure write Configure runtime limits

Read or change the server's runtime limits: memory budgets (maxBytes hard cap, warnBytes soft threshold), the per-request tessellation ceiling (maxTriangles), and the export output directory.

Full description

Call with no arguments to read the current settings. Pass a value to set it, or null to clear it back to its default. Call cad_help({tool:"cad_configure"}) for the rest.

ArgumentTypeMeaning & bounds
addon optionalobjectSpace Program add-on: {action:status|install|op…
autoUpdate optionalenumHow NativeCAD takes new releases: auto installs…
one of "off", "notify", "auto", null
batchSoftDeadlineMs optionalinteger | nullms before a still-running cad_batch op becomes…
≥ 0
booleanFuzzy optionalnumber | nullSession-default boolean fuzzy value, mm: operan…
≥ 0
booleanIdentityTolerance optionalnumber | nullRelative delta (0.01 = 1%) at which a boolean i…
> 0 · ≤ 1
captureGeometry optionalenumOFF by default, and the ONLY switch that upload…
one of "on", "off", null
maxBytes optionalinteger | nullHard cap on in-memory model bytes; above it new…
≥ 1048576
maxTriangles optionalinteger | nullPer-request cap on triangles a tessellation/exp…
≥ 1000
opTimeoutMs optionalinteger | nullWall-clock ceiling on ONE modelling call, in ms.
≥ 0
outputDirectory optionalstring | nullAbsolute directory that cad_export_body's relat…
solvers optionalenumstatus: list FEA solvers found.
one of "status"
telemetry optionalenumAnonymous usage log…
one of "on", "off", null
update optionalenumcheck: look for a release now.
one of "check", "now"
updateChannel optionalenumRelease channel.
one of "stable", "beta", null
warnBytes optionalinteger | nullSoft threshold; crossing it sets headroom.softW…
≥ 1048576

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
changed optionalstring[]—
defaults optionalobject—
note optionalstringPresent when a setting was accepted but does no…
settings optionalobject—
settings.batchSoftDeadlineMsinteger | null—
settings.booleanFuzzynumber | null—
settings.booleanIdentityTolerancenumber | null—
settings.captureGeometryenum—
one of "on", "off"
settings.maxBytesinteger | null—
settings.maxTrianglesinteger | null—
settings.opTimeoutMsinteger | null—
settings.outputDirectorystring | null—
settings.telemetryenum—
one of "on", "off"
settings.warnBytesinteger | null—

cad_server_info read Server capabilities and inventory

Describe this NativeCAD MCP build: every registered tool grouped by subsystem, the optional subsystems present or absent, the full error-code vocabulary with recoverability, and the unit conventions.

Full description

Call this first when you are unsure what the server can do — the tool surface varies by build, and this is the only authoritative answer.

ArgumentTypeMeaning & bounds
section optionalenumOne section only. Default "all".
one of "all", "tools", "errors", "services", "conventions", "solvers" · default "all"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
server requiredobject—
server.namestring—
server.versionstring—
server.displayNamestring—
server.kernelVersionstring | null—
server.nodestring—
server.transportstring—

cad_license write License status, activation and free registration

Report or set this server's NativeCAD licence, or get the free-registration link.

Full description

Validates OFFLINE, no network call. Three states: UNREGISTERED builds freely but gates the ten tools that move geometry off this machine; a FREE registered key opens the full toolset on Education / Maker terms; a paid seat adds commercial rights. Call cad_help({tool:"cad_license"}) for the rest.

ArgumentTypeMeaning & bounds
action optionalenum"status" reads the current licence (default); "…
one of "status", "activate", "deactivate", "register" · default "status"
key optionalstringThe licence key, format CSLV1-<payload>-<tag>.

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
gated requiredbooleanTrue when this server is unregistered, i.e. whe…
licensed requiredboolean—
licensee requiredstring | null—
source requiredenumWhere the active key came from: "env" the envir…
one of "env", "file", "tool", "none"
tier requiredstring | nullfree is the registered Education / Maker tier…
action optionalstring—
changed optionalbooleanTrue when this call actually flipped the licenc…
envKey optionalstring—
expired optionalobject | nullSet when the key this install was given has run…
expires optionalstring | nullYYYY-MM-DD, or null for a seat with no end.
fileEnvKey optionalstringEnv var that relocates the licence file.
gatedWithoutKey optionalstring[]The tools REFUSED while unregistered — the on…
hint optionalstring—
licenseFile optionalstring | nullAbsolute path of the stored licence — where a…
notice optionalstring | null—
persisted optionalbooleanactivate/deactivate: whether disk was written o…
registerUrl optionalstring—
steps optionalstring[]action "register": what a human does.
tiers optionalstring[]—
updatesUntil optionalstring | nullYYYY-MM-DD, informational: the end of the UPDAT…
warning optionalstring | null—

cad_help read Full description for one tool

Return the full, untrimmed description for one tool named in tools/list (a description ending "Call cad_help(...)" was cut to fit), or a playbook by topic, e.g.

Full description

"composites". Safe to call speculatively.

ArgumentTypeMeaning & bounds
action optionalstringWith tool: one action's arguments, e.g. "diff".
format optionalstringWith tool: one format's option block, e.g. "glb".
tool optionalstringA tool name from tools/list, e.g. "cad_export_b…
topic optionalenum—
one of "eval-loop", "drawings", "pcb", "cert", "field", "thread", "constrain_face", "glazing", "composites", "turbomachine", "retro", "continuity", "offset-first", "addon"

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

cad_report_bug write Report a NativeCAD bug

File a bug about NATIVECAD ITSELF (not the part you are modelling) directly from this session.

Full description

Call cad_help({tool:"cad_report_bug"}) for the rest.

ArgumentTypeMeaning & bounds
description requiredstringFull description.
title requiredstringWhat went wrong, in one line.
actual optionalstringWhat actually happened. Truncated at 4096 bytes.
attachFile optionalstringOPT-IN.
attachMode optionalenumextract (default): only the minimal extract of…
one of "extract", "original" · default "extract"
attested optionalbooleanYour attestation, with the wording returned by…
default false
consentToken optionalstringThe token the preview returned.
contact optionalobjectSent only with an attachment.
contact.emailstringWhere we reach you about this file.
contact.companystring—
contact.namestring—
expected optionalstringWhat you expected instead.
failure optionalobjectWhere the reader failed; steers which fragment…
failure.codestring—
failure.entityIdintegerSTEP entity number the reader failed at, if it…
failure.stagestring—
failureFingerprint optionalstringFingerprint (hex) of the automatic failure repo…
includeEmail optionalbooleanAttach your own reply-to email, read from CADSO…
default false
severity optionalenumblocker | major (default) | minor | cosmetic.
one of "blocker", "major", "minor", "cosmetic" · default "major"
steps optionalstringHow to reproduce it. Truncated at 4096 bytes.
tool optionalstringThe cad_* tool that misbehaved, if this is abou…

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

FieldTypeMeaning & bounds
id requiredstring | nullThe listener's report id, when it sent one back.
localCopy requiredstring | nullPath to the local JSONL log this report was app…
receipt requiredstringA line to quote support with, whether or not th…
sent requiredbooleanTrue when the bug listener accepted the report.
attachment optionalobjectPresent when attachFile was given: status…
foundIn optionalstringVersion this was filed against — pass it as f…
reason optionalstringPresent only when sent is false: why the POST d…

cad_gpu write GPU acceleration: status / install / benchmark / remove

Manage the OPTIONAL WebGPU addon (dawn.node) this server can use for GPU-accelerated kernels.

Full description

ASK THE USER BEFORE calling install: it downloads a ~20 MB binary from the npm registry (or a local file via fromFile for an air-gapped install). Call cad_help({tool:"cad_gpu"}) for the rest.

ArgumentTypeMeaning & bounds
action requiredenum"status": read-only report.
one of "status", "install", "benchmark", "remove"
fromFile optionalstringOnly used with action:"install".

No other keys are accepted; an unknown argument is an E_ARGS refusal rather than a silent ignore.

Result

Returns no structured fields.