MCP App Store
by KeenEthics

Overview

kernelCAD turns natural-language descriptions into real, parametric CAD models. Ask for a part, bracket, enclosure, or mechanism and kernelCAD writes editable .kcad.ts source backed by a true BREP kernel (OpenCascade), then lets you inspect topology, run design checks (interference, manufacturability, reachability, load), and export to STEP/STL. Every model opens in an interactive 3D viewer right inside the conversation, so you can rotate, zoom, and review the part without leaving ChatGPT. Unlike a text-to-image tool, kernelCAD produces engineering-grade geometry with named faces and edges, parametric features, assemblies with mates and joints, and validation gates that catch broken or non-manufacturable models before you build.

Tools

add_connector

ChatGPT
Add a connector to a part/assembly. Types: frame|axis|planar|ball. Shafts/hinges/gears need type: axis then revolute mate; rigid mounts need type: frame + fastened.

add_constraint

ChatGPT
Add a sketch constraint.

add_curve

ChatGPT
Author curves (line/arc/bezier/hermite/…). Inserts into .kcad source.

add_feature

ChatGPT
Insert a solid feature (extrude/revolve/fillet/…) into .kcad source.

add_mate

ChatGPT
Add an assembly mate/coupling/transmission. Relation type selects required fields.

add_part

ChatGPT
Add a part instance to an assembly.

add_path_segment

ChatGPT
Append a 2D path segment (line/arc/hermite/…). Inserts into .kcad source.

add_pattern_feature

ChatGPT
Pattern an existing feature (linear/circular/…).

add_surface

ChatGPT
Author/finish NURBS surfaces. kind selects nurbs|boundary|loft|revolve|thicken|taper|… — inserts into .kcad source.

add_text

ChatGPT
Add 3D/engraved text feature into .kcad source.

add_variable_sweep

ChatGPT
Add a variable-section sweep feature into .kcad source.

add_workspace_target

ChatGPT
Add a workspace/robotics target.

apply_surface_blend

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

capture_animation

ChatGPT
Capture an animation/turntable of a model.

design_loop

ChatGPT
Run a multi-attempt design/review loop over code/file attempts.

dfm_review

ChatGPT
Review a model for manufacturability with pass/fail checks for FDM printing and CNC machining. Pass code/file.

diff_geometry

ChatGPT
Compare geometry between two model versions/scripts.

diff_scripts

ChatGPT
Diff two .kcad sources.

drawing_to_cad

ChatGPT
Vector engineering PDF → starter CAD. PNG/scans: use trace_from_image. 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). A file the user attached in this chat is sent in files and used automatically.

evaluate_script

ChatGPT
Evaluate .kcad source ({ code } or { file }) → diagnostics + geometry summary. Multi-body assemblies need connectors + mates/joints or mechanism.orphan-part fails (axis+revolute for shafts/hinges/gears; frame+fastened for rigid). Declare partRef.connector before arm.mate; after edits delete stale duplicate/orphaned overlapping bodies. Articulated closed loops (4-bar etc.) are UNSUPPORTED on v0.6.0 — expect assembly.solver.did-not-converge; use an open chain or fastened-only loop (do not invent gear-contact types). Use before open_in_studio.

evaluate_sdf

ChatGPT
Evaluate a signed-distance field helper.

execute_cookbook

ChatGPT
Prefer after lookup_cookbook for industry demos when you need evaluate + optional Studio in ONE call. Args: id or query; dryRun:false for evidence; openInStudio:true to publish/paint. Different cookbooks are new projects. dryRun:true is NOT evidence. Do not refuse if you only scrolled Write tools — this is a registered MCP tool (read category).

explode_view

ChatGPT
Use this when you need an ordered exploded-view plan for an assembly. Supply parts as {name,center:[x,y,z],size:[x,y,z]} in mm, or a LabWired handoff containing parts with ref, position_mm.value and physical.bbox_mm (also accepts bbox_mm.value). Optional explicit assembly_order takes precedence over handoff assembly_order / assembly.order. Missing order falls back to input part order; parts lacking usable placement or bbox and unlisted/unknown order refs are reported. Choose mode axis (default) or radial; axis follows the requested direction, radial moves parts away from the assembly centroid. The result includes ready-to-paste param_declarations, animation_tracks and reverse_animation_tracks for animationView(), part_transforms for existing shapes, and script_fragment. cameraPlan gives framing guidance.

export

ChatGPT
Export geometry: target + format + output_path + code/file. Front-only SVG/PDF: options.views:["front"]. Share downloads[].url. On export.deferred poll export({ job_id }).

fab_pack

ChatGPT
Package fabrication files into a ZIP with quote-page links. Hosted downloads are returned in downloads[].url; nothing is uploaded or ordered.

fea_summary

ChatGPT
Summarize the latest FEA result.

fetch_part

ChatGPT
Fetch a bundled catalog part. Prefer await lib.standard.nema17() and await lib.standard.bearing608() (offline). Lookups fail within 45s with parts.lookup.timeout rather than hanging.

fetch_part_model

ChatGPT
Use this when a LabWired handoff part needs a STEP or GLB model resolved from a verified HTTPS URL plus SHA-256, or from catalog_id / MPN. The tool uses fetch_part/find_part catalog plumbing, stores URL-fetched bytes in a SHA-256 cache, checks the supplied hash, compares measurable model dimensions with bbox_mm, and returns provenance or a model_not_found result. GLB bounds are checked when POSITION accessor bounds are available; otherwise bbox_check.status is not_checked.

find_part

ChatGPT
Search the bundled catalog. NEMA-17: await lib.standard.nema17(). 608 bearing: await lib.standard.bearing608(). Do not fan out parallel lookups. Remote calls fail within 45s (parts.lookup.timeout).

fit_plane

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

flatten_pattern

ChatGPT
Flatten sheet-metal pattern.

generate_kcad_from_prompt

ChatGPT
Generate a kernelCAD .kcad.ts script from a natural-language prompt and return the evaluated source. BEFORE CALLING: read the kernelcad-authoring MCP resource (or call the lookup_authoring_skill tool if your client does not list resources) so you know the script-authoring conventions, parameter style, and evaluation contract. If neither is available, refer to kernelcad-authoring documentation in the kernelCAD-web repo. INPUT: a single prompt string (up to 8000 characters) describing the part in plain language (e.g. "60x40x5 mounting bracket with two 3mm holes"). Optional partsBudget is informational — quota is debited per successful generation regardless of this value. OUTPUT: { status, kcadSource, evaluationOk, featureCount, diagnostics, title, parameters, suggestions, partial? }. evaluationOk: true means the script parsed and lowered to valid BREP. status: "done" means the script passed the build gates. status: "done_partial" means the run hit its time or token limit (or a provider error) after a script already built: kcadSource is the best script so far and partial says what is unverified — continue by evaluating and refining it. Free-tier accounts: each successful call debits 1 part from the monthly quota; partial results, LLM errors and kernel-evaluator crashes do NOT debit. An identical call made while the same prompt is still generating joins that run instead of starting another. LONG RUNS (MCP): a generation often takes more than 60 s. This call waits at most wait_ms (default 45000, max 50000). If the generation has not finished by then it returns { status: "running", generationId, elapsedMs, stage?, message } instead, and the generation KEEPS RUNNING on the server (it is not cancelled and is billed only if it succeeds). Then call get_generation({ generationId }) — repeat while it returns status "running" — to get exactly the result described above. Do not re-call generate_kcad_from_prompt to check on a run. ON FAILURE: generations that ran but did not validate return a structured failure object — { stage: "llm"|"parse"|"evaluate"|"gates", diagnostics: [{ code?, message, hint?, locus?, margin? }], source: "<last attempted .kcad.ts source or null>", suggestion: "<one-line next action>" }. Failed generations never debit quota. Prefer repairing failure.source against failure.diagnostics over re-prompting from scratch.

get_generation

ChatGPT
Fetch the result of a generate_kcad_from_prompt run that returned { status: "running", generationId }. Waits up to wait_ms (default 45000, max 50000) for the run to finish. When it has finished, returns exactly what generate_kcad_from_prompt returns: { status: "done" | "done_partial", kcadSource, evaluationOk, featureCount, diagnostics, title, parameters, suggestions, partial? }, or the same error (a structured failure for a generation that did not validate, quota, rate limit). When it is still running, returns { status: "running", generationId, elapsedMs, stage?, progress?, message } — call get_generation again with the same generationId. Only the account that started the generation can read it. Results are kept for 30 minutes after the run ends. Reading a result never debits quota.

get_latest_render

ChatGPT
Server-side PNG still by slug — NOT for interactive Studio paint. Prefer open_in_studio (previewDelivered already includes PNG). Use only for a different view, view:"all" contact sheet, or slug-only still. CRITICAL: image is from the MODEL camera, not the user camera.

get_model_mesh

ChatGPT
Return triangle mesh JSON for a project slug — NOT the ChatGPT interactive Studio paint path. For in-chat 3D viewing use open_in_studio (outputTemplate + embed). Prefer open_in_studio.

get_project

ChatGPT
Read-only: fetch by slug (source + meshStatus/meshUrl/embedUrl) or list (no slug). Never shows a viewer. Use open_in_studio(+code) once to publish+paint. Poll here when open_in_studio returned meshStatus=building until meshReady=true. viewerPainted stays false until widget ack. Do NOT call get_model_mesh/get_latest_render for interactive paint.

get_project_revision

ChatGPT
Read immutable release-pinned source for a slug+version from open_in_studio.

get_selection

ChatGPT
Use this when you need to read the human/agent selection in a local Studio session. Returns one clicked face or edge (or null), with mesh-local shapeIndex/kind/id and creating featureId. Use for “this edge”; indices expire on rebuild. featureId is provenance, not the owner of a stable topology ref. Inspect the current shape before authoring a fillet. Requires a running local Studio opened on the same script; hosted sessions are not supported.

import_handoff

ChatGPT
Use this when you need to place parts from a LabWired handoff.json into a KernelCAD assembly. Pass the parsed handoff object using schema labwired-kernelcad-handoff/0.1. The tool validates the handoff and returns an evaluable assembly script with corner-anchored bbox placeholder solids, origin/bbox-face/mounting-hole/pin anchors, endpoint connectivity mates for wires whose two endpoint positions are known, and structured cutout_hints from connector faces. These mates express connectivity intent only; no wire geometry or routing is generated. It does not cut enclosure walls or fetch STEP/GLB assets. position_mm locates the bbox lower corner; bbox.center is derived. Null, estimated, proposed, and other non-exact geometry is reported as warnings and omitted or placed at zero as appropriate.

import_step

ChatGPT
Use this when the user wants to start from their own STEP or STL file (a part they designed elsewhere, a vendor model). Give exactly one source: url (a public https direct-download link), upload (a file the user attached in ChatGPT), or content_base64 (raw bytes, small files only). Max 50 MB. The format is detected from the bytes (or pass format: 'step' | 'stl'). Writes the file and a starter <name>.kcad.ts whose base body is lib.fromSTEP / lib.fromSTL into output_dir (default: a fresh temp dir), evaluates it, and returns { ok, format, model_path, script_path, code, bbox }. Pass script_path as { file } to evaluate_script, add_feature, dfm_review, export and the other tools, or edit code to build on the body. STL is a mesh: booleans, bbox and export work, but faces stay planar facets (use mesh_to_features for an editable feature tree). A non-watertight STL is refused unless allow_open is true.

inspect

ChatGPT
Read model facts. of selects mode (assembly|robot|step|shape|mass|features|assemblies|params|bbox|…). Pass code/file as required by that mode. 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). A file the user attached in this chat is sent in files and used automatically.

list_my_projects

ChatGPT
List the signed-in user's saved kernelCAD projects, most recently updated first. Call this when the user wants to continue, change or reopen an earlier model. Then call get_project({ slug }) for the source, and open_in_studio({ project: slug, code }) to save the change as a new revision of that project. Do not create a new project for a model the user already has.

lookup_api

ChatGPT
Look up kernelCAD API docs by symbol/keyword.

lookup_authoring_skill

ChatGPT
Authoring skill for .kcad scripts. No args: quick-start + section index; then section: "<id>" or query. section: "all" = full ~108k body.

lookup_cookbook

ChatGPT
Look up cookbook recipes for common CAD patterns. After picking an id, prefer execute_cookbook(id, openInStudio) instead of narrating or freehand-pasting.

lookup_diagnostics

ChatGPT
Look up diagnostics/error code explanations.

mesh_boolean

ChatGPT
Use this when the user wants to union, subtract, or intersect two imported triangle mesh solids (STL, OBJ, or 3MF). Supports union, subtract (A minus B) and intersect. Pass each operand as { file } on the MCP server or { data } with base64 mesh bytes; formats are detected or may be specified. Returns volume in mm³, triangle count and a binary STL as data_base64; pass that payload to import_step to continue modeling. Inputs must be closed, consistently oriented 2-manifold meshes. Open, non-manifold, or invalid meshes return an error. This computes mesh geometry and does not create an editable B-rep feature tree.

mesh_summary

ChatGPT
Compact bounds/triangle summary of a project mesh by slug (or code). Fast geometry peek.

mesh_to_features

ChatGPT
Recover feature-ish CAD structure from mesh input. 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). A file the user attached in this chat is sent in files and used automatically.

open_in_studio

ChatGPT
ONLY tool for interactive ChatGPT paint: save/publish + Studio viewer (outputTemplate) in one step. ONE VIEWER PER PROJECT PER RESPONSE: validate with evaluate_script first, then call this exactly once; reuse the returned URL, revision and preview — never call it again after a success in the same response. Unchanged code+project returns the same revision (no new revision). ALWAYS pass code when you have it (avoids no_code_to_reuse); evaluate_script reuse is fallback. Multi-body assemblies: add connectors + mates/joints first (axis+revolute for shafts/hinges/gears; frame+fastened for rigid) or evaluate_script reports mechanism.orphan-part / disconnected components. Articulated closed loops (4-bar) unsupported on v0.6.0 — open chain or fastened-only. Phases: projectSaved / meshReady / previewDelivered set here; viewerPainted is ONLY true after widget model-context/widgetState ack — never claim paint from this tool alone. Waits ~20s for mesh; meshStatus=building+meshUrl is TRANSIENT (poll get_project, which shows no viewer — not a 404 failure; do not re-call open_in_studio). Do NOT call get_model_mesh or get_latest_render for interactive paint. CONTINUE, DO NOT DUPLICATE: pass project:'<slug>' from the last result to add a revision; without it this chat's project is updated. new_project:true only for a separate model. ok=false + meshStatus=failed is a hard mesh failure. MARK & FIX: a user message "Edit kernelCAD project <slug> (revision N): ... Targets: #1 feature "<id>" ..." comes from viewer pins; ids are the script's feature/part names — get_project(slug), change only those features near the given mm points, then open_in_studio with the same project. Hosted: lib.fromSTEP / fromSTL / fromDXF / fromSVG and referenceImage accept "asset:<id>" (from request_upload), an https:// URL or a data: URI as the path. A file the user attached in this chat is sent in files; use "upload:0" (or "upload:<file name>") as the path.

order_part

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

price_part

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

project_curve

ChatGPT
Project a curve onto a face/plane into .kcad source.

query

ChatGPT
Query model/script facts (features, params, bindings).

ray_pick

ChatGPT
Use this when you need the faces a ray hits in a local Studio model, nearest first, with points, distances, and normals. Inputs are model units (mm); direction is normalized. Requires the local Studio URL and session token for the same script, reads the current model generation, and returns a set_selection argument object with every hit. feature_id must identify a displayed terminal shape; intermediates have no current viewer shapeIndex. Intersections use the viewer per-face tessellation, so curved-surface points and normals are mesh approximations.

remove_feature

ChatGPT
Remove a feature from .kcad source by id.

render_preview

ChatGPT
Render deterministic PNG views from code/file for visual self-check (no Studio required). Prefer views:["iso"] while iterating. PNGs return inline as image content + images[].url links; images[].path is server-only.

repair_script

ChatGPT
Attempt automatic repair of broken .kcad source.

request_upload

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

resolve_assumptions

ChatGPT
Resolve authoring assumptions/defaults for a prompt or script.

review_cad

ChatGPT
Review CAD source for issues (style, manufacturability, structure). Pass code/file.

review_paint_peek_latest

ChatGPT
Fetch the latest painted review feedback for a project slug (or signed-in user).

route_wires

ChatGPT
Use this when you need a first-pass orthogonal pin-to-pin wire route estimate and clearance check. Accepts a LabWired handoff or explicit wire positions in millimetres, returns path length and bend count, and reports collisions against part bounding boxes. Wires whose endpoint positions are null are reported as unresolved. Read-only analysis; it does not create or certify a physical harness.

run_fea

ChatGPT
Run a lightweight FEA/load check on the model.

set_param

ChatGPT
Set a script parameter default (number or expression string).

set_scene_return

ChatGPT
Set the scene return/camera framing hint.

set_selection

ChatGPT
Use this when you need to replace the shared local Studio face/edge selection, or clear it with selection:null. The viewer highlights the pick on its next sync (300 ms). Does not edit geometry. Pass model_generation from get_selection. Use indices from the current viewer mesh/get_selection; they expire on rebuild. Requires a local Studio session.

solve_mates

ChatGPT
Solve assembly mates and report status.

solve_sketch

ChatGPT
Solve sketch constraints and return updated geometry.

sweep_tolerance

ChatGPT
Sweep/tolerance analysis helper for fits and clearances.

trace_from_image

ChatGPT
Trace curves/regions from an image into .kcad path/sketch calls. 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). A file the user attached in this chat is sent in files and used automatically.

verify

ChatGPT
Run verification checks on a model (geometry/DFM/constraints/load capacity, incl. FEA). Pass the check set + code/file.

why_did_this_fail

ChatGPT
Explain a failed evaluate/build from diagnostics.

add_assembly_part_source

Claude

add_connector

Claude

add_constraint

Claude

add_feature

Claude

add_hermite_g2

Claude

add_mate

Claude

add_mate_coupling_source

Claude

add_mate_source

Claude

add_nurbs_curve

Claude

add_nurbs_surface

Claude

add_part_connector_source

Claude

add_path_hermite_g2

Claude

add_path_nurbs_segment

Claude

add_path_spline

Claude

add_pattern_feature

Claude

add_sketch_text

Claude

add_surface_from_boundary

Claude

add_transmission_source

Claude

add_variable_sweep

Claude

add_workspace_target_source

Claude

check_load_capacity

Claude

check_mounting_hole_consistency

Claude

check_reachable

Claude

check_swept_collision

Claude

design_loop

Claude

dfm_preflight

Claude

emboss_text

Claude

evaluate_query

Claude

evaluate_script

Claude

evaluate_sdf

Claude

export_model

Claude

flatten_pattern

Claude

generate_kcad_from_prompt

Claude

get_bend_table

Claude

get_edges_of

Claude

get_face_lineage

Claude

get_shape_info

Claude

inspect_assembly

Claude

inspect_robot

Claude

list_api

Claude

list_assemblies

Claude

list_constraints

Claude

list_diagnostic_codes

Claude

list_edges

Claude

list_face_labels

Claude

list_faces

Claude

list_features

Claude

list_mates

Claude

list_topology

Claude

lookup_authoring_skill

Claude

lookup_cookbook

Claude

params_list

Claude

params_update

Claude

project_curve

Claude

remove_feature

Claude

resolve_topo_ref

Claude

review_cad

Claude

review_paint_peek_latest

Claude

set_param_value

Claude

set_scene_return_source

Claude

solve_mates

Claude

solve_sketch

Claude

trace_from_image

Claude

validate_assembly

Claude

validate_urdf

Claude

why_did_this_fail

Claude

Capabilities

WritesInteractive

App Stats

139

Tools

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily