Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "export", "run_fea" and "verify"
⟨86 unchanged words⟩ 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"|" ⟨145 unchanged words⟩ with fea.solver.unavailable): solves the feaStudy and writesOrca/Bambumodifier volumes, each with its ownsparse_infill_density;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, ⟨739 unchanged words⟩
⟨52 unchanged words⟩ 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[...] ⟨71 unchanged words⟩ and `heatmaps: false` for a fast numbers-only run. Mesh refinement is automatic: when the stress is untrusted only because the solver's error estimate is high, it re-solves on a finer mesh (at most 2 more passes, inside the element and wall-time budgets) and returns the finest pass, with summary.refinement listing each pass's mesh size, element count and peak stress and whether the peak converged. `refine: false` solves once at mesh_size.
⟨94 unchanged words⟩ heatmap PNGs.","type":"string"},"refine":{"description":"Automatic mesh refinement until the stress is trusted, inside the element and wall-time budgets (default true). false: one solve at mesh_size.","type":"boolean"},"solve_timeout_ms":{"description":"Wall-clock budget for the ⟨24 unchanged words⟩
⟨136 unchanged words⟩ ⟨119 unchanged words⟩ hole diameters on both sides. - 'load-capacity' —closed-formwillEuler-Bernoulliitbeamhold?stressClosed-form/Euler-Bernoullisafety-factorbeam check ({ loads, materials, ... }), or mode:'fea' to solve the script's feaStudy (quadratic-tet FEA, CalculiX) — both return { ok, safetyFactor, elements[{ partName, stressPa, yieldPa, safetyFactor }], failures[], diagnostics }; fea adds the threshold, the stress regions as @kc[...] faces with their location, and fea { peakStressPa, maxDisplacementMm, meshTrusted, peakAtSupportPa, refinement }; it refines the mesh automatically until the stress is trusted (refine: false for one solve). - 'static-hold' — gravitational holding torque/force at ⟨85 unchanged words⟩
⟨178 unchanged words⟩ Changed the definition of "add_surface", "diff_geometry", "evaluate_script" and 1 more
⟨127 unchanged words⟩ order; adjacent endpoints must coincide within 1e-6 mm)via OCCT BRepOffsetAPI_MakeFilling.. - 'trim' — insert a `<surface>.trimTo(<by>)` ⟨59 unchanged words⟩ to stitch N surfaces into a closed watertightsolid via OCCT BRepBuilderAPI_Sewing.solid. Pass `surface_bindings` (array of Surface variable names) ⟨109 unchanged words⟩
⟨443 unchanged words⟩ "sampling":{"description":"kind:'boundary' —OCCTpointsNbPtsOnCursampled
Authorization not required, issuer https://mcp.kernelcad.com
Changed the definition of "evaluate_script", "execute_cookbook", "inspect" and 2 more
{"destructiveHint":false,"openWorldHint":falsetrue,"readOnlyHint":true,"title":"Evaluate CAD Script"}
{"destructiveHint":false,"openWorldHint":falsetrue,"readOnlyHint":truefalse,"title":"Execute Cookbook"}
Changed the definition of "evaluate_script"
⟨127 unchanged words⟩ deliberately free part next to a mechanism). Every union() is checked too (no opt-out): union.disconnected (the union is several separate solids — a floating operand) and union.member-overlap (two operands that each carry their own .finish()/.material(), the same one, share > 1 mm³ — cut members to fit, e.g. a cross tube between rails is span minus two rail widths) make ok:false. Pass either { file: "<path>" } or ⟨142 unchanged words⟩
Changed the definition of "execute_cookbook", "get_project_revision" and "open_in_studio"
{"properties":{"continue_design":{"description":"Pass true to add a revision to the design this chat is already saving, even if this call runs a different cookbook. Ignored when `project` is set.","type":"boolean"},"dryRun":{"default":false,"description":"Default ⟨74 unchanged words⟩ "maxLength":2000,"type":"string"},"new_project":{"description":"Pass true to start a separate project even when this cookbook was already published in this chat.","type":"boolean"},"openInStudio":{"default":false,"description":"Default ⟨14 unchanged words⟩ script (hosted MCP).","type":"boolean"},"project":{"description":"Slug of an existing project. Adds a revision to that project. Omit to start a new project when this cookbook or design is different from the one this chat already saved.","minLength":1,"type":"string"},"query":{"description":"When id ⟨17 unchanged words⟩
Changed the definition of "evaluate_script" and "open_in_studio"
⟨205 unchanged words⟩ full (non-dry) evaluate_script before using session-dependent tools. To show a measurement in the 3D viewer (e.g. hole spacing), declare it in the script with shape.dimension({ kind: "linear", from, to, label }); a full evaluate lists them as dimensions: [{ text, kind, source }], and a shared /p link with ?dims=1 forces them on. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG ⟨18 unchanged words⟩
⟨8 unchanged words⟩ :"object"},"type":"array"},"dimensions":{"description":"Dimensions declared with shape.dimension(), as the viewer labels them (e.g. \"hole spacing 30\"). Omitted when the script declares none.","items":{"additionalProperties":false,"properties":{"kind":{"enum":["linear","diameter","radius","angular"],"type":"string"},"source":{"enum":["declared","auto"],"type":"string"},"text":{"type":"string"}},"required":["text","kind","source"],"type":"object"},"type":"array"},"dryRun":{"description":"True when the result ⟨183 unchanged words⟩
Authorization not required, issuer https://mcp.kernelcad.com
Added "request_upload"; changed the definition of "drawing_to_cad", "evaluate_script", "export" and 4 more (55 tools before, 56 now)
⟨229 unchanged words⟩ 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).
⟨77 unchanged words⟩ 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.","type":"string"},"pdfBase64":{ ⟨58 unchanged words⟩
Changed the definition of "drawing_to_cad", "evaluate_script", "execute_cookbook" and 8 more
{"properties":{"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"out":{"description":"Write the emitted script ⟨100 unchanged words⟩
⟨55 unchanged words⟩ saved project.","type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"skipMechanismCheck":{"description":"Opt out of the ⟨50 unchanged words⟩
Authorization not required, issuer https://mcp.kernelcad.com
Recently observed → Live
Authorization not required, issuer https://mcp.kernelcad.com
Changed the definition of "fetch_part" and "find_part"
Use this when you need toFetchdownloadoneabundled catalogpart as apart.STEPPreferfile.`awaitResolvelib.standard.nema17()`anandid`await lib.standard.bearing608(or single-match query
Live → Recently observed
Added "execute_cookbook" (54 tools before, 55 now)
Execute Cookbook — 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 evalua…
Recently observed → Live
Authorization not required, issuer https://mcp.kernelcad.com
Changed the definition of "export" and "open_in_studio"
⟨887 unchanged words⟩ as `file` in later calls to this server. HEAVY FORMATS (step/stl/3mf/glb): if OCCT serialization outlives the client tool-call limit, this tool returns { ok:true, status:"running", code:"export.deferred", job_id } while the export continues on the server — poll by calling export({ job_id }) until status is done/failed. CRITICAL: open_in_studio / paint does NOT need STEP. On export.deferred or any STEP stall, call open_in_studio immediately for the shaded widget; do not block paint on export.
⟨348 unchanged words⟩ NOT call get_model_mesh or get_latest_render for interactive paint. INDEPENDENT OF EXPORT/STEP: call this for shaded paint even while export is running, timed out, or returned export.deferred — mesh paint does not wait on STEP. Never block open_in_studio on a STEP download.
Live → Recently observed
Changed the definition of "evaluate_script", "export", "lookup_authoring_skill" and 1 more
⟨150 unchanged words⟩ scene is assembly-built.","type":"object"},"reviewHint":{"description":"Present only when a captured assembly declares articulated (non-fastened) mates: the default mechanism check is shallow (no joint-support intents, pose-envelope overlap at declared limits, or gravity drop) — run review_cad for pose-envelope + gravity checks.","type":"string"}},"required":["ok","featureCount"," ⟨3 unchanged words⟩
⟨519 unchanged words⟩ } — the svg-drawing keys mean the same. svg-drawing and pdf-drawing also take style?: \"mechanical\" (default, the part sheet) | \"architectural\" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: \"metric\"|\"imperial\", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning.
Changed the definition of "evaluate_script", "export", "get_latest_render" and 3 more
⟨69 unchanged words⟩ ok:false with the failures in diagnostics —multi-bodyaassembliesmechanismneed(any mate, joint, transmission or .solvedModel()) needs every part linked by connectors + mates/joints (axis+revolute for shafts/hinges/gears; frame+fastened for rigid; or arm.revolute/.prismatic/.ball/.fixed). A plain multi-part assembly with no mates (base + lid, print layout) is independent bodies and passes. Pass { skipMechanismCheck: true } to optout.out (e.g. a deliberately free part next to a mechanism). Pass either { file: "<path>" } ⟨73 unchanged words⟩
Changed the definition of "capture_animation", "design_loop", "diff_geometry" and 17 more
⟨5 unchanged words⟩ to render a script's animation timeline to avideo.video, or a 360° turntable of a model for sharing. Capture a kernelCAD script's animationView({...}) timeline ⟨150 unchanged words⟩ verified: false + the collisions[] array.ENVIRONMENTTURNTABLEREQUIREMENTMODE: pass { turntable: true } for a seamless 360° orbit of the model (identicalnotoanimationView`kernelcadrecordrender`
Certificate changed, valid to 2026-12-24
Changed the definition of "design_loop", "open_in_studio" and "verify"
Use this when the goal is complex / production / enclosure / gearbox / robot-arm / multi-body, or when you needtoevaluate→review/verify→reviserununtilagreen.CADPREFERREDdesignoverloopone-shotoverevaluate_script+open_in_studiomultipleforattempts.
Changed the definition of "open_in_studio"
{"additionalProperties":true,"properties":{"animUrl":{"description":"CDN transforms-only animation bake URL when the script declares animationView(). ChatGPT embed Play/scrub uses this — no live session remesh.","type":"string"},"assetHashes":{"items":{"type":"string" ⟨37 unchanged words⟩ mesh artifact is available.","type":"string"},"hasAnimation":{"description":"True when animUrl is present (animationView timeline baked at publish).","type":"boolean"},"meshError":{"description":"Sanitized persist/repair ⟨353 unchanged words⟩
Changed the definition of "evaluate_script", "get_project" and "open_in_studio"
⟨53 unchanged words⟩ 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 indiagnostics.diagnostics — multi-body assemblies need connectors + mates/joints (axis+revolute for shafts/hinges/gears; frame+fastened for rigid; or arm.revolute/.prismatic/.ball/.fixed). Pass { skipMechanismCheck: true } to opt ⟨78 unchanged words⟩
⟨50 unchanged words⟩ is failed.","type":"string"},"meshHint":{"description":"Fetch mode: when meshStatus=building — transient; poll again or re-open_in_studio; never imply permanent 404.","type":"string"},"
Changed the definition of "get_project" and "open_in_studio"
⟨85 unchanged words⟩ first); that listing mode requires the OAuthconnection.connection and does NOT paint. Paint phases: projectSaved/meshReady reflect fetch state; viewerPainted stays false until the widget acks display. Prefer open_in_studio (with code) to publish+paint — do NOT call get_model_mesh or get_latest_render for interactive paint.
⟨50 unchanged words⟩ is failed.","type":"string"},"meshReady":{"description":"Fetch mode: true only when meshStatus===ready.","type":"boolean"},"meshStatus":{"description":"Fetch mode: ready ⟨59 unchanged words⟩ read succeeded.","type":"boolean"},"paintHint":{"type":"string"},"parameters":{"description":"Fetch mode: the ⟨11 unchanged words⟩ project privacy.","type":"string"},"projectSaved":{"description":"Fetch mode: true when the project was loaded.","type":"boolean"},"
Changed the definition of "open_in_studio"
⟨111 unchanged words⟩ new separate model. Status fields: ok=true means publish succeeded (under CDN, meshStatus ready/building; ok=false + meshStatus=failed means hard mesh persist failure — do not claim theprojectviewerwasissaved;ready). previewDelivered=true means this result carries a displayable PNG — only then may you tell the user a preview was shown. meshStatus mirrors get_project (ready|building|failed|missing). Under CDN, heavy meshes may return meshStatus=building quickly while OCCT finishes; the embed retries meshUrl — do not wait or re-publish just for the mesh. Pass include_preview:false to skip the rasterizer ( ⟨35 unchanged words⟩
Changed the definition of "get_project"
⟨37 unchanged words⟩ available).","type":"string"},"meshError":{"description":"Fetch mode: sanitized repair/persist error when meshStatus is failed.","type":"string"},"meshStatus":{"description":"Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).","type":"string"},"meshUrl":{"description":"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).","type":"string"},"ok":{ ⟨100 unchanged words⟩
Changed the definition of "open_in_studio"
⟨46 unchanged words⟩ is available.","type":"string"},"meshPersistError":{"description":"Set when the revision mesh could not be stored on the CDN. meshUrl is omitted in that case.","type":"string"},"meshUrl":{"description":"Revision-matched mesh artifact URL ⟨195 unchanged words⟩
Changed the definition of "get_project" and "open_in_studio"
⟨21 unchanged words⟩ .kcad source.","type":"string"},"embedUrl":{"description":"Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).","type":"string"},"meshUrl":{"description":"Fetch mode: revision-matched mesh artifact URL when available — FunnelViewer loads it instead of re-executing CAD.","type":"string"},"ok":{"description":"Whether the read succeeded. ⟨32 unchanged words⟩ items":{},"type":"array"},"serverBuild":{"description":"Deploy identity (package+git SHA@boot time) so connector lag is observable.","type":"string"},"slug":{"description":"Fetch mode: the ⟨14 unchanged words⟩ ":{"description":"Fetch mode: last-updated timestamp.","type":"string"},"url":{"description":"Fetch mode: revision-pinned /p/<slug>?version= link.","type":"string"},"version":{ ⟨10 unchanged words⟩
Added "diff_geometry", "drawing_to_cad", "fea_summary" and 6 more; changed the definition of "add_curve", "add_path_segment", "add_surface" and 14 more (45 tools before, 54 now)
Use this when you needtoaauthorfreeform/organic 3D curve — a3Dbody feature line, brow, spine rail, or G2 blend between panels — authored as a Curve3D into the user's .kcad.ts immediately before the ⟨145 unchanged words⟩
Use this when you needto
Changed the definition of "get_latest_render", "mesh_summary" and "open_in_studio"
⟨12 unchanged words⟩ 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 thisaftertoolopen_in_studiofor a different `view`, a contact sheet (`view:"all"`), oranywhen/p/<slug>youlink):onlycallhave a slug and are not publishing. Call with that `slug` to inspect whether the build ⟨248 unchanged words⟩
Certificate recorded, valid to 2026-10-24
Authorization not required
First tool surface recorded: 45 tools (server version 1.0.0)
Showing the latest 37 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨141 unchanged words⟩ volume(base - revised), commonMm3 = volume(base∩ofrevised)the overlap fromOCCTbooleanbooleansintersection, exact bbox with min/max/extent deltas, face / ⟨99 unchanged words⟩
⟨207 unchanged words⟩ iterating: transpile + capture + capture-light checksWITHOUTwithoutOCCTbuildingloweringsolids, DFM gates, or meshing — milliseconds instead ⟨114 unchanged words⟩
⟨10 unchanged words⟩ :{"description":"Fast validation only: skipOCCTsolidloweringbuild, DFM gates, and meshing. Does not set ⟨130 unchanged words⟩
⟨93 unchanged words⟩ path — it is NOT evidence the cookbooklowers/buildsbuildsunderaOCCTsolid or is safe to publish; finish with dryRun ⟨8 unchanged words⟩
⟨38 unchanged words⟩ dryRun:true is NOT evidence the cookbook buildsunderaOCCTsolid — capture-only checks; do not claim success or ⟨163 unchanged words⟩
⟨24 unchanged words⟩ Present when dryRun:true — dryRun success isNOTnot evidenceof a realtheOCCTsolidbuild.built.","type":"boolean"},"error":{ ⟨62 unchanged words⟩
{"destructiveHint":false,"openWorldHint":falsetrue,"readOnlyHint":true,"title":"Inspect Model"}
{"destructiveHint":falsetrue,"openWorldHint":true,"readOnlyHint":false,"title" ⟨4 unchanged words⟩
{"destructiveHint":false,"openWorldHint":falsetrue,"readOnlyHint":false,"title":"Trace Outline from Image"}
⟨48 unchanged words⟩ "Project slug.","type":"string"},"title":{"description":"Title captured with this revision. Absent on revisions snapshotted before titles were stored.","type":"string"},"version":{"description":"Immutable revision version.", ⟨12 unchanged words⟩
⟨124 unchanged words⟩ 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 nexttime.time, a /p/<slug>?version= link for this revision, and that revision's title. Use this when the user wants to SEE ⟨441 unchanged words⟩
⟨161 unchanged words⟩ "minLength":1,"type":"string"},"continue_design":{"description":"Pass true to add a revision to the design this chat is already saving, even when this call is a different cookbook or title. Ignored when `project` is set.","type":"boolean"},"include_preview":{"description":"Default true: render ⟨133 unchanged words⟩ the same title from the last 24 h. Still wins over a matching title or cookbook.","type":"boolean"},"parameters":{ ⟨286 unchanged words⟩
⟨392 unchanged words⟩ this project.","type":"string"},"title":{"description":"Title stored for this revision (not a later revision of the same project).","type":"string"},"updated":{"description":"True when an existing ⟨11 unchanged words⟩ :"boolean"},"url":{"description":"TheRevision-pinned/p/<slug>/p/<slug>?version= Studio link for themodel.revision this call saved.","type":"string"},"version":{ ⟨44 unchanged words⟩
⟨186 unchanged words⟩ — omitting reuses that last evaluated source). Code that fails evaluate_script (for example overlapping same-material members or floating pieces) is refused; fix it first. Multi-body assemblies must declare connectors + mates/joints before ⟨299 unchanged words⟩ claim success. Omit likeness_profile for WIP previews only. Declare dimensions in the source with shape.dimension({ kind, from, to, label }) (label is a name; the measured value is appended) and they show on the model in every viewer; add ?dims=1 to a /p link to force dimensions on. Hosted: lib.fromSTEP / fromSTL / fromDXF / ⟨19 unchanged words⟩
⟨205 unchanged words⟩ full (non-dry) evaluate_script before using session-dependent tools. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG and referenceImage accept "asset:<id>" (from request_upload), an https:// URL or a data: URI as the path.
⟨215 unchanged words⟩ 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 Orca/Bambu modifier volumes, each with its own sparse_infill_density; the result carries infill { bands, saving, images }), glb (web-viewer / AR with PBR materials), ⟨466 unchanged words⟩ for the per-format keys: dxf layers/tolerance/unit/section/layout, 3mfprintUnit/embedSource/arrange/orient/slicer/printerprintUnit/embedSource/arrange/orient/slicer/printer/infill, glb axis/draco). - target:'part' — ⟨250 unchanged words⟩
⟨28 unchanged words⟩ ,"format":{"type":"string"},"infill":{"additionalProperties":true,"description":"3mf with options.infill — stress-graded infill: band table (density, stress range, volume %), saving vs uniform infill at the high density, FEA peaks, and images { heatmap, bands, cutaway } PNG paths.","type":"object"},"mesh_files":{"description":"Per-link mesh files: ⟨66 unchanged words⟩
⟨428 unchanged words⟩ Most subjects accept { file | code }. 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).
⟨196 unchanged words⟩ `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine.","type":"string"},"gyration_axis":{ ⟨249 unchanged words⟩
⟨268 unchanged words⟩ 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 on the user's device).
⟨48 unchanged words⟩ `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine.","type":"string"},"format":{ ⟨120 unchanged words⟩
⟨66 unchanged words⟩ revision to that project. Without `project`, the save goes to the project this chat already saved,(orsavedtounderyour project with the same title (case, punctuation and v2/rev3/(1)isignored)updated.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 separatemodel.design. The resultsaysstartswhichwithprojecttheitslugupdatedtoorpasscreated.next time. Use this when the user wants to SEE ⟨351 unchanged words⟩ claim success. Omit likeness_profile for WIP previews only. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG and referenceImage accept "asset:<id>" (from request_upload), an https:// URL or a data: URI as the path.
⟨286 unchanged words⟩ when the user wants a separate, newmodel.design. Default: continue this chat'sproject.project, or your project with the same title from the last 24 h.","type":"boolean"},"parameters":{ ⟨286 unchanged words⟩
⟨118 unchanged words⟩ 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).
⟨125 unchanged words⟩ data:image/...;base64,..., or a bare filesystem path. Hosted server: pass an https:// URL, a data: URI, or \"asset:<id>\" from request_upload — not a path on your machine.","type":"string"},"intent":{ ⟨183 unchanged words⟩
Request File Upload — 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 tr…
⟨41 unchanged words⟩ extrude-rounded-rect-plate).","type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"openInStudio":{"default":false,"description":"Default ⟨41 unchanged words⟩
⟨77 unchanged words⟩ ,"bom-json"],"type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"no_verify":{"default":false,"description":"Skip ⟨666 unchanged words⟩
⟨4 unchanged words⟩ ,"family":{"type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"limit":{"type":"number"},"partsBaseUrl" ⟨30 unchanged words⟩
{"properties":{"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"}},"type":"object"}
{"properties":{"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"k":{"default":3,"description":"Max ⟨38 unchanged words⟩
⟨199 unchanged words⟩ URLs only.","type":"boolean"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"likeness_profile":{"description":"Hard success gate for ⟨340 unchanged words⟩
⟨241 unchanged words⟩ :"string"},"type":"array"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"no_mechanism_check":{"default":false,"description":"Skip ⟨278 unchanged words⟩
⟨53 unchanged words⟩ saved project.","type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"max_attempts":{"description":"Upper bound on candidates ⟨52 unchanged words⟩
⟨131 unchanged words⟩ filesystem path.","type":"string"},"intent":{"description":"The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data.","maxLength":2000,"type":"string"},"maxWaypointsPerFeature":{"description":"Cap on waypoints per ⟨139 unchanged words⟩
UseSearchthisthewhenbundledyoupartsneedcatalogto(offline).findFor apart in theNEMA-17catalog.motorDiscoverwritebundled`await lib.standard.nema17(and)`;optionallyforremote)apart-catalog608recordsbearingbywritefuzzy`awaitquerylib.standard.bearing608()`.andDofacetednotfilters.fanTokensoutAND-combine;parallelcross-facetlookupsfiltersandAND-combine.doPassnot pass partsBaseUrl(orunless you setKERNELCAD_PARTS_BASE_URL)source:"remote".toRemoteenablelookupsthefailremotewithintier;45sotherwisewithresultserrorCodeareparts.lookup.timeoutbundled-only.instead of hanging.
Return the kernelcad-authoringSKILL.md bodyskill — conventions for writing .kcad.ts scripts (importsAPI surface, parameters, evaluation contract, common pitfalls).— in sections.UseCallthiswithtoolNOBEFOREargumentsgeneratingfirst:CADyoucodegetiftheyourquick-startMCP(units,clientaxes,doesthenotreturnlistrule,resources.conventions)Clientsandthatandoindexlistofresourceseveryshouldsectioninsteadwithreada`kernelcadone-line summary (under ~8k chars). Then pull what you need://skills/authoring`directly`{—section: "<id>" }` returns one section (e.g. "top-level-functions", "materials", "dfm-gates-print-readiness"); `{ query: "fillet after subtract" }` returns thecontentsbest-matchingaresections.identical.`{ section: "all" }` returns the full ~108k-char SKILL.md — only if your client accepts large responses.INPUTClients that list resources can also read `kernelcad://skills/authoring`none.(the full body). OUTPUT: { uri, mimeType, mode, text, sections? }where—`text``mode` istheindexSKILL.md|body.section | search | all | not-found.
{"properties":{"query":{"description":"Keywords to search section titles and bodies (e.g. \"sweep along helix\").","type":"string"},"section":{"description":"Section id from the index (e.g. 'top-level-functions'), or 'all' for the full SKILL.md.","type":"string"},"topic":{"description":"Alias of section; also accepts a loose title such as 'materials' or 'cli commands'.","type":"string"}},"type":"object"}
⟨9 unchanged words⟩ returned body.","type":"string"},"mode":{"description":"index | section | search | all | not-found.","type":"string"},"sections":{"description":"Section ids returned in text (section and search modes).","items":{"type":"string"},"type":"array"},"text":{"description":"The index + quick-start, the requested section(s), or the full SKILL.md body.","type":"string"}," ⟨10 unchanged words⟩
⟨58 unchanged words⟩ repairMode: none, local-fix, parameter-tune, or topology-redesign. Runs within timeBudgetMs (default 90 s): stages that did not fit are listed in skippedStages (their checks did not run; mechanism is then unverified) and stageTimingsMs shows per-stage cost.
⟨429 unchanged words⟩ "minimum":1,"type":"integer"},"timeBudgetMs":{"description":"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 result instead of a timeout. stageTimingsMs reports where the time went.","type":"number"},"trackConnectors":{"description":"Optional connector refs such ⟨15 unchanged words⟩
⟨277 unchanged words⟩ "additionalProperties":true,"type":"object"},"skippedStages":{"description":"Stages skipped because timeBudgetMs was spent; their checks did not run.","items":{"additionalProperties":true,"properties":{"reason":{"type":"string"},"stage":{"type":"string"}},"type":"object"},"type":"array"},"stageTimingsMs":{"additionalProperties":{"type":"number"},"description":"Wall-clock ms per review stage that ran.","type":"object"},"suggestedRepairPrompt":{"description":"Structured repair prompt ( ⟨22 unchanged words⟩
⟨43 unchanged words⟩ , step (BREP CAD interchange), dxf (planar2Dlaser/waterjetcut file for laser / waterjet / CNC: a flat part — plate, panel, extruded profile,fromin any orientation — exports its outline and holes in its own plane with exact arcs and circles; aRegionsheet-metal part orplanarafacereturned Region exports its flat pattern; 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 ⟨534 unchanged words⟩ kernelcad-mcp skill for the per-format keys: dxflayers/tolerance/unitlayers/tolerance/unit/section/layout, 3mf printUnit/embedSource/arrange/orient/slicer/printer, glb axis/draco). - target ⟨115 unchanged words⟩ h; give it to the user) —and,Smallfortext files an agent can read (SVG, DXF, URDF, JSON, CSV; up to132MB,KB)thealsobytescome inline as an embeddedresource.resource; STEP, STL, 3MF and GLB are link-only — do not fetch them into your context, give the user the link. `output_path` only names the file; the returned `output_path` ⟨14 unchanged words⟩
⟨110 unchanged words⟩ \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"mm\" ⟨514 unchanged words⟩
⟨58 unchanged words⟩ file path.","type":"string"},"part_files":{"description":"Per-part DXF files: parts/<part>.dxf for a multi-part dxf export (layout 'per-part', the default).","items":{"type":"string"},"type":"array"},"written":{"description":"target:'part' — per-part ⟨13 unchanged words⟩
⟨318 unchanged words⟩ 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.
⟨20 unchanged words⟩ false (e.g. \"empty_geometry\", \"mesh_failed\", \"mesh_timeout\").","type":"string"},"height" ⟨88 unchanged words⟩
⟨89 unchanged words⟩ mode requires the OAuth connection and does NOTpaint.paint — prefer list_my_projects to find a project to continue. Paint phases: projectSaved/meshReady reflect fetch state; viewerPainted ⟨23 unchanged words⟩
⟨41 unchanged words⟩ . - 'step' — inspect an imported STEPfile.file: solid tree, exact bbox/volume, cylindrical holes (breached bores flagged partial; holeDetection: 'exact' | 'heuristic'). - 'shape' — volume / surfaceArea / bbox ⟨362 unchanged words⟩
Save/publishSave thecurrentmodel as a kernelCADmodelproject ANDdisplayshow itin one step: persiststhea project revision, returns the interactive Studio viewer (MCP Apps ⟨13 unchanged words⟩ (image content + previewUrl when available). 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 project this chat already saved (or saved under the same title) is updated. Pass `new_project: true` only when the user wants a separate model. The result says which project it updated or created. Use this when the user wants to SEE ⟨76 unchanged words⟩ mounts; or arm.revolute/.prismatic/.ball/.fixed. Connector types are only frame|axis|planar|ball.Pass `slug` from a previous call to update the same project in place; omit `slug` only for a new separate model.Status fields: ok=true means publish succeeded (under ⟨83 unchanged words⟩ until ready, or re-call open_in_studio with samecode+slugcode+project — never treat building as permanent failure/404. ALWAYS ⟨136 unchanged words⟩
{"additionalProperties":false,"properties":{"anon_token":{"description":"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 the user's account when they sign in. Omit when you have none.","maxLength":128,"type":"string"},"attachments":{"description":"Complementary project files referenced ⟨180 unchanged words⟩ ["automotive"],"type":"string"},"new_project":{"description":"Pass true only when the user wants a separate, new model. Default: continue this chat's project.","type":"boolean"},"parameters":{"description":"Optional list of the ⟨143 unchanged words⟩ :"object"},"type":"array"},"require_stillsproject":{"description":"ForwardedSlugtoofbody-likenessthegateproject to update (defaultfromtrue)."the last open_in_studio result,"type":a \"boolean
⟨340 unchanged words⟩ as viewerPainted.","type":"boolean"},"project_note":{"description":"Which project was updated or created, its URL, and how to keep working on it.","type":"string"},"serverBuild":{"description":"Deploy identity so connector ⟨7 unchanged words⟩ },"slug":{"description":"The projectslug;slug.passPass it back as `project` toupdatesavethistheprojectnextinchangeplace.to this project.","type":"string"},"updated":{ ⟨73 unchanged words⟩
{"properties":{"background":{"description":"Turntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only — MP4/GIF have no usable alpha).","type":"string"},"duration_ms":{"description":"Turntable: one full revolution in ms (default 6000).","maximum":60000,"minimum":500,"type":"number"},"elevation_deg":{"description":"Turntable: camera elevation above the horizon in degrees (default 22).","maximum":89,"minimum":-89,"type":"number"},"environment":{"description":"Turntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none').","type":"string"},"file":{"description":"Path to a .kcad.ts script with an animationView({...})record.record (any script in turntable mode). Required (no inline { code } mode). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"focus":{ ⟨50 unchanged words⟩ with output_path.","type":"string"},"height":{"description":"Turntable frame height in px (default 1080; even for MP4).","maximum":2048,"minimum":64,"type":"integer"},"hide":{"description":"Hide matching feature ids ⟨38 unchanged words⟩ },"output_path":{"description":"MP4 outputpath;path (.gif → looping GIF); default<scriptDir>/<basename>-animation.mp4.<scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir.","type":"string"},"preset":{"description":"Turntable look: 'publish' (default; studio product shot) or 'default' (engineering look).","enum":["default","publish"],"type":"string"},"shadow":{"description":"Turntable + publish: soft contact shadow under the model (default true).","type":"boolean"},"turntable":{"default":false,"description":"Seamless 360° orbit of the model instead of the animationView timeline.","type":"boolean"},"verify_every":{"description":"Additionally verify at every ⟨9 unchanged words⟩ the keyframe sample set).","minimum":1,"type":"integer"},"width":{"description":"Turntable frame width in px (default 1080; even for MP4).","maximum":2048,"minimum":64,"type":"integer"}},"required":[ ⟨3 unchanged words⟩
⟨66 unchanged words⟩ stacked-primitive toys). Stop on ok or convergence.escalate. To pick among N alternative candidates for one goal without a judge, pass them all as attempts with consensus:true (geometric medoid selection). For organic/car bodies set likenessProfile:"automotive" and ⟨22 unchanged words⟩
⟨307 unchanged words⟩ Default false.","type":"boolean"},"consensus":{"description":"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, candidates without a valid solid are dropped, and the candidate whose geometry agrees most with the others (medoid by symmetric Chamfer distance, same model frame) is selected. Ties go to more gates passed, then the shorter script. Returns consensus { chosenIndex, chosenAttemptId, scores, distances, reason }; ok / finalAttemptId / nextActionPrompt describe the selected candidate. Default false.","type":"boolean"},"epsilonMm3":{"description":"Forwarded to review_cad.", ⟨255 unchanged words⟩
⟨12 unchanged words⟩ "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.","type":"string"},"code":{ ⟨18 unchanged words⟩ 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.","type":"string"},"out_dir":{ ⟨93 unchanged words⟩
⟨12 unchanged words⟩ "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.","type":"string"},"code":{ ⟨10 unchanged words⟩ "Revised script — path to a .kcad.ts file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"}},"type":"object"}
⟨32 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"skipMechanismCheck":{ ⟨55 unchanged words⟩
⟨20 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"point":{ ⟨22 unchanged words⟩
⟨53 unchanged words⟩ Region or planar face), 3mf (slicer-friendly mesh:withoneper-partnamedcolorsobject 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), glb (web-viewer / AR with PBR materials), ⟨125 unchanged words⟩ real section views on any cutting plane). pdf-drawing (the same sheet — views, dashed hidden lines, dimensions, hole callouts, GD&T, sections, parts list — as a printable vector PDF on a standard sheet, one call: ISO a4|a3|a2|a1|a0 or ANSI ansi-a…ansi-e landscape, default a3, or sheet "auto" / "auto-ansi" for the smallest sheet that holds the views at 1:1; the drawing scale is picked to fit; projection "third" (default) or "first" arranges the views and draws the matching symbol; a full title block carries title, part name, material, scale, units, sheet size, date and revision, settable through options.title / partName / material / revision / date; autoAnnotate is on unless options.annotations is given). Robot descriptions: urdf (tree-topology robot description), ⟨220 unchanged words⟩ for the per-format keys: dxf layers/tolerance/unit, 3mfprintUnit/embedSourceprintUnit/embedSource/arrange/orient/slicer/printer, glb axis/draco). - target:'part' — ⟨76 unchanged words⟩ fails closed on its own missing required params. Hosted server: the file is written on the kernelCAD server, NOT on the caller's machine. The result carries `downloads[]` — an HTTPS `url` per file (expires after 24 h; give it to the user) — and, for files up to 1 MB, the bytes inline as an embedded resource. `output_path` only names the file; the returned `output_path` is a server-side path, usable only as `file` in later calls to this server.
⟨24 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"format":{ ⟨15 unchanged words⟩ dxf","3mf","glb","svg-drawing","pdf-drawing","urdf","srdf","sdf-gazebo","usd-isaac"," ⟨44 unchanged words⟩ \"mm\"|\"cm\"|\"in\", embedSource?, arrange?: \"none\"|\"plate\"|\"assembled\", orient?: boolean, slicer?: \"generic\"|\"bambu\"|\"orca\"|\"prusa\", printer?: printer profile id, one of \"generic-fdm\"|\"bambu-a1-mini\"|\"bambu-a1\"|\"bambu-p1s\"|\"bambu-p1p\"|\"bambu-x1c\"|\"bambu-x1e\"|\"bambu-h2d\"|\"bambu-h2s\"|\"prusa-mini-plus\"|\"prusa-mk4s\"|\"prusa-core-one\"|\"prusa-xl\"|\"creality-ender-3-v3\"|\"creality-k1\"|\"creality-k1-max\"|\"creality-k2-plus\"|\"elegoo-neptune-4-pro\"|\"anycubic-kobra-3\"|\"voron-2.4-250\"|\"voron-2.4-300\"|\"voron-2.4-350\"|\"ultimaker-s5\" (default \"generic-fdm\"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }.; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. glb: { axis?: \"y-up\"|\"z-up\" ⟨3 unchanged words⟩ svg-drawing: { sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, ⟨162 unchanged words⟩ () / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \
⟨13 unchanged words⟩ (success).","type":"string"},"disclosure":{"description":"Referral disclosure. Present only when url carries a referral tag; show it with the link.","type":"string"},"error":{"type":"string"},"errorCode" ⟨2 unchanged words⟩ ,"errorHint":{"type":"string"},"instruction":{"description":"What to do with the link_out URL.","type":"string"},"kind":{"description":"'link_out' when the URL is a vendor configurator the agent must drive by hand.","type":"string"},"ok":{"type":"boolean"},"record" ⟨27 unchanged words⟩ came from ('local' | 'remote') (success).","type":"string"},"url":{"description":"Outbound vendor URL (link_out). May carry a referral tag; see disclosure.","type":"string"}},"required": ⟨3 unchanged words⟩
⟨5 unchanged words⟩ {"type":"string"},"file":{"description":"Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"}},"type":"object"}
⟨179 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"gyration_axis":{ ⟨249 unchanged words⟩
⟨30 unchanged words⟩ mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"format":{ ⟨120 unchanged words⟩
⟨41 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"mode":{ ⟨40 unchanged words⟩
⟨339 unchanged words⟩ 'curvature' }); the overlay is the picture. PUBLISH PRESET: pass { preset: 'publish' } for a share-ready studio product shot (gallery tile, social post, README image, product page): key/fill/rim lights + room reflections, soft contact shadow, clean backdrop ({ background: 'white' (default) | 'light' | 'dark' | 'black' | '#rrggbb' | 'transparent' } — transparent gives a PNG with alpha), { shadow: false } to drop the shadow, 2× supersampled anti-aliasing, 30° lens, the model silhouette centred and auto-framed with ~11% air (a script's setCameraTarget is ignored), per-part colours/materials as authored, no watermark. With no views/pose it renders ONE image named 'hero' (3/4 front-right, az=30°, el=22°) at 1600×1200; width/height go up to 2048; views/pose still work under the preset. Output is deterministic for the same input. For a 360° loop use capture_animation({ turntable: true }). Returns { ok, images: [{ name, ⟨32 unchanged words⟩
{"properties":{"background":{"description":"preset 'publish' only: 'white' (default), 'light', 'dark', 'black', 'transparent' (PNG alpha), or '#rrggbb'.","type":"string"},"base_url":{"description":"Advanced: force a ⟨134 unchanged words⟩ .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.","type":"string"},"focus":{ ⟨21 unchanged words⟩ ":"Per-view tile height in px (default768768; 1200 under preset: 'publish').","maximum":2048,"minimum":64, ⟨126 unchanged words⟩ '30,20'.","type":"string"},"preset":{"description":"Render look: 'default' (engineering review) or 'publish' (studio product shot for sharing; one 'hero' image unless views/pose are given).","enum":["default","publish"],"type":"string"},"section":{"additionalProperties":false,"description":"Cut ⟨66 unchanged words⟩ ,"position"],"type":"object"},"shadow":{"description":"preset 'publish' only: soft contact shadow under the model (default true).","type":"boolean"},"views":{"description":"Canonical views to render ⟨31 unchanged words⟩ ":"Per-view tile width in px (default768768; 1600 under preset: 'publish').","maximum":2048,"minimum":64, ⟨4 unchanged words⟩
⟨30 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"max_attempts":{ ⟨57 unchanged words⟩
⟨92 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"gripperAperture":{ ⟨334 unchanged words⟩
⟨18 unchanged words⟩ 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.","type":"string"},"heatmaps":{ ⟨81 unchanged words⟩
⟨72 unchanged words⟩ 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 ⟨12 unchanged words⟩
⟨41 unchanged words⟩ {"description":"Uploaded file name (default:'kernelcad.gcode''kernelcad.gcode'; bambu-lan appends '.3mf').","type":"string"},"gcode_path" ⟨14 unchanged words⟩ or IP.","type":"string"},"model_3mf_path":{"description":"bambu-lan only: model .3mf from export format '3mf' to package the G-code into (the uploaded .gcode.3mf).","type":"string"},"port":{"description":"Override the protocol default port.","type":"number"},"printer":{"description":"Printer profile id; checked against protocol before upload. List them with 'kernelcad print printers'.","enum":["generic-fdm","bambu-a1-mini","bambu-a1","bambu-p1s","bambu-p1p","bambu-x1c","bambu-x1e","bambu-h2d","bambu-h2s","prusa-mini-plus","prusa-mk4s","prusa-core-one","prusa-xl","creality-ender-3-v3","creality-k1","creality-k1-max","creality-k2-plus","elegoo-neptune-4-pro","anycubic-kobra-3","voron-2.4-250","voron-2.4-300","voron-2.4-350","ultimaker-s5"],"type":"string"},"protocol":{"enum":["octoprint" ⟨41 unchanged words⟩
⟨33 unchanged words⟩ "uploaded_path":{"description":"Path/name the G-code (bambu-lan: the .gcode.3mf print file) was stored under on the printer.","type" ⟨5 unchanged words⟩
⟨22 unchanged words⟩ "description":"Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"gates":{ ⟨85 unchanged words⟩
⟨66 unchanged words⟩ { vendor, material, thicknessIn|thicknessMm, ... }). Returns the vendor's catalog source pages as `sources`; when `disclosure` is present, show it with those links. - 'swept-collision' — sweep declared joint range(s ⟨134 unchanged words⟩
⟨131 unchanged words⟩ :"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"},"gravity":{ ⟨480 unchanged words⟩
⟨5 unchanged words⟩ {"type":"string"},"file":{"description":"Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project.","type":"string"}},"type":"object"}
⟨181 unchanged words⟩ :"object"},"type":"array"},"autoRevise":{"description":"When true (default), failing attempts with repairable feature diagnostics (boolean miss, oversized fillet, …) run bounded repair_script and attach revisionAssist.suggestedPatches / autoApplied.suggestedCode. Set false to skip the extra repair pass (hints-only). Does not autonomously rewrite full CAD models.","type":"boolean"},"bodyLikeness":{"description":"When likenessProfile=automotive: body_bbox (required for gate), wheels, cabin_bbox, still_verdicts. Missing body_bbox fails with reference.likeness.gate-required. Stills may also come from visualReview.checks.","properties":{"body_bbox":{"type":"object"},"cabin_bbox":{"type":"object"},"length_axis":{"enum":["x","y"],"type":"string"},"require_stills":{"type":"boolean"},"still_verdicts":{"items":{"type":"object"},"type":"array"},"wheels":{"items":{"type":"object"},"type":"array"}},"type":"object"},"combinatorial":{"description":"Sample all 2^N limit-corner ⟨70 unchanged words⟩ to review_cad. Default true.","type":"boolean"},"likenessProfile":{"description":"When 'automotive', require organic-body still checks on visualReview AND the body-likeness publish gate (pass bodyLikeness or stills on checks). Attempts stay non-ok until publishReady. Final open_in_studio must pass likeness_profile:'automotive' (server hard-gates success).","enum":["automotive"],"type":"string"},"outputRecordPath":{"description":"Optional JSON ⟨165 unchanged words⟩
⟨3 unchanged words⟩ :{"attempts":{"description":"Per-attempt reviewresults.results (includes revisionAssist when failed).","items":{"additionalProperties":true,"type":"object"},"type":"array"},"convergence":{"additionalProperties":true,"description":"Present when trailing failures share a signature (escalate).","type":"object"},"finalAttemptId":{"type":"string"},"goal" ⟨26 unchanged words⟩ "object"},"recordUrl":{"type":"string"},"revisionAssist":{"additionalProperties":true,"description":"Structured revision assist from the last failing attempt: hints, suggestedPatches (AST diffs), optional autoApplied.suggestedCode when repair_script cleared a repairable diagnostic. Honest scope — not full autonomous CAD rewrite.","type":"object"}},"required":["ok","goal" ⟨3 unchanged words⟩
⟨346 unchanged words⟩ build and after each meaningful revision while iterating. ORGANIC/CAR SUCCESS GATE: for final likeness claims pass likeness_profile:"automotive" (and body_bbox/wheels/still_verdicts, or a prior verify body-likeness pass for this code). If the gate fails, ok:false with DX reference.likeness.publish-blocked|gate-required — do not claim success. Omit likeness_profile for WIP previews only.
⟨42 unchanged words⟩ "maxItems":32,"type":"array"},"body_bbox":{"description":"Body AABB { min:[x,y,z], max:[x,y,z] } mm — for likeness_profile gate when no session attest.","type":"object"},"cabin_bbox":{"description":"Optional cabin AABB for likeness gate.","type":"object"},"code":{"description":"The full .kcad source ⟨64 unchanged words⟩ URLs only.","type":"boolean"},"likeness_profile":{"description":"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 for this exact code). Omit for WIP previews.","enum":["automotive"],"type":"string"},"parameters":{"description":"Optional list of the ⟨143 unchanged words⟩ :"object"},"type":"array"},"require_stills":{"description":"Forwarded to body-likeness gate (default true).","type":"boolean"},"slug":{"description":"Slug returned by a ⟨23 unchanged words⟩ "minLength":1,"type":"string"},"still_verdicts":{"description":"Agent still checklist for likeness gate [{ code, passed, finding, view? }].","items":{"type":"object"},"type":"array"},"title":{"description":"Optional human-readable title for ⟨9 unchanged words⟩ "Model from Claude\".","type":"string"},"wheels":{"description":"Wheel centres + radii for likeness gate [{ center:[x,y,z], radius }].","items":{"type":"object"},"type":"array"}},"required":[],"type":"object"}
⟨140 unchanged words⟩ pose?, gravity?, min_torque_margin_pct?, range_samples? }). - 'body-likeness' — publish gate for organic/car bodies: cheap AABB↔wheel checks plus required agent still verdicts (side-body-over-wheels, side-cabin-aft, rear-haunch, ortho-proportions-vs-reference). Pass { body_bbox | code/file+body_feature_id, wheels?, cabin_bbox?, still_verdicts?, require_stills? }. Full CV silhouette matching is NOT implemented — agents must inspect ortho PNGs/Studio and supply still_verdicts before claiming success. All params except `check` are check-specific and forwarded ⟨11 unchanged words⟩
⟨9 unchanged words⟩ captured assembly.","type":"string"},"body_bbox":{"description":"check:'body-likeness' — body AABB { min:[x,y,z], max:[x,y,z] } in mm.","type":"object"},"body_feature_id":{"description":"check:'body-likeness' — FeatureId to read body AABB from when body_bbox omitted.","type":"string"},"cabin_bbox":{"description":"check:'body-likeness' — optional cabin/greenhouse AABB for automated cabin-aft.","type":"object"},"check":{"description":"Which verification to run.","enum":["assembly ⟨4 unchanged words⟩ ,"reachable","mounting-holes","load-capacity","static-hold","body-likeness"],"type":"string"},"code":{ ⟨110 unchanged words⟩ declared actuator.","type":"string"},"length_axis":{"description":"check:'body-likeness' — wheelbase axis (default 'x').","enum":["x","y"],"type":"string"},"loads":{"description":"check:'load-capacity' — partName ⟨192 unchanged words⟩ catalog refresh.","type":"boolean"},"require_stills":{"description":"check:'body-likeness' — require still_verdicts (default true).","type":"boolean"},"safety_factor_threshold":{"description":"check:'load-capacity' — pass/fail ⟨33 unchanged words⟩ ,"bending"],"type":"string"},"still_verdicts":{"description":"check:'body-likeness' — agent ortho still checklist [{ code, passed, finding, view? }]. Required codes: side-body-over-wheels, side-cabin-aft, rear-haunch, ortho-proportions-vs-reference.","items":{"type":"object"},"type":"array"},"target_orientation":{"description":"check:'reachable' — target ⟨93 unchanged words⟩ for that check).","type":"string"},"wheels":{"description":"check:'body-likeness' — wheel centres + tire radii [{ center:[x,y,z], radius }].","items":{"type":"object"},"type":"array"}},"required":["check"],"type":"object"}
⟨85 unchanged words⟩ — omitting reuses that last evaluated source). Multi-body assemblies must declare connectors + mates/joints before publish — otherwise evaluate_script fails with mechanism.orphan-part (disconnected components). Use type: 'axis' + revolute mates for shafts/hinges/gears; type: 'frame' + fastened for rigid mounts; or arm.revolute/.prismatic/.ball/.fixed. Connector types are only frame|axis|planar|ball. Pass `slug` from a previous call to update ⟨60 unchanged words⟩ meshStatus mirrors get_project (ready|building|failed|missing). Under CDN,heavyopen_in_studiomesheswaitsmayupreturnto ~20s (OPEN_IN_STUDIO_MESH_SYNC_BUDGET_MS) for the revision mesh before returning; heavier publishes usually land meshStatus=ready. If still meshStatus=buildingquickly+whilemeshReady=false:OCCTTRANSIENTfinishes;— meshUrl is the expected CDN pin; embed retriesmeshUrl404s.—Polldoget_project({slug})notuntilwaitready, orre-publishre-calljustopen_in_studioforwiththesamemesh.code+slug — never treat building as permanent failure/404. ALWAYS pass `code` when you have it ( ⟨88 unchanged words⟩
⟨57 unchanged words⟩ is failed.","type":"string"},"meshHint":{"description":"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.","type":"string"},"meshReady":{"description":"True only when meshStatus===ready. ⟨317 unchanged words⟩
⟨183 unchanged words⟩ not wait or re-publish just for the mesh. ALWAYS pass `code` when you have it (avoid no_code_to_reuse); evaluate_script reuse is a fallback. Paint phases: projectSaved / meshReady / previewDelivered are set here; viewerPainted is ONLY true after widget ack (model context / widgetState) — never claim paint from this tool alone. Do NOT call get_model_mesh or get_latest_render for interactive paint. Pass include_preview:false to skip the rasterizer (save ⟨34 unchanged words⟩
⟨57 unchanged words⟩ is failed.","type":"string"},"meshReady":{"description":"True only when meshStatus===ready. building+meshUrl means embed is still polling.","type":"boolean"},"meshStatus":{"description":"ready | building | ⟨77 unchanged words⟩ silently omitted.","type":"boolean"},"paintHint":{"description":"Agent guidance: do not claim interactive paint until viewerPainted.","type":"string"},"previewBytes":{"type":"number"},"previewCached" ⟨84 unchanged words⟩ ,"previewWidth":{"type":"number"},"projectSaved":{"description":"True when the project/revision was persisted. Not the same as viewerPainted.","type":"boolean"},"serverBuild":{"description":"Deploy identity so connector ⟨69 unchanged words⟩ version.","minimum":1,"type":"integer"},"viewerPainted":{"description":"Always false on tools/call. The Studio widget sets viewerPainted:true via updateModelContext after a correlated model_displayed ack.","type":"boolean"}},"type":"object"}
⟨31 unchanged words⟩ in any site or widget (no login). Includes meshUrl when a revision mesh artifact is available.","type":"string"},"meshUrl":{"description":"Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed.","type":"string"},"ok":{"description":"Whether the model was ⟨90 unchanged words⟩ "string"},"previewWidth":{"type":"number"},"serverBuild":{"description":"Deploy identity so connector vs server mismatch is observable.","type":"string"},"slug":{"description":"The project ⟨65 unchanged words⟩
Use this when you needtoanauthororganic, 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..kcad.ts, OR when you need to finish surfaces into a watertight solid or taper faces for moldability. Oneauthoringauthoring/finishing path, selected by `kind`: - 'nurbs' — ⟨17 unchanged words⟩ construction, OR { section_sketch_ids } for skinning.Slice-1Weightslimitation:areweightshonored:aresupplyacceptedrationalbutweightscurrentlytoignoredbuild(TColStd_Array2OfRealexactnotcircles/cylinders/spheres/conicsexposed(theinsurfaceWASMbecomesbindingsrational);surfacesomitareweightsnon-rational.for a non-rational surface. - 'boundary' — insert a surfaceFromBoundary([c1, ⟨22 unchanged words⟩ must coincide within 1e-6 mm) via OCCT BRepOffsetAPI_MakeFilling. - '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 via OCCT BRepBuilderAPI_Sewing. 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 ⟨30 unchanged words⟩
{"properties":{"angle_deg":{"description":"kind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction.","maximum":90,"minimum":0,"type":"number"},"binding_name":{"description":"JS const name for the newSurfacebinding (kind:'nurbs' default surface_<N>; kind:'boundary' default_surface_<N>_surface_<N>; kind:'trim' default _trimmed_<N>; kind:'sew' default _sewn_<N>; kind:'draft' default _drafted_<N>).","type":"string"},"by_binding":{"description":"kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.","type":"string"},"code":{"description":"Current .kcad.ts source.", ⟨143 unchanged words⟩ ,"v"],"type":"object"},"face":{"description":"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.","type":"string"},"kind":{"description":"Which surface-construction or surface-finishing path touse.use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'.","enum":["nurbs","boundary","trim","sew","draft"],"type":"string"},"knots":{ ⟨25 unchanged words⟩ "array"}},"type":"object"},"neutral_plane":{"description":"kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.","type":"string"},"op":{"description":"kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).","enum":["trim","split"],"type":"string"},"
Use this when you needtoanauthororganic swept solid whose cross-section changes along its length — a tapering body, horn, bottle, fairing, or duct — authored as a variable-section sweep along a spine. Insert a ⟨108 unchanged words⟩
⟨307 unchanged words⟩ build record.","type":"string"},"requirePhysicalAcceptance":{"description":"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 calls physicalUseCase(...).","type":"boolean"},"requireVisualReview":{"description":"Require screenshot-backed visualReview with ⟨88 unchanged words⟩
⟨12 unchanged words⟩ (success).","type":"object"},"deeperDiffAvailable":{"additionalProperties":true,"description":"Present when the diff touched geometry-affecting ops: { tool: 'diff_geometry', reason, bodies } — the same two scripts can be compared at material level (added/removed/common volume + per-body verdict).","type":"object"},"diagnostics":{"items":{"additionalProperties":true," ⟨92 unchanged words⟩
⟨38 unchanged words⟩ 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 (self-collision, fastened drift, dof-mismatch) makes ok:false with the failures in diagnostics. Pass { skipMechanismCheck: true } to opt out. Pass either { file: "<path>" } ⟨73 unchanged words⟩
⟨36 unchanged words⟩ .kcad.ts script file.","type":"string"},"skipMechanismCheck":{"description":"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 mechanism makes ok:false. Set true to skip the sweep entirely (no `mechanism` field, no cost). Ignored for dryRun and non-assembly scripts.","type":"boolean"}},"type":"object"}
⟨32 unchanged words⟩ the script.","type":"number"},"featureHealth":{"description":"Per-feature health degradations — ONLY features that fell back to a passthrough (warning) or failed to lower (error). Empty when every feature is healthy. Surfaces which feature degraded even when ok is true.","items":{"additionalProperties":false,"properties":{"featureId":{"type":"string"},"status":{"enum":["warning","error"],"type":"string"}},"required":["featureId","status"],"type":"object"},"type":"array"},"mechanism":{"description":"Mechanism-truth verdict for an assembly-built scene (default-on; omitted for dryRun, non-assembly, or skipMechanismCheck:true). 'broken' makes ok:false; 'unverified' keeps ok and surfaces a loud budget diagnostic.","enum":["real","broken","unverified"],"type":"string"},"ok":{"description":"Whether the script compiled ⟨27 unchanged words⟩
⟨87 unchanged words⟩ , title block; assemblies are drawn with inter-partocclusionocclusion; pass options.annotations to dimension specific features instead of the bounding box; pass options.exploded { factor, mode } to explode the isometric cell, options.balloons to number parts from the BOM, and options.partsList for an item/name/qty/material table above the title block). overall bounding-box dimensions, title block; assemblies are drawn with inter-part occlusion; pass options.annotations to dimension specific features instead of the bounding box, options.autoAnnotate to derive datums A/B/C, grouped hole callouts with position tolerances, hole positions, overall size, radius and chamfer callouts, flatness and an ISO 2768 note from the geometry (the result carries drawing_report with placed / overlapped counts), and options.sections for real section views on any cutting plane). Robot descriptions: urdf (tree-topology robot description), ⟨13 unchanged words⟩ joints, closed loops, and solved per-link poses), usd-isaac (ASCII USD physics stage: PhysicsArticulationRootAPI root, one rigid body per link at its solved pose with mass / centre of mass / principal inertia, PhysicsFixedJoint/PhysicsRevoluteJoint/PhysicsPrismaticJoint per mate with token axis, two-sided joint frames and limits, UsdPreviewSurface materials from the part appearance, and joint drives only when declared in options.drives { <mate>: { stiffness, damping, maxForce?, targetPosition? } }; options.collisionApproximation is convexHull | convexDecomposition; planar/cylindrical/pin_slot/ball mates fail closed with export.usd.joint-unsupported). bom-csv / bom-json (bill of materials over assembly.model()/solvedModel(): one row per distinct part — grouped by geometry/catalog identity, not name — with real instance quantity, kind, material, density, mass, bbox, process hint, and catalog provenance for purchased parts; same numbers as inspect({ of: 'bom' })). urdf and sdf-gazebo also write one meshes/<part>.stl per link, and usd-isaac one meshes/<part>.usda mesh layer per link, next to output_path (reported in mesh_files) — ⟨161 unchanged words⟩
⟨52 unchanged words⟩ ,"svg-drawing","urdf","srdf","sdf-gazebo","usd-isaac","bom-csv","bom-json"],"type":"string"},"no_verify":{ ⟨58 unchanged words⟩ : \"a4\"|\"a3\", modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"] }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones.","type":"object"},"output_dir":{ ⟨78 unchanged words⟩
⟨31 unchanged words⟩ ,"mesh_files":{"description":"Per-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo,exports.meshes/<part>.usda mesh layers for usd-isaac.","items":{"type":"string"}, ⟨34 unchanged words⟩
⟨59 unchanged words⟩ 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 ⟨147 unchanged words⟩ }); count + exemplar ids per family. - 'bom' — bill of materials ({ assembly? }): one row per distinct part (grouped by geometry/catalog identity, not name) with real instance quantity, kind ('fabricated'|'purchased'), material, density, per-unit and total mass, bbox, a fabrication process hint, catalog provenance for purchased parts, and totals; `bom.*` diagnostics flag rows with no density source or missing catalog vendor info instead of guessing. - 'section' — numeric cross-section probe of a shape: area, perimeter, loop/hole counts, 2D bbox at a plane ({ feature_id?, plane | at+axis, stack?: { from, to, count, axis? } }). `stack` scans evenly spaced slices and returns `minAreaIndex`/`minAreaPosition` — use it to find the neck/thinnest cross-section along an axis. - 'continuity' — G0/G1/G2 classification of shared edges ({ feature_id?, edges? }); position gap, normal jump, curvature difference, worst-sample XYZ. - 'curvature' — per-face Gaussian and mean curvature min/max/mean, inflections, spikes ({ feature_id?, faces?, spike_factor? }). All params except `of` are subject-specific and forwarded ⟨8 unchanged words⟩
{"properties":{"assembly":{"description":"of:'assembly'|'robot''assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly.","type":"string"},"at":{"description":"of:'section' — single slice position along `axis` (mm).","type":"number"},"axis":{"description":"of:'section' — normal axis for `at` / `stack` (default 'z').","enum":["x","y","z"],"type":"string"},"category":{"description":"of:'part-families' — optional ⟨12 unchanged words⟩ script source.","type":"string"},"density":{"description":"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.","type":"number"},"edges":{"description":"of:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled."},"face_name":{"description":"of:'face-edges' — canonical ⟨13 unchanged words⟩ ,"back"],"type":"string"},"faces":{"description":"of:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled."},"feature_id":{"description":"of:'shape'|'topology'|'edges'|'faces'|'face-edges'|'face-labels''shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape. ⟨8 unchanged words⟩ script file.","type":"string"},"gyration_axis":{"description":"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.","properties":{"direction":{"description":"Axis direction; normalised internally, so it need not be a unit vector.","items":{"type":"number"},"maxItems":3,"minItems":3,"type":"array"},"origin":{"description":"A point on the axis, shape-local mm.","items":{"type":"number"},"maxItems":3,"minItems":3,"type":"array"}},"required":["origin","direction"],"type":"object"},"of":{"description":"Which facts to read.","enum":["assembly","robot","step","shape","mass","features","assemblies","topology","edges"," ⟨6 unchanged words⟩ ,"bend-table","params","part-categories","part-families","bom","section","continuity","curvature"],"type":"string"},"plane":{"description":"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`.","type":["string","object"]},"query":{"description":"of:'edges'|'faces' — optional EdgeQuery/FaceQuery filter.","type":"object"},"spike_factor":{"description":"of:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6).","type":"number"},"stack":{"description":"of:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition.","properties":{"axis":{"description":"Scan axis (default 'z').","enum":["x","y","z"],"type":"string"},"count":{"description":"Number of evenly spaced slices (>= 1).","type":"integer"},"from":{"description":"Start position along the axis (mm).","type":"number"},"to":{"description":"End position along the axis (mm).","type":"number"}},"required":["from","to","count"],"type":"object"}},"required":[ ⟨3 unchanged words⟩
⟨48 unchanged words⟩ 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.
⟨84 unchanged words⟩ :"object"},"type":"array"},"shapeListMethods":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"shapeMethods":{"items":{"additionalProperties":true," ⟨24 unchanged words⟩
Use this when you need to wrap a 2D closed curve onto a 3D face. Insert a `<shape>.projectCurve({curvesource, face, scaleMode?,asEdge?})` chained call into a kernelCAD script.WrapsThea`source`2Disclosedthe structured `{ kind: "sketchCommands", commands: [...] }` wire format the runtime API accepts. Wraps the curve ontoa 3Dthe face along the face normal; pair with `.extrude(d)` / `.cut(...)` forengraved logosraised orlabelengravedinsertslogos on curved bodies. Open-wire projection (`asEdge: true`) iscaptured but currentlynotdeferredimplementedatandloweristimerejected(BRepProj_Projectionatnoteditbundled).time. Side-effect-free; returns modified code plus diagnostics.
{"properties":{"asEdge":{"description":"ProjectOpen-wireas(edge)anprojection.openNOTedgeIMPLEMENTEDinstead—ofrejectedaatclosededitface-boundtime.sketch.UseCurrentlyadeferred.closed-curve projection (omit asEdge).","type":"boolean"},"bindAs":{ ⟨18 unchanged words⟩ source code.","type":"string"},"curveExpressioncommands
⟨156 unchanged words⟩ 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 ⟨73 unchanged words⟩ : "unverified"; ignored under strict mode). Pass { overlay: 'zebra' | 'curvature' | 'continuity' } for a surface-quality visualisation (zebra stripes from vertex normals, curvature as vertex colours, continuity edges coloured by G0/G1/G2/broken) — numbers come from inspect({ of: 'continuity' | 'curvature' }); the overlay is the picture. Returns { ok, images: [{ name, ⟨32 unchanged words⟩
⟨70 unchanged words⟩ three-light rig.","type":"string"},"explode":{"additionalProperties":false,"description":"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). Requires the script to return assembly.model() / solvedModel().","properties":{"factor":{"minimum":0,"type":"number"},"mode":{"enum":["radial","mate-axis"],"type":"string"}},"required":["factor"],"type":"object"},"file":{"description":"Path to a .kcad.ts ⟨113 unchanged words⟩ session dir.","type":"string"},"overlay":{"description":"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 through this same pipeline.","enum":["zebra","curvature","continuity"],"type":"string"},"pose":{"description":"Extra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'.","type":"string"},"section":{"additionalProperties":false,"description":"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 along the axis (kernelCAD Z-up frame); flip keeps the +axis side (default keeps the -axis side).","properties":{"axis":{"enum":["x","y","z"],"type":"string"},"flip":{"default":false,"type":"boolean"},"position":{"type":"number"}},"required":["axis","position"],"type":"object"},"views":{"description":"Canonical views ⟨49 unchanged words⟩
⟨150 unchanged words⟩ Default true.","type":"boolean"},"includePhysicalUseCaseJointReactions":{"description":"Derive exact-pose reaction wrenches through uniquely rooted articulated trees and compare every loaded mate against a complete declared resultant force/moment envelope. Implies physical-use-case reachability and statics.","type":"boolean"},"includePhysicalUseCaseJointStructure":{"description":"Run geometry/material clevis double-shear, pin-bending, bearing, tear-out, and net-section checks with minimum factor of safety 2. Unsupported axial or perpendicular-moment load cases remain blockers. Implies joint reactions, statics, and reachability.","type":"boolean"},"includePhysicalUseCaseReachability":{"description":"Run targeted physical-use-case reachability sampling over scalar-limited mates named in actuatorLimits. Reject contacts that cannot get within criteria.maxSlipMm and multi-contact use cases that cannot satisfy every contact in the same sampled actuator pose. Samples revolute/cylindrical/pin-slot limitsDeg and prismatic limitsMm. Defaults to requirePhysicalUseCase.","type":"boolean"},"includePhysicalUseCaseStatics":{"description":"Run opt-in pose-bound quasi-static certification at the exact common-contact samples: conservative friction/capacity, world force and moment balance, and finite-difference revolute actuator torque. Returns physicalUseCaseStaticCertificates on success; sampled linearized failures remain blocking diagnostics.","type":"boolean"},"includePoseEnvelope":{"description":"Whether to sample declared mate limits. Default true.","type":"boolean"},"physicalUseCaseReachabilitySamplesPerMate":{"description":"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 capped.","minimum":1,"type":"integer"},"preserveInterfaces":{"description":"External mates, connector ⟨14 unchanged words⟩ {"type":"string"},"type":"array"},"requirePhysicalUseCase":{"description":"When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.","type":"boolean"},"samplesPerMate":{"description":"Pose-envelope samples ⟨49 unchanged words⟩
⟨41 unchanged words⟩ "additionalProperties":true,"type":"object"},"interferenceSummary":{"additionalProperties":true,"description":"Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3.","type":"object"},"mechanism":{"type":"string"},"mechanismFailures" ⟨6 unchanged words⟩ "array"},"ok":{"type":"boolean"},"physicalUseCaseJointReactionCertificates":{"description":"Exact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm.","items":{"additionalProperties":false,"properties":{"poses":{"additionalProperties":true,"type":"object"},"reactions":{"items":{"additionalProperties":false,"properties":{"axialForceN":{"type":"number"},"axisMomentNmm":{"type":"number"},"axisWorld":{"items":{"type":"number"},"type":"array"},"bendingMomentNmm":{"type":"number"},"childPart":{"type":"string"},"forceWorldN":{"items":{"type":"number"},"type":"array"},"mateName":{"type":"string"},"momentWorldNmm":{"items":{"type":"number"},"type":"array"},"parentPart":{"type":"string"},"pointWorldMm":{"items":{"type":"number"},"type":"array"},"radialForceN":{"type":"number"},"resultantForceN":{"type":"number"},"resultantMomentNmm":{"type":"number"}},"required":["mateName","parentPart","childPart","pointWorldMm","axisWorld","forceWorldN","momentWorldNmm","resultantForceN","resultantMomentNmm","axialForceN","radialForceN","axisMomentNmm","bendingMomentNmm"],"type":"object"},"type":"array"},"useCaseName":{"type":"string"}},"required":["useCaseName","poses","reactions"],"type":"object"},"type":"array"},"physicalUseCaseJointStructuralCertificates":{"description":"Per-joint declared-envelope and geometry/material clevis strength evidence.","items":{"additionalProperties":false,"properties":{"joints":{"items":{"additionalProperties":false,"properties":{"envelope":{"additionalProperties":true,"type":"object"},"mateName":{"type":"string"},"structure":{"additionalProperties":true,"type":"object"}},"required":["mateName","envelope"],"type":"object"},"type":"array"},"poses":{"additionalProperties":true,"type":"object"},"useCaseName":{"type":"string"}},"required":["useCaseName","poses","joints"],"type":"object"},"type":"array"},"physicalUseCaseStaticCertificates":{"description":"Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.","items":{"additionalProperties":true,"type":"object"},"type":"array"},"poseEnvelope":{"additionalProperties":true,"description ⟨46 unchanged words⟩
⟨12 unchanged words⟩ :"object"},"type":"array"},"converged":{"description":"Whether the constraint solve converged below tolerance. ok is false when this is false.","type":"boolean"},"entities":{"description":"Solved sketchentities.entities (best-effort on a non-converging solve).","items":{"additionalProperties":true,"type" ⟨2 unchanged words⟩ :"array"},"errors":{"description":"SolverSolver/validation errors (present on failure, including non-convergence).","items":{"additionalProperties":true," ⟨3 unchanged words⟩ "array"},"ok":{"type":"boolean"},"residual":{"description":"Final aggregate constraint residual when the solver ran.","type":"number"}},"required":["ok","entities" ⟨3 unchanged words⟩
⟨150 unchanged words⟩ ","minimum":2,"type":"integer"},"priors":{"description":"Caller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts.","items":{"properties":{"confidence":{"maximum":1,"minimum":0,"type":"number"},"id":{"type":"string"},"statement":{"type":"string"},"value":{}},"required":["id","statement","value","confidence"],"type":"object"},"type":"array"},"scaleAnchor":{"description":"Pixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`.","properties":{"pixelDistance":{"description":"Distance in pixels between the two measured points.","type":"number"},"realDistance":{"description":"The same distance in real-world units.","type":"number"},"unit":{"enum":["mm","cm","in"],"type":"string"}},"required":["pixelDistance","realDistance","unit"],"type":"object"},"validate":{"description":"Assumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open.","enum":["warn","error"],"type":"string"}},"required":["imageUrl"],"type":"object"}
⟨40 unchanged words⟩ :"number"},"type":"array"},"ledger":{"additionalProperties":true,"description":"Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.","type":"object"},"ok":{"type":"boolean"}},"required":["ok","features","imageDims","diagnostics","ledger"],"type":"object"}
⟨117 unchanged words⟩ ({ loads, materials, ... }). - 'static-hold' — gravitational holding torque/force at a sampled pose grid vs each actuated joint's declared actuator capacity ({ joint?, pose?, gravity?, min_torque_margin_pct?, range_samples? }). All params except `check` are check-specific and forwarded ⟨11 unchanged words⟩
⟨24 unchanged words⟩ ,"swept-collision","reachable","mounting-holes","load-capacity","static-hold"],"type":"string"},"code":{ ⟨49 unchanged words⟩ "description":"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacityassembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold).","type":"string"},"gravity":{"description":"check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]).","items":{"type":"number"},"maxItems":3,"minItems":3,"type":"array"},"joint":{"description":"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.","type":"string"},"loads":{ ⟨50 unchanged words⟩ iteration cap.","type":"number"},"min_torque_margin_pct":{"description":"check:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20).","type":"number"},"mode":{"description":"check:'load-capacity' — 'beam' ⟨15 unchanged words⟩ in radians.","type":"number"},"pose":{"description":"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":{"description":"check:'reachable' — position ⟨38 unchanged words⟩ ":3,"minItems":3,"type":"array"},"range_samples":{"description":"check:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9).","type":"number"},"refreshCatalog":{"description":"check:'dfm-preflight' ⟨158 unchanged words⟩
{"additionalProperties":true,"properties":{"candidateReason":{"description":"Why no candidate was derivable.","type":"string"},"candidateStatus":{"description":"'no-automatic-candidate' means the region is the whole answer — no mechanical fix exists for that diagnostic kind.","enum":["candidates","no-automatic-candidate"],"type":"string"},"candidates":{"description":"Ordered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from.","items":{"additionalProperties":true,"type":"object"},"type":"array"},"chain":{"description":"Upstream feature diagnostics in ⟨20 unchanged words⟩ "string"},"ok":{"type":"boolean"},"repairRegion":{"additionalProperties":true,"description":"Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.","type":"object"},"targetDiagnosticId":{"description":"Id of the diagnostic the repair plan targets; pass it to repair_script.","type":"string"},"trace":{"description":"Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.","items":{"additionalProperties":true,"type":"object"},"type":"array"}},"required":["ok"],"type":"object"}
Diff Model Geometry — 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 sw…
Convert Drawing to CAD — 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 dept…
Get FEA Summary — Use this when you need a structural check's context without paying for a solve. Read-only: returns the stored summary of a previous run_fea (pass the same `output_dir`), whether the CalculiX + gmsh toolchain is available on this machine (with the install command when it is not), and the FEA material table with real E / Poisson / yield numbers so a grade is chosen against data rather than from memory. Never meshes, solves, or writes.
Fit Features to Mesh — 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,…
Repair CAD Script — 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. …
Resolve Image Assumptions — 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.
Run Structural FEA — Use this when you need to know whether a part will hold a load. Runs the linear-static structural study a script declares with `shape.feaStudy({ material, fixed, loads, meshSize?, minSafetyFactor? })`: meshes the solid with quadratic tetrahedra, solves it with CalculiX, and returns evidence — peak von Mises stress (MPa), peak displacement (mm), the minimum safety factor against the material yield, per-region hot spots named by @kc[...] face ref, mesh-quality trust flags, an equilibrium residual, and stress-heatmap PNG paths. Requires the external solver toolchain (CalculiX `ccx` plus the gmsh…
Send G-code to Printer — 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). Pass { dry_run: true } to validate connectivity/authentication only, without …
Sweep Tolerance Range — Use this when you need to check whether a mechanism stays buildable across a tolerance/dimension range, not just at one nominal value. Declares one or more param() names with a { values: [...] } list or a { min, max, steps } range, re-evaluates the script once per cartesian-product combination (capped at 64 combos — exceeding it truncates to the first 64 and emits kinematic.sweep-tolerance.combo-cap-exceeded), and runs the standard gates on each combo: interference, mounting-hole diameter agreement, and joint-axis binding (all three, default on); reachability only when gates.reachable names a…
⟨166 unchanged words⟩ summary only. To SEE the rendered model,usecall open_in_studio (includes PNG preview + viewer); use get_latest_renderinstead.only for alternate views.
Use this whenSave/publish theuser wantscurrenttokernelCADSEEmodelorANDsharedisplaytheitmodelin—oneitstep: persists thecurrent kernelCADproject,modelreturnsandthereturnsinteractiveaStudioone-clickviewerlink(MCPthatAppsopens/itChatGPTinoutputTemplate),theandkernelCADincludesStudioawebPNGapp,previewwherein theuserSAMEcantoolviewresultand(imagesharecontentit.+PasspreviewUrlthewhenfullavailable).`.kcad`Usesourcethisyouwhenhavethebeenuserbuildingwantsasto`code`.SEE`code`orisshareOPTIONAL:theifmodelyou—justdocalledNOT`evaluate_script`callyouget_latest_rendercanafterwardsomitforittheandhappythispath;reusesthethatpreviewlastisevaluatedalreadysourcehereautomaticallywhen(nopreviewDeliveredneedistotrue.re-sendPass thewhole script). Passfull`code``.kcad`explicitlysourcetoasoverride,`code`or(optionalwheneverif youhave not evaluated this exactjustsourcecalledyet.evaluate_scriptThe—resultomittingincludesreusesathat`slug`last—evaluatedpasssource).thatPass `slug`onfromeveryasubsequentprevious call toUPDATEupdate the same project inplace:place;theomituser's`slug`openonlyStudiofortabare-rendersnewlive,separatesomodel.theyStatuscanfields:watchok=true means themodelprojectevolvewasassaved;youpreviewDelivered=trueiterate.meansOmitthis`slug`result carries a displayable PNG — onlyforthen may you tell the user anew,previewseparatewasmodelshown.(eachPassomissioninclude_preview:falsecreatestoaskipnewtheprojectrasterizerand(savelink+ viewer URLs only). Trigger phrases: "open it in Studio ⟨4 unchanged words⟩ "show me the model"; also callitafter you finish a build,and after each meaningful revision while iterating.
⟨78 unchanged words⟩ "minLength":1,"type":"string"},"include_preview":{"description":"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 only.","type":"boolean"},"parameters":{"description":"Optional list of the ⟨203 unchanged words⟩
⟨46 unchanged words⟩ was persisted.","type":"boolean"},"previewBytes":{"type":"number"},"previewCached":{"type":"boolean"},"previewDelivered":{"description":"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.","type":"boolean"},"previewHeight":{"type":"number"},"previewHint":{"type":"string"},"previewStatus":{"description":"included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false.","enum":["included","included_inline","unavailable","skipped"],"type":"string"},"previewUrl":{"description":"HTTPS URL of the PNG preview when storage signed successfully.","type":"string"},"previewView":{"type":"string"},"previewWidth":{"type":"number"},"slug":{"description":"The project slug; pass ⟨63 unchanged words⟩