Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

kernelCAD

REMOTE · MCP.KERNELCAD.COM

CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.

0 this week 77 Trust /100

Last scanned (18 hours ago)

Scores higher than 69% of remote servers

Reachable. Last reached 4 Nov 2026.

Category Developer Tools

Recent critical change

Authorization (21 Oct 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security57
Transport & Reachability100
Schema Quality & AI Usability71
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 40280 tokens (~509/item across 79 items; 77 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
  • Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 95% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 79 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
  • Supports UI / widget rendering.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 −1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “fab_pack” rewrote its description, which is the text the model reads security
    • Stability: pass → 0.97 functional
    • New tool “search_assets” functional
    • New tool “get_asset_pack” functional
    • New tool “get_asset” functional
    • “fab_pack” reworded the description of “scope” cosmetic
  • 3 Nov 26 0
    • “write_bom” reworded the description of “handoff_json” cosmetic
    • “write_bom” reworded the description of “handoff” cosmetic
    • “write_bom” reworded the description of “catalog_parts” cosmetic
    • “write_bom” reworded the description of “handoff_path” cosmetic

    4 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 2 Nov 26 0
    • Tool “review_cad” rewrote its description, which is the text the model reads security
    • Tool “evaluate_script” rewrote its description, which is the text the model reads security
    • Tool “open_in_studio” rewrote its description, which is the text the model reads security
    • Tool “render_preview” rewrote its description, which is the text the model reads security
  • 1 Nov 26 0
    • Resource “kernelcad-studio-viewer” now points somewhere else: ui://kernelcad/studio-viewer-v8.html → ui://kernelcad/studio-viewer-v9.html security
    • Tool “open_in_studio” rewrote its description, which is the text the model reads security
    • New tool “estimate_assembly_manufacturing” functional
    • New tool “request_assembly_quote” functional
    • New tool “report_need” functional
    • “set_param” reworded the description of “new_value” cosmetic
  • 30 Oct 26 0
    • Tool “export” rewrote its description, which is the text the model reads security
    • “export” reworded the description of “options” cosmetic
    • “export” reworded the description of “no_verify” cosmetic
  • 29 Oct 26 +1
    • Stability: 0.97 → pass security
  • 28 Oct 26 −1
    • Stability: pass → 0.97 functional
  • 27 Oct 26 0
    • Resource “kernelcad-studio-viewer” now points somewhere else: ui://kernelcad/studio-viewer-v7.html → ui://kernelcad/studio-viewer-v8.html security
    • Tool “write_bom” rewrote its description, which is the text the model reads security
    • Tool “review_cad” rewrote its description, which is the text the model reads security
    • Tool “inspect_nurbs” rewrote its description, which is the text the model reads security
    • Tool “evaluate_script” rewrote its description, which is the text the model reads security
    • Tool “write_bom” is now declared destructive security
    • Tool “inspect_nurbs” changed its title: Inspect NURBS Surface → Inspect NURBS Curve cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Probed https://mcp.kernelcad.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_256_GCM_SHA384 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.kernelcad.com CN=YE2,O=Let's Encrypt,C=US 25 Sept 2026 24 Dec 2026 ECDSA 256 ECDSA-SHA384 67ab176a1f5fbb983220c16adf17cffbd90
SANs: api.kernelcad.com, mcp.kernelcad.com
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.kernelcad.com. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
kernelcad.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.kernelcad.com/mcp Verified 200
http (plaintext) http://mcp.kernelcad.com/mcp HTTPS enforced 301 https://mcp.kernelcad.com/mcp
MCP tools · 77 exposed · ~40,192 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_connector ~183

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.

NameTypeReqDescription
axisarray–Optional [x, y, z] axis.
codestringyesThe .kcad.ts source code.
namestringyesConnector name unique within the part.
normalarray–Optional [x, y, z] normal.
origin–yesOrigin as [x, y, z] shorthand, or a structured ConnectorOrigin.
part_bindingstringyesJS identifier bound to an AssemblyPartRef, e.g. "basePart".
typestringyes–

Structured output declared, but exposes no named fields.

No examples provided.

add_constraint ~78

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.

NameTypeReqDescription
constraintobjectyesThe constraint to append.
constraintsarray–Existing constraint list to append to (omit for an empty list).

Structured output declared, but exposes no named fields.

No examples provided.

add_curve ~521

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.

NameTypeReqDescription
aobject–kind:'hermite' — start endpoint.
bobject–kind:'hermite' — end endpoint.
binding_namestring–JS const name for the new Curve3D binding (default: _curve_<N>).
closedboolean–kind:'nurbs' — optional periodic/closed-curve flag.
codestringyesThe .kcad.ts source code.
controlPointsarray–kind:'nurbs' — control points as Vec3 triples in mm; at least 2 entries.
degreeinteger–kind:'nurbs' — curve degree; default 3 (cubic).
kindstringyesWhich curve-construction path to use.
knotsarray–kind:'nurbs' — optional explicit knot vector; missing => clamped-uniform inferred.
weightsarray–kind:'nurbs' — optional rational weights, one per control point (same length as controlPoints).

Structured output declared, but exposes no named fields.

No examples provided.

add_feature ~175

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.

NameTypeReqDescription
codestringyesThe .kcad.ts source code.
feature_codestringyesSingle-statement source line to insert (e.g. `const hole = cylinder(5, 2).translate(10, 10, -1);`).

Structured output declared, but exposes no named fields.

No examples provided.

add_mate ~528

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.

NameTypeReqDescription
astring–relation:'mate' — connector ref "<partName>.<connectorName>".
actuatorstring–relation:'transmission' — optional actuator.
assembly_bindingstringyesJS identifier bound to assembly(...).
bstring–relation:'mate' — connector ref "<partName>.<connectorName>".
codestringyesThe .kcad.ts source code.
drivenstring–relation:'coupling' — driven mate name.
drivenMatesarray–relation:'transmission' — driven mate names.
inputstring–relation:'transmission' — optional input.
kindstring–relation:'transmission' — transmission kind.
limitsDegarray–relation:'mate' — optional [minDeg, maxDeg].
limitsMmarray–relation:'mate' — optional [minMm, maxMm].
namestring–relation:'mate'|'transmission' — name unique within the assembly.
notesstring–relation:'transmission' — optional notes.
offsetnumber–relation:'coupling' — optional pose offset.
outputstring–relation:'transmission' — optional output.
patharray–relation:'transmission' — drive path.
poseobject–relation:'mate' — optional mate pose.
rationumber–relation:'coupling' — driven pose = source pose * ratio + offset.
relationstring–Which relationship to author (default 'mate').
sourcestring–relation:'coupling' — source mate name.
sourceMatestring–relation:'transmission' — source mate name.
typestring–relation:'mate' — mate type.

Structured output declared, but exposes no named fields.

No examples provided.

add_part ~190

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.

NameTypeReqDescription
assembly_bindingstringyesJS identifier bound to assembly(...), e.g. "arm".
atarray–Optional [x, y, z] assembly placement.
binding_namestring–Optional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier.
codestringyesThe .kcad.ts source code.
part_namestringyesAssembly-unique part name.
shape_expressionstringyesJS expression for the Shape to pass to assembly.part, inserted verbatim.

Structured output declared, but exposes no named fields.

No examples provided.

add_path_segment ~772

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.

NameTypeReqDescription
aobject–kind:'hermite' — start endpoint; point must match current pen position within 1e-6 mm.
bobject–kind:'hermite' — end endpoint; pen ends at b.point.
binding_namestring–Reserved for future use; the segment injection mutates the chain anchor in place.
chain_anchorstringyesJS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`).
codestringyesThe .kcad.ts source code.
controlPointsarray–kind:'nurbs' — control-net vertices as Vec2 pairs in mm; at least degree+1 entries.
degreeinteger–kind:'nurbs' — B-spline degree (default 3).
endTangentarray–kind:'spline' — optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters.
kindstringyesWhich path-segment kind to append.
knotsarray–kind:'nurbs' — optional explicit knot vector; length must equal controlPoints.length + degree + 1.
pointsarray–kind:'spline' — waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position.
startTangentarray–kind:'spline' — optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters.
tensionnumber–kind:'spline' — optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation.
weightsarray–kind:'nurbs' — optional rational weights (one per control point; strictly positive).

Structured output declared, but exposes no named fields.

No examples provided.

add_pattern_feature ~277

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.

NameTypeReqDescription
assign_tostring–Optional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form.
circularobject–Required when kind=circular.
codestringyesThe .kcad.ts source code.
gridobject–Required when kind=grid.
kindstringyes–
linearobject–Required when kind=linear.
targetstringyesVariable name of the Shape to pattern (inserted verbatim as the LHS receiver).

Structured output declared, but exposes no named fields.

No examples provided.

add_surface ~1,362

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…

NameTypeReqDescription
angle_degnumber–kind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction.
binding_namestring–JS 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 _drafte…
by_bindingstring–kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.
codestringyesCurrent .kcad.ts source.
continuity––kind:'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'.
controlsarray–kind:'nurbs' — control-point grid for direct construction (controls[u][v] = [x, y, z], mm).
curve_bindingsarray–kind:'boundary' — tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source.
degreeobject–kind:'nurbs' — degrees in U and V; each in [1, nU-1] / [1, nV-1].
facestring–kind:'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.
kindstringyesWhich surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'.
knotsobject–kind:'nurbs' — optional explicit knot vectors; missing => clamped uniform inferred.
neutral_planestring–kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.
opstring–kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).
periodicobject–kind:'nurbs' — optional periodic flags per parametric direction.
pull_dirarray–kind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time.
require_closedboolean–kind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid.
samplinginteger–kind:'boundary' — points sampled along each boundary (default 15).
section_sketch_idsarray–kind:'nurbs' — existing sketch FeatureIds (2 or more) to skin a surface through, in order.
shape_bindingstring–kind:'draft' — JS variable name of the Shape to taper (must be declared in source).
surface_bindingstring–kind:'trim' — JS variable name of the Surface to trim/split (must be declared in source).
surface_bindingsarray–kind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source).
tolerancenumber–kind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged.
weightsarray–kind:'nurbs' — optional rational weights, same grid shape as controls. Ignored in slice-1.

Structured output declared, but exposes no named fields.

No examples provided.

add_text ~726

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.

NameTypeReqDescription
alignstring–mode:'sketch' — horizontal alignment relative to position (default left); mode:'emboss' — relative to the UV anchor (default center).
anchorUnumber–mode:'emboss' — U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5.
anchorVnumber–mode:'emboss' — V anchor in [0, 1] face-local. Default 0.5.
bindAsstring–mode:'sketch' — emits `const <bindAs> = sketch.text(...)`; mode:'emboss' — emits `const <bindAs> = <target>.embossText(...);`.
codestringyesThe .kcad.ts source code.
contentstring–mode:'sketch' — text content (UTF-8, non-empty, non-whitespace).
depthnumber–mode:'emboss' — signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero.
facestring–mode:'emboss' — target face — canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label.
fontstring–mode:'sketch' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
fontFamilystring–mode:'emboss' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
modestringyesWhich text-authoring path to use.
positionarray–mode:'sketch' — [x, y] anchor in mm. Default [0, 0].
rotationnumber–mode:'sketch' — CCW rotation in degrees around position (default 0); mode:'emboss' — CCW rotation in the face tangent plane (default 0).
scaleModestring–mode:'emboss' — Drawing.sketchOnFace scaling mode. Default original.
sizenumber–mode:'sketch'|'emboss' — glyph cap height in mm (positive finite).
targetstring–mode:'emboss' — variable name of the Shape to chain onto (inserted verbatim).
textContentstring–mode:'emboss' — text content (UTF-8, non-empty, non-whitespace).

Structured output declared, but exposes no named fields.

No examples provided.

add_variable_sweep ~614

Use this when you need an organic swept solid whose cross-section changes along its length — a tapering body, horn, bottle, handle, ring band, fairing, or duct — authored as a variable-section sweep along a spine. Inserts `variableSweep(spine, sections, opts?)` into the .kcad.ts `code` immediately before the last top-level return (an empty `code` starts a new script that returns the sweep). Spine: EITHER `spine_points` ([[x,y,z], ...] in mm, interpolated with spline3d; `spine_closed: true` closes the loop for a ring) OR `spine_binding` (an existing Curve3D / Sketch / Vec3[] variable). Each section: `t` in [0, 1] plus a profile — inline `radius` (circle) or `width` + `height` (rectangle), or `profile_binding` (an existing Sketch); profiles are centred on the spine and turned to face along it. Sections are strictly increasing in t, first t=0, last t=1 (omit t on every section to space them evenly). On a closed spine t=1 is the seam and reuses the t=0 profile. Example: { code, spine_points: [[0,0,0],[0,10,30],[0,0,60]], sections: [{ t: 0, radius: 8 }, { t: 0.5, radius: 10 }, { t: 1, radius: 4 }] }. Returns the modified code, diagnostics from re-evaluating it, and `sweep` { volumeMm3, bbox } measured from the built solid (ok:false when the sweep built nothing). The result is a Shape binding: return it, or chain `.union(...)` etc. via add_feature. Orientation is not exposed by this MCP tool until runtime orientation support is wired. Side-effect-free.

NameTypeReqDescription
binding_namestring–JS const name for the new Shape binding (default: _sweep_<N>).
closedboolean–Optional closed-sweep flag.
codestringyesThe .kcad.ts source code ("" for a new script).
continuitystring–Inter-section continuity; default 'C1'.
sectionsarrayyesVarying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1.
spine_bindingstring–Existing variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source. Use this OR spine_points.
spine_closedboolean–With spine_points: close the spline into a loop (ring band, loop handle).
spine_pointsarray–Inline spine: at least 2 [x, y, z] points in mm, interpolated with spline3d. Use this OR spine_binding.

Structured output declared, but exposes no named fields.

No examples provided.

add_workspace_target ~153

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.

NameTypeReqDescription
assembly_bindingstringyesJS identifier bound to assembly(...).
codestringyesThe .kcad.ts source code.
connector_refstringyesConnector ref "<partName>.<connectorName>".
reachablearrayyesWorld-frame Vec3 targets the connector must be able to reach.
toleranceMmnumber–Optional non-negative tolerance in mm.

Structured output declared, but exposes no named fields.

No examples provided.

apply_surface_blend ~286

Use this when you need to author and evaluate a fillet or chamfer on a kernelCAD Shape. Inserts Shape.fillet(radius, selector, { continuity: G1|G2 }) or Shape.chamfer(distance, selector) through the existing public API and returns the patched source plus evaluation diagnostics. Selectors accept EdgeSelector syntax, including canonical edge refs/query strings or { face: canonical name, face label, or face query }. G2 continuity applies to fillets; chamfer uses the existing chamfer API. This authors the operation and does not extract blend-surface NURBS poles; that still requires kernel surface extraction.

NameTypeReqDescription
codestringyesInline .kcad.ts source.
continuitystring–Fillet continuity passed to the existing public API; defaults to G1. Chamfer ignores this field.
distancenumber–Chamfer distance in mm; required for operation:'chamfer'.
operationstring–Operation; defaults to 'fillet'.
radiusnumber–Fillet radius in mm; required for operation:'fillet'.
selector––Optional EdgeSelector: a canonical @kc[...] edge ref/query string or { face: canonical face name, face label, or FaceQuery descriptor }. Omit to select all sharp edges.
shape_bindingstringyesExisting Shape variable name to blend.

Structured output declared, but exposes no named fields.

No examples provided.

blockout_assembly ~205

Use this when you have a list of parts with bounding boxes and positions (from a layout, spreadsheet, another tool or a sketch) and need an evaluable placeholder assembly script. Pass parts as { name, bboxMm:[x,y,z], positionMm:[x,y,z], rotationDeg?, anchors? } in mm; positionMm locates the bbox lower corner and anchors are named points in assembly coordinates. Optional connections [{ from, to }] reference anchors as "part.anchor" (including built-ins origin, bbox_center, bbox_x_min..bbox_z_max) and become fastened mates that express connectivity intent only; no wire or route geometry is generated. Returns the script (corner-anchored box solids with named connectors) plus warnings. It reads no files and cuts nothing; refine the solids with add_part/add_feature afterwards.

NameTypeReqDescription
connectionsarray––
namestring–Assembly name, default "blockout".
partsarrayyes–

Structured output declared, but exposes no named fields.

No examples provided.

capture_animation ~1,135

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…

NameTypeReqDescription
backgroundstring–Turntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only — MP4/GIF have no usable alpha).
duration_msnumber–Turntable: one full revolution in ms (default 6000).
elevation_degnumber–Turntable: camera elevation above the horizon in degrees (default 22).
environmentstring–Turntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none').
filestringyesPath 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…
focusarray–Show only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification.
fpsnumber–Override the animationView record's fps.
frames_dirstring–PNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path.
heightinteger–Turntable frame height in px (default 1080; even for MP4).
hidearray–Hide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification.
no_verifyboolean–Skip the animation-pose interference verification (default: verify on).
output_pathstring–MP4 output path (.gif → looping GIF); default <scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir.
presetstring–Turntable look: 'publish' (default; studio product shot) or 'default' (engineering look).
shadowboolean–Turntable + publish: soft contact shadow under the model (default true).
turntableboolean–Seamless 360° orbit of the model instead of the animationView timeline.
verify_everyinteger–Additionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set).
widthinteger–Turntable frame width in px (default 1080; even for MP4).

Structured output declared, but exposes no named fields.

No examples provided.

design_loop ~890

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). Optionally write a Studio build record JSON.

NameTypeReqDescription
allowReviewWarningsarray–Warning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok.
assemblystring––
attemptsarrayyesOrdered 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.
autoReviseboolean–When true (default), failing attempts with repairable feature diagnostics (boolean miss, oversized fillet, …) run bounded repair_script and attach revisionAssist.suggestedPatches / autoApplied.sugges…
combinatorialboolean–Sample 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 fal…
consensusboolean–Best-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, candidat…
epsilonMm3number–Forwarded to review_cad.
goalstringyesOriginal user design goal. Fed into every review_cad repair prompt.
includeInterferenceboolean–Forwarded to review_cad. Default true.
includePoseEnvelopeboolean–Forwarded to review_cad. Default true.
outputRecordPathstring–Optional JSON path to write a Studio-compatible build record.
preserveInterfacesarray–External mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts.
recordTitlestring–Optional title for the build record.
requirePhysicalAcceptanceboolean–Require 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 cal…
requireVisualReviewboolean–Require screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks.
requirementsarray–Call-time external requirements ([{ name, predicate }]) every attempt is graded against, in the same ledger as script require(). Predicate shape: { metric, a?, b?, op, limit, tolerance?, density? };…
samplesPerMateinteger–Pose-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.
stopOnPassboolean–Stop after the first attempt that is functional and passes the quality gate. Default true.
trackConnectorsarray–Connector refs to track across sampled poses.

Structured output declared, but exposes no named fields.

No examples provided.

dfm_review ~608

Use this when you need a manufacturability (DFM) report before printing or machining a part: returns a pass/fail checklist, no dfmSpec(...) needed. Pass { file | code } and optional processes (default ['fdm', 'cnc']). FDM 3D printing checks: fdm.overhangs (unsupported overhang steeper than max_overhang_deg, default 45° from vertical), fdm.bridging (bridges over max_bridge_mm, default 10), fdm.min-wall (walls under 2 × nozzle_mm, default 0.4 mm nozzle), fdm.min-hole (holes under 5 × nozzle), fdm.min-pin (warn), fdm.bed-fit (printer profile bed, default generic-fdm), fdm.bed-contact (warn). CNC 3-axis milling checks: cnc.undercuts (surface unreachable from approach_axes, default ['+z']; list several axes for several setups) and cnc.internal-corner-radius (sharp internal corners and fillets smaller than the end-mill radius, tool_diameter_mm default 6). Returns { ok, verdict: 'pass'|'fail', checks: [{ id, process, part, status: 'pass'|'fail'|'warn', summary, value?, limit? }], fdm?, cnc?, diagnostics }. Settings from the script's dfmSpec({ process: 'fdm' }) are used as defaults; call options win. For the script-declared gates (clearance, voids, channels) use verify({ check: 'dfm' }).

NameTypeReqDescription
approach_axesarray–CNC tool approach directions, one per setup (the tool comes from that side). Default ['+z'].
build_directionstring–FDM part-local axis pointing up from the bed. Default '+z'.
codestring–Inline kernelCAD script source.
filestring–Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
max_bridge_mmnumber–FDM longest unsupported bridge, mm. Default 10.
max_overhang_degnumber–FDM steepest printable overhang, degrees from vertical (0 = wall, 90 = flat ceiling). Default 45.
max_undercut_area_mm2number–CNC unreachable area tolerated before cnc.undercuts fails, mm². Default 1.
nozzle_mmnumber–FDM nozzle diameter, mm. Default 0.4.
printerstring–FDM printer profile id for the bed-fit check. Default 'generic-fdm'.
processesarray–Processes to review. Default ['fdm', 'cnc'].
tool_diameter_mmnumber–CNC end-mill diameter, mm. Default 6.

Structured output declared, but exposes no named fields.

No examples provided.

diff_geometry ~616

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.

NameTypeReqDescription
baseCodestring–Baseline script — inline source.
baseFilestring–Baseline script — path to a .kcad.ts file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
codestring–Revised script — inline source. Mutually exclusive with params.
filestring–Revised 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.
out_dirstring–Directory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir.
paramsobject–Param-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…
renderboolean–Also 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.

Structured output declared, but exposes no named fields.

No examples provided.

diff_scripts ~439

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; a `return [a, b]` multi-body script diffs per body as "body[0]", "body[1]". An error that still leaves geometry (e.g. a skipped fillet) is listed under base/revised.errors beside the diff. Use after editing a script to verify exactly what changed physically before re-rendering. On a hosted server pass both versions inline: { baseCode: 'return box(10, 10, 10);', code: 'return box(10, 10, 12);' } (base_code/old_code/before and revised_code/new_code/after are accepted as aliases). Read-only — never touches the active session.

NameTypeReqDescription
baseCodestring–Baseline (before) script — inline source. One of baseFile / baseCode is required.
baseFilestring–Baseline (before) script — path to a .kcad.ts file. Local servers only. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
codestring–Revised (after) script — inline source. One of file / code is required.
filestring–Revised (after) script — path to a .kcad.ts file. Local servers only. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.

Structured output declared, but exposes no named fields.

No examples provided.

drawing_to_cad ~647

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:<id>" from request_upload (when the file is on the user's device).

NameTypeReqDescription
intentstring–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.
outstring–Write the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json.
pageinteger–1-based page to read. Default 1.
pathstring–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.
pdfBase64string–The PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server.
projectionstring–Override the projection angle read from the sheet (default: projection symbol or note, else third-angle).
verifyboolean–Evaluate the rebuilt part and compare it with the drawing. Default true.

Structured output declared, but exposes no named fields.

No examples provided.

estimate_assembly_manufacturing ~184

Prepare an indicative estimate and durable manufacturing checklist for a whole CAD assembly, including mixed materials and processes. The server reads material and sheet thickness from CAD, selects supported processes, checks live supplier offers, and reports any missing prices or blockers. This creates only a draft estimate. It does not send an order, charge the customer, or start checkout. Sign in to estimate private saved projects; source code and public projects can be estimated as a guest.

NameTypeReqDescription
assemblystring–Assembly name when the script contains multiple assemblies.
paramsobject–Current CAD parameter values. Materials and sheet thickness come from the CAD design.
projectSlugstring–Saved project slug. Use this for a saved assembly.
projectVersioninteger–Immutable saved revision to estimate.
sourcestring–Current kernelCAD source for an unsaved assembly.

Structured output declared, but exposes no named fields.

No examples provided.

evaluate_script ~1,272

Use this when you need to run a script and check it compiles. Full local builds return viewerUrl: a live Studio link reused and updated on later full builds in the same MCP process. Hosted builds return viewerMode: hosted and viewerHint pointing to open_in_studio; they do not start a loopback viewer. Full evaluations return step evidence: build validity, volume and before/after local PNG paths in one shared iso frame. Snapshots require PW_CDP_URL for an existing browser; unavailable captures report an explicit error. Run a kernelCAD .kcad.ts script and report pass/fail + feature count + diagnostics + sceneSummary (BREP validity, volume in mm³, face count, bounding size in mm). 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, as does a mate connector more than 6 mm outside its part bounding box (assembly.mechanical.connector-not-in-solid, the same error review_cad reports) — a mechanism (any mate or joint) 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). An animation or drive on a fastened joint (mechanism.motion-on-fixed-joint) is broken: animate a revolute/prismatic mate pose. For a model with moving joints or motion intent, `mechanismSummary.statement` is one plain line: "Motion checked: ..." names what ran; "Motion not checked: ..." is NOT a pass — never call that mechanism working. Every union() is checked too (no…

NameTypeReqDescription
baselinearray–The `selections` of an earlier evaluation of this model. A selector that now binds to a different face or edge is reported as selector.binding-changed (warning), one whose entity only moved or resize…
codestring–Inline kernelCAD script source.
dryRunboolean–Fast validation only: skip solid build, DFM gates, and meshing. Does not set or clear the active session.
filestring–Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
intentstring–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.
kernelstring–Solid-modeling kernel. Default 'occt' (OpenCascade); opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics.
requirementsarray–Call-time external requirements ([{ name, predicate }]) measured in the same `requirements` ledger, tagged source: 'external' and never persisted. The predicate is the serializable form of require():…
skipMechanismCheckboolean–Opt 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 mech…

Structured output declared, but exposes no named fields.

No examples provided.

evaluate_sdf ~232

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('<name>', field) and pass that name as fieldName. Hint: pass either { file } or { code }, plus { fieldName, point: [x,y,z] }.

NameTypeReqDescription
codestring–Inline kernelCAD script source.
fieldNamestringyessdf.bind binding name holding the SdfField.
filestring–Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
pointarrayyesSample point [x, y, z] in mm.

Structured output declared, but exposes no named fields.

No examples provided.

execute_cookbook ~518

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.

NameTypeReqDescription
continue_designboolean–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.
dryRunboolean–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.
idstring–Cookbook snippet id (e.g. gt2-timing-belt-drive, extrude-rounded-rect-plate).
intentstring–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.
kernelstring–Solid-modeling kernel forwarded to evaluate_script. Default 'occt'; opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics.
new_projectboolean–Pass true to start a separate project even when this cookbook was already published in this chat.
openInStudioboolean–Default false. When true, after a green full (non-dryRun) evaluate, call open_in_studio on the same script (hosted MCP).
projectstring–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.
querystring–When id is omitted: natural-language query; BM25 picks the top hit (same as lookup_cookbook).

Structured output declared, but exposes no named fields.

No examples provided.

explode_view ~223

Use this when you need an ordered exploded-view plan for an assembly. Supply parts as {name,center:[x,y,z],size:[x,y,z]} in mm. Optional assembly_order sets the sequence; missing order falls back to input part order, and unlisted/unknown order refs are reported. Choose mode axis (default) or radial; axis follows the requested direction, radial moves parts away from the assembly centroid. The result includes ready-to-paste param_declarations, animation_tracks and reverse_animation_tracks for animationView(), part_transforms for existing shapes, and script_fragment. cameraPlan gives framing guidance.

NameTypeReqDescription
assembly_orderarray––
axisarray–Assembly direction; default +Z.
duration_msinteger–Timeline duration from 500 to 60000 ms; default 3000.
modestring–Explode direction strategy; default axis.
partsarray–Named assembly parts and measured bbox centers/sizes in mm.
spacingnumber–Positive spacing scale; default 1.25.

Structured output declared, but exposes no named fields.

No examples provided.

export ~3,781

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/<part>.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: '<study>' | 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 (i…

NameTypeReqDescription
codestring–Inline kernelCAD script source.
feature_idstring–target:'model' — optional FeatureId to export; defaults to last.
filestring–Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
formatstring–target:'model' — output file format (required for that target).
intentstring–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.
no_verifyboolean–Skip the default STL/STEP validity and watertightness gates.
optionsobject–target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. step: { unit?: "mm"|"cm"|"in", verify?: boolean } (verify defaults to true and checks B-rep…
output_dirstring–target:'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 downlo…
output_pathstring–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 writ…
partstring–target:'part' — part name for single-part export, or 'all'.
targetstringyesWhich exporter to run: 'model' (whole-script geometry to one file) or 'part' (per-part STLs from a solved assembly).

Structured output declared, but exposes no named fields.

No examples provided.

fab_pack ~599

Use this when the user wants to get a part made: packages the fabrication files into one directory plus a zip, and returns links to public instant-quote pages. Pass { file | code } and output_dir; optional scope ('part', default — one script's files; 'bom' — the whole assembly's BOM: per-part single-body files, per-part drawings, bom.csv/json and vendor handoff texts; 'workshop' — part pack plus cut-list CSV/JSON, DXF flats.zip, and dfm_review JSON sidecar), name (default 'part'), formats (default step, stl, 3mf, pdf-drawing, bom-csv; add 'dxf' for flat/sheet; workshop also cut-list-csv/json, dfm-json, flats-zip), and processes ('3d-print' | 'cnc' | 'sheet-cut') to filter the links (bom: also narrows which fabricated rows are packed). Each file is written by the export tool, so its gates apply; a format that fails is reported in files[] and the rest still ship. Also writes manifest.json and README.txt. quote_links lists JLC3DP, JLCCNC, PCBWay, Xometry, SendCutSend and Craftcloud with the pack file to upload to each. One body per file: multi-body files are rejected by every shop. DXF is written only for flat or sheet-metal parts. The McMaster handoff text carries part numbers only, because McMaster quantities are packs and pack sizes are not in the catalog yet. These are plain web pages: nothing is uploaded or ordered. The user opens the link and uploads the file. Run dfm_review first if you have not. Hosted server: pack files are written on the kernelCAD server and returned in downloads[].url; nothing is uploaded to a fabrication service.

NameTypeReqDescription
codestring–Inline kernelCAD script source.
filestring–Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.
formatsarray–Files to include. Default step, stl, 3mf, pdf-drawing, bom-csv.
namestring–Base file name (letters, digits, '.', '_', '-'). Default 'part'.
output_dirstringyesDirectory to write the pack into (created if missing). Hosted server: only the directory name is used; the pack is written in a server-owned directory and returned as download links.
processesarray–Only return quote links for these processes. Default: all.
scopestring–Default 'part' (a single-part pack). 'bom' packs the whole assembly's BOM. 'workshop' packs shop files plus cut list, DXF flats zip, and DFM warnings JSON.

Structured output declared, but exposes no named fields.

No examples provided.

fea_summary ~151

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; run_fea then uses its in-process voxel solver — toolchain.default_solver says which), 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.

NameTypeReqDescription
output_dirstring–Directory a previous run_fea wrote to; omit for toolchain status + material table only.

Structured output declared, but exposes no named fields.

No examples provided.

fetch_part ~164

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.

NameTypeReqDescription
categorystring––
familystring––
idstring––
includeModelboolean–Resolve a hash-verified STEP/GLB model file instead of the plain catalog STEP record.
modelobject–Verified model options; supplying model implies includeModel.
partsBaseUrlstring–Opt-in remote endpoint; no default value ships with kernelCAD.
querystring––
standardstring––

Structured output declared, but exposes no named fields.

No examples provided.

find_part ~209

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.

NameTypeReqDescription
categorystring––
familystring––
intentstring–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.
limitnumber––
partsBaseUrlstring–Opt-in remote endpoint; no default value ships with kernelCAD.
querystring––
sourcestring––
standardstring––
tagstring––

Structured output declared, but exposes no named fields.

No examples provided.

fit_plane ~106

Use this when you need to fit an orthogonal least-squares plane to XYZ point-cloud data. Returns centroid, deterministic unit normal, signed point residuals, RMS residual and maximum absolute residual. Accepts points already parsed by the caller from scan data or mesh vertices. Computes parameters only; it does not create a surface body. Requires at least three non-collinear finite points.

NameTypeReqDescription
pointsarrayyesPoint cloud as [x, y, z] coordinate triples in model units.

Structured output declared, but exposes no named fields.

No examples provided.

flatten_pattern ~131

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). Any number of parallel bends; crossing bends need corner relief. Pass { file } or { code }; optional { featureId } to pick a specific Shape.

NameTypeReqDescription
codestring––
featureIdstring––
filestring–Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.

Structured output declared, but exposes no named fields.

No examples provided.

get_asset ~157

Fetch one public catalogue asset by slug. Read-only. No sign-in and no API key. Returns the search fields plus params (the knob schema), presets, rig, and public download paths. UNITS: metres, Y is up. stats.size_m and stats.origin_y are metres. RIG: each rig entry is a named pivot. type "rotate" has range in degrees; type "slide" has range in metres; axis is the pivot's local x, y or z. license is the SPDX id to keep with the asset. The download paths are public catalogue routes. Call get_asset_pack for a short-lived signed zip URL. Do not send an API key.

NameTypeReqDescription
slugstringyesCatalogue slug from search_assets.

Structured output declared, but exposes no named fields.

No examples provided.

get_asset_pack ~145

Return a short-lived signed URL for a catalogue asset zip (mesh, params, licence). Read-only. No sign-in. The URL is already signed. Fetch it with GET. Do not send an API key or an Authorization header. It expires quickly; read expires_at. Share download_url with the user. Units in the pack follow the catalogue: metres, Y is up. A rig, when present, names pivots of type rotate (degrees) or slide (metres). If the publisher stored no pack, the result is { ok: false, error: "not_stored" }.

NameTypeReqDescription
slugstringyesCatalogue slug from search_assets or get_asset.

Structured output declared, but exposes no named fields.

No examples provided.

get_latest_render ~626

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.

NameTypeReqDescription
paths_onlyboolean–Controls 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…
slugstringyesProject 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.
viewstring–View 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 th…
NameTypeReqDescription
bytesnumber–PNG byte length (when ok).
errorstring–Error code when ok is false (e.g. "empty_geometry", "mesh_failed", "mesh_timeout").
heightnumber–Rendered image edge in px (when ok).
hintstring–Next-action hint when ok is false.
image_b64string–Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.
okboolean–Whether a render was produced.
truncatedboolean–Set when inline was requested but the PNG exceeded the size cap.
viewstring–The view that was rendered (when ok).
widthnumber–Rendered image edge in px (when ok).

No examples provided.

get_model_mesh ~89

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.

NameTypeReqDescription
slugstringyesProject slug from open_in_studio/get_project.

Structured output declared, but exposes no named fields.

No examples provided.

get_project ~242

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/<slug> 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.

NameTypeReqDescription
slugstring–The project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects.
NameTypeReqDescription
assetsobject–Complementary files keyed by source-relative path.
codestring–Fetch mode: the full .kcad source.
embedUrlstring–Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).
meshErrorstring–Fetch mode: sanitized repair/persist error when meshStatus is failed.
meshHintstring–Fetch mode: when meshStatus=building — transient; poll again or re-open_in_studio; never imply permanent 404.
meshReadyboolean–Fetch mode: true only when meshStatus===ready.
meshStatusstring–Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).
meshUrlstring–Fetch 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).
okboolean–Whether the read succeeded.
paintHintstring––
parametersarray–Fetch mode: the model's editable parameters.
privacystring–Fetch mode: the project privacy.
projectSavedboolean–Fetch mode: true when the project was loaded.
projectsarray–List mode (no slug): the user's saved projects.
serverBuildstring–Deploy identity (package+git SHA@boot time) so connector lag is observable.
slugstring–Fetch mode: the project slug.
titlestring–Fetch mode: the project title.
updated_atstring–Fetch mode: last-updated timestamp.
urlstring–Fetch mode: revision-pinned /p/<slug>?version= link.
versionnumber–Fetch mode: the project version.
viewerPaintedboolean–Always false on tools/call; widget sets true after correlated model_displayed.

No examples provided.

get_project_revision ~109

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.

NameTypeReqDescription
slugstringyesProject slug returned by open_in_studio.
versionintegeryesPositive immutable revision version returned by open_in_studio.
NameTypeReqDescription
assetsobject–Immutable complementary-file manifest.
codestringyesExact .kcad source captured at this revision.
okbooleanyesWhether the revision was found and readable.
parametersarrayyesExact editable parameters captured at this revision.
slugstringyesProject slug.
titlestring–Title captured with this revision. Absent on revisions snapshotted before titles were stored.
versionintegeryesImmutable revision version.

No examples provided.

get_selection ~156

Use this when you need to read the human/agent selection in a local Studio session. Returns one clicked face or edge (or null), with current-generation mesh-local shapeIndex/kind/id and creating featureId. During a rebuild selection is null with “selection pending rebuild” until Studio uniquely verifies the face; ambiguous or deleted faces are cleared. Inspect the current shape before authoring a fillet. Requires a running local Studio opened on the same script; hosted sessions are not supported.

NameTypeReqDescription
sessionstringyesStudio sessionToken from GET /__kernelcad/session?script=<path>. Use the same script as the viewer.
studio_urlstringyesLocal Studio HTTP origin, e.g. http://localhost:5173.

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the kernelCAD MCP server?

kernelCAD is a hosted endpoint at https://mcp.kernelcad.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.kernelcad.com

# add to Claude Code
claude mcp add --transport http com-kernelcad-kernelcad 'https://mcp.kernelcad.com/mcp'
Common questions

What is the kernelCAD MCP server?

kernelCAD is an MCP server listed in the public MCP registry as com.kernelcad/kernelcad. CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks. This page covers its hosted endpoint (https://mcp.kernelcad.com/mcp).

Is the kernelCAD MCP server safe to use?

kernelCAD scores 77 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the kernelCAD MCP server expose?

kernelCAD exposes 77 tools: review_paint_peek_latest, open_in_studio, get_project, get_project_revision, get_latest_render, and 72 more. Their descriptions and schemas cost roughly 40,192 tokens of context every time the server is loaded.

Does the kernelCAD MCP server require authentication?

No. We connected to kernelCAD without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the kernelCAD MCP server still maintained?

kernelCAD is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.