Skip to main content
Glama

Server Details

Agent-first CAD: editable .kcad.ts source, deterministic review, OpenCASCADE kernel.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
98.0% over 57 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
w1ne/kernelCAD-web
GitHub Stars
29
Server Listing
kernelCAD

TDQS

A3.9/5.0

Scored across 56 tools

Disambiguation3/5

Many add_* authoring tools target distinct entities (connector, mate, part, surface, curve), but the generic add_feature overlaps with all of them, and there are competing clusters: evaluate_script vs design_loop vs execute_cookbook vs mesh_summary, and get_latest_render vs render_preview vs open_in_studio vs get_model_mesh for viewing. The single dispatcher tools (inspect, export, verify, query) use an 'of'/'check'/'mode' selector that keeps sub-operations under one name but can obscure which specific operation is wanted. Descriptions are unusually detailed, which mitigates but does not eliminate the overlap.

Naming Consistency4/5

Nearly everything is snake_case verb_noun (add_connector, get_project, lookup_api, diff_scripts, solve_mates), and the dispatcher tools consistently use a single verb (inspect, export, verify, query). Minor deviations exist — why_did_this_fail is a question phrase and some names are noun_verb (mesh_to_features, drawing_to_cad) — but overall the pattern is readable and predictable.

Tool Count2/5

56 tools is very heavy, well past the 25+ threshold where the surface becomes hard to navigate in one context. The domain is genuinely broad (authoring, evaluation, rendering, export, FEA, mesh, parts, projects, verification), which justifies more than a handful, but the count is bloated by overlapping clusters that could be consolidated.

Completeness5/5

The surface covers the full lifecycle: script authoring (add_*, set_param), evaluation and repair (evaluate_script, repair_script, why_did_this_fail), inspection, verification, mate solving, rendering, animation, FEA, mesh reconstruction, and a wide range of export formats. There are no obvious dead ends for the stated CAD domain.

Available Tools

58 tools
add_connectorAdd ConnectorInspect

Use this when you need to add a mate connector to a part. Durably insert <partBinding>.connector(name, { type, origin, axis?, normal? }) before the final top-level return. Use the part binding returned by add_part. Returns modified source plus diagnostics from re-evaluation. Side-effect-free.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNoOptional [x, y, z] axis.
codeYesThe .kcad.ts source code.
nameYesConnector name unique within the part.
typeYes
normalNoOptional [x, y, z] normal.
originYesOrigin as [x, y, z] shorthand, or a structured ConnectorOrigin.
part_bindingYesJS identifier bound to an AssemblyPartRef, e.g. "basePart".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_constraintAdd ConstraintInspect

Use this when you need to add a sketch constraint to a list. Append one validated sketch constraint to a constraint list. Side-effect-free: pass { constraints, constraint } and receive the updated list.

ParametersJSON Schema
NameRequiredDescriptionDefault
constraintYesThe constraint to append.
constraintsNoExisting constraint list to append to (omit for an empty list).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_curveAdd CurveInspect

Use this when you need a freeform/organic 3D curve — a body feature line, brow, spine rail, or G2 blend between panels — authored as a Curve3D into the user's .kcad.ts immediately before the last top-level return. One authoring path, selected by kind:

  • 'nurbs' — insert a nurbsCurve(controlPoints, opts?) declaration. Pass controlPoints as a Vec3[] (mm, at least 2 points). Optional NURBS knobs: degree (default 3), rational weights, explicit knots, closed.

  • 'hermite' — insert a hermiteG2(a, b) declaration: a quintic Hermite curve interpolating two endpoints with matching positions, tangents, and (optional) curvatures — bridges two curves with G2 continuity. Each endpoint is { point: Vec3, tangent: Vec3, curvature?: Vec3 } in mm; tangent magnitude ~ chord length; curvature defaults to [0,0,0] (G1-only). The returned binding has type Curve3D (peer to Shape / Surface) — consume it via add_variable_sweep (spine input), add_surface({ kind: 'boundary' }) (boundary curve), or downstream Curve3D-accepting features. Returns the modified code + diagnostics from re-evaluating. Side-effect-free. Each kind fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNokind:'hermite' — start endpoint.
bNokind:'hermite' — end endpoint.
codeYesThe .kcad.ts source code.
kindYesWhich curve-construction path to use.
knotsNokind:'nurbs' — optional explicit knot vector; missing => clamped-uniform inferred.
closedNokind:'nurbs' — optional periodic/closed-curve flag.
degreeNokind:'nurbs' — curve degree; default 3 (cubic).
weightsNokind:'nurbs' — optional rational weights, one per control point (same length as controlPoints).
binding_nameNoJS const name for the new Curve3D binding (default: _curve_<N>).
controlPointsNokind:'nurbs' — control points as Vec3 triples in mm; at least 2 entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_featureAdd FeatureInspect

Use this when you need to insert a new feature line into a script. Insert a new feature line into a kernelCAD script before the last top-level return statement. Returns the modified code as text plus diagnostics from re-evaluating the result. Side-effect-free. Primitives that accept faceLabels (box, cylinder, extrudeRect, extrudeCircle, extrudePolygon, extrudeRoundedRect) can receive opts.faceLabels in the inserted code — use lookup_api to see featureKindFaceLabels for the full value schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
feature_codeYesSingle-statement source line to insert (e.g. `const hole = cylinder(5, 2).translate(10, 10, -1);`).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_mateAdd MateInspect

Use this when you need to author a mate-graph relationship into the source, selected by relation (default 'mate'):

  • 'mate' — a typed mate between two connectors ({ name, a, b, type, pose?, limitsDeg?, limitsMm? }).

  • 'coupling' — couple a driven mate to a source mate by ratio ({ driven, source, ratio, offset? }).

  • 'transmission' — a physical drive path across mates ({ name, kind, sourceMate, drivenMates, path, ... }). All durably edit source and need { code, assembly_binding }. Params other than relation are forwarded verbatim; each relation fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNorelation:'mate' — connector ref "<partName>.<connectorName>".
bNorelation:'mate' — connector ref "<partName>.<connectorName>".
codeYesThe .kcad.ts source code.
kindNorelation:'transmission' — transmission kind.
nameNorelation:'mate'|'transmission' — name unique within the assembly.
pathNorelation:'transmission' — drive path.
poseNorelation:'mate' — optional mate pose.
typeNorelation:'mate' — mate type.
inputNorelation:'transmission' — optional input.
notesNorelation:'transmission' — optional notes.
ratioNorelation:'coupling' — driven pose = source pose * ratio + offset.
drivenNorelation:'coupling' — driven mate name.
offsetNorelation:'coupling' — optional pose offset.
outputNorelation:'transmission' — optional output.
sourceNorelation:'coupling' — source mate name.
actuatorNorelation:'transmission' — optional actuator.
limitsMmNorelation:'mate' — optional [minMm, maxMm].
relationNoWhich relationship to author (default 'mate').
limitsDegNorelation:'mate' — optional [minDeg, maxDeg].
sourceMateNorelation:'transmission' — source mate name.
drivenMatesNorelation:'transmission' — driven mate names.
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_partAdd PartInspect

Use this when you need to add a part to an assembly. Durably insert const <binding> = <assembly>.part(partName, shapeExpression, opts?) before the final top-level return in a kernelCAD source string. Returns modified source plus diagnostics from re-evaluating it. Side-effect-free: caller persists the returned source.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoOptional [x, y, z] assembly placement.
codeYesThe .kcad.ts source code.
part_nameYesAssembly-unique part name.
binding_nameNoOptional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier.
assembly_bindingYesJS identifier bound to assembly(...), e.g. "arm".
shape_expressionYesJS expression for the Shape to pass to assembly.part, inserted verbatim.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_path_segmentAdd Path SegmentInspect

Use this when you need a freeform/organic 2D outline — an eyewear brow, ergonomic grip, sneaker midsole, or body silhouette — by appending a curved segment to an existing PathBuilder chain on the named chain_anchor variable. The call is injected at the END of the chain, immediately before any .close(). One segment kind, selected by kind:

  • 'spline' — .spline(points, opts?): interpolates through every points waypoint (Vec2[] mm, >= 2 entries; points[0] must match current pen position). Optional tension, and startTangent/endTangent 2D direction vectors that constrain the first-derivative direction at the endpoints (magnitude normalised internally). Use for organic 2D outlines (eyewear brow, ergonomic handle, sneaker midsole).

  • 'nurbs' — .nurbsSegment(controlPoints, opts?): explicit B-spline net (Vec2[] mm, >= degree+1 entries; controlPoints[0] must match pen; pen ends at controlPoints[N-1]). Optional degree (default 3), rational weights (strictly positive), explicit knots (length = controlPoints.length + degree + 1).

  • 'hermite' — .hermiteG2(a, b): each endpoint { point: Vec2, tangent: Vec2, curvature?: Vec2 } in mm (a.point must match pen; pen ends at b.point). curvature defaults to [0,0] (G1); pass matching curvatures for G2 blends. Tangent magnitude is the first derivative (~ chord length), NOT unit length. Returns the modified code + diagnostics from re-evaluating. Side-effect-free. Each kind fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNokind:'hermite' — start endpoint; point must match current pen position within 1e-6 mm.
bNokind:'hermite' — end endpoint; pen ends at b.point.
codeYesThe .kcad.ts source code.
kindYesWhich path-segment kind to append.
knotsNokind:'nurbs' — optional explicit knot vector; length must equal controlPoints.length + degree + 1.
degreeNokind:'nurbs' — B-spline degree (default 3).
pointsNokind:'spline' — waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position.
tensionNokind:'spline' — optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation.
weightsNokind:'nurbs' — optional rational weights (one per control point; strictly positive).
endTangentNokind:'spline' — optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters.
binding_nameNoReserved for future use; the segment injection mutates the chain anchor in place.
chain_anchorYesJS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`).
startTangentNokind:'spline' — optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters.
controlPointsNokind:'nurbs' — control-net vertices as Vec2 pairs in mm; at least degree+1 entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_pattern_featureAdd Pattern FeatureInspect

Use this when you need to repeat a feature in a pattern. Insert a Shape.patternLinear / .patternCircular / .patternGrid call into a kernelCAD script before the last top-level return. Pass structured args (kind + the matching spec object). Returns the modified code plus diagnostics from re-evaluating. Side-effect-free. The pattern feature is a single editable unit; pattern-instance face refs resolve via <sourceId>_pattern_<i> on the pattern feature's lineage. Geometric note: pattern is implemented as cumulative boolean union of transformed source copies — additive features (boxes, ribs, fins, spokes) pattern cleanly; patterning a subtractive feature (hole, cutout) only preserves the per-instance void when adjacent bodies are disjoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
gridNoRequired when kind=grid.
kindYes
linearNoRequired when kind=linear.
targetYesVariable name of the Shape to pattern (inserted verbatim as the LHS receiver).
circularNoRequired when kind=circular.
assign_toNoOptional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_surfaceAdd SurfaceInspect

Use this when you need an organic, freeform, or swept shape — a body shell, panel, fairing, ergonomic curve, lens, or sculpted form — authored as a NURBS Surface into the user's .kcad.ts, OR when you need to finish surfaces into a watertight solid or taper faces for moldability. One authoring/finishing path, selected by kind:

  • 'nurbs' — insert a nurbsSurface(...) / surfaceFromCurves(...) call. Pass either { controls, degree, weights?, knots?, periodic? } for direct construction, OR { section_sketch_ids } for skinning. Weights are honored: supply rational weights to build exact circles/cylinders/spheres/conics (the surface becomes rational); omit weights for a non-rational surface.

  • 'boundary' — insert a surfaceFromBoundary([c1,c2,c3,c4], opts?) call: one NURBS face through 4 boundary Curve3D refs (bottom, right, top, left in loop order; adjacent endpoints must coincide within 1e-6 mm).

  • 'trim' — insert a <surface>.trimTo(<by>) or <surface>.split(<by>) call. Pass surface_binding (the Surface variable name), by_binding (the cutter Surface variable name; Shape/Curve3D cutters are deferred to a later slice), and op: 'trim' (keep the largest imprinted piece) or op: 'split' (return both halves as a [Surface, Surface] tuple).

  • 'sew' — insert a sew([s0, s1, ...], opts?) call to stitch N surfaces into a closed watertight solid. Pass surface_bindings (array of Surface variable names). Use after trim/boundary to close patches into a solid: trim → sew → solid pipeline. Optional tolerance (mm, default 1e-6) and require_closed (emits feature.surface-sew.open-shell if result is not watertight).

  • 'draft' — insert a <shape>.draft(angleDeg, { face, neutralPlane?, pullDir? }) call to taper the selected face(s) for mold release. Pass shape_binding, angle_deg (0–90), and face (canonical name, label, or FaceQuery descriptor). Lowering emits feature.draft.failed on invalid geometry. The returned Surface produces no Shape until you chain .thicken(t) or .toShape() (do that via add_feature on the binding name). Returns the modified code + diagnostics. Each kind fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNokind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).
codeYesCurrent .kcad.ts source.
faceNokind:'draft' — face selector for the face(s) to taper. Accepts a canonical name (top/bottom/front/back/left/right), a user label declared via faceLabels, or a FaceQuery descriptor string.
kindYesWhich surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'.
knotsNokind:'nurbs' — optional explicit knot vectors; missing => clamped uniform inferred.
degreeNokind:'nurbs' — degrees in U and V; each in [1, nU-1] / [1, nV-1].
weightsNokind:'nurbs' — optional rational weights, same grid shape as controls. Ignored in slice-1.
controlsNokind:'nurbs' — control-point grid for direct construction (controls[u][v] = [x, y, z], mm).
periodicNokind:'nurbs' — optional periodic flags per parametric direction.
pull_dirNokind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time.
samplingNokind:'boundary' — points sampled along each boundary (default 15).
angle_degNokind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction.
toleranceNokind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged.
by_bindingNokind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.
continuityNokind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge, bottom/right/top/left order). Default 'C0'.
binding_nameNoJS const name for the new binding (kind:'nurbs' default surface_<N>; kind:'boundary' default _surface_<N>; kind:'trim' default _trimmed_<N>; kind:'sew' default _sewn_<N>; kind:'draft' default _drafted_<N>).
neutral_planeNokind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.
shape_bindingNokind:'draft' — JS variable name of the Shape to taper (must be declared in source).
curve_bindingsNokind:'boundary' — tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source.
require_closedNokind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid.
surface_bindingNokind:'trim' — JS variable name of the Surface to trim/split (must be declared in source).
surface_bindingsNokind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source).
section_sketch_idsNokind:'nurbs' — existing sketch FeatureIds (2 or more) to skin a surface through, in order.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_textAdd TextInspect

Use this when you need to author text into a kernelCAD script before the last top-level return. One authoring path, selected by mode:

  • 'sketch' — insert a sketch.text(...) call. The emitted sketch is chainable: pair with subsequent .extrude(...) / cut(...) edits to land an engraved or raised text feature.

  • 'emboss' — insert a <shape>.embossText({...}) chained call onto an existing Shape target. Use for engraved brand text on faces (Ray-Ban temple, CE mark, model number). depth > 0 raises text out of the face; depth < 0 engraves text into the face. Lowers via replicad drawText → sketchOnFace → extrude → fuse|cut. Default font is the runtime-bundled Liberation Sans. Side-effect-free; returns the modified code plus diagnostics from re-evaluating. Each mode fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
faceNomode:'emboss' — target face — canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label.
fontNomode:'sketch' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
modeYesWhich text-authoring path to use.
sizeNomode:'sketch'|'emboss' — glyph cap height in mm (positive finite).
alignNomode:'sketch' — horizontal alignment relative to position (default left); mode:'emboss' — relative to the UV anchor (default center).
depthNomode:'emboss' — signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero.
bindAsNomode:'sketch' — emits `const <bindAs> = sketch.text(...)`; mode:'emboss' — emits `const <bindAs> = <target>.embossText(...);`.
targetNomode:'emboss' — variable name of the Shape to chain onto (inserted verbatim).
anchorUNomode:'emboss' — U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5.
anchorVNomode:'emboss' — V anchor in [0, 1] face-local. Default 0.5.
contentNomode:'sketch' — text content (UTF-8, non-empty, non-whitespace).
positionNomode:'sketch' — [x, y] anchor in mm. Default [0, 0].
rotationNomode:'sketch' — CCW rotation in degrees around position (default 0); mode:'emboss' — CCW rotation in the face tangent plane (default 0).
scaleModeNomode:'emboss' — Drawing.sketchOnFace scaling mode. Default original.
fontFamilyNomode:'emboss' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
textContentNomode:'emboss' — text content (UTF-8, non-empty, non-whitespace).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_variable_sweepAdd Variable SweepInspect

Use this when you need an organic swept solid whose cross-section changes along its length — a tapering body, horn, bottle, fairing, or duct — authored as a variable-section sweep along a spine. Insert a variableSweep(spine, sections, opts?) declaration into the user's .kcad.ts immediately before the last top-level return. The result is a Shape — chain .translate(...), .union(...), etc. via add_feature. spine_binding references an existing variable (Curve3D / Sketch / Vec3[]) in the source; each sections[i].profile_binding references an existing Sketch. Sections must be strictly increasing in t and span [0, 1]; first t=0, last t=1. Orientation is not exposed by this MCP tool until runtime orientation support is wired. Validates every binding exists in the source via regex before inserting (fast structured error vs capture-time stack). Returns the modified code + diagnostics. Side-effect-free.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
closedNoOptional closed-sweep flag.
sectionsYesVarying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1.
continuityNoInter-section continuity; default 'C1'.
binding_nameNoJS const name for the new Shape binding (default: _sweep_<N>).
spine_bindingYesExisting variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

add_workspace_targetAdd Workspace TargetInspect

Use this when you need to declare a reachability target for a connector. Durably insert <assembly>.workspace(connectorRef, { reachable, toleranceMm? }) before the final top-level return. Workspace targets are checked by solvedModel validation/review pose-envelope gates. Returns modified source plus diagnostics from re-evaluation.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
reachableYesWorld-frame Vec3 targets the connector must be able to reach.
toleranceMmNoOptional non-negative tolerance in mm.
connector_refYesConnector ref "<partName>.<connectorName>".
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

capture_animationCapture AnimationInspect

Use this when you need to render a script's animation timeline to a video, or a 360° turntable of a model for sharing. Capture a kernelCAD script's animationView({...}) timeline to an MP4 (ffmpeg) or a PNG frame sequence, verifying the sampled poses for part interference. FILE ONLY: pass { file } (a .kcad.ts path) — there is no { code } mode, because the capture engine renders from a file on disk (its relative lib.fromSTEP imports resolve against the script directory). MP4 by default; pass { frames_dir } to write frame-0000.png... and skip ffmpeg entirely (mutually exclusive with output_path). Animation-pose interference verification runs by default (keyframe times + segment midpoints) BEFORE any browser/ffmpeg cost; { no_verify: true } skips it and { verify_every: n } additionally samples every n-th frame time. Pass { focus } or { hide } (arrays of feature ids or assembly part names, mutually exclusive) to isolate parts in the rendered frames — same semantics as kernelcad render --focus/--hide; visibility is render-only and does NOT affect the pose verification. Collisions DO NOT fail the call — the artifact is still written as evidence with ok: true; read verified: false + the collisions[] array. TURNTABLE MODE: pass { turntable: true } for a seamless 360° orbit of the model (no animationView record needed) — a share-ready loop for a README, social post or product page. It uses the 'publish' studio look by default (same as render_preview preset: 'publish': key/fill/rim lights, soft contact shadow, clean backdrop, 30° lens, constant auto-framing over the whole orbit, light rig turns with the camera); { preset: 'default' } keeps the engineering look. Knobs: width/height (default 1080×1080, max 2048, even for MP4), duration_ms (one revolution, default 6000), fps (default 30), elevation_deg (default 22), background ('white' default, 'light', 'dark', 'black', '#rrggbb', or 'transparent' with frames_dir only), shadow (default true), environment. output_path ending in .gif writes a looping GIF; otherwise MP4. Frame i sits at az 30° + 360°·i/N (the 360° endpoint is excluded, so the loop is seamless). A turntable has no poses to verify: it reports verify_skipped: true. ENVIRONMENT: needs playwright chromium (npx playwright install chromium) and ffmpeg for MP4/GIF (frames_dir needs neither); the bundled static player is served automatically, no dev server required. Returns { ok, output_path, frame_count, duration_ms, fps, verified, verify_skipped?, collisions: [{ t_ms, a, b, volume_mm3 }], diagnostics }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoOverride the animationView record's fps.
fileYesPath to a .kcad.ts script with an animationView({...}) record (any script in turntable mode). Required (no inline { code } mode). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
hideNoHide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification.
focusNoShow only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification.
widthNoTurntable frame width in px (default 1080; even for MP4).
heightNoTurntable frame height in px (default 1080; even for MP4).
presetNoTurntable look: 'publish' (default; studio product shot) or 'default' (engineering look).
shadowNoTurntable + publish: soft contact shadow under the model (default true).
no_verifyNoSkip the animation-pose interference verification (default: verify on).
turntableNoSeamless 360° orbit of the model instead of the animationView timeline.
backgroundNoTurntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only — MP4/GIF have no usable alpha).
frames_dirNoPNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path.
duration_msNoTurntable: one full revolution in ms (default 6000).
environmentNoTurntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none').
output_pathNoMP4 output path (.gif → looping GIF); default <scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir.
verify_everyNoAdditionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set).
elevation_degNoTurntable: camera elevation above the horizon in degrees (default 22).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

design_loopRun Design LoopInspect

Use this when the goal is complex / production / enclosure / gearbox / robot-arm / multi-body, or when you need evaluate→review/verify→revise until green. PREFERRED over one-shot evaluate_script+open_in_studio for Adam-level parts. Runs a CAD design loop over attempt scripts: review_cad each attempt, continue past functional attempts with unresolved warnings, return repair prompts (nextActionPrompt) plus structured revisionAssist (suggestedPatches / autoApplied.suggestedCode for repairable feature failures; cookbook steers for stacked-primitive toys). Stop on ok or convergence.escalate. To pick among N alternative candidates for one goal without a judge, pass them all as attempts with consensus:true (geometric medoid selection). For organic/car bodies set likenessProfile:"automotive" and pass bodyLikeness (or automotive stills on visualReview.checks) — attempts fail closed until body-likeness is publishReady. Optionally write a Studio build record JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYesOriginal user design goal. Fed into every review_cad repair prompt.
assemblyNo
attemptsYesOrdered design attempts. Each item is { id?, title?, file? OR code?, visualReview? } — provide file or code (at least one). File attempts can be replayed by Studio build records.
consensusNoBest-of-N by geometric consensus. When true, attempts are N independent candidates for the SAME goal (not a repair sequence): all are reviewed (stopOnPass ignored), all scripts are executed, candidates without a valid solid are dropped, and the candidate whose geometry agrees most with the others (medoid by symmetric Chamfer distance, same model frame) is selected. Ties go to more gates passed, then the shorter script. Returns consensus { chosenIndex, chosenAttemptId, scores, distances, reason }; ok / finalAttemptId / nextActionPrompt describe the selected candidate. Default false.
autoReviseNoWhen true (default), failing attempts with repairable feature diagnostics (boolean miss, oversized fillet, …) run bounded repair_script and attach revisionAssist.suggestedPatches / autoApplied.suggestedCode. Set false to skip the extra repair pass (hints-only). Does not autonomously rewrite full CAD models.
epsilonMm3NoForwarded to review_cad.
stopOnPassNoStop after the first attempt that is functional and passes the quality gate. Default true.
recordTitleNoOptional title for the build record.
bodyLikenessNoWhen likenessProfile=automotive: body_bbox (required for gate), wheels, cabin_bbox, still_verdicts. Missing body_bbox fails with reference.likeness.gate-required. Stills may also come from visualReview.checks.
combinatorialNoSample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false.
samplesPerMateNoPose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate.
gripperApertureNoOptional gripper aperture request forwarded to review_cad.
likenessProfileNoWhen 'automotive', require organic-body still checks on visualReview AND the body-likeness publish gate (pass bodyLikeness or stills on checks). Attempts stay non-ok until publishReady. Final open_in_studio must pass likeness_profile:'automotive' (server hard-gates success).
trackConnectorsNoConnector refs to track across sampled poses.
outputRecordPathNoOptional JSON path to write a Studio-compatible build record.
preserveInterfacesNoExternal mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts.
allowReviewWarningsNoWarning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok.
includeInterferenceNoForwarded to review_cad. Default true.
includePoseEnvelopeNoForwarded to review_cad. Default true.
requireVisualReviewNoRequire screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks.
requirePhysicalAcceptanceNoRequire declared physicalUseCase common-pose reachability and pose-bound quasi-static certification before accepting an attempt. Design-loop also enables this automatically when an attempt script calls physicalUseCase(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

diff_geometryDiff Model Geometry
Read-only
Inspect

Use this when you need to know WHAT MATERIAL changed between two versions of a model, not just how much. The deeper sibling of diff_scripts: a volume delta alone is ambiguous (a boss that grew and a pocket that deepened report the same magnitude, and a part that only moved reports zero), so this tool answers it with geometry instead of pixels. Baseline is { baseFile } or { baseCode }; the revised side is either another script ({ file } or { code }) or the SAME script re-lowered with { params } overrides — a bag of declared param() name -> new value, which is the one-script form a parameter sweep actually asks for. Bodies pair by name and fall back to declaration-order positional pairing; anything left over is listed in unmatched and raises diff.body.unmatched. Per matched body it returns addedMm3 = volume(revised - base), removedMm3 = volume(base - revised), commonMm3 = volume of the overlap from boolean intersection, exact bbox with min/max/extent deltas, face / edge / hole count deltas (hole counts reuse the cylindrical-hole detector), maxDeviationMm (two-sided discrete Hausdorff distance between the two surfaces), and a verdict — identical | moved | resized | topology-changed, precedence topology-changed > resized > moved > identical. Branch on the verdict; cite the numbers. Optional { render: true } also writes an overlay PNG (added green, removed red, unchanged material as a translucent ghost; the scene is a re-runnable .kcad.ts over lossless BREP sidecars) through the render_preview pipeline and fails open (the numeric diff is still returned) when that pipeline is unavailable. Read-only — never touches the active session.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoRevised script — inline source. Mutually exclusive with params.
fileNoRevised script — path to a .kcad.ts file. Mutually exclusive with params. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
paramsNoParam-override mode: re-lower the BASELINE with these declared param() values changed (e.g. { plateThickness: 8 }). Mutually exclusive with file/code. A name the baseline does not declare fails with the declared-param list in the message.
renderNoAlso render an overlay PNG — added material green, removed material red — via the render_preview pipeline. Off by default; the numeric table is the agent-facing evidence.
out_dirNoDirectory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir.
baseCodeNoBaseline script — inline source.
baseFileNoBaseline script — path to a .kcad.ts file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

diff_scriptsDiff CAD Scripts
Read-only
Inspect

Use this when you need to see exactly what changed between two script versions. Structured geometric delta between two versions of a kernelCAD script — a baseline ({ baseFile } or { baseCode }) and a revision ({ file } or { code }). Returns agent-readable JSON: per-part added/removed/renamed/changed (volume mm³ + exact bbox deltas, numbers matching inspect({ of: 'part-stats' })), total interference-volume delta with per-pair detail, mate-graph changes (added/removed/changed mates incl. type, connectors, pose, limits), and param changes (value/min/max). Single-shape scripts diff as one "(root)" pseudo-part. Use after editing a script to verify exactly what changed physically before re-rendering. Read-only — never touches the active session.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoRevised script — inline source.
fileNoRevised script — path to a .kcad.ts file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
baseCodeNoBaseline script — inline source.
baseFileNoBaseline script — path to a .kcad.ts file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

drawing_to_cadConvert Drawing to CADInspect

Use this when the reference for a part is a 2D engineering drawing PDF (orthographic views with dimensions), not a photo. Deterministic, no vision model: reads the vector linework (stroke width, dash) and positioned text; classifies visible / hidden / center / dimension / extension lines; reads the title block scale, units and projection symbol; identifies front / top / side views by projection alignment (third- or first-angle); ties dimension text to its lines (⌀, R, 4×, ±, THRU, depth). Dimension values win over measured lengths. Rebuilds the part as the view silhouette extruded by the depth an orthogonal view shows, or a turned part revolved from its half-silhouette, plus holes from ⌀ circles with THRU or hidden-line depth. Returns script — a .kcad.ts with role-named params (width, thickness, holeDia, hole1X, dia1, step1Length …) — and ledger, an assumption ledger where stated dimensions are visible, symmetry-derived positions inferred, defaults assumed and an unstated depth missing; a dimension that disagrees with the linework keeps its value and records the disagreement as an open fact. With verify (default) the script is evaluated, re-projected through the svg-drawing view stage and compared: fidelity.verdict is match | partial | mismatch | failed with per-axis extents, hole diameters and per-view silhouette IoU. Pass out to write the script and its <stem>.ledger.json (resolve open facts with resolve_assumptions, then set_param). A scanned (raster-only) page fails with reference.drawing.raster-only — use trace_from_image for those. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoWrite the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json.
pageNo1-based page to read. Default 1.
pathNoPath to the drawing PDF on the machine running kernelCAD. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine.
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
verifyNoEvaluate the rebuilt part and compare it with the drawing. Default true.
pdfBase64NoThe PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server.
projectionNoOverride the projection angle read from the sheet (default: projection symbol or note, else third-angle).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

evaluate_scriptEvaluate CAD Script
Read-only
Inspect

Use this when you need to run a script and check it compiles. Run a kernelCAD .kcad.ts script and report pass/fail + feature count + diagnostics. When the scene is assembly-built (assembly().part(...) → .model()/.solvedModel()), also returns a parts summary { count, names } AND runs the mechanism-truth gate by default: the mechanism field reports real/broken/unverified and a broken mechanism (disconnected components / mechanism.orphan-part, self-collision, fastened drift, dof-mismatch) makes ok:false with the failures in diagnostics — a mechanism (any mate, joint, transmission or .solvedModel()) needs every part linked by connectors + mates/joints (axis+revolute for shafts/hinges/gears; frame+fastened for rigid; or arm.revolute/.prismatic/.ball/.fixed). A plain multi-part assembly with no mates (base + lid, print layout) is independent bodies and passes. Pass { skipMechanismCheck: true } to opt out (e.g. a deliberately free part next to a mechanism). Every union() is checked too (no opt-out): union.disconnected (the union is several separate solids — a floating operand) and union.member-overlap (two operands that each carry their own .finish()/.material(), the same one, share > 1 mm³ — cut members to fit, e.g. a cross tube between rails is span minus two rail widths) make ok:false. Pass either { file: "" } or { code: "" }. Set { dryRun: true } for fast validation while iterating: transpile + capture + capture-light checks without building solids, DFM gates, or meshing — milliseconds instead of seconds (100x+ on boolean/fillet-heavy scripts). A dry run catches script throws, capture-time API misuse, and assembly validity-gate failures, but NOT lowering failures or dfmSpec diagnostics; it leaves the active session untouched, so finish with a full (non-dry) evaluate_script before using session-dependent tools. To show a measurement in the 3D viewer (e.g. hole spacing), declare it in the script with shape.dimension({ kind: "linear", from, to, label }); a full evaluate lists them as dimensions: [{ text, kind, source }], and a shared /p link with ?dims=1 forces them on. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG and referenceImage accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
dryRunNoFast validation only: skip solid build, DFM gates, and meshing. Does not set or clear the active session.
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
skipMechanismCheckNoOpt out of the default mechanism-truth gate. By default a full evaluation of an assembly-built scene runs checkMechanismTruth and returns a `mechanism` verdict (real/broken/unverified); a broken mechanism makes ok:false. Set true to skip the sweep entirely (no `mechanism` field, no cost). Ignored for dryRun and non-assembly scripts.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

evaluate_sdfEvaluate SDF
Read-only
Inspect

Use this when you need to sample a signed-distance field at a point. Sample the signed distance from an in-script sdf.* field at a 3D point. Returns { distance, inside, aabb, kind }. Distance is in mm; negative = inside the surface, 0 = exactly on the surface, positive = outside. Use this to verify SDF composition before calling sdf.materialize (which is the expensive step). The script must bind the SdfField via sdf.bind('', field) and pass that name as fieldName. Hint: pass either { file } or { code }, plus { fieldName, point: [x,y,z] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
pointYesSample point [x, y, z] in mm.
fieldNameYessdf.bind binding name holding the SdfField.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

execute_cookbookExecute CookbookInspect

Use this when you need evaluate_script (and optionally open_in_studio) for an industry / cookbook demo in ONE step — after lookup_cookbook for industry demos, prefer execute_cookbook when you need evaluate+Studio together; empty lookup is not a stop (freehand-author instead). Resolves a cookbook snippet by id or BM25 query (same ranking as lookup_cookbook), evaluates its body via evaluate_script with bounded vendor timeouts, and returns explicit status with stage resolve|evaluate|open_in_studio. Pass openInStudio:true to publish the same script via open_in_studio after a green full evaluate (hosted MCP). dryRun:true is the fast capture-only path — it is NOT evidence the cookbook builds a solid or is safe to publish; finish with dryRun:false (default) before claiming success or opening Studio.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoCookbook snippet id (e.g. gt2-timing-belt-drive, extrude-rounded-rect-plate).
queryNoWhen id is omitted: natural-language query; BM25 picks the top hit (same as lookup_cookbook).
dryRunNoDefault false. dryRun:true is NOT evidence the cookbook builds a solid — capture-only checks; do not claim success or open Studio from a dry run alone.
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
projectNoSlug of an existing project. Adds a revision to that project. Omit to start a new project when this cookbook or design is different from the one this chat already saved.
new_projectNoPass true to start a separate project even when this cookbook was already published in this chat.
openInStudioNoDefault false. When true, after a green full (non-dryRun) evaluate, call open_in_studio on the same script (hosted MCP).
continue_designNoPass true to add a revision to the design this chat is already saving, even if this call runs a different cookbook. Ignored when `project` is set.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

exportExportInspect

Use this when you need to export geometry to a file. One exporter, selected by target:

  • target:'model' — export the script geometry to one file. Pass { file | code }, a required { output_path }, and { format }. Supported formats: stl (binary STL mesh), step (BREP CAD interchange), dxf (2D cut file for laser / waterjet / CNC: a flat part — plate, panel, extruded profile, in any orientation — exports its outline and holes in its own plane with exact arcs and circles; a sheet-metal part or a returned Region exports its flat pattern; a flat or sheet-metal part also returns sheet { thickness_mm, bend_count }, which a shop needs and the DXF does not carry; options.section { axis: "x"|"y"|"z", at } exports the cross-section of any part in world coordinates (plans, profiles); a multi-part model (cut list) writes all parts side by side on output_path, one layer per part, plus parts/.dxf per part (reported in part_files; options.layout 'sheet' writes the combined sheet only); any other part fails with export.dxf.non-planar), 3mf (slicer-friendly mesh: one named object per part, colours as core-spec basematerials named by the part's engineering material; options.arrange 'plate' packs parts on the bed at Z=0 without overlap (options.orient puts each part's largest flat face down), 'assembled' keeps them together as one multi-part object for multi-colour prints; options.slicer 'bambu' | 'orca' | 'prusa' adds that slicer's per-object name + filament-slot sidecar — slot N is the Nth distinct colour/material), options.infill { fromFea: '' | true, bands?, pattern? } = stress-graded FDM infill (requires the local CalculiX + gmsh toolchain; without it the export fails with fea.solver.unavailable): solves the feaStudy and writes modifier volumes, each with its own infill density (Orca/Bambu format by default; options.slicer 'prusa' writes PrusaSlicer's format instead, since the two are not interchangeable); the result carries infill { bands, saving, images }), gcode (installed OrcaSlicer output; preserves G-code and returns optional gcode_stats with header generator identity and slicer-predicted time/material), glb (web-viewer / AR with PBR materials), svg-drawing (third-angle engineering-drawing sheet: front/top/left + isometric views, hidden edges dashed, tangent edges thin, overall bounding-box dimensions, title block; assemblies are drawn with inter-part occlusion; pass options.annotations to dimension specific features instead of the bounding box; pass options.exploded { factor, mode } to explode the isometric cell, options.balloons to number parts from the BOM, and options.partsList for an item/name/qty/material table above the title block). overall bounding-box dimensions, title block; assemblies are drawn with inter-part occlusion; pass options.annotations to dimension specific features instead of the bounding box, options.autoAnnotate to derive datums A/B/C, grouped hole callouts with position tolerances, hole positions, overall size, radius and chamfer callouts, flatness and an ISO 2768 note from the geometry (the result carries drawing_report with placed / overlapped counts), and options.sections for real section views on any cutting plane). pdf-drawing (the same sheet — views, dashed hidden lines, dimensions, hole callouts, GD&T, sections, parts list — as a printable vector PDF on a standard sheet, one call: ISO a4|a3|a2|a1|a0 or ANSI ansi-a…ansi-e landscape, default a3, or sheet "auto" / "auto-ansi" for the smallest sheet that holds the views at 1:1; the drawing scale is picked to fit; projection "third" (default) or "first" arranges the views and draws the matching symbol; a full title block carries title, part name, material, scale, units, sheet size, date and revision, settable through options.title / partName / material / revision / date; autoAnnotate is on unless options.annotations is given). Robot descriptions: urdf (tree-topology robot description), srdf (motion-planning semantics layered over the URDF), sdf-gazebo (SDFormat 1.10 with native ball joints, closed loops, and solved per-link poses), usd-isaac (ASCII USD physics stage: PhysicsArticulationRootAPI root, one rigid body per link at its solved pose with mass / centre of mass / principal inertia, PhysicsFixedJoint/PhysicsRevoluteJoint/PhysicsPrismaticJoint per mate with token axis, two-sided joint frames and limits, UsdPreviewSurface materials from the part appearance, and joint drives only when declared in options.drives { : { stiffness, damping, maxForce?, targetPosition? } }; options.collisionApproximation is convexHull | convexDecomposition; planar/cylindrical/pin_slot/ball mates fail closed with export.usd.joint-unsupported). bom-csv / bom-json (bill of materials over assembly.model()/solvedModel(): one row per distinct part — grouped by geometry/catalog identity, not name — with real instance quantity, kind, material, density, mass, bbox, process hint, and catalog provenance for purchased parts; same numbers as inspect({ of: 'bom' })). bend-table (tube bender tables over tube() records: one .csv per tube with the LRA bend table, XYZ points, cut length and last straight; output_path is a DIRECTORY and the written files are reported in table_files; a script with no tube() fails with export.bend-table.no-tubes, and a script whose tube gates report errors writes nothing). urdf and sdf-gazebo also write one meshes/.stl per link, and usd-isaac one meshes/.usda mesh layer per link, next to output_path (reported in mesh_files) — ship the whole directory to the consumer. STL exports run a watertight verify by default; failures return ok: false with export.mesh.not-watertight (open-edge count + up to 5 crack-cluster locations) but the file is still written so the broken mesh can be inspected. Optional { feature_id } selects which feature to export (default: last). Optional { options } carries per-format options bag (see the kernelcad-mcp skill for the per-format keys: dxf layers/tolerance/unit/section/layout, 3mf printUnit/embedSource/arrange/orient/slicer/printer/infill, glb axis/draco).

  • target:'part' — export solved-assembly parts as individual binary STL files in their modeled (world-frame) positions. Pass { file | code }, plus { part, output_path } for one part or { output_dir } for all parts (files land at /.stl). A watertight verify runs on every exported mesh by default and fails the call with export.mesh.not-watertight; unknown part names fail with export.part.not-found listing the valid names. Pass { no_verify: true } to skip the watertight gate. All params except target are forwarded verbatim; each target fails closed on its own missing required params. Hosted server: the file is written on the kernelCAD server, NOT on the caller's machine. The result carries downloads[] — an HTTPS url per file (expires after 24 h; give it to the user) — Small text files an agent can read (SVG, DXF, URDF, JSON, CSV; up to 32 KB) also come inline as an embedded resource; STEP, STL, 3MF and GLB are link-only — do not fetch them into your context, give the user the link. output_path only names the file; the returned output_path is a server-side path, usable only as file in later calls to this server. HEAVY FORMATS (step/stl/3mf/glb): if OCCT serialization outlives the client tool-call limit, this tool returns { ok:true, status:"running", code:"export.deferred", job_id } while the export continues on the server — poll by calling export({ job_id }) until status is done/failed. CRITICAL: open_in_studio / paint does NOT need STEP. On export.deferred or any STEP stall, call open_in_studio immediately for the shaded widget; do not block paint on export.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
partNotarget:'part' — part name for single-part export, or 'all'.
formatNotarget:'model' — output file format (required for that target).
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
targetYesWhich exporter to run: 'model' (whole-script geometry to one file) or 'part' (per-part STLs from a solved assembly).
optionsNotarget:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: "mm"|"cm"|"in", tolerance?, section?: { axis: "x"|"y"|"z", at: mm }, layout?: "per-part"|"sheet" }. 3mf: { printUnit?: "mm"|"cm"|"in", embedSource?, arrange?: "none"|"plate"|"assembled", orient?: boolean, slicer?: "generic"|"bambu"|"orca"|"prusa", printer?: printer profile id, one of "generic-fdm"|"bambu-a1-mini"|"bambu-a1"|"bambu-p1s"|"bambu-p1p"|"bambu-x1c"|"bambu-x1e"|"bambu-h2d"|"bambu-h2s"|"prusa-mini-plus"|"prusa-mk4s"|"prusa-core-one"|"prusa-xl"|"creality-ender-3-v3"|"creality-k1"|"creality-k1-max"|"creality-k2-plus"|"elegoo-neptune-4-pro"|"anycubic-kobra-3"|"voron-2.4-250"|"voron-2.4-300"|"voron-2.4-350"|"ultimaker-s5" (default "generic-fdm"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: "y-up"|"z-up", draco?: false }. svg-drawing: { sheet?: "a4"|"a3" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: "linear"|"radius"|"diameter"|"angular"|"note", view?: "front"|"top"|"left"|"iso", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: "xy"|"xz"|"yz"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: "ISO2768-f"|"ISO2768-m"|"ISO2768-c", datums?: "auto"|[{ label, face: FaceQuery }], include?: ["datums"|"flatness"|"holes"|"hole-positions"|"overall"|"fillets"|"chamfers"|"general-tolerance"], dimensioningStyle?: "baseline"|"chain"|"symmetry" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: "a4"|"a3"|"a2"|"a1"|"a0"|"ansi-a"|"ansi-b"|"ansi-c"|"ansi-d"|"ansi-e"|"auto"|"auto-ansi" (default "a3"), projection?: "third"|"first", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: "general"|"machining"|"sheet-metal" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. Functional drawing review: shape.drawingReview(plan) source declarations merge with reviewPlans?: additional plans; decisionResolutions?: { [encodeURIComponent(planId)+":"+encodeURIComponent(decisionId)]: { note, provenance } }. drawing_report.review reports declared geometric-callout coverage and unresolved engineering decisions. requireCompleteReview?: true rejects incomplete/not-declared mechanical reviews before export; architectural style rejects review contracts. Coverage is not engineering certification. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. svg-drawing and pdf-drawing also take style?: "mechanical" (default, the part sheet) | "architectural" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: "metric"|"imperial", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning.
no_verifyNoSkip the STL watertight verify gate.
feature_idNotarget:'model' — optional FeatureId to export; defaults to last.
output_dirNotarget:'part' — destination directory (all-parts mode); files are <dir>/<part>.stl. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link.
output_pathNoDestination path (a directory for format 'bend-table'). target:'model' — the export file (required). target:'part' — single-part .stl path. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

fea_summaryGet FEA Summary
Read-only
Inspect

Use this when you need a structural check's context without paying for a solve. Read-only: returns the stored summary of a previous run_fea (pass the same output_dir), whether the CalculiX + gmsh toolchain is available on this machine (with the install command when it is not), and the FEA material table with real E / Poisson / yield numbers so a grade is chosen against data rather than from memory. Never meshes, solves, or writes.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_dirNoDirectory a previous run_fea wrote to; omit for toolchain status + material table only.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

fetch_partFetch Part
Read-only
Inspect

Fetch one bundled catalog part. Prefer await lib.standard.nema17() and await lib.standard.bearing608() — they are offline and do not download remote STEP. A lookup that cannot finish fails within 45s with errorCode parts.lookup.timeout. Do not retry in parallel.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
queryNo
familyNo
categoryNo
standardNo
partsBaseUrlNoOpt-in remote endpoint; no default value ships with kernelCAD.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

find_partFind Part
Read-only
Inspect

Search the bundled parts catalog (offline). For a NEMA-17 motor write await lib.standard.nema17(); for a 608 bearing write await lib.standard.bearing608(). Do not fan out parallel lookups and do not pass partsBaseUrl unless you set source:"remote". Remote lookups fail within 45s with errorCode parts.lookup.timeout instead of hanging.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
queryNo
familyNo
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
sourceNo
categoryNo
standardNo
partsBaseUrlNoOpt-in remote endpoint; no default value ships with kernelCAD.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

flatten_patternFlatten Sheet-Metal Pattern
Read-only
Inspect

Use this when you need the unfolded flat pattern of a bent sheet-metal part. Return the unfolded 2D flat-pattern of a bent sheet-metal Shape as a Region (outer polyline + holes + bend lines + sketch plane). Slice 1: at most 2 bends. Pass { file } or { code }; optional { featureId } to pick a specific Shape.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
fileNoHosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
featureIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

get_latest_renderGet Latest RenderA
Read-only
Inspect

Render a project's current model server-side and return it as an inline image so you can SEE what you built. Prefer open_in_studio for the happy path — it already includes an iso PNG preview in the same publish result when previewDelivered is true. Use this tool for a different view, a contact sheet (view:"all"), or when you only have a slug and are not publishing. Call with that slug to inspect whether the build looks right. CRITICAL — the image is rendered from the MODEL on the server; it does NOT reflect the user's Studio camera, zoom, or screen. NEVER ask the user to rotate, zoom, pan, move the camera, close a slider, or change their view to help you see — you cannot affect their screen and it cannot affect this render. To see a different angle, call this tool again with a different view. By DEFAULT (omit view, or view:"all") it returns a CONTACT SHEET of all six canonical views in one labeled image — a 3×2 grid, top row [iso, front, right], bottom row [back, left, top] — so you can judge the model from every side regardless of its orientation (e.g. to find which side has the doors). Pass a single view (iso/front/back/left/right/top) for one large render of that angle. DETERMINISTIC: the same model + view always returns the same bytes — identical bytes are NOT a stale/lagging snapshot. If you changed the model, push it with open_in_studio FIRST, then re-render to see the change. The image is always current and never a blank capture. Colors and shading match Studio (same palette / base-material color). The slug is the capability: no OAuth for public/unlisted; private projects require the owner signed in. The PNG is base64-inlined as a real image block by default; pass paths_only: true for metadata only. No renderable geometry or a mesh failure → { ok: false, error, hint }, never a blank image. error "mesh_timeout" means the model took too long to build for a preview; the source is not wrong (it still exports) — do not rewrite it to fix the render.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject slug from open_in_studio/get_project/a /p/<slug> link. The slug is the capability — public/unlisted projects need no OAuth; private projects require the owner to be signed in.
viewNoView to render. Default "all" = a labeled contact sheet of every canonical angle (iso/front/back/left/right/top) — best for judging the whole model. Pass a single view name for one large render of that angle.
paths_onlyNoControls PNG delivery. Default false: base64-inline the rendered PNG so clients that cannot fetch a URL over HTTP (e.g. a sandboxed agent) can still see it. Set true to return only metadata (smaller response).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoWhether a render was produced.
hintNoNext-action hint when ok is false.
viewNoThe view that was rendered (when ok).
bytesNoPNG byte length (when ok).
errorNoError code when ok is false (e.g. "empty_geometry", "mesh_failed", "mesh_timeout").
widthNoRendered image edge in px (when ok).
heightNoRendered image edge in px (when ok).
image_b64NoBase64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.
truncatedNoSet when inline was requested but the PNG exceeded the size cap.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/destructive/openWorld; the description adds substantial context beyond them — determinism of output bytes, that the image reflects the server model and NOT the user's Studio camera, auth rules by visibility, the mesh_timeout error semantics, and the never-blank guarantee. This is exactly the behavioral disclosure the structured fields cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the structure moves from purpose to routing to gotchas. It is quite long, and the determinism/camera points are reiterated, but nearly every sentence defends against a distinct real failure mode rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even with an output schema present, it covers the operational facts an agent needs: default view behavior, auth-by-visibility, error shapes, and the push-then-render workflow. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description genuinely extends the schema: it details the default contact-sheet behavior including the 3x2 grid layout and row ordering, which the enum description only summarizes, and clarifies the paths_only delivery tradeoff. This adds meaning beyond the parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb+resource+outcome: 'Render a project's current model server-side and return it as an inline image.' It also explicitly distinguishes itself from open_in_studio and implicitly from render_preview by naming the conditions under which this tool, not those siblings, is correct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use is given: prefer open_in_studio for the happy path, use this for a different view, a contact sheet, or when you only have a slug and are not publishing. The when-not and the alternative are both named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_meshGet Model MeshA
Read-only
Inspect

Return the raw per-feature triangle mesh (positions/indices/normals) of a project's current model, by slug. For the in-chat 3D viewer widget to render geometry; delivered over the MCP Apps bridge. The slug is the capability: public/unlisted need no OAuth; private requires the owner signed in.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject slug from open_in_studio/get_project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds beyond by specifying exact return content (positions, indices, normals) and delivery mechanism (MCP Apps bridge). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences cover purpose, usage context, and auth. Front-loaded with the core action, zero wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has a single parameter, annotations, and an output schema (not shown), the description fully covers purpose, usage context, auth requirements, and data type. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description for 'slug'. Description adds context about slug's role in capability/authorization, which is valuable beyond the schema field description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return') and resource ('per-feature triangle mesh') and clearly differentiates from siblings like 'mesh_summary' or 'get_latest_render' by specifying raw mesh data (positions/indices/normals).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the tool is 'for the in-chat 3D viewer widget' and explains auth requirements based on slug visibility. Could be improved by stating when not to use (e.g., if only summary needed, use mesh_summary).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectGet Project
Read-only
Inspect

Use this when you need to reopen a saved project or browse what the user has saved — it fetches a kernelCAD Studio project, or lists the signed-in user's saved projects. Pass slug (from a /p/ link or a prior listing) to fetch that project's full .kcad source and metadata — then edit and open_in_studio with the same slug so the user's open tab updates live. Private projects require their owner's OAuth connection. OMIT slug to list the signed-in user's saved projects (most recently updated first); that listing mode requires the OAuth connection and does NOT paint — prefer list_my_projects to find a project to continue. Read-only: this tool never shows a viewer (only open_in_studio does, once per response). Paint phases: projectSaved/meshReady reflect fetch state; viewerPainted stays false. Use open_in_studio (with code) to publish+paint — do NOT call get_model_mesh or get_latest_render for interactive paint.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoThe project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoWhether the read succeeded.
urlNoFetch mode: revision-pinned /p/<slug>?version= link.
codeNoFetch mode: the full .kcad source.
slugNoFetch mode: the project slug.
titleNoFetch mode: the project title.
assetsNoComplementary files keyed by source-relative path.
meshUrlNoFetch mode: revision-matched mesh artifact URL when available — FunnelViewer loads it instead of re-executing CAD. When meshStatus is building, this is the expected CDN URL (retry until ready).
privacyNoFetch mode: the project privacy.
versionNoFetch mode: the project version.
embedUrlNoFetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).
meshHintNoFetch mode: when meshStatus=building — transient; poll again or re-open_in_studio; never imply permanent 404.
projectsNoList mode (no slug): the user's saved projects.
meshErrorNoFetch mode: sanitized repair/persist error when meshStatus is failed.
meshReadyNoFetch mode: true only when meshStatus===ready.
paintHintNo
meshStatusNoFetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).
parametersNoFetch mode: the model's editable parameters.
updated_atNoFetch mode: last-updated timestamp.
serverBuildNoDeploy identity (package+git SHA@boot time) so connector lag is observable.
projectSavedNoFetch mode: true when the project was loaded.
viewerPaintedNoAlways false on tools/call; widget sets true after correlated model_displayed.
get_project_revisionGet Project RevisionA
Read-only
Inspect

Fetch the exact immutable .kcad source and parameters captured at a prior open_in_studio version. Use this to read-after-write verify a release: pass the returned slug and version, then hash or inspect the returned source. Public/unlisted projects use the slug as capability; private projects require the owner's OAuth connection.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject slug returned by open_in_studio.
versionYesPositive immutable revision version returned by open_in_studio.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the revision was found and readable.
codeYesExact .kcad source captured at this revision.
slugYesProject slug.
titleNoTitle captured with this revision. Absent on revisions snapshotted before titles were stored.
assetsNoImmutable complementary-file manifest.
versionYesImmutable revision version.
parametersYesExact editable parameters captured at this revision.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/destructiveHint, so safety is covered; the description adds real value beyond them by disclosing the access model — public/unlisted use slug as capability while private projects require the owner's OAuth connection. It also emphasizes immutability of the returned revision.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each earning its place: the first defines the resource and scope, the second gives the workflow and the access caveat. Front-loaded and free of redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained; the description still hints at what to do with the result ('hash or inspect'). Auth requirements and input provenance are covered, leaving little an agent needs missing before calling it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both params are already documented with provenance and constraints. The description reinforces that the slug/version come from open_in_studio but adds no format or syntax meaning beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Fetch') and resource ('the exact immutable .kcad source and parameters'), scoped to a prior open_in_studio version. This clearly separates it from get_project and get_latest_render, which return current/other artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete context: 'Use this to read-after-write verify a release' and ties the slug/version inputs back to open_in_studio. It stops short of naming a mutually exclusive alternative for other retrieval needs, so it is clear but not fully routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspectInspect Model
Read-only
Inspect

Use this when you need to read facts about a model. One reader, selected by of:

  • 'assembly' — physical assembly inventory (parts, bboxes, connectors, mates, disconnected solids).

  • 'robot' — URDF/SDFormat export preview (links, joints, planning groups, end-effectors, issues).

  • 'step' — inspect an imported STEP file: solid tree, exact bbox/volume, cylindrical holes (breached bores flagged partial; holeDetection: 'exact' | 'heuristic').

  • 'shape' — volume / surfaceArea / bbox for one feature ({ feature_id? }).

  • 'mass' — mass, centre of mass, centroidal inertia tensor (inertia6 + 3x3 inertiaMatrix), principalMoments/principalAxes, symmetry flags, and optionally the radius of gyration about an arbitrary axis ({ feature_id?, density?, gyration_axis? }); density in kg/m^3, defaults to 1000 (water).

  • 'features' — features captured by the script (kind, id, params, transforms, suppression).

  • 'assemblies' — assembly intent (assemblies, parts, connectors, joints).

  • 'topology' — canonical face names + edge count for a feature ({ feature_id? }).

  • 'edges' — edges of a shape with optional EdgeQuery ({ feature_id?, query? }); returns @kc[...] refs.

  • 'face-edges' — boundary edges of a named canonical face ({ feature_id?, face_name }).

  • 'faces' — faces of a shape with optional FaceQuery ({ feature_id?, query? }); returns @kc[...] refs.

  • 'face-labels' — user-applied labels visible in the script.

  • 'mates' — mates captured by the script.

  • 'constraints' — sketch constraints captured by the script.

  • 'part-stats' — bundled parts-catalog statistics.

  • 'bend-table' — sheet-metal bend table for a flattened pattern.

  • 'params' — declared model parameters.

  • 'part-categories' — top-level part-catalog categories available in the bundled (and configured remote) catalog.

  • 'part-families' — part families within a category ({ category? }); count + exemplar ids per family.

  • 'bom' — bill of materials ({ assembly? }): one row per distinct part (grouped by geometry/catalog identity, not name) with real instance quantity, kind ('fabricated'|'purchased'), material, density, per-unit and total mass, bbox, a fabrication process hint, catalog provenance for purchased parts, and totals; bom.* diagnostics flag rows with no density source or missing catalog vendor info instead of guessing.

  • 'section' — numeric cross-section probe of a shape: area, perimeter, loop/hole counts, 2D bbox at a plane ({ feature_id?, plane | at+axis, stack?: { from, to, count, axis? } }). stack scans evenly spaced slices and returns minAreaIndex/minAreaPosition — use it to find the neck/thinnest cross-section along an axis.

  • 'continuity' — G0/G1/G2 classification of shared edges ({ feature_id?, edges? }); position gap, normal jump, curvature difference, worst-sample XYZ.

  • 'curvature' — per-face Gaussian and mean curvature min/max/mean, inflections, spikes ({ feature_id?, faces?, spike_factor? }). All params except of are subject-specific and forwarded verbatim. Most subjects accept { file | code }. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoof:'section' — single slice position along `axis` (mm).
ofYesWhich facts to read.
axisNoof:'section' — normal axis for `at` / `stack` (default 'z').
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine.
edgesNoof:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled.
facesNoof:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled.
planeNoof:'section' — section plane. Either a cardinal name string 'xy'|'xz'|'yz', { plane: 'xy'|'xz'|'yz', offset? }, or { origin: [x,y,z], normal: [nx,ny,nz] }. Omit to use `at`+`axis`.
queryNoof:'edges'|'faces' — optional EdgeQuery/FaceQuery filter.
stackNoof:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition.
densityNoof:'mass' — material density in kg/m^3 (steel 7850, aluminium 2700, ABS 1050). Defaults to 1000 (water); the response echoes the value used and flags when it was defaulted.
assemblyNoof:'assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly.
categoryNoof:'part-families' — optional top-level category to filter families by.
face_nameNoof:'face-edges' — canonical face name (required for that subject).
feature_idNoof:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape.
spike_factorNoof:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6).
gyration_axisNoof:'mass' — optional axis in shape-local mm to report the radius of gyration about. Omit for centroidal quantities only; the result is density-independent and returned in mm.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

lookup_apiLook Up API
Read-only
Inspect

Use this when you need to list the kernelCAD script-runtime surface: global functions (box, path, selectEdges, helix, etc), Shape methods (fillet, sweep, lower, etc), Sketch methods (extrude, revolve, sweep), PathBuilder methods, EdgeQuery/FaceQuery key sets, and featureKindFaceLabels (which globals accept opts.faceLabels and valid value shapes). Use this to discover what is callable from a .kcad.ts script. Call this BEFORE concluding kernelCAD lacks a capability — its NURBS freeform surfacing (loft, sweep, boundary-fill, G2 blend) is easy to miss from tool names alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

lookup_authoring_skillLook Up Authoring Skill
Read-only
Inspect

Return the kernelcad-authoring skill — conventions for writing .kcad.ts scripts (API surface, parameters, evaluation contract, common pitfalls) — in sections.

Call with NO arguments first: you get the quick-start (units, axes, the return rule, conventions) and an index of every section with a one-line summary (under ~8k chars). Then pull what you need: { section: "<id>" } returns one section (e.g. "top-level-functions", "materials", "dfm-gates-print-readiness"); { query: "fillet after subtract" } returns the best-matching sections. { section: "all" } returns the full ~108k-char SKILL.md — only if your client accepts large responses.

Clients that list resources can also read kernelcad://skills/authoring (the full body).

OUTPUT: { uri, mimeType, mode, text, sections? } — mode is index | section | search | all | not-found.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoKeywords to search section titles and bodies (e.g. "sweep along helix").
topicNoAlias of section; also accepts a loose title such as 'materials' or 'cli commands'.
sectionNoSection id from the index (e.g. 'top-level-functions'), or 'all' for the full SKILL.md.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

lookup_cookbookLook Up Cookbook
Read-only
Inspect

Use this when you need a canonical pattern snippet for a CAD task. Search the kernelCAD cookbook for canonical pattern snippets. Returns top-k snippets matching the natural-language query, ranked by BM25 over title/tags/keywords/trigger. Use when you need a canonical pattern for fillet-after-subtract, non-overlapping booleans, sketch-to-extrude flows, etc. Returns empty if no snippet scores above the relevance floor — proceed without cookbook help in that case.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoMax snippets to return. Default 3, max 5.
queryYesNatural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket").
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

lookup_diagnosticsLook Up Diagnostics
Read-only
Inspect

Use this when you need the kernelCAD 26-code diagnostic catalogue with hint templates. Tiny one-shot call; useful for an agent that wants to pre-populate retry strategies. Hints are also inline on every emitted diagnostic — this tool just gives you the canonical list up front.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

mesh_summarySummarize Mesh Geometry
Read-only
Inspect

Mesh a kernelCAD .kcad.ts source server-side and return a COMPACT geometry summary — overall bounds plus, per feature, its id, kind, triangle count, and bounding box.

Use this to INSPECT a model's geometry without a viewer: confirm a part is the size/shape you expect, see how many triangles each feature contributes, or check that every feature produced geometry. This runs the full server-side OCCT pipeline (the same one the Studio renderer uses), so it evaluates modern sources (assembly, path, .material, …) that the legacy client worker cannot.

INPUT: source (required) the .kcad.ts script text; fileName (optional) a label for diagnostics; params (optional) a map of parameter-name → number overrides applied before meshing (stateless slider recompute).

OUTPUT: { ok, bounds, featureCount, features: [{ id, kind, triangleCount, bbox: { min:[x,y,z], max:[x,y,z] } }], failedFeatureIds, diagnostics }. ok is true when every feature meshed; failedFeatureIds lists features that failed to compile (and ok is then false). Raw vertex/index/normal arrays are NEVER returned — this is a summary only. To SEE the rendered model, call open_in_studio (includes PNG preview + viewer); use get_latest_render only for alternate views.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNoOptional map of parameter-name → numeric value, applied as overrides before meshing (stateless slider recompute).
sourceYesThe .kcad.ts script source to mesh.
fileNameNoOptional file-name label used in diagnostics (does not affect geometry).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

mesh_to_featuresFit Features to Mesh
Read-only
Inspect

Use this when you are handed an STL, OBJ or 3MF of a mostly prismatic mechanical part (plate, bracket, spacer, flange, housing block) and need an EDITABLE kernelCAD model of it rather than a faceted lib.fromSTL import. Deterministic, measured, self-verifying: it welds and checks the mesh, segments planes and cylinders, picks the extrusion axis, slices each band and fits exact lines / arcs / circles, snaps near-round values (each snap recorded), then emits a readable .kcad.ts with named param()s — a revolve for concentric round stacks, extruded profiles otherwise, .hole()/.holes() for through, blind and counterbored bores (axial and side-drilled), .cutout() for pockets, .fillet() for constant-radius edge blends (radius measured on the sharp edge, edges grouped by radius and picked with the shortest exact edge query), boolean subtractions for what no drilling feature can reach. It then EVALUATES that script and compares it with the mesh: volume IoU (column ray casting) and symmetric surface deviation (max + RMS), over up to 4 refinement passes. Returns { script, ledger, fidelity: { maxDeviationMm, rmsMm, volumeIoU, verdict: faithful | approximate | failed, thresholds }, unmatchedRegions, features, passes }. A fillet or sharp reading is kept by which measures better; variable-radius blends and chamfers are reported, not forced. The verdict is computed from the numbers — faithful needs IoU >= minIoU AND max deviation <= maxDeviationMm AND a watertight mesh AND no unmatched region. Freeform surfaces, tilted planes and side bosses are listed in unmatchedRegions (reference.mesh.freeform-region-unmatched), never silently dropped. The ledger uses fact ids equal to param names, so resolve_assumptions on the written .ledger.json yields paramOverrides for set_param. Pass { out } to write the script and ledger; the mesh itself is never modified. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoWrite the emitted script to this .kcad.ts path and the assumption ledger to the sibling .ledger.json.
dataNoMesh bytes as base64 — use when the server cannot see your filesystem.
fileNoPath to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine.
formatNoFormat override; default from the extension or the content.
minIoUNoVolume IoU a faithful verdict requires. Default 0.98.
maxPassesNoRefinement passes, 1–4. Default 4; stops early at the first faithful pass.
maxTrianglesNoRefuse meshes above this triangle count instead of stalling. Default 300000.
maxDeviationMmNoMax surface deviation (mm) a faithful verdict allows. Default max(0.25, 0.1 % of the bbox diagonal).
weldToleranceMmNoVertex weld distance in mm. Default max(1e-4, 1e-6 × bbox diagonal).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

open_in_studioOpen in StudioInspect

Save the model as a kernelCAD project AND show it: persists a project revision, returns the interactive Studio viewer (MCP Apps / ChatGPT outputTemplate), and includes a PNG preview in the SAME tool result (image content + previewUrl when available). ONE VIEWER PER PROJECT PER RESPONSE: every call renders a new viewer card. Do all validation with evaluate_script first, then call open_in_studio exactly once, after validation succeeds; reuse the returned URL, revision and preview, and never call it again after a successful result in the same response. Re-calling with unchanged code for the same project returns that revision instead of writing a new one. CONTINUE, DO NOT DUPLICATE: to change a model you already saved, pass project: '<slug>' from the last result (or from list_my_projects) — this adds a revision to that project. Without project, the save goes to the project this chat already saved, or to your project with the same title (case, punctuation and v2/rev3/(1) ignored) from the last 24 h. Views, poses, colours and options of one design are revisions of ONE project — keep the same title and slug. Pass new_project: true only when the user wants a separate design. A different cookbook (execute_cookbook, or open_in_studio of that cookbook's unchanged source) starts its own project; pass project to add a revision, or continue_design: true to keep revising the design this chat is already saving. The result starts with the slug to pass next time, a /p/?version= link for this revision, and that revision's title. Use this when the user wants to SEE or share the model — do NOT call get_latest_render afterwards for the happy path; the preview is already here when previewDelivered is true. Pass the full .kcad source as code (optional if you just called evaluate_script — omitting reuses that last evaluated source). Code that fails evaluate_script (for example overlapping same-material members or floating pieces) is refused; fix it first. Multi-body assemblies must declare connectors + mates/joints before publish — otherwise evaluate_script fails with mechanism.orphan-part (disconnected components). Use type: 'axis' + revolute mates for shafts/hinges/gears; type: 'frame' + fastened for rigid mounts; or arm.revolute/.prismatic/.ball/.fixed. Connector types are only frame|axis|planar|ball. Status fields: ok=true means publish succeeded (under CDN, meshStatus ready/building; ok=false + meshStatus=failed means hard mesh persist failure — do not claim the viewer is ready). previewDelivered=true means this result carries a displayable PNG — only then may you tell the user a preview was shown. meshStatus mirrors get_project (ready|building|failed|missing). Under CDN, open_in_studio waits up to ~20s (OPEN_IN_STUDIO_MESH_SYNC_BUDGET_MS) for the revision mesh before returning; heavier publishes usually land meshStatus=ready. If still meshStatus=building + meshReady=false: TRANSIENT — meshUrl is the expected CDN pin; embed retries 404s. Poll get_project({slug}) until ready (it shows no viewer) — do not re-call open_in_studio, and never treat building as permanent failure/404. ALWAYS pass code when you have it (avoid no_code_to_reuse); evaluate_script reuse is a fallback. Paint phases: projectSaved / meshReady / previewDelivered are set here; viewerPainted is ONLY true after widget ack (model context / widgetState) — never claim paint from this tool alone. Do NOT call get_model_mesh or get_latest_render for interactive paint. INDEPENDENT OF EXPORT/STEP: call this for shaded paint even while export is running, timed out, or returned export.deferred — mesh paint does not wait on STEP. Never block open_in_studio on a STEP download. Pass include_preview:false to skip the rasterizer (save + viewer URLs only). Trigger phrases: "open it in Studio", "let me see it", "show me the model"; also call once after you finish a build, and once per response after each meaningful revision while iterating. ORGANIC/CAR SUCCESS GATE: for final likeness claims pass likeness_profile:"automotive" (and body_bbox/wheels/still_verdicts, or a prior verify body-likeness pass for this code). If the gate fails, ok:false with DX reference.likeness.publish-blocked|gate-required — do not claim success. Omit likeness_profile for WIP previews only. Declare dimensions in the source with shape.dimension({ kind, from, to, label }) (label is a name; the measured value is appended) and they show on the model in every viewer; add ?dims=1 to a /p link to force dimensions on. MARK & FIX: a user message starting Edit kernelCAD project <slug> (revision N): "<note>". Targets: #1 feature "<id>" ... comes from pins the user tapped in the viewer. Feature/part ids are the script's own feature and part names (assembly part names, named shapes); points are world mm. Call get_project with that slug, change only the named features near those points, keep everything else, then open_in_studio with project set to the same slug. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG and referenceImage accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe full .kcad source of the model to open in Studio (the script you have been editing). Optional: omit to reuse the source from your most recent evaluate_script call.
slugNoOlder name for `project`. Use `project`.
titleNoOptional human-readable title for the model (shown in Studio). Defaults to "Model from Claude".
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
wheelsNoWheel centres + radii for likeness gate [{ center:[x,y,z], radius }].
projectNoSlug of the project to update (from the last open_in_studio result, a "Saved to your projects" note, list_my_projects, or a /p/<slug> link). Adds a new revision to that project instead of creating a new one, and live-updates the user's open Studio tab.
body_bboxNoBody AABB { min:[x,y,z], max:[x,y,z] } mm — for likeness_profile gate when no session attest.
anon_tokenNoAnonymous owner token returned as `anonToken` by an earlier open_in_studio result. Pass it on every open_in_studio call, also in a new chat, so all your anonymous projects stay together and move to the user's account when they sign in. Omit when you have none.
cabin_bboxNoOptional cabin AABB for likeness gate.
parametersNoOptional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params.
attachmentsNoComplementary project files referenced by relative path from the .kcad source.
new_projectNoPass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h. Still wins over a matching title or cookbook.
require_stillsNoForwarded to body-likeness gate (default true).
still_verdictsNoAgent still checklist for likeness gate [{ code, passed, finding, view? }].
continue_designNoPass true to add a revision to the design this chat is already saving, even when this call is a different cookbook or title. Ignored when `project` is set.
include_previewNoDefault true: render an iso PNG preview into this same tool result (reuses the server render cache when this source was already rendered). Set false to skip rasterization and return save/viewer URLs only.
likeness_profileNoHard success gate for organic/car bodies. When set, open_in_studio returns ok:false unless body-likeness is publishReady (inline body_bbox/wheels/still_verdicts, or a prior verify body-likeness pass for this exact code). Omit for WIP previews.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoWhether publish succeeded. Under CDN mode, false when mesh persist hard-failed (meshStatus:failed) — never ok:true with meshUrl silently omitted.
urlNoRevision-pinned /p/<slug>?version= Studio link for the revision this call saved.
slugNoThe project slug. Pass it back as `project` to save the next change to this project.
titleNoTitle stored for this revision (not a later revision of the same project).
animUrlNoCDN transforms-only animation bake URL when the script declares animationView(). ChatGPT embed Play/scrub uses this — no live session remesh.
meshUrlNoRevision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed. When meshStatus is building, this is the expected CDN URL (retry until ready).
updatedNoTrue when an existing project was updated; false when a new one was created.
versionNoImmutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version.
embedUrlNoRead-only, chrome-free /embed/<slug> viewer URL — drop into an <iframe> to embed the live model in any site or widget (no login). Includes meshUrl when a revision mesh artifact is available.
meshHintNoWhen meshStatus=building: transient OCCT/CDN write — poll get_project or re-open_in_studio; never imply permanent 404/failure. Present under CDN when building.
meshErrorNoSanitized persist/repair error when meshStatus is failed.
meshReadyNoTrue only when meshStatus===ready. building+meshUrl means embed is still polling.
paintHintNoAgent guidance: do not claim interactive paint until viewerPainted.
meshStatusNoready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).
previewUrlNoHTTPS URL of the PNG preview when storage signed successfully.
assetHashesNo
previewHintNo
previewViewNo
serverBuildNoDeploy identity so connector vs server mismatch is observable.
hasAnimationNoTrue when animUrl is present (animationView timeline baked at publish).
previewBytesNo
previewWidthNo
projectSavedNoTrue when the project/revision was persisted. Not the same as viewerPainted.
project_noteNoWhich project was updated or created, its URL, and how to keep working on it.
previewCachedNo
previewHeightNo
previewStatusNoincluded = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false.
viewerPaintedNoAlways false on tools/call. The Studio widget sets viewerPainted:true via updateModelContext after a correlated model_displayed ack.
attachmentCountNo
previewDeliveredNoTrue when this result includes a displayable PNG (image content and/or previewUrl). Only then may the agent claim a preview was shown to the user.
order_partOrder PartInspect

Order the part made: creates the production request and returns a pay_url for the user. Propose the manufacturing method from the user's words and the part, pass it as method with a one-line reason. The price is the real maker price; never invent or send one. Tell the user the card is only held, and a person confirms the final price before charging. If the result is status "pricing", the price is still being worked out: call again in a few seconds.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoSaved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both.
methodNoHow the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print).
sourceNoThe kernelCAD script, when the part is not saved. Send slug or source, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

price_partPrice Part
Read-only
Inspect

Start or read the real price for making the part. Cheap. Returns status "ready" with estimate_cents and summary, or "pricing" while the makers are asked (call again in a few seconds). Creates nothing and charges nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoSaved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both.
methodNoHow the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print).
sourceNoThe kernelCAD script, when the part is not saved. Send slug or source, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

project_curveProject CurveInspect

Use this when you need to wrap a 2D closed curve onto a 3D face. Insert a <shape>.projectCurve({ source, face, scaleMode? }) chained call into a kernelCAD script. The source is the structured { kind: "sketchCommands", commands: [...] } wire format the runtime API accepts. Wraps the curve onto the face along the face normal; pair with .extrude(d) / .cut(...) for raised or engraved logos on curved bodies. Open-wire projection (asEdge: true) is not implemented and is rejected at edit time. Side-effect-free; returns modified code plus diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
faceYesTarget face — canonical name or label.
asEdgeNoOpen-wire (edge) projection. NOT IMPLEMENTED — rejected at edit time. Use a closed-curve projection (omit asEdge).
bindAsNoOptional local variable name; emits `const <bindAs> = <target>.projectCurve(...);`.
targetYesVariable name of the Shape to chain onto.
commandsYesClosed 2D path to wrap onto the face, as plain-number commands. Must start with a `moveTo` and end with a `close` (e.g. [{kind:"moveTo",x:0,y:0},{kind:"lineTo",x:2,y:0},{kind:"lineTo",x:2,y:2},{kind:"close"}]).
scaleModeNoDrawing.sketchOnFace scaling mode. Default original.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

queryQuery Geometry
Read-only
Inspect

Use this when you need to resolve or inspect topology against a script's lowered geometry. Selected by mode (default 'evaluate'):

  • 'evaluate' — inspect a Query (@kc[...] ref, @kcq[...] DSL, or { ast }); returns matched entities. Pass expect:'unique' to assert exactly-one.

  • 'resolve' — resolve a single @kc[...] / @kcq[...] ref to one entity ({ ref }).

  • 'lineage' — walk the HistoryMap for a named face ref ({ feature_id, ref }). All params except mode are forwarded verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNomode:'resolve'|'lineage' — topology ref string.
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
modeNoResolution mode (default 'evaluate').
queryNomode:'evaluate' — Query input: @kc[...] / @kcq[...] string or { ast } object.
expectNomode:'evaluate' — 'unique' asserts exactly-one.
feature_idNoOptional FeatureId; defaults to the last lowered shape (use "auto" for lineage).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

remove_featureRemove Feature
Destructive
Inspect

Use this when you need to remove a feature line from a script. Remove a single line from a kernelCAD script identified by a substring match. Returns the modified code plus diagnostics from re-evaluating. Refuses to remove the line containing the return statement. Side-effect-free.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
matchYesA substring that uniquely identifies the line to remove (e.g. `const hole = cylinder(5,`).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

render_previewRender PreviewInspect

Use this when you need to LOOK at a kernelCAD model — render its script to deterministic PNG views for visual self-check (the visual half of the evaluate → render → inspect → fix loop), with NO studio or dev server required. Pass { code } (inline source) or { file } (a .kcad.ts path), exactly one. Renders the canonical engineering views (front, right, top, iso — pass { views } for a subset, e.g. ["iso"] for fastest iteration) plus an optional { pose: "," } arbitrary camera angle (degrees; az=0,el=0 is front, +az rotates CCW around +Z, +el lifts the camera). NO STUDIO / DEV-SERVER REQUIRED: a prebuilt static player (dist/headless-player) is served from an ephemeral local port automatically; a running studio dev server is used as fallback, and { base_url } forces one. The only environment dependency is playwright chromium (npx playwright install chromium). Pass { focus } or { hide } (arrays of feature ids or assembly part names, mutually exclusive) to isolate parts — same semantics as kernelcad render --focus/--hide. Pass { section: { axis, position, flip? } } to cut a cross-section and inspect INTERIOR geometry (wall thickness, internal pockets, whether a bore runs through) rather than only the outer shell. Pass { explode: { factor, mode? } } to pull a multi-part assembly apart (mode: "mate-axis" default, or "radial") using the same mesher as kernelcad render --explode — requires assembly.model()/solvedModel(). PNGs are written to { out_dir } (default: a fresh temp session directory) and returned as absolute paths with per-view camera descriptions (kernelCAD is Z-up). Mechanism truth runs first, same protocol as kernelcad render: a broken mechanism still renders but every tile is watermarked MECHANISM BROKEN (KERNELCAD_RENDER_STRICT=1 refuses instead); read { mechanism, mechanism_failure_codes }. The probe runs full BREP interference sweeps and can dominate latency on large assemblies — pass { no_mechanism_check: true } for fast iteration (the preview then reports mechanism: "unverified"; ignored under strict mode). Pass { overlay: 'zebra' | 'curvature' | 'continuity' } for a surface-quality visualisation (zebra stripes from vertex normals, curvature as vertex colours, continuity edges coloured by G0/G1/G2/broken) — numbers come from inspect({ of: 'continuity' | 'curvature' }); the overlay is the picture. PUBLISH PRESET: pass { preset: 'publish' } for a share-ready studio product shot (gallery tile, social post, README image, product page): key/fill/rim lights + room reflections, soft contact shadow, clean backdrop ({ background: 'white' (default) | 'light' | 'dark' | 'black' | '#rrggbb' | 'transparent' } — transparent gives a PNG with alpha), { shadow: false } to drop the shadow, 2× supersampled anti-aliasing, 30° lens, the model silhouette centred and auto-framed with ~11% air (a script's setCameraTarget is ignored), per-part colours/materials as authored, no watermark. With no views/pose it renders ONE image named 'hero' (3/4 front-right, az=30°, el=22°) at 1600×1200; width/height go up to 2048; views/pose still work under the preset. Output is deterministic for the same input. For a 360° loop use capture_animation({ turntable: true }). INSPECTION SHEET: { sheet: true } renders all seven views (iso, front, back, left, right, top, bottom) and adds one labelled image named 'sheet' tiling them — do not call a model done because it compiled; call it done when every tile of the sheet matches the request. Returns { ok, images: [{ name, path, description }], out_dir, bounds, mechanism, render_source, render_ms, diagnostics }. PATHS ARE LOCAL to the machine running the MCP server — local stdio clients read them directly; hosted/remote clients should use open_in_studio instead. Hosted server: the PNGs come back IN the result as image content (up to ~1.5 MB total; larger sets are link-only) and each images[i].url is an HTTPS link that expires after 24 h. images[].path is a server-side path you cannot open. Works without saving a project (autosave:false is fine).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source. Mutually exclusive with file. Relative imports resolve against a temp dir — use file for scripts with relative lib.fromSTEP(...) imports.
fileNoPath to a .kcad.ts script on disk. Mutually exclusive with code. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
hideNoHide matching feature ids / assembly part names. Mutually exclusive with focus.
poseNoExtra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'.
focusNoShow only matching feature ids / assembly part names. Mutually exclusive with hide.
sheetNoAlso write one labelled image 'sheet' tiling every rendered view. With no views it renders all seven (adds back, left, bottom) — use it before calling a model done, so a missing cutout on the back or underside is not missed.
viewsNoCanonical views to render as an array, e.g. ["iso"] or ["front","top"] (default: all four). Fewer views = faster.
widthNoPer-view tile width in px (default 768; 1600 under preset: 'publish').
heightNoPer-view tile height in px (default 768; 1200 under preset: 'publish').
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
presetNoRender look: 'default' (engineering review) or 'publish' (studio product shot for sharing; one 'hero' image unless views/pose are given).
shadowNopreset 'publish' only: soft contact shadow under the model (default true).
explodeNoPull a multi-part assembly apart for the preview. factor ≥ 0 scales spacing by part size; mode is 'mate-axis' (default, along parent mate/joint axes) or 'radial' (away from the assembly centroid). Requires the script to return assembly.model() / solvedModel().
out_dirNoDirectory for the PNGs (created if missing). Default: a fresh temp session dir.
overlayNoSurface-quality overlay: 'zebra' (reflection stripes), 'curvature' (Gaussian vertex colours), 'continuity' (edges coloured G2 green / G1 yellow / G0 orange / broken red). Built as coloured STL bands through this same pipeline.
sectionNoCut the model with one axis-aligned section plane to inspect INTERIOR structure (wall thickness, internal pockets, whether a bore runs through) instead of only the outer shell. position is in mm along the axis (kernelCAD Z-up frame); flip keeps the +axis side (default keeps the -axis side).
base_urlNoAdvanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player.
backgroundNopreset 'publish' only: 'white' (default), 'light', 'dark', 'black', 'transparent' (PNG alpha), or '#rrggbb'.
environmentNoHDRI environment override: preset ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse'), a URL, or 'none' for the default three-light rig.
no_watermarkNoSuppress the kernelCAD version watermark.
no_mechanism_checkNoSkip the mechanism-truth probe for fast iteration on large assemblies; the preview reports mechanism: 'unverified'. Ignored under KERNELCAD_RENDER_STRICT=1.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

repair_scriptRepair CAD ScriptInspect

Use this when evaluate_script reported an error and you want the fix applied rather than described. Takes the candidates why_did_this_fail derives for a diagnostic, applies them one at a time, re-evaluates after each, and keeps the first that clears the diagnostic without introducing new errors. Never edits outside the repair region (failing feature statement + its input statements + the param() lines it reads) — an out-of-region patch is refused with tool.repair.out-of-region. Returns the repaired source in new_code (the caller persists it), a unified diff, and before/after health maps. Pass { file? | code?, diagnostic?: ''|'first-error', strategy?: 'apply-first'|'try-all'|'dry-run', max_attempts?: number }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
strategyNo'try-all' (default) walks candidates until one clears the diagnostic; 'apply-first' applies only the top candidate and reports what it did; 'dry-run' previews every candidate patch without evaluating.
diagnosticNoDiagnostic id from why_did_this_fail's `targetDiagnosticId` / `candidates[].diagnosticId`, or 'first-error' (default) for the first error-severity diagnostic.
max_attemptsNoUpper bound on candidates attempted (default 3). Ignored by apply-first and dry-run.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

request_uploadRequest File UploadInspect

Use this when the user has a photo, PDF drawing, STEP, STL, DXF, SVG or 3MF file on their device and you need it in a kernelCAD tool (trace_from_image, drawing_to_cad, mesh_to_features, inspect of:"step", or lib.fromSTEP / fromSTL / fromDXF / fromSVG / referenceImage in a script). Do not ask the user to paste the file as text or base64, and do not type coordinates from an image by hand. Returns a one-time uploadUrl (valid 30 minutes) and an asset reference. Give the user the link; after they say the upload is done, pass the asset value ("asset:") as the file argument, for example trace_from_image({ imageUrl: "asset:" }) or lib.fromSTEP("asset:"). If the file is already at a public https:// URL, pass that URL instead. On clients that support MCP URL elicitation the upload page opens for the user directly and the call returns once the file is stored (status "uploaded"); then use the asset right away without asking the user anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
purposeNoOptional short note shown on the upload page, e.g. "the photo of the worn bracket".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

resolve_assumptionsResolve Image AssumptionsInspect

Use this when you need to confirm or override the open facts in an assumption ledger from trace_from_image (missing scale, inferred/assumed values) before committing geometry built from a reference photo. Reads the persisted <model>.ledger.json at ledgerPath, applies each resolution — { id, confirm: true } to accept a fact as-is, or { id, value } to override it — rewrites the ledger file, and returns the updated ledger plus paramOverrides (factId -> value) to feed straight into set_param. Pair with the kernelcad-from-reference skill.

ParametersJSON Schema
NameRequiredDescriptionDefault
ledgerPathYesPath to the `<model>.ledger.json` file persisted alongside the traced source.
resolutionsYesOne resolution per ledger fact id to act on.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

review_cadReview CAD Model
Read-only
Inspect

Use this when you need to review a mechanism for fitness and repair mode. Run the deterministic CAD review loop: evaluate the script, validate the assembly/mate graph, check mate connectors touch modeled material, sample declared mate limits, optionally check interferences at sampled poses, report connector workspace bounds, and return a mechanism fitness verdict for agent self-review. Fitness includes repairMode: none, local-fix, parameter-tune, or topology-redesign. Runs within timeBudgetMs (default 90 s): stages that did not fit are listed in skippedStages (their checks did not run; mechanism is then unverified) and stageTimingsMs shows per-stage cost.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
assemblyNoAssembly name; defaults to the first captured assembly.
designGoalNoOriginal user design prompt or goal. Included in suggestedRepairPrompt so topology-redesign repairs restart from the intended physical design instead of local coordinate nudges.
epsilonMm3NoInterference volume threshold in mm^3. Default 0.01.
timeBudgetMsNoWall-clock budget for the review in ms (default 90000). Once spent, the remaining heavy stages (pose envelope, physical use case, mechanism sweep) are skipped and listed in skippedStages — a partial result instead of a timeout. stageTimingsMs reports where the time went.
combinatorialNoSample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false.
samplesPerMateNoPose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate.
gripperApertureNoOptional fingertip connector refs for gripper aperture travel reporting.
trackConnectorsNoOptional connector refs such as ["gripper-plate.tool-tip"] to limit connector workspace reporting.
preserveInterfacesNoExternal mates, connector refs, part names, or behavioral interfaces the repair agent must preserve during redesign.
includeInterferenceNoWhether sampled poses run BREP interference checks. Default true.
includePoseEnvelopeNoWhether to sample declared mate limits. Default true.
requirePhysicalUseCaseNoWhen true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.
includePhysicalUseCaseStaticsNoRun opt-in pose-bound quasi-static certification at the exact common-contact samples: conservative friction/capacity, world force and moment balance, and finite-difference revolute actuator torque. Returns physicalUseCaseStaticCertificates on success; sampled linearized failures remain blocking diagnostics.
includePhysicalUseCaseReachabilityNoRun targeted physical-use-case reachability sampling over scalar-limited mates named in actuatorLimits. Reject contacts that cannot get within criteria.maxSlipMm and multi-contact use cases that cannot satisfy every contact in the same sampled actuator pose. Samples revolute/cylindrical/pin-slot limitsDeg and prismatic limitsMm. Defaults to requirePhysicalUseCase.
includePhysicalUseCaseJointReactionsNoDerive exact-pose reaction wrenches through uniquely rooted articulated trees and compare every loaded mate against a complete declared resultant force/moment envelope. Implies physical-use-case reachability and statics.
includePhysicalUseCaseJointStructureNoRun geometry/material clevis double-shear, pin-bending, bearing, tear-out, and net-section checks with minimum factor of safety 2. Unsupported axial or perpendicular-moment load cases remain blockers. Implies joint reactions, statics, and reachability.
physicalUseCaseReachabilitySamplesPerMateNoSamples per scalar-limited actuator mate for physical-use-case contact reachability. Samples revolute/cylindrical/pin-slot limitsDeg and prismatic limitsMm. Default 3; total targeted combinations are capped.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

review_paint_peek_latestGet Latest Painted Review FeedbackA
Read-only
Inspect

Return the newest brush-painted review packet from a Studio session. After sharing a /p/ link, the user can open it in the browser and paint marks over the 3D viewport to give visual feedback. Call this tool with the slug from that link to see the strokes — screenshot + mask + struck part names plus an optional one-line note and intent tags (e.g. "too thick", "missing", "wrong angle") describing WHAT is wrong — and act on the feedback. The slug is the capability: no OAuth required when passing slug; private projects require the owner to be signed in. Omit slug to fetch your own latest packet from your signed-in account (requires OAuth). By default returns short-lived signed Storage URLs for the screenshot + mask + meta.json plus the struck part names — small and context-friendly. Pass paths_only: false to also base64-inline the PNGs for clients that cannot fetch the signed URLs over HTTP.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoProject slug from open_in_studio/get_project/a /p/<slug> link. When given, returns the latest brush packet painted on that project's page — works without OAuth; the slug is the capability. Omit to use your signed-in account's latest packet.
paths_onlyNoControls PNG delivery. Default (omitted or true): return only signed URLs + struck part names — the small, context-friendly response; fetch the bytes via the signed URLs. Set false to also base64-inline the screenshot + mask PNGs for clients that cannot fetch the URLs over HTTP (larger response).
freshness_secNoMaximum packet age in seconds. Default 1800 (30 min). Use a smaller value for "what did I just paint" or a larger one for "earlier today".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds critical context beyond annotations: slug-based capability (no OAuth), private projects require owner signed-in, return format with signed URLs and optional base64 inlining, and default behavior. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, front-loaded with the main purpose, and each sentence adds value without redundancy. Approximately 150 words and efficiently conveys all necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description still outlines the return format (signed URLs, struck part names, optional base64). All 3 parameters are fully covered, and authentication context is provided. The description is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds valuable context: explains slug as project link, paths_only default and effect, freshness_sec default and usage hints. This goes beyond the schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Return the newest brush-painted review packet from a Studio session,' specifying the exact resource and action. It distinguishes itself from siblings like 'review_cad' by focusing on painted feedback from a shared link.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to call with 'slug' (after sharing a /p/<slug> link) and when to omit (for own signed-in packet). No explicit when-not-to-use, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_feaRun Structural FEAInspect

Use this when you need to know whether a part will hold a load. Runs the linear-static structural study a script declares with shape.feaStudy({ material, fixed, loads, meshSize?, minSafetyFactor? }): meshes the solid with quadratic tetrahedra, solves it with CalculiX, and returns evidence — peak von Mises stress (MPa), peak displacement (mm), the minimum safety factor against the material yield (taken away from the clamp-singular edges of the fixed faces; the raw clamp-edge peak is reported separately as peakAtSupportMPa), per-region hot spots named by @kc[...] face ref, mesh-quality trust flags, an equilibrium residual, and stress-heatmap PNG paths. Requires the external solver toolchain (CalculiX ccx plus the gmsh Python module). When it is absent the call fails with fea.solver.unavailable and the exact install command — never a silent pass. Pass { file | code }, optional study (defaults to the last declared study), output_dir (keeps the .inp/.frd deck for reproduction), mesh_size (mm, overrides the study for this run), and heatmaps: false for a fast numbers-only run. Mesh refinement is automatic: when the stress is untrusted only because the solver's error estimate is high, it re-solves once at 0.75x the element size (when the predicted element count fits the element budget) and returns that pass, with summary.refinement listing each pass's mesh size, element count and peak stress and why it stopped. refine: false solves once at mesh_size.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source (mutually exclusive with file).
fileNoPath to a .kcad.ts script declaring at least one feaStudy. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
studyNoName of the study to run; defaults to the last declared one.
refineNoOne automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true). false: one solve at mesh_size.
heatmapsNoRender stress heatmap PNGs (default true).
mesh_sizeNoTarget element size in mm, overriding the study for this run.
output_dirNoDirectory for the solver deck, results, summary JSON and heatmap PNGs.
mesh_timeout_msNoWall-clock budget for meshing (default 120000).
solve_timeout_msNoWall-clock budget for the solve (default 300000).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

send_to_printerSend G-code to Printer
Destructive
Inspect

Use this when you need to upload a .gcode file (e.g. written by export with target: "model", format: "gcode") to a real network printer and, by default, start the print. protocol: 'octoprint' (POST /api/files/local with an X-Api-Key), 'moonraker' (Klipper's POST /server/files/upload), or 'bambu-lan' (Bambu Lab LAN-mode: FTPS implicit-TLS upload on port 990 as user 'bblp' with the printer's LAN access code, then an MQTT print-start command on port 8883 — requires access_code and, unless start_print is false, serial). bambu-lan uploads a .gcode.3mf print project (the printer prints 3MF projects, not bare G-code): the G-code goes in as Metadata/plate_1.gcode, inside the model 3MF from export format '3mf' when model_3mf_path is given (use options { arrange: 'plate', slicer: 'bambu' } so the printer shows the same named, coloured parts), else inside a minimal 3MF shell; the file name always ends in .3mf ('part.gcode' -> 'part.gcode.3mf'). Optional printer (a bundled profile id, the same ids as the export 3mf/gcode options.printer) is checked against protocol before anything is read or sent: an unknown id is refused with the list of valid ids, 'bambu-lan' needs a Bambu Lab profile and a Bambu Lab profile needs 'bambu-lan'. Pass { dry_run: true } to validate connectivity/authentication only, without uploading or starting a print. Never logs or echoes api_key/access_code.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesPrinter hostname or IP.
portNoOverride the protocol default port.
serialNoBambu printer serial number (required to start a print unless start_print is false).
api_keyNoOctoPrint API key (Settings -> API).
dry_runNoValidate connectivity/auth only; never uploads or starts a print.
printerNoPrinter profile id; checked against protocol before upload. List them with 'kernelcad print printers'.
filenameNoUploaded file name (default: 'kernelcad.gcode'; bambu-lan appends '.3mf').
protocolYes
gcode_pathYesPath to the .gcode file on disk.
access_codeNoBambu LAN-mode access code (printer settings -> LAN Only Mode).
start_printNoStart the print immediately after upload (default: true).
model_3mf_pathNobambu-lan only: model .3mf from export format '3mf' to package the G-code into (the uploaded .gcode.3mf).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

set_paramSet ParameterInspect

Use this when you need to edit a param() default value in a kernelCAD script. Returns the modified code as text plus diagnostics from re-evaluating the result. Caller persists the new code via standard file-write tools (this tool has no side effects).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
new_valueYesThe new default value. Either a number for a numeric param (e.g. 12.5), or a string expression evaluated in the script (e.g. "width/2 + 3").
param_nameYesThe string literal name of the param (first arg to param()).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

set_scene_returnSet Scene ReturnInspect

Use this when you need to set how the script returns its assembly. Replace the final top-level return statement with return <assembly>.model(); or return <assembly>.solvedModel(poses, options?);. Use solvedModel for mate-authored mechanisms so FK and validation run. Returns modified source plus diagnostics from re-evaluation.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
modeYes
posesNoOptional solvedModel pose overrides keyed by mate name. Defaults to {}.
optionsNoOptional solvedModel options such as { validate: 'warn', posesGate: 'envelope' }.
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

solve_matesSolve Mates
Read-only
Inspect

Use this when you need to solve the mate graph and get part poses. Run the v0.6 mate-graph solver on the active assembly. Returns { status, poses, iterations? } where each pose is a serialized Transform ({ translation, rotateAxis, rotateDeg }). Optional poses overrides mate pose values by mate name.

ParametersJSON Schema
NameRequiredDescriptionDefault
posesNoOptional numeric pose overrides keyed by mate name.
assemblyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

solve_sketchSolve Sketch
Read-only
Inspect

Use this when you need to solve a 2D sketch constraint set. Solve a 2D sketch constraint set. Side-effect-free: pass { entities, constraints } and receive solved entities plus the original constraints. Entities are POINT, LINE, and CIRCLE records; constraints use the kernelCAD constraint vocabulary.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYesSketch entities to solve. Lines reference point ids; circles reference a center point id.
constraintsYesConstraints to apply to the entities.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

sweep_toleranceSweep Tolerance Range
Read-only
Inspect

Use this when you need to check whether a mechanism stays buildable across a tolerance/dimension range, not just at one nominal value. Declares one or more param() names with a { values: [...] } list or a { min, max, steps } range, re-evaluates the script once per cartesian-product combination (capped at 64 combos — exceeding it truncates to the first 64 and emits kinematic.sweep-tolerance.combo-cap-exceeded), and runs the standard gates on each combo: interference, mounting-hole diameter agreement, and joint-axis binding (all three, default on); reachability only when gates.reachable names a tip_link + target. Returns the pass/fail envelope table (one row per combo) plus firstFailure per gate — the fastest way to find the first param value at which a design breaks.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
gatesNoWhich standard gates to run per combo.
paramsYesparam() name -> { values: [number|string, ...] } or { min, max, steps }.
assemblyNoAssembly name; defaults to the first captured assembly.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

trace_from_imageTrace Outline from ImageInspect

Use this when you need to trace features from a reference photo into waypoints. Trace pixel-space features from a reference photo into normalized [0..1] waypoints the agent can map to mm via a known scale anchor and feed to path().spline / path().nurbsSegment. Three backends are dispatched behind the scenes: opencv (deterministic; uniform-bg silhouette only), vision-llm (vision model; named points/cluttered backgrounds; needs ANTHROPIC_API_KEY or an OpenAI-compatible vision endpoint configured on the server), and hybrid (opencv silhouette + LLM-labeled named points). Default backend is auto — the tool picks based on the image's corner-color stddev. Accuracy honesty: opencv contour is geometrically exact; vision-LLM is typically 5–10% off on dense landmarks. Per-feature confidence is reported. Vision-LLM spend is billed to whoever configured the vision model. Pair with the kernelcad-trace-from-image skill for the conversion-to-mm pipeline. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).

ParametersJSON Schema
NameRequiredDescriptionDefault
hintNoOptional free-text hint forwarded to vision-LLM backends (e.g. "a pair of eyewear; trace the upper brow only").
intentNoThe user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.
priorsNoCaller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts.
backendNoForce a specific backend; default `auto` routes by corner-color stddev.
featuresNoFeatures to trace. Defaults to a single { label: "silhouette", kind: "silhouette" } when omitted.
imageUrlYesURL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine.
validateNoAssumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open.
scaleAnchorNoPixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`.
maxWaypointsPerFeatureNoCap on waypoints per feature. Defaults to 12 (suitable for medium-inflection outlines).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

verifyVerify Design
Read-only
Inspect

Use this when you need to check a design against a rule set. One verifier, selected by check:

  • 'assembly' — mate-aware assembly validator on the active session (run evaluate_script first).

  • 'urdf' — structural validity of a .urdf file ({ urdf_path }).

  • 'dfm' — print-readiness gates declared by dfmSpec() ({ file | code }).

  • 'dfm-preflight' — sheet-metal flat pattern vs a job-shop's ordering rules ({ vendor, material, thicknessIn|thicknessMm, ... }). Returns the vendor's catalog source pages as sources; when disclosure is present, show it with those links.

  • 'swept-collision' — sweep declared joint range(s) and report colliding poses.

  • 'reachable' — inverse-kinematics reachability for an end-effector ({ tip_link, target_position, ... }).

  • 'fastener-installation' — measured explicit catalog-screw installation stations on lowered assembly BREP ({ file | code, fasteners:[{ part, against, engagementPart?, minEngagementMm?, maxProtrusionMm? }], toleranceMm?, angleToleranceDeg? }). Reports annular bearing gap, bore axis/diameter/overlap and receiver geometric engagement/protrusion. Unknown or zero coverage cannot pass. Simplified threads do not certify torque, preload or strength.

  • 'mounting-holes' — fastened mates expose matching hole diameters on both sides.

  • 'load-capacity' — will it hold? Closed-form Euler-Bernoulli beam check ({ loads, materials, ... }), or mode:'fea' to solve the script's feaStudy (quadratic-tet FEA, CalculiX) — both return { ok, safetyFactor, elements[{ partName, stressPa, yieldPa, safetyFactor }], failures[], diagnostics }; fea adds the threshold, the stress regions as @kc[...] faces with their location, and fea { peakStressPa, maxDisplacementMm, meshTrusted, peakAtSupportPa, refinement }; it refines the mesh automatically until the stress is trusted (refine: false for one solve).

  • 'static-hold' — gravitational holding torque/force at a sampled pose grid vs each actuated joint's declared actuator capacity ({ joint?, pose?, gravity?, min_torque_margin_pct?, range_samples? }).

  • 'body-likeness' — publish gate for organic/car bodies: cheap AABB↔wheel checks plus required agent still verdicts (side-body-over-wheels, side-cabin-aft, rear-haunch, ortho-proportions-vs-reference). Pass { body_bbox | code/file+body_feature_id, wheels?, cabin_bbox?, still_verdicts?, require_stills? }. Full CV silhouette matching is NOT implemented — agents must inspect ortho PNGs/Studio and supply still_verdicts before claiming success. All params except check are check-specific and forwarded verbatim; each check fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxfNocheck:'dfm-preflight' — path to a DXF file.
codeNoInline kernelCAD script source (same checks as `file`).
fileNoPath to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
modeNocheck:'load-capacity' — 'beam' (default), 'stub', or 'fea' (solve the script's feaStudy; needs the CalculiX + gmsh toolchain).
poseNocheck:'static-hold' — explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range.
seedNocheck:'reachable' — numeric IK seed pose (joint name -> deg/mm).
checkYesWhich verification to run.
jointNocheck:'swept-collision' — joint to sweep; omit to sweep every declared joint. check:'static-hold' — joint to evaluate; omit to evaluate every joint with a declared actuator.
loadsNocheck:'load-capacity' — partName -> { force?: [Fx,Fy,Fz] N, torque?: [Tx,Ty,Tz] N*m }.
rangeNocheck:'swept-collision' — [lower, upper, step] in joint-native units.
studyNocheck:'load-capacity' mode:'fea' — feaStudy name (default: the last declared one).
refineNocheck:'load-capacity' mode:'fea' — one automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true); false solves once at the study's meshSize.
vendorNocheck:'dfm-preflight' — vendor SKU (required for that check).
wheelsNocheck:'body-likeness' — wheel centres + tire radii [{ center:[x,y,z], radius }].
gravityNocheck:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]).
serviceNocheck:'dfm-preflight' — service.
assemblyNoAssembly name; defaults to the first captured assembly.
heatmapsNocheck:'load-capacity' mode:'fea' — also render stress heatmap PNGs (default false).
materialNocheck:'dfm-preflight' — material SKU (required for that check).
tip_linkNocheck:'reachable' — end-effector part name (required for that check).
body_bboxNocheck:'body-likeness' — body AABB { min:[x,y,z], max:[x,y,z] } in mm.
fastenersNocheck:'fastener-installation' — explicit named stations; empty means no coverage.
featureIdNocheck:'dfm-preflight' — FeatureId to scope to.
materialsNocheck:'load-capacity' — partName -> material declaration.
mesh_sizeNocheck:'load-capacity' mode:'fea' — element size override, mm.
urdf_pathNocheck:'urdf' — path to the .urdf file.
cabin_bboxNocheck:'body-likeness' — optional cabin/greenhouse AABB for automated cabin-aft.
length_axisNocheck:'body-likeness' — wheelbase axis (default 'x').
thicknessInNocheck:'dfm-preflight' — material thickness in inches.
thicknessMmNocheck:'dfm-preflight' — material thickness in millimeters.
toleranceMmNocheck:'fastener-installation' — linear tolerance, default .05 mm.
prefer_solverNocheck:'reachable' — force the IK path ('auto' default).
range_samplesNocheck:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9).
max_iterationsNocheck:'reachable' — numeric-path iteration cap.
refreshCatalogNocheck:'dfm-preflight' — force vendor catalog refresh.
require_stillsNocheck:'body-likeness' — require still_verdicts (default true).
still_verdictsNocheck:'body-likeness' — agent ortho still checklist [{ code, passed, finding, view? }]. Required codes: side-body-over-wheels, side-cabin-aft, rear-haunch, ortho-proportions-vs-reference.
body_feature_idNocheck:'body-likeness' — FeatureId to read body AABB from when body_bbox omitted.
target_positionNocheck:'reachable' — target [x, y, z] mm (world frame).
angleToleranceDegNocheck:'fastener-installation' — axis tilt tolerance, default 1 degree.
target_orientationNocheck:'reachable' — target XYZ Euler angles in radians.
min_torque_margin_pctNocheck:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20).
position_tolerance_mmNocheck:'reachable' — position tolerance in mm.
collision_tolerance_mm3Nocheck:'swept-collision' — BREP intersection volume tolerance (mm^3).
safety_factor_thresholdNocheck:'load-capacity' — pass/fail safety-factor floor (default 1.5; mode 'fea': the study's minSafetyFactor when declared).
orientation_tolerance_radNocheck:'reachable' — orientation tolerance in radians.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

why_did_this_failExplain Failure
Read-only
Inspect

Use this when you need to trace why a feature failed. Walk the upstream chain of a failing feature. Returns the diagnostics of the requested feature plus the diagnostics of every upstream feature in topological order (the requested feature is the last entry). Per-code hints are inline on every diagnostic — call lookup_diagnostics for the full catalogue. Pass { file?, code?, feature_id? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
fileNoHosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
feature_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedexport1 field changed
      • changedInput schema / properties / options / description
        Previous value: -"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource?, arrange?: \"none\"|\"plate\"|\"assembled\", orient?: boolean, slicer?: \"generic\"|\"bambu\"|\"orca\"|\"prusa\", printer?: printer profile id, one of \"generic-fdm\"|\"bambu-a1-mini\"|\"bambu-a1\"|\"bambu-p1s\"|\"bambu-p1p\"|\"bambu-x1c\"|\"bambu-x1e\"|\"bambu-h2d\"|\"bambu-h2s\"|\"prusa-mini-plus\"|\"prusa-mk4s\"|\"prusa-core-one\"|\"prusa-xl\"|\"creality-ender-3-v3\"|\"creality-k1\"|\"creality-k1-max\"|\"creality-k2-plus\"|\"elegoo-neptune-4-pro\"|\"anycubic-kobra-3\"|\"voron-2.4-250\"|\"voron-2.4-300\"|\"voron-2.4-350\"|\"ultimaker-s5\" (default \"generic-fdm\"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"], dimensioningStyle?: \"baseline\"|\"chain\"|\"symmetry\" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: \"general\"|\"machining\"|\"sheet-metal\" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. svg-drawing and pdf-drawing also take style?: \"mechanical\" (default, the part sheet) | \"architectural\" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: \"metric\"|\"imperial\", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning."New value: +"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource?, arrange?: \"none\"|\"plate\"|\"assembled\", orient?: boolean, slicer?: \"generic\"|\"bambu\"|\"orca\"|\"prusa\", printer?: printer profile id, one of \"generic-fdm\"|\"bambu-a1-mini\"|\"bambu-a1\"|\"bambu-p1s\"|\"bambu-p1p\"|\"bambu-x1c\"|\"bambu-x1e\"|\"bambu-h2d\"|\"bambu-h2s\"|\"prusa-mini-plus\"|\"prusa-mk4s\"|\"prusa-core-one\"|\"prusa-xl\"|\"creality-ender-3-v3\"|\"creality-k1\"|\"creality-k1-max\"|\"creality-k2-plus\"|\"elegoo-neptune-4-pro\"|\"anycubic-kobra-3\"|\"voron-2.4-250\"|\"voron-2.4-300\"|\"voron-2.4-350\"|\"ultimaker-s5\" (default \"generic-fdm\"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"], dimensioningStyle?: \"baseline\"|\"chain\"|\"symmetry\" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: \"general\"|\"machining\"|\"sheet-metal\" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. Functional drawing review: shape.drawingReview(plan) source declarations merge with reviewPlans?: additional plans; decisionResolutions?: { [encodeURIComponent(planId)+\":\"+encodeURIComponent(decisionId)]: { note, provenance } }. drawing_report.review reports declared geometric-callout coverage and unresolved engineering decisions. requireCompleteReview?: true rejects incomplete/not-declared mechanical reviews before export; architectural style rejects review contracts. Coverage is not engineering certification. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. svg-drawing and pdf-drawing also take style?: \"mechanical\" (default, the part sheet) | \"architectural\" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: \"metric\"|\"imperial\", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning."
  2. 3 tool updates
    • Changedexport2 fields changed
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "stl",
        -  "step",
        -  "dxf",
        -  "3mf",
        -  "glb",
        -  "svg-drawing",
        -  "pdf-drawing",
        -  "urdf",
        -  "srdf",
        -  "sdf-gazebo",
        -  "usd-isaac",
        -  "bom-csv",
        -  "bom-json",
        -  "bend-table"
        -]New value: +[
        +  "stl",
        +  "step",
        +  "dxf",
        +  "3mf",
        +  "glb",
        +  "svg-drawing",
        +  "pdf-drawing",
        +  "urdf",
        +  "srdf",
        +  "sdf-gazebo",
        +  "usd-isaac",
        +  "bom-csv",
        +  "bom-json",
        +  "bend-table",
        +  "gcode"
        +]
      • changedInput schema / properties / options / description
        Previous value: -"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource?, arrange?: \"none\"|\"plate\"|\"assembled\", orient?: boolean, slicer?: \"generic\"|\"bambu\"|\"orca\"|\"prusa\", printer?: printer profile id, one of \"generic-fdm\"|\"bambu-a1-mini\"|\"bambu-a1\"|\"bambu-p1s\"|\"bambu-p1p\"|\"bambu-x1c\"|\"bambu-x1e\"|\"bambu-h2d\"|\"bambu-h2s\"|\"prusa-mini-plus\"|\"prusa-mk4s\"|\"prusa-core-one\"|\"prusa-xl\"|\"creality-ender-3-v3\"|\"creality-k1\"|\"creality-k1-max\"|\"creality-k2-plus\"|\"elegoo-neptune-4-pro\"|\"anycubic-kobra-3\"|\"voron-2.4-250\"|\"voron-2.4-300\"|\"voron-2.4-350\"|\"ultimaker-s5\" (default \"generic-fdm\"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"] }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. svg-drawing and pdf-drawing also take style?: \"mechanical\" (default, the part sheet) | \"architectural\" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: \"metric\"|\"imperial\", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning."New value: +"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource?, arrange?: \"none\"|\"plate\"|\"assembled\", orient?: boolean, slicer?: \"generic\"|\"bambu\"|\"orca\"|\"prusa\", printer?: printer profile id, one of \"generic-fdm\"|\"bambu-a1-mini\"|\"bambu-a1\"|\"bambu-p1s\"|\"bambu-p1p\"|\"bambu-x1c\"|\"bambu-x1e\"|\"bambu-h2d\"|\"bambu-h2s\"|\"prusa-mini-plus\"|\"prusa-mk4s\"|\"prusa-core-one\"|\"prusa-xl\"|\"creality-ender-3-v3\"|\"creality-k1\"|\"creality-k1-max\"|\"creality-k2-plus\"|\"elegoo-neptune-4-pro\"|\"anycubic-kobra-3\"|\"voron-2.4-250\"|\"voron-2.4-300\"|\"voron-2.4-350\"|\"ultimaker-s5\" (default \"generic-fdm\"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"], dimensioningStyle?: \"baseline\"|\"chain\"|\"symmetry\" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: \"general\"|\"machining\"|\"sheet-metal\" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. svg-drawing and pdf-drawing also take style?: \"mechanical\" (default, the part sheet) | \"architectural\" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: \"metric\"|\"imperial\", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning."
    • Changedrender_preview1 field changed
      • addedInput schema / properties / sheet
        Added value: +{
        +  "default": false,
        +  "description": "Also write one labelled image 'sheet' tiling every rendered view. With no views it renders all seven (adds back, left, bottom) — use it before calling a model done, so a missing cutout on the back or underside is not missed.",
        +  "type": "boolean"
        +}
    • Changedverify4 fields changed
      • addedInput schema / properties / angleToleranceDeg
        Added value: +{
        +  "description": "check:'fastener-installation' — axis tilt tolerance, default 1 degree.",
        +  "maximum": 90,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / check / enum
        Previous value: -[
        -  "assembly",
        -  "urdf",
        -  "dfm",
        -  "dfm-preflight",
        -  "swept-collision",
        -  "reachable",
        -  "mounting-holes",
        -  "load-capacity",
        -  "static-hold",
        -  "body-likeness"
        -]New value: +[
        +  "assembly",
        +  "urdf",
        +  "dfm",
        +  "dfm-preflight",
        +  "swept-collision",
        +  "reachable",
        +  "mounting-holes",
        +  "load-capacity",
        +  "static-hold",
        +  "body-likeness",
        +  "fastener-installation"
        +]
      • addedInput schema / properties / fasteners
        Added value: +{
        +  "description": "check:'fastener-installation' — explicit named stations; empty means no coverage.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "against": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array",
        +        "uniqueItems": true
        +      },
        +      "engagementPart": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxProtrusionMm": {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "minEngagementMm": {
        +        "description": "Declared geometric axial overlap minimum; no thread-strength claim.",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "part": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "part",
        +      "against"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / toleranceMm
        Added value: +{
        +  "description": "check:'fastener-installation' — linear tolerance, default .05 mm.",
        +  "minimum": 0,
        +  "type": "number"
        +}
  3. 49 tool updates
    • Changedadd_connector2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_constraint2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "constraints": {
        -    "description": "Updated constraint list.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "errors": {
        -    "description": "Validation errors (present on failure).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "constraints"
        -]
    • Changedadd_curve2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_feature2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_mate2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_part2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_path_segment2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_pattern_feature2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_surface2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_text2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_variable_sweep2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedadd_workspace_target2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedcapture_animation2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "collisions": {
        -    "description": "Colliding poses { t_ms, a, b, volume_mm3 }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "duration_ms": {
        -    "type": "number"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "errorHint": {
        -    "type": "string"
        -  },
        -  "failure_kind": {
        -    "type": "string"
        -  },
        -  "fps": {
        -    "type": "number"
        -  },
        -  "frame_count": {
        -    "type": "number"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "output_path": {
        -    "description": "Written MP4 path (MP4 mode).",
        -    "type": "string"
        -  },
        -  "verified": {
        -    "description": "Whether pose-interference verification passed.",
        -    "type": "boolean"
        -  },
        -  "verify_skipped": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "diagnostics"
        -]
    • Changeddesign_loop2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "attempts": {
        -    "description": "Per-attempt review results (includes revisionAssist when failed).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "convergence": {
        -    "additionalProperties": true,
        -    "description": "Present when trailing failures share a signature (escalate).",
        -    "type": "object"
        -  },
        -  "finalAttemptId": {
        -    "type": "string"
        -  },
        -  "goal": {
        -    "description": "Echoed design goal.",
        -    "type": "string"
        -  },
        -  "nextActionPrompt": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "outputRecordPath": {
        -    "type": "string"
        -  },
        -  "record": {
        -    "additionalProperties": true,
        -    "description": "Studio-compatible build record (when requested).",
        -    "type": "object"
        -  },
        -  "recordUrl": {
        -    "type": "string"
        -  },
        -  "revisionAssist": {
        -    "additionalProperties": true,
        -    "description": "Structured revision assist from the last failing attempt: hints, suggestedPatches (AST diffs), optional autoApplied.suggestedCode when repair_script cleared a repairable diagnostic. Honest scope — not full autonomous CAD rewrite.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "goal",
        -  "attempts"
        -]
    • Changeddiff_geometry2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "base": {
        -    "additionalProperties": true,
        -    "description": "Baseline summary { featureCount, bodyCount, isAssembly } (success).",
        -    "type": "object"
        -  },
        -  "bodies": {
        -    "description": "Per matched body, the material-level delta (success).",
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "addedMm3": {
        -          "description": "volume(revised − base) — material that appeared.",
        -          "type": "number"
        -        },
        -        "baseName": {
        -          "type": "string"
        -        },
        -        "bbox": {
        -          "additionalProperties": true,
        -          "description": "Exact bbox both sides plus min/max/extent deltas (mm).",
        -          "type": "object"
        -        },
        -        "commonMm3": {
        -          "description": "volume(base ∩ revised) — material that stayed put.",
        -          "type": "number"
        -        },
        -        "edgeCount": {
        -          "additionalProperties": true,
        -          "description": "{ base, revised, delta } BREP edge count.",
        -          "type": "object"
        -        },
        -        "faceCount": {
        -          "additionalProperties": true,
        -          "description": "{ base, revised, delta } BREP face count.",
        -          "type": "object"
        -        },
        -        "holeCount": {
        -          "additionalProperties": true,
        -          "description": "{ base, revised, delta } cylindrical-hole count.",
        -          "type": "object"
        -        },
        -        "matchedBy": {
        -          "description": "How this pair was established.",
        -          "enum": [
        -            "name",
        -            "position"
        -          ],
        -          "type": "string"
        -        },
        -        "maxDeviationMm": {
        -          "description": "Two-sided discrete Hausdorff distance between the two surfaces.",
        -          "type": "number"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "removedMm3": {
        -          "description": "volume(base − revised) — material that vanished.",
        -          "type": "number"
        -        },
        -        "revisedName": {
        -          "type": "string"
        -        },
        -        "verdict": {
        -          "description": "The field to branch on. Precedence: topology-changed > resized > moved > identical.",
        -          "enum": [
        -            "identical",
        -            "moved",
        -            "resized",
        -            "topology-changed"
        -          ],
        -          "type": "string"
        -        },
        -        "volumeMm3": {
        -          "additionalProperties": true,
        -          "description": "{ base, revised, delta } in mm³.",
        -          "type": "object"
        -        }
        -      },
        -      "required": [
        -        "name",
        -        "verdict",
        -        "addedMm3",
        -        "removedMm3",
        -        "commonMm3"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (failure).",
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "render": {
        -    "additionalProperties": true,
        -    "description": "Overlay result when render: true — { ok, images, out_dir, script_path, error? }.",
        -    "type": "object"
        -  },
        -  "revised": {
        -    "additionalProperties": true,
        -    "description": "Revision summary { featureCount, bodyCount, isAssembly } (success).",
        -    "type": "object"
        -  },
        -  "side": {
        -    "description": "Which side failed ('base' | 'revised') (failure).",
        -    "type": "string"
        -  },
        -  "summary": {
        -    "additionalProperties": true,
        -    "description": "Verdict counts plus totalAddedMm3 / totalRemovedMm3 / maxDeviationMm.",
        -    "type": "object"
        -  },
        -  "unmatched": {
        -    "description": "Bodies present on only one side; each also raises diff.body.unmatched.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changeddiff_scripts2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "base": {
        -    "additionalProperties": true,
        -    "description": "Baseline summary { featureCount, partCount, isAssembly } (success).",
        -    "type": "object"
        -  },
        -  "deeperDiffAvailable": {
        -    "additionalProperties": true,
        -    "description": "Present when the diff touched geometry-affecting ops: { tool: 'diff_geometry', reason, bodies } — the same two scripts can be compared at material level (added/removed/common volume + per-body verdict).",
        -    "type": "object"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (failure).",
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "interference": {
        -    "additionalProperties": true,
        -    "description": "Total interference-volume delta + per-pair detail (success).",
        -    "type": "object"
        -  },
        -  "mates": {
        -    "additionalProperties": true,
        -    "description": "Mate-graph changes (success).",
        -    "type": "object"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "params": {
        -    "additionalProperties": true,
        -    "description": "Param value/min/max changes (success).",
        -    "type": "object"
        -  },
        -  "parts": {
        -    "additionalProperties": true,
        -    "description": "Per-part added/removed/renamed/changed/unchanged (success).",
        -    "type": "object"
        -  },
        -  "revised": {
        -    "additionalProperties": true,
        -    "description": "Revision summary { featureCount, partCount, isAssembly } (success).",
        -    "type": "object"
        -  },
        -  "side": {
        -    "description": "Which side failed ('base' | 'revised') (failure).",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changeddrawing_to_cad2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "fidelity": {
        -    "additionalProperties": true,
        -    "description": "{ verdict: match | partial | mismatch | failed, extents, holes, silhouettes, reasons } from evaluating and re-projecting the script.",
        -    "type": "object"
        -  },
        -  "ledger": {
        -    "additionalProperties": true,
        -    "description": "Assumption ledger: { facts, unresolvedCount }; facts are visible / inferred / assumed / missing, disagreements recorded on the fact.",
        -    "type": "object"
        -  },
        -  "ledgerPath": {
        -    "description": "Where the ledger was written (when `out` was given); pass it to resolve_assumptions.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "page": {
        -    "type": "integer"
        -  },
        -  "pageCount": {
        -    "type": "integer"
        -  },
        -  "params": {
        -    "description": "Role-named params declared by the script: { name, value, description }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "reconstruction": {
        -    "additionalProperties": true,
        -    "description": "{ kind: extrude | revolve, profileView, axis, holeCount, extents }.",
        -    "type": "object"
        -  },
        -  "script": {
        -    "description": "The emitted .kcad.ts source.",
        -    "type": "string"
        -  },
        -  "scriptPath": {
        -    "description": "Where the script was written (when `out` was given).",
        -    "type": "string"
        -  },
        -  "sheet": {
        -    "additionalProperties": true,
        -    "description": "{ widthMm, heightMm, scale: { text, sheetPerModel, source }, units, projection } read off the sheet.",
        -    "type": "object"
        -  },
        -  "views": {
        -    "description": "Identified orthographic views: { name, bboxMm, identifiedBy, label? }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "views",
        -  "params",
        -  "ledger",
        -  "diagnostics"
        -]
    • Changedevaluate_script2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "dimensions": {
        -    "description": "Dimensions declared with shape.dimension(), as the viewer labels them (e.g. \"hole spacing 30\"). Omitted when the script declares none.",
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "kind": {
        -          "enum": [
        -            "linear",
        -            "diameter",
        -            "radius",
        -            "angular"
        -          ],
        -          "type": "string"
        -        },
        -        "source": {
        -          "enum": [
        -            "declared",
        -            "auto"
        -          ],
        -          "type": "string"
        -        },
        -        "text": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "text",
        -        "kind",
        -        "source"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "dryRun": {
        -    "description": "True when the result came from a fast dry run.",
        -    "type": "boolean"
        -  },
        -  "featureCount": {
        -    "description": "Number of features captured by the script.",
        -    "type": "number"
        -  },
        -  "featureHealth": {
        -    "description": "Per-feature health degradations — ONLY features that fell back to a passthrough (warning) or failed to lower (error). Empty when every feature is healthy. Surfaces which feature degraded even when ok is true.",
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "featureId": {
        -          "type": "string"
        -        },
        -        "status": {
        -          "enum": [
        -            "warning",
        -            "error"
        -          ],
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "featureId",
        -        "status"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "mechanism": {
        -    "description": "Mechanism-truth verdict for an assembly-built scene (default-on; omitted for dryRun, non-assembly, or skipMechanismCheck:true). 'broken' makes ok:false; 'unverified' keeps ok and surfaces a loud budget diagnostic.",
        -    "enum": [
        -      "real",
        -      "broken",
        -      "unverified"
        -    ],
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the script compiled and lowered cleanly.",
        -    "type": "boolean"
        -  },
        -  "parts": {
        -    "additionalProperties": true,
        -    "description": "Assembly parts summary { count, names } when the scene is assembly-built.",
        -    "type": "object"
        -  },
        -  "reviewHint": {
        -    "description": "Present only when a captured assembly declares articulated (non-fastened) mates: the default mechanism check is shallow (no joint-support intents, pose-envelope overlap at declared limits, or gravity drop) — run review_cad for pose-envelope + gravity checks.",
        -    "type": "string"
        -  },
        -  "tubes": {
        -    "additionalProperties": false,
        -    "description": "Tube line report. Present only when the model has tubes; the gate diagnostics are in diagnostics.",
        -    "properties": {
        -      "lines": {
        -        "description": "One entry per tube: name, system, od, wall, bendRadius, material, cutLength (mm), bends, xyz (bend-table corner points), lra (length/rotation/angle rows), lastStraight, minStraight, minClearance { mm, to, at } (exact nearest part or tube), massKg (null without a known material or density), volumeInternalMl, pressureDropKPa (null without a declared flow).",
        -        "items": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "systems": {
        -        "description": "One entry per named system: { system, lines, cutLength, massKg }.",
        -        "items": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "lines",
        -      "systems"
        -    ],
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "featureCount",
        -  "diagnostics"
        -]
    • Changedevaluate_sdf2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "aabb": {
        -    "additionalProperties": true,
        -    "description": "Axis-aligned bounding box of the field (success).",
        -    "type": "object"
        -  },
        -  "distance": {
        -    "description": "Signed distance in mm; negative = inside (success).",
        -    "type": "number"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "hint": {
        -    "type": "string"
        -  },
        -  "inside": {
        -    "description": "Whether the point is inside the surface (success).",
        -    "type": "boolean"
        -  },
        -  "kind": {
        -    "description": "SDF field kind (success).",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedexecute_cookbook2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "code": {
        -    "description": "Snippet body used for evaluate / Studio.",
        -    "type": "string"
        -  },
        -  "cookbookId": {
        -    "description": "Resolved cookbook snippet id.",
        -    "type": "string"
        -  },
        -  "dryRunNotEvidence": {
        -    "description": "Present when dryRun:true — dryRun success is not evidence the solid built.",
        -    "type": "boolean"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "evaluate": {
        -    "additionalProperties": true,
        -    "description": "Full evaluate_script result (same shape).",
        -    "type": "object"
        -  },
        -  "executionId": {
        -    "description": "Short id for logs / correlation.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "openInStudio": {
        -    "additionalProperties": true,
        -    "description": "open_in_studio result when openInStudio was requested.",
        -    "type": "object"
        -  },
        -  "stage": {
        -    "description": "'resolve' | 'evaluate' | 'open_in_studio' on failure.",
        -    "type": "string"
        -  },
        -  "title": {
        -    "description": "Resolved cookbook title.",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "executionId"
        -]
    • Changedexport2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "byte_count": {
        -    "description": "target:'model' — file size in bytes.",
        -    "type": "number"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "feature_count": {
        -    "type": "number"
        -  },
        -  "format": {
        -    "type": "string"
        -  },
        -  "infill": {
        -    "additionalProperties": true,
        -    "description": "3mf with options.infill — stress-graded infill: band table (density, stress range, volume %), saving vs uniform infill at the high density, FEA peaks, and images { heatmap, bands, cutaway } PNG paths.",
        -    "type": "object"
        -  },
        -  "mesh_files": {
        -    "description": "Per-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo, meshes/<part>.usda mesh layers for usd-isaac.",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "output_path": {
        -    "description": "target:'model' — written file path.",
        -    "type": "string"
        -  },
        -  "part_files": {
        -    "description": "Per-part DXF files: parts/<part>.dxf for a multi-part dxf export (layout 'per-part', the default).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "written": {
        -    "description": "target:'part' — per-part export records.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedfea_summary2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "material_names": {
        -    "description": "Accepted material grade names.",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "materials": {
        -    "additionalProperties": true,
        -    "description": "Named grade -> { E (MPa), nu, yield (MPa) }.",
        -    "type": "object"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "summary": {
        -    "additionalProperties": true,
        -    "description": "Stored summary of a previous run_fea in output_dir, when present.",
        -    "type": "object"
        -  },
        -  "toolchain": {
        -    "additionalProperties": true,
        -    "description": "{ available, ccx?, gmshVersion?, missing[], hint? } — whether a study can run here and how to fix it if not.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "toolchain",
        -  "materials",
        -  "material_names"
        -]
    • Changedfetch_part2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "cachePath": {
        -    "description": "Local cache path of the written STEP file (success).",
        -    "type": "string"
        -  },
        -  "disclosure": {
        -    "description": "Referral disclosure. Present only when url carries a referral tag; show it with the link.",
        -    "type": "string"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "errorHint": {
        -    "type": "string"
        -  },
        -  "instruction": {
        -    "description": "What to do with the link_out URL.",
        -    "type": "string"
        -  },
        -  "kind": {
        -    "description": "'link_out' when the URL is a vendor configurator the agent must drive by hand.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "record": {
        -    "additionalProperties": true,
        -    "description": "Resolved part record (success).",
        -    "type": "object"
        -  },
        -  "sha256": {
        -    "description": "SHA-256 fingerprint of the STEP file (success).",
        -    "type": "string"
        -  },
        -  "source": {
        -    "description": "Where the part came from ('local' | 'remote') (success).",
        -    "type": "string"
        -  },
        -  "url": {
        -    "description": "Outbound vendor URL (link_out). May carry a referral tag; see disclosure.",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedfind_part2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "errorHint": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "remoteEnabled": {
        -    "description": "Whether the remote tier was queried (success).",
        -    "type": "boolean"
        -  },
        -  "results": {
        -    "description": "Matching part records (success).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "source": {
        -    "description": "Where results came from ('local' | 'remote') (success).",
        -    "type": "string"
        -  },
        -  "totalMatches": {
        -    "description": "Total matches before limiting (success).",
        -    "type": "number"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedflatten_pattern2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "region": {
        -    "additionalProperties": true,
        -    "description": "Unfolded flat-pattern Region (outer polyline + holes + bend lines + plane).",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "diagnostics"
        -]
    • Changedinspect2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "error": {
        -    "description": "Failure message (present on failure).",
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the read succeeded.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[]
    • Changedlookup_api2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "constraints": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "curve3dAnalyticsMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "curve3dMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "edgeQueryKeys": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "faceQueryKeys": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "featureKindFaceLabels": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "globals": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "paramRefMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "pathBuilderMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "sceneMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "scenePartProperties": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "shapeListMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "shapeMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "sketchMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "surfaceMethods": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedlookup_authoring_skill1 field changed
      • removedOutput schema / properties
        Removed value: -{
        -  "mimeType": {
        -    "description": "MIME type of the returned body.",
        -    "type": "string"
        -  },
        -  "mode": {
        -    "description": "index | section | search | all | not-found.",
        -    "type": "string"
        -  },
        -  "sections": {
        -    "description": "Section ids returned in text (section and search modes).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "text": {
        -    "description": "The index + quick-start, the requested section(s), or the full SKILL.md body.",
        -    "type": "string"
        -  },
        -  "uri": {
        -    "description": "The authoring-skill resource URI.",
        -    "type": "string"
        -  }
        -}
    • Changedlookup_cookbook2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "error": {
        -    "type": "string"
        -  },
        -  "hits": {
        -    "description": "Top-k matching cookbook snippets, ranked by BM25.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedlookup_diagnostics2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "codes": {
        -    "description": "The diagnostic-code catalogue with hint templates.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "codes"
        -]
    • Changedmesh_summary1 field changed
      • removedOutput schema / properties
        Removed value: -{
        -  "bounds": {
        -    "description": "Overall model bounding box.",
        -    "properties": {
        -      "max": {
        -        "items": {
        -          "type": "number"
        -        },
        -        "type": "array"
        -      },
        -      "min": {
        -        "items": {
        -          "type": "number"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  "diagnostics": {
        -    "description": "Kernel diagnostics, if any.",
        -    "items": {},
        -    "type": "array"
        -  },
        -  "failedFeatureIds": {
        -    "description": "Feature ids that failed to compile (empty when ok).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "featureCount": {
        -    "description": "Number of features in the meshed model.",
        -    "type": "number"
        -  },
        -  "features": {
        -    "description": "Per-feature summary — never includes raw mesh arrays.",
        -    "items": {
        -      "properties": {
        -        "bbox": {
        -          "properties": {
        -            "max": {
        -              "items": {
        -                "type": "number"
        -              },
        -              "type": "array"
        -            },
        -            "min": {
        -              "items": {
        -                "type": "number"
        -              },
        -              "type": "array"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "triangleCount": {
        -          "type": "number"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "description": "True when every feature meshed successfully.",
        -    "type": "boolean"
        -  }
        -}
    • Changedmesh_to_features2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (failure).",
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "features": {
        -    "additionalProperties": true,
        -    "description": "Body kind, hole groups, cutouts, boolean remainders, params (success).",
        -    "type": "object"
        -  },
        -  "fidelity": {
        -    "additionalProperties": true,
        -    "description": "Measured fidelity of the returned script (success).",
        -    "properties": {
        -      "maxDeviationMm": {
        -        "description": "Two-sided discrete Hausdorff distance, mesh vs reconstruction.",
        -        "type": "number"
        -      },
        -      "pass": {
        -        "description": "Refinement pass whose script is returned.",
        -        "type": "number"
        -      },
        -      "rmsMm": {
        -        "description": "RMS of the sampled point-to-surface distances.",
        -        "type": "number"
        -      },
        -      "thresholds": {
        -        "additionalProperties": true,
        -        "description": "{ minIoU, maxDeviationMm, approximateIoU } actually applied.",
        -        "type": "object"
        -      },
        -      "verdict": {
        -        "description": "faithful = IoU and deviation within thresholds, watertight mesh, nothing unmatched; approximate = IoU >= 0.85.",
        -        "enum": [
        -          "faithful",
        -          "approximate",
        -          "failed"
        -        ],
        -        "type": "string"
        -      },
        -      "volumeIoU": {
        -        "description": "Volume intersection-over-union by column ray casting.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "maxDeviationMm",
        -      "rmsMm",
        -      "volumeIoU",
        -      "verdict"
        -    ],
        -    "type": "object"
        -  },
        -  "ledger": {
        -    "additionalProperties": true,
        -    "description": "AssumptionLedger { facts, unresolvedCount }; dimension fact ids equal the param names (success).",
        -    "type": "object"
        -  },
        -  "mesh": {
        -    "additionalProperties": true,
        -    "description": "Clean-up and watertightness report for the input mesh.",
        -    "type": "object"
        -  },
        -  "notRepresented": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "passes": {
        -    "description": "Per-pass tolerances and measured fidelity.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "reconstructedHoles": {
        -    "description": "Holes the B-rep hole detector finds on the reconstruction.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "script": {
        -    "description": "The emitted, evaluable .kcad.ts source (success).",
        -    "type": "string"
        -  },
        -  "unmatchedRegions": {
        -    "description": "Surface regions no emitted feature represents: { kind, reason, areaMm2, triangleCount, centroid, bbox }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "written": {
        -    "additionalProperties": true,
        -    "description": "{ script, ledger } paths when out was given.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedproject_curve2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedquery2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "candidates": {
        -    "description": "mode:'resolve' — near-miss candidates (failure).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "chain": {
        -    "description": "mode:'lineage' — HistoryMap walk.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "entities": {
        -    "description": "mode:'evaluate' — matched entities.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "entity": {
        -    "additionalProperties": true,
        -    "description": "mode:'resolve' — the single matched entity.",
        -    "type": "object"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "query": {
        -    "additionalProperties": true,
        -    "description": "mode:'evaluate' — the resolved Query ({ ast }).",
        -    "type": "object"
        -  },
        -  "ref": {
        -    "description": "mode:'resolve' — the resolved ref string.",
        -    "type": "string"
        -  },
        -  "warnings": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedremove_feature2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedrender_preview2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "bounds": {
        -    "additionalProperties": true,
        -    "description": "Model AABB in mm { min, max } the camera was fit to (success).",
        -    "type": "object"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "errorHint": {
        -    "type": "string"
        -  },
        -  "images": {
        -    "description": "Rendered tiles { name, path, description } — absolute local PNG paths with per-view camera orientation (kernelCAD is Z-up).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "mechanism": {
        -    "description": "Mechanism-truth verdict: 'real' | 'broken' | 'unverified'.",
        -    "type": "string"
        -  },
        -  "mechanism_failure_codes": {
        -    "description": "De-duplicated failure codes when mechanism is 'broken'.",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "description": "Whether the preview rendered.",
        -    "type": "boolean"
        -  },
        -  "out_dir": {
        -    "description": "Directory holding the PNGs (session temp dir unless out_dir was given).",
        -    "type": "string"
        -  },
        -  "render_ms": {
        -    "description": "Wall-clock render time in ms (provisioning + browser + captures).",
        -    "type": "number"
        -  },
        -  "render_source": {
        -    "description": "Lane that served the render: 'static-player' | 'dev-server' | 'explicit'.",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "images",
        -  "diagnostics"
        -]
    • Changedrepair_script2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "after": {
        -    "additionalProperties": true,
        -    "description": "Post-repair { ok, featureHealth, diagnostics }.",
        -    "type": "object"
        -  },
        -  "applied": {
        -    "description": "Candidate id that was accepted.",
        -    "type": "string"
        -  },
        -  "attempts": {
        -    "description": "Per-candidate outcome { candidateId, applied, ok?, clearedDiagnostic?, newErrorCodes?, accepted, diagnostic? }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "before": {
        -    "additionalProperties": true,
        -    "description": "Pre-repair { ok, featureHealth, diagnostics }.",
        -    "type": "object"
        -  },
        -  "candidateReason": {
        -    "type": "string"
        -  },
        -  "candidateStatus": {
        -    "enum": [
        -      "candidates",
        -      "no-automatic-candidate"
        -    ],
        -    "type": "string"
        -  },
        -  "candidates": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "diagnostics": {
        -    "description": "tool.repair.* diagnostics when repair could not complete.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "diff": {
        -    "description": "Unified diff of the accepted patch (dry run: every candidate patch).",
        -    "type": "string"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Repaired .kcad.ts source (present when a patch applied). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether a candidate cleared the target diagnostic without new errors.",
        -    "type": "boolean"
        -  },
        -  "repairRegion": {
        -    "additionalProperties": true,
        -    "description": "The line ranges the repair was bound to.",
        -    "type": "object"
        -  },
        -  "strategy": {
        -    "enum": [
        -      "apply-first",
        -      "try-all",
        -      "dry-run"
        -    ],
        -    "type": "string"
        -  },
        -  "target": {
        -    "additionalProperties": true,
        -    "description": "The diagnostic this run targeted { id, code, featureId?, message }.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "strategy",
        -  "candidates",
        -  "attempts"
        -]
    • Changedresolve_assumptions2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ledger": {
        -    "additionalProperties": true,
        -    "description": "The ledger after applying resolutions (present on success).",
        -    "type": "object"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "paramOverrides": {
        -    "additionalProperties": true,
        -    "description": "factId -> value for every resolved fact with a value; feed into set_param.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "paramOverrides",
        -  "diagnostics"
        -]
    • Changedreview_cad2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "assembly": {
        -    "type": "string"
        -  },
        -  "connectorWorkspace": {
        -    "description": "Connector workspace bounds.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "featureCount": {
        -    "type": "number"
        -  },
        -  "fitness": {
        -    "additionalProperties": true,
        -    "description": "Mechanism fitness verdict incl. repairMode.",
        -    "type": "object"
        -  },
        -  "gripperAperture": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "interferenceSummary": {
        -    "additionalProperties": true,
        -    "description": "Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3.",
        -    "type": "object"
        -  },
        -  "mechanism": {
        -    "type": "string"
        -  },
        -  "mechanismFailures": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "physicalUseCaseJointReactionCertificates": {
        -    "description": "Exact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm.",
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "poses": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "reactions": {
        -          "items": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "axialForceN": {
        -                "type": "number"
        -              },
        -              "axisMomentNmm": {
        -                "type": "number"
        -              },
        -              "axisWorld": {
        -                "items": {
        -                  "type": "number"
        -                },
        -                "type": "array"
        -              },
        -              "bendingMomentNmm": {
        -                "type": "number"
        -              },
        -              "childPart": {
        -                "type": "string"
        -              },
        -              "forceWorldN": {
        -                "items": {
        -                  "type": "number"
        -                },
        -                "type": "array"
        -              },
        -              "mateName": {
        -                "type": "string"
        -              },
        -              "momentWorldNmm": {
        -                "items": {
        -                  "type": "number"
        -                },
        -                "type": "array"
        -              },
        -              "parentPart": {
        -                "type": "string"
        -              },
        -              "pointWorldMm": {
        -                "items": {
        -                  "type": "number"
        -                },
        -                "type": "array"
        -              },
        -              "radialForceN": {
        -                "type": "number"
        -              },
        -              "resultantForceN": {
        -                "type": "number"
        -              },
        -              "resultantMomentNmm": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "mateName",
        -              "parentPart",
        -              "childPart",
        -              "pointWorldMm",
        -              "axisWorld",
        -              "forceWorldN",
        -              "momentWorldNmm",
        -              "resultantForceN",
        -              "resultantMomentNmm",
        -              "axialForceN",
        -              "radialForceN",
        -              "axisMomentNmm",
        -              "bendingMomentNmm"
        -            ],
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        "useCaseName": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "useCaseName",
        -        "poses",
        -        "reactions"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "physicalUseCaseJointStructuralCertificates": {
        -    "description": "Per-joint declared-envelope and geometry/material clevis strength evidence.",
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "joints": {
        -          "items": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "envelope": {
        -                "additionalProperties": true,
        -                "type": "object"
        -              },
        -              "mateName": {
        -                "type": "string"
        -              },
        -              "structure": {
        -                "additionalProperties": true,
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "mateName",
        -              "envelope"
        -            ],
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        "poses": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "useCaseName": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "useCaseName",
        -        "poses",
        -        "joints"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "physicalUseCaseStaticCertificates": {
        -    "description": "Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "poseEnvelope": {
        -    "additionalProperties": true,
        -    "description": "Sampled mate-limit pose envelope.",
        -    "type": "object"
        -  },
        -  "rawInterferencePairs": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "repairContext": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "skippedStages": {
        -    "description": "Stages skipped because timeBudgetMs was spent; their checks did not run.",
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "reason": {
        -          "type": "string"
        -        },
        -        "stage": {
        -          "type": "string"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "stageTimingsMs": {
        -    "additionalProperties": {
        -      "type": "number"
        -    },
        -    "description": "Wall-clock ms per review stage that ran.",
        -    "type": "object"
        -  },
        -  "suggestedRepairPrompt": {
        -    "description": "Structured repair prompt (failure / repair path).",
        -    "type": "string"
        -  },
        -  "validator": {
        -    "additionalProperties": true,
        -    "description": "Assembly/mate-graph validator result.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "featureCount",
        -  "diagnostics"
        -]
    • Changedrun_fea2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "artifacts": {
        -    "additionalProperties": true,
        -    "description": "Absolute paths of the BREP geometry handoff, .inp deck, .frd results and mesh JSON, for hand reproduction.",
        -    "type": "object"
        -  },
        -  "diagnostics": {
        -    "description": "fea.* diagnostics raised by the run.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "images": {
        -    "description": "Absolute PNG paths of the rendered stress heatmap.",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "legend": {
        -    "description": "Heatmap colour bands { color, fromMPa, toMPa } — the scale the PNGs are drawn on.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "description": "False when the study violated its declared minSafetyFactor, a selector did not resolve, or the solver toolchain is missing.",
        -    "type": "boolean"
        -  },
        -  "out_dir": {
        -    "description": "Directory holding the summary JSON, solver deck and heatmap PNGs.",
        -    "type": "string"
        -  },
        -  "summary": {
        -    "additionalProperties": true,
        -    "description": "Solved evidence: maxVonMisesMPa, maxVonMisesAt, maxDisplacementMm, maxDisplacementAt, minSafetyFactor (+ minSafetyFactorRequired), nodeCount/elementCount/meshSizeMm, quality (minSICN, meanSICN, lowQualityCount), maxStressErrorPercent (high-stress region), trust { meshTrusted, reasons }, hotSpots [{ region, maxVonMisesMPa, nodeId, at, safetyFactor }]; the stress values, safety factor and hot spots exclude the support zone next to fixed-face edges (governingField), whose clamp-singular raw peak is reported as peakAtSupportMPa / peakAtSupportAt / peakAtSupportRegion with supportAdjacentNodeCount and supportZoneRadiusMm; appliedForceN / reactionForceN / equilibriumResidual, meshMs / solveMs.",
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedsend_to_printer2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "dry_run": {
        -    "description": "True when only connectivity/auth was validated (no upload, no print start).",
        -    "type": "boolean"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "uploaded_path": {
        -    "description": "Path/name the G-code (bambu-lan: the .gcode.3mf print file) was stored under on the printer.",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedset_param2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedset_scene_return2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "binding_name": {
        -    "description": "JS const name bound to the new construct (when one was created).",
        -    "type": "string"
        -  },
        -  "diagnostics": {
        -    "description": "Diagnostics from re-evaluating the modified source.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present when ok is false).",
        -    "type": "string"
        -  },
        -  "new_code": {
        -    "description": "Modified .kcad.ts source (present on success). Caller persists it.",
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the edit applied and re-evaluated cleanly.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedsolve_mates2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "errorHint": {
        -    "type": "string"
        -  },
        -  "iterations": {
        -    "description": "Solver iteration count (success).",
        -    "type": "number"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "poses": {
        -    "additionalProperties": true,
        -    "description": "Solved part poses keyed by mate; each a serialized Transform (success).",
        -    "type": "object"
        -  },
        -  "status": {
        -    "description": "Solver status (success).",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedsolve_sketch2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "constraints": {
        -    "description": "The constraints applied.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "converged": {
        -    "description": "Whether the constraint solve converged below tolerance. ok is false when this is false.",
        -    "type": "boolean"
        -  },
        -  "entities": {
        -    "description": "Solved sketch entities (best-effort on a non-converging solve).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "errors": {
        -    "description": "Solver/validation errors (present on failure, including non-convergence).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "residual": {
        -    "description": "Final aggregate constraint residual when the solver ran.",
        -    "type": "number"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "entities",
        -  "constraints"
        -]
    • Changedsweep_tolerance2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "combosCapped": {
        -    "description": "True when the full cartesian product exceeded the 64-combo cap.",
        -    "type": "boolean"
        -  },
        -  "combosEvaluated": {
        -    "description": "Number of combos actually evaluated (capped at 64).",
        -    "type": "number"
        -  },
        -  "diagnostics": {
        -    "description": "Sweep-level diagnostics (e.g. combo-cap-exceeded).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "firstFailure": {
        -    "additionalProperties": true,
        -    "description": "First failing combo per gate name.",
        -    "type": "object"
        -  },
        -  "ok": {
        -    "description": "Whether every gate passed on every evaluated combo.",
        -    "type": "boolean"
        -  },
        -  "results": {
        -    "description": "One entry per evaluated combo: { combo, gates, diagnostics }.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedtrace_from_image2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "features": {
        -    "description": "Traced features with normalized [0..1] waypoints + confidence.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "imageDims": {
        -    "description": "Pixel dimensions [width, height] of the source image.",
        -    "items": {
        -      "type": "number"
        -    },
        -    "type": "array"
        -  },
        -  "ledger": {
        -    "additionalProperties": true,
        -    "description": "Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.",
        -    "type": "object"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok",
        -  "features",
        -  "imageDims",
        -  "diagnostics",
        -  "ledger"
        -]
    • Changedverify2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "diagnostics": {
        -    "description": "Verifier diagnostics (most checks).",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "description": "Failure message (present on failure).",
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "description": "Whether the verification ran and passed its gate.",
        -    "type": "boolean"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
    • Changedwhy_did_this_fail2 fields changed
      • removedOutput schema / properties
        Removed value: -{
        -  "candidateReason": {
        -    "description": "Why no candidate was derivable.",
        -    "type": "string"
        -  },
        -  "candidateStatus": {
        -    "description": "'no-automatic-candidate' means the region is the whole answer — no mechanical fix exists for that diagnostic kind.",
        -    "enum": [
        -      "candidates",
        -      "no-automatic-candidate"
        -    ],
        -    "type": "string"
        -  },
        -  "candidates": {
        -    "description": "Ordered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "chain": {
        -    "description": "Upstream feature diagnostics in topological order; requested feature last.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "error": {
        -    "type": "string"
        -  },
        -  "errorCode": {
        -    "type": "string"
        -  },
        -  "feature_id": {
        -    "type": "string"
        -  },
        -  "ok": {
        -    "type": "boolean"
        -  },
        -  "repairRegion": {
        -    "additionalProperties": true,
        -    "description": "Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.",
        -    "type": "object"
        -  },
        -  "targetDiagnosticId": {
        -    "description": "Id of the diagnostic the repair plan targets; pass it to repair_script.",
        -    "type": "string"
        -  },
        -  "trace": {
        -    "description": "Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.",
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "ok"
        -]
  4. 2 tool updates
    • Changedevaluate_script1 field changed
      • addedOutput schema / properties / tubes
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Tube line report. Present only when the model has tubes; the gate diagnostics are in diagnostics.",
        +  "properties": {
        +    "lines": {
        +      "description": "One entry per tube: name, system, od, wall, bendRadius, material, cutLength (mm), bends, xyz (bend-table corner points), lra (length/rotation/angle rows), lastStraight, minStraight, minClearance { mm, to, at } (exact nearest part or tube), massKg (null without a known material or density), volumeInternalMl, pressureDropKPa (null without a declared flow).",
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "systems": {
        +      "description": "One entry per named system: { system, lines, cutLength, massKg }.",
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "lines",
        +    "systems"
        +  ],
        +  "type": "object"
        +}
    • Changedexport2 fields changed
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "stl",
        -  "step",
        -  "dxf",
        -  "3mf",
        -  "glb",
        -  "svg-drawing",
        -  "pdf-drawing",
        -  "urdf",
        -  "srdf",
        -  "sdf-gazebo",
        -  "usd-isaac",
        -  "bom-csv",
        -  "bom-json"
        -]New value: +[
        +  "stl",
        +  "step",
        +  "dxf",
        +  "3mf",
        +  "glb",
        +  "svg-drawing",
        +  "pdf-drawing",
        +  "urdf",
        +  "srdf",
        +  "sdf-gazebo",
        +  "usd-isaac",
        +  "bom-csv",
        +  "bom-json",
        +  "bend-table"
        +]
      • changedInput schema / properties / output_path / description
        Previous value: -"Destination path. target:'model' — the export file (required). target:'part' — single-part .stl path. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link."New value: +"Destination path (a directory for format 'bend-table'). target:'model' — the export file (required). target:'part' — single-part .stl path. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link."
  5. 2 tool updates
    • Addedorder_part
    • Addedprice_part
  6. 2 tool updates
    • Changedrun_fea1 field changed
      • changedInput schema / properties / refine / description
        Previous value: -"Automatic mesh refinement until the stress is trusted, inside the element and wall-time budgets (default true). false: one solve at mesh_size."New value: +"One automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true). false: one solve at mesh_size."
    • Changedverify1 field changed
      • changedInput schema / properties / refine / description
        Previous value: -"check:'load-capacity' mode:'fea' — automatic mesh refinement until the stress is trusted, inside the element and wall-time budgets (default true); false solves once at the study's meshSize."New value: +"check:'load-capacity' mode:'fea' — one automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true); false solves once at the study's meshSize."
  7. 2 tool updates
    • Changedrun_fea1 field changed
      • addedInput schema / properties / refine
        Added value: +{
        +  "description": "Automatic mesh refinement until the stress is trusted, inside the element and wall-time budgets (default true). false: one solve at mesh_size.",
        +  "type": "boolean"
        +}
    • Changedverify1 field changed
      • addedInput schema / properties / refine
        Added value: +{
        +  "description": "check:'load-capacity' mode:'fea' — automatic mesh refinement until the stress is trusted, inside the element and wall-time budgets (default true); false solves once at the study's meshSize.",
        +  "type": "boolean"
        +}
  8. 2 tool updates
    • Changedrun_fea1 field changed
      • changedOutput schema / properties / summary / description
        Previous value: -"Solved evidence: maxVonMisesMPa, maxVonMisesAt, maxDisplacementMm, maxDisplacementAt, minSafetyFactor (+ minSafetyFactorRequired), nodeCount/elementCount/meshSizeMm, quality (minSICN, meanSICN, lowQualityCount), maxStressErrorPercent, trust { meshTrusted, reasons }, hotSpots [{ region, maxVonMisesMPa, nodeId, at, safetyFactor }], appliedForceN / reactionForceN / equilibriumResidual, meshMs / solveMs."New value: +"Solved evidence: maxVonMisesMPa, maxVonMisesAt, maxDisplacementMm, maxDisplacementAt, minSafetyFactor (+ minSafetyFactorRequired), nodeCount/elementCount/meshSizeMm, quality (minSICN, meanSICN, lowQualityCount), maxStressErrorPercent (high-stress region), trust { meshTrusted, reasons }, hotSpots [{ region, maxVonMisesMPa, nodeId, at, safetyFactor }]; the stress values, safety factor and hot spots exclude the support zone next to fixed-face edges (governingField), whose clamp-singular raw peak is reported as peakAtSupportMPa / peakAtSupportAt / peakAtSupportRegion with supportAdjacentNodeCount and supportZoneRadiusMm; appliedForceN / reactionForceN / equilibriumResidual, meshMs / solveMs."
    • Changedverify6 fields changed
      • addedInput schema / properties / heatmaps
        Added value: +{
        +  "description": "check:'load-capacity' mode:'fea' — also render stress heatmap PNGs (default false).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / mesh_size
        Added value: +{
        +  "description": "check:'load-capacity' mode:'fea' — element size override, mm.",
        +  "type": "number"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"check:'load-capacity' — 'beam' (default) or 'stub'."New value: +"check:'load-capacity' — 'beam' (default), 'stub', or 'fea' (solve the script's feaStudy; needs the CalculiX + gmsh toolchain)."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "stub",
        -  "beam"
        -]New value: +[
        +  "stub",
        +  "beam",
        +  "fea"
        +]
      • changedInput schema / properties / safety_factor_threshold / description
        Previous value: -"check:'load-capacity' — pass/fail safety-factor floor (default 1.5)."New value: +"check:'load-capacity' — pass/fail safety-factor floor (default 1.5; mode 'fea': the study's minSafetyFactor when declared)."
      • addedInput schema / properties / study
        Added value: +{
        +  "description": "check:'load-capacity' mode:'fea' — feaStudy name (default: the last declared one).",
        +  "type": "string"
        +}
  9. 3 tool updates
    • Changedadd_surface1 field changed
      • changedInput schema / properties / sampling / description
        Previous value: -"kind:'boundary' — OCCT NbPtsOnCur sampling parameter (default 15)."New value: +"kind:'boundary' — points sampled along each boundary (default 15)."
    • Changedevaluate_script1 field changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"Fast validation only: skip OCCT lowering, DFM gates, and meshing. Does not set or clear the active session."New value: +"Fast validation only: skip solid build, DFM gates, and meshing. Does not set or clear the active session."
    • Changedexecute_cookbook2 fields changed
      • changedInput schema / properties / dryRun / description
        Previous value: -"Default false. dryRun:true is NOT evidence the cookbook builds under OCCT — capture-only checks; do not claim success or open Studio from a dry run alone."New value: +"Default false. dryRun:true is NOT evidence the cookbook builds a solid — capture-only checks; do not claim success or open Studio from a dry run alone."
      • changedOutput schema / properties / dryRunNotEvidence / description
        Previous value: -"Present when dryRun:true — dryRun success is NOT evidence of a real OCCT build."New value: +"Present when dryRun:true — dryRun success is not evidence the solid built."
  10. 3 tool updates
    • Changedexecute_cookbook3 fields changed
      • addedInput schema / properties / continue_design
        Added value: +{
        +  "description": "Pass true to add a revision to the design this chat is already saving, even if this call runs a different cookbook. Ignored when `project` is set.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / new_project
        Added value: +{
        +  "description": "Pass true to start a separate project even when this cookbook was already published in this chat.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Slug of an existing project. Adds a revision to that project. Omit to start a new project when this cookbook or design is different from the one this chat already saved.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedget_project_revision1 field changed
      • addedOutput schema / properties / title
        Added value: +{
        +  "description": "Title captured with this revision. Absent on revisions snapshotted before titles were stored.",
        +  "type": "string"
        +}
    • Changedopen_in_studio4 fields changed
      • addedInput schema / properties / continue_design
        Added value: +{
        +  "description": "Pass true to add a revision to the design this chat is already saving, even when this call is a different cookbook or title. Ignored when `project` is set.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / new_project / description
        Previous value: -"Pass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h."New value: +"Pass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h. Still wins over a matching title or cookbook."
      • addedOutput schema / properties / title
        Added value: +{
        +  "description": "Title stored for this revision (not a later revision of the same project).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / url / description
        Previous value: -"The /p/<slug> Studio link for the model."New value: +"Revision-pinned /p/<slug>?version= Studio link for the revision this call saved."
  11. 1 tool update
    • Changedevaluate_script1 field changed
      • addedOutput schema / properties / dimensions
        Added value: +{
        +  "description": "Dimensions declared with shape.dimension(), as the viewer labels them (e.g. \"hole spacing 30\"). Omitted when the script declares none.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "enum": [
        +          "linear",
        +          "diameter",
        +          "radius",
        +          "angular"
        +        ],
        +        "type": "string"
        +      },
        +      "source": {
        +        "enum": [
        +          "declared",
        +          "auto"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text",
        +      "kind",
        +      "source"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  12. 1 tool update
    • Changedexport1 field changed
      • addedOutput schema / properties / infill
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "3mf with options.infill — stress-graded infill: band table (density, stress range, volume %), saving vs uniform infill at the high density, FEA peaks, and images { heatmap, bands, cutaway } PNG paths.",
        +  "type": "object"
        +}
  13. 1 tool update
    • Changedopen_in_studio1 field changed
      • changedInput schema / properties / new_project / description
        Previous value: -"Pass true only when the user wants a separate, new model. Default: continue this chat's project."New value: +"Pass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h."
  14. 14 tool updates
    • Changeddrawing_to_cad2 fields changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
      • changedInput schema / properties / path / description
        Previous value: -"Path to the drawing PDF on the machine running kernelCAD."New value: +"Path to the drawing PDF on the machine running kernelCAD. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine."
    • Changedevaluate_script1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedexecute_cookbook1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedexport1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedfind_part1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedinspect1 field changed
      • changedInput schema / properties / file / description
        Previous value: -"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project."New value: +"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine."
    • Changedlookup_api1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedlookup_cookbook1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedmesh_to_features1 field changed
      • changedInput schema / properties / file / description
        Previous value: -"Path to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project."New value: +"Path to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine."
    • Changedopen_in_studio1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedrender_preview1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Changedrepair_script1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
    • Addedrequest_upload
    • Changedtrace_from_image2 fields changed
      • changedInput schema / properties / imageUrl / description
        Previous value: -"URL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path."New value: +"URL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine."
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to design, modify, and verify exact B-rep 3D CAD models by running build123d scripts on an OpenCascade kernel, with live three.js preview, collision and FDM printability checks, text-based spatial perception, user notes/sketch annotations, version history, and one-click export to OrcaSlicer.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents and software to create, edit, inspect, validate, and export CAD geometry through MCP using backend-neutral typed operations, with FreeCAD/OpenCascade as the authoritative B-rep backend and JSCAD preview.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to write TypeScript to create, render, verify, and export parametric 3D models using Replicad/OpenCascade CAD kernel, headlessly from terminal or MCP clients.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agent-assisted CAD engineering, allowing users to create, validate, and export CAD designs through natural language, with a deterministic engine that has zero LLM runtime dependency.
    Academic Free v1.1
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.