kernelCAD
REMOTE · MCP.KERNELCAD.COM
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
Available components
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.
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (remove_feature). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
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 |
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 →
add_connector 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.
| Name | Type | Req | Description |
|---|---|---|---|
| axis | array | – | Optional [x, y, z] axis. |
| code | string | yes | The .kcad.ts source code. |
| name | string | yes | Connector name unique within the part. |
| normal | array | – | Optional [x, y, z] normal. |
| origin | – | yes | Origin as [x, y, z] shorthand, or a structured ConnectorOrigin. |
| part_binding | string | yes | JS identifier bound to an AssemblyPartRef, e.g. "basePart". |
| type | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
add_constraint 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.
| Name | Type | Req | Description |
|---|---|---|---|
| constraint | object | yes | The constraint to append. |
| constraints | array | – | Existing constraint list to append to (omit for an empty list). |
Structured output declared, but exposes no named fields.
No examples provided.
add_curve 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.
| Name | Type | Req | Description |
|---|---|---|---|
| a | object | – | kind:'hermite' — start endpoint. |
| b | object | – | kind:'hermite' — end endpoint. |
| binding_name | string | – | JS const name for the new Curve3D binding (default: _curve_<N>). |
| closed | boolean | – | kind:'nurbs' — optional periodic/closed-curve flag. |
| code | string | yes | The .kcad.ts source code. |
| controlPoints | array | – | kind:'nurbs' — control points as Vec3 triples in mm; at least 2 entries. |
| degree | integer | – | kind:'nurbs' — curve degree; default 3 (cubic). |
| kind | string | yes | Which curve-construction path to use. |
| knots | array | – | kind:'nurbs' — optional explicit knot vector; missing => clamped-uniform inferred. |
| weights | array | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The .kcad.ts source code. |
| feature_code | string | yes | Single-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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | – | relation:'mate' — connector ref "<partName>.<connectorName>". |
| actuator | string | – | relation:'transmission' — optional actuator. |
| assembly_binding | string | yes | JS identifier bound to assembly(...). |
| b | string | – | relation:'mate' — connector ref "<partName>.<connectorName>". |
| code | string | yes | The .kcad.ts source code. |
| driven | string | – | relation:'coupling' — driven mate name. |
| drivenMates | array | – | relation:'transmission' — driven mate names. |
| input | string | – | relation:'transmission' — optional input. |
| kind | string | – | relation:'transmission' — transmission kind. |
| limitsDeg | array | – | relation:'mate' — optional [minDeg, maxDeg]. |
| limitsMm | array | – | relation:'mate' — optional [minMm, maxMm]. |
| name | string | – | relation:'mate'|'transmission' — name unique within the assembly. |
| notes | string | – | relation:'transmission' — optional notes. |
| offset | number | – | relation:'coupling' — optional pose offset. |
| output | string | – | relation:'transmission' — optional output. |
| path | array | – | relation:'transmission' — drive path. |
| pose | object | – | relation:'mate' — optional mate pose. |
| ratio | number | – | relation:'coupling' — driven pose = source pose * ratio + offset. |
| relation | string | – | Which relationship to author (default 'mate'). |
| source | string | – | relation:'coupling' — source mate name. |
| sourceMate | string | – | relation:'transmission' — source mate name. |
| type | string | – | relation:'mate' — mate type. |
Structured output declared, but exposes no named fields.
No examples provided.
add_part 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly_binding | string | yes | JS identifier bound to assembly(...), e.g. "arm". |
| at | array | – | Optional [x, y, z] assembly placement. |
| binding_name | string | – | Optional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier. |
| code | string | yes | The .kcad.ts source code. |
| part_name | string | yes | Assembly-unique part name. |
| shape_expression | string | yes | JS 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| a | object | – | kind:'hermite' — start endpoint; point must match current pen position within 1e-6 mm. |
| b | object | – | kind:'hermite' — end endpoint; pen ends at b.point. |
| binding_name | string | – | Reserved for future use; the segment injection mutates the chain anchor in place. |
| chain_anchor | string | yes | JS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`). |
| code | string | yes | The .kcad.ts source code. |
| controlPoints | array | – | kind:'nurbs' — control-net vertices as Vec2 pairs in mm; at least degree+1 entries. |
| degree | integer | – | kind:'nurbs' — B-spline degree (default 3). |
| endTangent | array | – | kind:'spline' — optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters. |
| kind | string | yes | Which path-segment kind to append. |
| knots | array | – | kind:'nurbs' — optional explicit knot vector; length must equal controlPoints.length + degree + 1. |
| points | array | – | kind:'spline' — waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position. |
| startTangent | array | – | kind:'spline' — optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters. |
| tension | number | – | kind:'spline' — optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation. |
| weights | array | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assign_to | string | – | Optional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form. |
| circular | object | – | Required when kind=circular. |
| code | string | yes | The .kcad.ts source code. |
| grid | object | – | Required when kind=grid. |
| kind | string | yes | – |
| linear | object | – | Required when kind=linear. |
| target | string | yes | Variable 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 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…
| Name | Type | Req | Description |
|---|---|---|---|
| angle_deg | number | – | kind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction. |
| binding_name | string | – | 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_binding | string | – | kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred. |
| code | string | yes | Current .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'. |
| controls | array | – | kind:'nurbs' — control-point grid for direct construction (controls[u][v] = [x, y, z], mm). |
| curve_bindings | array | – | kind:'boundary' — tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source. |
| degree | object | – | kind:'nurbs' — degrees in U and V; each in [1, nU-1] / [1, nV-1]. |
| face | string | – | 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. |
| kind | string | yes | Which surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'. |
| knots | object | – | kind:'nurbs' — optional explicit knot vectors; missing => clamped uniform inferred. |
| neutral_plane | string | – | kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted. |
| op | string | – | kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()). |
| periodic | object | – | kind:'nurbs' — optional periodic flags per parametric direction. |
| pull_dir | array | – | kind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time. |
| require_closed | boolean | – | kind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid. |
| sampling | integer | – | kind:'boundary' — points sampled along each boundary (default 15). |
| section_sketch_ids | array | – | kind:'nurbs' — existing sketch FeatureIds (2 or more) to skin a surface through, in order. |
| shape_binding | string | – | kind:'draft' — JS variable name of the Shape to taper (must be declared in source). |
| surface_binding | string | – | kind:'trim' — JS variable name of the Surface to trim/split (must be declared in source). |
| surface_bindings | array | – | kind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source). |
| tolerance | number | – | kind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged. |
| weights | array | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| align | string | – | mode:'sketch' — horizontal alignment relative to position (default left); mode:'emboss' — relative to the UV anchor (default center). |
| anchorU | number | – | mode:'emboss' — U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5. |
| anchorV | number | – | mode:'emboss' — V anchor in [0, 1] face-local. Default 0.5. |
| bindAs | string | – | mode:'sketch' — emits `const <bindAs> = sketch.text(...)`; mode:'emboss' — emits `const <bindAs> = <target>.embossText(...);`. |
| code | string | yes | The .kcad.ts source code. |
| content | string | – | mode:'sketch' — text content (UTF-8, non-empty, non-whitespace). |
| depth | number | – | mode:'emboss' — signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero. |
| face | string | – | mode:'emboss' — target face — canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label. |
| font | string | – | mode:'sketch' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans. |
| fontFamily | string | – | mode:'emboss' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans. |
| mode | string | yes | Which text-authoring path to use. |
| position | array | – | mode:'sketch' — [x, y] anchor in mm. Default [0, 0]. |
| rotation | number | – | mode:'sketch' — CCW rotation in degrees around position (default 0); mode:'emboss' — CCW rotation in the face tangent plane (default 0). |
| scaleMode | string | – | mode:'emboss' — Drawing.sketchOnFace scaling mode. Default original. |
| size | number | – | mode:'sketch'|'emboss' — glyph cap height in mm (positive finite). |
| target | string | – | mode:'emboss' — variable name of the Shape to chain onto (inserted verbatim). |
| textContent | string | – | mode:'emboss' — text content (UTF-8, non-empty, non-whitespace). |
Structured output declared, but exposes no named fields.
No examples provided.
add_variable_sweep 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.
| Name | Type | Req | Description |
|---|---|---|---|
| binding_name | string | – | JS const name for the new Shape binding (default: _sweep_<N>). |
| closed | boolean | – | Optional closed-sweep flag. |
| code | string | yes | The .kcad.ts source code ("" for a new script). |
| continuity | string | – | Inter-section continuity; default 'C1'. |
| sections | array | yes | Varying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1. |
| spine_binding | string | – | Existing variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source. Use this OR spine_points. |
| spine_closed | boolean | – | With spine_points: close the spline into a loop (ring band, loop handle). |
| spine_points | array | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly_binding | string | yes | JS identifier bound to assembly(...). |
| code | string | yes | The .kcad.ts source code. |
| connector_ref | string | yes | Connector ref "<partName>.<connectorName>". |
| reachable | array | yes | World-frame Vec3 targets the connector must be able to reach. |
| toleranceMm | number | – | Optional non-negative tolerance in mm. |
Structured output declared, but exposes no named fields.
No examples provided.
apply_surface_blend Apply Fillet or Chamfer 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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | Inline .kcad.ts source. |
| continuity | string | – | Fillet continuity passed to the existing public API; defaults to G1. Chamfer ignores this field. |
| distance | number | – | Chamfer distance in mm; required for operation:'chamfer'. |
| operation | string | – | Operation; defaults to 'fillet'. |
| radius | number | – | 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_binding | string | yes | Existing Shape variable name to blend. |
Structured output declared, but exposes no named fields.
No examples provided.
blockout_assembly Block Out Assembly from Parts List ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| connections | array | – | – |
| name | string | – | Assembly name, default "blockout". |
| parts | array | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
capture_animation 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…
| Name | Type | Req | Description |
|---|---|---|---|
| background | string | – | Turntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only — MP4/GIF have no usable alpha). |
| duration_ms | number | – | Turntable: one full revolution in ms (default 6000). |
| elevation_deg | number | – | Turntable: camera elevation above the horizon in degrees (default 22). |
| environment | string | – | Turntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none'). |
| file | string | yes | Path 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… |
| focus | array | – | Show only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification. |
| fps | number | – | Override the animationView record's fps. |
| frames_dir | string | – | PNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path. |
| height | integer | – | Turntable frame height in px (default 1080; even for MP4). |
| hide | array | – | Hide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification. |
| no_verify | boolean | – | Skip the animation-pose interference verification (default: verify on). |
| output_path | string | – | MP4 output path (.gif → looping GIF); default <scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir. |
| preset | string | – | Turntable look: 'publish' (default; studio product shot) or 'default' (engineering look). |
| shadow | boolean | – | Turntable + publish: soft contact shadow under the model (default true). |
| turntable | boolean | – | Seamless 360° orbit of the model instead of the animationView timeline. |
| verify_every | integer | – | Additionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set). |
| width | integer | – | Turntable frame width in px (default 1080; even for MP4). |
Structured output declared, but exposes no named fields.
No examples provided.
design_loop Run 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.
| Name | Type | Req | Description |
|---|---|---|---|
| allowReviewWarnings | array | – | Warning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok. |
| assembly | string | – | – |
| attempts | array | yes | Ordered 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. |
| autoRevise | boolean | – | When true (default), failing attempts with repairable feature diagnostics (boolean miss, oversized fillet, …) run bounded repair_script and attach revisionAssist.suggestedPatches / autoApplied.sugges… |
| combinatorial | boolean | – | 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… |
| consensus | boolean | – | 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… |
| epsilonMm3 | number | – | Forwarded to review_cad. |
| goal | string | yes | Original user design goal. Fed into every review_cad repair prompt. |
| includeInterference | boolean | – | Forwarded to review_cad. Default true. |
| includePoseEnvelope | boolean | – | Forwarded to review_cad. Default true. |
| outputRecordPath | string | – | Optional JSON path to write a Studio-compatible build record. |
| preserveInterfaces | array | – | External mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts. |
| recordTitle | string | – | Optional title for the build record. |
| requirePhysicalAcceptance | boolean | – | 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… |
| requireVisualReview | boolean | – | Require screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks. |
| requirements | array | – | 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? };… |
| samplesPerMate | integer | – | 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. |
| stopOnPass | boolean | – | Stop after the first attempt that is functional and passes the quality gate. Default true. |
| trackConnectors | array | – | Connector refs to track across sampled poses. |
Structured output declared, but exposes no named fields.
No examples provided.
dfm_review Review Manufacturability ~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' }).
| Name | Type | Req | Description |
|---|---|---|---|
| approach_axes | array | – | CNC tool approach directions, one per setup (the tool comes from that side). Default ['+z']. |
| build_direction | string | – | FDM part-local axis pointing up from the bed. Default '+z'. |
| code | string | – | Inline kernelCAD script source. |
| file | string | – | 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_mm | number | – | FDM longest unsupported bridge, mm. Default 10. |
| max_overhang_deg | number | – | FDM steepest printable overhang, degrees from vertical (0 = wall, 90 = flat ceiling). Default 45. |
| max_undercut_area_mm2 | number | – | CNC unreachable area tolerated before cnc.undercuts fails, mm². Default 1. |
| nozzle_mm | number | – | FDM nozzle diameter, mm. Default 0.4. |
| printer | string | – | FDM printer profile id for the bed-fit check. Default 'generic-fdm'. |
| processes | array | – | Processes to review. Default ['fdm', 'cnc']. |
| tool_diameter_mm | number | – | CNC end-mill diameter, mm. Default 6. |
Structured output declared, but exposes no named fields.
No examples provided.
diff_geometry Diff Model 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.
| Name | Type | Req | Description |
|---|---|---|---|
| baseCode | string | – | Baseline script — inline source. |
| baseFile | string | – | 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. |
| code | string | – | Revised script — inline source. Mutually exclusive with params. |
| file | string | – | 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_dir | string | – | Directory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir. |
| params | object | – | 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… |
| render | boolean | – | 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 Diff CAD 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.
| Name | Type | Req | Description |
|---|---|---|---|
| baseCode | string | – | Baseline (before) script — inline source. One of baseFile / baseCode is required. |
| baseFile | string | – | 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. |
| code | string | – | Revised (after) script — inline source. One of file / code is required. |
| file | string | – | 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 Convert 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).
| Name | Type | Req | Description |
|---|---|---|---|
| intent | string | – | 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. |
| out | string | – | Write the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json. |
| page | integer | – | 1-based page to read. Default 1. |
| path | string | – | 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. |
| pdfBase64 | string | – | The PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server. |
| projection | string | – | Override the projection angle read from the sheet (default: projection symbol or note, else third-angle). |
| verify | boolean | – | 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly | string | – | Assembly name when the script contains multiple assemblies. |
| params | object | – | Current CAD parameter values. Materials and sheet thickness come from the CAD design. |
| projectSlug | string | – | Saved project slug. Use this for a saved assembly. |
| projectVersion | integer | – | Immutable saved revision to estimate. |
| source | string | – | Current kernelCAD source for an unsaved assembly. |
Structured output declared, but exposes no named fields.
No examples provided.
evaluate_script Evaluate CAD 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…
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | array | – | 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… |
| code | string | – | Inline kernelCAD script source. |
| dryRun | boolean | – | Fast validation only: skip solid build, DFM gates, and meshing. Does not set or clear the active session. |
| file | string | – | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| intent | string | – | 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. |
| kernel | string | – | Solid-modeling kernel. Default 'occt' (OpenCascade); opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics. |
| requirements | array | – | 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():… |
| skipMechanismCheck | boolean | – | 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 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] }.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| fieldName | string | yes | sdf.bind binding name holding the SdfField. |
| file | string | – | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| point | array | yes | Sample point [x, y, z] in mm. |
Structured output declared, but exposes no named fields.
No examples provided.
execute_cookbook 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.
| Name | Type | Req | Description |
|---|---|---|---|
| continue_design | boolean | – | 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. |
| dryRun | boolean | – | 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. |
| id | string | – | Cookbook snippet id (e.g. gt2-timing-belt-drive, extrude-rounded-rect-plate). |
| intent | string | – | 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. |
| kernel | string | – | Solid-modeling kernel forwarded to evaluate_script. Default 'occt'; opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics. |
| new_project | boolean | – | Pass true to start a separate project even when this cookbook was already published in this chat. |
| openInStudio | boolean | – | Default false. When true, after a green full (non-dryRun) evaluate, call open_in_studio on the same script (hosted MCP). |
| project | string | – | 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. |
| query | string | – | 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 Plan Exploded 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly_order | array | – | – |
| axis | array | – | Assembly direction; default +Z. |
| duration_ms | integer | – | Timeline duration from 500 to 60000 ms; default 3000. |
| mode | string | – | Explode direction strategy; default axis. |
| parts | array | – | Named assembly parts and measured bbox centers/sizes in mm. |
| spacing | number | – | Positive spacing scale; default 1.25. |
Structured output declared, but exposes no named fields.
No examples provided.
export 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…
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| feature_id | string | – | target:'model' — optional FeatureId to export; defaults to last. |
| file | string | – | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| format | string | – | target:'model' — output file format (required for that target). |
| intent | string | – | 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_verify | boolean | – | Skip the default STL/STEP validity and watertightness gates. |
| options | object | – | 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_dir | string | – | 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_path | string | – | 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… |
| part | string | – | target:'part' — part name for single-part export, or 'all'. |
| target | string | yes | Which 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 Package Fabrication Files ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| file | string | – | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| formats | array | – | Files to include. Default step, stl, 3mf, pdf-drawing, bom-csv. |
| name | string | – | Base file name (letters, digits, '.', '_', '-'). Default 'part'. |
| output_dir | string | yes | Directory 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. |
| processes | array | – | Only return quote links for these processes. Default: all. |
| scope | string | – | 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 Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| output_dir | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | – |
| family | string | – | – |
| id | string | – | – |
| includeModel | boolean | – | Resolve a hash-verified STEP/GLB model file instead of the plain catalog STEP record. |
| model | object | – | Verified model options; supplying model implies includeModel. |
| partsBaseUrl | string | – | Opt-in remote endpoint; no default value ships with kernelCAD. |
| query | string | – | – |
| standard | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
find_part 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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | – |
| family | string | – | – |
| intent | string | – | 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. |
| limit | number | – | – |
| partsBaseUrl | string | – | Opt-in remote endpoint; no default value ships with kernelCAD. |
| query | string | – | – |
| source | string | – | – |
| standard | string | – | – |
| tag | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
fit_plane Fit Plane to Points ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| points | array | yes | Point cloud as [x, y, z] coordinate triples in model units. |
Structured output declared, but exposes no named fields.
No examples provided.
flatten_pattern Flatten Sheet-Metal 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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | – |
| featureId | string | – | – |
| file | string | – | 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 Get Catalogue 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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Catalogue slug from search_assets. |
Structured output declared, but exposes no named fields.
No examples provided.
get_asset_pack Get Catalogue 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" }.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Catalogue slug from search_assets or get_asset. |
Structured output declared, but exposes no named fields.
No examples provided.
get_latest_render 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.
| Name | Type | Req | Description |
|---|---|---|---|
| paths_only | boolean | – | 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… |
| slug | string | yes | Project 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. |
| view | string | – | 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | number | – | PNG byte length (when ok). |
| error | string | – | Error code when ok is false (e.g. "empty_geometry", "mesh_failed", "mesh_timeout"). |
| height | number | – | Rendered image edge in px (when ok). |
| hint | string | – | Next-action hint when ok is false. |
| image_b64 | string | – | Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap. |
| ok | boolean | – | Whether a render was produced. |
| truncated | boolean | – | Set when inline was requested but the PNG exceeded the size cap. |
| view | string | – | The view that was rendered (when ok). |
| width | number | – | Rendered image edge in px (when ok). |
No examples provided.
get_model_mesh 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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Project slug from open_in_studio/get_project. |
Structured output declared, but exposes no named fields.
No examples provided.
get_project 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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | – | The project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | object | – | Complementary files keyed by source-relative path. |
| code | string | – | Fetch mode: the full .kcad source. |
| embedUrl | string | – | Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available). |
| meshError | string | – | Fetch mode: sanitized repair/persist error when meshStatus is failed. |
| meshHint | string | – | Fetch mode: when meshStatus=building — transient; poll again or re-open_in_studio; never imply permanent 404. |
| meshReady | boolean | – | Fetch mode: true only when meshStatus===ready. |
| meshStatus | string | – | Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode). |
| meshUrl | string | – | 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). |
| ok | boolean | – | Whether the read succeeded. |
| paintHint | string | – | – |
| parameters | array | – | Fetch mode: the model's editable parameters. |
| privacy | string | – | Fetch mode: the project privacy. |
| projectSaved | boolean | – | Fetch mode: true when the project was loaded. |
| projects | array | – | List mode (no slug): the user's saved projects. |
| serverBuild | string | – | Deploy identity (package+git SHA@boot time) so connector lag is observable. |
| slug | string | – | Fetch mode: the project slug. |
| title | string | – | Fetch mode: the project title. |
| updated_at | string | – | Fetch mode: last-updated timestamp. |
| url | string | – | Fetch mode: revision-pinned /p/<slug>?version= link. |
| version | number | – | Fetch mode: the project version. |
| viewerPainted | boolean | – | Always false on tools/call; widget sets true after correlated model_displayed. |
No examples provided.
get_project_revision 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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Project slug returned by open_in_studio. |
| version | integer | yes | Positive immutable revision version returned by open_in_studio. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | object | – | Immutable complementary-file manifest. |
| code | string | yes | Exact .kcad source captured at this revision. |
| ok | boolean | yes | Whether the revision was found and readable. |
| parameters | array | yes | Exact editable parameters captured at this revision. |
| slug | string | yes | Project slug. |
| title | string | – | Title captured with this revision. Absent on revisions snapshotted before titles were stored. |
| version | integer | yes | Immutable revision version. |
No examples provided.
get_selection 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.
| Name | Type | Req | Description |
|---|---|---|---|
| session | string | yes | Studio sessionToken from GET /__kernelcad/session?script=<path>. Use the same script as the viewer. |
| studio_url | string | yes | Local Studio HTTP origin, e.g. http://localhost:5173. |
Structured output declared, but exposes no named fields.
No examples provided.
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
claude mcp add --transport http com-kernelcad-kernelcad 'https://mcp.kernelcad.com/mcp'
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.