kernelCAD
Server Details
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
- Status
- Healthy
- Uptime
- 98.4% over 77 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- w1ne/kernelCAD-web
- GitHub Stars
- 34
- Server Listing
- kernelCAD
TDQS
Scored across 74 tools
Many tools are clearly scoped, but several clusters overlap enough to force careful reading: evaluate_script/design_loop/execute_cookbook, render_preview/get_latest_render/open_in_studio, verify/review_cad/dfm_review, and export/fab_pack. The very detailed descriptions help disambiguate, but with 74 tools an agent must remember many subtle boundaries between authoring, evaluation, inspection, rendering, and manufacturing workflows.
Most names use snake_case and many follow an add_* or get_* pattern, but the set mixes verb_noun tools (add_part, get_project), noun-only tools (export, inspect, query, verify), and phrase-like names (open_in_studio, drawing_to_cad, mesh_to_features). The conventions are still readable, but they are not predictable enough for a 74-tool surface.
At 74 tools, this is far beyond a well-scoped MCP tool set and sits in the extreme-mismatch band. The server tries to cover modeling, assemblies, mechanics, rendering, DFM, FEA, manufacturing, import/export, and project management in one surface, making tool selection expensive even when individual descriptions are strong.
The surface is unusually broad and covers most CAD lifecycle needs: authoring, assembly/mates, evaluation, inspection, export, manufacturing, rendering, and project persistence. Minor gaps exist around direct generic editing of arbitrary script structure and some lifecycle operations are split across mode-based tools, but agents can generally work around them.
Available Tools
74 toolsadd_connectorAdd ConnectorAIdempotentInspect
Use this when you need to add a mate connector to a part. Durably insert <partBinding>.connector(name, { type, origin, axis?, normal? }) before the final top-level return. Use the part binding returned by add_part. Returns modified source plus diagnostics from re-evaluation. Side-effect-free.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Optional [x, y, z] axis. | |
| code | Yes | The .kcad.ts source code. | |
| name | Yes | Connector name unique within the part. | |
| type | Yes | ||
| normal | No | Optional [x, y, z] normal. | |
| origin | Yes | Origin as [x, y, z] shorthand, or a structured ConnectorOrigin. | |
| part_binding | Yes | JS identifier bound to an AssemblyPartRef, e.g. "basePart". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that the tool is not read-only, is idempotent, and is non-destructive. The description adds useful behavioral detail—durable insertion into source, return of modified source plus re-evaluation diagnostics—but the final claim 'Side-effect-free' sits in tension with 'Durably insert' and readOnlyHint=false, which muddies rather than clarifies the mutation semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the trigger condition and followed by the concrete insertion pattern, prerequisite, and return behavior. The 'Side-effect-free' sentence is questionable enough that it doesn't fully earn its place, keeping this from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with annotations, an output schema, and high schema coverage, this covers the essential call recipe: prerequisite binding, insertion location, and return shape. Missing are edge cases such as duplicate connector names or failure diagnostics, but the definition is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so parameter documentation is already largely handled by the schema. The description only adds the relationship between part_binding and add_part, plus shows the optional axis/normal slots in the API signature; it does not explain connector type semantics or the topology-derived origin forms that the schema describes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('add a mate connector to a part') and even shows the exact API call to insert, so an agent knows precisely what code transformation results. It is distinguishable from siblings like add_part and add_mate because it names add_part only as a prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when you need to add a mate connector'), the required prerequisite ('Use the part binding returned by add_part'), and where the insertion must go ('before the final top-level return'). It does not name any alternative or exclusion case (e.g., add_mate vs. connector), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_constraintAdd ConstraintAIdempotentInspect
Use this when you need to add a sketch constraint to a list. Append one validated sketch constraint to a constraint list. Side-effect-free: pass { constraints, constraint } and receive the updated list.
| Name | Required | Description | Default |
|---|---|---|---|
| constraint | Yes | The constraint to append. | |
| constraints | No | Existing constraint list to append to (omit for an empty list). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says "Side-effect-free," but the annotations declare readOnlyHint=false, meaning the tool may modify its environment. That is a direct conflict in mutation semantics; the rest of the behavioral note (validated constraint, updated list returned) is useful but does not resolve the contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with little waste. The second sentence largely restates the first, which is mild redundancy rather than a major flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the input schema is richly documented, so return values and parameter structure need not be explained. The description covers purpose and basic behavior, but the side-effect claim conflicts with annotations, leaving the agent uncertain about mutation semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema fully documents both parameters, including nested constraint fields and enums. The description merely names the parameters and adds that the constraint is "validated," without adding syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Append one validated sketch constraint to a constraint list." The phrase "sketch constraint" distinguishes it from sibling add_* tools that handle connectors, mates, curves, and features.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Begins with explicit guidance: "Use this when you need to add a sketch constraint to a list." It gives clear context for use but does not name exclusions or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_curveAdd CurveAIdempotentInspect
Use this when you need a freeform/organic 3D curve — a body feature line, brow, spine rail, or G2 blend between panels — authored as a Curve3D into the user's .kcad.ts immediately before the last top-level return. One authoring path, selected by kind:
'nurbs' — insert a
nurbsCurve(controlPoints, opts?)declaration. PasscontrolPointsas a Vec3[] (mm, at least 2 points). Optional NURBS knobs:degree(default 3), rationalweights, explicitknots,closed.'hermite' — insert a
hermiteG2(a, b)declaration: a quintic Hermite curve interpolating two endpoints with matching positions, tangents, and (optional) curvatures — bridges two curves with G2 continuity. Each endpoint is{ point: Vec3, tangent: Vec3, curvature?: Vec3 }in mm; tangent magnitude ~ chord length; curvature defaults to [0,0,0] (G1-only). The returned binding has type Curve3D (peer to Shape / Surface) — consume it viaadd_variable_sweep(spine input),add_surface({ kind: 'boundary' })(boundary curve), or downstream Curve3D-accepting features. Returns the modified code + diagnostics from re-evaluating. Side-effect-free. Each kind fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | kind:'hermite' — start endpoint. | |
| b | No | kind:'hermite' — end endpoint. | |
| code | Yes | The .kcad.ts source code. | |
| kind | Yes | Which curve-construction path to use. | |
| knots | No | kind:'nurbs' — optional explicit knot vector; missing => clamped-uniform inferred. | |
| closed | No | kind:'nurbs' — optional periodic/closed-curve flag. | |
| degree | No | kind:'nurbs' — curve degree; default 3 (cubic). | |
| weights | No | kind:'nurbs' — optional rational weights, one per control point (same length as controlPoints). | |
| binding_name | No | JS const name for the new Curve3D binding (default: _curve_<N>). | |
| controlPoints | No | kind:'nurbs' — control points as Vec3 triples in mm; at least 2 entries. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that it inserts a declaration at a specific point in existing source, returns the modified code plus diagnostics from re-evaluation, and that each kind fails closed on missing params. Minor caveat: 'Side-effect-free' sits in mild tension with readOnlyHint=false, though it plausibly means no persistent model mutation beyond the returned code. Idempotent/non-destructive hints are consistent with the text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the use case and insertion behavior, then a clean per-kind bullet breakdown. Some sentences restate schema-documented defaults (degree, weights, knots, closed), which is mild duplication rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-path, 10-parameter authoring tool operating on source code, the description covers both construction kinds, required inputs, the binding/return type, failure behavior, and downstream consumers. An output schema exists, so the brief mention of returns is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, so credit goes to genuinely additive guidance: tangent magnitude should approximate chord length, curvature defaults to [0,0,0] giving G1-only, controlPoints are mm Vec3 triples with a minimum of 2, and knots default to clamped-uniform. Only 'code' and 'binding_name' are left to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('add a freeform/organic 3D curve authored as a Curve3D into the .kcad.ts') with concrete use cases (feature line, brow, spine rail, G2 blend). It also establishes insertion location ('immediately before the last top-level return') and the return type (Curve3D, peer to Shape/Surface), which separates it from add_path_segment, add_surface, and project_curve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the triggering need ('when you need a freeform/organic 3D curve') and routes downstream consumption to add_variable_sweep and add_surface boundary. It does not, however, say when to prefer siblings such as add_path_segment or project_curve instead, so the negative cases are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_featureAdd FeatureAIdempotentInspect
Use this when you need to insert a new feature line into a script. Insert a new feature line into a kernelCAD script before the last top-level return statement. Returns the modified code as text plus diagnostics from re-evaluating the result. Side-effect-free. Primitives that accept faceLabels (box, cylinder, extrudeRect, extrudeCircle, extrudePolygon, extrudeRoundedRect) can receive opts.faceLabels in the inserted code — use lookup_api to see featureKindFaceLabels for the full value schema.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| feature_code | Yes | Single-statement source line to insert (e.g. `const hole = cylinder(5, 2).translate(10, 10, -1);`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: it declares the tool is side-effect-free and returns modified code as text plus diagnostics from re-evaluation, which explains what the caller actually gets back. There is mild tension between 'side-effect-free' and readOnlyHint=false, but the surrounding text ('returns the modified code as text') resolves it as a non-writing transform, not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger condition is front-loaded and every sentence carries usable information—insertion location, return content, safety, and the faceLabels pointer. The faceLabels sentence is dense and slightly tacked-on, but it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with an output schema, so return values need not be spelled out, yet the description still summarizes them. The main gap is failure behavior: it never says what happens when the script has no top-level return statement or an insertion would be invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds meaning: feature_code must be a single statement, and inserted code may carry opts.faceLabels for the enumerated primitives, with lookup_api named as the source for the full value schema. That is genuine semantics the schema text does not supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (insert a new feature line) and pins the exact insertion point: before the last top-level return statement in a kernelCAD script. That level of specificity distinguishes it from sibling mutation tools like add_part, add_curve, or remove_feature without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use this when you need to insert a new feature line into a script') and routes the agent to lookup_api for the faceLabels value schema. It does not state when to prefer a sibling instead (e.g., add_pattern_feature, add_constraint, or rewriting via evaluate_script), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_mateAdd MateAIdempotentInspect
Use this when you need to author a mate-graph relationship into the source, selected by relation (default 'mate'):
'mate' — a typed mate between two connectors ({ name, a, b, type, pose?, limitsDeg?, limitsMm? }).
'coupling' — couple a driven mate to a source mate by ratio ({ driven, source, ratio, offset? }).
'transmission' — a physical drive path across mates ({ name, kind, sourceMate, drivenMates, path, ... }). All durably edit source and need { code, assembly_binding }. Params other than
relationare forwarded verbatim; each relation fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | relation:'mate' — connector ref "<partName>.<connectorName>". | |
| b | No | relation:'mate' — connector ref "<partName>.<connectorName>". | |
| code | Yes | The .kcad.ts source code. | |
| kind | No | relation:'transmission' — transmission kind. | |
| name | No | relation:'mate'|'transmission' — name unique within the assembly. | |
| path | No | relation:'transmission' — drive path. | |
| pose | No | relation:'mate' — optional mate pose. | |
| type | No | relation:'mate' — mate type. | |
| input | No | relation:'transmission' — optional input. | |
| notes | No | relation:'transmission' — optional notes. | |
| ratio | No | relation:'coupling' — driven pose = source pose * ratio + offset. | |
| driven | No | relation:'coupling' — driven mate name. | |
| offset | No | relation:'coupling' — optional pose offset. | |
| output | No | relation:'transmission' — optional output. | |
| source | No | relation:'coupling' — source mate name. | |
| actuator | No | relation:'transmission' — optional actuator. | |
| limitsMm | No | relation:'mate' — optional [minMm, maxMm]. | |
| relation | No | Which relationship to author (default 'mate'). | |
| limitsDeg | No | relation:'mate' — optional [minDeg, maxDeg]. | |
| sourceMate | No | relation:'transmission' — source mate name. | |
| drivenMates | No | relation:'transmission' — driven mate names. | |
| assembly_binding | Yes | JS identifier bound to assembly(...). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the mutation profile is covered. The description adds genuinely new context: every call durably edits source, requires code and assembly_binding, and each relation fails closed on its own missing params — behavior an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded usage sentence followed by a tight bulleted breakdown and one closing constraint sentence. A few required-field names are repeated verbatim from the schema, but the structure is efficient and scannable for a 22-param tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly branched tool with 22 params and an if/then schema, the description conveys the discriminating information — which relation to pick, what each minimally needs, that code and assembly_binding are always required, and that edits are durable. Return values are covered by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds value by compactly restating the minimal required payload per relation and noting that 'relation' defaults to 'mate' and that all other params are forwarded verbatim, which tells the agent the wrapper is not validating relation-specific fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — authoring a mate-graph relationship into the source — and decomposes it into three named relation variants with their payloads. It does not explicitly differentiate itself from siblings such as solve_mates or add_constraint, so an agent must infer that this creates relationships rather than solving them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need to author a mate-graph relationship into the source" gives an implied trigger, and the three bullets help pick a relation. There is no explicit when-not guidance or pointer to the natural follow-up (solve_mates) or to alternatives for constraint/workflow authoring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_partAdd PartAIdempotentInspect
Use this when you need to add a part to an assembly. Durably insert const <binding> = <assembly>.part(partName, shapeExpression, opts?) before the final top-level return in a kernelCAD source string. Returns modified source plus diagnostics from re-evaluating it. Side-effect-free: caller persists the returned source.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Optional [x, y, z] assembly placement. | |
| code | Yes | The .kcad.ts source code. | |
| part_name | Yes | Assembly-unique part name. | |
| binding_name | No | Optional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier. | |
| assembly_binding | Yes | JS identifier bound to assembly(...), e.g. "arm". | |
| shape_expression | Yes | JS expression for the Shape to pass to assembly.part, inserted verbatim. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: where the code is inserted, that the operation is side-effect-free, that the caller must persist the returned source, and that diagnostics come from re-evaluating. One gap remains: annotations claim idempotentHint=true, but the description never explains how a repeated insert avoids duplicating the const binding, leaving that trait unverified by the text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the triggering condition, then the precise edit, then side-effect/return behavior — a sensible order. The first sentence is slightly redundant with the tool name, but the remaining content is dense and earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity source-transformation tool, everything needed to call it correctly is present: insertion location, immutability contract, persistence responsibility, and what comes back. With an output schema covering return shape, the description need not detail diagnostics structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description earns an extra point by mapping parameters into the emitted template (`partName`, `shapeExpression`, `opts?`=the `at` placement) and clarifying that the shape expression is inserted verbatim. It still doesn't explain the defaulting behavior of binding_name, but the schema already documents that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('add a part to an assembly') and then pins the exact resource-level effect: inserting a `const <binding> = <assembly>.part(...)` line before the final top-level return. An agent can tell this apart from add_feature/add_mate/add_connector by the code-transformation framing, even without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to add a part to an assembly' gives a clear triggering condition, and the insertion-point detail further constrains legitimate use. It stops short of naming alternatives or exclusions (e.g. vs add_feature or add_mate), so it is clear context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_path_segmentAdd Path SegmentAIdempotentInspect
Use this when you need a freeform/organic 2D outline — an eyewear brow, ergonomic grip, sneaker midsole, or body silhouette — by appending a curved segment to an existing PathBuilder chain on the named chain_anchor variable. The call is injected at the END of the chain, immediately before any .close(). One segment kind, selected by kind:
'spline' —
.spline(points, opts?): interpolates through everypointswaypoint (Vec2[] mm, >= 2 entries; points[0] must match current pen position). Optionaltension, andstartTangent/endTangent2D direction vectors that constrain the first-derivative direction at the endpoints (magnitude normalised internally). Use for organic 2D outlines (eyewear brow, ergonomic handle, sneaker midsole).'nurbs' —
.nurbsSegment(controlPoints, opts?): explicit B-spline net (Vec2[] mm, >= degree+1 entries; controlPoints[0] must match pen; pen ends at controlPoints[N-1]). Optionaldegree(default 3), rationalweights(strictly positive), explicitknots(length = controlPoints.length + degree + 1).'hermite' —
.hermiteG2(a, b): each endpoint{ point: Vec2, tangent: Vec2, curvature?: Vec2 }in mm (a.point must match pen; pen ends at b.point).curvaturedefaults to [0,0] (G1); pass matching curvatures for G2 blends. Tangent magnitude is the first derivative (~ chord length), NOT unit length. Returns the modified code + diagnostics from re-evaluating. Side-effect-free. Each kind fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | kind:'hermite' — start endpoint; point must match current pen position within 1e-6 mm. | |
| b | No | kind:'hermite' — end endpoint; pen ends at b.point. | |
| code | Yes | The .kcad.ts source code. | |
| kind | Yes | Which path-segment kind to append. | |
| knots | No | kind:'nurbs' — optional explicit knot vector; length must equal controlPoints.length + degree + 1. | |
| degree | No | kind:'nurbs' — B-spline degree (default 3). | |
| points | No | kind:'spline' — waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position. | |
| tension | No | kind:'spline' — optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation. | |
| weights | No | kind:'nurbs' — optional rational weights (one per control point; strictly positive). | |
| endTangent | No | kind:'spline' — optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters. | |
| binding_name | No | Reserved for future use; the segment injection mutates the chain anchor in place. | |
| chain_anchor | Yes | JS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`). | |
| startTangent | No | kind:'spline' — optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters. | |
| controlPoints | No | kind:'nurbs' — control-net vertices as Vec2 pairs in mm; at least degree+1 entries. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare `readOnlyHint: false`, but the description explicitly says the tool is 'Side-effect-free' and only 'Returns the modified code + diagnostics.' That is a direct contradiction of the read-only annotation. Although the description also usefully discloses injection location, fail-closed behavior, and per-kind requirements, the contradiction dominates this dimension.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is dense but appropriately sized for a 14-parameter tool with three conditional variants. It front-loads the main use case and organizes kind-specific details in a bullet list, though some material overlaps with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, conditional schema, annotations, and existing output schema, the description covers what an agent needs: when to use it, where the segment is injected, how each kind works, return behavior, side-effect claim, and fail-closed handling. No essential call-time context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries the baseline parameter documentation. The description adds useful conceptual semantics beyond the schema, such as spline interpolation through every waypoint, NURBS as an explicit B-spline net, and Hermite G1 vs G2 tangent/curvature behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and target: appending a curved segment to an existing PathBuilder chain via `chain_anchor`, with three segment kinds. It is clear enough to distinguish from unrelated tools, but does not explicitly differentiate itself from sibling curve/connector tools such as `add_curve` or `add_connector`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context, including use cases like eyewear brows, ergonomic grips, sneaker midsoles, and body silhouettes, plus the structural condition of appending before `.close()`. It does not state when not to use it or name sibling alternatives, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pattern_featureAdd Pattern FeatureAIdempotentInspect
Use this when you need to repeat a feature in a pattern. Insert a Shape.patternLinear / .patternCircular / .patternGrid call into a kernelCAD script before the last top-level return. Pass structured args (kind + the matching spec object). Returns the modified code plus diagnostics from re-evaluating. Side-effect-free. The pattern feature is a single editable unit; pattern-instance face refs resolve via <sourceId>_pattern_<i> on the pattern feature's lineage. Geometric note: pattern is implemented as cumulative boolean union of transformed source copies — additive features (boxes, ribs, fins, spokes) pattern cleanly; patterning a subtractive feature (hole, cutout) only preserves the per-instance void when adjacent bodies are disjoint.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| grid | No | Required when kind=grid. | |
| kind | Yes | ||
| linear | No | Required when kind=linear. | |
| target | Yes | Variable name of the Shape to pattern (inserted verbatim as the LHS receiver). | |
| circular | No | Required when kind=circular. | |
| assign_to | No | Optional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: declares the re-evaluation diagnostics returned, the single-editable-unit semantics, the `<sourceId>_pattern_<i>` face-ref naming convention, and — most valuably — that pattern is a cumulative boolean union, so subtractive features only pattern cleanly across disjoint bodies. 'Side-effect-free' is consistent with a tool that rewrites caller-supplied code rather than project state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the when-to-use clause and then packed with genuinely load-bearing detail; no filler sentences. The geometric caveat is long and dense but earns its space because it changes whether the call will produce correct geometry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter nested-object tool with an output schema, the description covers the parts structured fields cannot: the placement constraint, the discriminator pairing, the returned diagnostics, and the geometric limitation on subtractive patterning. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86% and the if/then discriminators are machine-readable, but the description adds the human-level rule "Pass structured args (kind + the matching spec object)" that tells the agent how kind selects linear/circular/grid. It does not elaborate on count/spacing ranges or the optional angleDeg default, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (insert a Shape.patternLinear/.patternCircular/.patternGrid call into a kernelCAD script) and scopes it precisely relative to the broader add_feature sibling. The three pattern kinds and the required insertion point (before the last top-level return) make the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need to repeat a feature in a pattern" gives a clear triggering condition, and it adds the mechanical precondition of inserting before the last top-level return. It never explicitly rules out alternatives such as add_feature or flatten_pattern, so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_surfaceAdd SurfaceAIdempotentInspect
Use this when you need an organic, freeform, or swept shape — a body shell, panel, fairing, ergonomic curve, lens, or sculpted form — authored as a NURBS Surface into the user's .kcad.ts, OR when you need to finish surfaces into a watertight solid or taper faces for moldability. One authoring/finishing path, selected by kind:
'nurbs' — insert a nurbsSurface(...) / surfaceFromCurves(...) call. Pass either { controls, degree, weights?, knots?, periodic? } for direct construction, OR { section_sketch_ids } for skinning. Weights are honored: supply rational weights to build exact circles/cylinders/spheres/conics (the surface becomes rational); omit weights for a non-rational surface.
'boundary' — insert a surfaceFromBoundary([c1,c2,c3,c4], opts?) call: one NURBS face through 4 boundary Curve3D refs (bottom, right, top, left in loop order; adjacent endpoints must coincide within 1e-6 mm).
'trim' — insert a
<surface>.trimTo(<by>)or<surface>.split(<by>)call. Passsurface_binding(the Surface variable name),by_binding(the cutter Surface variable name; Shape/Curve3D cutters are deferred to a later slice), andop: 'trim'(keep the largest imprinted piece) orop: '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. Passsurface_bindings(array of Surface variable names). Use after trim/boundary to close patches into a solid: trim → sew → solid pipeline. Optionaltolerance(mm, default 1e-6) andrequire_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. Passshape_binding,angle_deg(0–90), andface(canonical name, label, or FaceQuery descriptor). Lowering emits feature.draft.failed on invalid geometry. The returned Surface produces no Shape until you chain .thicken(t) or .toShape() (do that via add_feature on the binding name). Returns the modified code + diagnostics. Each kind fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()). | |
| code | Yes | Current .kcad.ts source. | |
| face | No | kind:'draft' — face selector for the face(s) to taper. Accepts a canonical name (top/bottom/front/back/left/right), a user label declared via faceLabels, or a FaceQuery descriptor string. | |
| kind | Yes | Which surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'. | |
| knots | No | kind:'nurbs' — optional explicit knot vectors; missing => clamped uniform inferred. | |
| degree | No | kind:'nurbs' — degrees in U and V; each in [1, nU-1] / [1, nV-1]. | |
| weights | No | kind:'nurbs' — optional rational weights, same grid shape as controls. Ignored in slice-1. | |
| controls | No | kind:'nurbs' — control-point grid for direct construction (controls[u][v] = [x, y, z], mm). | |
| periodic | No | kind:'nurbs' — optional periodic flags per parametric direction. | |
| pull_dir | No | kind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time. | |
| sampling | No | kind:'boundary' — points sampled along each boundary (default 15). | |
| angle_deg | No | kind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction. | |
| tolerance | No | kind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged. | |
| by_binding | No | kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred. | |
| continuity | No | kind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge, bottom/right/top/left order). Default 'C0'. | |
| binding_name | No | JS const name for the new binding (kind:'nurbs' default surface_<N>; kind:'boundary' default _surface_<N>; kind:'trim' default _trimmed_<N>; kind:'sew' default _sewn_<N>; kind:'draft' default _drafted_<N>). | |
| neutral_plane | No | kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted. | |
| shape_binding | No | kind:'draft' — JS variable name of the Shape to taper (must be declared in source). | |
| curve_bindings | No | kind:'boundary' — tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source. | |
| require_closed | No | kind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid. | |
| surface_binding | No | kind:'trim' — JS variable name of the Surface to trim/split (must be declared in source). | |
| surface_bindings | No | kind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source). | |
| section_sketch_ids | No | kind:'nurbs' — existing sketch FeatureIds (2 or more) to skin a surface through, in order. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds real behavioral context: each kind fails closed on missing params, specific diagnostic codes are emitted (feature.surface-sew.open-shell, feature.draft.failed), and a Surface yields no Shape until chained. However, it asserts 'Weights are honored: supply rational weights to build exact circles/cylinders/spheres' while the schema for the same field says 'Ignored in slice-1' — a direct contradiction that could mislead an agent into expecting rational geometry it will not get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but for 23 parameters and five distinct sub-APIs the content is load-bearing, and the trigger condition plus the kind list is front-loaded. Some per-kind prose duplicates the schema's own parameter descriptions (e.g. tolerance defaults, angle range), which costs a point but not more.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 23 params, nested objects, and an output schema present, the description covers what an agent needs: what each kind emits, ordering constraints, failure modes, defaults, and the fact that the result is not a solid until chained. The remaining gap is the unresolved weights/slice-1 conflict, which leaves ambiguous whether rational input is actually consumed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining intent per kind — e.g. that 4 boundary curves are in bottom/right/top/left loop order with endpoints coinciding within 1e-6 mm, and that knots are optional and clamped-uniform when omitted. A small deduction for the same weights contradiction and for the 'trim' gloss ('keep the largest imprinted piece') drifting from the schema's 'discards the smaller half'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (author a NURBS Surface) and resource, then enumerates every path ('nurbs', 'boundary', 'trim', 'sew', 'draft') with the exact API call each emits. An agent can distinguish this from add_curve or apply_surface_blend without opening the schema, because the opening sentence scopes it to freeform/swept surface authoring and surface finishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('organic, freeform, or swept shape — a body shell, panel, fairing...'), how the paths compose ('trim → sew → solid pipeline'), and explicitly routes post-authoring work elsewhere ('chain .thicken(t) or .toShape() ... do that via add_feature on the binding name'). The usage guidance is explicit, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_textAdd TextAIdempotentInspect
Use this when you need to author text into a kernelCAD script before the last top-level return. One authoring path, selected by mode:
'sketch' — insert a sketch.text(...) call. The emitted sketch is chainable: pair with subsequent .extrude(...) / cut(...) edits to land an engraved or raised text feature.
'emboss' — insert a
<shape>.embossText({...})chained call onto an existing Shapetarget. Use for engraved brand text on faces (Ray-Ban temple, CE mark, model number).depth > 0raises text out of the face;depth < 0engraves text into the face. Lowers via replicad drawText → sketchOnFace → extrude → fuse|cut. Default font is the runtime-bundled Liberation Sans. Side-effect-free; returns the modified code plus diagnostics from re-evaluating. Each mode fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| face | No | mode:'emboss' — target face — canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label. | |
| font | No | mode:'sketch' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans. | |
| mode | Yes | Which text-authoring path to use. | |
| size | No | mode:'sketch'|'emboss' — glyph cap height in mm (positive finite). | |
| align | No | mode:'sketch' — horizontal alignment relative to position (default left); mode:'emboss' — relative to the UV anchor (default center). | |
| depth | No | mode:'emboss' — signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero. | |
| bindAs | No | mode:'sketch' — emits `const <bindAs> = sketch.text(...)`; mode:'emboss' — emits `const <bindAs> = <target>.embossText(...);`. | |
| target | No | mode:'emboss' — variable name of the Shape to chain onto (inserted verbatim). | |
| anchorU | No | mode:'emboss' — U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5. | |
| anchorV | No | mode:'emboss' — V anchor in [0, 1] face-local. Default 0.5. | |
| content | No | mode:'sketch' — text content (UTF-8, non-empty, non-whitespace). | |
| position | No | mode:'sketch' — [x, y] anchor in mm. Default [0, 0]. | |
| rotation | No | mode:'sketch' — CCW rotation in degrees around position (default 0); mode:'emboss' — CCW rotation in the face tangent plane (default 0). | |
| scaleMode | No | mode:'emboss' — Drawing.sketchOnFace scaling mode. Default original. | |
| fontFamily | No | mode:'emboss' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans. | |
| textContent | No | mode:'emboss' — text content (UTF-8, non-empty, non-whitespace). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/idempotency/safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds real value beyond that: it discloses the drawText→sketchOnFace→extrude→fuse|cut pipeline, that it returns modified code plus diagnostics, and that each mode fails closed on missing params.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the when-to-use trigger and then a clean per-mode breakdown. The detail is dense but each clause earns its place; slightly long for the payload, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool the description covers the critical complexity: mode selection, mode-specific behavior, defaults, failure behavior, and pipeline. With 100% schema coverage and an output schema present, return-value details need not be repeated, and the description is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds genuinely useful mode-conditional semantics — clarifying which parameters belong to 'sketch' vs 'emboss' and the meaning of depth sign. This helps an agent select correct parameters beyond the per-param schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('author text into a kernelCAD script') and immediately disambiguates the two authoring paths ('sketch' vs 'emboss') with concrete examples (Ray-Ban temple, CE mark). An agent can tell exactly what this tool produces and how it differs from other add_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear triggering context ('Use this when you need to author text... before the last top-level return') and explains which mode to pick for which scenario (chainable sketched text vs. engraved/embossed text on an existing face). It stops short of naming specific sibling tools to avoid, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_variable_sweepAdd Variable SweepAIdempotentInspect
Use this when you need an organic swept solid whose cross-section changes along its length — a tapering body, horn, bottle, handle, ring band, fairing, or duct — authored as a variable-section sweep along a spine. Inserts variableSweep(spine, sections, opts?) into the .kcad.ts code immediately before the last top-level return (an empty code starts a new script that returns the sweep). Spine: EITHER spine_points ([[x,y,z], ...] in mm, interpolated with spline3d; spine_closed: true closes the loop for a ring) OR spine_binding (an existing Curve3D / Sketch / Vec3[] variable). Each section: t in [0, 1] plus a profile — inline radius (circle) or width + height (rectangle), or profile_binding (an existing Sketch); profiles are centred on the spine and turned to face along it. Sections are strictly increasing in t, first t=0, last t=1 (omit t on every section to space them evenly). On a closed spine t=1 is the seam and reuses the t=0 profile. Example: { code, spine_points: [[0,0,0],[0,10,30],[0,0,60]], sections: [{ t: 0, radius: 8 }, { t: 0.5, radius: 10 }, { t: 1, radius: 4 }] }. Returns the modified code, diagnostics from re-evaluating it, and sweep { volumeMm3, bbox } measured from the built solid (ok:false when the sweep built nothing). The result is a Shape binding: return it, or chain .union(...) etc. via add_feature. Orientation is not exposed by this MCP tool until runtime orientation support is wired. Side-effect-free.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code ("" for a new script). | |
| closed | No | Optional closed-sweep flag. | |
| sections | Yes | Varying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1. | |
| continuity | No | Inter-section continuity; default 'C1'. | |
| binding_name | No | JS const name for the new Shape binding (default: _sweep_<N>). | |
| spine_closed | No | With spine_points: close the spline into a loop (ring band, loop handle). | |
| spine_points | No | Inline spine: at least 2 [x, y, z] points in mm, interpolated with spline3d. Use this OR spine_binding. | |
| spine_binding | No | Existing variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source. Use this OR spine_points. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the exact insertion point in `.kcad.ts` code, behavior for empty `code`, return contents including diagnostics and `sweep` measurements, `ok:false` when nothing is built, and that the result is a Shape binding. It also explicitly notes the current orientation limitation and says the operation is side-effect-free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the use case and then proceeds through spine, section, example, and return behavior in a logical order. It is dense but appropriately sized for a complex eight-parameter tool, though the long first sentence and packed clauses make it slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the eight parameters, mutation semantics, output schema, and geometry complexity, the description covers the insertion behavior, spine and section rules, result binding semantics, failure signal, and orientation limitation. It is complete enough for an agent to invoke the tool correctly without opening additional docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaningful semantics beyond the schema: `spine_points` are interpolated with `spline3d`, `spine_closed` forms a loop, sections are strictly increasing in `t` with first 0 and last 1, and profiles are centered on the spine and turned to face along it. It also explains that omitting `t` spaces sections evenly and that `t=1` on a closed spine reuses the `t=0` profile.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: insert `variableSweep(spine, sections, opts?)` to create an organic swept solid whose cross-section changes along a length. It distinguishes the operation from generic curves/surfaces by emphasizing variable-section sweeps along a spine and naming concrete use cases such as tapering bodies, horns, and ducts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition: use this when the desired solid is a variable-section sweep. It also explains how the result can be chained via `add_feature`, but it does not explicitly name when-not-to-use alternatives or sibling tools for constant-section sweeps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_workspace_targetAdd Workspace TargetAIdempotentInspect
Use this when you need to declare a reachability target for a connector. Durably insert <assembly>.workspace(connectorRef, { reachable, toleranceMm? }) before the final top-level return. Workspace targets are checked by solvedModel validation/review pose-envelope gates. Returns modified source plus diagnostics from re-evaluation.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| reachable | Yes | World-frame Vec3 targets the connector must be able to reach. | |
| toleranceMm | No | Optional non-negative tolerance in mm. | |
| connector_ref | Yes | Connector ref "<partName>.<connectorName>". | |
| assembly_binding | Yes | JS identifier bound to assembly(...). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the insertion is durable, placed before the final top-level return, and that workspace targets are checked by solvedModel validation/review pose-envelope gates. It also says the tool returns modified source plus re-evaluation diagnostics, which is substantial behavioral context for a source-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage condition, then gives the exact insertion form, validation behavior, and return behavior. Every sentence carries operational information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, annotations covering safety and idempotency, and an output schema, the description supplies the remaining critical context: why to use it, where the code is inserted, what validates it, and what comes back. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds value by showing how the parameters compose into the emitted call (`<assembly>.workspace(connectorRef, { reachable, toleranceMm? })`), clarifying the relationship between `assembly_binding`, `connector_ref`, `reachable`, and optional `toleranceMm`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: declaring a reachability target for a connector by inserting a workspace call. It also gives the exact target syntax, so an agent knows precisely what operation this performs and how it differs from generic constraint or feature additions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this when you need to declare a reachability target for a connector,' which gives clear triggering context. It does not name when-not conditions or alternatives, but there is no obvious sibling tool for this specific workspace-target operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_surface_blendApply Fillet or Chamfer BlendAIdempotentInspect
Use this when you need to author and evaluate a fillet or chamfer on a kernelCAD Shape. Inserts Shape.fillet(radius, selector, { continuity: G1|G2 }) or Shape.chamfer(distance, selector) through the existing public API and returns the patched source plus evaluation diagnostics. Selectors accept EdgeSelector syntax, including canonical edge refs/query strings or { face: canonical name, face label, or face query }. G2 continuity applies to fillets; chamfer uses the existing chamfer API. This authors the operation and does not extract blend-surface NURBS poles; that still requires kernel surface extraction.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Inline .kcad.ts source. | |
| radius | No | Fillet radius in mm; required for operation:'fillet'. | |
| distance | No | Chamfer distance in mm; required for operation:'chamfer'. | |
| selector | No | Optional EdgeSelector: a canonical @kc[...] edge ref/query string or { face: canonical face name, face label, or FaceQuery descriptor }. Omit to select all sharp edges. | |
| operation | No | Operation; defaults to 'fillet'. | |
| continuity | No | Fillet continuity passed to the existing public API; defaults to G1. Chamfer ignores this field. | |
| shape_binding | Yes | Existing Shape variable name to blend. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds meaningful context: it authors via the public API, returns patched source plus evaluation diagnostics, and scopes itself out of pole extraction. It doesn't mention failure modes (invalid radius, unresolvable selector) or what happens if the blend cannot be evaluated, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the when-to-use condition, and each sentence carries distinct information (purpose, mechanism/return, selector forms, out-of-scope). The API-signature sentence is slightly dense but earns its place by mapping parameters to the emitted call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, rich annotations and an output schema, the description covers purpose, mechanism, selector semantics, and scope boundaries, so an agent can invoke it correctly. Missing only error/edge-case behavior (unresolvable selector, blend failure) which would matter for a mutation tool that patches source.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value by showing the underlying call form Shape.fillet(radius, selector, { continuity }) / Shape.chamfer(distance, selector), which clarifies how radius/distance/selector/continuity pair up. It also spells out the EdgeSelector forms (canonical refs/query strings vs { face: ... }) and that G2 applies only to fillets — though much of this repeats schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: authoring (inserting) a fillet or chamfer blend on a kernelCAD Shape via the existing public API. It also explicitly disambiguates from the neighboring NURBS-extraction capability by saying it does not extract blend-surface poles, so an agent can tell it apart from inspect_nurbs-style siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to author and evaluate a fillet or chamfer' gives a clear triggering condition, and the closing sentence gives an explicit when-not with the alternative described ('kernel surface extraction'). It stops short of naming the concrete sibling tool for extraction, so an agent must infer the handoff, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blockout_assemblyBlock Out Assembly from Parts ListAIdempotentInspect
Use this when you have a list of parts with bounding boxes and positions (from a layout, spreadsheet, another tool or a sketch) and need an evaluable placeholder assembly script. Pass parts as { name, bboxMm:[x,y,z], positionMm:[x,y,z], rotationDeg?, anchors? } in mm; positionMm locates the bbox lower corner and anchors are named points in assembly coordinates. Optional connections [{ from, to }] reference anchors as "part.anchor" (including built-ins origin, bbox_center, bbox_x_min..bbox_z_max) and become fastened mates that express connectivity intent only; no wire or route geometry is generated. Returns the script (corner-anchored box solids with named connectors) plus warnings. It reads no files and cuts nothing; refine the solids with add_part/add_feature afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Assembly name, default "blockout". | |
| parts | Yes | ||
| connections | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that it reads no files, cuts nothing, generates no wire or route geometry, that connections are intent-only fastened mates, and that output is a script plus warnings. These constraints (idempotentHint/destructiveHint already cover safety) are exactly the behavioral context an agent needs before trusting the result as a placeholder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Densely packed but front-loaded with the 'Use this when' trigger, then data shape, then connections, then return/limitations. Every clause carries information, though the single paragraph is heavy enough that a reader must parse carefully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the input shape, the units (mm), coordinate conventions, connection semantics, side effects (none), and even summarizes the return despite a full output schema existing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 33% schema coverage, the description compensates fully: it spells out the parts object shape, that positionMm locates the bbox lower corner in assembly coordinates, what anchors are, and that connections reference 'part.anchor' including built-in anchors (origin, bbox_center, bbox_x_min..bbox_z_max). That built-in anchor vocabulary is information available nowhere else.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('need an evaluable placeholder assembly script' from a parts list with bounding boxes and positions) and clearly distinguishes itself from refinement siblings by naming add_part/add_feature as the follow-up path. An agent can tell this is the batch blockout generator, not a single-part authoring tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you have a list of parts with bounding boxes and positions (from a layout, spreadsheet, another tool or a sketch)' gives an explicit trigger condition and even names typical upstream sources. It also routes onward to add_part/add_feature for refinement, though it doesn't state an explicit when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_animationCapture AnimationAInspect
Use this when you need to render a script's animation timeline to a video, or a 360° turntable of a model for sharing. Capture a kernelCAD script's animationView({...}) timeline to an MP4 (ffmpeg) or a PNG frame sequence, verifying the sampled poses for part interference. FILE ONLY: pass { file } (a .kcad.ts path) — there is no { code } mode, because the capture engine renders from a file on disk (its relative lib.fromSTEP imports resolve against the script directory). MP4 by default; pass { frames_dir } to write frame-0000.png... and skip ffmpeg entirely (mutually exclusive with output_path). Animation-pose interference verification runs by default (keyframe times + segment midpoints) BEFORE any browser/ffmpeg cost; { no_verify: true } skips it and { verify_every: n } additionally samples every n-th frame time. Pass { focus } or { hide } (arrays of feature ids or assembly part names, mutually exclusive) to isolate parts in the rendered frames — same semantics as kernelcad render --focus/--hide; visibility is render-only and does NOT affect the pose verification. Collisions DO NOT fail the call — the artifact is still written as evidence with ok: true; read verified: false + the collisions[] array. TURNTABLE MODE: pass { turntable: true } for a seamless 360° orbit of the model (no animationView record needed) — a share-ready loop for a README, social post or product page. It uses the 'publish' studio look by default (same as render_preview preset: 'publish': key/fill/rim lights, soft contact shadow, clean backdrop, 30° lens, constant auto-framing over the whole orbit, light rig turns with the camera); { preset: 'default' } keeps the engineering look. Knobs: width/height (default 1080×1080, max 2048, even for MP4), duration_ms (one revolution, default 6000), fps (default 30), elevation_deg (default 22), background ('white' default, 'light', 'dark', 'black', '#rrggbb', or 'transparent' with frames_dir only), shadow (default true), environment. output_path ending in .gif writes a looping GIF; otherwise MP4. Frame i sits at az 30° + 360°·i/N (the 360° endpoint is excluded, so the loop is seamless). A turntable has no poses to verify: it reports verify_skipped: true. ENVIRONMENT: needs playwright chromium (npx playwright install chromium) and ffmpeg for MP4/GIF (frames_dir needs neither); the bundled static player is served automatically, no dev server required. Returns { ok, output_path, frame_count, duration_ms, fps, verified, verify_skipped?, collisions: [{ t_ms, a, b, volume_mm3 }], diagnostics }.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Override the animationView record's fps. | |
| file | Yes | Path to a .kcad.ts script with an animationView({...}) record (any script in turntable mode). Required (no inline { code } mode). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| hide | No | Hide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification. | |
| focus | No | Show only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification. | |
| width | No | Turntable frame width in px (default 1080; even for MP4). | |
| height | No | Turntable frame height in px (default 1080; even for MP4). | |
| preset | No | Turntable look: 'publish' (default; studio product shot) or 'default' (engineering look). | |
| shadow | No | Turntable + publish: soft contact shadow under the model (default true). | |
| no_verify | No | Skip the animation-pose interference verification (default: verify on). | |
| turntable | No | Seamless 360° orbit of the model instead of the animationView timeline. | |
| background | No | Turntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only — MP4/GIF have no usable alpha). | |
| frames_dir | No | PNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path. | |
| duration_ms | No | Turntable: one full revolution in ms (default 6000). | |
| environment | No | Turntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none'). | |
| output_path | No | MP4 output path (.gif → looping GIF); default <scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir. | |
| verify_every | No | Additionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set). | |
| elevation_deg | No | Turntable: camera elevation above the horizon in degrees (default 22). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, the description discloses critical behavior: verification runs before browser/ffmpeg cost, collisions do not fail the call and are reported via verified:false/collisions[], turntable reports verify_skipped, focus/hide are render-only, and environment prerequisites are playwright chromium plus ffmpeg. It also explains output defaults and file resolution behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and every section addresses a real mode or constraint, but it is a dense wall of text with several long compound sentences. Given the tool's complexity it is appropriately sized, though tighter formatting would improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 17-parameter tool with both animation and turntable modes, the description covers prerequisites, mode selection, verification semantics, output formats, failure behavior, and return values. With a rich output schema also present, nothing important for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond field descriptions: it explains why file is required, how frames_dir changes output naming, that output_path ending in .gif changes format, turntable-specific knobs, mutual exclusivity, and how focus/hide differ from verification. This is more than a baseline restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: render a script's animationView timeline to MP4/PNG or create a 360° turntable. It clearly distinguishes the two modes (file-only animation capture vs. turntable with no animationView record) and explains the FILE ONLY constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions (animation timeline to video or model turntable for sharing) and key exclusions (no inline { code } mode, frames_dir vs output_path, focus vs hide). It does not explicitly route the agent away from neighboring tools like render_preview or export, though it references the render_preview 'publish' preset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_loopRun Design LoopAIdempotentInspect
Use this when the goal is complex / production / enclosure / gearbox / robot-arm / multi-body, or when you need evaluate→review/verify→revise until green. PREFERRED over one-shot evaluate_script+open_in_studio for Adam-level parts. Runs a CAD design loop over attempt scripts: review_cad each attempt, continue past functional attempts with unresolved warnings, return repair prompts (nextActionPrompt) plus structured revisionAssist (suggestedPatches / autoApplied.suggestedCode for repairable feature failures; cookbook steers for stacked-primitive toys). Stop on ok or convergence.escalate. To pick among N alternative candidates for one goal without a judge, pass them all as attempts with consensus:true (geometric medoid selection). Optionally write a Studio build record JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | Original user design goal. Fed into every review_cad repair prompt. | |
| assembly | No | ||
| attempts | Yes | Ordered design attempts. Each item is { id?, title?, file? OR code?, visualReview? } — provide file or code (at least one). File attempts can be replayed by Studio build records. | |
| consensus | No | 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. | |
| autoRevise | No | 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. | |
| epsilonMm3 | No | Forwarded to review_cad. | |
| stopOnPass | No | Stop after the first attempt that is functional and passes the quality gate. Default true. | |
| recordTitle | No | Optional title for the build record. | |
| requirements | No | Call-time external requirements ([{ name, predicate }]) every attempt is graded against, in the same ledger as script require(). Predicate shape: { metric, a?, b?, op, limit, tolerance?, density? }; operands: { kind: body | faces | edges | part, ref, query? }. A failing or not-evaluated requirement blocks the attempt even with no expert geometry. | |
| combinatorial | No | Sample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false. | |
| samplesPerMate | No | Pose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate. | |
| trackConnectors | No | Connector refs to track across sampled poses. | |
| outputRecordPath | No | Optional JSON path to write a Studio-compatible build record. | |
| preserveInterfaces | No | External mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts. | |
| allowReviewWarnings | No | Warning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok. | |
| includeInterference | No | Forwarded to review_cad. Default true. | |
| includePoseEnvelope | No | Forwarded to review_cad. Default true. | |
| requireVisualReview | No | Require screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks. | |
| requirePhysicalAcceptance | No | 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(...). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=true), so the lower bar applies. The description does add real behavioral context the annotations cannot: it continues past functional attempts with unresolved warnings, stops on ok or convergence.escalate, and explicitly does NOT autonomously rewrite full CAD models. It never states failure/error behavior or what happens when all attempts fail, which keeps it from a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The very first clause is front-loaded with the trigger conditions, but the body is a dense run-on that packs the loop contract, consensus semantics, revisionAssist, and Studio record writing into three long sentences with heavy jargon (nextActionPrompt, revisionAssist.suggestedPatches, cookbook steers, stacked-primitive toys). Much of the parenthetical detail duplicates schema text, so several clauses do not earn extra space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations plus a 95%-described schema carry the parameter details. For a 19-parameter orchestration tool the description still conveys the loop's stop conditions, consensus mode, and repair-prompt contract. Only failure-path behavior and how attempts are ordered/aborted is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 95%, so the schema documents nearly every one of the 19 parameters and the baseline is 3. The description adds one genuinely extra piece of semantic intent for consensus:true (geometric medoid selection when picking among N candidates for the same goal) and the autoRevise hint-vs-patch distinction. That is marginal added value over an already-complete schema, not enough to lift it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Runs a CAD design loop over attempt scripts') with the loop's core contract stated: review each attempt, continue past functional attempts with unresolved warnings, return repair prompts. It explicitly distinguishes itself from one-shot alternatives (evaluate_script+open_in_studio), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger list (complex/production/enclosure/gearbox/robot-arm/multi-body) and declares 'PREFERRED over one-shot evaluate_script+open_in_studio for Adam-level parts.' It also names a distinct usage mode (pass N candidates with consensus:true when there is no judge), covering when-to-use and the main alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dfm_reviewReview ManufacturabilityARead-onlyIdempotentInspect
Use this when you need a manufacturability (DFM) report before printing or machining a part: returns a pass/fail checklist, no dfmSpec(...) needed. Pass { file | code } and optional processes (default ['fdm', 'cnc']). FDM 3D printing checks: fdm.overhangs (unsupported overhang steeper than max_overhang_deg, default 45° from vertical), fdm.bridging (bridges over max_bridge_mm, default 10), fdm.min-wall (walls under 2 × nozzle_mm, default 0.4 mm nozzle), fdm.min-hole (holes under 5 × nozzle), fdm.min-pin (warn), fdm.bed-fit (printer profile bed, default generic-fdm), fdm.bed-contact (warn). CNC 3-axis milling checks: cnc.undercuts (surface unreachable from approach_axes, default ['+z']; list several axes for several setups) and cnc.internal-corner-radius (sharp internal corners and fillets smaller than the end-mill radius, tool_diameter_mm default 6). Returns { ok, verdict: 'pass'|'fail', checks: [{ id, process, part, status: 'pass'|'fail'|'warn', summary, value?, limit? }], fdm?, cnc?, diagnostics }. Settings from the script's dfmSpec({ process: 'fdm' }) are used as defaults; call options win. For the script-declared gates (clearance, voids, channels) use verify({ check: 'dfm' }).
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| printer | No | FDM printer profile id for the bed-fit check. Default 'generic-fdm'. | |
| nozzle_mm | No | FDM nozzle diameter, mm. Default 0.4. | |
| processes | No | Processes to review. Default ['fdm', 'cnc']. | |
| approach_axes | No | CNC tool approach directions, one per setup (the tool comes from that side). Default ['+z']. | |
| max_bridge_mm | No | FDM longest unsupported bridge, mm. Default 10. | |
| build_direction | No | FDM part-local axis pointing up from the bed. Default '+z'. | |
| max_overhang_deg | No | FDM steepest printable overhang, degrees from vertical (0 = wall, 90 = flat ceiling). Default 45. | |
| tool_diameter_mm | No | CNC end-mill diameter, mm. Default 6. | |
| max_undercut_area_mm2 | No | CNC unreachable area tolerated before cnc.undercuts fails, mm². Default 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive), and the description adds substantial context beyond them: the exact checks run, their thresholds and defaults, the pass/fail/warn outcome space, diagnostics, and the precedence rule that dfmSpec settings act as defaults while call options win.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case and return shape, then organized by process (FDM block, CNC block, return shape, precedence). It is dense and list-heavy, but every clause carries operational information and nothing is redundant with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required, multi-check tool this covers everything an agent needs: input alternatives, defaults, per-check trigger conditions, result shape and the sibling to use for a different class of checks. The output schema exists, but the description's restatement of verdict/checks semantics is additive rather than filler.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still earns credit by explaining derived semantics the schema cannot, e.g. that min-wall triggers under 2 × nozzle_mm and min-hole under 5 × nozzle, and that listing several approach_axes corresponds to several CNC setups. Some defaults (printer, max_bridge_mm, tool_diameter_mm) are simply restated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('returns a pass/fail checklist' for a 'manufacturability (DFM) report') and bounds the scope to pre-printing/machining review. It also distinguishes itself from the nearest sibling by explicitly routing script-declared gates to verify({ check: 'dfm' }).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit when-to-use trigger ('before printing or machining a part') and names the alternative with its selecting condition ('For the script-declared gates ... use verify'). It also clarifies that no dfmSpec(...) declaration is needed, removing the most likely invocation mistake.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_geometryDiff Model GeometryARead-onlyInspect
Use this when you need to know WHAT MATERIAL changed between two versions of a model, not just how much. The deeper sibling of diff_scripts: a volume delta alone is ambiguous (a boss that grew and a pocket that deepened report the same magnitude, and a part that only moved reports zero), so this tool answers it with geometry instead of pixels. Baseline is { baseFile } or { baseCode }; the revised side is either another script ({ file } or { code }) or the SAME script re-lowered with { params } overrides — a bag of declared param() name -> new value, which is the one-script form a parameter sweep actually asks for. Bodies pair by name and fall back to declaration-order positional pairing; anything left over is listed in unmatched and raises diff.body.unmatched. Per matched body it returns addedMm3 = volume(revised - base), removedMm3 = volume(base - revised), commonMm3 = volume of the overlap from boolean intersection, exact bbox with min/max/extent deltas, face / edge / hole count deltas (hole counts reuse the cylindrical-hole detector), maxDeviationMm (two-sided discrete Hausdorff distance between the two surfaces), and a verdict — identical | moved | resized | topology-changed, precedence topology-changed > resized > moved > identical. Branch on the verdict; cite the numbers. Optional { render: true } also writes an overlay PNG (added green, removed red, unchanged material as a translucent ghost; the scene is a re-runnable .kcad.ts over lossless BREP sidecars) through the render_preview pipeline and fails open (the numeric diff is still returned) when that pipeline is unavailable. Read-only — never touches the active session.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Revised script — inline source. Mutually exclusive with params. | |
| file | No | Revised script — path to a .kcad.ts file. Mutually exclusive with params. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| params | No | Param-override mode: re-lower the BASELINE with these declared param() values changed (e.g. { plateThickness: 8 }). Mutually exclusive with file/code. A name the baseline does not declare fails with the declared-param list in the message. | |
| render | No | Also render an overlay PNG — added material green, removed material red — via the render_preview pipeline. Off by default; the numeric table is the agent-facing evidence. | |
| out_dir | No | Directory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir. | |
| baseCode | No | Baseline script — inline source. | |
| baseFile | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive, but the description adds material context beyond them: the fail-open behavior when the render pipeline is unavailable, the name-then-positional body pairing rule and the `unmatched` error it raises, and the verdict precedence ordering. It also restates the no-session-mutation guarantee, which is the operational fact an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the selection criterion and the sibling contrast before the mechanics, which is the right order. It is dense and the long enumeration of returned deltas/verdict values partly duplicates the output schema, costing it a point on economy, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema and nested param object, the description covers inputs, pairing/error semantics, and behavioral caveats. Because an output schema exists it need not describe return fields, yet the verdict-precedence line still gives an agent a decision rule it would otherwise have to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds interpretive value by framing the parameters as a base/revised pairing and explaining that `params` is a re-lowering of the baseline with declared param() values (the one-script form of a sweep). It does not add much on `render`/`out_dir` beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — geometric/material diff between two model versions — and immediately contrasts it with the sibling diff_scripts ("the deeper sibling of diff_scripts"), including why a volume delta alone is ambiguous. An agent can distinguish it from every other tool in the sibling list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with the selecting condition ("Use this when you need to know WHAT MATERIAL changed... not just how much") and names the simpler alternative. It then enumerates the legal baseline/revised combinations, including the param-sweep form, so the agent knows which invocation mode applies to its situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_scriptsDiff CAD ScriptsARead-onlyIdempotentInspect
Use this when you need to see exactly what changed between two script versions. Structured geometric delta between two versions of a kernelCAD script — a baseline ({ baseFile } or { baseCode }) and a revision ({ file } or { code }). Returns agent-readable JSON: per-part added/removed/renamed/changed (volume mm³ + exact bbox deltas, numbers matching inspect({ of: 'part-stats' })), total interference-volume delta with per-pair detail, mate-graph changes (added/removed/changed mates incl. type, connectors, pose, limits), and param changes (value/min/max). Single-shape scripts diff as one "(root)" pseudo-part; a return [a, b] multi-body script diffs per body as "body[0]", "body[1]". An error that still leaves geometry (e.g. a skipped fillet) is listed under base/revised.errors beside the diff. Use after editing a script to verify exactly what changed physically before re-rendering. On a hosted server pass both versions inline: { baseCode: 'return box(10, 10, 10);', code: 'return box(10, 10, 12);' } (base_code/old_code/before and revised_code/new_code/after are accepted as aliases). Read-only — never touches the active session.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Revised (after) script — inline source. One of file / code is required. | |
| file | No | Revised (after) script — path to a .kcad.ts file. Local servers only. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| baseCode | No | Baseline (before) script — inline source. One of baseFile / baseCode is required. | |
| baseFile | No | Baseline (before) script — path to a .kcad.ts file. Local servers only. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only, idempotent annotations, it discloses the detailed return shape: per-part added/removed/renamed/changed entries, interference-volume deltas, mate-graph changes, parameter changes, error handling, and multi-body behavior. It also clarifies that it never touches the active session and how to pass code on hosted servers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core use case, then packs return details, edge cases, and hosted-server guidance into a dense but purposeful block. Every sentence adds operational information for an agent deciding whether and how to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description supplies enough context about the diff result, error handling, multi-body behavior, and hosted/local input modes for an agent to invoke it correctly. The annotations already cover safety, and the description fills in the remaining behavioral and input-mode gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters at 100% coverage, so the baseline is 3. The description adds meaningful value by naming accepted aliases such as `base_code`, `old_code`, `before`, `revised_code`, `new_code`, and `after`, which are not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it computes a structured geometric delta between two versions of a kernelCAD script, with explicit baseline and revision inputs. It clearly distinguishes script diffing from generic inspection by referencing per-part stats and by naming script concepts such as `(root)` pseudo-parts and `body[0]` multi-body handling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this after editing a script to verify physical changes before re-rendering, and it explains the hosted-server inline-code pattern. It does not explicitly compare itself to the similar `diff_geometry` sibling or state when not to use it, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drawing_to_cadConvert Drawing to CADAInspect
Use this when the reference for a part is a 2D engineering drawing PDF (orthographic views with dimensions), not a photo. Deterministic, no vision model: reads the vector linework (stroke width, dash) and positioned text; classifies visible / hidden / center / dimension / extension lines; reads the title block scale, units and projection symbol; identifies front / top / side views by projection alignment (third- or first-angle); ties dimension text to its lines (⌀, R, 4×, ±, THRU, depth). Dimension values win over measured lengths. Rebuilds the part as the view silhouette extruded by the depth an orthogonal view shows, or a turned part revolved from its half-silhouette, plus holes from ⌀ circles with THRU or hidden-line depth. Returns script — a .kcad.ts with role-named params (width, thickness, holeDia, hole1X, dia1, step1Length …) — and ledger, an assumption ledger where stated dimensions are visible, symmetry-derived positions inferred, defaults assumed and an unstated depth missing; a dimension that disagrees with the linework keeps its value and records the disagreement as an open fact. With verify (default) the script is evaluated, re-projected through the svg-drawing view stage and compared: fidelity.verdict is match | partial | mismatch | failed with per-axis extents, hole diameters and per-view silhouette IoU. Pass out to write the script and its <stem>.ledger.json (resolve open facts with resolve_assumptions, then set_param). A scanned (raster-only) page fails with reference.drawing.raster-only — use trace_from_image for those. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Write the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json. | |
| page | No | 1-based page to read. Default 1. | |
| path | No | Path to the drawing PDF on the machine running kernelCAD. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine. | |
| intent | No | 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. | |
| verify | No | Evaluate the rebuilt part and compare it with the drawing. Default true. | |
| pdfBase64 | No | The PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server. | |
| projection | No | Override the projection angle read from the sheet (default: projection symbol or note, else third-angle). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation/open-world profile, and the description adds substantial context beyond them: it is deterministic with no vision model, dimension text overrides measured lengths, disagreements are preserved as open facts, the raster-only failure code is named, and hosting constraints (https URL, data: URI max 25 MB, asset:<id>) are given. The only gap is that it doesn't say what `script` looks like structurally or how expensive the verify re-projection pass is, which matters for a non-idempotent, non-read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The routing condition is front-loaded in the first sentence and every subsequent sentence adds a distinct fact (line classification, dimension precedence, output artifacts, verify verdicts, failure mode, hosting). It is, however, a single very dense paragraph with no breaks, and a few clauses (e.g. the full list of role-named params) could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 7 parameters, an output schema, and a verification pipeline, the description covers input contract, internal behavior, failure mode, downstream resolution workflow, and the meaning of the returned ledger states. Nothing an agent needs to call this correctly or to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so this is baseline-plus: the description explains the side effect of `out` (ledger written as <stem>.ledger.json beside it) and the default semantics of `verify`, and reiterates the hosted-vs-local input contract for `path`/`pdfBase64`/asset. It doesn't clarify `page` or when to override `projection`, but the value-add over the schema is real.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (convert a 2D engineering drawing PDF into a parametric .kcad.ts script) and immediately distinguishes it from the sibling trace_from_image by input type ('drawing PDF ... not a photo'). The mechanism is spelled out (vector linework, dimension-to-line association, extrude/revolve), so an agent knows exactly what class of operation this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit when-to-use clause keyed to the input being an orthographic PDF, names the alternative for the excluded case ('A scanned (raster-only) page ... use trace_from_image'), and closes the loop on follow-up tools (resolve_assumptions then set_param for open facts). No inference is required to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_assembly_manufacturingestimate_assembly_manufacturingAInspect
Prepare an indicative estimate and durable manufacturing checklist for a whole CAD assembly, including mixed materials and processes. The server reads material and sheet thickness from CAD, selects supported processes, checks live supplier offers, and reports any missing prices or blockers. This creates only a draft estimate. It does not send an order, charge the customer, or start checkout. Sign in to estimate private saved projects; source code and public projects can be estimated as a guest.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | Current CAD parameter values. Materials and sheet thickness come from the CAD design. | |
| source | No | Current kernelCAD source for an unsaved assembly. | |
| assembly | No | Assembly name when the script contains multiple assemblies. | |
| projectSlug | No | Saved project slug. Use this for a saved assembly. | |
| projectVersion | No | Immutable saved revision to estimate. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a non-read-only, open-world operation, and the description adds real substance: it reads material and thickness from the CAD, hits live supplier offers, reports missing prices/blockers, and only writes a draft with no charge or checkout. Remaining gaps are minor — no mention of whether the draft persists, how long a live-quote lookup takes, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by what the server does, then the no-side-effects disclaimer, then the auth caveat. Every sentence adds new information; none restates the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with full schema coverage and an output schema, the description covers what an agent needs: scope (whole assembly), mechanism (CAD reads + live supplier lookup), side-effect boundary, and auth requirements. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema doesn't: materials and sheet thickness come from CAD rather than from `params`, and `projectSlug` use requires sign-in while source/public projects can be estimated as a guest. That clarifies parameter choice beyond the field-level text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ("Prepare an indicative estimate and durable manufacturing checklist for a whole CAD assembly") and scopes it with mixed materials/processes. It also implicitly separates this tool from ordering siblings by stating it does not send an order, charge, or start checkout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes when this tool fits (a whole assembly, mixed materials, wanting a draft estimate plus blockers) and when it doesn't (ordering/checkout). What it lacks is naming the actual alternatives — e.g. order_part, request_assembly_quote, price_part, dfm_review — so an agent must infer sibling routing from the tool list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_scriptEvaluate CAD ScriptAInspect
Use this when you need to run a script and check it compiles. Full local builds return viewerUrl: a live Studio link reused and updated on later full builds in the same MCP process. Hosted builds return viewerMode: hosted and viewerHint pointing to open_in_studio; they do not start a loopback viewer. Full evaluations return step evidence: build validity, volume and before/after local PNG paths in one shared iso frame. Snapshots require PW_CDP_URL for an existing browser; unavailable captures report an explicit error. Run a kernelCAD .kcad.ts script and report pass/fail + feature count + diagnostics + sceneSummary (BREP validity, volume in mm³, face count, bounding size in mm). When the scene is assembly-built (assembly().part(...) → .model()/.solvedModel()), also returns a parts summary { count, names } AND runs the mechanism-truth gate by default: the mechanism field reports real/broken/unverified and a broken mechanism (disconnected components / mechanism.orphan-part, self-collision, fastened drift, dof-mismatch) makes ok:false with the failures in diagnostics, as does a mate connector more than 6 mm outside its part bounding box (assembly.mechanical.connector-not-in-solid, the same error review_cad reports) — a mechanism (any mate or joint) needs every part linked by connectors + mates/joints (axis+revolute for shafts/hinges/gears; frame+fastened for rigid; or arm.revolute/.prismatic/.ball/.fixed). A plain multi-part assembly with no mates (base + lid, print layout) is independent bodies and passes. Pass { skipMechanismCheck: true } to opt out (e.g. a deliberately free part next to a mechanism). An animation or drive on a fastened joint (mechanism.motion-on-fixed-joint) is broken: animate a revolute/prismatic mate pose. For a model with moving joints or motion intent, mechanismSummary.statement is one plain line: "Motion checked: ..." names what ran; "Motion not checked: ..." is NOT a pass — never call that mechanism working. Every union() is checked too (no 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: "" } or { code: "" }. Set { dryRun: true } for fast validation while iterating: transpile + capture + capture-light checks without building solids, DFM gates, or meshing — milliseconds instead of seconds (100x+ on boolean/fillet-heavy scripts). A dry run catches script throws, capture-time API misuse, and assembly validity-gate failures, but NOT lowering failures or dfmSpec diagnostics; it leaves the active session untouched, so finish with a 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. A full evaluation updates the active MCP session and viewer state and keeps temporary step evidence; { dryRun: true } leaves the active session unchanged. Hosted: lib.fromSTEP / fromSTL / meshFromSTL / fromDXF / fromSVG and referenceImage take a direct string literal or a const bound to one (computed expressions are unsupported). They accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| dryRun | No | Fast validation only: skip solid build, DFM gates, and meshing. Does not set or clear the active session. | |
| intent | No | The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data. | |
| kernel | No | Solid-modeling kernel. Default 'occt' (OpenCascade); opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics. | |
| baseline | No | The `selections` of an earlier evaluation of this model. A selector that now binds to a different face or edge is reported as selector.binding-changed (warning), one whose entity only moved or resized as selector.binding-moved (info). Defaults to the previous evaluation of the same `file`. | |
| requirements | No | Call-time external requirements ([{ name, predicate }]) measured in the same `requirements` ledger, tagged source: 'external' and never persisted. The predicate is the serializable form of require(): { metric: clearance | distance | mass | volume | bbox | centerOfMass | count | innerLoops | angle | concentric | coplanar, a?, b?, op: gte | lte | eq | between | within, limit, tolerance?, density? }. Operands are { kind: body | faces | edges | part, ref: <feature id/name or part name>, query? }. | |
| skipMechanismCheck | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare not-read-only, open-world, non-idempotent, and non-destructive; the description goes much further by disclosing that full evaluations update the active session and viewer state and keep step evidence, that dryRun leaves the session untouched, that hosted builds do not start a loopback viewer, snapshot PW_CDP_URL requirements, and the failure gates that set ok:false. No annotation conflict is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense wall of text: the core run statement is not front-loaded, numerous parenthetical asides interrupt the main flow, and dryRun's session behavior is stated twice. Many details are useful but need restructuring into a short purpose sentence followed by grouped usage and behavior notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex evaluator with an output schema, it covers the critical behavioral context an agent needs: session effects, dryRun tradeoffs, mechanism and union failure modes, hosted asset constraints, and viewer/dimension output. The remaining parameters are fully documented in the schema, and return values are covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantics for key parameters: code vs file selection, dryRun's precise scope and limits, and skipMechanismCheck's default gate and opt-out behavior. It leaves baseline, kernel, intent, and requirements to the schema, so it does not fully compensate beyond the already rich schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb and resource ('Run a kernelCAD .kcad.ts script') and enumerates the primary outputs (pass/fail, feature count, diagnostics, sceneSummary), so the core operation is unmistakable. However, it does not directly contrast itself with sibling validation/inspection tools such as verify or review_cad, and the core run statement is buried after viewer-mode details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use this when you need to run a script and check it compiles'), explains when to choose dryRun ('fast validation while iterating') and the need to finish with a full evaluation before session-dependent tools, and states when to opt out of mechanism checks. Hosted-vs-file constraints and alternatives to full builds are also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_sdfEvaluate SDFARead-onlyIdempotentInspect
Use this when you need to sample a signed-distance field at a point. Sample the signed distance from an in-script sdf.* field at a 3D point. Returns { distance, inside, aabb, kind }. Distance is in mm; negative = inside the surface, 0 = exactly on the surface, positive = outside. Use this to verify SDF composition before calling sdf.materialize (which is the expensive step). The script must bind the SdfField via sdf.bind('', field) and pass that name as fieldName. Hint: pass either { file } or { code }, plus { fieldName, point: [x,y,z] }.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| point | Yes | Sample point [x, y, z] in mm. | |
| fieldName | Yes | sdf.bind binding name holding the SdfField. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotent, non-destructive), and the description adds genuinely new context: units in mm and the sign convention (negative = inside, 0 = on surface, positive = outside). It restates the return shape '{ distance, inside, aabb, kind }', which the output schema already provides, so it stops just short of full marks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger and the core action, then units and sign semantics, then the materialize alternative, then the binding prerequisite. Dense and useful, though the explicit return-shape listing mildly duplicates the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only sampling tool: the agent knows when to call it, what to pass (including the file-vs-code choice), the prerequisite binding, the units/sign meaning, and what it is a cheap check for before an expensive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it explains that fieldName must correspond to a sdf.bind binding and that the caller passes either { file } or { code } plus fieldName and point. That is real invocation guidance the schema alone does not tie together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (sample the signed distance) and resource (an sdf.* field) at a 3D point, and even names the return payload. An agent can distinguish this from the many add_*/inspect siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly conditions use ('use this when you need to sample... at a point') and names the alternative step it precedes: verifying SDF composition before the expensive sdf.materialize. It also states the prerequisite that the script must bind the field via sdf.bind('<name>', field).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_cookbookExecute CookbookAInspect
Use this when you need evaluate_script (and optionally open_in_studio) for an industry / cookbook demo in ONE step — after lookup_cookbook for industry demos, prefer execute_cookbook when you need evaluate+Studio together; empty lookup is not a stop (freehand-author instead). Resolves a cookbook snippet by id or BM25 query (same ranking as lookup_cookbook), evaluates its body via evaluate_script with bounded vendor timeouts, and returns explicit status with stage resolve|evaluate|open_in_studio. Pass openInStudio:true to publish the same script via open_in_studio after a green full evaluate (hosted MCP). dryRun:true is the fast capture-only path — it is NOT evidence the cookbook builds a solid or is safe to publish; finish with dryRun:false (default) before claiming success or opening Studio.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Cookbook snippet id (e.g. gt2-timing-belt-drive, extrude-rounded-rect-plate). | |
| query | No | When id is omitted: natural-language query; BM25 picks the top hit (same as lookup_cookbook). | |
| dryRun | No | Default false. dryRun:true is NOT evidence the cookbook builds a solid — capture-only checks; do not claim success or open Studio from a dry run alone. | |
| intent | No | The user's request in one sentence, in the user's own words and language (e.g. 'M4 bracket for a 25 mm tube, print on Bambu A1'). Helps kernelCAD improve; leave out personal data. | |
| kernel | No | Solid-modeling kernel forwarded to evaluate_script. Default 'occt'; opt-in 'smlib' uses guarded candidates with explicit OCCT fallback diagnostics. | |
| project | No | 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. | |
| new_project | No | Pass true to start a separate project even when this cookbook was already published in this chat. | |
| openInStudio | No | Default false. When true, after a green full (non-dryRun) evaluate, call open_in_studio on the same script (hosted MCP). | |
| continue_design | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond annotations: bounded vendor timeouts, an explicit status with stage resolve|evaluate|open_in_studio, the hosted-MCP caveat for openInStudio, and the strong warning that dryRun:true is capture-only and not evidence of a solid or safe result. Annotations already declare readOnlyHint=false/openWorldHint=true, so this is supplementary rather than load-bearing, but it is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger ("Use this when..."), which is good, but it is one dense chained paragraph with semicolons, inline arrows, and repetition — the dryRun-is-not-evidence warning appears twice in the description and again in the schema. It would read better as short separated lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter orchestrator with an output schema, it covers the decision path, the resolve/evaluate/publish stages, the hosted-MCP constraint, and the failure/verification discipline. Return-value detail is correctly left to the output schema; only the interaction between `project`, `new_project`, and `continue_design` is left to the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter's meaning, including the dryRun caveat and openInStudio precondition. The description mainly restates those semantics plus the id-vs-query fallback ordering, which is a modest increment over the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound action: resolve a cookbook snippet by `id` or BM25 `query`, evaluate its body via evaluate_script with bounded vendor timeouts, and optionally publish via open_in_studio. It explicitly positions itself against lookup_cookbook and evaluate_script, so an agent can distinguish the composite tool from the primitives without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: after lookup_cookbook for industry demos, prefer execute_cookbook when evaluate+Studio are needed together, and clarifies that an empty lookup is not a stop (freehand-author instead). It also names the precondition for openInStudio (green full evaluate) and the requirement to finish with dryRun:false before claiming success.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explode_viewPlan Exploded ViewARead-onlyIdempotentInspect
Use this when you need an ordered exploded-view plan for an assembly. Supply parts as {name,center:[x,y,z],size:[x,y,z]} in mm. Optional assembly_order sets the sequence; missing order falls back to input part order, and unlisted/unknown order refs are reported. Choose mode axis (default) or radial; axis follows the requested direction, radial moves parts away from the assembly centroid. The result includes ready-to-paste param_declarations, animation_tracks and reverse_animation_tracks for animationView(), part_transforms for existing shapes, and script_fragment. cameraPlan gives framing guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Assembly direction; default +Z. | |
| mode | No | Explode direction strategy; default axis. | |
| parts | No | Named assembly parts and measured bbox centers/sizes in mm. | |
| spacing | No | Positive spacing scale; default 1.25. | |
| duration_ms | No | Timeline duration from 500 to 60000 ms; default 3000. | |
| assembly_order | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent planning operation. The description usefully adds behavioral details: assembly_order fallback to input order, reporting of unknown order references, axis versus radial movement semantics, and the exact output artifacts generated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense but front-loaded paragraph with no empty filler. It could be slightly more scannable, but every clause contributes useful planning or invocation context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and strong annotations, the description is complete enough for an agent to call the tool correctly. It explains inputs, optional fallback behavior, mode semantics, and the major returned artifacts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 83%, so most parameter meaning is already documented. The description still adds value by clarifying the expected part tuple format, assembly_order fallback/reporting behavior, and how mode changes the explosion strategy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: producing an ordered exploded-view plan for an assembly. It is distinct from most sibling tools, but it does not explicitly contrast itself with related tools such as capture_animation or blockout_assembly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition: use when you need an ordered exploded-view plan for an assembly. It does not name alternatives or state when not to use it, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportExportAInspect
Use this when you need to export geometry to a file. One exporter, selected by target:
target:'model' — export the script geometry to one file. Pass { file | code }, a required { output_path }, and { format }. Supported formats: stl (binary STL mesh), step (BREP CAD interchange), dxf (2D cut file for laser / waterjet / CNC: a flat part — plate, panel, extruded profile, in any orientation — exports its outline and holes in its own plane with exact arcs and circles; a sheet-metal part or a returned Region exports its flat pattern; a flat or sheet-metal part also returns sheet { thickness_mm, bend_count }, which a shop needs and the DXF does not carry; options.section { axis: "x"|"y"|"z", at } exports the cross-section of any part in world coordinates (plans, profiles); a multi-part model (cut list) writes all parts side by side on output_path, one layer per part, plus parts/.dxf per part (reported in part_files; options.layout 'sheet' writes the combined sheet only); any other part fails with export.dxf.non-planar), 3mf (slicer-friendly mesh: one named object per part, colours as core-spec basematerials named by the part's engineering material; options.arrange 'plate' packs parts on the bed at Z=0 without overlap (options.orient puts each part's largest flat face down), 'assembled' keeps them together as one multi-part object for multi-colour prints; options.slicer 'bambu' | 'orca' | 'prusa' adds that slicer's per-object name + filament-slot sidecar — slot N is the Nth distinct colour/material), options.infill { fromFea: '' | true, bands?, pattern? } = stress-graded FDM infill (requires the local CalculiX + gmsh toolchain; without it the export fails with fea.solver.unavailable): solves the feaStudy and writes modifier volumes, each with its own infill density (Orca/Bambu format by default; options.slicer 'prusa' writes PrusaSlicer's format instead, since the two are not interchangeable); the result carries infill { bands, saving, images }), gcode (installed OrcaSlicer output; preserves G-code and returns optional gcode_stats with header generator identity and slicer-predicted time/material), glb (web-viewer / AR with PBR materials), obj (Wavefront indexed triangle mesh), usd (ASCII USDA triangle mesh in millimeter, Z-up coordinates; multi-part scenes emit one named mesh per part), svg-drawing (third-angle engineering-drawing sheet: front/top/left + isometric views, hidden edges dashed, tangent edges thin, 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; 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). 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), srdf (motion-planning semantics layered over the URDF), sdf-gazebo (SDFormat 1.10 with native ball 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 { : { 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, fabrication process (
process+processSource), and catalog provenance for purchased parts; same numbers as inspect({ of: 'bom' })). order-pack (a zip: one single-body file per fabricated part — STEP always, plus STL for 3d-print and DXF for sheet-cut rows, per-part drawing PDFs where available — with bom.csv/bom.json, vendor paste handoff texts for purchased rows and a machine-readable manifest; options processes / items narrow which rows are packed; nothing is uploaded). bend-table (tube bender tables over tube() records: one .csv per tube with the LRA bend table, XYZ points, cut length and last straight; output_path is a DIRECTORY and the written files are reported in table_files; a script with no tube() fails with export.bend-table.no-tubes, and a script whose tube gates report errors writes nothing). urdf and sdf-gazebo also write one meshes/.stl per link, and usd-isaac one meshes/.usda mesh layer per link, next to output_path (reported in mesh_files) — ship the whole directory to the consumer. STL exports run a watertight verify by default; failures return ok: false with export.mesh.not-watertight (open-edge count + up to 5 crack-cluster locations) but the file is still written so the broken mesh can be inspected. STEP exports check B-rep validity and mesh watertightness by default; failures return ok: false with export.brep.invalid or export.mesh.not-watertight, while keeping the STEP file for inspection. Set options.verify: false or pass { no_verify: true } to skip STEP checks. Optional { feature_id } selects which feature to export (default: last). Optional { options } carries per-format options bag (see the kernelcad-mcp skill for the per-format keys: step unit/verify, dxf layers/tolerance/unit/section/layout, 3mf printUnit/embedSource/arrange/orient/slicer/printer/infill, glb axis/draco).target:'part' — export solved-assembly parts as individual binary STL files in their modeled (world-frame) positions. Pass { file | code }, plus { part, output_path } for one part or { output_dir } for all parts (files land at <output_dir>/.stl). A watertight verify runs on every exported mesh by default and fails the call with export.mesh.not-watertight; unknown part names fail with export.part.not-found listing the valid names. Pass { no_verify: true } to skip the watertight gate. All params except
targetare forwarded verbatim; each target 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 carriesdownloads[]— an HTTPSurlper file (expires after 24 h; give it to the user) — Small text files an agent can read (SVG, DXF, URDF, JSON, CSV; up to 32 KB) also come inline as an embedded resource; STEP, STL, 3MF and GLB are link-only — do not fetch them into your context, give the user the link.output_pathonly names the file; the returnedoutput_pathis a server-side path, usable only asfilein 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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| part | No | target:'part' — part name for single-part export, or 'all'. | |
| format | No | target:'model' — output file format (required for that target). | |
| intent | No | 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. | |
| target | Yes | Which exporter to run: 'model' (whole-script geometry to one file) or 'part' (per-part STLs from a solved assembly). | |
| options | No | target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. step: { unit?: "mm"|"cm"|"in", verify?: boolean } (verify defaults to true and checks B-rep validity plus mesh watertightness; false skips both). stl: { verify?: boolean } (defaults to true). dxf: { layers?, unit?: "mm"|"cm"|"in", tolerance?, section?: { axis: "x"|"y"|"z", at: mm }, layout?: "per-part"|"sheet" }. 3mf: { printUnit?: "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. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: "y-up"|"z-up", draco?: false }. obj and usd are mesh exports with no extra options; usd writes ASCII USDA (millimeter, Z-up). svg-drawing: { views?: ["front"], sheet?: "a4"|"a3" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. views:["front"] produces a centred front-only elevation for SVG or PDF; omit views for four views. Front-only sheets require front annotations and reject isometric balloons/exploded overlays. 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"], dimensioningStyle?: "baseline"|"chain"|"symmetry" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: "a4"|"a3"|"a2"|"a1"|"a0"|"ansi-a"|"ansi-b"|"ansi-c"|"ansi-d"|"ansi-e"|"auto"|"auto-ansi" (default "a3"), projection?: "third"|"first", title?, partName?, material?, revision?, date? (default today), modelName?, views?: ["front"], annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: "general"|"machining"|"sheet-metal" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. Functional drawing review: shape.drawingReview(plan) source declarations merge with reviewPlans?: additional plans; decisionResolutions?: { [encodeURIComponent(planId)+":"+encodeURIComponent(decisionId)]: { note, provenance } }. drawing_report.review reports declared geometric-callout coverage and unresolved engineering decisions. requireCompleteReview?: true rejects incomplete/not-declared mechanical reviews before export; architectural style rejects review contracts. Coverage is not engineering certification. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. 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. | |
| no_verify | No | Skip the default STL/STEP validity and watertightness gates. | |
| feature_id | No | target:'model' — optional FeatureId to export; defaults to last. | |
| output_dir | No | target:'part' — destination directory (all-parts mode); files are <dir>/<part>.stl. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link. | |
| output_path | No | Destination path (a directory for format 'bend-table'). target:'model' — the export file (required). target:'part' — single-part .stl path. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: files are written on the hosted server, downloads use expiring HTTPS URLs, heavy formats may defer with a job_id to poll, small text files may be inline, and verification failures still write files for inspection. These details materially affect how an agent should handle results and are consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although it is front-loaded and organized by target and format, the description is extremely long and contains duplicated passages, including a repeated svg-drawing phrase about bounding-box dimensions and inter-part occlusion. It also repeats substantial schema detail, so it is not appropriately concise despite the tool's genuine complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large number of formats, hosted-server behavior, deferred execution, verification defaults, download-link semantics, and target-specific failures, the description is complete enough for an agent to call and handle the tool correctly. Output behavior and failure modes are well covered alongside the structured schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds useful control semantics: target-specific required parameters, server-side meaning of output_path, the no_verify gate, feature_id defaulting, and the model/part behavioral split. Much of the nested options detail is duplicated from the schema, but the description still improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: exporting geometry to a file, with two explicit targets ('model' and 'part') and a long format list. It is unambiguous what the tool does, but it does not directly distinguish itself from siblings such as fab_pack, write_bom, or get_model_mesh.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with an explicit usage trigger ('Use this when you need to export geometry to a file') and explains how to choose between the two targets. It also gives targeted operational guidance for deferred exports and for calling open_in_studio instead of blocking on STEP, though it does not compare against all adjacent sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fab_packPackage Fabrication FilesAInspect
Use this when the user wants to get a part made: packages the fabrication files into one directory plus a zip, and returns links to public instant-quote pages. Pass { file | code } and output_dir; optional scope ('part', default — one script's files; 'bom' — the whole assembly's BOM: per-part single-body files, per-part drawings, bom.csv/json and vendor handoff texts), name (default 'part'), formats (default step, stl, 3mf, pdf-drawing, bom-csv; add 'dxf' for flat or sheet parts), and processes ('3d-print' | 'cnc' | 'sheet-cut') to filter the links (bom: also narrows which fabricated rows are packed). Each file is written by the export tool, so its gates apply; a format that fails is reported in files[] and the rest still ship. Also writes manifest.json and README.txt. quote_links lists JLC3DP, JLCCNC, PCBWay, Xometry, SendCutSend and Craftcloud with the pack file to upload to each. One body per file: multi-body files are rejected by every shop. DXF is written only for flat or sheet-metal parts. The McMaster handoff text carries part numbers only, because McMaster quantities are packs and pack sizes are not in the catalog yet. These are plain web pages: nothing is uploaded or ordered. The user opens the link and uploads the file. Run dfm_review first if you have not. Hosted server: pack files are written on the kernelCAD server and returned in downloads[].url; nothing is uploaded to a fabrication service.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| name | No | Base file name (letters, digits, '.', '_', '-'). Default 'part'. | |
| scope | No | Default 'part' (a single-part pack). 'bom' packs the whole assembly's BOM: per-part single-body files, per-part drawings, bom.csv/json, vendor handoff texts, and per-process quote links. | |
| formats | No | Files to include. Default step, stl, 3mf, pdf-drawing, bom-csv. | |
| processes | No | Only return quote links for these processes. Default: all. | |
| output_dir | Yes | Directory to write the pack into (created if missing). Hosted server: only the directory name is used; the pack is written in a server-owned directory and returned as download links. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/openWorld/idempotent) by disclosing that per-file export gates apply, that a failing format is reported in files[] while the rest still ship, that manifest.json/README.txt are written, that quote links are plain web pages with nothing uploaded or ordered, and that multi-body files are rejected by shops. That is exactly the operational context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case and the core output, then scope/formats/processes details. Dense but nearly every clause carries information; only the hosted-server note is repeated at the end relative to the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description supplies the remaining gaps — failure behavior, generated artifacts, quote-link contents, and the no-upload caveat. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented; the description still adds real semantics, notably that 'dxf' should be added for flat/sheet parts, that formats default to step/stl/3mf/pdf-drawing/bom-csv, and that processes narrows both links and (in bom scope) which rows are packed. Minor gap: it doesn't elaborate on name/output_dir beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — packages fabrication files into a directory plus zip and returns instant-quote links — and implicitly separates itself from export (single-file) and order_part/price_part. An agent can tell exactly what comes out of this call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the trigger ('when the user wants to get a part made'), explains the part vs bom scope choice, says formats/processes narrow results, and gives an explicit prerequisite: 'Run dfm_review first if you have not.' Alternatives are effectively routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fea_summaryGet FEA SummaryARead-onlyIdempotentInspect
Use this when you need a structural check's context without paying for a solve. Read-only: returns the stored summary of a previous run_fea (pass the same output_dir), whether the CalculiX + gmsh toolchain is available on this machine (with the install command when it is not; run_fea then uses its in-process voxel solver — toolchain.default_solver says which), and the FEA material table with real E / Poisson / yield numbers so a grade is chosen against data rather than from memory. Never meshes, solves, or writes.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | No | Directory a previous run_fea wrote to; omit for toolchain status + material table only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces rather than contradicts them with 'Never meshes, solves, or writes.' It adds genuine context beyond annotations: toolchain availability reporting, the install command when absent, fallback to the in-process voxel solver, and the material table with real E/Poisson/yield values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph, front-loaded with the when-to-use clause, and every sentence carries information. It is somewhat run-on with stacked parentheticals (solver fallback, toolchain.default_solver, material fields), which costs a bit of scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool with readOnly annotations and an output schema, this is complete: it covers purpose, prerequisite (prior run_fea output_dir), fallback behavior, and the content of the returned material table. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains omitting output_dir, so the baseline is 3. The description reinforces the link to run_fea ('pass the same output_dir') and states what the omit path returns (toolchain status + material table), which meaningfully clarifies parameter effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (returns the stored FEA summary) and immediately pins its scope: context for a structural check without a solve. It is clearly distinguishable from the sibling run_fea, which it names and contrasts with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when you need a structural check's context without paying for a solve') and points to run_fea as the alternative that produces the output_dir it consumes. The 'pass the same output_dir' instruction ties usage to the sibling workflow directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_partFetch PartARead-onlyIdempotentInspect
Fetch one bundled catalog part. Prefer await lib.standard.nema17() and await lib.standard.bearing608() — they are offline and do not download remote STEP. A lookup that cannot finish fails within 45s with errorCode parts.lookup.timeout. Do not retry in parallel.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| model | No | Verified model options; supplying model implies includeModel. | |
| query | No | ||
| family | No | ||
| category | No | ||
| standard | No | ||
| includeModel | No | Resolve a hash-verified STEP/GLB model file instead of the plain catalog STEP record. | |
| partsBaseUrl | No | Opt-in remote endpoint; no default value ships with kernelCAD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: remote STEP download implications, a 45-second timeout with errorCode parts.lookup.timeout, and the instruction not to retry in parallel. It does not describe authentication or return structure, but the output schema already covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the purpose, and every sentence adds useful operational guidance: offline preference, timeout/error code, and retry constraint. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, nested model options, and only 38% schema coverage, the description leaves meaningful gaps around how to choose between id/query/family/category/standard. Annotations and the output schema reduce the burden, and the timeout/retry guidance helps, but the definition is only minimally complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38%, and several top-level parameters such as id, query, family, category, and standard have no descriptions. The description adds little parameter-level meaning beyond saying it fetches one bundled catalog part, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: "Fetch one bundled catalog part." It is clearly a retrieval tool, but it does not explicitly distinguish itself from siblings such as find_part or import_step, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly prefers `await lib.standard.nema17()` and `await lib.standard.bearing608()` for common standard parts because they are offline and avoid remote STEP downloads. It also gives a concrete retry prohibition, but it does not explain when to use this tool instead of sibling part tools like find_part.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_partFind PartBRead-onlyIdempotentInspect
Search the bundled parts catalog (offline). For a NEMA-17 motor write await lib.standard.nema17(); for a 608 bearing write await lib.standard.bearing608(). Do not fan out parallel lookups and do not pass partsBaseUrl unless you set source:"remote". Remote lookups fail within 45s with errorCode parts.lookup.timeout instead of hanging.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| limit | No | ||
| query | No | ||
| family | No | ||
| intent | No | 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. | |
| source | No | ||
| category | No | ||
| standard | No | ||
| partsBaseUrl | No | Opt-in remote endpoint; no default value ships with kernelCAD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: the catalog is bundled/offline by default, remote lookups require source:"remote", parallel lookups should not be fanned out, and remote failures surface as parts.lookup.timeout within 45s. This is useful operational context even though pagination/result behavior is left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core purpose. The code-snippet examples are a bit unusual and not clearly tied to this tool's parameters, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the offline/remote distinction and remote failure mode well, and an output schema exists so return values need not be explained. Still, with 9 parameters and low schema coverage, the missing parameter and sibling-selection guidance leaves the definition only adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 22% across 9 parameters, so the description needs to compensate. It clarifies only the source/partsBaseUrl relationship and leaves tag, limit, query, family, category, and standard effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: searching the bundled parts catalog, and clarifies that it is offline. It does not distinguish this from nearby siblings such as fetch_part or add_part, but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete constraints: avoid parallel lookups, do not pass partsBaseUrl unless source is remote, and remote lookups time out after 45s. However, it does not explain when to use this tool instead of sibling tools such as fetch_part, order_part, or price_part.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_planeFit Plane to PointsARead-onlyIdempotentInspect
Use this when you need to fit an orthogonal least-squares plane to XYZ point-cloud data. Returns centroid, deterministic unit normal, signed point residuals, RMS residual and maximum absolute residual. Accepts points already parsed by the caller from scan data or mesh vertices. Computes parameters only; it does not create a surface body. Requires at least three non-collinear finite points.
| Name | Required | Description | Default |
|---|---|---|---|
| points | Yes | Point cloud as [x, y, z] coordinate triples in model units. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely useful beyond-annotation context: the hard precondition of at least three non-collinear finite points, the deterministic nature of the normal, and the fact that it produces parameters rather than geometry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger condition, then states outputs, then the exclusion and the precondition — a sensible order with no filler. The only minor waste is enumerating return fields that the output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter computational tool with full schema coverage, an output schema, and rich annotations, the description covers the trigger, the input provenance, the preconditions, and the scope boundary. An agent has everything needed to call it correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented as [x, y, z] triples in model units, so the baseline is 3. The description still adds meaning the schema cannot: the points must be finite and non-collinear, and they may originate from either scan data or mesh vertices.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fit an orthogonal least-squares plane) against a specific resource (XYZ point-cloud data), and explicitly distinguishes itself from a surface-creation tool: 'Computes parameters only; it does not create a surface body.' An agent can tell this apart from siblings like add_surface or mesh_summary without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger condition ('Use this when you need to fit...') and clarifies input provenance ('points already parsed by the caller from scan data or mesh vertices'), which tells the agent this is not a scanner-reading tool. It does not name an alternative for when the agent actually wants a surface body, leaving that inference implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flatten_patternFlatten Sheet-Metal PatternARead-onlyIdempotentInspect
Use this when you need the unfolded flat pattern of a bent sheet-metal part. Return the unfolded 2D flat-pattern of a bent sheet-metal Shape as a Region (outer polyline + holes + bend lines + sketch plane). Any number of parallel bends; crossing bends need corner relief. Pass { file } or { code }; optional { featureId } to pick a specific Shape.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| file | No | Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| featureId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the geometric result shape and the geometric limitation around crossing bends. It does not cover error behavior or what happens when the Shape is not sheet-metal, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose, the return shape, the geometric constraint, and the input contract, in that order. Nothing is repeated from the schema and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully sketches the Region's composition; the input contract and geometric limits are covered. The remaining gap is the unexplained `code` parameter and no hint about failure conditions, which matters somewhat for a zero-required-parameter tool where input selection is ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% — just the `file` parameter is documented — so the description does real work by stating '{ file } or { code }' mutual exclusivity and explaining that `featureId` picks a specific Shape. However, it never explains what `code` actually is (script source? model code?), leaving one of three parameters opaque in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the unfolded 2D flat-pattern of a bent sheet-metal Shape as a Region'. It also enumerates the Region's contents (outer polyline, holes, bend lines, sketch plane), so an agent knows exactly what operation and output to expect. No sibling tool performs this transformation, and the name/title/description align without redundancy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need the unfolded flat pattern of a bent sheet-metal part' gives a clear triggering condition, and the note that 'crossing bends need corner relief' pre-empts a failure mode. It stops short of naming when-not-to-use or pointing to an alternative tool, but no sibling is a plausible substitute for flattening.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_renderGet Latest RenderARead-onlyInspect
Render a project's current model server-side and return it as an inline image so you can SEE what you built. Prefer open_in_studio for the happy path — it already includes an iso PNG preview in the same publish result when previewDelivered is true. Use this tool for a different view, a contact sheet (view:"all"), or when you only have a slug and are not publishing. Call with that slug to inspect whether the build looks right. CRITICAL — the image is rendered from the MODEL on the server; it does NOT reflect the user's Studio camera, zoom, or screen. NEVER ask the user to rotate, zoom, pan, move the camera, close a slider, or change their view to help you see — you cannot affect their screen and it cannot affect this render. To see a different angle, call this tool again with a different view. By DEFAULT (omit view, or view:"all") it returns a CONTACT SHEET of all six canonical views in one labeled image — a 3×2 grid, top row [iso, front, right], bottom row [back, left, top] — so you can judge the model from every side regardless of its orientation (e.g. to find which side has the doors). Pass a single view (iso/front/back/left/right/top) for one large render of that angle. DETERMINISTIC: the same model + view always returns the same bytes — identical bytes are NOT a stale/lagging snapshot. If you changed the model, push it with open_in_studio FIRST, then re-render to see the change. The image is always current and never a blank capture. Colors and shading match Studio (same palette / base-material color). The slug is the capability: no OAuth for public/unlisted; private projects require the owner signed in. The PNG is base64-inlined as a real image block by default; pass paths_only: true for metadata only. No renderable geometry or a mesh failure → { ok: false, error, hint }, never a blank image. error "mesh_timeout" means the model took too long to build for a preview; the source is not wrong (it still exports) — do not rewrite it to fix the render.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Project slug from open_in_studio/get_project/a /p/<slug> link. The slug is the capability — public/unlisted projects need no OAuth; private projects require the owner to be signed in. | |
| view | No | View to render. Default "all" = a labeled contact sheet of every canonical angle (iso/front/back/left/right/top) — best for judging the whole model. Pass a single view name for one large render of that angle. | |
| paths_only | No | Controls PNG delivery. Default false: base64-inline the rendered PNG so clients that cannot fetch a URL over HTTP (e.g. a sandboxed agent) can still see it. Set true to return only metadata (smaller response). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | Whether a render was produced. |
| hint | No | Next-action hint when ok is false. |
| view | No | The view that was rendered (when ok). |
| bytes | No | PNG byte length (when ok). |
| error | No | Error code when ok is false (e.g. "empty_geometry", "mesh_failed", "mesh_timeout"). |
| width | No | Rendered image edge in px (when ok). |
| height | No | Rendered image edge in px (when ok). |
| image_b64 | No | Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap. |
| truncated | No | Set when inline was requested but the PNG exceeded the size cap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/destructive/openWorld; the description adds substantial context beyond them — determinism of output bytes, that the image reflects the server model and NOT the user's Studio camera, auth rules by visibility, the mesh_timeout error semantics, and the never-blank guarantee. This is exactly the behavioral disclosure the structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the structure moves from purpose to routing to gotchas. It is quite long, and the determinism/camera points are reiterated, but nearly every sentence defends against a distinct real failure mode rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with an output schema present, it covers the operational facts an agent needs: default view behavior, auth-by-visibility, error shapes, and the push-then-render workflow. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely extends the schema: it details the default contact-sheet behavior including the 3x2 grid layout and row ordering, which the enum description only summarizes, and clarifies the paths_only delivery tradeoff. This adds meaning beyond the parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb+resource+outcome: 'Render a project's current model server-side and return it as an inline image.' It also explicitly distinguishes itself from open_in_studio and implicitly from render_preview by naming the conditions under which this tool, not those siblings, is correct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use is given: prefer open_in_studio for the happy path, use this for a different view, a contact sheet, or when you only have a slug and are not publishing. The when-not and the alternative are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_meshGet Model MeshARead-onlyInspect
Return the raw per-feature triangle mesh (positions/indices/normals) of a project's current model, by slug. For the in-chat 3D viewer widget to render geometry; delivered over the MCP Apps bridge. The slug is the capability: public/unlisted need no OAuth; private requires the owner signed in.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Project slug from open_in_studio/get_project. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds beyond by specifying exact return content (positions, indices, normals) and delivery mechanism (MCP Apps bridge). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences cover purpose, usage context, and auth. Front-loaded with the core action, zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single parameter, annotations, and an output schema (not shown), the description fully covers purpose, usage context, auth requirements, and data type. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for 'slug'. Description adds context about slug's role in capability/authorization, which is valuable beyond the schema field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('per-feature triangle mesh') and clearly differentiates from siblings like 'mesh_summary' or 'get_latest_render' by specifying raw mesh data (positions/indices/normals).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the tool is 'for the in-chat 3D viewer widget' and explains auth requirements based on slug visibility. Could be improved by stating when not to use (e.g., if only summary needed, use mesh_summary).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet ProjectARead-onlyInspect
Use this when you need to reopen a saved project or browse what the user has saved — it fetches a kernelCAD Studio project, or lists the signed-in user's saved projects. Pass slug (from a /p/ link or a prior listing) to fetch that project's full .kcad source and metadata — then edit and open_in_studio with the same slug so the user's open tab updates live. Private projects require their owner's OAuth connection. OMIT slug to list the signed-in user's saved projects (most recently updated first); that listing mode requires the OAuth connection and does NOT paint — prefer list_my_projects to find a project to continue. Read-only: this tool never shows a viewer (only open_in_studio does, once per response). Paint phases: projectSaved/meshReady reflect fetch state; viewerPainted stays false. Use open_in_studio (with code) to publish+paint — do NOT call get_model_mesh or get_latest_render for interactive paint.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | The project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | Whether the read succeeded. |
| url | No | Fetch mode: revision-pinned /p/<slug>?version= link. |
| code | No | Fetch mode: the full .kcad source. |
| slug | No | Fetch mode: the project slug. |
| title | No | Fetch mode: the project title. |
| assets | No | Complementary files keyed by source-relative path. |
| meshUrl | No | 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). |
| privacy | No | Fetch mode: the project privacy. |
| version | No | Fetch mode: the project version. |
| embedUrl | No | Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available). |
| meshHint | No | Fetch mode: when meshStatus=building — transient; poll again or re-open_in_studio; never imply permanent 404. |
| projects | No | List mode (no slug): the user's saved projects. |
| meshError | No | Fetch mode: sanitized repair/persist error when meshStatus is failed. |
| meshReady | No | Fetch mode: true only when meshStatus===ready. |
| paintHint | No | |
| meshStatus | No | Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode). |
| parameters | No | Fetch mode: the model's editable parameters. |
| updated_at | No | Fetch mode: last-updated timestamp. |
| serverBuild | No | Deploy identity (package+git SHA@boot time) so connector lag is observable. |
| projectSaved | No | Fetch mode: true when the project was loaded. |
| viewerPainted | No | Always false on tools/call; widget sets true after correlated model_displayed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, destructiveHint=false), but the description goes well beyond them: it discloses that private projects and listing mode require the owner's OAuth connection, that listing mode does not paint, and it explains the paint-phase semantics (projectSaved/meshReady reflect fetch state; viewerPainted stays false). That is unusually rich behavioral context for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and mode selection are front-loaded, but the back half is dense jargon ('Paint phases: projectSaved/meshReady ... viewerPainted stays false') that is hard to parse and would benefit from restructuring. The sentences are information-packed rather than wasteful, but the wall-of-text delivery hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and full annotations, the description needn't explain return values, and it covers both modes, auth requirements, alternatives, and paint behavior. The only gap is that the paint-phase explanation is cryptic rather than clarifying, but functionally an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents that `slug` comes from a listing or /p/<slug> link and that omitting it triggers listing. The description restates this plus the workflow of reusing the slug with open_in_studio, but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetches/lists) and resource (kernelCAD Studio project / signed-in user's saved projects), and explicitly names the sibling it differs from (list_my_projects, open_in_studio, get_model_mesh, get_latest_render). An agent can distinguish the two modes and route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use for both modes: pass `slug` to fetch, OMIT it to list, and it names the preferred alternative for listing ('prefer list_my_projects'). It also states the downstream workflow (edit then open_in_studio with the same slug) and gives a negative instruction ('do NOT call get_model_mesh or get_latest_render for interactive paint').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_revisionGet Project RevisionARead-onlyInspect
Fetch the exact immutable .kcad source and parameters captured at a prior open_in_studio version. Use this to read-after-write verify a release: pass the returned slug and version, then hash or inspect the returned source. Public/unlisted projects use the slug as capability; private projects require the owner's OAuth connection.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Project slug returned by open_in_studio. | |
| version | Yes | Positive immutable revision version returned by open_in_studio. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the revision was found and readable. |
| code | Yes | Exact .kcad source captured at this revision. |
| slug | Yes | Project slug. |
| title | No | Title captured with this revision. Absent on revisions snapshotted before titles were stored. |
| assets | No | Immutable complementary-file manifest. |
| version | Yes | Immutable revision version. |
| parameters | Yes | Exact editable parameters captured at this revision. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint, so safety is covered; the description adds real value beyond them by disclosing the access model — public/unlisted use slug as capability while private projects require the owner's OAuth connection. It also emphasizes immutability of the returned revision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place: the first defines the resource and scope, the second gives the workflow and the access caveat. Front-loaded and free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained; the description still hints at what to do with the result ('hash or inspect'). Auth requirements and input provenance are covered, leaving little an agent needs missing before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both params are already documented with provenance and constraints. The description reinforces that the slug/version come from open_in_studio but adds no format or syntax meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('the exact immutable .kcad source and parameters'), scoped to a prior open_in_studio version. This clearly separates it from get_project and get_latest_render, which return current/other artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context: 'Use this to read-after-write verify a release' and ties the slug/version inputs back to open_in_studio. It stops short of naming a mutually exclusive alternative for other retrieval needs, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_selectionGet SelectionARead-onlyIdempotentInspect
Use this when you need to read the human/agent selection in a local Studio session. Returns one clicked face or edge (or null), with current-generation mesh-local shapeIndex/kind/id and creating featureId. During a rebuild selection is null with “selection pending rebuild” until Studio uniquely verifies the face; ambiguous or deleted faces are cleared. Inspect the current shape before authoring a fillet. Requires a running local Studio opened on the same script; hosted sessions are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | Studio sessionToken from GET /__kernelcad/session?script=<path>. Use the same script as the viewer. | |
| studio_url | Yes | Local Studio HTTP origin, e.g. http://localhost:5173. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: what is returned (one face/edge or null), the rebuild-pending null state, that ambiguous/deleted faces are cleared, and that a running local Studio on the same script is required. This is exactly the extra behavioral context the bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then return semantics, then prerequisites. Every sentence carries information, though the rebuild/pending detail is dense and could be slightly trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still preempts surprises (null during rebuild, cleared ambiguous faces) and states the local-session prerequisite. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented there, so the baseline is 3. The description reinforces "same script" and local-only constraints but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (human/agent selection) in a local Studio session, and the contrast with the sibling set_selection is obvious. An agent can distinguish this reader from its writer counterpart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need to read the human/agent selection" plus "Inspect the current shape before authoring a fillet" gives clear usage context, and the hosted-session exclusion is stated. It stops short of naming set_selection as the explicit alternative for writes, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_stepImport STEPAIdempotentInspect
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 .kcad.ts whose base body is lib.fromSTEP / lib.fromSTL into output_dir (default: a fresh temp dir), evaluates it, and returns { ok, format, model_path, script_path, code, bbox }. Pass script_path as { file } to evaluate_script, add_feature, dfm_review, export and the other tools, or edit code to build on the body. STL is a mesh: booleans, bbox and export work, but faces stay planar facets (use mesh_to_features for an editable feature tree). A non-watertight STL is refused unless allow_open is true.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public https URL that downloads the .step/.stp/.stl file directly. | |
| name | No | Base name for the written files. Default 'imported'. | |
| format | No | Override format detection. | |
| upload | No | ChatGPT file reference for a file the user attached. | |
| file_name | No | Original file name, used for format detection. | |
| allow_open | No | STL only: accept a non-watertight mesh as an open shell. | |
| output_dir | No | Where to write the file and starter script. Default: a new temp directory. | |
| content_base64 | No | The file bytes, base64-encoded (small files). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, openWorld, idempotent, and non-destructive, but the description adds substantial context: it writes files plus a starter script to output_dir (default temp dir), evaluates it, refuses non-watertight STL unless allow_open, and enforces a 50 MB limit. What is missing is any note on auth/network failure behavior for url downloads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, opening with the trigger condition and then the source constraint. It is long, yet nearly every clause carries operational weight; a couple of the return-shape details are arguably redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers input constraints, side effects (file and script written), STL-specific caveats, the downstream handoff of script_path, and the return shape. For a complex import tool with nested upload objects, this is complete enough to call correctly without further guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value: 'give exactly one source' clarifies the mutual exclusivity of url/upload/content_base64 that the schema does not enforce, and it documents the 50 MB cap and format auto-detection vs override.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (import a STEP/STL file the user designed elsewhere or a vendor model) and produces named artifacts. It clearly differs from siblings like find_part/fetch_part, which retrieve catalog parts, and mesh_to_features, which it references for editable meshes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (user's own STEP/STL file) and gives the alternative condition for STL meshes (use mesh_to_features for an editable feature tree). Also names the three mutually exclusive source inputs and the size cap, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectInspect ModelARead-onlyIdempotentInspect
Use this when you need to read facts about a model. One reader, selected by of:
'assembly' — physical assembly inventory (parts, bboxes, connectors, mates, disconnected solids).
'robot' — URDF/SDFormat export preview (links, joints, planning groups, end-effectors, issues).
'step' — inspect an imported STEP file: solid tree, exact bbox/volume, cylindrical holes (breached bores flagged partial; holeDetection: 'exact' | 'heuristic').
'shape' — volume / surfaceArea / bbox for one feature ({ feature_id? }).
'mass' — mass, centre of mass, centroidal inertia tensor (inertia6 + 3x3 inertiaMatrix), principalMoments/principalAxes, symmetry flags, and optionally the radius of gyration about an arbitrary axis ({ feature_id?, density?, gyration_axis? }); density in kg/m^3, defaults to 1000 (water).
'features' — features captured by the script (kind, id, params, transforms, suppression).
'assemblies' — assembly intent (assemblies, parts, connectors, joints).
'topology' — canonical face names + edge count for a feature ({ feature_id? }).
'edges' — edges of a shape with optional EdgeQuery ({ feature_id?, query? }); returns @kc[...] refs.
'face-edges' — boundary edges of a named canonical face ({ feature_id?, face_name }).
'faces' — faces of a shape with optional FaceQuery ({ feature_id?, query? }); returns @kc[...] refs.
'face-labels' — user-applied labels visible in the script.
'mates' — mates captured by the script.
'constraints' — sketch constraints captured by the script.
'part-stats' — bundled parts-catalog statistics.
'bend-table' — sheet-metal bend table for a flattened pattern.
'params' — declared model parameters.
'part-categories' — top-level part-catalog categories available in the bundled (and configured remote) catalog.
'part-families' — part families within a category ({ category? }); count + exemplar ids per family.
'bom' — bill of materials ({ assembly? }): one row per distinct part (grouped by geometry/catalog identity, not name) with real instance quantity, kind ('fabricated'|'purchased'), material, density, per-unit and total mass, bbox, a fabrication process (
process+processSource), 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? } }).
stackscans evenly spaced slices and returnsminAreaIndex/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? }).
'multi-material' — explicit material leaves shadowed by later attributed boolean descendants, with assembly-part rewrite templates; analyzes capture records and does not change mesh attribution. All params except
ofare subject-specific and forwarded verbatim. Most subjects accept { file | code }. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | of:'section' — single slice position along `axis` (mm). | |
| of | Yes | Which facts to read. | |
| axis | No | of:'section' — normal axis for `at` / `stack` (default 'z'). | |
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine. | |
| edges | No | of:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled. | |
| faces | No | of:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled. | |
| plane | No | of:'section' — section plane. Either a cardinal name string 'xy'|'xz'|'yz', { plane: 'xy'|'xz'|'yz', offset? }, or { origin: [x,y,z], normal: [nx,ny,nz] }. Omit to use `at`+`axis`. | |
| query | No | of:'edges'|'faces' — optional EdgeQuery/FaceQuery filter. | |
| stack | No | of:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition. | |
| density | No | 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. | |
| assembly | No | of:'assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly. | |
| category | No | of:'part-families' — optional top-level category to filter families by. | |
| face_name | No | of:'face-edges' — canonical face name (required for that subject). | |
| feature_id | No | of:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape. | |
| spike_factor | No | of:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6). | |
| gyration_axis | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses many behavioral details: each subject's return content, partial bore flagging, exact vs heuristic hole detection, density defaults and echo behavior, multi-material's non-mutating analysis, and hosted file input restrictions including the 25 MB limit. This is rich context that helps an agent invoke the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is justified by 24 distinct `of` modes and 17 parameters. It is front-loaded with the core purpose and then organizes each mode as a tight bullet, with hosted file guidance placed at the end. Every segment appears to earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 17 parameters, enum-based dispatch, and rich output schema, the description is complete enough for an agent to choose a mode and understand the relevant constraints. The output schema can carry return-shape details, and the description still supplements it with key caveats and hosted input rules.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the 17 parameters thoroughly. The description still adds value by explaining that most subjects accept `{ file | code }`, that all parameters except `of` are subject-specific and forwarded verbatim, and by clarifying cross-parameter behavior for modes like `section`, `bom`, and `mass`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'read facts about a model', selected by the `of` enum. It enumerates each inspection subject precisely, so an agent knows what the tool does. However, it does not explicitly distinguish this tool from nearby read-oriented siblings such as `query`, `verify`, `inspect_nurbs`, `mesh_summary`, or `get_model_mesh`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context ('Use this when you need to read facts about a model') and explains the condition for each `of` mode, including a specific note that `stack` helps find the thinnest cross-section. It does not provide when-not-to-use guidance or name sibling alternatives, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_nurbsInspect NURBS CurveARead-onlyIdempotentInspect
Evaluate supplied kernelCAD code or a file to capture an authored NURBS curve (nurbsCurve/spline3d). Returns degree, distinct knots and multiplicities, poles, weights, rational and uniformWeights flags, hasNonUnitWeights, and parameter range. Defaults to the last captured curve in that script; pass feature_id to choose one. The source may load referenced assets. Reports authored curve data, not exact geometry-derived B-rep edge/face NURBS; surface extraction and blending are not supported. Does not update the active MCP session or write a project.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| feature_id | No | Optional curve3d FeatureId; defaults to the last captured NURBS curve. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and openWorld; the description adds non-obvious behavioral context that the source 'may load referenced assets' (the openWorld risk) and that it 'does not update the active MCP session or write a project' (a state-effect nuance annotations can't express). These are genuine additions beyond the annotations, though permission/auth or performance characteristics are unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return payload, then layers defaults, capability limits, and side-effect boundaries. It is dense but nearly every sentence carries distinct information; the return-field enumeration is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, yet it still summarizes them, and it covers scope limits and non-mutation. A small gap remains: with zero required parameters it isn't stated what happens if neither `code` nor `file` is supplied and no prior capture exists, leaving a mildly ambiguous invocation path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the hosted-server caveat for `file` and the default for `feature_id`. The description reinforces the default-curve selection semantics but adds no format or constraint detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (evaluate/inspect) and resource (authored NURBS curve from kernelCAD code or file), and enumerates exactly what is returned (degree, knots/multiplicities, poles, weights, flags, parameter range). It also explicitly bounds scope away from geometry-derived B-rep edge/face NURBS and surface/blend extraction, so an agent can distinguish it from surface and inspection siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection behavior ('defaults to the last captured curve in that script; pass feature_id to choose one') and explicit exclusions ('surface extraction and blending are not supported', 'not exact geometry-derived B-rep'). It does not compare against the similarly named `inspect` or `evaluate_script` siblings, so the routing guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_apiLook Up APIARead-onlyIdempotentInspect
Use this when you need to list the kernelCAD script-runtime surface: global functions (box, path, selectEdges, helix, etc), Shape methods (fillet, sweep, lower, etc), Sketch methods (extrude, revolve, sweep), PathBuilder methods, EdgeQuery/FaceQuery key sets, and featureKindFaceLabels (which globals accept opts.faceLabels and valid value shapes). Use this to discover what is callable from a .kcad.ts script. Call this BEFORE concluding kernelCAD lacks a capability — its NURBS freeform surfacing (loft, sweep, boundary-fill, G2 blend) is easy to miss from tool names alone.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds real context beyond that: it is a discovery reference, it enumerates the categories returned, and it warns that NURBS freeform surfacing is easy to miss from tool names — a genuine usage caveat. Return formatting is left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the when-to-use condition, then the inventory, then the discovery warning. The parenthetical method lists ('box, path, selectEdges, helix, etc') are slightly padded but each category name does convey scope. Overall dense with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and a fully documented single parameter, the description carries only the burden of purpose and routing — and it handles both except for sibling differentiation among the lookup_* family. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'intent' parameter is documented thoroughly in the schema itself. The description says nothing about the parameter, so it adds no meaning beyond structured fields; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and enumerates the surface it returns (globals, Shape methods, Sketch methods, PathBuilder, EdgeQuery/FaceQuery, featureKindFaceLabels), which is far more than a restatement of the title. It does not, however, distinguish itself from the other lookup_* siblings (lookup_authoring_skill, lookup_cookbook, lookup_diagnostics), so an agent must still guess which reference lookup to open.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering conditions: 'Use this when you need to list the kernelCAD script-runtime surface' and 'Use this to discover what is callable from a .kcad.ts script', plus a strong prior: 'Call this BEFORE concluding kernelCAD lacks a capability.' It lacks explicit routing to the alternative lookup tools, which is the one missing piece.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_authoring_skillLook Up Authoring SkillARead-onlyInspect
Return the kernelcad-authoring skill — conventions for writing .kcad.ts scripts (API surface, parameters, evaluation contract, common pitfalls) — in sections.
Call with NO arguments first: you get the quick-start (units, axes, the return rule, the rules that prevent most failures, the intent → API routing table, the "Before you finish" checklist) and an index of every section with a one-line summary (under 16k chars). Then pull what you need: { section: "<id>" } returns one section (e.g. "top-level-functions", "materials", "dfm-gates-print-readiness"); { query: "fillet after subtract" } returns the best-matching sections. { section: "all" } returns the full ~140k-char skill (SKILL.md plus its reference files) — only if your client accepts large responses.
Clients that list resources can also read kernelcad://skills/authoring (the SKILL.md core).
OUTPUT: { uri, mimeType, mode, text, sections? } — mode is index | section | search | all | not-found.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Keywords to search section titles and bodies (e.g. "sweep along helix"). | |
| topic | No | Alias of section; also accepts a loose title such as 'materials' or 'cli commands'. | |
| section | No | Section id from the index (e.g. 'top-level-functions'), or 'all' for the full skill. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive-safe behavior, and the description goes well beyond them: response-size expectations (index under 16k chars, full skill ~140k chars), the caveat that 'all' should only be used if the client accepts large responses, the exact mode values the response can take, and the resource URI alternative. This is rich operational context not derivable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and the progressive-disclosure workflow, with the output-shape and resource notes trailing. Dense and mostly waste-free, though the OUTPUT line and resource mention are slightly redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with an output schema, annotations, and 100%-covered parameters, the description supplies everything an agent needs: what is returned, how to page through it, size limits, and fallback access paths. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema by explaining the no-argument default behavior, the special `section: "all"` value, the search-vs-section distinction, and worked examples ('fillet after subtract', 'top-level-functions'). It stops short of exhaustively documenting every section id — that is left to the returned index.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — returns the kernelcad-authoring skill, described precisely as conventions for writing .kcad.ts scripts (API surface, parameters, evaluation contract, pitfalls). The scope is unambiguous and distinct from lookup_api/lookup_cookbook/lookup_diagnostics, which cover different reference corpora.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the calling sequence: 'Call with NO arguments first' to get the quick-start and index, then pull specific sections via `{ section: "<id>" }`, search via `{ query: ... }`, or fetch everything via `{ section: "all" }`. It also names the resource-read alternative for clients that support it. This is genuine when/how-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_cookbookLook Up CookbookARead-onlyIdempotentInspect
Use this when you need a canonical pattern snippet for a CAD task. Search the kernelCAD cookbook for canonical pattern snippets. Returns top-k snippets matching the natural-language query, ranked by BM25 over title/tags/keywords/trigger. Use when you need a canonical pattern for fillet-after-subtract, non-overlapping booleans, sketch-to-extrude flows, etc. Returns empty if no snippet scores above the relevance floor — proceed without cookbook help in that case.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Max snippets to return. Default 3, max 5. | |
| id | No | Exact snippet id as the skills cite it (e.g. "clearance-hole-through-plate"); returns that snippet. An unknown id is ranked as a query. | |
| query | No | Natural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket"). One of query / id is required. | |
| intent | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral context: BM25 ranking over title/tags/keywords/trigger, a relevance floor, and that empty results mean the agent should proceed without cookbook help.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the triggering condition and no wasted preamble, but 'canonical pattern snippet' is repeated three times across the passage, which is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formatting needn't be spelled out; the description still covers ranking, the empty-result case, and when to reach for the tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (k, id, query, intent) is fully documented in the schema. The description only reinforces 'top-k' and 'natural-language query', adding little beyond the structured fields, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: search the kernelCAD cookbook for canonical pattern snippets, ranked by BM25. Clear enough to distinguish from execute_cookbook (which runs a snippet) and lookup_api, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('when you need a canonical pattern snippet for a CAD task') plus concrete examples (fillet-after-subtract, non-overlapping booleans, sketch-to-extrude) and a fallback for empty results. No explicit exclusions or named alternatives, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_diagnosticsLook Up DiagnosticsARead-onlyIdempotentInspect
Use this when you need the kernelCAD 26-code diagnostic catalogue with hint templates. Tiny one-shot call; useful for an agent that wants to pre-populate retry strategies. Hints are also inline on every emitted diagnostic — this tool just gives you the canonical list up front.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the description only needs to add what they don't say — and it does, by declaring the corpus is fixed at 26 codes, the call is tiny and one-shot, and the payload duplicates hints already embedded in diagnostics. No return-shape detail, but an output schema exists to carry that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the usage trigger and closing on the differentiation from inline hints. Mild redundancy between "Tiny one-shot call" and "just gives you the canonical list up front," but nothing that wastes real space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only lookup with an output schema and full annotation coverage, the description covers what it returns (26 codes and hint templates) and why it exists (pre-populating retry strategies). Only the static/versioned nature of the catalogue is left unstated, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters; the schema is empty and there is nothing to disambiguate. The description's note that it is a "one-shot call" reinforces that no arguments are needed, which is the right level of detail here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource: the kernelCAD 26-code diagnostic catalogue plus hint templates. It is clearly distinguished from the other lookup_* siblings by scope (codes, not API/cookbook/skills), though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need..." sets the trigger, and "Hints are also inline on every emitted diagnostic — this tool just gives you the canonical list up front" supplies an implicit when-not: don't call it just to interpret a single diagnostic you already have. It stops short of naming a concrete alternative tool such as why_did_this_fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mesh_booleanCombine Meshes (Boolean)AIdempotentInspect
Use this when the user wants to union, subtract, or intersect two imported triangle mesh solids (STL, OBJ, or 3MF). Supports union, subtract (A minus B) and intersect. Pass each operand as { file } on the MCP server or { data } with base64 mesh bytes; formats are detected or may be specified. Returns volume in mm³, triangle count and a binary STL as data_base64; pass that payload to import_step to continue modeling. Inputs must be closed, consistently oriented 2-manifold meshes. Open, non-manifold, or invalid meshes return an error. This computes mesh geometry and does not create an editable B-rep feature tree.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | First mesh: { file } or { data } base64, optional format stl|obj|3mf. | |
| b | Yes | Second mesh: { file } or { data } base64, optional format stl|obj|3mf. | |
| operation | Yes | ||
| toleranceMm | No | Vertex weld tolerance in mm. Default 0.000001. | |
| maxTriangles | No | Maximum triangles per input and output. Default and maximum 100000. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the exact return payload (volume in mm³, triangle count, binary STL as data_base64), the input validity contract (closed, consistently oriented 2-manifold; open/non-manifold inputs error with a message), and the key limitation that no editable B-rep tree results. These are exactly the behaviors an agent needs and are not encoded in readOnlyHint/destructiveHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger, then operand format, return payload, and validity constraints in a logical order with no filler. It is dense and runs long, but every sentence carries actionable information, so it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with nested operands and an output schema, the description covers the trigger, operand encoding, output shape, downstream handoff, and failure conditions. Even though an output schema exists, restating the return payload is warranted here because it names the data_base64 handoff target.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaningful semantics over the schema: explains the { file } vs { data } base64 alternatives, format auto-detection vs specification, and clarifies subtract direction as 'A minus B'. toleranceMm and maxTriangles are left to the schema, but with 80% coverage that gap is covered, so this is above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation set (union/subtract/intersect) on a specific resource (imported triangle mesh solids in STL/OBJ/3MF). The closing sentence distinguishes it from B-rep feature creation, so an agent can separate it from siblings like mesh_to_features or add_feature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use this when the user wants to union, subtract, or intersect two imported triangle mesh solids'), which is a clear use case. It also implies the handoff path to import_step. It stops short of naming an explicit when-not or naming the sibling to use for editable B-rep modeling, so it is clear context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mesh_summarySummarize Mesh GeometryARead-onlyInspect
Mesh a kernelCAD .kcad.ts source server-side and return a COMPACT geometry summary — overall bounds plus, per feature, its id, kind, triangle count, and bounding box.
Use this to INSPECT a model's geometry without a viewer: confirm a part is the size/shape you expect, see how many triangles each feature contributes, or check that every feature produced geometry. This runs the full server-side OCCT pipeline (the same one the Studio renderer uses), so it evaluates modern sources (assembly, path, .material, …) that the legacy client worker cannot.
INPUT: source (required) the .kcad.ts script text; fileName (optional) a label for diagnostics; params (optional) a map of parameter-name → number overrides applied before meshing (stateless slider recompute).
OUTPUT: { ok, bounds, featureCount, features: [{ id, kind, triangleCount, bbox: { min:[x,y,z], max:[x,y,z] } }], failedFeatureIds, diagnostics }. ok is true when every feature meshed; failedFeatureIds lists features that failed to compile (and ok is then false). Raw vertex/index/normal arrays are NEVER returned — this is a summary only. To SEE the rendered model, call open_in_studio (includes PNG preview + viewer); use get_latest_render only for alternate views.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | Optional map of parameter-name → numeric value, applied as overrides before meshing (stateless slider recompute). | |
| source | Yes | The .kcad.ts script source to mesh. | |
| fileName | No | Optional file-name label used in diagnostics (does not affect geometry). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/destructive/openWorld), and the description adds substantial context beyond them: it runs the full server-side OCCT pipeline (not the legacy client worker), it supports modern sources, it states failure semantics (ok=false and failedFeatureIds lists non-compiling features), and it explicitly guarantees raw vertex/index/normal arrays are never returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then INPUT and OUTPUT are cleanly delineated, and the routing note is placed at the end. It is somewhat long and the params/fileName lines duplicate the schema, but no sentence is wasted given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema, nested params, and annotations, the description covers purpose, usage routing, failure semantics, and the exact output shape. An agent has everything needed to call it correctly and interpret the result; nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented. The description's INPUT section largely restates the schema (source text, fileName diagnostic label, params stateless slider override) with minimal added meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (mesh/summarize) and resource (.kcad.ts source → geometry summary) and enumerates exactly what the return contains (overall bounds, per-feature id/kind/triangle count/bbox). It clearly distinguishes itself from siblings like get_model_mesh and open_in_studio, so an agent can select it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use cases (inspect geometry without a viewer, confirm size/shape, count triangles per feature, verify every feature produced geometry) and names the alternatives with the condition that selects them: open_in_studio to SEE the render, get_latest_render only for alternate views.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mesh_to_featuresFit Features to MeshARead-onlyInspect
Use this when you are handed an STL, OBJ or 3MF of a mostly prismatic mechanical part (plate, bracket, spacer, flange, housing block) and need an EDITABLE kernelCAD model of it rather than a faceted lib.fromSTL import. Deterministic, measured, self-verifying: it welds and checks the mesh, segments planes and cylinders, picks the extrusion axis, slices each band and fits exact lines / arcs / circles, snaps near-round values (each snap recorded), then emits a readable .kcad.ts with named param()s — a revolve for concentric round stacks, extruded profiles otherwise, .hole()/.holes() for through, blind and counterbored bores (axial and side-drilled), .cutout() for pockets, .fillet() for constant-radius edge blends (radius measured on the sharp edge, edges grouped by radius and picked with the shortest exact edge query), boolean subtractions for what no drilling feature can reach. It then EVALUATES that script and compares it with the mesh: volume IoU (column ray casting) and symmetric surface deviation (max + RMS), over up to 4 refinement passes. Returns { script, ledger, fidelity: { maxDeviationMm, rmsMm, volumeIoU, verdict: faithful | approximate | failed, thresholds }, unmatchedRegions, features, passes }. A fillet or sharp reading is kept by which measures better; variable-radius blends and chamfers are reported, not forced. The verdict is computed from the numbers — faithful needs IoU >= minIoU AND max deviation <= maxDeviationMm AND a watertight mesh AND no unmatched region. Freeform surfaces, tilted planes and side bosses are listed in unmatchedRegions (reference.mesh.freeform-region-unmatched), never silently dropped. The ledger uses fact ids equal to param names, so resolve_assumptions on the written .ledger.json yields paramOverrides for set_param. Pass { out } to write the script and ledger; the mesh itself is never modified. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Write the emitted script to this .kcad.ts path and the assumption ledger to the sibling .ledger.json. | |
| data | No | Mesh bytes as base64 — use when the server cannot see your filesystem. | |
| file | No | Path to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine. | |
| format | No | Format override; default from the extension or the content. | |
| minIoU | No | Volume IoU a faithful verdict requires. Default 0.98. | |
| maxPasses | No | Refinement passes, 1–4. Default 4; stops early at the first faithful pass. | |
| maxTriangles | No | Refuse meshes above this triangle count instead of stalling. Default 300000. | |
| maxDeviationMm | No | Max surface deviation (mm) a faithful verdict allows. Default max(0.25, 0.1 % of the bbox diagonal). | |
| weldToleranceMm | No | Vertex weld distance in mm. Default max(1e-4, 1e-6 × bbox diagonal). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Behaviourally the description is extremely candid (pipeline stages, deterministic self-verification, verdict thresholds, early stop, refusal above maxTriangles, mesh never modified). However, it explicitly says 'Pass { out } to write the script and ledger', which conflicts with the declared readOnlyHint=true; because that contradiction is material to how an agent judges side effects, the otherwise-rich disclosure is penalised.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage trigger, but the body is one very long sentence piling the whole pipeline, output shape and verdict logic together, plus a dense tail on ledger integration. Every claim is relevant, yet the wall-of-text form makes it harder to scan than it needs to be; bullet or sentence breaks would cost nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, multi-stage tool this covers what an agent must know: input modes, what is produced, the fidelity verdict definition, failure handling (unmatchedRegions) and the downstream handoff (resolve_assumptions → set_param). An output schema exists, so the enumerated return fields are redundant but the verdict semantics still add real value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds meaning beyond it — `out` writes the script plus a sibling .ledger.json, the ledger's fact ids equal param names so resolve_assumptions yields paramOverrides for set_param, and the file input accepts URL/data URI/asset:<id> on hosted servers. Threshold parameters (minIoU, maxDeviationMm) are also tied to the concrete verdict rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (fit features to a triangle mesh and emit an editable kernelCAD script) and scopes it to concrete inputs (STL/OBJ/3MF of mostly prismatic mechanical parts). It explicitly contrasts with the sibling behaviour it is not ('rather than a faceted lib.fromSTL import' / import_step), so an agent can pick it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use this when you are handed an STL, OBJ or 3MF of a mostly prismatic mechanical part and need an EDITABLE kernelCAD model') and names the excluded case (freeform surfaces, tilted planes, side bosses go to unmatchedRegions). It also tells the agent how to supply input on a hosted server (https URL, data: URI, asset:<id>), which is the real routing decision for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_in_studioOpen in StudioAInspect
Save the model as a kernelCAD project AND show it: persists a project revision, returns the interactive Studio viewer (MCP Apps / ChatGPT outputTemplate), and includes a PNG preview in the SAME tool result (image content + previewUrl when available). ONE VIEWER PER PROJECT PER RESPONSE: every call renders a new viewer card. Do all validation with evaluate_script first, then call open_in_studio exactly once, after validation succeeds; reuse the returned URL, revision and preview, and never call it again after a successful result in the same response. Re-calling with unchanged code for the same project returns that revision instead of writing a new one. A heavy model can answer status:"running" (code tool.still-running) before the client times out; that is NOT a success: call open_in_studio again with exactly the same arguments, which joins the running save and returns its result. CONTINUE, DO NOT DUPLICATE: to change a model you already saved, pass project: '<slug>' from the last result (or from list_my_projects) — this adds a revision to that project. Without project, the save goes to the project this chat already saved, or to your project with the same title (case, punctuation and v2/rev3/(1) ignored) from the last 24 h. Views, poses, colours and options of one design are revisions of ONE project — keep the same title and slug. Pass new_project: true only when the user wants a separate design. A different cookbook (execute_cookbook, or open_in_studio of that cookbook's unchanged source) starts its own project; pass project to add a revision, or continue_design: true to keep revising the design this chat is already saving. The result starts with the slug to pass next time, a /p/?version= link for this revision, and that revision's title. Use this when the user wants to SEE or share the model — do NOT call get_latest_render afterwards for the happy path; the preview is already here when previewDelivered is true. Pass the full .kcad source as code (optional if you just called evaluate_script — 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. A broken mechanism verdict alone does NOT refuse: the revision is saved, Studio shows "Mechanism broken", and the result returns mechanismSummary (statement, maxLevel, failures with the joint). Tell the user the mechanism is broken; do not call it working. 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. Status fields: ok=true means the project revision was saved (projectSaved=true). meshSaved reports whether its display mesh is persisted; meshStatus=failed means meshSaved=false, but the saved project remains usable for geometry checks. Do not claim its 3D viewer is 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, open_in_studio waits up to ~20s (OPEN_IN_STUDIO_MESH_SYNC_BUDGET_MS) for the revision mesh before returning; heavier publishes usually land meshStatus=ready. If still meshStatus=building + meshReady=false: TRANSIENT — meshUrl is the expected CDN pin; embed retries 404s. Poll get_project({slug}) until ready (it shows no viewer) — do not re-call open_in_studio, and never treat building as permanent failure/404. 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. 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. Pass include_preview:false to skip the rasterizer (save + viewer URLs only). Trigger phrases: "open it in Studio", "let me see it", "show me the model"; also call once after you finish a build, and once per response 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. 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. MARK & FIX: a user message starting Edit kernelCAD project <slug> (revision N): "<note>". Targets: #1 feature "<id>" ... comes from pins the user tapped in the viewer. Feature/part ids are the script's own feature and part names (assembly part names, named shapes); points are world mm. Call get_project with that slug, change only the named features near those points, keep everything else, then open_in_studio with project set to the same slug. Hosted: lib.fromSTEP / fromSTL / meshFromSTL / fromDXF / fromSVG and referenceImage take a direct string literal or a const bound to one (computed expressions are unsupported). They accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | The full .kcad source of the model to open in Studio (the script you have been editing). Optional: omit to reuse the source from your most recent evaluate_script call. | |
| slug | No | Older name for `project`. Use `project`. | |
| title | No | Optional human-readable title for the model (shown in Studio). Defaults to "Model from Claude". | |
| intent | No | 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. | |
| wheels | No | Wheel centres + radii for likeness gate [{ center:[x,y,z], radius }]. | |
| project | No | Slug of the project to update (from the last open_in_studio result, a "Saved to your projects" note, list_my_projects, or a /p/<slug> link). Adds a new revision to that project instead of creating a new one, and live-updates the user's open Studio tab. | |
| body_bbox | No | Body AABB { min:[x,y,z], max:[x,y,z] } mm — for likeness_profile gate when no session attest. | |
| anon_token | No | 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. | |
| cabin_bbox | No | Optional cabin AABB for likeness gate. | |
| parameters | No | Optional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params. | |
| attachments | No | Complementary project files referenced by relative path from the .kcad source. | |
| new_project | No | Pass true only when the user wants a separate, new design. Default: continue this chat's project, or your project with the same title from the last 24 h. Still wins over a matching title or cookbook. | |
| require_stills | No | Forwarded to body-likeness gate (default true). | |
| still_verdicts | No | Agent still checklist for likeness gate [{ code, passed, finding, view? }]. | |
| continue_design | No | Pass true to add a revision to the design this chat is already saving, even when this call is a different cookbook or title. Ignored when `project` is set. | |
| include_preview | No | 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. | |
| likeness_profile | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | Whether the project revision was saved (same meaning as projectSaved). A failed display mesh does not make this false; inspect meshSaved and meshStatus. |
| url | No | Revision-pinned /p/<slug>?version= Studio link for the revision this call saved. |
| slug | No | The project slug. Pass it back as `project` to save the next change to this project. |
| title | No | Title stored for this revision (not a later revision of the same project). |
| animUrl | No | CDN transforms-only animation bake URL when the script declares animationView(). ChatGPT embed Play/scrub uses this — no live session remesh. |
| meshUrl | No | Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed. When meshStatus is building, this is the expected CDN URL (retry until ready). |
| updated | No | True when an existing project was updated; false when a new one was created. |
| version | No | Immutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version. |
| embedUrl | No | Read-only, chrome-free /embed/<slug> viewer URL — drop into an <iframe> to embed the live model in any site or widget (no login). Includes meshUrl when a revision mesh artifact is available. |
| meshHint | No | 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. |
| meshError | No | Sanitized persist/repair error when meshStatus is failed. |
| meshReady | No | True only when meshStatus===ready. building+meshUrl means embed is still polling. |
| meshSaved | No | Whether the revision display mesh is persisted. False while building or after meshStatus:failed. |
| paintHint | No | Agent guidance: do not claim interactive paint until viewerPainted. |
| meshStatus | No | ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode). |
| previewUrl | No | HTTPS URL of the PNG preview when storage signed successfully. |
| project_id | No | Stable project UUID for collaboration tools such as join_project. |
| assetHashes | No | |
| previewHint | No | |
| previewView | No | |
| serverBuild | No | Deploy identity so connector vs server mismatch is observable. |
| hasAnimation | No | True when animUrl is present (animationView timeline baked at publish). |
| previewBytes | No | |
| previewWidth | No | |
| projectSaved | No | True when the project/revision was persisted. Not the same as viewerPainted. |
| project_note | No | Which project was updated or created, its URL, and how to keep working on it. |
| previewCached | No | |
| previewHeight | No | |
| previewStatus | No | included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false. |
| viewerPainted | No | Always false on tools/call. The Studio widget sets viewerPainted:true via updateModelContext after a correlated model_displayed ack. |
| attachmentCount | No | |
| mechanismSummary | No | Mechanism verdict of the saved code (same as evaluate_script mechanismSummary), stored with the revision for the Studio badge. maxLevel error = "Mechanism broken" (saved anyway; statement names the joint), warning = "Motion not checked", ok = "Motion checked". Absent for a static model. |
| previewDelivered | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false, destructiveHint=false, and openWorldHint=true; the description adds extensive behavioral context beyond that: it persists a project revision, returns viewer/preview artifacts, may return status running for heavy models, has idempotent re-call behavior, waits up to ~20s under CDN, and reports projectSaved/meshSaved/meshStatus/previewDelivered/viewerPainted semantics. It also discloses that broken-mechanism verdicts do not refuse the save and that meshStatus=failed leaves the project usable for geometry checks. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core save-and-show behavior, but it is an extremely long runbook with repeated warnings ('do not call get_latest_render', 'do not re-call open_in_studio'), status-field minutiae, CDN timing budgets, connector taxonomy, hosted import syntax, and mark-and-fix message parsing. Much of this is operationally useful, but the lack of structure and sheer length make it hard to scan and likely exceed what the description should carry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 17 parameters, annotations, and the presence of an output schema, the description is complete enough to call it correctly: it covers prerequisites, project-vs-new-design behavior, mesh/preview status semantics, idempotency, and important failure modes. Nothing critical for selecting or invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 17 parameters. The description adds meaningful semantics beyond the schema for the most consequential routing parameters: project adds a revision to an existing project, new_project is only for a separate design, continue_design is ignored when project is set, code can be omitted to reuse evaluate_script source, and include_preview=false skips rasterization. It does not add much for parameters, attachments, anon_token, intent, or the likeness-gate fields, leaving those to the already-complete schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific compound action: save the model as a kernelCAD project and return an interactive Studio viewer with a PNG preview in the same result. It clearly distinguishes this from evaluate_script (validation only) and get_latest_render/get_model_mesh (which it explicitly says not to use for the happy path). An agent can tell exactly what this tool does and what it produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes the sequence: validate with evaluate_script first, then call open_in_studio exactly once, reuse the returned URL/revision/preview, and never re-call after success in the same response. It names alternatives and exclusions ('do NOT call get_latest_render afterwards', 'do not re-call open_in_studio' while mesh is building) and explains when to pass project, new_project, or continue_design. Trigger phrases and iteration guidance are also included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
order_partOrder PartAInspect
Order the part made: creates the production request and returns a pay_url for the user. Propose the manufacturing method from the user's words and the part, pass it as method with a one-line reason. The price is the real maker price; never invent or send one. Tell the user the card is only held, and a person confirms the final price before charging. If the result is status "pricing", the price is still being worked out: call again in a few seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Saved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both. | |
| method | No | How the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print). | |
| source | No | The kernelCAD script, when the part is not saved. Send slug or source, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations. It discloses that the card is only held, that a human confirms the final price before charging, that the response carries a pay_url and can return status 'pricing', and that the caller should poll again in a few seconds. This is exactly the mutation/world-interaction context readOnlyHint=false and openWorldHint=true imply but do not spell out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action and its return value are front-loaded, followed by method guidance, pricing integrity, charge behavior, and the polling edge case. Every sentence carries an operational instruction; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description still covers the one non-obvious async case (status 'pricing') plus the human-confirmation step. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real intent: method is a proposal derived from the user's words and part geometry, and reason must be one line. It also reinforces that no price is ever sent, which is a semantic constraint the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (order the part made), the side effect (creates the production request) and the artifact returned (pay_url). It does not explicitly name or differentiate from the sibling price_part, whose quote-before-ordering role the agent has to infer from 'the price is the real maker price'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for calling: propose a method from the user's words plus the part, never send an invented price, and re-call on status 'pricing'. It lacks an explicit routing rule to the alternative sibling (price_part) for pre-order quoting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_partPrice PartARead-onlyInspect
Start or read the real price for making the part. Cheap. Returns status "ready" with estimate_cents and summary, or "pricing" while the makers are asked (call again in a few seconds). Creates nothing and charges nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Saved project slug (from open_in_studio or a /p/<slug> link). Send slug or source, not both. | |
| method | No | How the part should be made. Propose it from the user's words and the part (flat sheet: laser_cut or sheetmetal; metal block: cnc; plastic: fdm_print or resin_print). | |
| source | No | The kernelCAD script, when the part is not saved. Send slug or source, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, destructiveHint=false, openWorldHint), but the description adds material behavioral context beyond them: the asynchronous 'pricing' state and the need to poll, plus the explicit no-side-effect/no-charge guarantee. It does not say how long pricing takes or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, with the async caveat and the no-cost guarantee following compactly. 'Cheap.' is terse but carries pricing-relevant signal; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need little prose, and the description still contributes the state machine (ready vs pricing) that an agent must handle. Combined with 100% schema coverage on a nested-input tool, the definition is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents slug, source, and the nested method object (process/material/quantity/reason) in detail. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: start or read the real price for making a part, with the two outcome states named. It is distinguishable from order_part (which presumably places an order) only indirectly through 'Creates nothing and charges nothing', so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the polling pattern ('call again in a few seconds') when status is 'pricing', which is genuine runtime guidance. However, it never says when to reach for this versus order_part, dfm_review, or fab_pack, nor what input is required to get a price.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_curveProject CurveAIdempotentInspect
Use this when you need to wrap a 2D closed curve onto a 3D face. Insert a <shape>.projectCurve({ source, face, scaleMode? }) chained call into a kernelCAD script. The source is the structured { kind: "sketchCommands", commands: [...] } wire format the runtime API accepts. Wraps the curve onto the face along the face normal; pair with .extrude(d) / .cut(...) for raised or engraved logos on curved bodies. Open-wire projection (asEdge: true) is not implemented and is rejected at edit time. Side-effect-free; returns modified code plus diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| face | Yes | Target face — canonical name or label. | |
| asEdge | No | Open-wire (edge) projection. NOT IMPLEMENTED — rejected at edit time. Use a closed-curve projection (omit asEdge). | |
| bindAs | No | Optional local variable name; emits `const <bindAs> = <target>.projectCurve(...);`. | |
| target | Yes | Variable name of the Shape to chain onto. | |
| commands | Yes | Closed 2D path to wrap onto the face, as plain-number commands. Must start with a `moveTo` and end with a `close` (e.g. [{kind:"moveTo",x:0,y:0},{kind:"lineTo",x:2,y:0},{kind:"lineTo",x:2,y:2},{kind:"close"}]). | |
| scaleMode | No | Drawing.sketchOnFace scaling mode. Default original. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses projection direction (along the face normal), a hard limitation ('open-wire projection is not implemented and is rejected at edit time'), and the return shape (modified code plus diagnostics). 'Side-effect-free' is consistent with idempotentHint=true/destructiveHint=false, though it sits in mild tension with readOnlyHint=false (the script is edited) and the description never resolves which state is considered mutated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the selection condition, then the emitted call, then the constraint, then the return contract. Nothing is repeated from the schema and no sentence is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a script-mutating tool with an output schema, the description covers what it emits, the geometric behavior, the one unsupported mode, and how it composes with downstream ops — enough for an agent to call it correctly. Only the interaction between `scaleMode` choices and the resulting geometry is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: it reframes `commands` as the runtime's `{ kind: "sketchCommands", commands: [...] }` wire format and explains that the curve is wrapped along the face normal. It does not elaborate on `scaleMode` beyond the schema's own enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('wrap a 2D closed curve onto a 3D face') and names the exact call emitted (`<shape>.projectCurve({ source, face, scaleMode? })`). It is clearly distinct from add_curve/add_surface in substance, but never names a sibling or explicitly contrasts against one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to wrap a 2D closed curve onto a 3D face' gives a clear triggering condition, and 'pair with .extrude(d) / .cut(...) for raised or engraved logos' gives the follow-on workflow. No explicit when-not or named alternative is provided, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryQuery GeometryARead-onlyIdempotentInspect
Use this when you need to resolve or inspect topology against a script's lowered geometry. Pass the script as code (inline; works on a hosted server) or file. Selected by mode (default 'evaluate'):
'evaluate' — list the faces a Query matches ({ query }). Pass expect:'unique' to assert exactly-one.
'resolve' — resolve one ref to one face ({ ref }).
'lineage' — the creating/modifying history of a face ({ ref }; feature_id defaults to the last feature). Query forms (faces only; edge/vertex kinds return query.unsupported-entity-type):
a bare face label: 'top', 'bottom', 'left', 'right', 'front', 'back', or a hole/cutout slot like 'wall'.
@kc[/face/] — feature ids are the ones refs print, e.g. '@kc[box_1/face/top]', '@kc[hole_1/face/wall]'.
@kcq[face(, ...)] — filters AND together: createdBy("box_1"), withLabel("top"), geometryType(PLANE|CYLINDER|CONE|SPHERE|TORUS|BSPLINE_SURFACE), closestTo([x,y,z]) or closestTo([x,y,z], k), containsPoint([x,y,z]); combine with union(a, b), intersection(a, b), subtraction(a, b). Example: '@kcq[face(geometryType(CYLINDER), closestTo([0,0,10]))]'. Each matched face comes back with its canonical @kc ref, centroid, normal and area.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | mode:'resolve'|'lineage' — one face: '@kc[box_1/face/top]', '@kcq[...]', or '<feature-id>.<label>' (lineage). | |
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| mode | No | Resolution mode (default 'evaluate'). | |
| query | No | mode:'evaluate' — Query: a bare face label ('top'), an @kc[<feature-id>/face/<label>] ref, an @kcq[face(...)] expression, or { ast }. | |
| expect | No | mode:'evaluate' — 'unique' asserts exactly-one. | |
| feature_id | No | Optional FeatureId; defaults to the last lowered shape (use "auto" for lineage). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses error semantics ('edge/vertex kinds return query.unsupported-entity-type'), the assertion behavior of expect:'unique', the hosted-server file-read limitation, and the feature_id defaulting rule. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the usage trigger, then uses scannable bullets for the three modes and a second list for query grammar, ending with the return shape. Dense and every section is load-bearing despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, three-mode tool, the description covers mode selection, query grammar, assertion behavior, defaults, error cases, and the hosted-server constraint. With an output schema present, it correctly omits return-value documentation and is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description goes further by explaining mode defaults, the accepted query forms (bare label, @kc ref, @kcq expression, ast), and the lineage feature_id default. It adds genuine semantic depth over the schema rather than restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb pair and resource: 'resolve or inspect topology against a script's lowered geometry.' An agent immediately knows this is a geometry/topology query tool rather than a script runner or mesh tool. It doesn't explicitly name which sibling to prefer (ray_pick, get_selection, inspect), so it stops short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The lead sentence gives a clear trigger condition ('when you need to resolve or inspect topology'), and the per-mode bullets explain what each mode is for, which is strong within-tool routing. There are no explicit when-not-to-use statements or named alternatives among the many siblings, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ray_pickPick Point by RayARead-onlyIdempotentInspect
Use this when you need the faces a ray hits in a local Studio model, nearest first, with points, distances, and normals. Inputs are model units (mm); direction is normalized. Requires the local Studio URL and session token for the same script, reads the current model generation, and returns a set_selection argument object with every hit. feature_id must identify a displayed terminal shape; intermediates have no current viewer shapeIndex. Intersections use the viewer per-face tessellation, so curved-surface points and normals are mesh approximations.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| origin | Yes | Ray origin [x, y, z] in model units. | |
| session | Yes | Studio sessionToken for this script, from GET /__kernelcad/session?script=<path>. | |
| direction | Yes | Nonzero ray direction [x, y, z]; normalized internally. | |
| feature_id | No | Displayed terminal feature to ray-pick; defaults to the returned feature. Intermediate features are not available as current viewer selections. | |
| studio_url | Yes | Local Studio HTTP origin, e.g. http://localhost:5173. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses that the tool reads the *current* model generation, requires a matching studio session, only works with displayed terminal shapes, and — critically — that intersections come from per-face tessellation, so curved-surface points and normals are mesh approximations. That is exactly the kind of accuracy caveat an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences, front-loaded with the "Use this when..." trigger, and each sentence carries distinct information (units, auth, generation read, feature constraint, tessellation caveat). Slightly list-like, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so omitting return-shape detail is fine, yet the description still usefully says the result is a set_selection argument object with all hits. Constraints, units, auth, and accuracy limits are all covered; only error/failure behavior (bad session, stale generation) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description adds only marginal meaning: model units in mm, and the rationale for the feature_id constraint (intermediates have no current viewer shapeIndex). It repeats what the schema already says about direction being normalized internally, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — ray-picking the faces a ray hits in a local Studio model — plus the ordering (nearest first) and payload (points, distances, normals). An agent knows exactly what the call returns. It does not name a sibling it replaces or differs from (e.g. get_selection, get_model_mesh), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need the faces a ray hits" gives an implied trigger, and it adds prerequisites (local Studio URL, session token for the same script, feature_id must be a displayed terminal shape). But it never states when NOT to use it or which sibling handles the overlapping case, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_featureRemove FeatureADestructiveInspect
Use this when you need to remove a feature line from a script. Remove a single line from a kernelCAD script identified by a substring match. Returns the modified code plus diagnostics from re-evaluating. Refuses to remove the line containing the return statement. Side-effect-free.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| match | Yes | A substring that uniquely identifies the line to remove (e.g. `const hole = cylinder(5,`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses genuinely useful behavior beyond the annotations: it refuses to remove the return statement and returns modified code plus re-evaluation diagnostics. However, it also claims 'Side-effect-free', which is directly at odds with the declared readOnlyHint=false and destructiveHint=true, leaving the agent unsure whether confirmation is required before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the usage trigger, and every one carries information (scope, matching, return value, refusal rule). The only waste is mild redundancy between 'remove a feature line' and 'remove a single line'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and annotations plus full schema coverage handle the rest; the description still covers scope, matching, and a hard precondition. The one gap is the unresolved safety framing that conflicts with the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, and the description still adds a constraint on `match` by ruling out the return-statement line as a valid target. That extra semantic boundary is worth more than the baseline 3 for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a single line from a kernelCAD script identified by a substring match'), which also disambiguates the tool from model-level feature editing siblings like add_feature. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to remove a feature line from a script' gives a clear trigger condition, and the refusal rule implicitly bounds the cases it handles. It does not name alternatives (e.g. repair_script, evaluate_script, or add_feature for the inverse operation), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_previewRender PreviewAInspect
Use this when you need to LOOK at a kernelCAD model — render its script to deterministic PNG views for visual self-check (the visual half of the evaluate → render → inspect → fix loop), with NO studio or dev server required. Pass { code } (inline source) or { file } (a .kcad.ts path), exactly one. Renders the canonical engineering views (front, right, top, iso — pass { views } for a subset, e.g. ["iso"] for fastest iteration) plus an optional { pose: "," } arbitrary camera angle (degrees; az=0,el=0 is front, +az rotates CCW around +Z, +el lifts the camera). NO STUDIO / DEV-SERVER REQUIRED: a prebuilt static player (dist/headless-player) is served from an ephemeral local port automatically; a running studio dev server is used as fallback, and { base_url } forces one. The only environment dependency is playwright chromium (npx playwright install chromium). Pass { focus } or { hide } (arrays of feature ids or assembly part names, mutually exclusive) to isolate parts — same semantics as kernelcad render --focus/--hide. Pass { section: { axis, position, flip? } } to cut a cross-section and inspect INTERIOR geometry (wall thickness, internal pockets, whether a bore runs through) rather than only the outer shell. Pass { explode: { factor, mode? } } to pull a multi-part assembly apart (mode: "mate-axis" default, or "radial") using the same mesher as kernelcad render --explode — requires assembly.model()/solvedModel(). PNGs are written to { out_dir } (default: a fresh temp session directory) and returned as absolute paths with per-view camera descriptions (kernelCAD is Z-up). Mechanism truth runs first, same protocol as kernelcad render: a broken mechanism still renders but every tile is watermarked MECHANISM BROKEN (KERNELCAD_RENDER_STRICT=1 refuses instead); read { mechanism, mechanism_failure_codes }. The probe runs full BREP interference sweeps and can dominate latency on large assemblies — pass { no_mechanism_check: true } for fast iteration (the preview then reports mechanism: "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. 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 }). INSPECTION SHEET: { sheet: true } renders all seven views (iso, front, back, left, right, top, bottom) and adds one labelled image named 'sheet' tiling them — do not call a model done because it compiled; call it done when every tile of the sheet matches the request. Returns { ok, images: [{ name, path, description }], out_dir, bounds, mechanism, render_source, render_ms, diagnostics }. PATHS ARE LOCAL to the machine running the MCP server — local stdio clients read them directly; hosted/remote clients should use open_in_studio instead.
Hosted server: the PNGs come back IN the result as image content (up to ~1.5 MB total; larger sets are link-only) and each images[i].url is an HTTPS link that expires after 24 h. images[].path is a server-side path you cannot open. Works without saving a project (autosave:false is fine). Hosted: lib.fromSTEP / fromSTL / meshFromSTL / fromDXF / fromSVG and referenceImage take a direct string literal or a const bound to one (computed expressions are unsupported). They accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. Mutually exclusive with file. Relative imports resolve against a temp dir — use file for scripts with relative lib.fromSTEP(...) imports. | |
| file | No | Path to a .kcad.ts script on disk. Mutually exclusive with code. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| hide | No | Hide matching feature ids / assembly part names. Mutually exclusive with focus. | |
| pose | No | Extra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'. | |
| focus | No | Show only matching feature ids / assembly part names. Mutually exclusive with hide. | |
| sheet | No | Also write one labelled image 'sheet' tiling every rendered view. With no views it renders all seven (adds back, left, bottom) — use it before calling a model done, so a missing cutout on the back or underside is not missed. | |
| views | No | Canonical views to render as an array, e.g. ["iso"] or ["front","top"] (default: all four). Fewer views = faster. | |
| width | No | Per-view tile width in px (default 768; 1600 under preset: 'publish'). | |
| height | No | Per-view tile height in px (default 768; 1200 under preset: 'publish'). | |
| intent | No | 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. | |
| preset | No | Render look: 'default' (engineering review) or 'publish' (studio product shot for sharing; one 'hero' image unless views/pose are given). | |
| shadow | No | preset 'publish' only: soft contact shadow under the model (default true). | |
| explode | No | 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(). | |
| out_dir | No | Directory for the PNGs (created if missing). Default: a fresh temp session dir. | |
| overlay | No | 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. | |
| section | No | 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). | |
| shading | No | Mesh shading: 'smooth' uses the kernel's vertex normals (default); 'flat' uses face normals to expose tessellation / surface wobble. | |
| base_url | No | Advanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player. | |
| background | No | preset 'publish' only: 'white' (default), 'light', 'dark', 'black', 'transparent' (PNG alpha), or '#rrggbb'. | |
| environment | No | HDRI environment override: preset ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse'), a URL, or 'none' for the default three-light rig. | |
| no_watermark | No | Suppress the kernelCAD version watermark. | |
| no_mechanism_check | No | Skip the mechanism-truth probe for fast iteration on large assemblies; the preview reports mechanism: 'unverified'. Ignored under KERNELCAD_RENDER_STRICT=1. | |
| screenshot_timeout_ms | No | Playwright screenshot deadline in milliseconds. Default leaves Playwright's 30 s in place; raise it for heavy lofts or a slow machine. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only, is open-world, and is non-destructive; the description adds substantial behavioral detail beyond them: PNGs are written to out_dir, local paths are machine-local, hosted results may include image content or expiring HTTPS URLs, mechanism failures watermark tiles, strict mode refuses, and playwright chromium is the only environment dependency. These details are consistent with the annotations, not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key usage constraints are front-loaded, and most of the long text earns its place for a 23-parameter tool with many modes. However, it is dense and repeats some points (e.g., no studio/dev-server, mechanism check details), which keeps it from being a model of concise structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 23 parameters, nested section/explode objects, annotations, and output schema, the description is complete enough for correct invocation. It covers rendering modes, environment requirements, mechanism behavior, hosted/local path differences, and fallback behavior without needing to restate the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, but the description still adds meaningful semantics beyond the schema: code vs file exclusivity, views subset behavior, pose camera angle conventions, focus/hide mirroring the CLI, section for interior inspection, explode requiring assembly.model(), overlay tied to inspect numbers, and publish preset framing/details. This is unusually rich parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: render a kernelCAD script/model to deterministic PNG views for visual self-check. It clearly positions the tool in the evaluate → render → inspect → fix loop and distinguishes it from siblings like inspect (numbers) and capture_animation (360° loop).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use this when you need to LOOK at a kernelCAD model') and names alternatives for related tasks: inspect for continuity/curvature numbers, capture_animation for a turntable, and open_in_studio for hosted/remote image access. It also states when to use no_mechanism_check for fast iteration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_scriptRepair CAD ScriptAIdempotentInspect
Use this when evaluate_script reported an error and you want the fix applied rather than described. Takes the candidates why_did_this_fail derives for a diagnostic, applies them one at a time, re-evaluates after each, and keeps the first that clears the diagnostic without introducing new errors. Never edits outside the repair region (failing feature statement + its input statements + the param() lines it reads) — an out-of-region patch is refused with tool.repair.out-of-region. Returns the repaired source in new_code (the caller persists it), a unified diff, and before/after health maps. Pass { file? | code?, diagnostic?: ''|'first-error', strategy?: 'apply-first'|'try-all'|'dry-run', max_attempts?: number }.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| intent | No | 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. | |
| strategy | No | 'try-all' (default) walks candidates until one clears the diagnostic; 'apply-first' applies only the top candidate and reports what it did; 'dry-run' previews every candidate patch without evaluating. | |
| diagnostic | No | Diagnostic id from why_did_this_fail's `targetDiagnosticId` / `candidates[].diagnosticId`, or 'first-error' (default) for the first error-severity diagnostic. | |
| max_attempts | No | Upper bound on candidates attempted (default 3). Ignored by apply-first and dry-run. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the iteration policy (apply candidates one at a time, re-evaluate, keep the first that clears without new errors), the hard scope limit (never edits outside the failing statement + inputs + param() lines), a specific refusal signal (tool.repair.out-of-region), and the fact that the caller is responsible for persisting new_code. That last point resolves what readOnlyHint=false actually means here — the tool computes, it does not save.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the routing condition, then the mechanism, then constraints and return shape — good ordering. It is dense but every early sentence earns its place; the closing "Pass { file? | code?, ... }" list is the one redundant part given full schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, it summarizes the return (new_code, diff, before/after health maps) and states the persistence contract, which the schema alone would not convey. For a mutating, retry-driven tool with six optional parameters, nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries all six parameters including the file/code alternatives, the strategy enum values, and diagnostic id format. The description's trailing brace-list largely restates the schema; its only increment is clarifying that `diagnostic` comes from why_did_this_fail's ids, which the schema also says. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (repair a CAD script) and immediately distinguishes itself from evaluate_script and why_did_this_fail by framing itself as the tool that applies a fix rather than describing one. An agent can route between the three without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when evaluate_script reported an error and you want the fix applied rather than described" gives both the trigger condition and the exclusion (wanting a description instead routes to why_did_this_fail). It also names the upstream dependency whose output it consumes (candidates from why_did_this_fail), so the call ordering is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_needReport a Missing Asset or CapabilityAInspect
Use this when the user needed something kernelCAD does not have, so the gap is recorded instead of papered over. kind: asset (search_assets returned coverage none or poor: the catalog does not model it), capability (a tool cannot do what was needed), output (a tool answered, but not with what was needed), docs (a tool description did not say how to use it). One short sentence in need; name the tool in tool when one fell short. Stores no personal data beyond your account id when signed in. Then tell the user plainly what is missing.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | asset | |
| need | Yes | What was needed, e.g. "low-poly lunar lander for a moon base scene". | |
| tool | No | The tool that fell short, if any (e.g. search_assets). | |
| context | No | Optional: what the user was building. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare hints (write, not destructive, not idempotent, not open-world); the description adds a genuine privacy disclosure — no personal data stored beyond the account id when signed in — plus the user-facing follow-up obligation. It does not explain what becomes of the record (who sees it, whether duplicates are deduped given idempotentHint=false), leaving a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition, then enum semantics, then privacy, then follow-up — logical order with no filler. The middle sentences are densely packed run-ons that take a careful read, which costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Combined with 75% schema coverage, the description supplies everything missing: when to fire, how to classify, what to include, privacy implications, and required follow-up with the user.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema's enum lists the four `kind` values without describing any of them; the description supplies the precise meaning and selection rule for each. It also guides `need` ('one short sentence') and `tool` ('name the tool when one fell short'), though `context` is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (record a gap) and a specific condition (the user needed something kernelCAD does not have), which no sibling tool shares. It also distinguishes the tool from silently working around the gap ('recorded instead of papered over'). An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates four gap categories (asset, capability, output, docs) with the exact triggering condition for each, including naming the failing tool when relevant. It also closes the loop with 'Then tell the user plainly what is missing,' which is an instruction about what to do after calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_assembly_quoterequest_assembly_quoteAInspect
Submit a manufacturing quote request after the user has reviewed and explicitly approved the checklist and every displayed warning. KernelCAD staff will confirm the final itemized price. This sends the request for human review and does not charge the customer or start checkout.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Contact email for the quote response. | ||
| params | No | Current CAD parameter values. Materials and sheet thickness come from the CAD design. | |
| source | No | Current kernelCAD source for an unsaved assembly. | |
| assembly | No | Assembly name when the script contains multiple assemblies. | |
| checklist | Yes | ||
| requestId | Yes | ||
| accessToken | No | Guest access token returned by estimate_assembly_manufacturing; required when submitting as a guest. | |
| projectSlug | No | Saved project slug. Use this for a saved assembly. | |
| idempotencyKey | Yes | ||
| projectVersion | No | Immutable saved revision to estimate. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: submission triggers human review, the final itemized price is confirmed by staff, and no charge or checkout occurs. It also makes the required explicit user approval a behavioral precondition, which is valuable for a non-read-only, open-world action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then adds the human-review and no-charge outcome in two tight sentences. Every sentence adds useful selection or safety context without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex submission tool, it covers purpose, user-approval prerequisite, human review, and no-charge behavior. Some operational details such as obtaining hashes/requestId and guest versus saved-project submission are left to the schema, but the description plus annotations and output schema are largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 70%, so many parameters are already documented. The description reinforces checklist approval and warnings but does not explain requestId, idempotencyKey, modelHash, snapshotHash, or how saved versus unsaved assemblies should be selected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: submit a manufacturing quote request. It also distinguishes the action from checkout/charging, so an agent can tell this is a quote-request submission rather than an order or payment flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition: the user must have reviewed and explicitly approved the checklist and every displayed warning. It also clarifies that the request goes to human review and does not charge or start checkout, though it does not explicitly name estimate_assembly_manufacturing or other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_uploadRequest File UploadAInspect
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:") as the file argument, for example trace_from_image({ imageUrl: "asset:" }) or lib.fromSTEP("asset:"). If the file is already at a public https:// URL, pass that URL instead. On clients that support MCP URL elicitation the upload page opens for the user directly and the call returns once the file is stored (status "uploaded"); then use the asset right away without asking the user anything.
| Name | Required | Description | Default |
|---|---|---|---|
| purpose | No | Optional short note shown on the upload page, e.g. "the photo of the worn bracket". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: a one-time uploadUrl valid 30 minutes, an asset reference, the exact handoff format ("asset:<id>") for the consuming argument, and the MCP URL elicitation flow including the returned status "uploaded". This is far richer than the readOnly/destructive/openWorld hints. It stops short of 5 only because it does not state error cases (expired link, failed upload) or whether the asset persists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the triggering condition, then the mechanism, then the handoff example. Long but dense, with each clause carrying routing or workflow information. Slightly dense toward the end where elicitation behavior is folded into one long sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a one-parameter tool with an output schema and full annotation coverage. The description covers the full lifecycle (request, handoff, elicitation variant) and even the public-URL bypass, so nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `purpose` parameter is already documented in the schema as an optional note shown on the upload page. The description never elaborates on that parameter, so it adds no meaning beyond the schema; baseline 3 applies. The workflow detail it does provide concerns the output `asset` value, not the input parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (request upload) and resource (file), and explicitly distinguishes itself from siblings by naming the downstream tools it feeds (trace_from_image, drawing_to_cad, mesh_to_features, import_step) and the scripting equivalents. An agent can tell this apart from import_step or trace_from_image without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (user has a photo/PDF/STEP/STL/DXF/SVG/3MF on their device), when-not guidance (do not ask for pasted text/base64, do not hand-type coordinates), and an alternative path (if the file is already at a public https:// URL, pass that URL instead). Routing is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_assumptionsResolve Image AssumptionsAIdempotentInspect
Use this when you need to confirm or override the open facts in an assumption ledger from trace_from_image (missing scale, inferred/assumed values) before committing geometry built from a reference photo. Reads the persisted <model>.ledger.json at ledgerPath, applies each resolution — { id, confirm: true } to accept a fact as-is, or { id, value } to override it — rewrites the ledger file, and returns the updated ledger plus paramOverrides (factId -> value) to feed straight into set_param. Pair with the kernelcad-from-reference skill.
| Name | Required | Description | Default |
|---|---|---|---|
| ledgerPath | Yes | Path to the `<model>.ledger.json` file persisted alongside the traced source. | |
| resolutions | Yes | One resolution per ledger fact id to act on. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover mutation/idempotency but not persistence; the description goes beyond them by disclosing that it reads the persisted `<model>.ledger.json`, rewrites that file, and marks facts as `confirmed` or `overridden`. It also states the return payload includes `paramOverrides` (factId -> value), which is exactly the kind of side-effect and output-contract detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition before the mechanics, and every clause (ledger path, resolution shapes, rewrite behavior, paramOverrides handoff, skill pairing) carries information. The main sentence is long and heavily em-dashed, which costs a little readability but not content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, non-destructive mutation feeding a multi-step workflow, the description covers preconditions, file effects, request shape, and the handoff to set_param; an output schema exists so return-value detail is not required. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns above that by explaining the two resolution shapes in domain terms — `{ id, confirm: true }` to accept as-is versus `{ id, value }` to override — and the resulting ledger state change. It stops short of stating whether `value` and `confirm` are mutually exclusive or what happens on an unknown id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (resolve the open facts in an assumption ledger) and names the exact upstream tool that produces that ledger (trace_from_image) plus the downstream consumer (set_param). An agent can distinguish it from trace_from_image or set_param without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger — 'use this when you need to confirm or override the open facts ... before committing geometry built from a reference photo' — and embeds it in a named workflow (trace_from_image -> resolve_assumptions -> set_param, plus the kernelcad-from-reference skill). The only gap is a lack of an explicit when-not clause, but the pipeline positioning leaves little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_cadReview CAD ModelAInspect
Run a deterministic mechanism-fitness review on supplied kernelCAD code or a file. It performs a full evaluation, replaces the active MCP session model on success, and clears that session if evaluation fails. The script may load referenced assets. The review validates the assembly/mate graph and connector placement, samples declared mate limits, optionally checks interference at sampled poses, and reports connector workspace bounds, fitness findings, and a repair mode (none, local-fix, parameter-tune, or topology-redesign). Runs within timeBudgetMs (default 90 s); stages that do not fit are listed in skippedStages and were not checked. Hosted: lib.fromSTEP / fromSTL / meshFromSTL / fromDXF / fromSVG and referenceImage take a direct string literal or a const bound to one (computed expressions are unsupported). They accept "asset:" (from request_upload), an https:// URL or a data: URI as the path.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| assembly | No | Assembly name; defaults to the first captured assembly. | |
| designGoal | No | Original user design prompt or goal. Included in suggestedRepairPrompt so topology-redesign repairs restart from the intended physical design instead of local coordinate nudges. | |
| epsilonMm3 | No | Interference volume threshold in mm^3. Default 0.01. | |
| timeBudgetMs | No | 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. | |
| combinatorial | No | Sample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false. | |
| samplesPerMate | No | Pose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate. | |
| trackConnectors | No | Optional connector refs such as ["gripper-plate.tool-tip"] to limit connector workspace reporting. | |
| preserveInterfaces | No | External mates, connector refs, part names, or behavioral interfaces the repair agent must preserve during redesign. | |
| includeInterference | No | Whether sampled poses run BREP interference checks. Default true. | |
| includePoseEnvelope | No | Whether to sample declared mate limits. Default true. | |
| physicalUseCaseLevel | No | Escalating physical-use-case depth; each level includes the previous. 'reachability': targeted sampling over scalar-limited mates named in actuatorLimits, rejecting contacts that cannot get within criteria.maxSlipMm and multi-contact use cases that cannot satisfy every contact in the same sampled actuator pose (revolute/cylindrical/pin-slot limitsDeg, prismatic limitsMm). 'statics': adds pose-bound quasi-static certification at the exact common-contact samples (conservative friction/capacity, world force and moment balance, finite-difference revolute actuator torque); returns physicalUseCaseStaticCertificates on success. 'reactions': adds exact-pose reaction wrenches through uniquely rooted articulated trees, compared against each loaded mate's declared resultant force/moment envelope, and runs the clevis double-shear / pin-bending / bearing / tear-out / net-section check (minimum factor of safety 2) automatically for mates built with joint.clevis. Defaults to 'reachability' when requirePhysicalUseCase is true. | |
| requirePhysicalUseCase | No | When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits. | |
| physicalUseCaseSamplesPerMate | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses significant side effects beyond the annotations: it 'replaces the active MCP session model on success, and clears that session if evaluation fails', and that scripts may load referenced assets. It also explains the partial-result contract (stages that don't fit are listed in skippedStages and 'were not checked') and the repair-mode taxonomy, which the annotations (readOnly=false, destructive=false, idempotent=false) do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the session-mutation contract, which are the two things an agent most needs. It is dense and largely earns its length, though the final hosted-asset sentence is a long run-on and some enumeration (repair modes) duplicates output-schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with an output schema and annotations present, the description covers the remaining gaps an agent needs: the session-model side effect, the time-budget/skipped-stages semantics, and hosted-vs-local input limitations. Nothing critical to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 15 parameters in depth, and the description mostly restates that. The one genuinely additive point is the hosted asset-resolution rule for lib.fromSTEP/fromSTL/etc. accepting 'asset:<id>', https URLs, or data URIs — useful but narrow against a very rich schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Run a deterministic mechanism-fitness review on supplied kernelCAD code or a file', then enumerates exactly what the review covers (mate graph, connector placement, mate limits, interference). An agent can distinguish this from siblings like dfm_review, verify, or solve_mates without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is the tool for a full mechanism-fitness evaluation and explains the cost/tradeoff controls (timeBudgetMs, combinatorial, samplesPerMate). However, it never explicitly contrasts itself with alternatives such as dfm_review, verify, or solve_mates, nor does it state when NOT to use this heavier review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_paint_peek_latestGet Latest Painted Review FeedbackARead-onlyInspect
Return the newest brush-painted review packet from a Studio session. After sharing a /p/ link, the user can open it in the browser and paint marks over the 3D viewport to give visual feedback. Call this tool with the slug from that link to see the strokes — screenshot + mask + struck part names plus an optional one-line note and intent tags (e.g. "too thick", "missing", "wrong angle") describing WHAT is wrong — and act on the feedback. The slug is the capability: no OAuth required when passing slug; private projects require the owner to be signed in. Omit slug to fetch your own latest packet from your signed-in account (requires OAuth). By default returns short-lived signed Storage URLs for the screenshot + mask + meta.json plus the struck part names — small and context-friendly. Pass paths_only: false to also base64-inline the PNGs for clients that cannot fetch the signed URLs over HTTP.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Project slug from open_in_studio/get_project/a /p/<slug> link. When given, returns the latest brush packet painted on that project's page — works without OAuth; the slug is the capability. Omit to use your signed-in account's latest packet. | |
| paths_only | No | Controls PNG delivery. Default (omitted or true): return only signed URLs + struck part names — the small, context-friendly response; fetch the bytes via the signed URLs. Set false to also base64-inline the screenshot + mask PNGs for clients that cannot fetch the URLs over HTTP (larger response). | |
| freshness_sec | No | Maximum packet age in seconds. Default 1800 (30 min). Use a smaller value for "what did I just paint" or a larger one for "earlier today". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds critical context beyond annotations: slug-based capability (no OAuth), private projects require owner signed-in, return format with signed URLs and optional base64 inlining, and default behavior. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loaded with the main purpose, and each sentence adds value without redundancy. Approximately 150 words and efficiently conveys all necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description still outlines the return format (signed URLs, struck part names, optional base64). All 3 parameters are fully covered, and authentication context is provided. The description is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds valuable context: explains slug as project link, paths_only default and effect, freshness_sec default and usage hints. This goes beyond the schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the newest brush-painted review packet from a Studio session,' specifying the exact resource and action. It distinguishes itself from siblings like 'review_cad' by focusing on painted feedback from a shared link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to call with 'slug' (after sharing a /p/<slug> link) and when to omit (for own signed-in packet). No explicit when-not-to-use, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_feaRun Structural FEAAInspect
Use this when you need to know whether a part will hold a load. Runs a linear-static structural study and returns evidence — peak von Mises stress (MPa), peak displacement (mm), the minimum safety factor against the material yield (taken away from the clamp-singular edges of the fixed faces; the raw clamp-edge peak is reported separately as peakAtSupportMPa), per-region hot spots named by @kc[...] face ref, mesh trust flags, an equilibrium residual, and (CalculiX only) stress-heatmap PNG paths.
The study is EITHER declared in the script with shape.feaStudy({ material, fixed, loads, meshSize?, minSafetyFactor? }) OR passed on the call against the shape the script returns: { code: 'return box(100, 20, 10);', material: 'aluminum-6061', fixed: { atX: 0 }, loads: [{ faces: { atX: 100 }, force: [0, 0, -200] }] }. Faces are a FaceQuery ({ atX | atY | atZ, byNormal: 'Z', ofSurfaceType, near: [x,y,z], ... }; with near it names the ONE matching face nearest the point), a face label ('top', 'bottom', 'left', 'right', 'front', 'back'; it must name ONE face — after a boolean 'top' can be several, which is an error listing them) or an @kc[...] ref. Force is the TOTAL [Fx, Fy, Fz] in N on those faces (a scalar force + direction is accepted). Materials: mild-steel, aluminum-6061, pla, petg, abs, nylon (aliases steel, aluminum), or { E, nu, yield } in MPa.
Solver (solver, default 'auto'): CalculiX + gmsh quadratic tets when that toolchain is installed; otherwise the built-in in-process voxel solver (8-node incompatible-mode bricks), which needs nothing installed and is marked summary.solver 'in-process-voxel' with trust.meshTrusted false — an estimate (accurate for prismatic bending, approximate at curved faces and notches), never a verified pass. solver: 'calculix' fails up front with fea.solver.unavailable and the install command when the toolchain is absent.
Also: study (a declared study name; default the last), output_dir (keeps the deck / summary JSON), mesh_size (mm, overrides the study for this run), heatmaps: false for a numbers-only run. CalculiX mesh refinement is automatic: when the stress is untrusted only because the solver's error estimate is high, it re-solves once at 0.75x the element size (inside the element budget), with summary.refinement listing each pass. refine: false solves once.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source (mutually exclusive with file). | |
| file | No | Path to a .kcad.ts script declaring at least one feaStudy. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| fixed | No | Inline study: faces held fixed — a FaceQuery like { atX: 0 }, a face label like 'bottom', or an @kc[...] ref. | |
| loads | No | Inline study: loads, each { faces, force: [Fx, Fy, Fz] } — total force in N on those faces. | |
| study | No | Name of the declared study to run; defaults to the last declared one. | |
| refine | No | One automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true). false: one solve at mesh_size. | |
| solver | No | 'auto' (default): CalculiX when installed, else in-process. 'calculix': require it. 'in-process': always the built-in voxel solver. | |
| heatmaps | No | Render stress heatmap PNGs (default true). | |
| material | No | Inline study: material grade name (e.g. 'aluminum-6061') or { E, nu, yield } in MPa. | |
| mesh_size | No | Target element size in mm, overriding the study for this run. | |
| output_dir | No | Directory for the solver deck, results, summary JSON and heatmap PNGs. | |
| mesh_timeout_ms | No | Wall-clock budget for meshing (default 120000). | |
| solve_timeout_ms | No | Wall-clock budget for the solve (default 300000). | |
| min_safety_factor | No | Inline study: required minimum safety factor; below it the call fails with fea.safety-factor.below-min. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: it discloses that the in-process voxel solver is an estimate with trust.meshTrusted false and is 'never a verified pass', that the safety factor excludes clamp-singular edges (with peakAtSupportMPa reported separately), that refinement re-solves at 0.75x element size, and that specific failure codes (fea.solver.unavailable, fea.safety-factor.below-min) can abort the call. Annotations (readOnlyHint false, openWorld true, idempotent false, destructive false) are consistent with this account of a compute-and-write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The value proposition is front-loaded, but the body is a dense wall of nested parentheses that partially restates the schema's own parameter descriptions (solver enum, refine default, heatmaps). Sentences earn their place individually, yet the whole is longer than needed for a tool whose schema is fully documented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, multi-solver, file-writing tool, nothing material is missing: input modes, solver fallback, trust semantics, refinement behavior, failure codes and output artifacts are all covered. An output schema exists, so the return-value enumeration is a bonus rather than a gap-filler.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds real semantics the schema lacks: FaceQuery matching rules, the warning that a label like 'top' may name multiple faces after a boolean and becomes an error, the distinction between total force in N and scalar-force-plus-direction, the material alias list, and the interaction between mesh_size, refine and the element budget. This is well above the baseline-3 expectation for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a decision-oriented statement of what the tool answers ('whether a part will hold a load') followed by a specific verb+resource ('runs a linear-static structural study') and an enumeration of what it returns (von Mises stress, displacement, safety factor, hot spots, mesh trust flags). An agent can distinguish this from fea_summary or verify without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the situation that selects this tool and lays out the two supported input modes (study declared in the script vs. inline arguments against a returned shape), plus solver selection guidance ('auto' default, 'calculix' fails up front, 'in-process' is an estimate). It never names a sibling (e.g., fea_summary) as the alternative for post-hoc result retrieval, so it stops short of full when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_to_printerSend G-code to PrinterADestructiveInspect
Use this when you need to upload a .gcode file (e.g. written by export with target: "model", format: "gcode") to a real network printer and, by default, start the print. protocol: 'octoprint' (POST /api/files/local with an X-Api-Key), 'moonraker' (Klipper's POST /server/files/upload), or 'bambu-lan' (Bambu Lab LAN-mode: FTPS implicit-TLS upload on port 990 as user 'bblp' with the printer's LAN access code, then an MQTT print-start command on port 8883 — requires access_code and, unless start_print is false, serial). bambu-lan uploads a .gcode.3mf print project (the printer prints 3MF projects, not bare G-code): the G-code goes in as Metadata/plate_1.gcode, inside the model 3MF from export format '3mf' when model_3mf_path is given (use options { arrange: 'plate', slicer: 'bambu' } so the printer shows the same named, coloured parts), else inside a minimal 3MF shell; the file name always ends in .3mf ('part.gcode' -> 'part.gcode.3mf'). Optional printer (a bundled profile id, the same ids as the export 3mf/gcode options.printer) is checked against protocol before anything is read or sent: an unknown id is refused with the list of valid ids, 'bambu-lan' needs a Bambu Lab profile and a Bambu Lab profile needs 'bambu-lan'. Pass { dry_run: true } to validate connectivity/authentication only, without uploading or starting a print. Never logs or echoes api_key/access_code.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Printer hostname or IP. | |
| port | No | Override the protocol default port. | |
| serial | No | Bambu printer serial number (required to start a print unless start_print is false). | |
| api_key | No | OctoPrint API key (Settings -> API). | |
| dry_run | No | Validate connectivity/auth only; never uploads or starts a print. | |
| printer | No | Printer profile id; checked against protocol before upload. List them with 'kernelcad print printers'. | |
| filename | No | Uploaded file name (default: 'kernelcad.gcode'; bambu-lan appends '.3mf'). | |
| protocol | Yes | ||
| gcode_path | Yes | Path to the .gcode file on disk. | |
| access_code | No | Bambu LAN-mode access code (printer settings -> LAN Only Mode). | |
| start_print | No | Start the print immediately after upload (default: true). | |
| model_3mf_path | No | bambu-lan only: model .3mf from export format '3mf' to package the G-code into (the uploaded .gcode.3mf). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Extraordinarily forthcoming beyond the annotations: secrets are never logged or echoed, printer profiles are validated against protocol before anything is read or sent, unknown ids are refused with the valid list, dry_run performs connectivity/auth checks only, and bambu-lan silently repackages G-code into a .gcode.3mf project with filename rewriting ('part.gcode' -> 'part.gcode.3mf'). This directly supports the destructiveHint=true / idempotentHint=false annotations by explaining that a real print starts by default and auth material is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loading 'Use this when...' is right, but the body is a single sprawling sentence stitched together with em-dashes and nested parentheses, making it hard to scan for the one protocol the agent needs. Given three protocols and 12 parameters some length is justified, but a per-protocol breakdown would earn its space better than the run-on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs to call this safely for a destructive, network-dependent operation: required credentials per protocol, default behaviors (start_print true), validation-only mode, failure modes for bad profiles, and file-type conversion quirks. An output schema exists, so return values need no explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 92% schema coverage, the description adds material meaning the schema does not: bambu-lan requires access_code and, unless start_print is false, serial; model_3mf_path must come from export format '3mf' with options { arrange: 'plate', slicer: 'bambu' }; printer is cross-checked against protocol with bidirectional constraints. The interaction rules between parameters are the value here, not restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — upload a .gcode file to a network printer and start the print by default — and enumerates the three supported protocols with their concrete endpoints. Even with 60+ siblings, an agent can immediately tell this is the physical-printing tool rather than export or fab_pack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you need to upload a .gcode file ... to a real network printer" gives a clear triggering context and ties the input back to export with target: "model", format: "gcode", which effectively names the upstream step. It also offers dry_run as the validate-only alternative. What it lacks is an explicit 'do not use for X, use export/fab_pack instead' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_paramSet ParameterAIdempotentInspect
Use this when you need to edit a param() default value in a kernelCAD script. Returns the modified code as text plus diagnostics from re-evaluating the result. Caller persists the new code via standard file-write tools (this tool has no side effects). With preview: true it builds the edit in a scratch session instead and returns the diff_geometry summary plus the requirements-ledger and S1 binding diffs (which requirements flip, which margins shrink, which selectors moved or re-bound), without touching the active session, source, revision or caches. A preview whose revised build fails returns ok:false and no diff. Inspect after.requirementsOk to see whether the edit preserves declared intent; preview.ok only says the preview could be computed.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| preview | No | S6 edit preview: evaluate the edit in a scratch session and return geometry + requirements-ledger + S1 binding diffs. Writes nothing. Default false (the normal source-edit result). | |
| new_value | Yes | The new default value. A number for a numeric param (e.g. 12.5), a string expression evaluated in the script (e.g. "width/2 + 3") or a choice/colour, or true/false for a boolean param. | |
| param_name | Yes | The string literal name of the param (first arg to param()). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior annotations cannot: the caller must persist the returned code via file-write tools, diagnostics come from re-evaluating the result, preview runs in a scratch session touching no source/revision/caches, and after.requirementsOk means something different from preview.ok. The only friction is the claim 'this tool has no side effects' sitting uneasily with readOnlyHint=false, leaving it unclear whether the non-preview path mutates anything in-session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then returns, persistence responsibility, preview behavior, failure semantics and interpretation guidance in a logical order with zero filler sentences. It is dense and jargon-heavy (requirements-ledger, S1 binding diffs), which costs a point on readability but not on relevance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what a caller needs for a 4-parameter editing tool: input contract, return shape, side-effect boundary, and preview failure/interaction semantics. The remaining gap is that terms like requirements-ledger and S1 binding diffs are asserted without explanation, so an agent may know the tool is right but not how to interpret those diff payloads without another lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents code, param_name, new_value and preview. The description reinforces preview semantics (scratch build, what diffs are returned, writes nothing) but adds nothing about the other three parameters beyond what the schema says; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: edit a param() default value inside a kernelCAD script, and says exactly what it returns (modified code plus diagnostics). No sibling tool shares this scope, so an agent can distinguish it without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('Use this when you need to edit a param() default value') and explicit conditional guidance for preview:true versus the default false path, including that a failed preview returns ok:false and no diff. It does not name an alternative sibling or state when not to use it, so it stops short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_scene_returnSet Scene ReturnAIdempotentInspect
Use this when you need to set how the script returns its assembly. Replace the final top-level return statement with return <assembly>.model(); or return <assembly>.solvedModel(poses, options?);. Use solvedModel for mate-authored mechanisms so FK and validation run. Returns modified source plus diagnostics from re-evaluation.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| mode | Yes | ||
| poses | No | Optional solvedModel pose overrides keyed by mate name. Defaults to {}. | |
| options | No | Optional solvedModel options such as { validate: 'warn', posesGate: 'envelope' }. | |
| assembly_binding | Yes | JS identifier bound to assembly(...). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses the exact mutation made to source code, the difference in behavior between model and solvedModel, and that the result includes modified source plus diagnostics from re-evaluation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, front-loads the use case, then gives the exact transformation and mode guidance. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a source-mutating tool with five parameters, an output schema, and annotations, the description covers purpose, replacement behavior, mode selection, and result format sufficiently for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 80%, so the schema already documents most parameters. The description adds meaningful semantic guidance for mode, especially why solvedModel may be needed for mate-authored mechanisms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting how the script returns its assembly by replacing the final top-level return statement. The exact code transformation makes it clearly distinguishable from general evaluation or repair tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context and explicitly recommends solvedModel for mate-authored mechanisms so FK and validation run. However, it does not name a sibling tool alternative or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_selectionSet SelectionAIdempotentInspect
Use this when you need to replace the shared local Studio face/edge selection, or clear it with selection:null. The viewer highlights the pick on its next sync (300 ms). Does not edit geometry. Pass model_generation from get_selection; writes from an older generation are rejected. Use only current shape indices. Requires a local Studio session.
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | Studio sessionToken from GET /__kernelcad/session?script=<path>. Use the same script as the viewer. | |
| selection | Yes | ||
| studio_url | Yes | Local Studio HTTP origin, e.g. http://localhost:5173. | |
| model_generation | Yes | modelGeneration from get_selection; rejects picks from a prior mesh. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: the viewer highlights the pick on its next 300 ms sync, geometry is not edited, stale model generations are rejected, and only current shape indices should be used. This gives the agent operational constraints and side effects that the annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the use case and scope, then adds only high-value operational details: sync timing, no geometry edit, generation validation, and local-session requirement. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for this tool: output schema exists, annotations cover safety and idempotency, and the description adds the necessary selection semantics, prerequisites, and stale-generation rejection behavior. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters are documented. The description adds important semantics for selection:null clearing and model_generation provenance/rejection, though it does not explain all nested selection fields such as id and featureId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: replacing or clearing the shared local Studio face/edge selection. It clearly distinguishes this write-like selection operation from sibling actions like get_selection, and specifies the face/edge scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: to replace the shared selection, or clear it with selection:null. It also names the prerequisite of a local Studio session and directs the agent to get_selection for model_generation, giving clear routing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_matesSolve MatesARead-onlyIdempotentInspect
Use this when you need to solve the mate graph and get part poses. Run the v0.6 mate-graph solver on the active assembly. Returns { status, poses, iterations? } where each pose is a serialized Transform ({ translation, rotateAxis, rotateDeg }). Optional poses overrides mate pose values by mate name.
| Name | Required | Description | Default |
|---|---|---|---|
| poses | No | Optional numeric pose overrides keyed by mate name. | |
| assembly | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description adds real value by disclosing solver version (v0.6), the return shape { status, poses, iterations? }, and that pose overrides are applied by mate name. These are behavioral details not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the usage trigger, then solver behavior, then return contract. Zero waste and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, yet the description still usefully summarizes the return contract and override semantics. The only notable gap is the undocumented 'assembly' parameter; otherwise complete for a 2-param tool whose safety is covered by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'poses' is documented in both schema and description (override by mate name adds slight clarity), but 'assembly' has no schema description and is not explained in the description either. Baseline 3 for partial coverage with the description doing only marginal extra work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('solve the mate graph') and outcome ('get part poses') on the active assembly, which clearly separates it from sibling solve_sketch. Clear what it does, though it doesn't explicitly name the sibling it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to solve the mate graph and get part poses' gives an implied usage condition but no explicit when-not, prerequisites, or alternative (e.g., solve_sketch vs solve_mates). Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_sketchSolve SketchARead-onlyIdempotentInspect
Use this when you need to solve a 2D sketch constraint set. Solve a 2D sketch constraint set. Side-effect-free: pass { entities, constraints } and receive solved entities plus the original constraints. Entities are POINT, LINE, and CIRCLE records; constraints use the kernelCAD constraint vocabulary.
| Name | Required | Description | Default |
|---|---|---|---|
| entities | Yes | Sketch entities to solve. Lines reference point ids; circles reference a center point id. | |
| constraints | Yes | Constraints to apply to the entities. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the description doesn't need to re-argue safety. It nevertheless adds real context beyond them: the pass-and-receive contract ('receive solved entities plus the original constraints') and the fact that constraints follow the kernelCAD vocabulary, which is not derivable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences say the same thing twice ('Use this when you need to solve a 2D sketch constraint set. Solve a 2D sketch constraint set.'), which is wasted space. The remaining content is appropriately terse and the pass/receive contract is front-loaded, but the duplication is an obvious edit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a solver, the critical unknown is failure behavior — what happens with conflicting, over-constrained, or under-constrained input, and whether partial solutions are returned. Annotations and the existing output schema cover safety and return shape, but the description stays silent on solver outcome semantics, leaving a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the entity/constraint shapes are already documented in detail, including which constraint types require a value. The description only restates the POINT/LINE/CIRCLE entity kinds and points at an external 'kernelCAD constraint vocabulary' without expanding it, so it adds little.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Solve a 2D sketch constraint set', which separates it from the assembly-oriented solve_mates sibling by virtue of the domain (2D sketch constraints vs mates). It never names an alternative explicitly, so the differentiation is implied by wording rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you need to solve a 2D sketch constraint set' is effectively a restatement of the tool name with no condition that excludes anything. There is no when-not guidance and no mention of solve_mates or other siblings; an agent must infer the choice from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweep_toleranceSweep Tolerance RangeARead-onlyIdempotentInspect
Use this when you need to know where and why a design breaks across a tolerance/dimension range, not just whether it builds at one nominal value. Declares one or more param() names with a { values: [...] } list or a { min, max, steps } range (number params are bisected; choice/string params are evaluated as discrete points), re-evaluates the script once per cartesian-product combination (capped at 64 combos — exceeding it truncates to the first 64 and emits kinematic.sweep-tolerance.combo-cap-exceeded), and measures every requirement in the S2 ledger (script require(), dfmSpec, gated FEA, mechanical intent) plus the standard gates on each combo: interference, mounting-hole diameter agreement, and joint-axis binding (all three default on); reachability only when gates.reachable names a tip_link + target. After the coarse grid it bisects each numeric pass/fail transition down to boundaryTolerance and reports the boundary value, the failing side, and the binding requirement/gate names (e.g. "wall fails below 1.840 mm; binding: wall"). Returns per-combo verdicts, firstFailure per gate, firstRequirementFailure per requirement, boundaries[], and a coverage statement that says "checked at N points plus boundaries", never "proven".
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| gates | No | Which standard gates to run per combo. | |
| params | Yes | param() name -> { values: [number|string, ...] } or { min, max, steps }. | |
| assembly | No | Assembly name; defaults to the first captured assembly. | |
| boundaryBudget | No | Maximum extra evaluations spent bisecting boundaries. Default 64; 0 skips bisection. | |
| boundaryTolerance | No | Absolute parameter tolerance for boundary bisection. Default 0.001. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses the cartesian-product re-evaluation model, a hard 64-combo cap with truncation to the first 64 and a named diagnostic (kinematic.sweep-tolerance.combo-cap-exceeded), which gates default on, that reachability requires a tipLink + targetPosition, and that numeric transitions are bisected to boundaryTolerance. Consistent with readOnlyHint=true and destructiveHint=false — this is purely analytical and the description makes that explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the selecting condition, then behavior, then return shape — a sensible order with essentially no filler. It is a single dense run-on sentence chain, though every clause carries distinct information (cap, diagnostic code, bisection, gate defaults), so the length is earned rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter nested-schema tool with an output schema, the description covers the operational model, the caps and failure modes, gate defaults, and even the honesty caveat in the coverage statement ('checked at N points plus boundaries', never 'proven'). An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real semantics: number params are bisected while choice/string params are evaluated as discrete points, the values-list vs min/max/steps forms, gates defaulting on, and reachability only firing when configured. It does not explain boundaryBudget vs boundaryTolerance tradeoffs beyond what the schema already says, keeping it out of the top band.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation (sweep a tolerance/dimension range and locate where and why the design breaks) rather than a generic 'evaluate'. The opening clause 'not just whether it builds at one nominal value' implicitly contrasts it with the single-point evaluation tools in the sibling list (verify, evaluate_script). An agent can distinguish this from any sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use this when you need to know where and why a design breaks across a tolerance/dimension range' clause gives a clear selecting condition, and 'not just whether it builds at one nominal value' draws the boundary against nominal single-point checks. It stops short of naming the alternative sibling tool explicitly, so the agent still has to infer which tool it is being contrasted with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_from_imageTrace Outline from ImageAIdempotentInspect
Use this when you need to trace a reference image into normalized waypoints. Trace pixel-space features from a reference photo into normalized [0..1] waypoints the agent can map to mm via a known scale anchor and feed to path().spline / path().nurbsSegment. Three backends are dispatched behind the scenes: opencv (deterministic; uniform-bg silhouette only), vision-llm (vision model; named points/cluttered backgrounds; needs a configured vision endpoint), and hybrid (opencv silhouette + LLM-labeled named points). Default backend is auto. Per-feature confidence is reported. Pair with the kernelcad-trace-from-image skill for the conversion-to-mm pipeline. Hosted: give the file as an https:// URL, a data: URI (base64, max 25 MB) or "asset:" from request_upload (when the file is on the user's device).
| Name | Required | Description | Default |
|---|---|---|---|
| hint | No | Optional free-text hint forwarded to vision-LLM backends (e.g. "a pair of eyewear; trace the upper brow only"). | |
| intent | No | 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. | |
| priors | No | Caller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts. | |
| backend | No | Force a specific backend; default `auto` routes by corner-color stddev. | |
| features | No | Features to trace. Defaults to a single { label: "silhouette", kind: "silhouette" } when omitted. | |
| imageUrl | Yes | URL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path. Hosted server: pass an https:// URL, a data: URI, or "asset:<id>" from request_upload — not a path on your machine. | |
| validate | No | Assumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open. | |
| scaleAnchor | No | Pixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`. | |
| maxWaypointsPerFeature | No | Cap on waypoints per feature. Defaults to 12 (suitable for medium-inflection outlines). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses backend dispatch and auto-routing by corner-color stddev, the requirement of a configured vision endpoint for vision-llm, per-feature confidence reporting, the 25 MB data-URI cap, and the consequence of omitting scaleAnchor (ledger `scale` becomes `missing`). This is exactly the operational context the annotations alone don't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then organized by backends, confidence, skill pairing, and hosting constraints. Dense but every sentence carries information; the backend parenthetical list is slightly packed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 params, nested objects, an output schema, and the hosted-server deployment quirks, the description covers everything an agent needs to call it correctly: file sourcing rules, backend prerequisites, and defaults. Return values are handled by the output schema, so no gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description still adds meaning: the hosted file-passing constraint (https/data:/asset: only, not a local path), the features default of a single silhouette, the maxWaypointsPerFeature default of 12, and how scaleAnchor drives the ledger. It could have explained validate/priors linkage more, but it earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'trace a reference image into normalized waypoints', plus where those waypoints go (path().spline / nurbsSegment). An agent can distinguish this from siblings like draw_to_cad or mesh_to_features without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit 'Use this when…' condition and explains which backend applies to which image type (uniform-bg silhouette vs. named points/cluttered backgrounds). It doesn't name a competing sibling tool or state exclusions, so it falls short of a 5 but gives clear selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verifyVerify DesignARead-onlyIdempotentInspect
Use this when you need to check a design against a rule set. One verifier, selected by check:
'assembly' — static assembly review ({ file | code }, or the session evaluate_script left): mate validator, default-pose interference, joint topology, mechanical plausibility. ok:false with
blocking[]exactly when review_cad's blocking rules fire on these findings; review_cad also sweeps joint ranges and runs physics.'urdf' — structural validity of a .urdf file ({ urdf_path }).
'dfm' — print-readiness gates declared by dfmSpec() ({ file | code }).
'dfm-preflight' — sheet-metal flat pattern vs a job-shop's ordering rules ({ vendor, material, thicknessIn|thicknessMm, ... }). Returns the vendor's catalog source pages as
sources; whendisclosureis present, show it with those links.'assembly-path' — continuous straight-line removal of each assembly part along ±X/±Y/±Z and optional world-space directions. Returns valid directions, blocking parts and one of three states (removable / blocked / unknown); sequence peels the directional blocking graph and reverses it into a build sequence with a model stamp. Fastened-mate and fixed-connect clusters become subassemblies: each is planned recursively inside and installed as one unit at the top level (
Step.subassembly). Remaining valid orders use deterministic heuristics (subassemblies first, outside-in, fewest reorientations, fewest tool changes); stuck sets get a budgeted blocking-reduction partition and a sampling fallback whose paths are labelled found-by-search, never proven. A fastener with a fastened-matefastenerdeclaration (axis, pitch, optional tool envelope) is tested along its helical path and reportedmotion: helical; a press/snapfitdeclaration becomes arequires-forcestep, never simulated. A modelled driver/socket/hex-key envelope swept along the approach axis addstoolBlocked{ fastener, blockers } and a failing S2 ledger entry; unmodelled tools add nothing. Threaded fasteners without metadata stay unknown: non-straight-path.stability: trueadds an approximate P3 support check at each build step: each part's mesh centre of mass must project inside the support polygon of its contacts with already-stable parts (declared or inferred base/fixture undergravity, default [0,0,-1]); unsupported parts becomeneedsHold{ part, reason, supports } and their steps carrystability: 'needs-hold', while stable steps may carryheldBy. This is a projection, not gravity simulation, friction, tipping or fixture analysis. disassemblyOrder runs a deterministic greedy removal pass. Watertight mesh approximation, conservative contact, no rotation/mate/hardware certification.'swept-collision' — sweep declared joint range(s) and report colliding poses.
'reachable' — inverse-kinematics reachability for an end-effector ({ tip_link, target_position, ... }).
'geometry-quality' — one solid body's BREP tiny faces and short edges (ids, locations, mm²/mm), plus sampled mirror symmetry about centroid XY/YZ/XZ and principal inertia planes ({ file | code, feature_id?, tiny_face_area_mm2?, tiny_face_relative?, short_edge_length_mm?, symmetry_tolerance_mm?, mesh_deflection_mm?, asserted_plane?: { origin, normal } }). Relative area is a fraction of total surface area; thresholds are ORed. Candidate planes are discovery; only an asserted plane gates symmetry. Approximate sampled tessellation, not exact BREP proof.
'fastener-installation' — measured explicit catalog-screw installation stations on lowered assembly BREP ({ file | code, fasteners:[{ part, against, engagementPart?, minEngagementMm?, maxProtrusionMm? }], toleranceMm?, angleToleranceDeg? }). Reports annular bearing gap, bore axis/diameter/overlap and receiver geometric engagement/protrusion. Unknown or zero coverage cannot pass. Simplified threads do not certify torque, preload or strength.
'mounting-holes' — fastened mates: hole pairs one screw can use (equal, or clearance over a tap drill / hole({ thread }) of the same metric size; hole-free faces are a rigid bond) and fastener holes meeting at the contact face are coaxial. Sides it cannot resolve are info, never mismatches.
'load-capacity' — will it hold? Closed-form Euler-Bernoulli beam 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 a sampled pose grid vs each actuated joint's declared actuator capacity ({ joint?, pose?, gravity?, min_torque_margin_pct?, range_samples? }).
'motion-load' — loads on each driven joint (mechanicalJoint on a revolute mate) while the model moves: gravity, inertia from the animationView tracks (finite differences), optional external forces. Mass and inertia come from the solids and density/material, or a part's massKg. Returns per joint peak torque vs the mechanicalJoint torqueNm (margin; < 1x error, < 2x warning), axial / radial force and bending moment on the actuator shaft (checked only against radialLimitN / axialLimitN; without them 'no rating, not checked'), the radial load on each of up to two coaxial supports (each at its station on the shaft: the actuator at the joint origin, else the support's connector on the axis, else the middle of its material nearest the shaft; an ambiguous station is a mechanism.load.not-resolved warning, not a number), the worst pose, a torque-vs-time series, and
partLoads(the worst wrench per part and side in that part's own frame, whichfeaStudy({ loadsFrom })consumes) ({ file | code, motion_mode?: 'tracks'|'range'|'poses', motion_poses?: [{ joint: value }], sample_ms?, range_samples?, quasi_static?, gravity?, motion_loads?: [{ part, point, force, fromMs?, toMs? }], supports?: { joint: [parts] }, series_points? }). Pass supports to compare with and without a bushing. Rigid bodies, tree mate graphs, no friction.'physics' — full mechanism truth with physics engine: kinematic disconnect / interference / DOF checks plus static equilibrium and drop-on-release under gravity ({ file | code, assembly?, physics? }). Returns { ok, mechanism: 'real'|'broken'|'unverified', failures[], coverage }.
'edge-radius' — general edge-break specification on final BREP ({ file | code, min_radius_mm?, max_radius_mm?, require_edge_break?: 'external'|'internal'|'all', feature_id?, assembly?, parts?, edges?, faces? }). Reports sharp convex/concave edges, analytic cylindrical/toroidal fillet radii and spherical junctions, and heuristic planar chamfer strips. Radius bounds apply only to fillets; selectors/points are part-local. Unknown/empty coverage cannot pass. All params except
checkare check-specific and forwarded verbatim; each check fails closed on its own missing required params.
| Name | Required | Description | Default |
|---|---|---|---|
| dxf | No | check:'dfm-preflight' — path to a DXF file. | |
| code | No | Inline kernelCAD script source (same checks as `file`). | |
| file | No | Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold/geometry-quality/edge-radius/requirements). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| mode | No | check:'load-capacity' — 'beam' (default), 'stub', or 'fea' (solve the script's feaStudy: CalculiX + gmsh when installed, else the in-process voxel estimate). | |
| pose | No | check:'static-hold' — explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range. | |
| seed | No | check:'reachable' — numeric IK seed pose (joint name -> deg/mm). | |
| check | Yes | Which verification to run. Omit only when passing call-time `requirements`; then the requirements ledger is the verification. | |
| edges | No | check:'edge-radius' — EdgeQuery or @kc[...] edge ref(s); intersected with faces. Query near sorts, it does not filter. | |
| faces | No | check:'edge-radius' — FaceQuery or @kc[...] face ref(s); includes incident edges and fillets on selected faces. | |
| joint | No | check:'swept-collision' — joint to sweep; omit to sweep every declared joint. check:'static-hold' — joint to evaluate; omit to evaluate every joint with a declared actuator. | |
| loads | No | check:'load-capacity' — partName -> { force?: [Fx,Fy,Fz] N, torque?: [Tx,Ty,Tz] N*m }. | |
| parts | No | check:'edge-radius' — explicit assembly part names (default all). | |
| range | No | check:'swept-collision' — [lower, upper, step] in joint-native units. | |
| study | No | check:'load-capacity' mode:'fea' — feaStudy name (default: the last declared one). | |
| refine | No | check:'load-capacity' mode:'fea' — one automatic finer pass (0.75x element size) when the stress is untrusted, inside the element budget (default true); false solves once at the study's meshSize. | |
| vendor | No | check:'dfm-preflight' — vendor SKU (required for that check). | |
| gravity | No | check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]). check:'assembly-path' with stability:true — gravity direction, world frame, magnitude ignored (default [0, 0, -1]). | |
| service | No | check:'dfm-preflight' — service. | |
| assembly | No | Assembly name; defaults to the first captured assembly. | |
| fixtures | No | check:'assembly-path' with stability:true — declared base/fixture part names, stable from step 1. Default: the lowest part(s) along gravity. | |
| heatmaps | No | check:'load-capacity' mode:'fea' — also render stress heatmap PNGs (default false). | |
| material | No | check:'dfm-preflight' — material SKU (required for that check). | |
| sequence | No | check:'assembly-path' — plan a build sequence { steps, model, unknown, search?, requiresForce?, toolBlocked?, needsHold? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal), and may be motion: helical (declared fastener), requires-force (press/snap, not proven) or search. Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible. | |
| supports | No | check:'motion-load' — mechanicalJoint name -> support part names to use instead of the declared supports (compare with / without a bushing). | |
| tip_link | No | check:'reachable' — end-effector part name (required for that check). | |
| fasteners | No | check:'fastener-installation' — explicit named stations; empty means no coverage. | |
| featureId | No | check:'dfm-preflight' — FeatureId to scope to. | |
| materials | No | check:'load-capacity' — partName -> material declaration. | |
| mesh_size | No | check:'load-capacity' mode:'fea' — element size override, mm. | |
| sample_ms | No | check:'motion-load' — timeline sample step, ms (default 20). Inertia peaks depend on it at keyframe velocity steps. | |
| stability | No | check:'assembly-path' — run the approximate P3 static-stability pass on the sequence. Each part's closed-mesh volume centroid (uniform density) must project inside the convex hull of its contacts with already-stable parts. Unsupported parts become needsHold { part, reason, supports } and ok:false; a stable step may carry heldBy. Not a physics simulation. | |
| urdf_path | No | check:'urdf' — path to the .urdf file. | |
| directions | No | check:'assembly-path' — additional nonzero world-space removal vectors; normalized and deduplicated. | |
| feature_id | No | check:'geometry-quality' — body feature to measure; defaults to script return. check:'edge-radius' — lowered feature; default the returned model. | |
| motion_mode | No | check:'motion-load' — 'tracks' (default): along the animationView timeline with inertia; 'range': quasi-static grid over each driven joint's limits; 'poses': exactly motion_poses (a user-named pose is one entry). | |
| thicknessIn | No | check:'dfm-preflight' — material thickness in inches. | |
| thicknessMm | No | check:'dfm-preflight' — material thickness in millimeters. | |
| toleranceMm | No | check:'fastener-installation' — linear tolerance, default .05 mm. | |
| motion_loads | No | check:'motion-load' — external forces: [{ part, point: [x,y,z] mm in the part's modeled frame, force: [Fx,Fy,Fz] N world, fromMs?, toMs? }]. | |
| motion_poses | No | check:'motion-load' motion_mode:'poses' — explicit mate poses, each an object of joint name -> value in degrees. | |
| quasi_static | No | check:'motion-load' — drop velocity/acceleration terms (gravity and external loads only). | |
| requirements | No | Call-time external requirements ([{ name, predicate }]) measured in the same ledger as script require(), dfmSpec and feaStudy, tagged source: 'external' and never persisted. The predicate is the serializable form of require(): { metric: clearance | distance | mass | volume | bbox | centerOfMass | count | innerLoops | angle | concentric | coplanar, a?, b?, op: gte | lte | eq | between | within, limit, tolerance?, density? }. Operands are { kind: body | faces | edges | part, ref: <feature id/name or part name>, query? }. With `check` omitted the ledger is the whole verification; check 'requirements' is the explicit form. | |
| max_radius_mm | No | check:'edge-radius' — maximum fillet radius in mm; must be >= min_radius_mm. | |
| min_radius_mm | No | check:'edge-radius' — minimum fillet radius in mm (does not imply sharp-edge prohibition). | |
| prefer_solver | No | check:'reachable' — force the IK path ('auto' default). | |
| range_samples | No | check:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9). check:'motion-load' motion_mode:'range' — grid points per joint (default 5). | |
| series_points | No | check:'motion-load' — max torque-vs-time points per joint in the result (default 120; 0 omits the series). | |
| asserted_plane | No | check:'geometry-quality' — optional required mirror plane in model coordinates; normal is normalized and must be nonzero. | |
| max_iterations | No | check:'reachable' — numeric-path iteration cap. | |
| refreshCatalog | No | check:'dfm-preflight' — force vendor catalog refresh. | |
| target_position | No | check:'reachable' — target [x, y, z] mm (world frame). | |
| disassemblyOrder | No | check:'assembly-path' — iteratively remove freed parts and return removalOrder or stuckParts. | |
| angleToleranceDeg | No | check:'fastener-installation' — axis tilt tolerance, default 1 degree. | |
| threadedFasteners | No | check:'assembly-path' — part names that need a helical removal. Catalog screw/bolt/nut families are detected automatically; without a fastened-mate fastener declaration (axis/pitch) they remain unknown: non-straight-path. Declare the motion on arm.mate(..., 'fastened', { fastener: { part, axis, pitchMm, tool? }, fit?: { kind, part? } }). | |
| contactToleranceMm | No | check:'assembly-path' with stability:true — surface distance at or below which parts count as touching (default 0.05 mm). | |
| mesh_deflection_mm | No | check:'geometry-quality' — absolute mesh deflection, defaults to tolerance/4; must be <= tolerance/2. | |
| require_edge_break | No | check:'edge-radius' — prohibit sharp convex/external, concave/internal, or all edges. | |
| target_orientation | No | check:'reachable' — target XYZ Euler angles in radians. | |
| tiny_face_area_mm2 | No | check:'geometry-quality' — flag faces strictly below this absolute area; zero disables. | |
| tiny_face_relative | No | check:'geometry-quality' — fraction of total BREP surface area, ORed with absolute threshold. | |
| short_edge_length_mm | No | check:'geometry-quality' — flag edges strictly below this length; zero disables. | |
| min_torque_margin_pct | No | check:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20). | |
| position_tolerance_mm | No | check:'reachable' — position tolerance in mm. | |
| symmetry_tolerance_mm | No | check:'geometry-quality' — maximum sampled mirror-to-mesh distance, mm. | |
| collision_tolerance_mm3 | No | check:'swept-collision' — BREP intersection volume tolerance (mm^3). | |
| safety_factor_threshold | No | check:'load-capacity' — pass/fail safety-factor floor (default 1.5; mode 'fea': the study's minSafetyFactor when declared). | |
| orientation_tolerance_rad | No | check:'reachable' — orientation tolerance in radians. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety bar is low; the description goes far beyond it. It discloses failure semantics ('fails closed on its own missing required params', 'unknown or zero coverage cannot pass'), approximation limits ('This is a projection, not gravity simulation', 'never proven', 'not exact BREP proof'), and result-shape details like `blocking[]`, `needsHold`, `toolBlocked`, and ledger behavior. This is exactly the kind of beyond-annotation context that helps an agent call it correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and organized as a check-by-check list, but the entry is enormous and contains substantial duplication of schema descriptions (e.g., the `stability`, `sequence`, `threadedFasteners`, and `requirements` details are restated near-verbatim). For a 16-mode dispatcher some length is justified, but a good portion of the assembly-path prose is implementation detail that does not help an agent select or invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 67 parameters, nested objects, an output schema, and annotation coverage of the safety profile, the description supplies the missing glue: the check selector semantics, per-check required inputs, failure/coverage caveats, and what several checks do not prove. An agent has enough to choose a check and pass the right parameters without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every one of the 67 properties already carries a check-scoped description, so the schema does the heavy lifting. The prose adds useful cross-parameter semantics ('all params except `check` are check-specific and forwarded verbatim; each check fails closed on its own missing required params') and clarifies the omitted-check/requirements relationship. Beyond that, most per-check narratives restate what the schema already labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('check a design against a rule set') and the `check` enumeration makes each of the 16 verification modes concrete (assembly review, URDF validity, DFM gates, swept collision, IK reachability, FEA, etc.). It even distinguishes itself from review_cad by explaining the blocking-rule relationship. What it does not do is clearly separate itself from siblings like dfm_review, run_fea, inspect, or physics-vs-physics checks, so an agent still has to reason about overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each `check` value carries an explicit 'use this for' statement (e.g., 'assembly — static assembly review', 'load-capacity — will it hold?', 'dfm-preflight — sheet-metal flat pattern vs a job-shop's ordering rules'), which is strong when-to-use guidance. It also states the fail-closed rule. It does not, however, say when to prefer this tool over siblings like dfm_review, run_fea, inspect, or review_cad, nor does it give explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
why_did_this_failExplain FailureARead-onlyIdempotentInspect
Use this when you need to trace why a feature failed. Walk the upstream chain of a failing feature. Returns the diagnostics of the requested feature plus the diagnostics of every upstream feature in topological order (the requested feature is the last entry). Per-code hints are inline on every diagnostic — call lookup_diagnostics for the full catalogue. Pass { file?, code?, feature_id? }.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| file | No | Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project. | |
| feature_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real value beyond them: traversal scope ('upstream chain'), result ordering (topological, requested feature last), and the fact that per-code hints are inline so no follow-up call is strictly needed. It omits edge behavior such as what happens with an invalid feature_id or an unbounded chain, which would be the remaining valuable detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger, then traversal behavior, then output ordering, then the sibling pointer. Four compact sentences, each carrying distinct information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description still usefully adds the ordering guarantee. For a three-optional-parameter read tool this is nearly sufficient, with the only real hole being the meaning of the code/feature_id selectors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% — just `file` is documented — yet the description only restates the parameter list as '{ file?, code?, feature_id? }' without explaining what `code` or `feature_id` mean or which one drives the trace. The file-hosting caveat is contributed by the schema itself, not the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('trace why a feature failed', 'walk the upstream chain of a failing feature') and distinguishes itself from lookup_diagnostics by positioning that sibling as the full catalogue versus this tool's targeted upstream trace. An agent can identify the right tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('use this when you need to trace why a feature failed') and names the alternative tool with the condition that selects it ('call lookup_diagnostics for the full catalogue'). It does not exclude nearby siblings like inspect or verify, so it falls short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_bomWrite Bill of MaterialsADestructiveInspect
Use this to merge a supplied handoff BOM with optional KernelCAD catalog parts, MPNs and pricing, write a local CSV, and return Sheets-ready rows. Pass exactly one of handoff, handoff_json or handoff_path. The default output is a new file under artifacts/bom; an explicit output_path selects another allowed destination. Existing files are preserved unless overwrite:true, which replaces the destination. This tool makes no Google API calls.
| Name | Required | Description | Default |
|---|---|---|---|
| handoff | No | BOM handoff object. Supply exactly one handoff source. | |
| overwrite | No | Set true to replace an existing CSV destination. Existing files are otherwise preserved. | |
| output_path | No | Optional CSV destination. Defaults to artifacts/bom/bom-<id>.csv. | |
| handoff_json | No | JSON text containing a handoff object with parts; use instead of handoff or handoff_path. | |
| handoff_path | No | Path to a handoff JSON file; use instead of handoff or handoff_json. | |
| catalog_parts | No | Optional catalog entries matched by ref or catalog id; unmatched entries become additional rows. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations mark the tool as destructive and non-idempotent, and the description adds concrete context: existing files are preserved unless overwrite:true, which replaces the destination, and it makes no Google API calls. It also discloses that it writes a local CSV and returns Sheets-ready rows. This goes beyond the annotations and clarifies the safety implications of overwrite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, starting with the core action and then covering source selection, output destination, overwrite behavior, and the no-Google-API note. Every sentence contributes useful operational context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, nested handoff structures, a true output schema, and destructive overwrite behavior, the description provides enough context for correct invocation. It covers input source exclusivity, output destination, overwrite semantics, and the absence of Google API calls, while the output schema handles return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter thoroughly. The description reinforces the exclusive handoff source constraint, default output path, and overwrite semantics, but it does not add significant new meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific multi-step action: merge a handoff BOM with optional catalog parts, write a local CSV, and return Sheets-ready rows. It clearly identifies the resource and output artifact, and no sibling tool performs this BOM-writing function, so the agent can distinguish it easily.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for merging and writing a BOM, and instructs passing exactly one of handoff, handoff_json, or handoff_path. It also clarifies default versus explicit output paths and overwrite behavior. It does not name alternative sibling tools for related tasks like pricing or ordering, but the main usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
write_bom11 fields changed- added
Input schema / allOfAdded value: +[ + { + "oneOf": [ + { + "required": [ + "handoff" + ] + }, + { + "required": [ + "handoff_json" + ] + }, + { + "required": [ + "handoff_path" + ] + } + ] + } +] - changed
Input schema / properties / catalog_parts / descriptionPrevious value: -"Optional matching KernelCAD catalog entries with id/ref, partNumber, vendor and price."New value: +"Optional catalog entries matched by ref or catalog id; unmatched entries become additional rows." - added
Input schema / properties / catalog_parts / items / propertiesAdded value: +{ + "currency": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "partNumber": { + "type": [ + "string", + "null" + ] + }, + "price": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + }, + { + "properties": { + "amount": { + "minimum": 0, + "type": "number" + }, + "currency": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "amount" + ], + "type": "object" + } + ] + }, + "qty": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + "ref": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "vendor": { + "type": [ + "string", + "null" + ] + } +} - changed
Input schema / properties / handoff / descriptionPrevious value: -"Handoff object with a parts array."New value: +"BOM handoff object. Supply exactly one handoff source." - added
Input schema / properties / handoff / propertiesAdded value: +{ + "parts": { + "items": { + "properties": { + "catalog_id": { + "type": [ + "string", + "null" + ] + }, + "mpn": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "properties": { + "source": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + } + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "part": { + "type": [ + "string", + "null" + ] + }, + "qty": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + "quantity": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + "ref": { + "description": "Non-empty part reference, e.g. R1.", + "pattern": "\\S", + "type": "string" + }, + "source": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + } +} - added
Input schema / properties / handoff / requiredAdded value: +[ + "parts" +] - changed
Input schema / properties / handoff_json / descriptionPrevious value: -"Handoff JSON text."New value: +"JSON text containing a handoff object with parts; use instead of handoff or handoff_path." - added
Input schema / properties / handoff_json / examplesAdded value: +[ + "{\"parts\":[{\"ref\":\"R1\",\"quantity\":2}]}" +] - added
Input schema / properties / handoff_json / minLengthAdded value: +1 - changed
Input schema / properties / handoff_path / descriptionPrevious value: -"Path to handoff JSON."New value: +"Path to a handoff JSON file; use instead of handoff or handoff_json." - added
Input schema / properties / handoff_path / minLengthAdded value: +1
1 tool update
- Changed
open_in_studio1 field changed- changed
Input schema / properties / attachments / maxItemsPrevious value: -32New value: +64
1 tool update
- Changed
set_param3 fields changed- changed
Input schema / properties / new_value / descriptionPrevious value: -"The new default value. Either a number for a numeric param (e.g. 12.5), or a string expression evaluated in the script (e.g. \"width/2 + 3\")."New value: +"The new default value. A number for a numeric param (e.g. 12.5), a string expression evaluated in the script (e.g. \"width/2 + 3\") or a choice/colour, or true/false for a boolean param." - changed
Input schema / properties / new_value / examplesPrevious value: -[ - 12.5, - "width/2 + 3" -]New value: +[ + 12.5, + "width/2 + 3", + true +] - changed
Input schema / properties / new_value / oneOfPrevious value: -[ - { - "type": "number" - }, - { - "type": "string" - } -]New value: +[ + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "boolean" + } +]
1 tool update
- Added
report_need
2 tool updates
- Added
estimate_assembly_manufacturing - Added
request_assembly_quote
2 tool updates
- Changed
add_connector1 field changed- changed
Input schema / properties / origin / oneOfPrevious value: -[ - { - "description": "[x, y, z] shorthand.", - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - }, - { - "description": "Explicit numeric origin.", - "properties": { - "kind": { - "enum": [ - "vec3" - ], - "type": "string" - }, - "value": { - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - } - }, - "required": [ - "kind", - "value" - ], - "type": "object" - }, - { - "description": "Topology-derived origin.", - "properties": { - "kind": { - "enum": [ - "topology" - ], - "type": "string" - }, - "query": { - "properties": { - "kind": { - "enum": [ - "face-center", - "face-normal", - "vertex", - "edge-axis" - ], - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "kind", - "name" - ], - "type": "object" - } - }, - "required": [ - "kind", - "query" - ], - "type": "object" - } -]New value: +[ + { + "description": "[x, y, z] shorthand.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + { + "description": "Explicit numeric origin.", + "properties": { + "kind": { + "enum": [ + "vec3" + ], + "type": "string" + }, + "value": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "description": "Topology-derived origin.", + "properties": { + "kind": { + "enum": [ + "topology" + ], + "type": "string" + }, + "query": { + "properties": { + "kind": { + "enum": [ + "face-center", + "face-normal", + "vertex", + "edge-axis", + "hole-axis" + ], + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + } + }, + "required": [ + "kind", + "query" + ], + "type": "object" + } +]
- Changed
export2 fields changed- changed
Input schema / properties / no_verify / descriptionPrevious value: -"Skip the STL watertight verify gate."New value: +"Skip the default STL/STEP validity and watertightness gates." - changed
Input schema / properties / options / descriptionPrevious value: -"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"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. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. obj and usd are mesh exports with no extra options; usd writes ASCII USDA (millimeter, Z-up). svg-drawing: { views?: [\"front\"], sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. views:[\"front\"] produces a centred front-only elevation for SVG or PDF; omit views for four views. Front-only sheets require front annotations and reject isometric balloons/exploded overlays. 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\"], dimensioningStyle?: \"baseline\"|\"chain\"|\"symmetry\" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, views?: [\"front\"], annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: \"general\"|\"machining\"|\"sheet-metal\" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. Functional drawing review: shape.drawingReview(plan) source declarations merge with reviewPlans?: additional plans; decisionResolutions?: { [encodeURIComponent(planId)+\":\"+encodeURIComponent(decisionId)]: { note, provenance } }. drawing_report.review reports declared geometric-callout coverage and unresolved engineering decisions. requireCompleteReview?: true rejects incomplete/not-declared mechanical reviews before export; architectural style rejects review contracts. Coverage is not engineering certification. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. 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."New value: +"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. step: { unit?: \"mm\"|\"cm\"|\"in\", verify?: boolean } (verify defaults to true and checks B-rep validity plus mesh watertightness; false skips both). stl: { verify?: boolean } (defaults to true). dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance?, section?: { axis: \"x\"|\"y\"|\"z\", at: mm }, layout?: \"per-part\"|\"sheet\" }. 3mf: { printUnit?: \"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. gcode: { printer?: printer profile id, layerHeight?: mm, infill?: percent, supports?: boolean, material?: string }; requires a locally installed OrcaSlicer. Returns slicer predictions as gcode_stats; does not start a printer. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. obj and usd are mesh exports with no extra options; usd writes ASCII USDA (millimeter, Z-up). svg-drawing: { views?: [\"front\"], sheet?: \"a4\"|\"a3\" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. views:[\"front\"] produces a centred front-only elevation for SVG or PDF; omit views for four views. Front-only sheets require front annotations and reject isometric balloons/exploded overlays. 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\"], dimensioningStyle?: \"baseline\"|\"chain\"|\"symmetry\" }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. pdf-drawing: { sheet?: \"a4\"|\"a3\"|\"a2\"|\"a1\"|\"a0\"|\"ansi-a\"|\"ansi-b\"|\"ansi-c\"|\"ansi-d\"|\"ansi-e\"|\"auto\"|\"auto-ansi\" (default \"a3\"), projection?: \"third\"|\"first\", title?, partName?, material?, revision?, date? (default today), modelName?, views?: [\"front\"], annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } — the svg-drawing keys mean the same. Mechanical SVG/PDF also accept draftingProfile?: \"general\"|\"machining\"|\"sheet-metal\" or { id, name, sheet, projection, dimensioningStyle, tolerance?, notes? }, with explicit options overriding profile defaults. Functional drawing review: shape.drawingReview(plan) source declarations merge with reviewPlans?: additional plans; decisionResolutions?: { [encodeURIComponent(planId)+\":\"+encodeURIComponent(decisionId)]: { note, provenance } }. drawing_report.review reports declared geometric-callout coverage and unresolved engineering decisions. requireCompleteReview?: true rejects incomplete/not-declared mechanical reviews before export; architectural style rejects review contracts. Coverage is not engineering certification. annotationOverrides?: { [drawing_report.annotations[i].id]: { suppress?, text?, view?, offset? } }; offset is extra nonnegative sheet mm. Text edits primary labels while preserving attached FCFs; datum/standalone FCF text is changed in its declaration instead. Suppressed rows remain in the report but not visible counts. Missing IDs warn after geometry edits. Authored annotations can set id for stable review identity. 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."
1 tool update
- Changed
open_in_studio1 field changed- added
Output schema / properties / project_idAdded value: +{ + "description": "Stable project UUID for collaboration tools such as join_project.", + "type": "string" +}
2 tool updates
- Changed
set_param1 field changed- added
Input schema / properties / previewAdded value: +{ + "description": "S6 edit preview: evaluate the edit in a scratch session and return geometry + requirements-ledger + S1 binding diffs. Writes nothing. Default false (the normal source-edit result).", + "type": "boolean" +}
- Changed
verify8 fields changed- added
Input schema / properties / contactToleranceMmAdded value: +{ + "description": "check:'assembly-path' with stability:true — surface distance at or below which parts count as touching (default 0.05 mm).", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / fixturesAdded value: +{ + "description": "check:'assembly-path' with stability:true — declared base/fixture part names, stable from step 1. Default: the lowest part(s) along gravity.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array", + "uniqueItems": true +} - changed
Input schema / properties / gravity / descriptionPrevious value: -"check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81])."New value: +"check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]). check:'assembly-path' with stability:true — gravity direction, world frame, magnitude ignored (default [0, 0, -1])." - changed
Input schema / properties / motion_mode / descriptionPrevious value: -"check:'motion-load' — 'tracks' (default): along the animationView timeline with inertia; 'range': quasi-static grid over each driven joint's limits."New value: +"check:'motion-load' — 'tracks' (default): along the animationView timeline with inertia; 'range': quasi-static grid over each driven joint's limits; 'poses': exactly motion_poses (a user-named pose is one entry)." - changed
Input schema / properties / motion_mode / enumPrevious value: -[ - "tracks", - "range" -]New value: +[ + "tracks", + "range", + "poses" +] - added
Input schema / properties / motion_posesAdded value: +{ + "description": "check:'motion-load' motion_mode:'poses' — explicit mate poses, each an object of joint name -> value in degrees.", + "items": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / sequence / descriptionPrevious value: -"check:'assembly-path' — plan a build sequence { steps, model, unknown, search?, requiresForce?, toolBlocked? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal), and may be motion: helical (declared fastener), requires-force (press/snap, not proven) or search. Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible."New value: +"check:'assembly-path' — plan a build sequence { steps, model, unknown, search?, requiresForce?, toolBlocked?, needsHold? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal), and may be motion: helical (declared fastener), requires-force (press/snap, not proven) or search. Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible." - added
Input schema / properties / stabilityAdded value: +{ + "description": "check:'assembly-path' — run the approximate P3 static-stability pass on the sequence. Each part's closed-mesh volume centroid (uniform density) must project inside the convex hull of its contacts with already-stable parts. Unsupported parts become needsHold { part, reason, supports } and ok:false; a stable step may carry heldBy. Not a physics simulation.", + "type": "boolean" +}
2 tool updates
- Changed
sweep_tolerance2 fields changed- added
Input schema / properties / boundaryBudgetAdded value: +{ + "description": "Maximum extra evaluations spent bisecting boundaries. Default 64; 0 skips bisection.", + "type": "number" +} - added
Input schema / properties / boundaryToleranceAdded value: +{ + "description": "Absolute parameter tolerance for boundary bisection. Default 0.001.", + "type": "number" +}
- Changed
verify2 fields changed- changed
Input schema / properties / sequence / descriptionPrevious value: -"check:'assembly-path' — plan a build sequence { steps, model, unknown, search? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal). Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible."New value: +"check:'assembly-path' — plan a build sequence { steps, model, unknown, search?, requiresForce?, toolBlocked? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal), and may be motion: helical (declared fastener), requires-force (press/snap, not proven) or search. Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible." - changed
Input schema / properties / threadedFasteners / descriptionPrevious value: -"check:'assembly-path' — part names that need a helical removal. Catalog screw/bolt/nut families are detected automatically; these are reported unknown: non-straight-path until P2."New value: +"check:'assembly-path' — part names that need a helical removal. Catalog screw/bolt/nut families are detected automatically; without a fastened-mate fastener declaration (axis/pitch) they remain unknown: non-straight-path. Declare the motion on arm.mate(..., 'fastened', { fastener: { part, axis, pitchMm, tool? }, fit?: { kind, part? } })."
3 tool updates
- Changed
design_loop1 field changed- added
Input schema / properties / requirementsAdded value: +{ + "description": "Call-time external requirements ([{ name, predicate }]) every attempt is graded against, in the same ledger as script require(). Predicate shape: { metric, a?, b?, op, limit, tolerance?, density? }; operands: { kind: body | faces | edges | part, ref, query? }. A failing or not-evaluated requirement blocks the attempt even with no expert geometry.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
- Changed
evaluate_script1 field changed- added
Input schema / properties / requirementsAdded value: +{ + "description": "Call-time external requirements ([{ name, predicate }]) measured in the same `requirements` ledger, tagged source: 'external' and never persisted. The predicate is the serializable form of require(): { metric: clearance | distance | mass | volume | bbox | centerOfMass | count | innerLoops | angle | concentric | coplanar, a?, b?, op: gte | lte | eq | between | within, limit, tolerance?, density? }. Operands are { kind: body | faces | edges | part, ref: <feature id/name or part name>, query? }.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
- Changed
verify6 fields changed- changed
Input schema / properties / check / descriptionPrevious value: -"Which verification to run."New value: +"Which verification to run. Omit only when passing call-time `requirements`; then the requirements ledger is the verification." - changed
Input schema / properties / check / enumPrevious value: -[ - "assembly", - "urdf", - "dfm", - "dfm-preflight", - "swept-collision", - "reachable", - "mounting-holes", - "load-capacity", - "static-hold", - "motion-load", - "fastener-installation", - "geometry-quality", - "assembly-path", - "edge-radius" -]New value: +[ + "assembly", + "urdf", + "dfm", + "dfm-preflight", + "swept-collision", + "reachable", + "mounting-holes", + "load-capacity", + "static-hold", + "motion-load", + "fastener-installation", + "geometry-quality", + "assembly-path", + "edge-radius", + "physics", + "requirements" +] - changed
Input schema / properties / file / descriptionPrevious value: -"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold/geometry-quality/edge-radius). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project."New value: +"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold/geometry-quality/edge-radius/requirements). Hosted server: cannot read files from your machine — pass `code`, or `project:<slug>` for a saved project." - added
Input schema / properties / requirementsAdded value: +{ + "description": "Call-time external requirements ([{ name, predicate }]) measured in the same ledger as script require(), dfmSpec and feaStudy, tagged source: 'external' and never persisted. The predicate is the serializable form of require(): { metric: clearance | distance | mass | volume | bbox | centerOfMass | count | innerLoops | angle | concentric | coplanar, a?, b?, op: gte | lte | eq | between | within, limit, tolerance?, density? }. Operands are { kind: body | faces | edges | part, ref: <feature id/name or part name>, query? }. With `check` omitted the ledger is the whole verification; check 'requirements' is the explicit form.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / sequenceAdded value: +{ + "description": "check:'assembly-path' — plan a build sequence { steps, model, unknown, search? }. Fastened/fixed clusters become subassemblies planned inside and installed as one unit; steps carry the insertion direction (reverse removal). Stuck sets use a budgeted partition; non-straight paths found by sampling are labelled found-by-search and are not proven. Blocked and unknown parts are not reported as impossible.", + "type": "boolean" +} - added
Input schema / properties / threadedFastenersAdded value: +{ + "description": "check:'assembly-path' — part names that need a helical removal. Catalog screw/bolt/nut families are detected automatically; these are reported unknown: non-straight-path until P2.", + "items": { + "type": "string" + }, + "type": "array" +}
1 tool update
- Changed
evaluate_script1 field changed- added
Input schema / properties / baselineAdded value: +{ + "description": "The `selections` of an earlier evaluation of this model. A selector that now binds to a different face or edge is reported as selector.binding-changed (warning), one whose entity only moved or resized as selector.binding-moved (info). Defaults to the previous evaluation of the same `file`.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
11 tool updates
- Changed
add_mate1 field changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "direct-horn", - "link-rod", - "four-bar", - "gear-pair", - "belt", - "tendon" -]New value: +[ + "direct", + "link-rod", + "four-bar", + "gear-pair", + "belt", + "tendon" +]
- Added
blockout_assembly - Changed
design_loop3 fields changed- removed
Input schema / properties / bodyLikenessRemoved value: -{ - "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" -} - removed
Input schema / properties / gripperApertureRemoved value: -{ - "description": "Optional gripper aperture request forwarded to review_cad.", - "type": "object" -} - removed
Input schema / properties / likenessProfileRemoved value: -{ - "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" -}
- Changed
explode_view2 fields changed- removed
Input schema / properties / handoffRemoved value: -{ - "additionalProperties": true, - "description": "Optional handoff metadata. Assembly order lookup supports assembly_order or assembly.order.", - "type": "object" -} - changed
Input schema / properties / parts / descriptionPrevious value: -"Named assembly parts and measured bbox centers/sizes in mm. Optional when handoff is supplied."New value: +"Named assembly parts and measured bbox centers/sizes in mm."
- Changed
fetch_part2 fields changed- added
Input schema / properties / includeModelAdded value: +{ + "description": "Resolve a hash-verified STEP/GLB model file instead of the plain catalog STEP record.", + "type": "boolean" +} - added
Input schema / properties / modelAdded value: +{ + "description": "Verified model options; supplying model implies includeModel.", + "properties": { + "attribution": { + "type": "string" + }, + "expectedBboxMm": { + "description": "Expected [x,y,z] dimensions to compare with the measured model.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "license": { + "description": "License string supplied by the source.", + "type": "string" + }, + "sha256": { + "description": "Required SHA-256 digest for an explicit URL; for catalog parts it overrides the catalog GLB digest.", + "type": "string" + }, + "source": { + "description": "Catalog or manufacturer name, such as KiCad Packages3D.", + "type": "string" + }, + "toleranceRatio": { + "description": "Relative expected-versus-measured bbox tolerance, default 0.25.", + "type": "number" + }, + "url": { + "description": "Direct public HTTPS .step/.stp/.glb download URL. Requires sha256, source and license.", + "type": "string" + } + }, + "type": "object" +}
- Removed
fetch_part_model - Removed
import_handoff - Changed
review_cad8 fields changed- removed
Input schema / properties / gripperApertureRemoved value: -{ - "description": "Optional fingertip connector refs for gripper aperture travel reporting.", - "properties": { - "left": { - "description": "Left fingertip connector ref such as \"left-finger.tip\".", - "type": "string" - }, - "right": { - "description": "Right fingertip connector ref such as \"right-finger.tip\".", - "type": "string" - } - }, - "type": "object" -} - removed
Input schema / properties / includePhysicalUseCaseJointReactionsRemoved value: -{ - "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" -} - removed
Input schema / properties / includePhysicalUseCaseJointStructureRemoved value: -{ - "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" -} - removed
Input schema / properties / includePhysicalUseCaseReachabilityRemoved value: -{ - "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" -} - removed
Input schema / properties / includePhysicalUseCaseStaticsRemoved value: -{ - "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" -} - added
Input schema / properties / physicalUseCaseLevelAdded value: +{ + "description": "Escalating physical-use-case depth; each level includes the previous. 'reachability': targeted sampling over scalar-limited mates named in actuatorLimits, rejecting contacts that cannot get within criteria.maxSlipMm and multi-contact use cases that cannot satisfy every contact in the same sampled actuator pose (revolute/cylindrical/pin-slot limitsDeg, prismatic limitsMm). 'statics': adds pose-bound quasi-static certification at the exact common-contact samples (conservative friction/capacity, world force and moment balance, finite-difference revolute actuator torque); returns physicalUseCaseStaticCertificates on success. 'reactions': adds exact-pose reaction wrenches through uniquely rooted articulated trees, compared against each loaded mate's declared resultant force/moment envelope, and runs the clevis double-shear / pin-bending / bearing / tear-out / net-section check (minimum factor of safety 2) automatically for mates built with joint.clevis. Defaults to 'reachability' when requirePhysicalUseCase is true.", + "enum": [ + "reachability", + "statics", + "reactions" + ], + "type": "string" +} - removed
Input schema / properties / physicalUseCaseReachabilitySamplesPerMateRemoved value: -{ - "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" -} - added
Input schema / properties / physicalUseCaseSamplesPerMateAdded value: +{ + "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" +}
- Removed
route_wires - Changed
trace_from_image1 field changed- removed
Input schema / properties / detectPartsRemoved value: -{ - "description": "Optional: use the configured vision model to detect labeled component boxes and return detectedParts plus a draftBom, normalized to the traced outline frame.", - "type": "boolean" -}
- Changed
verify8 fields changed- removed
Input schema / properties / body_bboxRemoved value: -{ - "description": "check:'body-likeness' — body AABB { min:[x,y,z], max:[x,y,z] } in mm.", - "type": "object" -} - removed
Input schema / properties / body_feature_idRemoved value: -{ - "description": "check:'body-likeness' — FeatureId to read body AABB from when body_bbox omitted.", - "type": "string" -} - removed
Input schema / properties / cabin_bboxRemoved value: -{ - "description": "check:'body-likeness' — optional cabin/greenhouse AABB for automated cabin-aft.", - "type": "object" -} - changed
Input schema / properties / check / enumPrevious value: -[ - "assembly", - "urdf", - "dfm", - "dfm-preflight", - "swept-collision", - "reachable", - "mounting-holes", - "load-capacity", - "static-hold", - "motion-load", - "body-likeness", - "fastener-installation", - "geometry-quality", - "assembly-path", - "edge-radius" -]New value: +[ + "assembly", + "urdf", + "dfm", + "dfm-preflight", + "swept-collision", + "reachable", + "mounting-holes", + "load-capacity", + "static-hold", + "motion-load", + "fastener-installation", + "geometry-quality", + "assembly-path", + "edge-radius" +] - removed
Input schema / properties / length_axisRemoved value: -{ - "description": "check:'body-likeness' — wheelbase axis (default 'x').", - "enum": [ - "x", - "y" - ], - "type": "string" -} - removed
Input schema / properties / require_stillsRemoved value: -{ - "description": "check:'body-likeness' — require still_verdicts (default true).", - "type": "boolean" -} - removed
Input schema / properties / still_verdictsRemoved value: -{ - "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" -} - removed
Input schema / properties / wheelsRemoved value: -{ - "description": "check:'body-likeness' — wheel centres + tire radii [{ center:[x,y,z], radius }].", - "items": { - "type": "object" - }, - "type": "array" -}
1 tool update
- Changed
render_preview2 fields changed- added
Input schema / properties / screenshot_timeout_msAdded value: +{ + "description": "Playwright screenshot deadline in milliseconds. Default leaves Playwright's 30 s in place; raise it for heavy lofts or a slow machine.", + "maximum": 600000, + "minimum": 1000, + "type": "integer" +} - added
Input schema / properties / shadingAdded value: +{ + "description": "Mesh shading: 'smooth' uses the kernel's vertex normals (default); 'flat' uses face normals to expose tessellation / surface wobble.", + "enum": [ + "smooth", + "flat" + ], + "type": "string" +}
7 tool updates
- Changed
add_mate1 field changed- added
Input schema / properties / pose / typeAdded value: +"object"
- Changed
inspect2 fields changed- added
Input schema / properties / edges / typeAdded value: +[ + "object", + "array", + "string" +] - added
Input schema / properties / faces / typeAdded value: +[ + "object", + "array", + "string" +]
- Changed
query1 field changed- added
Input schema / properties / query / typeAdded value: +[ + "string", + "object" +]
- Changed
resolve_assumptions1 field changed- added
Input schema / properties / resolutions / items / properties / value / typeAdded value: +[ + "string", + "number", + "boolean", + "array", + "object" +]
- Changed
run_fea2 fields changed- added
Input schema / properties / fixed / typeAdded value: +[ + "string", + "object" +] - added
Input schema / properties / material / typeAdded value: +[ + "string", + "object" +]
- Changed
trace_from_image1 field changed- added
Input schema / properties / priors / items / properties / value / typeAdded value: +[ + "string", + "number", + "boolean", + "array", + "object" +]
- Changed
verify3 fields changed- added
Input schema / properties / edges / typeAdded value: +[ + "object", + "array", + "string" +] - added
Input schema / properties / faces / typeAdded value: +[ + "object", + "array", + "string" +] - added
Input schema / properties / pose / typeAdded value: +[ + "object", + "array" +]
2 tool updates
- Changed
export1 field changed- changed
Input schema / properties / format / enumPrevious value: -[ - "stl", - "step", - "dxf", - "3mf", - "glb", - "obj", - "usd", - "svg-drawing", - "pdf-drawing", - "urdf", - "srdf", - "sdf-gazebo", - "usd-isaac", - "bom-csv", - "bom-json", - "bend-table", - "gcode" -]New value: +[ + "stl", + "step", + "dxf", + "3mf", + "glb", + "obj", + "usd", + "svg-drawing", + "pdf-drawing", + "urdf", + "srdf", + "sdf-gazebo", + "usd-isaac", + "bom-csv", + "bom-json", + "order-pack", + "bend-table", + "gcode" +]
- Changed
fab_pack1 field changed- added
Input schema / properties / scopeAdded value: +{ + "description": "Default 'part' (a single-part pack). 'bom' packs the whole assembly's BOM: per-part single-body files, per-part drawings, bom.csv/json, vendor handoff texts, and per-process quote links.", + "enum": [ + "part", + "bom" + ], + "type": "string" +}
Related MCP Connectors
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
Design 3D-printable parts by chatting: create, edit, render and publish parametric forges.
DXF and PDF/X-4 for AI agents: structured facts, PNG renders, an interactive in-chat viewer.
Container load planning in Claude & ChatGPT: what fits, how full, a labelled 3D plan in the chat.
Related MCP Servers
- AlicenseAqualityAmaintenanceGive your AI assistant the ability to inspect, measure, and compare 3D CAD models by dropping in a STEP file and asking engineering questions. Runs entirely on your machine with no cloud, no CAD license, and no setup.5207 npm7MIT
- AlicenseNot gradedqualityBmaintenanceEnables conversational creation and editing of STEP CAD models through MCP clients like Codex, Claude, or Cursor, with real-time 3D browser preview and tools for primitives, booleans, mounting holes, flanges, and gripper bases.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to create and modify real Onshape CAD models — sketches, extrudes, fillets, patterns, mates, and parametric variables — with every mutation returning structured status, warnings, and geometric deltas. Includes multi-view PNG rendering, image-reference decomposition, and drawing OCR so the agent can visually verify and iterate on parts and assemblies.MIT
- AlicenseNot gradedqualityAmaintenanceMCP server to control FreeCAD from Claude — parametric modeling, sketches, CAM toolpaths, geometry inspection, and more via 33 tools.63GNU Lesser General Public v2.1 only
Glama MCP Gateway
Add one secure layer between your agents and this server.