{"ok":true,"site":{"host":"cadding.io","url":"https://cadding.io/","type":"live","desc":"AI CAD for 3D printing in the browser. Turn prompts into editable models and export in minutes.","tools":[{"name":"cad.new_project","kind":"act","impl":"imperative","description":"Create and open one fresh Cadding project for this agent session. Repeated calls reuse the same editor project. Set forceNew only when the user explicitly asks for another separate project.","title":"new project","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"forceNew":{"type":"boolean","description":"Create another separate project instead of reusing the current agent editor. Use only when the user explicitly requests a new additional project.","default":false}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/login","/dashboard","/editor","/pricing","/docs"]},{"name":"cad.open_editor","kind":"act","impl":"imperative","description":"Open a fresh public Cadding editor project. This compatibility alias behaves like cad.new_project.","title":"open editor","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/login","/dashboard","/editor","/pricing","/docs"]},{"name":"cad.get_editor_link","kind":"act","impl":"imperative","description":"Return a shareable Cadding link. For a guest browser scene, persist a copy as an account-free MCP editor link; signed-in account-project sharing remains available through the Share UI.","title":"get editor link","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/login","/dashboard","/editor","/pricing","/docs"]},{"name":"cad.add_shape","kind":"act","impl":"imperative","description":"Create one primitive part. The primitive kind is the shape parameter; tube and ring are not operations. Sphere, hemisphere, and cylinder are the starting mass for curved shells that later boolean_parts will isolate — do not skip them in favor of a planar extrude when the body is not flat.","title":"add shape","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add_shape","description":"Arguments for add_shape.","properties":{"shape":{"type":"string","description":"Primitive shape. Use hollow_cylinder for a tube and torus for a ring.","enum":["box","rounded_box","sphere","cylinder","half_cylinder","cone","truncated_cone","torus","ring","disk","tube","pipe","pyramid","wedge","hexagon","octagon","star","gear","heart","lightning","arrow","moon","leaf","diamond","shield","clover","petal","dome","capsule","plane","prism","ellipsoid","hemisphere","paraboloid","hyperboloid","frustum_pyramid","helix","thread","rounded_cylinder","cylinder_arc","curved_tube","angle","text","tetrahedron","octahedron","dodecahedron","icosahedron","bolt","screw","hollow_cylinder","frustum","regular_polygon"]},"name":{"type":"string","description":"Display name for the new part."},"componentId":{"type":"string","description":"Opaque owner/component ID."},"parameters":{"type":"object","description":"Shape-specific dimensions and controls. Use the keys documented by the selected shape. For ring/torus: majorRadiusMm, minorRadiusMm, axis (\"z\" for flat on plate), and optional Sweep arc (radians) or arcDeg — 2π/360 full, 3π/2/270 three-quarter, π/180 half, π/2/90 quarter.","default":{"widthMm":40,"depthMm":30,"heightMm":20},"additionalProperties":true},"positionMm":{"type":"array","description":"Exact CAD position [x, y, z] in millimeters.","default":[0,0,0],"items":{"type":"number"}},"rotationDeg":{"type":"array","description":"Exact CAD rotation [x, y, z] in degrees.","default":[0,0,0],"items":{"type":"number"}},"color":{"type":"string","description":"Hex color."},"parentPartId":{"type":"string","description":"Optional GROUP id to nest under. It must resolve to type=group; never pass a solid enclosure/body id because that makes the child a boolean operand and destroys separate appearance. Use boolean_parts for real unions/subtractions. When replacing a nested body, pass its deleted parent only when that parent is a group."}},"required":["shape"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_tube_between","kind":"act","impl":"imperative","description":"Create a straight tube whose local axis is automatically oriented from startMm to endMm in the fixed CAD frame (+Z up). Use this for handles, pipes, axles, struts, and cable runs when a bent sweep is unnecessary. Do not manually guess Euler rotationDeg.","title":"add tube between points","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add tube between points","description":"Arguments for add_tube_between.","properties":{"startMm":{"type":"object","description":"CAD start point {x,y,z} or [x,y,z] in millimeters.","additionalProperties":true},"endMm":{"type":"object","description":"CAD end point {x,y,z} or [x,y,z] in millimeters.","additionalProperties":true},"outerRadiusMm":{"type":"number","description":"Outer tube radius in millimeters."},"wallThicknessMm":{"type":"number","description":"Wall thickness in millimeters. Omit or set 0 for a solid rod."},"name":{"type":"string","description":"Optional part name."},"componentId":{"type":"string","description":"Opaque owner/component ID for deterministic coverage tracking."},"color":{"type":"string","description":"Hex color."},"parentPartId":{"type":"string","description":"Optional GROUP id to nest under."}},"required":["startMm","endMm","outerRadiusMm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_construction","kind":"act","impl":"imperative","description":"Create one editable, reusable construction family as a coherent parametric part tree. This is the preferred fast path for common mechanical roots such as shells, brackets, hole patterns, bosses, bushings, shafts, wheels, clamps, hinges, lids, snap-fits, threads, adapters, rails, gears, pulleys, bearing holders, knobs, hooks, and flanges. Dimensions inside parameters are millimeters. The result stays editable through its Construction parameters. Hole Pattern creates subtractive cutter geometry; use boolean_parts mode=subtract to apply it to a host.","title":"add construction family","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add construction family","description":"Arguments for add_construction.","properties":{"family":{"type":"string","description":"Construction family. Use get_construction_catalog(family) when exact parameters or option values are not already known.","enum":["shell_body","bracket","hole_pattern","boss_standoff","bushing_spacer","shaft_pin","wheel","clamp","hinge","lid","snap_fit","threaded_connection","adapter","rail_slider","gear","pulley","bearing_holder","knob","hook","flange"]},"name":{"type":"string","description":"Optional Layers name for this family instance."},"parameters":{"type":"object","description":"Family-specific parameters. All dimensional values, including position arrays inside structured fields, are millimeters; angles are degrees; counts and ratios are unitless.","default":{},"additionalProperties":true},"positionMm":{"type":"array","description":"Exact instance position [x, y, z] in millimeters. Omit for safe automatic placement.","items":{"type":"number"}},"rotationDeg":{"type":"array","description":"Exact instance rotation [x, y, z] in degrees.","items":{"type":"number"}},"placementFrame":{"type":"object","description":"Optional placement frame with positionMm/originMm and rotationDeg. Top-level positionMm/rotationDeg win.","additionalProperties":true},"targetPartId":{"type":"string","description":"Optional related target part. The relationship is recorded for later CAD operations; geometry is not silently fused or cut. Use boolean_parts or assemble explicitly."},"targetFace":{"type":"string","description":"Optional target face identifier associated with targetPartId."},"parentPartId":{"type":"string","description":"Optional GROUP id to nest the new family under."},"color":{"type":"string","description":"Hex color."}},"required":["family","parameters"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_robot_part","kind":"act","impl":"imperative","description":"Create one of the verified robotics building blocks. Dimensions inside parameters are millimeters; hole positions are millimeter pairs. These are intentionally simple parts for reliable AI assembly planning.","title":"add robot part","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add robot part","description":"Arguments for add_robot_part.","properties":{"part":{"type":"string","description":"Robot part type.","enum":["wheel","axle","spacer","standoff","l_bracket","u_bracket","mounting_bracket","motor_mount","servo_bracket","bearing_block","shaft_coupler","hub","linkage","servo_horn","chassis_plate","electronics_tray","battery_holder","sensor_bracket","washer","hex_nut","socket_head_screw","countersunk_screw","threaded_insert","shaft_collar","retaining_ring","clevis_pin","dowel_pin","r_clip","flange","o_ring","rubber_foot","vibration_mount","caster_wheel","cable_clamp","cable_gland","cable_tie_mount","pcb_clip","t_slot_extrusion"]},"name":{"type":"string","description":"Optional part name."},"parameters":{"type":"object","description":"Part-specific dimensions in millimeters.","additionalProperties":true},"positionMm":{"type":"array","description":"Exact position [x,y,z] in millimeters.","items":{"type":"number"}},"rotationDeg":{"type":"array","description":"Exact rotation [x,y,z] in degrees.","items":{"type":"number"}},"color":{"type":"string","description":"Hex color."}},"required":["part","parameters"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_profile_shape","kind":"act","impl":"imperative","description":"Create geometry from a profile, sketch, image trace, revolve, sweep, or loft. method=trace_image is only for a user-requested trace of a verified orthographic/planar true prism; extrude is only for a true prism (both large faces planar AND parallel, thickness = one extrude axis). Do not trace a general perspective product photo as a substitute for reconstructing its 3D form. Do not flatten a cupped wall into an extruded 2D outline, and do not fake a lean with extra rotationDeg — that mapping is sketch-plane onto CAD axes only (typically 90° about one axis). Circular-pattern phase belongs on pattern_parts. Curved shells use method=revolve or loft, or add_shape primitives plus boolean_parts. Prefer add_shape cylinder|truncatedCone|tube (or shell_part) when the axisymmetric wall is constant radius or a single linear taper with a coaxial bore — do not invent a custom revolve meridian or high radialSegments for that case. For a vessel with a genuinely changing meridian, use revolve with an outer meridian only, shell=\"hollow\", openTop=true, openBottom=false, wallThicknessMm, and radialSegments ≤ 64; do not use a primary mouth cutter. For a handle/grip/loop/spout, use sweep with either absolute pathPointsMm or startMm/endMm plus optional viaPointsMm, pathMode=\"curve\", profileKind=\"circle\", tubeRadiusMm, and endpoints penetrating the host; do not follow that authored sweep with a generic mate_parts call.","title":"add profile shape","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add_profile_shape","description":"Arguments for add_profile_shape.","properties":{"method":{"type":"string","description":"Construction method. trace_image requires an explicit user trace request and a verified orthographic/planar true-prism view; extrude also requires a true prism (planar AND parallel large faces). For ordinary perspective reference images, reconstruct the full visible 3D form instead. extrude/sketch_extrude requires parameters.profilePointsMm, segments, or profilePreset on the call. Extra rotationDeg is not a substitute for curvature; pattern phase is pattern_parts, not the prototype. If the wall cups, use revolve/loft or add_shape + boolean_parts. Use sweep for a constant-section member along a bent 3D path. Prefer parameters.startMm + parameters.endMm + optional parameters.viaPointsMm for a simple handle; use parameters.pathPointsMm for a multi-waypoint route. All points are absolute CAD x=right,y=front/back,z=up millimeters. Use pathMode=curve for an intentional smooth bend, profileKind=circle|rect, and tubeRadiusMm or rectWidthMm/rectDepthMm. Authored sweep endpoints should contact the host directly, so generic mate_parts is normally unnecessary and unsafe.","enum":["extrude","trace_image","sketch_extrude","revolve","sweep","loft"]},"name":{"type":"string","description":"Display name for the new part."},"componentId":{"type":"string","description":"Opaque owner/component ID."},"guideMode":{"type":"string","description":"Loft guide interpolation. Use spline with guidePointsMm for a smooth centripetal spline rail; omit it or use polyline for straight station interpolation.","enum":["polyline","spline"]},"parameters":{"type":"object","description":"Method-specific profile, path, section, and dimension data. Millimeter suffixes are authoritative. For method=extrude/sketch_extrude, set profilePlane=\"XY\" for a top/footprint outline or \"XZ\" for a side/elevation outline (U/V map to the named CAD plane; extrudeDepthMm is perpendicular to that plane). For method=trace_image, require an explicit user trace request and a verified orthographic/planar true-prism view; only then set useReferenceImage=true and extrudeDepthMm (and optional referenceWidthMm/widthMm). For ordinary perspective product photos, reconstruct the 3D geometry instead of tracing. Use silhouettePrompt / isolateFromReference only to isolate one explicitly named component from a multi-object photo, or when no photo is attached and silhouette generation is explicitly requested. For method=revolve: parameters.segments is the visible outer wall as EDGES (Umm=radius from the spin axis, Vmm=height along CAD +Z), bottom→top. One line per straight run; arc/bezier (midUmm/midVmm on the curve) for blends; two meeting lines for a sharp corner. Do not sample a curve as many short lines (that lathes into stacked rings). Do not include the inner wall or axis-seal points — set shell/openTop/openBottom instead. Call-level radiusMm/axialHeightMm are envelope fallbacks only when segments are omitted.","default":{},"additionalProperties":true},"positionMm":{"type":"array","description":"Exact CAD position [x, y, z] in millimeters.","default":[0,0,0],"items":{"type":"number"}},"rotationDeg":{"type":"array","description":"Exact CAD rotation [x, y, z] in degrees.","default":[0,0,0],"items":{"type":"number"}},"color":{"type":"string","description":"Hex color."},"targetPartId":{"type":"string","description":"Optional host/body id for an attached sweep or other profile member. Use the exact live id from scene context or an explicit result alias such as \"$handle\"; never use latest-created/prototype order or a display name. This records the intended relationship; sweep endpoints still define the exact placement."},"targetFace":{"type":"string","description":"Optional host face id for the attached profile member; inspect the host first and do not guess."},"parentPartId":{"type":"string","description":"Optional GROUP id to nest under. It must resolve to type=group; never pass a solid enclosure/body id because that makes the child a boolean operand and destroys separate appearance. Use boolean_parts for real unions/subtractions. When replacing a nested body, pass its deleted parent only when that parent is a group."}},"required":["method"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.inspect_part","kind":"answer","impl":"imperative","description":"Read exact transform, dimensions, bounds, faces, face frames, edges, vertices, hierarchy, and editable parameters. Revolve and extrusion parts include profilePointsMm; loft parts include pointsAMm/pointsBMm and loftHeightMm for a later edit_part / set_dimensions reshape.","title":"get part","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get part","description":"Arguments for inspect_part.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_scene","kind":"answer","impl":"imperative","description":"Read every live part, hierarchy relationship, transform, dimensions, visibility, and stable ID in the current scene.","title":"get scene","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get scene","description":"Arguments for get_scene.","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_construction_catalog","kind":"answer","impl":"imperative","description":"Read the authoritative construction-family defaults, units, options, and full parameter vocabulary before creating a precision family.","title":"get construction catalog","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get construction catalog","description":"Arguments for get_construction_catalog.","properties":{"family":{"type":"string","description":"Optional family filter. Omit to list all families.","enum":["shell_body","bracket","hole_pattern","boss_standoff","bushing_spacer","shaft_pin","wheel","clamp","hinge","lid","snap_fit","threaded_connection","adapter","rail_slider","gear","pulley","bearing_holder","knob","hook","flange"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_robot_part_catalog","kind":"answer","impl":"imperative","description":"Read the verified robotics building-block catalog and millimeter defaults.","title":"get robot part catalog","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get robot part catalog","description":"Arguments for get_robot_part_catalog.","properties":{"part":{"type":"string","description":"Optional robot part filter.","enum":["wheel","axle","spacer","standoff","l_bracket","u_bracket","mounting_bracket","motor_mount","servo_bracket","bearing_block","shaft_coupler","hub","linkage","servo_horn","chassis_plate","electronics_tray","battery_holder","sensor_bracket","washer","hex_nut","socket_head_screw","countersunk_screw","threaded_insert","shaft_collar","retaining_ring","clevis_pin","dowel_pin","r_clip","flange","o_ring","rubber_foot","vibration_mount","caster_wheel","cable_clamp","cable_gland","cable_tie_mount","pcb_clip","t_slot_extrusion"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_component_kit","kind":"answer","impl":"imperative","description":"Read the required functional hardware and interface checklist for a production-oriented product profile. Use this before building a chair, robot, wallet, pen, or other multi-part product so connections, supports, retention, and cable interfaces are explicit.","title":"get production component kit","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get production component kit","description":"Arguments for get_component_kit.","properties":{"product":{"type":"string","description":"Product profile. Omit for the universal hardware checklist.","enum":["universal","chair","robot","ledger_wallet","pen","coffee_machine","game_controller"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_mcmaster_catalog","kind":"answer","impl":"imperative","description":"List curated preferred McMaster hardware (M3 screws, nuts, USB-C, etc.) plus any live-fetched cache. Not the full McMaster site — search by query (e.g. \"m3 screw\", \"usb-c\") then place with add_mcmaster_part.","title":"get McMaster catalog","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get McMaster catalog","description":"Arguments for get_mcmaster_catalog.","properties":{"query":{"type":"string","description":"Optional part number or name filter."},"partNumber":{"type":"string","description":"Exact part number filter (alias of query)."},"partFamily":{"type":"string","description":"Optional physical family filter such as motor, connector, wheel, cable_harness, or fastener."},"manufacturingClass":{"type":"string","description":"Optional acquisition filter such as purchased_component or cable_or_harness. McMaster items are normally purchased components, not printable geometry."},"printability":{"type":"string","description":"Optional print filter. McMaster hardware normally returns not_applicable; use the unified component catalog for printable procedural parts."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_mcmaster_part","kind":"act","impl":"imperative","description":"Place one licensed McMaster-Carr catalog part by part number. If missing from the local Coolify library, live-fetches STEP via the authorized McMaster session (cookies) and caches it. Mate afterward with connect_parts / mate_parts when needed.","title":"add McMaster part","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add McMaster part","description":"Arguments for add_mcmaster_part.","properties":{"partNumber":{"type":"string","description":"McMaster part number, e.g. 91290A117."},"name":{"type":"string","description":"Optional Layers display name."},"mediaUrl":{"type":"string","description":"Optional override URL for the STEP/mesh asset."},"positionMm":{"type":"array","description":"Exact position [x,y,z] in millimeters.","items":{"type":"number"}},"rotationDeg":{"type":"array","description":"Exact rotation [x,y,z] in degrees.","items":{"type":"number"}},"color":{"type":"string","description":"Hex color."},"componentId":{"type":"string","description":"Opaque owner/component ID for coverage tracking."},"parentPartId":{"type":"string","description":"Optional GROUP id to nest under."}},"required":["partNumber"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_faces","kind":"answer","impl":"imperative","description":"Read stable face IDs, centers, normals, and local frames for one part.","title":"get faces","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get faces","description":"Arguments for get_faces.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_edges","kind":"answer","impl":"imperative","description":"Read stable edge IDs and their measured CAD polylines for one part.","title":"get edges","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get edges","description":"Arguments for get_edges.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_vertices","kind":"answer","impl":"imperative","description":"Read stable vertex IDs and measured local/world CAD coordinates for one part.","title":"get vertices","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get vertices","description":"Arguments for get_vertices.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_parameters","kind":"answer","impl":"imperative","description":"Read editable CAD parameters and transform state for one part without changing the scene. Revolve and extrusion parts include profilePointsMm — copy those {x,y} stations into edit_part.changes.profilePointsMm or set_dimensions.profilePointsMm to reshape the live body without deleting it. Loft parts include pointsAMm/pointsBMm (closed UV end loops) and loftHeightMm — copy those into edit_part.changes or set_dimensions; do not delete and recreate.","title":"get parameters","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get parameters","description":"Arguments for get_parameters.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.select_parts","kind":"act","impl":"imperative","description":"Select one or more parts by stable ID.","title":"select parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"select_parts","description":"Arguments for select_parts.","properties":{"partIds":{"type":"array","description":"Part IDs to select.","items":{"type":"string"}}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.select_topology","kind":"act","impl":"imperative","description":"Select one measured face, edge, or vertex on a part (IDs from get_faces / get_edges / get_vertices / inspect_part).","title":"select face / edge / vertex","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"select face / edge / vertex","description":"Arguments for select_topology.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"element":{"type":"string","description":"Topology element kind.","enum":["face","edge","vertex"]},"elementId":{"type":"string","description":"Stable face, edge, or vertex ID."}},"required":["targetPartId","element","elementId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.set_transform","kind":"act","impl":"imperative","description":"Set or offset a part world position and world rotation using CAD Z-up coordinates. Scale is the part's parent-local scale, matching the scale reported by get_parameters and the scene context. Nested positions/rotations are converted into the parent local frame automatically.","title":"set transform","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"set_transform","description":"Arguments for set_transform.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"mode":{"type":"string","description":"Set exact values or apply deltas.","enum":["set","offset"]},"positionMm":{"type":"array","description":"CAD [x, y, z] millimeters.","items":{"type":"number"}},"rotationDeg":{"type":"array","description":"CAD [x, y, z] degrees.","items":{"type":"number"}},"scale":{"type":"array","description":"Parent-local scale [x, y, z]. Copying a sibling's reported scale therefore produces the same scale inside their shared parent.","items":{"type":"number"}}},"required":["targetPartId","mode"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.set_dimensions","kind":"act","impl":"imperative","description":"Set exact local size in millimeters. For primitives: width/depth/height (or diameterMm). For extrusions after create: widthMm/profileWidthMm (profile X), depthMm/lengthMm/profileDepthMm (profile length), heightMm/extrusionHeightMm (extrusion thickness), optional cornerRadiusMm, cornerSegments (1–24), and profileEdgeStyle (straight|curvy|soft — keeps the same outline vertices). For revolves/extrusions, top-level profilePointsMm replaces the live profile — do not delete and recreate. Revolve: x=radiusMm from the spin axis, y=heightMm along +Z. Extrude: closed UV outline in mm. For lofts: heightMm/loftHeightMm, widthMm/depthMm, surfaceMode (straight|ruled|rectilinear|smooth|curved|bulge|twist), and/or top-level pointsAMm/pointsBMm closed UV end loops from get_parameters.","title":"set dimensions","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"set_dimensions","description":"Arguments for set_dimensions.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"dimensionsMm":{"type":"object","description":"width/depth/height in mm. Extrusion: profileWidthMm, profileDepthMm/lengthMm, extrusionHeightMm, cornerRadiusMm, cornerSegments, profileEdgeStyle (straight/curvy/soft). Loft: loftHeightMm, widthMm, depthMm, surfaceMode. Omit when only profilePointsMm or pointsAMm/pointsBMm is sent.","default":{"widthMm":55,"depthMm":134,"heightMm":7,"profileEdgeStyle":"curvy"},"additionalProperties":true},"profilePointsMm":{"type":"array","description":"Replace the live revolve meridian or extrusion outline. Stations are {x,y} mm from get_parameters. Revolve: x=radiusMm, y=heightMm along +Z. Extrude: closed UV outline.","items":{"type":"object","additionalProperties":true}},"pointsAMm":{"type":"array","description":"Replace the live loft start/bottom closed UV loop in mm (U=CAD X, V=CAD Y on the plate). Copy from get_parameters. Omit to keep the current loop.","items":{"type":"object","additionalProperties":true}},"pointsBMm":{"type":"array","description":"Replace the live loft end/top closed UV loop in mm (same frame as pointsAMm). Copy from get_parameters. Omit to keep the current loop.","items":{"type":"object","additionalProperties":true}}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.set_appearance","kind":"act","impl":"imperative","description":"Set a part name and/or color.","title":"set appearance","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"set_appearance","description":"Arguments for set_appearance.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"name":{"type":"string","description":"New display name."},"color":{"type":"string","description":"Hex color."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.set_visibility","kind":"act","impl":"imperative","description":"Show or hide a part without deleting it.","title":"set visibility","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"set_visibility","description":"Arguments for set_visibility.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"visible":{"type":"boolean","description":"True to show, false to hide."}},"required":["targetPartId","visible"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.delete_parts","kind":"transact","impl":"imperative","description":"Delete parts by stable ID.","title":"delete parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"delete_parts","description":"Arguments for delete_parts.","properties":{"partIds":{"type":"array","description":"Part IDs to delete.","items":{"type":"string"}}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.duplicate_parts","kind":"act","impl":"imperative","description":"Duplicate parts and return the created IDs.","title":"duplicate parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"duplicate_parts","description":"Arguments for duplicate_parts.","properties":{"partIds":{"type":"array","description":"Part IDs to duplicate.","items":{"type":"string"}}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.group_parts","kind":"act","impl":"imperative","description":"Create one hierarchy group without fusing geometry. On a new multi-body object, wrap the members under one named parent so later scale/move/rotate is a single set_transform. When the members share a parent assembly group, the new group is nested under that same parent (not promoted to the scene root). Pass name for the Layers folder label. Needs two or more members — wrapping one nested solid is not how you split for print.","title":"create group","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"create group","description":"Arguments for group_parts.","properties":{"partIds":{"type":"array","description":"Child part IDs.","items":{"type":"string"}},"name":{"type":"string","description":"Folder label for the new group (kept exact when free; numbered only on collision)."}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.combine_parts","kind":"act","impl":"imperative","description":"Fuse one or more selected solids or solid containers into one editable combined result. Unlike group_parts, this creates one baked solid and preserves the original operands so uncombine_parts can restore them. A container ID may be passed to combine its visible base and construction children together. Pass name to preserve the requested Layers label; otherwise the first meaningful operand name is retained with a Combine suffix.","title":"combine","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"combine","description":"Arguments for combine_parts.","properties":{"partIds":{"type":"array","description":"Stable IDs of solids or solid containers to combine. Pass one expandable container to combine its visible contents.","items":{"type":"string"}},"name":{"type":"string","description":"Optional Layers label for the combined result. Keep an explicit name such as \"Solid Circle - Combine\"."}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.ungroup_parts","kind":"act","impl":"imperative","description":"Promote a group’s children to independent parts (the group’s parent, or the scene root). Pass the covering group id or any member id. Nested members resolve to their covering parent even when the member is itself a group. Nested construction subtracts stay on their host solids. Use this when the user wants separate printable/exportable/movable pieces — do not wrap a single member in group_parts, and do not hide nested construction subtracts as a print-package step.","title":"ungroup","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"ungroup","description":"Arguments for ungroup_parts.","properties":{"targetPartId":{"type":"string","description":"Group id or any member id of the covering group to dissolve."},"partIds":{"type":"array","description":"Optional extra member or group ids; each covering group is dissolved once.","items":{"type":"string"}}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.uncombine_parts","kind":"act","impl":"imperative","description":"Restore the original operands preserved by a combine_parts result. Pass the combined result ID, not a regular group or an arbitrary solid.","title":"uncombine","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"uncombine","description":"Arguments for uncombine_parts.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the combined result to restore."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.edit_part","kind":"act","impl":"imperative","description":"Apply a coordinated edit to a part. Put only allowed keys in changes: dimensionsMm, positionMm, rotationDeg, scale, name, color, visible, profilePointsMm (revolve meridian or extrusion outline copied from get_parameters), pointsAMm/pointsBMm (loft end loops), loftHeightMm/widthMm/depthMm/surfaceMode for an existing loft, sweep {profileKind, tubeRadiusMm, rectWidthMm, rectDepthMm, pathPointsMm, pathMode} for an existing sweep, plus shape CAD params from get_parameters. Sweep and loft edits preserve the existing feature and omit fields you are not changing. Do not rewrite children, modifiers, features, id, or type. For small station tweaks, copy profile arrays into edit_part/set_dimensions. For a new irregular planar silhouette, use trace_image only if the user explicitly requested a trace and the view is verified to be a true prism; otherwise author an explicit profile instead of inventing a long profilePointsMm list.","title":"edit part","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"edit part","description":"Arguments for edit_part.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"changes":{"type":"object","description":"Allowed keys: dimensionsMm {width,depth,height,cornerRadiusMm,cornerSegments,loftHeightMm,surfaceMode}, positionMm [x,y,z], rotationDeg [x,y,z], scale [x,y,z], name, color, visible, profilePointsMm [{x,y}, …] from get_parameters (revolve x=radiusMm y=heightMm; extrude closed UV), pointsAMm/pointsBMm [{x,y}, …] loft end loops, loftHeightMm/widthMm/depthMm/surfaceMode for an existing loft, sweep {profileKind, tubeRadiusMm, rectWidthMm, rectDepthMm, pathPointsMm, pathMode} for an existing sweep, and CAD params (widthMm/depthMm/heightMm/radiusMm/…). Not allowed: children, modifiers, features, id, type.","default":{"dimensionsMm":{"width":40,"depth":30,"height":20}},"additionalProperties":true}},"required":["targetPartId","changes"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.split_part","kind":"act","impl":"imperative","description":"Cut one part into two pieces with a plane. Use axis for the cut direction, and ratio 0–1 for where the cut sits (0.5 = halfway). Prefer ratio; use offsetMm only when you need an exact millimeter offset from the part center.","title":"split part","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"split part","description":"Arguments for split_part.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"axis":{"type":"string","description":"Local cut direction. z = top/bottom split (height). x / y = side splits (width / depth).","enum":["x","y","z"],"default":"z"},"ratio":{"type":"number","description":"Where to cut along the axis, from 0 to 1. 0.5 = middle. Do NOT use 50 — that is wrong. Example: 0.5 for half, 0.25 for one-quarter from the low end.","default":0.5},"offsetMm":{"type":"number","description":"Optional exact cut offset in millimeters from the part center. Leave empty when using ratio."}},"required":["targetPartId","axis"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.boolean_parts","kind":"act","impl":"imperative","description":"Union parts or attach existing tool parts as LIVE subtractive operands under targetPartId. Creating a cutter alone does not cut anything. After subtracting, KEEP tool parts under their host: delete_parts on a cutter removes the opening. Subtract overlapping primitives to isolate curved-shell segments; do not flatten those segments into an extruded outline.","title":"boolean parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"boolean_parts","description":"Arguments for boolean_parts.","properties":{"mode":{"type":"string","description":"Boolean operation.","enum":["union","subtract"]},"targetPartId":{"type":"string","description":"Host part for subtraction."},"toolPartIds":{"type":"array","description":"Parts to union or use as cutters.","items":{"type":"string"}}},"required":["mode","toolPartIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_hole","kind":"act","impl":"imperative","description":"Create a circular, polygonal (including hexagonal), or slot opening on a part.","title":"add hole","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add_hole","description":"Arguments for add_hole.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"face":{"type":"string","description":"Target face ID or semantic face label."},"shape":{"type":"string","description":"Opening shape.","enum":["circle","polygon","hex","slot"]},"parameters":{"type":"object","description":"Diameter, width, length, depth, offsets, polygon side count, and tilt in millimeters/degrees.","default":{},"additionalProperties":true}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_feature","kind":"act","impl":"imperative","description":"Add a recess, rim, raised detail, or face-stamped text. Letters/logos on a host face MUST use feature=text (or add_text) after the host exists — never add_shape shape=text, which stands on the plate along +Z.","title":"add feature","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add_feature","description":"Arguments for add_feature.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"feature":{"type":"string","description":"Feature kind. text = emboss/engrave glyphs on the host face.","enum":["recess","rim","raised_detail","text","sculpt"]},"face":{"type":"string","description":"Target face ID or semantic label (required for text)."},"text":{"type":"string","description":"Lettering for feature=text."},"mode":{"type":"string","description":"emboss = shallow raised glyphs on the face; engrave = recessed. Default emboss.","enum":["emboss","engrave"]},"parameters":{"type":"object","description":"Feature-specific dimensions. For text: text, fontSizeMm, depthMm, mode, optional inPlaneRotationDeg (readable spin; omitted = world-up upright default).","default":{},"additionalProperties":true}},"required":["targetPartId","feature"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.shell_part","kind":"act","impl":"imperative","description":"Hollow a part and optionally remove declared faces. For a revolve, this rebuilds the editable outer meridian as a native hollow C-section with the requested wall thickness; use openFaces=[\"Top\"] for an open vessel mouth instead of a cavity cutter.","title":"shell part","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"shell_part","description":"Arguments for shell_part.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"thicknessMm":{"type":"number","description":"Wall thickness in millimeters."},"openFaces":{"type":"array","description":"Face IDs or semantic labels to remove.","items":{"type":"string"}}},"required":["targetPartId","thicknessMm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.trash_faces","kind":"act","impl":"imperative","description":"Remove declared faces while preserving the remaining shell.","title":"trash faces","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"trash_faces","description":"Arguments for trash_faces.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"faceIds":{"type":"array","description":"Faces to remove.","items":{"type":"string"}},"thicknessMm":{"type":"number","description":"Wall thickness used when the result needs a shell.","default":2}},"required":["targetPartId","faceIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.pattern_parts","kind":"act","impl":"imperative","description":"Create a linear, circular, or mirrored repetition from an existing part. Circular patterns require an explicit shared center: provide centerMm in absolute CAD millimeters or centerPartId for a live part whose world center is the pivot. Never assume the prototype center is the pattern center.","title":"pattern parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"pattern_parts","description":"Arguments for pattern_parts.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"mode":{"type":"string","description":"Pattern mode.","enum":["linear","circular","mirror"]},"axis":{"type":"string","description":"CAD x, y, or z axis."},"count":{"type":"number","description":"Total instance count."},"spacingMm":{"type":"number","description":"Linear spacing."},"angleDeg":{"type":"number","description":"Circular angle span."},"centerMm":{"type":"array","description":"Required for circular mode: absolute world pivot [x,y,z] in CAD millimeters.","items":{"type":"number"}},"centerPartId":{"type":"string","description":"Required for circular mode: existing live part ID whose world center is the shared pivot."},"plane":{"type":"string","description":"Mirror plane.","enum":["xy","xz","yz"]}},"required":["targetPartId","mode"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.align_parts","kind":"act","impl":"imperative","description":"Line parts up after they are already roughly placed (usually after assemble). center = match centers on an axis. flush = push parts so they share the same outer face on that axis. distribute = keep outermost centers fixed and space the middle parts evenly along one axis (needs 3+; no referencePartId). rotation = copy the reference world orientation onto the movers (center stays put; axis selects which Euler components to match, default xyz = full orientation). Pick which parts move with partIds, and which stays put with referencePartId (center/flush/rotation only).","title":"align","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"align","description":"Arguments for align_parts.","properties":{"mode":{"type":"string","description":"center = share the same center on the axis. flush = share the same outer side on the axis. distribute = even spacing between outermost centers (3+ parts). rotation = match the reference orientation (full or per-axis).","enum":["center","flush","distribute","rotation"],"default":"center"},"partIds":{"type":"array","description":"Parts that should move into alignment (or be redistributed for distribute).","items":{"type":"string"}},"referencePartId":{"type":"string","description":"Part that stays fixed for center/flush/rotation. Unused for distribute (outermost on the axis stay fixed). Defaults to the first partIds entry if omitted."},"axis":{"type":"string","description":"CAD axis to align on. Use x/y/z for one axis, or xz to center in the build-plane. For mode=rotation, x/y/z/xyz selects which orientation components to match (default xyz).","enum":["x","y","z","xy","xz","yz","xyz"],"default":"x"},"direction":{"type":"string","description":"Only for flush: which side of the reference to flush against.","enum":["positive","negative"],"default":"positive"}},"required":["mode","partIds","axis"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.mate_parts","kind":"act","impl":"imperative","description":"Stick two parts together so movingFace meets fixedFace (normals oppose). For several copies on the same face (pins, legs, posts), put the sideways station in arguments.inPlaneOffsetMm {uMm,vMm} — do not write the offset only in reason text. Omit inPlaneOffsetMm to keep the moving part’s current sideways placement; pass {uMm:0,vMm:0} to center. Do not use a generic face mate on an explicitly authored sweep/curvedTube whose absolute path endpoints already contact the host; edit its path or provide measured movingPointMm/fixedPointMm anchors instead.","title":"assemble","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"assemble","description":"Arguments for mate_parts.","properties":{"movingPartId":{"type":"string","description":"Part that moves."},"fixedPartId":{"type":"string","description":"Part that stays put."},"movingFace":{"type":"string","description":"Face on the moving part that should touch (e.g. Bottom). From get_faces / inspect_part.","default":"Bottom"},"fixedFace":{"type":"string","description":"Face on the fixed part to land on (e.g. Top). From get_faces / inspect_part.","default":"Top"},"movingPointMm":{"type":"array","description":"Optional local contact point on the moving part [x,y,z] mm instead of a whole face.","items":{"type":"number"}},"fixedPointMm":{"type":"array","description":"Optional local contact point on the fixed part [x,y,z] mm instead of a whole face.","items":{"type":"number"}},"inPlaneOffsetMm":{"type":"object","description":"Face-frame offset from the fixed face center { uMm, vMm }. Required when two+ copies share one face and need different stations. Omit = keep current sideways placement. {uMm:0,vMm:0} = center.","default":null,"additionalProperties":true}},"required":["movingPartId","fixedPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.place_on_plate","kind":"act","impl":"imperative","description":"Ground parts on the CAD Z=0 build plate. Default layFlat=false (translate only — keep authored rotation). layFlat:true may tip a body onto its largest face; use only when a part is clearly upside-down or on a thin edge vs the reference.","title":"place on plate","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"place_on_plate","description":"Arguments for place_on_plate.","properties":{"partIds":{"type":"array","description":"Part IDs to place.","items":{"type":"string"}},"layFlat":{"type":"boolean","description":"If true, also rotate to a max-footprint face before grounding. Prefer false so image-matched rotation is kept.","default":false}},"required":["partIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.place_inside","kind":"act","impl":"imperative","description":"Place a part inside a hollow container using a measured interior face returned by get_faces. Solid parts expose no interior faces and are rejected.","title":"place inside","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"place_inside","description":"Arguments for place_inside.","properties":{"partId":{"type":"string","description":"Part to move inside the container."},"containerPartId":{"type":"string","description":"Hollow container part."},"interiorFace":{"type":"string","description":"Measured interior face ID, usually interior:bottom or interior:wall.","default":"interior:bottom"},"movingFace":{"type":"string","description":"Measured face on the inserted part that should contact the interior face.","default":"Bottom"},"clearanceMm":{"type":"number","description":"Gap from the measured interior face in millimeters.","default":0},"inPlaneOffsetMm":{"type":"object","description":"Optional measured face-frame offset { uMm, vMm } from the interior face center.","default":{"uMm":0,"vMm":0},"additionalProperties":true}},"required":["partId","containerPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.edit_topology","kind":"act","impl":"imperative","description":"Edit one measured face, edge, or vertex by ID from get_faces / get_edges / get_vertices. Face parameters: scaleX/scaleY/scaleZ (or width/depth/height mm). Edge: offsetMm. Vertex: offsetX/offsetY/offsetZ mm.","title":"edit topology","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"edit topology","description":"Arguments for edit_topology.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"element":{"type":"string","description":"Topology element kind.","enum":["face","edge","vertex"]},"elementId":{"type":"string","description":"Face, edge, or vertex ID from inspect_part / get_faces / get_edges / get_vertices."},"parameters":{"type":"object","description":"Face: { scaleX, scaleY, scaleZ } or { width, depth, height }. Edge: { offsetMm }. Vertex: { offsetX, offsetY, offsetZ }. Do not mix kinds.","default":{"scaleX":1.1,"scaleY":1.1,"scaleZ":1.1},"additionalProperties":true}},"required":["targetPartId","element","elementId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.fillet_edges","kind":"act","impl":"imperative","description":"Round edges. Prefer selector (all, all_vertical, top_rim, bottom_rim) or pass edgeIds from get_edges. Required: radiusMm. Optional: segments, direction (outward|inward). Do not nest fields in parameters{}.","title":"fillet edges","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"fillet edges","description":"Arguments for fillet_edges.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"edgeIds":{"type":"array","description":"Measured edge IDs from get_edges. Optional when selector is set.","items":{"type":"string"}},"selector":{"type":"string","description":"Semantic edge group when you do not want to list IDs.","enum":["all_vertical","top_rim","bottom_rim","all"]},"radiusMm":{"type":"number","description":"Fillet radius in millimeters.","default":2},"segments":{"type":"number","description":"Preview tessellation segments.","default":6},"direction":{"type":"string","description":"Fillet side when supported.","enum":["outward","inward"],"default":"outward"}},"required":["targetPartId","radiusMm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_connector","kind":"act","impl":"imperative","description":"Place a mechanical connector. Complete hardware (hinge, pin-hinge, thread, twist-lock) can omit targetPartId and sit on the plate as its own part. Face features (holes, snaps, studs) still need a host part and usually a face.","title":"add connector","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add connector","description":"Arguments for add_connector.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"connectorType":{"type":"string","description":"Ready mechanical Connect-tool kind. Screw Hole pairs with Screw at the same M-size; snap types pair tab+slot; press-fit peg/hole pair; stud-grid places an 8 mm-pitch stud array (mate click cuts sockets); magnet-pocket takes a disc magnet; hinge places a complete flush hinge (both leaves + pin) as its own part — no host face required. joint-pin-hinge is a legacy alias of hinge. Legacy snap-male / snap-female aliases map to snap-tab / snap-slot.","enum":["fastener-screw","fastener-screw-hole","fastener-bolt-hole","fastener-countersink","fastener-counterbore","fastener-nut-trap","fastener-heatset","fastener-standoff","connector-peg-hole","connector-alignment-pin","connector-alignment-pin-hole","connector-snap-tab","connector-snap-slot","connector-magnet-pocket","connector-stud-grid","press-fit-male","press-fit-female","joint-hinge","joint-pin-hinge","snap-male","snap-female"]},"connectorSizeMm":{"type":"number","description":"Feature size in millimeters.","default":5},"face":{"type":"string","description":"Host face label (Top/Bottom/Front/Back/Left/Right, Face N, or interior:*)."},"type":{"type":"string","description":"Legacy alias for connectorType."},"sizeMm":{"type":"number","description":"Legacy alias for connectorSizeMm."},"studsX":{"type":"number","description":"Stud grid columns for connector-stud-grid. Default 2."},"studsY":{"type":"number","description":"Stud grid rows for connector-stud-grid. Default 4."},"fit":{"type":"string","description":"FDM clutch fit for stud-grid sockets. Default normal.","enum":["tight","normal","loose"]},"variant":{"type":"string","description":"Studs (male) or sockets (female) for connector-stud-grid.","enum":["male","female"]}},"required":["connectorType"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_mechanical_joint","kind":"act","impl":"imperative","description":"Mate two parts face-to-face and generate a paired mechanical interface (currently pin hinge). The moving part is aligned to the host, then hinge/barrel geometry is added to both.","title":"add mechanical joint","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add mechanical joint","description":"Arguments for add_mechanical_joint.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the moving part to align to the host."},"referencePartId":{"type":"string","description":"Fixed host part."},"face":{"type":"string","description":"Face on the moving part that contacts the host."},"referenceFace":{"type":"string","description":"Face on the host that contacts the moving part."},"targetFace":{"type":"string","description":"Legacy alias for referenceFace."},"mechanicalJointKind":{"type":"string","description":"Interface kind. Only pinHinge is committable.","enum":["pinHinge"],"default":"pinHinge"},"jointId":{"type":"string","description":"Opaque joint id used by generated geometry."},"hostPartId":{"type":"string","description":"Legacy alias for referencePartId."},"type":{"type":"string","description":"Legacy alias for mechanicalJointKind."},"sizeMm":{"type":"number","description":"Legacy joint diameter/size."},"hostComponentId":{"type":"string","description":"Opaque host component id."},"targetComponentId":{"type":"string","description":"Opaque moving component id."},"parameters":{"type":"object","description":"Optional joint parameters (pin diameter, barrel length, etc.).","default":{},"additionalProperties":true},"manufacturingProcess":{"type":"string","description":"Process used for clearances.","enum":["fdm","sla","sls","cnc","injection_molding"],"default":"fdm"},"fit":{"type":"string","description":"Fit class.","enum":["tight","normal","loose"],"default":"normal"}},"required":["referencePartId","face","referenceFace"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.connect_parts","kind":"act","impl":"imperative","description":"Atomically connect two live parts through measured ports. Resolves both world frames, moves only the target body into contact, creates paired interface geometry, persists the assembly graph edge, and rolls back the entire call if any step fails. Use this instead of mixing mate_parts with add_connector for one interface; groups are organizational and do not replace a connection.","title":"connect parts","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"connect parts","description":"Arguments for connect_parts.","properties":{"sourcePartId":{"type":"string","description":"Exact live ID or explicit result alias (for example \"$base\") of the fixed/source part. Do not use prototype, last_created, or a display name."},"sourcePort":{"type":"object","description":"Measured source port: {face, localPointMm?, localNormal?, localTangentUMm?}; a face string is accepted for simple planar ports.","additionalProperties":true},"targetPartId":{"type":"string","description":"Exact live ID or explicit result alias (for example \"$lid\") of the moving/target part. Do not use prototype, last_created, or a display name."},"targetPort":{"type":"object","description":"Measured target port: {face, localPointMm?, localNormal?, localTangentUMm?}; a face string is accepted for simple planar ports.","additionalProperties":true},"connectionType":{"type":"string","description":"Atomic interface contract.","enum":["fixed_mount","shaft_bushing","revolute","peg_socket","snap_fit","screw_boss","magnet","pin_hinge"]},"clearanceMm":{"type":"number","description":"Manufacturing clearance in millimeters.","default":0.2},"engagementMm":{"type":"number","description":"Insertion/overlap engagement in millimeters.","default":3},"sizeMm":{"type":"number","description":"Nominal connector or shaft size in millimeters.","default":5},"fit":{"type":"string","description":"FDM fit class.","enum":["tight","normal","loose"],"default":"normal"},"motion":{"type":"object","description":"Optional motion constraint, for example {type:\"revolute\", axis:\"X\", limitsDeg:[0,120]}.","additionalProperties":true},"manufacturingProcess":{"type":"string","description":"Process used to derive clearance.","enum":["fdm","sla","sls","cnc","injection_molding"],"default":"fdm"}},"required":["sourcePartId","sourcePort","targetPartId","targetPort","connectionType"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.route_cable","kind":"act","impl":"imperative","description":"Create a continuous swept cable between two measured ports and atomically attach both endpoints. The path is authored in absolute CAD millimeters; endpoint contact and clearance are validated, and crossing another part without endpoint interfaces never counts as connected.","title":"route cable","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"route cable","description":"Arguments for route_cable.","properties":{"sourcePartId":{"type":"string","description":"Stable source endpoint part ID."},"sourcePort":{"type":"object","description":"Measured source port {face, localPointMm?, localNormal?}.","additionalProperties":true},"targetPartId":{"type":"string","description":"Stable target endpoint part ID."},"targetPort":{"type":"object","description":"Measured target port {face, localPointMm?, localNormal?}.","additionalProperties":true},"pathPointsMm":{"type":"array","description":"At least two absolute CAD points; first/last are replaced by the measured port anchors.","items":{"type":"object","additionalProperties":true}},"cableRadiusMm":{"type":"number","description":"Cable radius in millimeters."},"clearanceMm":{"type":"number","description":"Minimum route clearance in millimeters.","default":0.5},"attachmentType":{"type":"string","description":"Endpoint attachment interface.","enum":["peg_socket","fixed_mount","magnet"],"default":"peg_socket"},"name":{"type":"string","description":"Display name for the cable."},"color":{"type":"string","description":"Hex color."},"parentPartId":{"type":"string","description":"Optional GROUP id for organization; the cable is nested without changing its world pose."}},"required":["sourcePartId","sourcePort","targetPartId","targetPort","pathPointsMm","cableRadiusMm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.add_joint","kind":"act","impl":"imperative","description":"Add a connector or mechanical joint between measured parts/faces.","title":"add joint","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"add_joint","description":"Arguments for add_joint.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"kind":{"type":"string","description":"Joint kind.","enum":["connector","mechanical_joint"]},"referencePartId":{"type":"string","description":"Second part for a mechanical joint."},"face":{"type":"string","description":"Target face."},"referenceFace":{"type":"string","description":"Second face."},"parameters":{"type":"object","description":"Joint size and type parameters.","default":{},"additionalProperties":true}},"required":["targetPartId","kind"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.get_auth_status","kind":"answer","impl":"imperative","description":"Check whether the current Cadding browser session is signed in and whether protected project operations are available. Returns no credentials or tokens.","title":"get auth status","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"get_auth_status","description":"Arguments for get_auth_status.","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.request_sign_in","kind":"act","impl":"imperative","description":"Open Cadding’s sign-in page and return to the editor afterward. The user must complete sign-in in the browser; never ask for or pass passwords, OTPs, recovery codes, or tokens to this tool.","title":"request sign in","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"request_sign_in","description":"Arguments for request_sign_in.","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.list_projects","kind":"answer","impl":"imperative","description":"List projects owned by the signed-in user, including public sharing metadata.","title":"list projects","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"list_projects","description":"Arguments for list_projects.","properties":{"limit":{"type":"number","description":"Maximum projects to return (1–200).","default":50}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.open_project","kind":"act","impl":"imperative","description":"Open a saved project owned by the signed-in user in the current editor session.","title":"open project","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"open_project","description":"Arguments for open_project.","properties":{"projectId":{"type":"string","description":"Saved Cadding project ID."}},"required":["projectId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.save_project","kind":"act","impl":"imperative","description":"Save the live editor scene to the signed-in user’s Cadding account. Call this before publishing so the public model contains the latest edits.","title":"save project","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"save_project","description":"Arguments for save_project.","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.set_project_public","kind":"act","impl":"imperative","description":"Publish or unpublish the active saved project. When publishing, returns a durable publicUrl that the agent should send to the user. Requires sign-in and a successful save_project call first.","title":"set project public","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"set_project_public","description":"Arguments for set_project_public.","properties":{"isPublic":{"type":"boolean","description":"True to publish and obtain a public URL; false to make the project private."},"publicSlug":{"type":"string","description":"Optional requested public slug. Omit to retain or generate the project slug."}},"required":["isPublic"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.export_model","kind":"act","impl":"imperative","description":"Export the live model. Signed-in users receive a durable public download URL saved in Exports; guests can request a browser download but do not receive a durable URL.","title":"export model","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"export_model","description":"Arguments for export_model.","properties":{"format":{"type":"string","description":"Export file format. Use stl-package for one STL per printable component plus an assembly guide.","enum":["stl","stl-package","3mf","glb","step","iges","x_t","x_b","gerber"],"default":"stl"},"download":{"type":"boolean","description":"Also start a browser download for the user.","default":false}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.generate_ai_mesh","kind":"act","impl":"imperative","description":"Generate a controlled AI mesh and add it to the live scene. Use for explicit organic, character, sculpture, figurine, relief, logo, or decorative geometry that is inefficient to model parametrically. Requires sign-in. The realization declares whether the result is decorative or intended for later manufacturing validation.","title":"generate ai mesh","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"generate_ai_mesh","description":"Arguments for generate_ai_mesh.","properties":{"prompt":{"type":"string","description":"Text description of the mesh to generate."},"imageUrl":{"type":"string","description":"Source image URL. Use prompt or imageUrl, not both."},"name":{"type":"string","description":"Display name for the generated part."},"quality":{"type":"string","description":"Generation quality.","enum":["draft","standard","high"]},"realization":{"type":"string","description":"Mesh role. Decorative meshes remain separate visual parts; manufacturing candidates require validation before print or boolean operations.","enum":["decorative_mesh","manufacturing_candidate"],"default":"decorative_mesh"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.generate_mold","kind":"act","impl":"imperative","description":"Generate a multi-part mold around one target part.","title":"generate mold","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","title":"generate_mold","description":"Arguments for generate_mold.","properties":{"targetPartId":{"type":"string","description":"Stable ID of the part to inspect or modify."},"partCount":{"type":"number","description":"Number of mold pieces (2–8).","default":2},"axis":{"type":"string","description":"Primary mold split axis.","enum":["x","y","z"]},"marginMm":{"type":"number","description":"Margin around the source body in millimeters."}},"required":["targetPartId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]},{"name":"cad.capture_viewport","kind":"act","impl":"imperative","description":"Capture the current editor viewport, a standard view, or a crop of one visible part as an image data URL.","title":"capture viewport","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","title":"capture_viewport","description":"Arguments for capture_viewport.","properties":{"view":{"type":"string","description":"View to capture.","enum":["current","top","front","side","isometric"],"default":"current"},"targetPartId":{"type":"string","description":"Optional visible part ID to crop around."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/editor","pages":["/editor"]}],"category":"AI & Agents","favicon":"/favicons/cadding.io.png","apiSurface":"spec","toolCount":60}}