kernelCAD
REMOTE · MCP.KERNELCAD.COM
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
Available components
Last scanned (15 minutes ago)
Scores higher than 76% of remote servers
Reachable. Last reached 5 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 40454 tokens (~512/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 Management100
- No destabilizing schema changes in the last 30 days.Pass
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.
- 5 Nov 26 +1
- Stability: 0.97 → pass security
- Tool “get_asset” rewrote its description, which is the text the model reads security
- Tool “search_assets” rewrote its description, which is the text the model reads security
- “search_assets” added an optional parameter “source” cosmetic
- 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 “get_asset” functional
- New tool “get_asset_pack” functional
- New tool “search_assets” functional
- “fab_pack” reworded the description of “scope” cosmetic
- 3 Nov 26 0
- “write_bom” reworded the description of “handoff_path” cosmetic
- “write_bom” reworded the description of “catalog_parts” cosmetic
- “write_bom” reworded the description of “handoff” cosmetic
- “write_bom” reworded the description of “handoff_json” cosmetic
4 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.
- 2 Nov 26 0
- 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
- Tool “review_cad” 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 “no_verify” cosmetic
- “export” reworded the description of “options” cosmetic
- 29 Oct 26 +1
- Stability: 0.97 → pass security
- 28 Oct 26 −1
- Stability: pass → 0.97 functional
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 5 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 →
import_step Import STEP ~379
Use this when the user wants to start from their own STEP or STL file (a part they designed elsewhere, a vendor model). Give exactly one source: url (a public https direct-download link), upload (a file the user attached in ChatGPT), or content_base64 (raw bytes, small files only). Max 50 MB. The format is detected from the bytes (or pass format: 'step' | 'stl'). Writes the file and a starter <name>.kcad.ts whose base body is lib.fromSTEP / lib.fromSTL into output_dir (default: a fresh temp dir), evaluates it, and returns { ok, format, model_path, script_path, code, bbox }. Pass script_path as { file } to evaluate_script, add_feature, dfm_review, export and the other tools, or edit code to build on the body. STL is a mesh: booleans, bbox and export work, but faces stay planar facets (use mesh_to_features for an editable feature tree). A non-watertight STL is refused unless allow_open is true.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_open | boolean | – | STL only: accept a non-watertight mesh as an open shell. |
| content_base64 | string | – | The file bytes, base64-encoded (small files). |
| file_name | string | – | Original file name, used for format detection. |
| format | string | – | Override format detection. |
| name | string | – | Base name for the written files. Default 'imported'. |
| output_dir | string | – | Where to write the file and starter script. Default: a new temp directory. |
| upload | object | – | ChatGPT file reference for a file the user attached. |
| url | string | – | Public https URL that downloads the .step/.stp/.stl file directly. |
Structured output declared, but exposes no named fields.
No examples provided.
inspect Inspect Model ~1,410
Use this when you need to read facts about a model. One reader, selected by `of`: - 'assembly' — physical assembly inventory (parts, bboxes, connectors, mates, disconnected solids). - 'robot' — URDF/SDFormat export preview (links, joints, planning groups, end-effectors, issues). - 'step' — inspect an imported STEP file: solid tree, exact bbox/volume, cylindrical holes (breached bores flagged partial; holeDetection: 'exact' | 'heuristic'). - 'shape' — volume / surfaceArea / bbox for one feature ({ feature_id? }). - 'mass' — mass, centre of mass, centroidal inertia tensor (inertia6 + 3x3 inertiaMatrix), principalMoments/principalAxes, symmetry flags, and optionally the radius of gyration about an arbitrary axis ({ feature_id?, density?, gyration_axis? }); density in kg/m^3, defaults to 1000 (water). - 'features' — features captured by the script (kind, id, params, transforms, suppression). - 'assemblies' — assembly intent (assemblies, parts, connectors, joints). - 'topology' — canonical face names + edge count for a feature ({ feature_id? }). - 'edges' — edges of a shape with optional EdgeQuery ({ feature_id?, query? }); returns @kc[...] refs. - 'face-edges' — boundary edges of a named canonical face ({ feature_id?, face_name }). - 'faces' — faces of a shape with optional FaceQuery ({ feature_id?, query? }); returns @kc[...] refs. - 'face-labels' — user-applied labels visible in the script. - 'mates' — mates captured by the script. - 'constraints' — sketch constraints captured by the script. - 'part-stats' — bundled parts-catalog statistics. - 'bend-table' — sheet-metal bend table for a flattened pattern. - 'params' — declared model parameters. - 'part-categories' — top-level part-catalog categories available in the bundled (and configured remote) catalog. - 'part-families' — part families within a category ({ category? }); count + exemplar ids per family. - 'bom' — bill of materials ({ assembly? }): one row per distinct part (grouped by geometry/catalog identity, no…
| Name | Type | Req | Description |
|---|---|---|---|
| assembly | string | – | of:'assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly. |
| at | number | – | of:'section' — single slice position along `axis` (mm). |
| axis | string | – | of:'section' — normal axis for `at` / `stack` (default 'z'). |
| category | string | – | of:'part-families' — optional top-level category to filter families by. |
| code | string | – | Inline kernelCAD script source. |
| density | number | – | of:'mass' — material density in kg/m^3 (steel 7850, aluminium 2700, ABS 1050). Defaults to 1000 (water); the response echoes the value used and flags when it was defaulted. |
| edges | object|array|string | – | of:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled. |
| face_name | string | – | of:'face-edges' — canonical face name (required for that subject). |
| faces | object|array|string | – | of:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled. |
| feature_id | string | – | of:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape. |
| 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. Hosted server: pass an https:// URL, a data: URI, or "asset:… |
| gyration_axis | object | – | of:'mass' — optional axis in shape-local mm to report the radius of gyration about. Omit for centroidal quantities only; the result is density-independent and returned in mm. |
| of | string | yes | Which facts to read. |
| plane | string|object | – | of:'section' — section plane. Either a cardinal name string 'xy'|'xz'|'yz', { plane: 'xy'|'xz'|'yz', offset? }, or { origin: [x,y,z], normal: [nx,ny,nz] }. Omit to use `at`+`axis`. |
| query | object | – | of:'edges'|'faces' — optional EdgeQuery/FaceQuery filter. |
| spike_factor | number | – | of:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6). |
| stack | object | – | of:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition. |
Structured output declared, but exposes no named fields.
No examples provided.
inspect_nurbs Inspect NURBS Curve ~202
Evaluate supplied kernelCAD code or a file to capture an authored NURBS curve (nurbsCurve/spline3d). Returns degree, distinct knots and multiplicities, poles, weights, rational and uniformWeights flags, hasNonUnitWeights, and parameter range. Defaults to the last captured curve in that script; pass feature_id to choose one. The source may load referenced assets. Reports authored curve data, not exact geometry-derived B-rep edge/face NURBS; surface extraction and blending are not supported. Does not update the active MCP session or write a project.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| feature_id | string | – | Optional curve3d FeatureId; defaults to the last captured NURBS curve. |
| 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. |
Structured output declared, but exposes no named fields.
No examples provided.
lookup_api Look Up API ~195
Use this when you need to list the kernelCAD script-runtime surface: global functions (box, path, selectEdges, helix, etc), Shape methods (fillet, sweep, lower, etc), Sketch methods (extrude, revolve, sweep), PathBuilder methods, EdgeQuery/FaceQuery key sets, and featureKindFaceLabels (which globals accept opts.faceLabels and valid value shapes). Use this to discover what is callable from a .kcad.ts script. Call this BEFORE concluding kernelCAD lacks a capability — its NURBS freeform surfacing (loft, sweep, boundary-fill, G2 blend) is easy to miss from tool names alone.
| 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. |
Structured output declared, but exposes no named fields.
No examples provided.
lookup_authoring_skill Look Up Authoring Skill ~324
Return the kernelcad-authoring skill — conventions for writing .kcad.ts scripts (API surface, parameters, evaluation contract, common pitfalls) — in sections. Call with NO arguments first: you get the quick-start (units, axes, the return rule, the rules that prevent most failures, the intent → API routing table, the "Before you finish" checklist) and an index of every section with a one-line summary (under 16k chars). Then pull what you need: `{ section: "<id>" }` returns one section (e.g. "top-level-functions", "materials", "dfm-gates-print-readiness"); `{ query: "fillet after subtract" }` returns the best-matching sections. `{ section: "all" }` returns the full ~140k-char skill (SKILL.md plus its reference files) — only if your client accepts large responses. Clients that list resources can also read `kernelcad://skills/authoring` (the SKILL.md core). OUTPUT: { uri, mimeType, mode, text, sections? } — `mode` is index | section | search | all | not-found.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | – | Keywords to search section titles and bodies (e.g. "sweep along helix"). |
| section | string | – | Section id from the index (e.g. 'top-level-functions'), or 'all' for the full skill. |
| topic | string | – | Alias of section; also accepts a loose title such as 'materials' or 'cli commands'. |
Structured output declared, but exposes no named fields.
No examples provided.
lookup_cookbook Look Up Cookbook ~258
Use this when you need a canonical pattern snippet for a CAD task. Search the kernelCAD cookbook for canonical pattern snippets. Returns top-k snippets matching the natural-language query, ranked by BM25 over title/tags/keywords/trigger. Use when you need a canonical pattern for fillet-after-subtract, non-overlapping booleans, sketch-to-extrude flows, etc. Returns empty if no snippet scores above the relevance floor — proceed without cookbook help in that case.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | Exact snippet id as the skills cite it (e.g. "clearance-hole-through-plate"); returns that snippet. An unknown id is ranked as a query. |
| 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. |
| k | number | – | Max snippets to return. Default 3, max 5. |
| query | string | – | Natural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket"). One of query / id is required. |
Structured output declared, but exposes no named fields.
No examples provided.
lookup_diagnostics Look Up Diagnostics ~65
Use this when you need the kernelCAD 26-code diagnostic catalogue with hint templates. Tiny one-shot call; useful for an agent that wants to pre-populate retry strategies. Hints are also inline on every emitted diagnostic — this tool just gives you the canonical list up front.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
mesh_boolean Combine Meshes (Boolean) ~253
Use this when the user wants to union, subtract, or intersect two imported triangle mesh solids (STL, OBJ, or 3MF). Supports union, subtract (A minus B) and intersect. Pass each operand as { file } on the MCP server or { data } with base64 mesh bytes; formats are detected or may be specified. Returns volume in mm³, triangle count and a binary STL as data_base64; pass that payload to import_step to continue modeling. Inputs must be closed, consistently oriented 2-manifold meshes. Open, non-manifold, or invalid meshes return an error. This computes mesh geometry and does not create an editable B-rep feature tree.
| Name | Type | Req | Description |
|---|---|---|---|
| a | object | yes | First mesh: { file } or { data } base64, optional format stl|obj|3mf. |
| b | object | yes | Second mesh: { file } or { data } base64, optional format stl|obj|3mf. |
| maxTriangles | integer | – | Maximum triangles per input and output. Default and maximum 100000. |
| operation | string | yes | – |
| toleranceMm | number | – | Vertex weld tolerance in mm. Default 0.000001. |
Structured output declared, but exposes no named fields.
No examples provided.
mesh_summary Summarize Mesh Geometry ~361
Mesh a kernelCAD .kcad.ts source server-side and return a COMPACT geometry summary — overall bounds plus, per feature, its id, kind, triangle count, and bounding box. Use this to INSPECT a model's geometry without a viewer: confirm a part is the size/shape you expect, see how many triangles each feature contributes, or check that every feature produced geometry. This runs the full server-side OCCT pipeline (the same one the Studio renderer uses), so it evaluates modern sources (assembly, path, .material, …) that the legacy client worker cannot. INPUT: `source` (required) the .kcad.ts script text; `fileName` (optional) a label for diagnostics; `params` (optional) a map of parameter-name → number overrides applied before meshing (stateless slider recompute). OUTPUT: { ok, bounds, featureCount, features: [{ id, kind, triangleCount, bbox: { min:[x,y,z], max:[x,y,z] } }], failedFeatureIds, diagnostics }. `ok` is true when every feature meshed; `failedFeatureIds` lists features that failed to compile (and `ok` is then false). Raw vertex/index/normal arrays are NEVER returned — this is a summary only. To SEE the rendered model, call open_in_studio (includes PNG preview + viewer); use get_latest_render only for alternate views.
| Name | Type | Req | Description |
|---|---|---|---|
| fileName | string | – | Optional file-name label used in diagnostics (does not affect geometry). |
| params | object | – | Optional map of parameter-name → numeric value, applied as overrides before meshing (stateless slider recompute). |
| source | string | yes | The .kcad.ts script source to mesh. |
Structured output declared, but exposes no named fields.
No examples provided.
mesh_to_features Fit Features to Mesh ~761
Use this when you are handed an STL, OBJ or 3MF of a mostly prismatic mechanical part (plate, bracket, spacer, flange, housing block) and need an EDITABLE kernelCAD model of it rather than a faceted lib.fromSTL import. Deterministic, measured, self-verifying: it welds and checks the mesh, segments planes and cylinders, picks the extrusion axis, slices each band and fits exact lines / arcs / circles, snaps near-round values (each snap recorded), then emits a readable .kcad.ts with named param()s — a revolve for concentric round stacks, extruded profiles otherwise, .hole()/.holes() for through, blind and counterbored bores (axial and side-drilled), .cutout() for pockets, .fillet() for constant-radius edge blends (radius measured on the sharp edge, edges grouped by radius and picked with the shortest exact edge query), boolean subtractions for what no drilling feature can reach. It then EVALUATES that script and compares it with the mesh: volume IoU (column ray casting) and symmetric surface deviation (max + RMS), over up to 4 refinement passes. Returns { script, ledger, fidelity: { maxDeviationMm, rmsMm, volumeIoU, verdict: faithful | approximate | failed, thresholds }, unmatchedRegions, features, passes }. A fillet or sharp reading is kept by which measures better; variable-radius blends and chamfers are reported, not forced. The verdict is computed from the numbers — faithful needs IoU >= minIoU AND max deviation <= maxDeviationMm AND a watertight mesh AND no unmatched region. Freeform surfaces, tilted planes and side bosses are listed in unmatchedRegions (reference.mesh.freeform-region-unmatched), never silently dropped. The ledger uses fact ids equal to param names, so resolve_assumptions on the written <out>.ledger.json yields paramOverrides for set_param. Pass { out } to write the script and ledger; the mesh itself is never modified. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:<id>" from request_upload (when the file is o…
| Name | Type | Req | Description |
|---|---|---|---|
| data | string | – | Mesh bytes as base64 — use when the server cannot see your filesystem. |
| file | string | – | Path to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted… |
| format | string | – | Format override; default from the extension or the content. |
| maxDeviationMm | number | – | Max surface deviation (mm) a faithful verdict allows. Default max(0.25, 0.1 % of the bbox diagonal). |
| maxPasses | number | – | Refinement passes, 1–4. Default 4; stops early at the first faithful pass. |
| maxTriangles | number | – | Refuse meshes above this triangle count instead of stalling. Default 300000. |
| minIoU | number | – | Volume IoU a faithful verdict requires. Default 0.98. |
| out | string | – | Write the emitted script to this .kcad.ts path and the assumption ledger to the sibling .ledger.json. |
| weldToleranceMm | number | – | Vertex weld distance in mm. Default max(1e-4, 1e-6 × bbox diagonal). |
Structured output declared, but exposes no named fields.
No examples provided.
open_in_studio Open in Studio ~1,963
Save the model as a kernelCAD project AND show it: persists a project revision, returns the interactive Studio viewer (MCP Apps / ChatGPT outputTemplate), and includes a PNG preview in the SAME tool result (image content + previewUrl when available). ONE VIEWER PER PROJECT PER RESPONSE: every call renders a new viewer card. Do all validation with evaluate_script first, then call open_in_studio exactly once, after validation succeeds; reuse the returned URL, revision and preview, and never call it again after a successful result in the same response. Re-calling with unchanged code for the same project returns that revision instead of writing a new one. A heavy model can answer status:"running" (code tool.still-running) before the client times out; that is NOT a success: call open_in_studio again with exactly the same arguments, which joins the running save and returns its result. CONTINUE, DO NOT DUPLICATE: to change a model you already saved, pass `project: '<slug>'` from the last result (or from list_my_projects) — this adds a revision to that project. Without `project`, the save goes to the project this chat already saved, or to your project with the same title (case, punctuation and v2/rev3/(1) ignored) from the last 24 h. Views, poses, colours and options of one design are revisions of ONE project — keep the same title and slug. Pass `new_project: true` only when the user wants a separate design. A different cookbook (execute_cookbook, or open_in_studio of that cookbook's unchanged source) starts its own project; pass `project` to add a revision, or `continue_design: true` to keep revising the design this chat is already saving. The result starts with the slug to pass next time, a /p/<slug>?version= link for this revision, and that revision's title. Use this when the user wants to SEE or share the model — do NOT call get_latest_render afterwards for the happy path; the preview is already here when previewDelivered is true. Pass the full `.kcad` source as `code`…
| Name | Type | Req | Description |
|---|---|---|---|
| anon_token | string | – | Anonymous owner token returned as `anonToken` by an earlier open_in_studio result. Pass it on every open_in_studio call, also in a new chat, so all your anonymous projects stay together and move to t… |
| attachments | array | – | Complementary project files referenced by relative path from the .kcad source. |
| body_bbox | object | – | Body AABB { min:[x,y,z], max:[x,y,z] } mm — for likeness_profile gate when no session attest. |
| cabin_bbox | object | – | Optional cabin AABB for likeness gate. |
| code | string | – | The full .kcad source of the model to open in Studio (the script you have been editing). Optional: omit to reuse the source from your most recent evaluate_script call. |
| continue_design | boolean | – | Pass true to add a revision to the design this chat is already saving, even when this call is a different cookbook or title. Ignored when `project` is set. |
| include_preview | boolean | – | Default true: render an iso PNG preview into this same tool result (reuses the server render cache when this source was already rendered). Set false to skip rasterization and return save/viewer URLs… |
| 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. |
| likeness_profile | string | – | Hard success gate for organic/car bodies. When set, open_in_studio returns ok:false unless body-likeness is publishReady (inline body_bbox/wheels/still_verdicts, or a prior verify body-likeness pass… |
| new_project | boolean | – | Pass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h. Still wins over a matching title or cookbook. |
| parameters | array | – | Optional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params. |
| project | string | – | Slug of the project to update (from the last open_in_studio result, a "Saved to your projects" note, list_my_projects, or a /p/<slug> link). Adds a new revision to that project instead of creating a… |
| require_stills | boolean | – | Forwarded to body-likeness gate (default true). |
| slug | string | – | Older name for `project`. Use `project`. |
| still_verdicts | array | – | Agent still checklist for likeness gate [{ code, passed, finding, view? }]. |
| title | string | – | Optional human-readable title for the model (shown in Studio). Defaults to "Model from Claude". |
| wheels | array | – | Wheel centres + radii for likeness gate [{ center:[x,y,z], radius }]. |
| Name | Type | Req | Description |
|---|---|---|---|
| animUrl | string | – | CDN transforms-only animation bake URL when the script declares animationView(). ChatGPT embed Play/scrub uses this — no live session remesh. |
| assetHashes | array | – | – |
| attachmentCount | integer | – | – |
| embedUrl | string | – | Read-only, chrome-free /embed/<slug> viewer URL — drop into an <iframe> to embed the live model in any site or widget (no login). Includes meshUrl when a revision mesh artifact is available. |
| hasAnimation | boolean | – | True when animUrl is present (animationView timeline baked at publish). |
| mechanismSummary | object | – | Mechanism verdict of the saved code (same as evaluate_script mechanismSummary), stored with the revision for the Studio badge. maxLevel error = "Mechanism broken" (saved anyway; statement names the j… |
| meshError | string | – | Sanitized persist/repair error when meshStatus is failed. |
| meshHint | string | – | When meshStatus=building: transient OCCT/CDN write — poll get_project or re-open_in_studio; never imply permanent 404/failure. Present under CDN when building. |
| meshReady | boolean | – | True only when meshStatus===ready. building+meshUrl means embed is still polling. |
| meshSaved | boolean | – | Whether the revision display mesh is persisted. False while building or after meshStatus:failed. |
| meshStatus | string | – | ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode). |
| meshUrl | string | – | Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed. When meshStatus is building, this is the expected CDN URL (retry until ready). |
| ok | boolean | – | Whether the project revision was saved (same meaning as projectSaved). A failed display mesh does not make this false; inspect meshSaved and meshStatus. |
| paintHint | string | – | Agent guidance: do not claim interactive paint until viewerPainted. |
| previewBytes | number | – | – |
| previewCached | boolean | – | – |
| previewDelivered | boolean | – | True when this result includes a displayable PNG (image content and/or previewUrl). Only then may the agent claim a preview was shown to the user. |
| previewHeight | number | – | – |
| previewHint | string | – | – |
| previewStatus | string | – | included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false. |
| previewUrl | string | – | HTTPS URL of the PNG preview when storage signed successfully. |
| previewView | string | – | – |
| previewWidth | number | – | – |
| projectSaved | boolean | – | True when the project/revision was persisted. Not the same as viewerPainted. |
| project_id | string | – | Stable project UUID for collaboration tools such as join_project. |
| project_note | string | – | Which project was updated or created, its URL, and how to keep working on it. |
| serverBuild | string | – | Deploy identity so connector vs server mismatch is observable. |
| slug | string | – | The project slug. Pass it back as `project` to save the next change to this project. |
| title | string | – | Title stored for this revision (not a later revision of the same project). |
| updated | boolean | – | True when an existing project was updated; false when a new one was created. |
| url | string | – | Revision-pinned /p/<slug>?version= Studio link for the revision this call saved. |
| version | integer | – | Immutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version. |
| viewerPainted | boolean | – | Always false on tools/call. The Studio widget sets viewerPainted:true via updateModelContext after a correlated model_displayed ack. |
No examples provided.
order_part Order Part ~210
Order the part made: creates the production request and returns a pay_url for the user. Propose the manufacturing method from the user's words and the part, pass it as method with a one-line reason. The price is the real maker price; never invent or send one. Tell the user the card is only held, and a person confirms the final price before charging. If the result is status "pricing", the price is still being worked out: call again in a few seconds.
| Name | Type | Req | Description |
|---|---|---|---|
| method | object | – | How the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print). |
| slug | string | – | Saved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both. |
| source | string | – | The kernelCAD script, when the part is not saved. Send slug or source, not both. |
Structured output declared, but exposes no named fields.
No examples provided.
price_part Price Part ~161
Start or read the real price for making the part. Cheap. Returns status "ready" with estimate_cents and summary, or "pricing" while the makers are asked (call again in a few seconds). Creates nothing and charges nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| method | object | – | How the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print). |
| slug | string | – | Saved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both. |
| source | string | – | The kernelCAD script, when the part is not saved. Send slug or source, not both. |
Structured output declared, but exposes no named fields.
No examples provided.
project_curve Project Curve ~348
Use this when you need to wrap a 2D closed curve onto a 3D face. Insert a `<shape>.projectCurve({ source, face, scaleMode? })` chained call into a kernelCAD script. The `source` is the structured `{ kind: "sketchCommands", commands: [...] }` wire format the runtime API accepts. Wraps the curve onto the face along the face normal; pair with `.extrude(d)` / `.cut(...)` for raised or engraved logos on curved bodies. Open-wire projection (`asEdge: true`) is not implemented and is rejected at edit time. Side-effect-free; returns modified code plus diagnostics.
| Name | Type | Req | Description |
|---|---|---|---|
| asEdge | boolean | – | Open-wire (edge) projection. NOT IMPLEMENTED — rejected at edit time. Use a closed-curve projection (omit asEdge). |
| bindAs | string | – | Optional local variable name; emits `const <bindAs> = <target>.projectCurve(...);`. |
| code | string | yes | The .kcad.ts source code. |
| commands | array | yes | Closed 2D path to wrap onto the face, as plain-number commands. Must start with a `moveTo` and end with a `close` (e.g. [{kind:"moveTo",x:0,y:0},{kind:"lineTo",x:2,y:0},{kind:"lineTo",x:2,y:2},{kind:… |
| face | string | yes | Target face — canonical name or label. |
| scaleMode | string | – | Drawing.sketchOnFace scaling mode. Default original. |
| target | string | yes | Variable name of the Shape to chain onto. |
Structured output declared, but exposes no named fields.
No examples provided.
query Query Geometry ~559
Use this when you need to resolve or inspect topology against a script's lowered geometry. Pass the script as `code` (inline; works on a hosted server) or `file`. Selected by `mode` (default 'evaluate'): - 'evaluate' — list the faces a Query matches ({ query }). Pass expect:'unique' to assert exactly-one. - 'resolve' — resolve one ref to one face ({ ref }). - 'lineage' — the creating/modifying history of a face ({ ref }; feature_id defaults to the last feature). Query forms (faces only; edge/vertex kinds return query.unsupported-entity-type): - a bare face label: 'top', 'bottom', 'left', 'right', 'front', 'back', or a hole/cutout slot like 'wall'. - @kc[<feature-id>/face/<label>] — feature ids are the ones refs print, e.g. '@kc[box_1/face/top]', '@kc[hole_1/face/wall]'. - @kcq[face(<filter>, ...)] — filters AND together: createdBy("box_1"), withLabel("top"), geometryType(PLANE|CYLINDER|CONE|SPHERE|TORUS|BSPLINE_SURFACE), closestTo([x,y,z]) or closestTo([x,y,z], k), containsPoint([x,y,z]); combine with union(a, b), intersection(a, b), subtraction(a, b). Example: '@kcq[face(geometryType(CYLINDER), closestTo([0,0,10]))]'. Each matched face comes back with its canonical @kc ref, centroid, normal and area.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| expect | string | – | mode:'evaluate' — 'unique' asserts exactly-one. |
| feature_id | string | – | Optional FeatureId; defaults to the last lowered shape (use "auto" for lineage). |
| 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. |
| mode | string | – | Resolution mode (default 'evaluate'). |
| query | string|object | – | mode:'evaluate' — Query: a bare face label ('top'), an @kc[<feature-id>/face/<label>] ref, an @kcq[face(...)] expression, or { ast }. |
| ref | string | – | mode:'resolve'|'lineage' — one face: '@kc[box_1/face/top]', '@kcq[...]', or '<feature-id>.<label>' (lineage). |
Structured output declared, but exposes no named fields.
No examples provided.
ray_pick Pick Point by Ray ~286
Use this when you need the faces a ray hits in a local Studio model, nearest first, with points, distances, and normals. Inputs are model units (mm); direction is normalized. Requires the local Studio URL and session token for the same script, reads the current model generation, and returns a set_selection argument object with every hit. feature_id must identify a displayed terminal shape; intermediates have no current viewer shapeIndex. Intersections use the viewer per-face tessellation, so curved-surface points and normals are mesh approximations.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| direction | array | yes | Nonzero ray direction [x, y, z]; normalized internally. |
| feature_id | string | – | Displayed terminal feature to ray-pick; defaults to the returned feature. Intermediate features are not available as current viewer selections. |
| file | string | – | Path to a .kcad.ts script. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| origin | array | yes | Ray origin [x, y, z] in model units. |
| session | string | yes | Studio sessionToken for this script, from GET /__kernelcad/session?script=<path>. |
| studio_url | string | yes | Local Studio HTTP origin, e.g. http://localhost:5173. |
Structured output declared, but exposes no named fields.
No examples provided.
remove_feature Remove Feature ~107
Use this when you need to remove a feature line from a script. Remove a single line from a kernelCAD script identified by a substring match. Returns the modified code plus diagnostics from re-evaluating. Refuses to remove the line containing the return statement. Side-effect-free.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The .kcad.ts source code. |
| match | string | yes | A substring that uniquely identifies the line to remove (e.g. `const hole = cylinder(5,`). |
Structured output declared, but exposes no named fields.
No examples provided.
render_preview Render Preview ~1,936
Use this when you need to LOOK at a kernelCAD model — render its script to deterministic PNG views for visual self-check (the visual half of the evaluate → render → inspect → fix loop), with NO studio or dev server required. Pass { code } (inline source) or { file } (a .kcad.ts path), exactly one. Renders the canonical engineering views (front, right, top, iso — pass { views } for a subset, e.g. ["iso"] for fastest iteration) plus an optional { pose: "<az>,<el>" } arbitrary camera angle (degrees; az=0,el=0 is front, +az rotates CCW around +Z, +el lifts the camera). NO STUDIO / DEV-SERVER REQUIRED: a prebuilt static player (dist/headless-player) is served from an ephemeral local port automatically; a running studio dev server is used as fallback, and { base_url } forces one. The only environment dependency is playwright chromium (npx playwright install chromium). Pass { focus } or { hide } (arrays of feature ids or assembly part names, mutually exclusive) to isolate parts — same semantics as `kernelcad render --focus/--hide`. Pass { section: { axis, position, flip? } } to cut a cross-section and inspect INTERIOR geometry (wall thickness, internal pockets, whether a bore runs through) rather than only the outer shell. Pass { explode: { factor, mode? } } to pull a multi-part assembly apart (mode: "mate-axis" default, or "radial") using the same mesher as `kernelcad render --explode` — requires assembly.model()/solvedModel(). PNGs are written to { out_dir } (default: a fresh temp session directory) and returned as absolute paths with per-view camera descriptions (kernelCAD is Z-up). Mechanism truth runs first, same protocol as `kernelcad render`: a broken mechanism still renders but every tile is watermarked MECHANISM BROKEN (KERNELCAD_RENDER_STRICT=1 refuses instead); read { mechanism, mechanism_failure_codes }. The probe runs full BREP interference sweeps and can dominate latency on large assemblies — pass { no_mechanism_check: true } for fast iteration (the preview…
| Name | Type | Req | Description |
|---|---|---|---|
| background | string | – | preset 'publish' only: 'white' (default), 'light', 'dark', 'black', 'transparent' (PNG alpha), or '#rrggbb'. |
| base_url | string | – | Advanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player. |
| code | string | – | Inline kernelCAD script source. Mutually exclusive with file. Relative imports resolve against a temp dir — use file for scripts with relative lib.fromSTEP(...) imports. |
| environment | string | – | HDRI environment override: preset ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse'), a URL, or 'none' for the default three-light rig. |
| explode | object | – | Pull a multi-part assembly apart for the preview. factor ≥ 0 scales spacing by part size; mode is 'mate-axis' (default, along parent mate/joint axes) or 'radial' (away from the assembly centroid). Re… |
| file | string | – | Path to a .kcad.ts script on disk. Mutually exclusive with code. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| focus | array | – | Show only matching feature ids / assembly part names. Mutually exclusive with hide. |
| height | integer | – | Per-view tile height in px (default 768; 1200 under preset: 'publish'). |
| hide | array | – | Hide matching feature ids / assembly part names. Mutually exclusive with focus. |
| 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_mechanism_check | boolean | – | Skip the mechanism-truth probe for fast iteration on large assemblies; the preview reports mechanism: 'unverified'. Ignored under KERNELCAD_RENDER_STRICT=1. |
| no_watermark | boolean | – | Suppress the kernelCAD version watermark. |
| out_dir | string | – | Directory for the PNGs (created if missing). Default: a fresh temp session dir. |
| overlay | string | – | Surface-quality overlay: 'zebra' (reflection stripes), 'curvature' (Gaussian vertex colours), 'continuity' (edges coloured G2 green / G1 yellow / G0 orange / broken red). Built as coloured STL bands… |
| pose | string | – | Extra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'. |
| preset | string | – | Render look: 'default' (engineering review) or 'publish' (studio product shot for sharing; one 'hero' image unless views/pose are given). |
| screenshot_timeout_ms | integer | – | Playwright screenshot deadline in milliseconds. Default leaves Playwright's 30 s in place; raise it for heavy lofts or a slow machine. |
| section | object | – | Cut the model with one axis-aligned section plane to inspect INTERIOR structure (wall thickness, internal pockets, whether a bore runs through) instead of only the outer shell. position is in mm alon… |
| shading | string | – | Mesh shading: 'smooth' uses the kernel's vertex normals (default); 'flat' uses face normals to expose tessellation / surface wobble. |
| shadow | boolean | – | preset 'publish' only: soft contact shadow under the model (default true). |
| sheet | boolean | – | Also write one labelled image 'sheet' tiling every rendered view. With no views it renders all seven (adds back, left, bottom) — use it before calling a model done, so a missing cutout on the back or… |
| views | array | – | Canonical views to render as an array, e.g. ["iso"] or ["front","top"] (default: all four). Fewer views = faster. |
| width | integer | – | Per-view tile width in px (default 768; 1600 under preset: 'publish'). |
Structured output declared, but exposes no named fields.
No examples provided.
repair_script Repair CAD Script ~393
Use this when evaluate_script reported an error and you want the fix applied rather than described. Takes the candidates why_did_this_fail derives for a diagnostic, applies them one at a time, re-evaluates after each, and keeps the first that clears the diagnostic without introducing new errors. Never edits outside the repair region (failing feature statement + its input statements + the param() lines it reads) — an out-of-region patch is refused with tool.repair.out-of-region. Returns the repaired source in `new_code` (the caller persists it), a unified `diff`, and before/after health maps. Pass { file? | code?, diagnostic?: '<id>'|'first-error', strategy?: 'apply-first'|'try-all'|'dry-run', max_attempts?: number }.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source. |
| diagnostic | string | – | Diagnostic id from why_did_this_fail's `targetDiagnosticId` / `candidates[].diagnosticId`, or 'first-error' (default) for the first error-severity diagnostic. |
| 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. |
| max_attempts | integer | – | Upper bound on candidates attempted (default 3). Ignored by apply-first and dry-run. |
| strategy | string | – | 'try-all' (default) walks candidates until one clears the diagnostic; 'apply-first' applies only the top candidate and reports what it did; 'dry-run' previews every candidate patch without evaluating. |
Structured output declared, but exposes no named fields.
No examples provided.
report_need Report a Missing Asset or Capability ~194
Use this when the user needed something kernelCAD does not have, so the gap is recorded instead of papered over. kind: asset (search_assets returned coverage none or poor: the catalog does not model it), capability (a tool cannot do what was needed), output (a tool answered, but not with what was needed), docs (a tool description did not say how to use it). One short sentence in `need`; name the tool in `tool` when one fell short. Stores no personal data beyond your account id when signed in. Then tell the user plainly what is missing.
| Name | Type | Req | Description |
|---|---|---|---|
| context | string | – | Optional: what the user was building. |
| kind | string | – | – |
| need | string | yes | What was needed, e.g. "low-poly lunar lander for a moon base scene". |
| tool | string | – | The tool that fell short, if any (e.g. search_assets). |
Structured output declared, but exposes no named fields.
No examples provided.
request_assembly_quote ~205
Submit a manufacturing quote request after the user has reviewed and explicitly approved the checklist and every displayed warning. KernelCAD staff will confirm the final itemized price. This sends the request for human review and does not charge the customer or start checkout.
| Name | Type | Req | Description |
|---|---|---|---|
| accessToken | string | – | Guest access token returned by estimate_assembly_manufacturing; required when submitting as a guest. |
| assembly | string | – | Assembly name when the script contains multiple assemblies. |
| checklist | object | yes | – |
| string | yes | Contact email for the quote response. | |
| idempotencyKey | string | yes | – |
| 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. |
| requestId | string | yes | – |
| source | string | – | Current kernelCAD source for an unsaved assembly. |
Structured output declared, but exposes no named fields.
No examples provided.
request_upload Request File Upload ~273
Use this when the user has a photo, PDF drawing, STEP, STL, DXF, SVG or 3MF file on their device and you need it in a kernelCAD tool (trace_from_image, drawing_to_cad, mesh_to_features, inspect of:"step", or lib.fromSTEP / fromSTL / fromDXF / fromSVG / referenceImage in a script). Do not ask the user to paste the file as text or base64, and do not type coordinates from an image by hand. Returns a one-time `uploadUrl` (valid 30 minutes) and an `asset` reference. Give the user the link; after they say the upload is done, pass the `asset` value ("asset:<id>") as the file argument, for example trace_from_image({ imageUrl: "asset:<id>" }) or lib.fromSTEP("asset:<id>"). If the file is already at a public https:// URL, pass that URL instead. On clients that support MCP URL elicitation the upload page opens for the user directly and the call returns once the file is stored (status "uploaded"); then use the asset right away without asking the user anything.
| Name | Type | Req | Description |
|---|---|---|---|
| purpose | string | – | Optional short note shown on the upload page, e.g. "the photo of the worn bracket". |
Structured output declared, but exposes no named fields.
No examples provided.
resolve_assumptions Resolve Image Assumptions ~173
Use this when you need to confirm or override the open facts in an assumption ledger from trace_from_image (missing scale, inferred/assumed values) before committing geometry built from a reference photo. Reads the persisted `<model>.ledger.json` at `ledgerPath`, applies each resolution — `{ id, confirm: true }` to accept a fact as-is, or `{ id, value }` to override it — rewrites the ledger file, and returns the updated ledger plus `paramOverrides` (factId -> value) to feed straight into `set_param`. Pair with the `kernelcad-from-reference` skill.
| Name | Type | Req | Description |
|---|---|---|---|
| ledgerPath | string | yes | Path to the `<model>.ledger.json` file persisted alongside the traced source. |
| resolutions | array | yes | One resolution per ledger fact id to act on. |
Structured output declared, but exposes no named fields.
No examples provided.
review_cad Review CAD Model ~889
Run a deterministic mechanism-fitness review on supplied kernelCAD code or a file. It performs a full evaluation, replaces the active MCP session model on success, and clears that session if evaluation fails. The script may load referenced assets. The review validates the assembly/mate graph and connector placement, samples declared mate limits, optionally checks interference at sampled poses, and reports connector workspace bounds, fitness findings, and a repair mode (none, local-fix, parameter-tune, or topology-redesign). Runs within timeBudgetMs (default 90 s); stages that do not fit are listed in skippedStages and were not checked. Hosted: lib.fromSTEP / fromSTL / meshFromSTL / fromDXF / fromSVG and referenceImage take a direct string literal or a const bound to one (computed expressions are unsupported). They accept "asset:<id>" (from request_upload), an https:// URL or a data: URI as the path.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly | string | – | Assembly name; defaults to the first captured assembly. |
| code | string | – | Inline kernelCAD script source. |
| 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… |
| designGoal | string | – | Original user design prompt or goal. Included in suggestedRepairPrompt so topology-redesign repairs restart from the intended physical design instead of local coordinate nudges. |
| epsilonMm3 | number | – | Interference volume threshold in mm^3. Default 0.01. |
| 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. |
| includeInterference | boolean | – | Whether sampled poses run BREP interference checks. Default true. |
| includePoseEnvelope | boolean | – | Whether to sample declared mate limits. Default true. |
| physicalUseCaseLevel | string | – | Escalating physical-use-case depth; each level includes the previous. 'reachability': targeted sampling over scalar-limited mates named in actuatorLimits, rejecting contacts that cannot get within cr… |
| physicalUseCaseSamplesPerMate | integer | – | Samples per scalar-limited actuator mate for physical-use-case contact reachability. Samples revolute/cylindrical/pin-slot limitsDeg and prismatic limitsMm. Default 3; total targeted combinations are… |
| preserveInterfaces | array | – | External mates, connector refs, part names, or behavioral interfaces the repair agent must preserve during redesign. |
| requirePhysicalUseCase | boolean | – | When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits. |
| 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. |
| timeBudgetMs | number | – | Wall-clock budget for the review in ms (default 90000). Once spent, the remaining heavy stages (pose envelope, physical use case, mechanism sweep) are skipped and listed in skippedStages — a partial… |
| trackConnectors | array | – | Optional connector refs such as ["gripper-plate.tool-tip"] to limit connector workspace reporting. |
Structured output declared, but exposes no named fields.
No examples provided.
review_paint_peek_latest Get Latest Painted Review Feedback ~382
Return the newest brush-painted review packet from a Studio session. After sharing a /p/<slug> link, the user can open it in the browser and paint marks over the 3D viewport to give visual feedback. Call this tool with the `slug` from that link to see the strokes — screenshot + mask + struck part names plus an optional one-line note and intent tags (e.g. "too thick", "missing", "wrong angle") describing WHAT is wrong — and act on the feedback. The slug is the capability: no OAuth required when passing `slug`; private projects require the owner to be signed in. Omit `slug` to fetch your own latest packet from your signed-in account (requires OAuth). By default returns short-lived signed Storage URLs for the screenshot + mask + meta.json plus the struck part names — small and context-friendly. Pass `paths_only: false` to also base64-inline the PNGs for clients that cannot fetch the signed URLs over HTTP.
| Name | Type | Req | Description |
|---|---|---|---|
| freshness_sec | integer | – | Maximum packet age in seconds. Default 1800 (30 min). Use a smaller value for "what did I just paint" or a larger one for "earlier today". |
| paths_only | boolean | – | Controls PNG delivery. Default (omitted or true): return only signed URLs + struck part names — the small, context-friendly response; fetch the bytes via the signed URLs. Set false to also base64-inl… |
| slug | string | – | Project slug from open_in_studio/get_project/a /p/<slug> link. When given, returns the latest brush packet painted on that project's page — works without OAuth; the slug is the capability. Omit to us… |
Structured output declared, but exposes no named fields.
No examples provided.
run_fea Run Structural FEA ~1,019
Use this when you need to know whether a part will hold a load. Runs a linear-static structural study and returns evidence — peak von Mises stress (MPa), peak displacement (mm), the minimum safety factor against the material yield (taken away from the clamp-singular edges of the fixed faces; the raw clamp-edge peak is reported separately as peakAtSupportMPa), per-region hot spots named by @kc[...] face ref, mesh trust flags, an equilibrium residual, and (CalculiX only) stress-heatmap PNG paths. The study is EITHER declared in the script with `shape.feaStudy({ material, fixed, loads, meshSize?, minSafetyFactor? })` OR passed on the call against the shape the script returns: { code: 'return box(100, 20, 10);', material: 'aluminum-6061', fixed: { atX: 0 }, loads: [{ faces: { atX: 100 }, force: [0, 0, -200] }] }. Faces are a FaceQuery ({ atX | atY | atZ, byNormal: 'Z', ofSurfaceType, near: [x,y,z], ... }; with near it names the ONE matching face nearest the point), a face label ('top', 'bottom', 'left', 'right', 'front', 'back'; it must name ONE face — after a boolean 'top' can be several, which is an error listing them) or an @kc[...] ref. Force is the TOTAL [Fx, Fy, Fz] in N on those faces (a scalar force + direction is accepted). Materials: mild-steel, aluminum-6061, pla, petg, abs, nylon (aliases steel, aluminum), or { E, nu, yield } in MPa. Solver (`solver`, default 'auto'): CalculiX + gmsh quadratic tets when that toolchain is installed; otherwise the built-in in-process voxel solver (8-node incompatible-mode bricks), which needs nothing installed and is marked summary.solver 'in-process-voxel' with trust.meshTrusted false — an estimate (accurate for prismatic bending, approximate at curved faces and notches), never a verified pass. solver: 'calculix' fails up front with fea.solver.unavailable and the install command when the toolchain is absent. Also: `study` (a declared study name; default the last), `output_dir` (keeps the deck / summary JSON), `mesh_size` (mm…
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Inline kernelCAD script source (mutually exclusive with file). |
| file | string | – | Path to a .kcad.ts script declaring at least one feaStudy. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
| fixed | string|object | – | Inline study: faces held fixed — a FaceQuery like { atX: 0 }, a face label like 'bottom', or an @kc[...] ref. |
| heatmaps | boolean | – | Render stress heatmap PNGs (default true). |
| loads | array | – | Inline study: loads, each { faces, force: [Fx, Fy, Fz] } — total force in N on those faces. |
| material | string|object | – | Inline study: material grade name (e.g. 'aluminum-6061') or { E, nu, yield } in MPa. |
| mesh_size | number | – | Target element size in mm, overriding the study for this run. |
| mesh_timeout_ms | number | – | Wall-clock budget for meshing (default 120000). |
| min_safety_factor | number | – | Inline study: required minimum safety factor; below it the call fails with fea.safety-factor.below-min. |
| output_dir | string | – | Directory for the solver deck, results, summary JSON and heatmap PNGs. |
| refine | boolean | – | One automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true). false: one solve at mesh_size. |
| solve_timeout_ms | number | – | Wall-clock budget for the solve (default 300000). |
| solver | string | – | 'auto' (default): CalculiX when installed, else in-process. 'calculix': require it. 'in-process': always the built-in voxel solver. |
| study | string | – | Name of the declared study to run; defaults to the last declared one. |
Structured output declared, but exposes no named fields.
No examples provided.
search_assets Search Catalogue Assets ~716
Search the public kernelCAD asset catalogue of published models. This is not find_part (screws, bearings, NEMA). Read-only. Anonymous callers are allowed. Do not send an API key. Use source:"library" for the free built-in model library. Search its titles, tags or kit IDs, and download editable .kcad.ts from downloads.source. Library slugs are kit/id. For community projects use source:"community". With no source, an empty or unavailable community search falls back to the library for supported filters. Library supports q, category (kit or manufacturing), tags, license, triangle bounds, kit, limit and cursor. Its default order is kit/id; use sort:"triangles" for descending complexity. Rig, IK, latest and remixed are community metadata. Each community row has slug, title, license (SPDX, always present), category, tags, kit, stats, has_rig, has_ik, ik_type, remix_count and thumbnail_url. UNITS: stats.size_m is {x, y, z} in metres. Y is up. stats.origin_y is the model origin height in metres. stats.triangles is the triangle count. RIG: has_rig means the asset has named moving parts. Pass rig:true to keep only those. get_asset returns rig as { <name>: { type: "rotate" or "slide", axis: "x"|"y"|"z" (local), range: [min, max] (degrees for rotate, metres for slide), node } }. has_ik / ik_type mark an inverse-kinematics target. ik is "any", "arm" or "legs". FILTERS, all optional: q (title, tags and description), category, tags (every listed tag must match), license (SPDX id), min_triangles, max_triangles, rig (true = moving parts only), ik ("any"|"arm"|"legs"), kit, sort ("latest"|"triangles"|"remixed"), cursor (next_cursor from the previous page), limit (1-100, default 24). Only public, gallery-listed assets with a redistributable licence are returned. Use get_asset(slug) for params, presets and the rig. Use get_asset_pack(slug) for a short-lived signed zip URL.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Exact category label, e.g. "mechanism". |
| cursor | string | – | next_cursor from the previous page. Must be used with the same sort. |
| ik | string | – | Inverse-kinematics filter. "any" is any IK target; "arm" and "legs" match ik_type. |
| kit | string | – | Exact kit id. |
| license | string | – | SPDX licence id. Every row also carries license. |
| limit | integer | – | Page size, 1-100. Default 24. |
| max_triangles | integer | – | Keep assets with at most this many triangles. |
| min_triangles | integer | – | Keep assets with at least this many triangles. |
| q | string | – | Words matched against title, tags and description. |
| rig | boolean | – | true = only assets with named moving parts (has_rig). |
| sort | string | – | latest (default), triangles, or remixed. |
| source | string | – | library = downloadable built-in models; community = published projects. |
| tags | array | – | Every tag must be present on the asset. |
Structured output declared, but exposes no named fields.
No examples provided.
send_to_printer Send G-code to Printer ~620
Use this when you need to upload a .gcode file (e.g. written by export with target: "model", format: "gcode") to a real network printer and, by default, start the print. protocol: 'octoprint' (POST /api/files/local with an X-Api-Key), 'moonraker' (Klipper's POST /server/files/upload), or 'bambu-lan' (Bambu Lab LAN-mode: FTPS implicit-TLS upload on port 990 as user 'bblp' with the printer's LAN access code, then an MQTT print-start command on port 8883 — requires access_code and, unless start_print is false, serial). bambu-lan uploads a .gcode.3mf print project (the printer prints 3MF projects, not bare G-code): the G-code goes in as Metadata/plate_1.gcode, inside the model 3MF from export format '3mf' when model_3mf_path is given (use options { arrange: 'plate', slicer: 'bambu' } so the printer shows the same named, coloured parts), else inside a minimal 3MF shell; the file name always ends in .3mf ('part.gcode' -> 'part.gcode.3mf'). Optional printer (a bundled profile id, the same ids as the export 3mf/gcode options.printer) is checked against protocol before anything is read or sent: an unknown id is refused with the list of valid ids, 'bambu-lan' needs a Bambu Lab profile and a Bambu Lab profile needs 'bambu-lan'. Pass { dry_run: true } to validate connectivity/authentication only, without uploading or starting a print. Never logs or echoes api_key/access_code.
| Name | Type | Req | Description |
|---|---|---|---|
| access_code | string | – | Bambu LAN-mode access code (printer settings -> LAN Only Mode). |
| api_key | string | – | OctoPrint API key (Settings -> API). |
| dry_run | boolean | – | Validate connectivity/auth only; never uploads or starts a print. |
| filename | string | – | Uploaded file name (default: 'kernelcad.gcode'; bambu-lan appends '.3mf'). |
| gcode_path | string | yes | Path to the .gcode file on disk. |
| host | string | yes | Printer hostname or IP. |
| model_3mf_path | string | – | bambu-lan only: model .3mf from export format '3mf' to package the G-code into (the uploaded .gcode.3mf). |
| port | number | – | Override the protocol default port. |
| printer | string | – | Printer profile id; checked against protocol before upload. List them with 'kernelcad print printers'. |
| protocol | string | yes | – |
| serial | string | – | Bambu printer serial number (required to start a print unless start_print is false). |
| start_print | boolean | – | Start the print immediately after upload (default: true). |
Structured output declared, but exposes no named fields.
No examples provided.
set_param Set Parameter ~293
Use this when you need to edit a param() default value in a kernelCAD script. Returns the modified code as text plus diagnostics from re-evaluating the result. Caller persists the new code via standard file-write tools (this tool has no side effects). With preview: true it builds the edit in a scratch session instead and returns the diff_geometry summary plus the requirements-ledger and S1 binding diffs (which requirements flip, which margins shrink, which selectors moved or re-bound), without touching the active session, source, revision or caches. A preview whose revised build fails returns ok:false and no diff. Inspect after.requirementsOk to see whether the edit preserves declared intent; preview.ok only says the preview could be computed.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The .kcad.ts source code. |
| new_value | – | yes | The new default value. A number for a numeric param (e.g. 12.5), a string expression evaluated in the script (e.g. "width/2 + 3") or a choice/colour, or true/false for a boolean param. |
| param_name | string | yes | The string literal name of the param (first arg to param()). |
| preview | boolean | – | S6 edit preview: evaluate the edit in a scratch session and return geometry + requirements-ledger + S1 binding diffs. Writes nothing. Default false (the normal source-edit result). |
Structured output declared, but exposes no named fields.
No examples provided.
set_scene_return Set Scene Return ~161
Use this when you need to set how the script returns its assembly. Replace the final top-level return statement with `return <assembly>.model();` or `return <assembly>.solvedModel(poses, options?);`. Use solvedModel for mate-authored mechanisms so FK and validation run. Returns modified source plus diagnostics from re-evaluation.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly_binding | string | yes | JS identifier bound to assembly(...). |
| code | string | yes | The .kcad.ts source code. |
| mode | string | yes | – |
| options | object | – | Optional solvedModel options such as { validate: 'warn', posesGate: 'envelope' }. |
| poses | object | – | Optional solvedModel pose overrides keyed by mate name. Defaults to {}. |
Structured output declared, but exposes no named fields.
No examples provided.
set_selection Set Selection ~152
Use this when you need to replace the shared local Studio face/edge selection, or clear it with selection:null. The viewer highlights the pick on its next sync (300 ms). Does not edit geometry. Pass model_generation from get_selection; writes from an older generation are rejected. Use only current shape indices. Requires a local Studio session.
| Name | Type | Req | Description |
|---|---|---|---|
| model_generation | integer | yes | modelGeneration from get_selection; rejects picks from a prior mesh. |
| selection | – | yes | – |
| 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.
solve_mates Solve Mates ~96
Use this when you need to solve the mate graph and get part poses. Run the v0.6 mate-graph solver on the active assembly. Returns { status, poses, iterations? } where each pose is a serialized Transform ({ translation, rotateAxis, rotateDeg }). Optional poses overrides mate pose values by mate name.
| Name | Type | Req | Description |
|---|---|---|---|
| assembly | string | – | – |
| poses | object | – | Optional numeric pose overrides keyed by mate name. |
Structured output declared, but exposes no named fields.
No examples provided.
solve_sketch Solve Sketch ~107
Use this when you need to solve a 2D sketch constraint set. Solve a 2D sketch constraint set. Side-effect-free: pass { entities, constraints } and receive solved entities plus the original constraints. Entities are POINT, LINE, and CIRCLE records; constraints use the kernelCAD constraint vocabulary.
| Name | Type | Req | Description |
|---|---|---|---|
| constraints | array | yes | Constraints to apply to the entities. |
| entities | array | yes | Sketch entities to solve. Lines reference point ids; circles reference a center point id. |
Structured output declared, but exposes no named fields.
No examples provided.
sweep_tolerance Sweep Tolerance Range ~438
Use this when you need to know where and why a design breaks across a tolerance/dimension range, not just whether it builds at one nominal value. Declares one or more param() names with a { values: [...] } list or a { min, max, steps } range (number params are bisected; choice/string params are evaluated as discrete points), re-evaluates the script once per cartesian-product combination (capped at 64 combos — exceeding it truncates to the first 64 and emits kinematic.sweep-tolerance.combo-cap-exceeded), and measures every requirement in the S2 ledger (script require(), dfmSpec, gated FEA, mechanical intent) plus the standard gates on each combo: interference, mounting-hole diameter agreement, and joint-axis binding (all three default on); reachability only when gates.reachable names a tip_link + target. After the coarse grid it bisects each numeric pass/fail transition down to boundaryTolerance and reports the boundary value, the failing side, and the binding requirement/gate names (e.g. "wall fails below 1.840 mm; binding: wall"). Returns per-combo verdicts, firstFailure per gate, firstRequirementFailure per requirement, boundaries[], and a coverage statement that says "checked at N points plus boundaries", never "proven".
| Name | Type | Req | Description |
|---|---|---|---|
| assembly | string | – | Assembly name; defaults to the first captured assembly. |
| boundaryBudget | number | – | Maximum extra evaluations spent bisecting boundaries. Default 64; 0 skips bisection. |
| boundaryTolerance | number | – | Absolute parameter tolerance for boundary bisection. Default 0.001. |
| 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. |
| gates | object | – | Which standard gates to run per combo. |
| params | object | yes | param() name -> { values: [number|string, ...] } or { min, max, steps }. |
Structured output declared, but exposes no named fields.
No examples provided.
trace_from_image Trace Outline from Image ~554
Use this when you need to trace a reference image into normalized waypoints. Trace pixel-space features from a reference photo into normalized [0..1] waypoints the agent can map to mm via a known scale anchor and feed to path().spline / path().nurbsSegment. Three backends are dispatched behind the scenes: `opencv` (deterministic; uniform-bg silhouette only), `vision-llm` (vision model; named points/cluttered backgrounds; needs a configured vision endpoint), and `hybrid` (opencv silhouette + LLM-labeled named points). Default backend is `auto`. Per-feature confidence is reported. Pair with the `kernelcad-trace-from-image` skill for the conversion-to-mm pipeline. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:<id>" from request_upload (when the file is on the user's device).
| Name | Type | Req | Description |
|---|---|---|---|
| backend | string | – | Force a specific backend; default `auto` routes by corner-color stddev. |
| features | array | – | Features to trace. Defaults to a single { label: "silhouette", kind: "silhouette" } when omitted. |
| hint | string | – | Optional free-text hint forwarded to vision-LLM backends (e.g. "a pair of eyewear; trace the upper brow only"). |
| imageUrl | string | yes | URL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_… |
| 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. |
| maxWaypointsPerFeature | integer | – | Cap on waypoints per feature. Defaults to 12 (suitable for medium-inflection outlines). |
| priors | array | – | Caller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts. |
| scaleAnchor | object | – | Pixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`. |
| validate | string | – | Assumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open. |
Structured output declared, but exposes no named fields.
No examples provided.
verify Verify Design ~4,014
Use this when you need to check a design against a rule set. One verifier, selected by `check`: - 'assembly' — static assembly review ({ file | code }, or the session evaluate_script left): mate validator, default-pose interference, joint topology, mechanical plausibility. ok:false with `blocking[]` exactly when review_cad's blocking rules fire on these findings; review_cad also sweeps joint ranges and runs physics. - 'urdf' — structural validity of a .urdf file ({ urdf_path }). - 'dfm' — print-readiness gates declared by dfmSpec() ({ file | code }). - 'dfm-preflight' — sheet-metal flat pattern vs a job-shop's ordering rules ({ vendor, material, thicknessIn|thicknessMm, ... }). Returns the vendor's catalog source pages as `sources`; when `disclosure` is present, show it with those links. - 'assembly-path' — continuous straight-line removal of each assembly part along ±X/±Y/±Z and optional world-space directions. Returns valid directions, blocking parts and one of three states (removable / blocked / unknown); sequence peels the directional blocking graph and reverses it into a build sequence with a model stamp. Fastened-mate and fixed-connect clusters become subassemblies: each is planned recursively inside and installed as one unit at the top level (`Step.subassembly`). Remaining valid orders use deterministic heuristics (subassemblies first, outside-in, fewest reorientations, fewest tool changes); stuck sets get a budgeted blocking-reduction partition and a sampling fallback whose paths are labelled found-by-search, never proven. A fastener with a fastened-mate `fastener` declaration (axis, pitch, optional tool envelope) is tested along its helical path and reported `motion: helical`; a press/snap `fit` declaration becomes a `requires-force` step, never simulated. A modelled driver/socket/hex-key envelope swept along the approach axis adds `toolBlocked` { fastener, blockers } and a failing S2 ledger entry; unmodelled tools add nothing. Threaded fasteners without m…
| Name | Type | Req | Description |
|---|---|---|---|
| angleToleranceDeg | number | – | check:'fastener-installation' — axis tilt tolerance, default 1 degree. |
| assembly | string | – | Assembly name; defaults to the first captured assembly. |
| asserted_plane | object | – | check:'geometry-quality' — optional required mirror plane in model coordinates; normal is normalized and must be nonzero. |
| check | string | yes | Which verification to run. Omit only when passing call-time `requirements`; then the requirements ledger is the verification. |
| code | string | – | Inline kernelCAD script source (same checks as `file`). |
| collision_tolerance_mm3 | number | – | check:'swept-collision' — BREP intersection volume tolerance (mm^3). |
| contactToleranceMm | number | – | check:'assembly-path' with stability:true — surface distance at or below which parts count as touching (default 0.05 mm). |
| directions | array | – | check:'assembly-path' — additional nonzero world-space removal vectors; normalized and deduplicated. |
| disassemblyOrder | boolean | – | check:'assembly-path' — iteratively remove freed parts and return removalOrder or stuckParts. |
| dxf | string | – | check:'dfm-preflight' — path to a DXF file. |
| edges | object|array|string | – | check:'edge-radius' — EdgeQuery or @kc[...] edge ref(s); intersected with faces. Query near sorts, it does not filter. |
| faces | object|array|string | – | check:'edge-radius' — FaceQuery or @kc[...] face ref(s); includes incident edges and fillets on selected faces. |
| fasteners | array | – | check:'fastener-installation' — explicit named stations; empty means no coverage. |
| featureId | string | – | check:'dfm-preflight' — FeatureId to scope to. |
| feature_id | string | – | check:'geometry-quality' — body feature to measure; defaults to script return. check:'edge-radius' — lowered feature; default the returned model. |
| file | string | – | Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold/geometry-quality/edge-radius/requirements). Hosted server: cannot read files f… |
| fixtures | array | – | check:'assembly-path' with stability:true — declared base/fixture part names, stable from step 1. Default: the lowest part(s) along gravity. |
| gravity | array | – | check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]). check:'assembly-path' with stability:true — gravity direction, world frame, magnitude ignored (default [0, 0, -1]). |
| heatmaps | boolean | – | check:'load-capacity' mode:'fea' — also render stress heatmap PNGs (default false). |
| joint | string | – | check:'swept-collision' — joint to sweep; omit to sweep every declared joint. check:'static-hold' — joint to evaluate; omit to evaluate every joint with a declared actuator. |
| loads | object | – | check:'load-capacity' — partName -> { force?: [Fx,Fy,Fz] N, torque?: [Tx,Ty,Tz] N*m }. |
| material | string | – | check:'dfm-preflight' — material SKU (required for that check). |
| materials | object | – | check:'load-capacity' — partName -> material declaration. |
| max_iterations | number | – | check:'reachable' — numeric-path iteration cap. |
| max_radius_mm | number | – | check:'edge-radius' — maximum fillet radius in mm; must be >= min_radius_mm. |
| mesh_deflection_mm | number | – | check:'geometry-quality' — absolute mesh deflection, defaults to tolerance/4; must be <= tolerance/2. |
| mesh_size | number | – | check:'load-capacity' mode:'fea' — element size override, mm. |
| min_radius_mm | number | – | check:'edge-radius' — minimum fillet radius in mm (does not imply sharp-edge prohibition). |
| min_torque_margin_pct | number | – | check:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20). |
| mode | string | – | check:'load-capacity' — 'beam' (default), 'stub', or 'fea' (solve the script's feaStudy: CalculiX + gmsh when installed, else the in-process voxel estimate). |
| motion_loads | array | – | check:'motion-load' — external forces: [{ part, point: [x,y,z] mm in the part's modeled frame, force: [Fx,Fy,Fz] N world, fromMs?, toMs? }]. |
| motion_mode | string | – | check:'motion-load' — 'tracks' (default): along the animationView timeline with inertia; 'range': quasi-static grid over each driven joint's limits; 'poses': exactly motion_poses (a user-named pose i… |
| motion_poses | array | – | check:'motion-load' motion_mode:'poses' — explicit mate poses, each an object of joint name -> value in degrees. |
| orientation_tolerance_rad | number | – | check:'reachable' — orientation tolerance in radians. |
| parts | array | – | check:'edge-radius' — explicit assembly part names (default all). |
| pose | object|array | – | check:'static-hold' — explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range. |
| position_tolerance_mm | number | – | check:'reachable' — position tolerance in mm. |
| prefer_solver | string | – | check:'reachable' — force the IK path ('auto' default). |
| quasi_static | boolean | – | check:'motion-load' — drop velocity/acceleration terms (gravity and external loads only). |
| range | array | – | check:'swept-collision' — [lower, upper, step] in joint-native units. |
| range_samples | number | – | check:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9). check:'motion-load' motion_mode:'range' — grid points per joint (default 5). |
| refine | boolean | – | check:'load-capacity' mode:'fea' — one automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true); false solves once at the study's meshSize. |
| refreshCatalog | boolean | – | check:'dfm-preflight' — force vendor catalog refresh. |
| require_edge_break | string | – | check:'edge-radius' — prohibit sharp convex/external, concave/internal, or all edges. |
| requirements | array | – | Call-time external requirements ([{ name, predicate }]) measured in the same ledger as script require(), dfmSpec and feaStudy, tagged source: 'external' and never persisted. The predicate is the seri… |
| safety_factor_threshold | number | – | check:'load-capacity' — pass/fail safety-factor floor (default 1.5; mode 'fea': the study's minSafetyFactor when declared). |
| sample_ms | number | – | check:'motion-load' — timeline sample step, ms (default 20). Inertia peaks depend on it at keyframe velocity steps. |
| seed | object | – | check:'reachable' — numeric IK seed pose (joint name -> deg/mm). |
| sequence | boolean | – | check:'assembly-path' — plan a build sequence { steps, model, unknown, search?, requiresForce?, toolBlocked?, needsHold? }. Fastened/fixed clusters become subassemblies planned inside and installed a… |
| series_points | number | – | check:'motion-load' — max torque-vs-time points per joint in the result (default 120; 0 omits the series). |
| service | string | – | check:'dfm-preflight' — service. |
| short_edge_length_mm | number | – | check:'geometry-quality' — flag edges strictly below this length; zero disables. |
| stability | boolean | – | check:'assembly-path' — run the approximate P3 static-stability pass on the sequence. Each part's closed-mesh volume centroid (uniform density) must project inside the convex hull of its contacts wit… |
| study | string | – | check:'load-capacity' mode:'fea' — feaStudy name (default: the last declared one). |
| supports | object | – | check:'motion-load' — mechanicalJoint name -> support part names to use instead of the declared supports (compare with / without a bushing). |
| symmetry_tolerance_mm | number | – | check:'geometry-quality' — maximum sampled mirror-to-mesh distance, mm. |
| target_orientation | array | – | check:'reachable' — target XYZ Euler angles in radians. |
| target_position | array | – | check:'reachable' — target [x, y, z] mm (world frame). |
| thicknessIn | number | – | check:'dfm-preflight' — material thickness in inches. |
| thicknessMm | number | – | check:'dfm-preflight' — material thickness in millimeters. |
| threadedFasteners | array | – | check:'assembly-path' — part names that need a helical removal. Catalog screw/bolt/nut families are detected automatically; without a fastened-mate fastener declaration (axis/pitch) they remain unkno… |
| tiny_face_area_mm2 | number | – | check:'geometry-quality' — flag faces strictly below this absolute area; zero disables. |
| tiny_face_relative | number | – | check:'geometry-quality' — fraction of total BREP surface area, ORed with absolute threshold. |
| tip_link | string | – | check:'reachable' — end-effector part name (required for that check). |
| toleranceMm | number | – | check:'fastener-installation' — linear tolerance, default .05 mm. |
| urdf_path | string | – | check:'urdf' — path to the .urdf file. |
| vendor | string | – | check:'dfm-preflight' — vendor SKU (required for that check). |
Structured output declared, but exposes no named fields.
No examples provided.
why_did_this_fail Explain Failure ~134
Use this when you need to trace why a feature failed. Walk the upstream chain of a failing feature. Returns the diagnostics of the requested feature plus the diagnostics of every upstream feature in topological order (the requested feature is the last entry). Per-code hints are inline on every diagnostic — call lookup_diagnostics for the full catalogue. Pass { file?, code?, feature_id? }.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | – |
| feature_id | 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.
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 78 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,366 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 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.