kernelcad
Server Details
Agent-first CAD: editable .kcad.ts source, deterministic review, OpenCASCADE kernel.
- Status
- Healthy
- Uptime
- 98.5% over 37 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- w1ne/kernelCAD-web
- GitHub Stars
- 23
- Server Listing
- kernelCAD
TDQS
Scored across 54 tools
The large add_* family is a real selection hazard: add_curve, add_path_segment, add_surface, and add_variable_sweep all target freeform/organic geometry, and add_feature overlaps with all of them as a generic feature-line inserter. Rendering and diffing also overlap (render_preview vs get_latest_render vs open_in_studio; diff_geometry vs diff_scripts), so multiple tools have unclear boundaries despite strong individual descriptions.
Most tools follow a readable snake_case verb_noun pattern (add_*, get_*, lookup_*, set_*, solve_*), which gives the set some predictability. However, outliers like fea_summary, mesh_summary, design_loop, drawing_to_cad, mesh_to_features, and review_paint_peek_latest break the pattern, and bare verbs (export, inspect, query, verify) add further inconsistency.
54 tools is far beyond the well-scoped 3-15 range and will overburden an agent's tool-selection layer. The CAD domain is genuinely broad and some tools internally consolidate many operations (inspect, export, verify), so the count is not absurd, but the surface needs grouping or splitting to become manageable.
The surface covers the full CAD loop well: authoring, evaluation, inspection, rendering, analysis, export, reference conversion, and catalog lookup, with no obvious dead ends in the core workflow. Minor gaps exist—no generic sketch-authoring tool, no project deletion/renaming, and some operations are only reachable through the lower-level add_feature—but agents can work around them.
Available Tools
54 toolsadd_connectorAdd ConnectorAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description states 'side-effect-free', matching the destructiveHint=false annotation. Also explains the return value (modified source + diagnostics), adding useful behavioral context beyond 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?
Two concise sentences plus a code snippet. Purpose is front-loaded, and every element is useful with no 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 output schema exists (not shown, but indicated), the description adequately covers the return value. The tool's complexity is moderate, and the description provides sufficient context for an agent.
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 (86%), so baseline is 3. The description provides a code snippet showing parameter usage, but does not add detailed semantics beyond what the schema already 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?
The description clearly states the tool adds a mate connector to a part, with a specific code insertion example. This distinguishes it from siblings like add_constraint 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?
Provides clear context for when to use this tool (adding a mate connector to a part) and mentions side-effect-free. However, no explicit comparison or when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_constraintAdd ConstraintAInspect
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 |
|---|---|---|
| ok | Yes | |
| errors | No | Validation errors (present on failure). |
| constraints | Yes | Updated constraint list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description explicitly states 'Side-effect-free' which aligns with destructiveHint=false. It explains the tool returns the updated list, indicating no mutation of inputs. This adds valuable behavioral context beyond 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?
Two sentences, no redundant words. Front-loaded with purpose. Every sentence contributes 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?
Given the tool has 2 parameters, nested objects, and output schema, the description covers purpose, usage pattern, and side-effect-free behavior. It does not detail output format, but output schema exists. Minor gap: could mention the output is a new list.
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%. Description adds meaning by explaining the role of each parameter: 'constraints' as existing list (omit for empty), 'constraint' as the one to append. Also mentions 'validated' which hints at input validation.
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 the verb 'add' and resource 'sketch constraint to a list'. It distinguishes from siblings by specifying the domain (sketch constraint) and the action (appending to a list).
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 gives explicit context: 'Use this when you need to add a sketch constraint to a list.' It also provides usage pattern: 'pass { constraints, constraint } and receive the updated list.' It does not mention when not to use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_curveAdd CurveAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses precise insertion location ('immediately before the last top-level return'), side-effect-free behavior, failure behavior ('fails closed on its own missing required params'), and the exact declaration types inserted for each kind. This substantially enriches the agent's model of the 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 description is dense but well-organized: the purpose is front-loaded, followed by kind-specific bullets and downstream consumption. Every sentence contributes to correct invocation (semantics, defaults, failure mode, insertion point), with no fluff.
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 (10 params, nested objects, two authoring paths), the description covers when to use it, what each kind produces, how parameters are interpreted, where code is inserted, and how the result is consumed by sibling tools. The output schema exists, so return values need no extra 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?
Even though schema coverage is 100%, the description adds key meaning: tangent magnitude heuristic ('~ chord length'), curvature default effect (G1-only), NURBS defaults and optional knobs, and the G2 continuity semantics for the hermite path. This goes beyond the schema's basic 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 description states a specific action and resource: it authors a Curve3D into the user's .kcad.ts, with concrete use cases (body feature line, brow, spine rail, G2 blend). This clearly distinguishes it from sibling add_* tools, which target different objects (surfaces, features, connectors).
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 begins with an explicit 'Use this when you need a freeform/organic 3D curve' and lists concrete use cases, providing clear when-to-use context. It does not explicitly state when not to use it or name alternative tools, 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_featureAdd FeatureAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details beyond annotations: insertion location, return of modified code plus diagnostics, and side-effect-free claim. Annotations indicate not read-only and not destructive, which aligns with the description's side-effect-free assertion (no permanent state change).
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 sentences, with a clear front-loaded usage statement. The third sentence about faceLabels and lookup_api is relevant but somewhat tangential; it could be separated. Overall, it is concise and well-structured.
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 presence of an output schema and annotations, the description covers key aspects: insertion logic, return value, side-effect-free nature, and an advanced tip. It could mention edge cases (e.g., no return statement) but is sufficient for typical usage.
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 descriptions for both parameters. The description adds an example for feature_code, clarifying the expected format and syntax beyond the schema's 'Single-statement source line to insert'. This provides practical 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 clearly states the verb 'insert' and the resource 'new feature line into a script', with precise location 'before the last top-level return statement'. This distinguishes it from sibling tools like add_constraint or add_part, which add different script elements.
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 begins with 'Use this when you need to insert a new feature line into a script', providing a clear use case. It also mentions side-effect-free behavior and a tip about faceLabels, but does not explicitly exclude when not to use it or compare to alternatives like add_connector.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_mateAdd MateAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so the tool is not read-only and not destructive. The description adds that it 'durably edit source' and requires code and assembly_binding, plus states that each relation 'fails closed on its own missing required params', providing useful behavioral insight beyond 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 concise (about 10 lines) with a clear front-loaded purpose statement and bullet-pointed breakdown of the three relation types. Every sentence adds value without redundancy. It is well-structured for quick comprehension.
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 (three distinct operations with many parameters), the description sufficiently covers all key aspects: the three relation types, their parameter shapes, common required params, and error behavior. An output schema exists so return values need not be described. The description stands alone as a complete guide for an AI agent.
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 groups parameters by relation type (e.g., 'mate' expects { name, a, b, type, pose?, ... }), which adds structural meaning not explicit in the schema's conditional required blocks. It also explains that non-relation parameters are 'forwarded verbatim', clarifying how to use them.
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 the tool's purpose: 'author a mate-graph relationship into the source'. It breaks down into three specific relation types (mate, coupling, transmission) with distinct parameter sets. This distinctively distinguishes it from sibling tools like add_constraint 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?
The description opens with 'Use this when you need to author a mate-graph relationship', providing clear usage context. It mentions required parameters (code, assembly_binding) and the default relation. However, it does not explicitly compare to alternatives or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_partAdd PartAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the side-effect-free nature ('caller persists the returned source') and explains that it returns modified source plus diagnostics. This goes beyond the annotations (destructiveHint=false, readOnlyHint=false) by clarifying the exact behavioral impact.
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 concise sentences: first states purpose, second explains the exact insertion, third clarifies side-effect-free. Every sentence earns its place with no redundant 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?
Given the complexity (6 parameters, all documented in schema) and the existence of an output schema, the description fully covers what the tool does and its constraints. The return behavior (modified source + diagnostics) is clearly stated.
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?
All 6 parameters have descriptions in the schema (100% coverage). The description does not add further meaning to individual parameters beyond what the schema provides, so baseline of 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?
Clearly states the verb 'add' and resource 'part to an assembly'. Describes the specific action of durably inserting a code line before the final return, distinguishing it from other add_* sibling 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?
Explicitly says 'Use this when you need to add a part to an assembly', providing clear context. Does not mention when not to use or alternatives, but the sibling tools are numerous and distinct.
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 SegmentAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the burden. It discloses that the tool mutates the chain anchor in place, returns modified code plus diagnostics from re-evaluation, is side-effect-free, and fails closed on missing required params. It also explains the exact injection point. This goes well beyond the annotations and gives the agent a complete behavioral picture.
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 well-structured, with a front-loaded usage sentence followed by bullet-style breakdown of the three segment kinds. Every sentence conveys useful information without fluff. It is appropriately detailed for a tool with three variants and 14 parameters, though it could be slightly tightened without losing clarity.
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 three segment kinds, nested objects, and conditional requirements, the description is thorough: it covers the injection point, per-kind parameter constraints (including matching pen position), optional parameters, return value, side-effect behavior, and error handling. Nothing an agent needs to invoke it correctly is missing, especially given the rich input schema and 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?
Even though the schema has 100% description coverage, the tool description adds substantial semantic value: it explains each kind's behavior (e.g., spline interpolates through waypoints, tangents are normalized internally, hermite curvature defaults to G1), enforces constraints like points[0] matching the pen position, and clarifies optional parameters like tension, degree, weights, and knots. This goes far beyond the schema's field-level 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 description clearly states the tool appends a curved segment to an existing PathBuilder chain on a named chain_anchor variable, with three specific kinds (spline, nurbs, hermite). It gives concrete use cases (eyewear brow, ergonomic grip, sneaker midsole) and distinguishes itself from other 'add_*' siblings by focusing on path segments. The verb-resource pair is 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?
The description explicitly says 'Use this when you need a freeform/organic 2D outline...' and specifies that the call is injected at the END of the chain before any .close(). It provides clear context for when to use it but does not explicitly mention alternatives or when not to use it. The guidance is strong, though it stops short of naming competing tools.
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 FeatureAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side-effect-free nature, return value (modified code + diagnostics), pattern implementation as cumulative boolean union, and face ref naming convention. Annotations are consistent (readOnlyHint false, destructiveHint false).
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 single well-structured paragraph, front-loading the core purpose, then covering insertion behavior, returns, side-effects, and geometric notes. Slightly verbose but each sentence adds value.
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 (7 params, nested objects, output schema exists), the description covers return value, side-effect-free nature, pattern unit concept, geometric implications, and face ref naming. It is complete for correct agent usage.
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 the schema already documents most parameters. The description adds value by explaining the role of 'target', 'assign_to', and the return value, but does not re-iterate all schema details.
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 it repeats a feature in a pattern by inserting a pattern call into a script. It distinguishes from siblings like add_feature (general feature addition) and flatten_pattern (different operation).
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 'Use this when you need to repeat a feature in a pattern' and provides context on when each pattern kind is appropriate via the schema. Also gives guidance on additive vs subtractive features.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_surfaceAdd SurfaceAInspect
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) via OCCT BRepOffsetAPI_MakeFilling.
'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 via OCCT BRepBuilderAPI_Sewing. 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' — OCCT NbPtsOnCur sampling parameter (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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals non-obvious behaviors: weights are honored for rational surfaces, trim keeps the largest imprinted piece, split returns a tuple, sew produces a watertight solid and emits open-shell diagnostics, and draft emits feature.draft.failed on invalid geometry. It also notes that returned surfaces produce no Shape until .thicken/.toShape() via add_feature, and that Shape/Curve3D cutters are deferred. This all goes beyond the sparse annotations and is consistent with them.
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 appropriately structured: a purpose sentence followed by five bulleted modes, each with the generated call, required data, and edge-case behavior. The front-loaded opening and bullet hierarchy make it skimmable. Some verbosity is justified by the tool's 5 modes and 23 parameters, 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?
The description covers all five modes, specifying required data, defaults (tolerance, degree bounds), failure semantics (fails closed, open-shell, draft.failed), and the follow-up pipeline (add_feature for thickening/toShape). With an output schema present and annotations minimal, it provides all context an agent needs to select and invoke the correct 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 coverage is 100%, so the baseline is 3. The description adds value by grouping parameters into construction modes (e.g., controls/degree/weights/knots/periodic vs section_sketch_ids for nurbs), documenting boundary edge ordering and the 1e-6 mm coincidence constraint not present in the schema, and clarifying trim/split and continuity defaults. It doesn't restate every schema field, which is appropriate given the schema is rich.
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 immediately states the tool's purpose: 'Use this when you need an organic, freeform, or swept shape... authored as a NURBS Surface' and enumerates five concrete modes (nurbs, boundary, trim, sew, draft). It distinguishes itself from siblings by naming add_feature as the follow-up step and clarifying the surface-authoring/finishing domain.
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 opens with explicit usage context ('Use this when you need...') and provides conditional guidance per kind ('Pass either { controls, ... } or { section_sketch_ids }'). It also points to add_feature as the alternative for converting a surface to a Shape. However, it doesn't explicitly state when not to use the tool, such as for primitive geometry that belongs in add_part.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_textAdd TextAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, meaning the tool modifies code but is not destructive. The description adds context about the default font, side-effect-free behavior, and return of modified code plus diagnostics, which enhances transparency beyond 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 concise and well-structured, starting with a clear purpose then detailing modes. It avoids fluff but could be slightly more compact.
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, 2 modes, output schema exists), the description covers the main behaviors and parameter groups. However, it lacks explicit guidance on parameter dependencies or mutual exclusivity, which would improve completeness.
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% with clear descriptions for each parameter. The tool description adds narrative grouping by mode and clarifies defaults, but this adds limited value beyond the schema's already-detailed 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 description clearly states the tool is for authoring text into a kernelCAD script, and distinguishes between two modes (sketch and emboss) with specific actions for each. This provides a clear verb+resource purpose and differentiates from sibling 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?
The description explicitly explains when to use each mode (e.g., 'sketch' for chainable text, 'emboss' for engraved/raised features) and mentions failure modes. However, it does not provide explicit guidance on when not to use the tool or compare alternatives.
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 SweepAInspect
Use this when you need an organic swept solid whose cross-section changes along its length — a tapering body, horn, bottle, fairing, or duct — authored as a variable-section sweep along a spine. Insert a variableSweep(spine, sections, opts?) declaration into the user's .kcad.ts immediately before the last top-level return. The result is a Shape — chain .translate(...), .union(...), etc. via add_feature. spine_binding references an existing variable (Curve3D / Sketch / Vec3[]) in the source; each sections[i].profile_binding references an existing Sketch. Sections must be strictly increasing in t and span [0, 1]; first t=0, last t=1. Orientation is not exposed by this MCP tool until runtime orientation support is wired. Validates every binding exists in the source via regex before inserting (fast structured error vs capture-time stack). Returns the modified code + diagnostics. Side-effect-free.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| 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_binding | Yes | Existing variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the insertion location, regex-based binding validation, fast structured-error behavior, the orientation caveat, that it returns modified code plus diagnostics, and that it is side-effect-free. These details align with the annotations' readOnlyHint=false and destructiveHint=false.
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 well-structured and front-loaded with the primary use case. It contains some redundancy with the schema, particularly around section constraints and binding types, but every major behavior is covered without excessive 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?
Given the tool's complexity, the description covers when to use it, what it inserts, where it inserts it, the result type, parameter constraints, validation behavior, orientation limitations, and side-effect profile. An output schema exists, so the return-value detail is not 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?
Schema coverage is 100%, and the description largely restates what the schema already provides: binding types, strict t ordering, and the [0,1] span. It adds minor context about existing source variables and the resulting Shape, but this does not significantly raise the value 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?
The description states a specific verb and resource: insert a `variableSweep(spine, sections, opts?)` declaration into the .kcad.ts source before the last top-level return. It clearly distinguishes this from sibling tools by naming the target use case — an organic swept solid whose cross-section changes along its length.
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 trigger: 'Use this when you need an organic swept solid whose cross-section changes along its length' and gives concrete examples. However, it does not name alternative tools or state when not to use it, 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.
add_workspace_targetAdd Workspace TargetAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool 'Durably insert[s]' code, indicating a permanent modification, and returns 'modified source plus diagnostics.' This adds context beyond the annotations (which only indicate not read-only and not destructive). The description does not contradict 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 two sentences, front-loaded with the usage directive, and every sentence adds value. It is concise and well-structured with no 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 an output schema and is moderately complex (5 params), the description fully covers the purpose, usage, return value (modified source plus diagnostics), and behavioral context (checked by validation gates). It is complete for an AI agent to understand how to use the tool.
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 input schema has 100% coverage with descriptions for all 5 parameters. The tool description does not add any additional explanation beyond what the schema already provides. Baseline 3 is appropriate as the schema does the heavy lifting.
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 explicitly states the tool's purpose: 'declare a reachability target for a connector.' It specifies the action (insert a workspace target) and the resource (connector). This clearly distinguishes it from sibling tools like 'add_constraint' 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?
The description starts with 'Use this when you need to...', providing clear context for when to use the tool. It explains that workspace targets are checked by validation gates. However, it does not explicitly state when not to use it or mention alternatives, slightly reducing the guidance.
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. 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. ENVIRONMENT REQUIREMENT (identical to kernelcad render): capture drives a headless browser against a running studio dev server reachable at http://localhost:5173 (or the VITE_PORT override); there is no bundled-static serving mode yet, so the same dev-server precondition applies in a production MCP install. 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. Required (no inline { code } mode). | |
| 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. | |
| no_verify | No | Skip the animation-pose interference verification (default: verify on). | |
| frames_dir | No | PNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path. | |
| output_path | No | MP4 output path; default <scriptDir>/<basename>-animation.mp4. 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| fps | No | |
| error | No | |
| verified | No | Whether pose-interference verification passed. |
| errorCode | No | |
| errorHint | No | |
| collisions | No | Colliding poses { t_ms, a, b, volume_mm3 }. |
| diagnostics | Yes | |
| duration_ms | No | |
| frame_count | No | |
| output_path | No | Written MP4 path (MP4 mode). |
| failure_kind | No | |
| verify_skipped | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide limited info (readOnly=false, destructive=false). Description adds extensive behavior: collision verification, non-blocking collision handling (artifact still written), environment prereq, and return structure. Contradicts none.
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?
Description is long but each sentence adds value. Front-loaded with purpose. Some redundancy (environment requirement repeated) but overall efficient for the 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?
Covers all aspects: purpose, parameters, environment, return format, behavioral nuances. With output schema present, description still adds return structure details. Complete for an 8-parameter tool.
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%, but description adds significant context: file parameter emphasizes no code mode, focus/hide explains mutual exclusivity and render-only semantics, frames_dir/output_path mutual exclusivity, verify_every union with keyframe sample set. Greatly enhances 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 'Use this when you need to render a script's animation timeline to a video.' It specifies capture of animationView({...}) to MP4 or PNG frames, with a clear verb-resource relationship. It distinguishes from sibling tools like render_preview by focusing on animation capture.
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?
Provides explicit usage context: 'FILE ONLY: pass { file }' and 'no { code } mode.' Explains mutually exclusive options and environment requirements. Does not explicitly mention when not to use or alternatives, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_loopRun Design LoopAInspect
Use this when you need to run a CAD design loop over multiple attempts. Run an agent CAD design loop over one or more attempt scripts: review each attempt with review_cad, continue past functional attempts that still have unresolved review warnings, return structured repair prompts, and optionally write a Studio-compatible build record JSON for visual replay.
| 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. | |
| 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. | |
| 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. | |
| gripperAperture | No | Optional gripper aperture request forwarded to review_cad. | |
| 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 |
|---|---|---|
| ok | Yes | |
| goal | Yes | Echoed design goal. |
| record | No | Studio-compatible build record (when requested). |
| attempts | Yes | Per-attempt review results. |
| recordUrl | No | |
| finalAttemptId | No | |
| nextActionPrompt | No | |
| outputRecordPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the multi-step behavioral flow: per-attempt review_cad calls, continuing past attempts with unresolved warnings, returning structured repair prompts, and optionally writing a Studio-compatible build record JSON. This adds meaningful context beyond the sparse annotations and does not contradict readOnlyHint=false or destructiveHint=false.
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 exact use case and then compresses the workflow into one scannable sentence. Every clause contributes either to tool selection or invocation behavior, with no filler or 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?
For a complex 17-parameter orchestration tool, the description provides the essential high-level workflow and side-effect caveat while leaving parameter and return details to the rich schema and output schema. It could be slightly more explicit about alternatives and when not to use this tool, but it covers the main selection and invocation needs.
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 94%, so the schema already documents nearly all 17 parameters. The description adds high-level loop semantics and highlights the outputRecordPath build-record behavior, but it does not systematically explain individual parameters beyond what the schema 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 clearly states a specific orchestration verb and resource: 'Run an agent CAD design loop over one or more attempt scripts.' It differentiates from the review_cad sibling by describing the loop semantics—reviewing each attempt, continuing past functional attempts with warnings, returning structured repair prompts, and optionally writing a build record.
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 opening 'Use this when you need to run a CAD design loop over multiple attempts' gives clear invocation context. It does not explicitly list alternatives or exclusion criteria, but naming review_cad as the per-attempt reviewer implies single-shot reviews should use review_cad instead.
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(base ∩ revised) from OCCT booleans, 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. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| base | No | Baseline summary { featureCount, bodyCount, isAssembly } (success). |
| side | No | Which side failed ('base' | 'revised') (failure). |
| error | No | Failure message (failure). |
| bodies | No | Per matched body, the material-level delta (success). |
| render | No | Overlay result when render: true — { ok, images, out_dir, script_path, error? }. |
| revised | No | Revision summary { featureCount, bodyCount, isAssembly } (success). |
| summary | No | Verdict counts plus totalAddedMm3 / totalRemovedMm3 / maxDeviationMm. |
| errorCode | No | |
| unmatched | No | Bodies present on only one side; each also raises diff.body.unmatched. |
| diagnostics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/destructiveHint annotations: it states the tool is read-only and never touches the active session, explains body-pairing fallback rules, the unmatched-body error, verdict precedence, and the fail-open behavior for render. This is rich, non-obvious behavioral context.
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 dense and front-loaded; the core purpose appears in the first sentence. Some details, like the overlay PNG explanation and fail-open behavior, are verbose, but they earn their place 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 complex geometry-diff tool, the description covers input modes, matching rules, error conditions, the full output table, verdict precedence, render behavior, and side effects. The presence of an output schema means return-value structure does not need to be repeated, and nothing essential is left out.
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 the schema already documents all 7 parameters, the description adds meaning the schema cannot: it clarifies that params re-lower the baseline, that file/code/params are mutually exclusive modes, that undeclared param names fail with a useful message, and what render produces. This materially helps an agent select and fill arguments.
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 precise statement of what the tool does: tells you WHAT MATERIAL changed, not just how much. It names the sibling tool diff_scripts and contrasts against it, so an agent can distinguish this tool 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?
It explicitly says 'Use this when...' and identifies diff_scripts as the shallower alternative, explaining why volume deltas alone are ambiguous. It also covers the two usage modes — two-script diff and one-script param sweep — so the agent knows exactly which input shape fits which scenario.
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-onlyInspect
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. Use after editing a script to verify exactly what changed physically before re-rendering. Read-only — never touches the active session.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Revised script — inline source. | |
| file | No | Revised script — path to a .kcad.ts file. | |
| baseCode | No | Baseline script — inline source. | |
| baseFile | No | Baseline script — path to a .kcad.ts file. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| base | No | Baseline summary { featureCount, partCount, isAssembly } (success). |
| side | No | Which side failed ('base' | 'revised') (failure). |
| error | No | Failure message (failure). |
| mates | No | Mate-graph changes (success). |
| parts | No | Per-part added/removed/renamed/changed/unchanged (success). |
| params | No | Param value/min/max changes (success). |
| revised | No | Revision summary { featureCount, partCount, isAssembly } (success). |
| errorCode | No | |
| diagnostics | No | |
| interference | No | Total interference-volume delta + per-pair detail (success). |
| deeperDiffAvailable | No | Present when the diff touched geometry-affecting ops: { tool: 'diff_geometry', reason, bodies } — the same two scripts can be compared at material level (added/removed/common volume + per-body verdict). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and destructiveHint, but the description adds meaningful behavioral context: it is read-only, 'never touches the active session,' and returns specific agent-readable JSON including volume deltas, bbox deltas, mate-graph changes, and param changes. This goes beyond what the annotations alone provide.
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 dense but well-organized, front-loading the use case and then adding output details and an edge case. Some repetition and detail could be trimmed, but every sentence contributes useful information for tool selection and invocation.
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 presence of an output schema and annotations, the description is complete: it covers primary use case, input pairing, output structure, edge-case behavior, and safety. An agent can confidently select and invoke this tool 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?
The input schema already has 100% description coverage for all four parameters earned high baseline. The description adds value by clarifying how the parameters pair: baseline via baseFile/baseCode and revision via file/code, plus the '(root)' pseudo-part for single-shape scripts. This semantic pairing is not fully explicit 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 states a specific verb ('diff') and resource ('two script versions') and explains it produces a 'structured geometric delta.' It clearly distinguishes itself from generic geometry tools by focusing on script versions with baseline and revision inputs.
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 when to use it: 'Use this when you need to see exactly what changed between two script versions' and 'Use after editing a script to verify exactly what changed physically before re-rendering.' It doesn't explicitly name alternatives or exclusions, but the context is clear enough to guide selection.
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.
| 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. | |
| 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 |
|---|---|---|
| ok | Yes | |
| page | No | |
| sheet | No | { widthMm, heightMm, scale: { text, sheetPerModel, source }, units, projection } read off the sheet. |
| views | Yes | Identified orthographic views: { name, bboxMm, identifiedBy, label? }. |
| ledger | Yes | Assumption ledger: { facts, unresolvedCount }; facts are visible / inferred / assumed / missing, disagreements recorded on the fact. |
| params | Yes | Role-named params declared by the script: { name, value, description }. |
| script | No | The emitted .kcad.ts source. |
| fidelity | No | { verdict: match | partial | mismatch | failed, extents, holes, silhouettes, reasons } from evaluating and re-projecting the script. |
| pageCount | No | |
| ledgerPath | No | Where the ledger was written (when `out` was given); pass it to resolve_assumptions. |
| scriptPath | No | Where the script was written (when `out` was given). |
| diagnostics | Yes | |
| reconstruction | No | { kind: extrude | revolve, profileView, axis, holeCount, extents }. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint=false, openWorldHint=true, and destructiveHint=false, which are minimal. The description goes far beyond by explaining the deterministic, no-vision-model approach, the classification of line types, projection reading, dimension handling, the output format (script and ledger), the verification process (re-projection and fidelity verdicts), and failure modes (raster-only). It also clarifies that dimension values override measured lengths and how assumptions are logged. This adds substantial behavioral context that the annotations do not provide.
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 dense but every sentence serves a purpose: it front-loads the use case, then explains the deterministic process, the output, verification, and error handling. It avoids fluff and doesn't repeat schema details unnecessarily. It is structured logically from what it does to how it works to outputs and exceptions, making it easy 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?
For a complex tool with 6 parameters and no required ones, the description covers the core workflow, output format, verification behavior, and failure modes. Its mentions of output schema (though not detailed here) and the existence of a ledger and fidelity verdicts give a complete picture of what the agent will receive. It also tells the agent how to handle open facts (resolve_assumptions, set_param), which is crucial for follow-up. Nothing essential appears missing for correct invocation and interpretation.
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 descriptions already explain each parameter well (e.g., 'path' as path to the PDF, 'verify' as evaluate and compare). The description adds value by clarifying the use of 'out' (writes ledger beside it) and the interaction between 'path' and 'pdfBase64' (inline vs. on-machine). It also implies 'projection' as an override, which the schema already states. Since schema covers parameters thoroughly, a baseline of 3 would apply, but the description's extra context on 'out' and the hosted server use-case earns a 4.
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?
Clearly states it converts a 2D engineering drawing PDF into a CAD script, distinguishes from photo-based or raster tools by naming trace_from_image as the alternative. The verb 'convert' and the resource type (drawing PDF) are specific, and the description explicitly excludes scanned (raster-only) pages, which differentiates it from similar 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?
Explicitly states when to use this tool: when the reference is a 2D engineering drawing PDF with orthographic views, not a photo. It also gives a clear exclusion: scanned pages should use trace_from_image, and mentions resolving assumptions with resolve_assumptions and set_param for follow-up. This leaves no ambiguity about context or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_scriptEvaluate CAD ScriptARead-onlyInspect
Use this when you need to run a script and check it compiles. Run a kernelCAD .kcad.ts script and report pass/fail + feature count + diagnostics. 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 (self-collision, fastened drift, dof-mismatch) makes ok:false with the failures in diagnostics. Pass { skipMechanismCheck: true } to opt out. Pass either { file: "" } or { code: "" }. Set { dryRun: true } for fast validation while iterating: transpile + capture + capture-light checks WITHOUT OCCT lowering, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. | |
| dryRun | No | Fast validation only: skip OCCT lowering, DFM gates, and meshing. Does not set or clear the active session. | |
| 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 |
|---|---|---|
| ok | Yes | Whether the script compiled and lowered cleanly. |
| parts | No | Assembly parts summary { count, names } when the scene is assembly-built. |
| dryRun | No | True when the result came from a fast dry run. |
| mechanism | No | Mechanism-truth verdict for an assembly-built scene (default-on; omitted for dryRun, non-assembly, or skipMechanismCheck:true). 'broken' makes ok:false; 'unverified' keeps ok and surfaces a loud budget diagnostic. |
| diagnostics | Yes | |
| featureCount | Yes | Number of features captured by the script. |
| featureHealth | No | Per-feature health degradations — ONLY features that fell back to a passthrough (warning) or failed to lower (error). Empty when every feature is healthy. Surfaces which feature degraded even when ok is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive safety, and the description adds substantial behavioral detail: dryRun skips OCCT lowering, DFM gates, and meshing; it leaves the active session untouched; the default mechanism-truth gate can force ok:false; and skipMechanismCheck is ignored in dry-run/non-assembly cases. This goes well beyond annotation coverage and contradicts nothing.
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 dense but every clause earns its place: trigger, output contract, assembly caveat, input modes, dry-run tradeoffs, and follow-up workflow. It is front-loaded with the most decision-relevant information and contains 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?
For a tool with multiple modes, an output schema, and assembly-specific behavior, the description covers when to call it, how to invoke it, what dry-run sacrifices, what the mechanism gate does, and what to do afterward. The output schema handles return-value detail, 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?
The schema already covers all four parameters at 100%, so the baseline is 3. The description adds value by stating the file/code alternatives explicitly and explaining the practical consequences of dryRun — millisecond-level fast iteration, what it can and cannot catch — beyond the schema's brief field 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 description names a specific verb and resource — 'run a kernelCAD .kcad.ts script' — and enumerates concrete outputs: pass/fail, feature count, diagnostics, and an assembly-scene mechanism verdict. This scope clearly separates it from generic siblings like verify, inspect, or query.
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 trigger ('Use this when you need to run a script and check it compiles') and includes workflow guidance to finish with a non-dry run before session-dependent tools. It does not explicitly name sibling alternatives or exclusion conditions, 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.
evaluate_sdfEvaluate SDFARead-onlyInspect
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. | |
| point | Yes | Sample point [x, y, z] in mm. | |
| fieldName | Yes | sdf.bind binding name holding the SdfField. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| aabb | No | Axis-aligned bounding box of the field (success). |
| hint | No | |
| kind | No | SDF field kind (success). |
| error | No | |
| inside | No | Whether the point is inside the surface (success). |
| distance | No | Signed distance in mm; negative = inside (success). |
| errorCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, meaning no destructive behavior. The description adds details about the return format and the meaning of distance values, which goes beyond annotations. No contradiction detected.
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 well-structured sentences, each earning its place. The first sentence is a clear purpose statement, the second explains output, the third gives usage hints. Slightly verbose but remains efficient.
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 presence of an output schema and 100% parameter coverage, the description provides sufficient context: input relationships, output structure, usage hints, and a comparison to a sibling. Minor missing details about error conditions are acceptable.
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 documented. The description adds value by hinting that file and code are mutually exclusive ('either...or') and explaining that fieldName refers to an sdf.bind binding. This clarifies usage 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?
The description clearly states the tool samples a signed-distance field at a point, specifies the return object, and distinguishes it from the expensive sdf.materialize sibling. The verb 'sample' and resource 'signed-distance field' are specific.
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 when to use it (to verify SDF composition before materialization) and mentions the prerequisite of binding the SDF field. It does not list alternative tools among siblings but provides enough context to avoid misuse.
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 (planar laser/waterjet profile from a Region or planar face), 3mf (slicer-friendly mesh with per-part colors), glb (web-viewer / AR with PBR materials), 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). 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, process hint, and catalog provenance for purchased parts; same numbers as inspect({ of: 'bom' })). 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. 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: dxf layers/tolerance/unit, 3mf printUnit/embedSource, 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 /.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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. | |
| part | No | target:'part' — part name for single-part export, or 'all'. | |
| format | No | target:'model' — output file format (required for that target). | |
| 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. dxf: { layers?, unit?: "mm"|"cm"|"in", tolerance? }. 3mf: { printUnit?: "mm"|"cm"|"in", embedSource? }. glb: { axis?: "y-up"|"z-up", draco?: false }. svg-drawing: { sheet?: "a4"|"a3", modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: "linear"|"radius"|"diameter"|"angular"|"note", view?: "front"|"top"|"left"|"iso", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: "xy"|"xz"|"yz"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: "ISO2768-f"|"ISO2768-m"|"ISO2768-c", datums?: "auto"|[{ label, face: FaceQuery }], include?: ["datums"|"flatness"|"holes"|"hole-positions"|"overall"|"fillets"|"chamfers"|"general-tolerance"] }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones. | |
| no_verify | No | Skip the STL watertight verify gate. | |
| 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. | |
| output_path | No | Destination path. target:'model' — the export file (required). target:'part' — single-part .stl path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| format | No | |
| written | No | target:'part' — per-part export records. |
| byte_count | No | target:'model' — file size in bytes. |
| mesh_files | No | Per-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo, meshes/<part>.usda mesh layers for usd-isaac. |
| diagnostics | No | |
| output_path | No | target:'model' — written file path. |
| feature_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide only basic hints (not read-only, not destructive, open-world). The description goes far beyond this: it explicitly states that STL exports run a watertight verify by default and that failures still write the file, it lists which exports write sidecar mesh files (urdf, sdf-gazebo, usd-isaac), it documents failure codes (export.mesh.not-watertight, export.part.not-found), and it specifies that 'All params except `target` are forwarded verbatim; each target fails closed on its own missing required params.' This is rich behavioral context that is not present in 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?
The description is long (about 340 words) but packed with necessary details for 12 formats and two targets. It is front-loaded with the core instruction and then organized in two clear blocks with bolded target names. The sentence on STL verify and failure modes is a bit dense, but every sentence adds required information. It earns its length given the complexity, though a shorter summary at the top and more bullet formatting could improve scannability. Still, it is well-structured for its size.
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 huge parameter count (10) and nested object schema, the description covers all critical usage aspects: target selection, required vs optional parameters per target, per-format nuances (meshes written, verify behavior, failure codes), and the interaction between `options.format` and top-level `format`. The output schema exists and is rich, and the description explains what happens when the export fails (file still written, error codes). Nothing an agent needs to decide whether to call this tool and how to fill parameters is missing, aside from trivial details that are already in 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?
The schema description coverage is 100%, and the schema descriptions already explain each parameter's purpose. The description adds meaning by linking all parameters to their target-specific behavior (e.g., `output_path` for model vs part, `output_dir` for all parts, `no_verify` to skip watertight gate) and by describing the required vs optional status for each target. It also clarifies that `options` is a per-format bag and includes detailed semantics for svg-drawing annotations, sections, autoAnnotate, and joint drives. This is more valuable than a simple schema list, though some schema descriptions already cover basics, so the description adds moderate-high value.
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 starts with 'Use this when you need to export geometry to a file' and immediately introduces two distinct exporters selected by `target`, each with its own output format list, behavior, and file-writing details. It clearly differentiates from siblings like get_model_mesh (which fetches a mesh rather than writing files) and capture_animation (which records visual output). The resource (geometry/assembly) and action (export to file) are explicit, and the sub-modes are unambiguously specified.
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 provides explicit when-to-use ('Use this when you need to export geometry to a file') and then for each target details the required parameters and failure modes. It names the main alternative for reading geometry (get_model_mesh) implicitly by focusing on file export, and it mentions `inspect` as an alternative for BOM data ('same numbers as inspect({ of: 'bom' })'). It also gives guidance on what not to do (e.g., for part export, unknown part names fail; for STL, watertight verify is default). Very strong usage routing.
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-onlyInspect
Use this when you need a structural check's context without paying for a solve. Read-only: returns the stored summary of a previous run_fea (pass the same output_dir), whether the CalculiX + gmsh toolchain is available on this machine (with the install command when it is not), and the FEA material table with real E / Poisson / yield numbers so a grade is chosen against data rather than from memory. Never meshes, solves, or writes.
| 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 |
|---|---|---|
| ok | Yes | |
| error | No | |
| summary | No | Stored summary of a previous run_fea in output_dir, when present. |
| errorCode | No | |
| materials | Yes | Named grade -> { E (MPa), nu, yield (MPa) }. |
| toolchain | Yes | { available, ccx?, gmshVersion?, missing[], hint? } — whether a study can run here and how to fix it if not. |
| material_names | Yes | Accepted material grade names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true and destructiveHint=false, the description adds meaningful behavioral context: it returns stored data, checks toolchain availability, provides an install command when needed, and never meshes, solves, or writes. These details go beyond the annotations and set accurate expectations.
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 communicates all essential behavior in three sentences. There is no filler; the rationale about choosing a grade against real material data earns 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 an output schema, strong annotations, and a single optional parameter, the description fully covers what the tool returns, how to target a previous run, and what it will not do. An agent has enough information to decide when to call fea_summary instead of run_fea.
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 optional parameter is fully documented in the schema: a directory from a previous run_fea, omittable for toolchain/material info. The prose restates this without adding new parameter semantics, so the 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 clearly identifies a specific purpose: retrieving the stored summary of a previous run_fea, toolchain availability, and material data. It distinguishes itself from run_fea by stating that it does not solve or mesh and only reads stored results.
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 the exact condition 'Use this when you need a structural check's context without paying for a solve,' and explains that the same output_dir from a previous run_fea should be passed. It also explicitly lists what the tool never does, making the choice between fea_summary and run_fea clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_partFetch PartARead-onlyInspect
Use this when you need to download a catalog part as a STEP file. Resolve an id (or single-match query) to a part record and write its STEP file to the local cache. Bundled ids resolve offline; non-bundled ids require partsBaseUrl (or KERNELCAD_PARTS_BASE_URL). Returns the cache path plus a sha256 fingerprint.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| query | No | ||
| family | No | ||
| category | No | ||
| standard | No | ||
| partsBaseUrl | No | Opt-in remote endpoint; no default value ships with kernelCAD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| record | No | Resolved part record (success). |
| sha256 | No | SHA-256 fingerprint of the STEP file (success). |
| source | No | Where the part came from ('local' | 'remote') (success). |
| cachePath | No | Local cache path of the written STEP file (success). |
| errorCode | No | |
| errorHint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond annotations: bundled ids resolve offline, non-bundled ids require partsBaseUrl, and the return value includes cache path and sha256 fingerprint. This explains the caching mechanism and external dependency, which annotations alone do not capture.
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 concise (four sentences) and front-loaded with the primary use case. Every sentence adds value: when to use, resolution logic, offline vs online behavior, and return format. No redundant or wasteful 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?
The description provides enough information to use the tool for its main purpose, covering id/query resolution, bundled vs non-bundled, and return values. However, it leaves gaps: the roles of 'family', 'category', and 'standard' are unexplained, and it does not clarify whether id and query can both be provided or their interaction. Given the low schema coverage and 6 parameters, the description is adequate but not fully 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 17% (only partsBaseUrl has a description). The description explains the roles of 'id' and 'query' (resolve an id or single-match query), but does not address 'family', 'category', or 'standard' parameters. These remain ambiguous—whether they are part of the query or separate filters is unclear. With low coverage, the description should have compensated by detailing all parameters, but it only covers two out of six.
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 the tool's purpose: to download a catalog part as a STEP file. It specifies the action (download/fetch) and the resource (catalog part STEP file), and distinguishes from siblings like find_part (search) and add_part (adding parts) by focusing on file download. The verb 'fetch' combined with 'download a catalog part as a STEP file' is specific and 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?
The description provides clear context on when to use the tool: 'Use this when you need to download a catalog part as a STEP file.' It also explains the resolution mechanism (id vs single-match query) and the difference between bundled and non-bundled ids with partsBaseUrl. However, it does not explicitly exclude alternative tools (e.g., find_part for searching or add_part for placement) or provide when-not-to-use guidance, which would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_partFind PartARead-onlyInspect
Use this when you need to find a part in the catalog. Discover bundled (and optionally remote) part-catalog records by fuzzy query and faceted filters. Tokens AND-combine; cross-facet filters AND-combine. Pass partsBaseUrl (or set KERNELCAD_PARTS_BASE_URL) to enable the remote tier; otherwise results are bundled-only.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| limit | No | ||
| query | No | ||
| family | No | ||
| source | No | ||
| category | No | ||
| standard | No | ||
| partsBaseUrl | No | Opt-in remote endpoint; no default value ships with kernelCAD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| source | No | Where results came from ('local' | 'remote') (success). |
| results | No | Matching part records (success). |
| errorCode | No | |
| errorHint | No | |
| totalMatches | No | Total matches before limiting (success). |
| remoteEnabled | No | Whether the remote tier was queried (success). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false, and the description does not contradict these. It adds behavioral details like token AND-combination and cross-facet filtering, exceeding annotation coverage.
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 concise, with three sentences that front-load purpose, then explain filtering logic, then remote tier setup. No 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 presence of an output schema, the description covers the main functionality: search, filtering, and remote option. It is fairly complete for a search tool, though more detail on each filter parameter would improve completeness.
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 13% schema description coverage, the description partially compensates by mentioning 'fuzzy query' (query), 'faceted filters' (category, family, etc.), and 'source' enum. However, parameters like 'tag' and 'standard' are not explained, leaving gaps.
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 the tool finds a part in the catalog using fuzzy query and faceted filters. It specifies the verb 'find' and resource 'part in catalog', and distinguishes from siblings like 'fetch_part' by describing the search functionality.
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 'Use this when you need to find a part in the catalog' and explains search behavior (AND-combine) and remote tier option. However, it does not specify when not to use it or mention alternatives like 'fetch_part'.
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-onlyInspect
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). Slice 1: at most 2 bends. Pass { file } or { code }; optional { featureId } to pick a specific Shape.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| file | No | ||
| featureId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| region | No | Unfolded flat-pattern Region (outer polyline + holes + bend lines + plane). |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reinforces the read-only nature (consistent with readOnlyHint annotation) by describing the output as an unfolded pattern. It adds behavioral details such as the output format and bend limit. 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 concise at two sentences, front-loading the use case. The phrase 'Slice 1: at most 2 bends' is slightly unclear and could be reworded for better clarity. Overall, it is efficient but has a minor clarity issue.
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?
The description covers the core functionality and output, but it does not explain the term 'Slice 1', nor does it address edge cases like more than 2 bends or error scenarios. No information on prerequisites or permissions is provided. The presence of an output schema reduces the need for output details, but the description could be more 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 coverage is 0%, so the description must compensate. It explains that 'file' and 'code' are alternative input methods, and 'featureId' is optional to select a specific shape. However, it does not describe the expected formats of 'file' or 'code', nor does it clarify that all parameters are optional. This leaves some ambiguity.
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 the tool's purpose: to obtain the unfolded flat pattern of a bent sheet-metal part. It specifies the output format (Region with polylines, holes, bend lines, sketch plane) and a constraint (at most 2 bends). This distinguishes it from sibling tools that focus on adding features or constraints.
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 tells when to use the tool ('when you need the unfolded flat pattern') and how to specify input (using 'file' or 'code', with optional 'featureId'). It implies a limitation to sheet-metal parts with up to 2 bends. However, it does not explicitly mention when not to use it or recommend alternatives from the sibling tool list.
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.
| 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"). |
| 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 declare readOnlyHint=true and destructiveHint=false; description adds critical behavior: render is from server model not user camera, deterministic bytes are not stale, no OAuth for public/unlisted, private requires owner signed in. Also describes error behavior (never blank image, {ok:false,error,hint}).
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?
Long but every paragraph carries a distinct operational constraint: camera independence, determinism, auth, output mode, error behavior. Front-loaded with purpose and sibling routing before low-level details. 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?
For a render tool with output schema present, the description covers invocation, view semantics, auth prerequisites, update ordering, and failure mode. No missing operational detail an agent needs 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 100% but description enriches semantics: explains default 'all' as a labeled 3×2 contact sheet with specific ordering, single view behavior, paths_only tradeoff, and slug-as-capability auth implications. Exceeds schema 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+resource+output: 'Render a project's current model server-side and return it as an inline image.' Explicitly contrasts with open_in_studio and describes its niche (different view, contact sheet, slug-only). Easily distinguished from 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?
Explicitly says 'Prefer open_in_studio for the happy path' and gives conditions for this tool ('Use this tool for a different view... or when you only have a slug and are not publishing'). Also instructs to push with open_in_studio first after model changes.
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.
| 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). |
| projects | No | List mode (no slug): the user's saved projects. |
| meshError | No | Fetch mode: sanitized repair/persist error when meshStatus is failed. |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral context: returns full .kcad source and metadata, lists most recently updated first, requires OAuth for private/listing access, and notes that using the same slug with open_in_studio keeps the user's tab live.
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 core use case and organized into fetch vs. list modes. There is slight redundancy in mentioning OAuth twice (private projects and listing mode), but the description remains tight and readable.
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?
Fully sufficient for a single-parameter, read-only tool with an output schema. It covers modes, prerequisites, auth, ordering, and integration with open_in_studio; 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 coverage is 100% and the slug parameter is described there, but the description adds real value beyond it: where the slug comes from (/p/<slug> links or prior listings), what happens if omitted, and the downstream requirement to reuse the same slug with open_in_studio.
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?
Clearly states a read-only tool for reopening or browsing saved kernelCAD Studio projects, with two explicit modes: fetch by slug or list the user's projects. It is easily distinguishable from siblings like open_in_studio and get_project_revision.
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 guidance ('reopen a saved project or browse what the user has saved'), plus concrete routing: pass slug to fetch, omit slug to list. Auth requirements for private projects and listing mode are also stated, and the follow-up with open_in_studio is explained.
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. |
| 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=true and destructiveHint=false. The description adds value by explaining that the source is immutable and that for private projects the owner's OAuth is required. It does not contradict annotations and adds practical context about capability-based access.
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 consists of three concise sentences, each adding essential information: definition, use case, and access details. No extraneous words; well-structured and front-loaded with the core purpose.
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 47 sibling tools (many mutations), the description fully covers when and how to use this read-only fetch tool. With an output schema present, return values need no further explanation. The description covers usage, access, and verification purpose completely.
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 descriptions for both parameters. The description adds meaning by specifying that slug and version come from open_in_studio and that slug acts as a capability for public projects, exceeding what the schema alone provides.
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 the verb ('Fetch'), resource ('exact immutable .kcad source and parameters'), and context ('captured at a prior `open_in_studio` version'). It distinguishes this tool from siblings by focusing on read-after-write verification of a specific revision.
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 provides explicit usage guidance: 'Use this to read-after-write verify a release' and details how to pass slug and version. It also explains access requirements for public vs private projects, covering when and for whom the tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectInspect ModelARead-onlyInspect
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.
'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 hint, catalog provenance for purchased parts, and totals;
bom.*diagnostics flag rows with no density source or missing catalog vendor info instead of guessing.'section' — numeric cross-section probe of a shape: area, perimeter, loop/hole counts, 2D bbox at a plane ({ feature_id?, plane | at+axis, stack?: { from, to, count, axis? } }).
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? }). All params except
ofare subject-specific and forwarded verbatim. Most subjects accept { file | code }.
| 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. | |
| 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 |
|---|---|---|
| ok | No | Whether the read succeeded. |
| error | No | Failure message (present on failure). |
| errorCode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, which already cover the read-only nature. The description adds some behavioral detail, such as for 'mass': 'density in kg/m^3, defaults to 1000 (water)' and flags when defaulted, and for 'bom': 'flag rows with no density source... instead of guessing.' However, it does not disclose edge cases like error behavior on invalid `of` values, or the fact that many subjects require a pre-existing script (file or code). Given annotations cover safety, a 3 is appropriate: it adds context but not extensive behavioral nuance.
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 (about 300 words) but is necessarily so given 23 subjects. It is front-loaded with the core purpose and the `of` parameter, then organizes each subject as a bullet-like line in the list. There is minimal redundancy; each line adds new information. However, the density of subjects might overwhelm some agents, but for a tool with such broad scope, this is acceptable. Slightly reducing detail per subject could improve conciseness, but it remains well-structured.
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, 23 enum values, nested objects), the description is remarkably complete. It explains each `of` value, key parameters like `stack` for section, `gyration_axis` for mass, and units (mm, kg/m^3). It also notes that most subjects accept `{ file | code }` and that params are forwarded verbatim. Since an output schema exists, return values are not the description's burden. Nothing critical for an agent to call this tool 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 every parameter is documented in the schema with subject-specific descriptions (e.g., 'of:'section' — single slice position along `axis` (mm)'). The description adds a global note that parameters are 'subject-specific and forwarded verbatim' and provides in-text semantics for each `of` value, but the schema already describes parameters in detail. Thus the description adds marginal value over the schema, consistent with the baseline 3 for high coverage.
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 starts with a clear, specific purpose: 'read facts about a model.' It then enumerates 23 distinct subjects, each with a concise explanation of what facts are returned, e.g., 'assembly — physical assembly inventory (parts, bboxes, connectors, mates, disconnected solids).' This strongly distinguishes it from sibling mutation tools like add_feature or capture_animation, and even from read-ish tools like mesh_summary or diff_geometry by listing exactly what it inspects.
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 begins 'Use this when you need to read facts about a model,' clearly scoping its use to read-only inspection. It does not explicitly name alternatives, but the sibling list is full of write or specialized tools (add_*, solve_*, run_fea, render_preview), and the description implicitly contrasts by focusing exclusively on reading facts, leaving specialized reads (mesh_summary, diff_geometry) to their own subjects. The explicit 'All params except `of` are subject-specific' also guides parameter selection.
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-onlyInspect
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 |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| globals | No | |
| constraints | No | |
| sceneMethods | No | |
| shapeMethods | No | |
| edgeQueryKeys | No | |
| faceQueryKeys | No | |
| sketchMethods | No | |
| curve3dMethods | No | |
| surfaceMethods | No | |
| paramRefMethods | No | |
| shapeListMethods | No | |
| pathBuilderMethods | No | |
| scenePartProperties | No | |
| featureKindFaceLabels | No | |
| curve3dAnalyticsMethods | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive behavior. The description adds meaningful context about what the tool exposes and the easy-to-miss NURBS capability, going beyond the annotations without contradicting them.
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 trigger and uses dense, purposeful enumeration of the API-surface categories. No sentence is wasted; even the caveat about NURBS surfacing has actionable value.
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 tool with an output schema, the description provides sufficient context: what it returns, when to invoke it, and a strategic caution about missing capabilities. Nothing is missing for an agent 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?
The input schema is empty, so there are no parameters to document; with 100% schema coverage the baseline is satisfied. The description focuses on output scope rather than parameter syntax, which is appropriate 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 clearly identifies a specific verb ('list') and resource ('kernelCAD script-runtime surface') and enumerates the categories included. It does not explicitly differentiate from sibling lookup tools like lookup_authoring_skill or lookup_cookbook, but the distinction is inferable from the content.
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 says 'Use this when you need to list...' and gives a workflow cue: call it before concluding that kernelCAD lacks a capability. It does not mention when to prefer sibling lookup tools or when not to use it, 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.
lookup_authoring_skillLook Up Authoring SkillARead-onlyInspect
Return the kernelcad-authoring SKILL.md body — conventions for writing .kcad.ts scripts (imports, parameters, evaluation contract, common pitfalls).
Use this tool BEFORE generating CAD code if your MCP client does not list resources. Clients that do list resources should instead read kernelcad://skills/authoring directly — the contents are identical.
INPUT: none. OUTPUT: { uri, mimeType, text } where text is the SKILL.md body.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| uri | No | The authoring-skill resource URI. |
| text | No | The SKILL.md body. |
| mimeType | No | MIME type of the returned body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint. Description adds the output format (uri, mimeType, text) and confirms no input needed, providing useful context beyond the 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?
Two sentences: first states purpose concisely, second gives usage guidance. No redundancy, front-loaded with core functionality.
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 tool with safety annotations and output schema partially described, the description covers purpose, usage, and output format. Complete without 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?
No parameters exist, so baseline is 4. Description explicitly states 'INPUT: none', which reaffirms the schema. No further param explanation needed.
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 the tool returns the SKILL.md body for kernelcad-authoring conventions, specifying verb, resource, and content. It distinguishes from siblings like lookup_api and lookup_cookbook which are about different domains.
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?
Provides explicit guidance: use this tool if the MCP client does not list resources, otherwise read the resource directly. Clearly states an alternative approach.
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-onlyInspect
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. | |
| query | Yes | Natural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| hits | No | Top-k matching cookbook snippets, ranked by BM25. |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the ranking method (BM25 over title/tags/keywords/trigger) and the empty result behavior, which go beyond the annotations (readOnlyHint, openWorldHint, destructiveHint). There is 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 concise, with a front-loaded purpose statement, and every sentence adds value. It includes examples and edge-case behavior without unnecessary detail.
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?
The description is complete for a simple lookup tool: it explains the search mechanism, result handling, and use cases. With an output schema present, return value details are unnecessary.
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 input schema covers 100% of parameters with descriptions. The tool description does not add significant new semantic meaning beyond what the schema already provides, so the baseline score of 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 clearly states the tool looks up canonical pattern snippets for CAD tasks, using a specific resource (kernelCAD cookbook). It distinguishes effectively from siblings like lookup_api and lookup_authoring_skill, which serve different purposes.
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 states when to use this tool ('when you need a canonical pattern snippet') and provides examples and behavior if no results are found ('proceed without cookbook help'). However, it does not explicitly mention when not to use it or suggest alternative tools.
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-onlyInspect
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 |
|---|---|---|
| ok | Yes | |
| codes | Yes | The diagnostic-code catalogue with hint templates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that it is a 'tiny one-shot call' and that hints are also inline on every emitted diagnostic, providing additional behavioral context beyond annotations. 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?
The description is three sentences, front-loaded with the primary use case, and every sentence adds value without redundancy. It is concise and well-structured.
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 no parameters, clear annotations, and an output schema, the description sufficiently explains the tool's purpose and usage context. It does not need to describe return values due 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?
The tool has zero parameters, so schema coverage is 100%. According to the guidelines, 0 parameters yields a baseline of 4. The description does not add parameter info because none exist, which 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 clearly states the tool provides the 'kernelCAD 26-code diagnostic catalogue with hint templates', using a specific verb 'look up' (implied) and resource 'diagnostic catalogue'. It distinguishes itself from siblings by focusing on the canonical list upfront, which is not offered by other 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?
The description explicitly says 'Use this when you need the kernelCAD 26-code diagnostic catalogue' and mentions its utility for pre-populating retry strategies. While it does not list alternative tools or when not to use it, the context is clear enough for an agent.
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 |
|---|---|---|
| ok | No | True when every feature meshed successfully. |
| bounds | No | Overall model bounding box. |
| features | No | Per-feature summary — never includes raw mesh arrays. |
| diagnostics | No | Kernel diagnostics, if any. |
| featureCount | No | Number of features in the meshed model. |
| failedFeatureIds | No | Feature ids that failed to compile (empty when ok). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive hints, the description discloses that meshing runs the full server-side OCCT pipeline, that params act as stateless slider recompute overrides, that raw vertex/index/normal arrays are never returned, and that ok becomes false when any feature fails to compile. This gives the agent a clear model of side effects and failure 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 long but well-structured with clear INPUT/OUTPUT sections and every sentence adds value. The core behavior and output shape are front-loaded before usage guidance and alternatives, making it easy for an agent 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 tool's moderate complexity, the output schema, and annotations, the description is complete: it covers input requirements, output structure, failure semantics, stateless behavior, what is intentionally not returned, and which sibling tools to use for different goals. An agent has everything needed to select and 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 already 100%, and the schema gives solid descriptions for source, fileName, and params. The prose adds useful operational nuance, such as fileName being diagnostic-only and params being applied as stateless overrides before meshing, but most parameter meaning is already 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 names a specific verb ('Mesh'), a concrete resource (a kernelCAD .kcad.ts source), and the exact deliverable (compact geometry summary with bounds and per-feature id/kind/triangleCount/bbox). It also positions itself against render-oriented siblings by explicitly saying raw arrays are never returned.
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 gives explicit use cases: inspect a model without a viewer, confirm part size/shape, check triangle counts, and verify every feature produced geometry. It also names alternatives for rendering (open_in_studio and get_latest_render), and explains when this tool is preferred over the legacy client worker.
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.
| 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. | |
| 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 |
|---|---|---|
| ok | Yes | |
| mesh | No | Clean-up and watertightness report for the input mesh. |
| error | No | Failure message (failure). |
| ledger | No | AssumptionLedger { facts, unresolvedCount }; dimension fact ids equal the param names (success). |
| passes | No | Per-pass tolerances and measured fidelity. |
| script | No | The emitted, evaluable .kcad.ts source (success). |
| written | No | { script, ledger } paths when out was given. |
| features | No | Body kind, hole groups, cutouts, boolean remainders, params (success). |
| fidelity | No | Measured fidelity of the returned script (success). |
| errorCode | No | |
| diagnostics | No | |
| notRepresented | No | |
| unmatchedRegions | No | Surface regions no emitted feature represents: { kind, reason, areaMm2, triangleCount, centroid, bbox }. |
| reconstructedHoles | No | Holes the B-rep hole detector finds on the reconstruction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the full pipeline: mesh welding/checking, plane/cylinder segmentation, extrusion-axis selection, slice fitting, rounding with recorded snaps, script emission, evaluation against the mesh, and fidelity comparison over up to 4 passes. It also spells out safety properties ('the mesh itself is never modified'), verdict thresholds, and the 'never silently dropped' policy for unmatched regions.
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 and dense, but every sentence earns its place: trigger, algorithm, output shape, fidelity criteria, limitations, and ledger workflow. It is front-loaded with the most decision-relevant facts. The lack of paragraph breaks makes it harder to skim, but for a tool this complex the length is justified.
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 100% parameter coverage, the description still supplies the missing behavioral context: return object fields, exact verdict conditions, refinement-pass behavior, unmatched-region handling, and the ledger-to-`resolve_assumptions` workflow. An agent has everything needed to call the tool, interpret the result, and know when the result is trustworthy.
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 input schema already documents all 9 parameters at ~100% coverage, so the baseline is 3. The description adds meaningful context for `out` (sibling `.ledger.json`, param-name fact ids, `resolve_assumptions` workflow) and ties `minIoU`/`maxDeviationMm` directly into the verdict formula. It does not re-explain `maxTriangles`, `format`, or `weldToleranceMm`, but those are already well covered by 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 opens with a concrete trigger: 'Use this when you are handed an STL, OBJ or 3MF of a mostly prismatic mechanical part' and names the deliverable ('editable kernelCAD model'). It clearly distinguishes this tool from a faceted import or simple mesh inspection, and the title aligns with the described behavior.
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 first sentence gives an explicit 'Use this when' condition, and the description names the alternative it avoids: 'rather than a faceted lib.fromSTL import.' It also states boundary behavior: freeform surfaces, variable-radius blends, and chamfers are reported, not forced. However, it does not explicitly name sibling tools or state direct 'do not use this for X' exclusions, so the guidance is clear but not fully exhaustive.
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/publish the current kernelCAD model AND display it in one step: persists the project, returns the interactive Studio viewer (MCP Apps / ChatGPT outputTemplate), and includes a PNG preview in the SAME tool result (image content + previewUrl when available). 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). Pass slug from a previous call to update the same project in place; omit slug only for a new separate model. Status fields: ok=true means publish succeeded (under CDN, meshStatus ready/building; ok=false + meshStatus=failed means hard mesh persist failure — do not claim the 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, heavy meshes may return meshStatus=building quickly while OCCT finishes; the embed retries meshUrl — do not wait or re-publish just for the mesh. Pass include_preview:false to skip the rasterizer (save + viewer URLs only). Trigger phrases: "open it in Studio", "let me see it", "show me the model"; also call after you finish a build and after each meaningful revision while iterating.
| 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 | Slug returned by a previous open_in_studio call. When given, updates that existing project in place (live-updating the user's open Studio tab) instead of creating a new one. | |
| title | No | Optional human-readable title for the model (shown in Studio). Defaults to "Model from Claude". | |
| 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. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | Whether publish succeeded. Under CDN mode, false when mesh persist hard-failed (meshStatus:failed) — never ok:true with meshUrl silently omitted. |
| url | No | The /p/<slug> Studio link for the model. |
| slug | No | The project slug; pass it back to update this project in place. |
| 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. |
| meshError | No | Sanitized persist/repair error when meshStatus is failed. |
| 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. |
| assetHashes | No | |
| previewHint | No | |
| previewView | No | |
| serverBuild | No | Deploy identity so connector vs server mismatch is observable. |
| previewBytes | No | |
| previewWidth | No | |
| previewCached | No | |
| previewHeight | No | |
| previewStatus | No | included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false. |
| attachmentCount | No | |
| 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?
Goes far beyond the annotations by disclosing status semantics (ok=true publish success; ok=false + meshStatus=failed as hard persist failure), async mesh behavior under CDN (meshStatus=building while OCCT finishes; the embed retries meshUrl), and agent behavioral constraints ('do not claim the viewer is ready', 'only then may you tell the user a preview was shown'). readOnlyHint=false is consistent with the described persist operation, so there is no contradiction. This is rich operational context annotations cannot 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?
The description is long (~270 words) but front-loaded with the core purpose in the first sentence and densely packed with actionable operational detail on status fields and async behavior. Minor redundancy exists between the early 'when the user wants to SEE or share' clause and the later trigger-phrase list, but given the tool's complexity, nearly every sentence earns 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?
For a complex tool with six parameters, an output schema, status fields, and asynchronous mesh persistence, the description covers the happy path, the hard-failure path, the building/async state, when to call, and parameter flows. Since an output schema exists, prose explanation of return values is unnecessary. No critical gap remains for an agent to call this tool 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% and the schema's own parameter descriptions are already detailed (code's evaluate_script reuse, slug's in-place update semantics, include_preview's cache and rasterization behavior). The description largely restates this guidance ('omit slug only for a new separate model', 'Pass include_preview:false to skip the rasterizer') without adding genuinely new parameter 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?
The first sentence states a compound but specific purpose — 'Save/publish the current kernelCAD model AND display it in one step' — naming the resource (kernelCAD model/project) and the three deliverables (persisted project, interactive viewer, PNG preview). It differentiates from siblings by explicitly excluding get_latest_render for the happy path and contrasting with evaluate_script, so an agent can tell this tool apart without opening 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 explicit when-to-use conditions ('when the user wants to SEE or share the model'), concrete trigger phrases ('open it in Studio', 'let me see it', 'show me the model'), and a routine call pattern ('after you finish a build and after each meaningful revision'). It names the alternative tool to avoid (get_latest_render) and the exclusion condition ('the preview is already here when previewDelivered is true'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_curveProject CurveAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the side-effect-free nature, the return shape ('modified code plus diagnostics'), the rejection of `asEdge: true`, and the face-normal wrapping behavior. This goes well beyond the annotations, which only set readOnly/destructive hints.
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 four purposeful sentences with the use case up front. Every sentence adds a distinct fact—entry point, source format, behavior/pairing, limitation, and side-effect profile—with no repetition of schema boilerplate.
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 code-rewriting tool with seven parameters, this description covers the when, the how, the return type, the side-effect profile, and a key unsupported edge. The rich schema and output schema fill remaining parameter-level details, so nothing an agent needs 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?
The input schema already documents every parameter at 100% coverage. The description adds useful context by explaining the underlying `source` wire format and clarifying that `commands` must form a closed path, which is extra confidence beyond the schema's enum and example.
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 concrete action—'wrap a 2D closed curve onto a 3D face'—and names the exact API call (`<shape>.projectCurve`). The 'chained call into a kernelCAD script' and 'returns modified code plus diagnostics' description separates it from sibling modeling tools like add_curve or add_surface.
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 'Use this when you need...' and gives a clear non-goal: open-wire projection with `asEdge: true` is not implemented and rejected at edit time. It even provides the composition pattern with `.extrude(d)` / `.cut(...)`, so the agent knows when and how to chain it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryQuery GeometryARead-onlyInspect
Use this when you need to resolve or inspect topology against a script's lowered geometry. Selected by mode (default 'evaluate'):
'evaluate' — inspect a Query (@kc[...] ref, @kcq[...] DSL, or { ast }); returns matched entities. Pass expect:'unique' to assert exactly-one.
'resolve' — resolve a single @kc[...] / @kcq[...] ref to one entity ({ ref }).
'lineage' — walk the HistoryMap for a named face ref ({ feature_id, ref }). All params except
modeare forwarded verbatim.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | mode:'resolve'|'lineage' — topology ref string. | |
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. | |
| mode | No | Resolution mode (default 'evaluate'). | |
| query | No | mode:'evaluate' — Query input: @kc[...] / @kcq[...] string or { ast } object. | |
| 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 |
|---|---|---|
| ok | Yes | |
| ref | No | mode:'resolve' — the resolved ref string. |
| chain | No | mode:'lineage' — HistoryMap walk. |
| error | No | |
| query | No | mode:'evaluate' — the resolved Query ({ ast }). |
| entity | No | mode:'resolve' — the single matched entity. |
| entities | No | mode:'evaluate' — matched entities. |
| warnings | No | |
| errorCode | No | |
| candidates | No | mode:'resolve' — near-miss candidates (failure). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive. The description adds behavioral context: explains what each mode returns, parameter forwarding, and the 'expect' constraint. It does not cover potential side effects or limitations, but the annotations cover the safety profile.
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 concise, using a bullet list for modes and clear language. Every sentence adds value, with 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?
Given the complexity of three modes and seven parameters, the description is largely complete. It explains purpose, mode selection, and parameter roles. Since an output schema exists, not detailing return values is acceptable. Minor gaps: no mention of error conditions or response 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%, and the description adds mode-specific parameter guidance (e.g., which params apply to each mode). This clarifies usage beyond the schema's parameter descriptions without redundancy.
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 it resolves or inspects topology against a lowered geometry, with three distinct modes (evaluate, resolve, lineage) each having a specific purpose. This differentiates it from sibling tools like 'inspect' or 'evaluate_script' by focusing on querying via ref, DSL, or AST.
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 opens with 'Use this when you need to resolve or inspect topology against a script's lowered geometry' and breaks down when each mode is appropriate. However, it does not explicitly state when not to use this tool or name alternative tools from the sibling list.
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims 'Side-effect-free,' but annotations set destructiveHint=true, indicating the tool has side effects (modifying code). This contradiction misleads about safety; the description does not clarify what side effects occur.
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 'Use this when...', no wasted words. All information is essential 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?
Given the output schema and annotations, the description covers key behavior: returns modified code and diagnostics, refuses to remove return line. Missing details on match uniqueness failure, but overall 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 coverage is 100% and already includes descriptions for both parameters. The description adds only a usage context but no new semantic meaning beyond the schema examples.
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 the tool removes a feature line from a script, specifying the verb (remove) and resource (feature line). It distinguishes from sibling tools like add_feature by its purpose.
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 'Use this when you need to remove a feature line from a script,' providing clear usage context. However, it does not explicitly mention when not to use or alternatives, though siblings imply absence of add-like behavior.
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. 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.
| 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. | |
| 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. | |
| 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). | |
| height | No | Per-view tile height in px (default 768). | |
| 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). | |
| base_url | No | Advanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the preview rendered. |
| error | No | |
| bounds | No | Model AABB in mm { min, max } the camera was fit to (success). |
| images | Yes | Rendered tiles { name, path, description } — absolute local PNG paths with per-view camera orientation (kernelCAD is Z-up). |
| out_dir | No | Directory holding the PNGs (session temp dir unless out_dir was given). |
| errorCode | No | |
| errorHint | No | |
| mechanism | No | Mechanism-truth verdict: 'real' | 'broken' | 'unverified'. |
| render_ms | No | Wall-clock render time in ms (provisioning + browser + captures). |
| diagnostics | Yes | |
| render_source | No | Lane that served the render: 'static-player' | 'dev-server' | 'explicit'. |
| mechanism_failure_codes | No | De-duplicated failure codes when mechanism is 'broken'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say not read-only, not destructive), the description discloses many behavioral traits: PNGs are written to local paths, a 'prebuilt static player' is served from an ephemeral local port, the mechanism probe runs full BREP interference sweeps first, broken mechanisms produce watermarked tiles unless strict mode is set, and outputs are returned as absolute paths local to the MCP server. It also warns about latency and names the only environment dependency, playwright chromium. Nothing contradicts 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?
The description is long but dense and well front-loaded, with purpose stated first and each parameter group explained in order. There is minor redundancy, such as repeating 'NO STUDIO / DEV-SERVER REQUIRED' in caps after already stating 'with NO studio or dev server required' in the first sentence, and the trailing 'the overlay is the picture' is stylistic. Overall every sentence earns its place, though tighter editing would improve it.
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 16-parameter tool with no required parameters, nested objects, and an output schema, the description covers all high-stakes context: mechanism-check behavior and strict-mode interaction, latency tradeoffs, local-vs-remote path handling, environment prerequisites, and the return shape. It also explains the output schema fields in prose, so no critical behavioral gap remains for an agent to discover by trial.
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?
Even though schema coverage is 100%, the description adds substantial meaning beyond the schema: it states that exactly one of code/file is required, defines the pose coordinate convention (az=0,el=0 is front, +az rotates CCW), describes section as a way to inspect interior structure, explains explode's dependency on assembly.model(), and ties overlay to inspect() outputs. This materially helps an agent choose and fill parameters correctly.
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: 'render its script to deterministic PNG views for visual self-check,' clearly identifying this as the visual half of the 'evaluate → render → inspect → fix' loop. It distinguishes itself from siblings like inspect and open_in_studio by framing itself as visual output rather than quantitative analysis or studio viewing. The scope is precise and an agent can immediately understand what this tool does and why it exists.
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 opens with 'Use this when you need to LOOK at a kernelCAD model' and provides concrete routing guidance: hosted/remote clients 'should use open_in_studio instead,' and numeric surface data 'comes from inspect.' It also gives task-specific tips such as passing ['iso'] for fastest iteration, using file for relative imports, and skipping mechanism checks on large assemblies via no_mechanism_check. This is explicit when-to-use, when-not-to-use, and alternative selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_scriptRepair CAD ScriptAInspect
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. | |
| 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 |
|---|---|---|
| ok | Yes | Whether a candidate cleared the target diagnostic without new errors. |
| diff | No | Unified diff of the accepted patch (dry run: every candidate patch). |
| after | No | Post-repair { ok, featureHealth, diagnostics }. |
| error | No | |
| before | No | Pre-repair { ok, featureHealth, diagnostics }. |
| target | No | The diagnostic this run targeted { id, code, featureId?, message }. |
| applied | No | Candidate id that was accepted. |
| attempts | Yes | Per-candidate outcome { candidateId, applied, ok?, clearedDiagnostic?, newErrorCodes?, accepted, diagnostic? }. |
| new_code | No | Repaired .kcad.ts source (present when a patch applied). Caller persists it. |
| strategy | Yes | |
| errorCode | No | |
| candidates | Yes | |
| diagnostics | No | tool.repair.* diagnostics when repair could not complete. |
| repairRegion | No | The line ranges the repair was bound to. |
| candidateReason | No | |
| candidateStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by describing the apply-re-evaluate-keep-first loop, the bounded repair region, the refusal error for out-of-region patches, and the fact that the caller persists the returned source. This gives the agent a clear model of side effects and boundaries.
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?
Each sentence earns its place: trigger, workflow, boundary constraint, return payload, and call shape. The information is dense but well ordered, and the final 'Pass {...}' block gives an at-a-glance parameter summary.
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 repair tool, the description covers the trigger, algorithm, success criterion, failure/refusal behavior, return values, persistence responsibility, and parameter options. 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?
The schema already covers all parameters at 100%, so the baseline is 3. The description adds useful invocation shape via the 'file? | code?' alternation and ties diagnostic/strategy values to the repair workflow, which provides small but real semantic value 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?
The description names a specific verb (repair), resource (CAD script), and trigger (evaluate_script reported an error). It also distinguishes itself from diagnosis-focused tools by stating it applies fixes rather than describing them, and explicitly ties into why_did_this_fail candidates.
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?
States exactly when to use it: after evaluate_script reports an error and when the fix should be applied rather than described. It also clarifies the alternative behavior (described fixes) and gives concrete invocation options, plus a hard constraint about the repair region.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_assumptionsResolve Image AssumptionsAInspect
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 |
|---|---|---|
| ok | Yes | |
| ledger | No | The ledger after applying resolutions (present on success). |
| diagnostics | Yes | |
| paramOverrides | Yes | factId -> value for every resolved fact with a value; feed into set_param. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key side effect: it reads the ledger file, rewrites it, and returns the updated ledger plus paramOverrides. This goes beyond the annotations, which only indicate readOnlyHint=false, and gives an agent a clear model of what changes.
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 trigger condition and packs read/apply/rewrite/return behavior into compact, purposeful sentences. Every clause earns its place, including the JSON shapes and the skill pairing.
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 two parameters, an output schema, and annotations already marking the tool as non-read-only, the description covers the source ledger, resolution payload shapes, the file-rewriting side effect, the return value, and the integration with set_param. Nothing essential is missing 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?
The schema already provides 100% coverage for both parameters, including the confirm/value semantics. The description adds workflow context and output routing, but it does not add substantial parameter-level meaning beyond what the schema already states. 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 precise use case: confirm or override open facts in a trace_from_image ledger before committing geometry. It names the concrete operations (read, apply resolutions, rewrite, return paramOverrides) and references the source sibling trace_from_image and downstream set_param.
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 opens with 'Use this when...' and specifies the workflow context: 'before committing geometry built from a reference photo.' It does not name a comparable alternative tool or give an explicit when-not-to-use condition, but the workflow positioning is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_cadReview CAD ModelARead-onlyInspect
Use this when you need to review a mechanism for fitness and repair mode. Run the deterministic CAD review loop: evaluate the script, validate the assembly/mate graph, check mate connectors touch modeled material, sample declared mate limits, optionally check interferences at sampled poses, report connector workspace bounds, and return a mechanism fitness verdict for agent self-review. Fitness includes repairMode: none, local-fix, parameter-tune, or topology-redesign.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. | |
| 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. | |
| 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. | |
| gripperAperture | No | Optional fingertip connector refs for gripper aperture travel reporting. | |
| 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. | |
| requirePhysicalUseCase | No | When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits. | |
| includePhysicalUseCaseStatics | No | 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. | |
| includePhysicalUseCaseReachability | No | 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. | |
| includePhysicalUseCaseJointReactions | No | 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. | |
| includePhysicalUseCaseJointStructure | No | 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. | |
| physicalUseCaseReachabilitySamplesPerMate | 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 |
|---|---|---|
| ok | Yes | |
| fitness | No | Mechanism fitness verdict incl. repairMode. |
| assembly | No | |
| mechanism | No | |
| validator | No | Assembly/mate-graph validator result. |
| diagnostics | Yes | |
| featureCount | Yes | |
| poseEnvelope | No | Sampled mate-limit pose envelope. |
| repairContext | No | |
| gripperAperture | No | |
| mechanismFailures | No | |
| connectorWorkspace | No | Connector workspace bounds. |
| interferenceSummary | No | Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3. |
| rawInterferencePairs | No | |
| suggestedRepairPrompt | No | Structured repair prompt (failure / repair path). |
| physicalUseCaseStaticCertificates | No | Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence. |
| physicalUseCaseJointReactionCertificates | No | Exact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm. |
| physicalUseCaseJointStructuralCertificates | No | Per-joint declared-envelope and geometry/material clevis strength evidence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: it is deterministic, it follows a specific review loop, it can optionally check interferences and pose envelopes, and it returns one of four repairMode verdicts. No contradiction with annotations exists.
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 dense and front-loaded with the core use case, then enumerates the review steps and verdict types. It is longer than average, but for an 18-parameter tool with many optional behaviors, the detail is substantive 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?
The tool is complex with 18 optional parameters, but the schema covers parameter-level details and the output schema covers returns. The description supplies the missing decision-level context: when to use it, what process it runs, what optional checks exist, and what the fitness verdict means. Nothing needed to call it correctly is omitted.
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 input schema already documents all 18 parameters thoroughly. The description adds high-level meaning by connecting the review loop to the parameters, but it does not need to compensate for gaps. 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 names a specific verb ('review'), a specific resource ('a mechanism'), and a distinctive outcome: a fitness verdict with repair mode categories. It differentiates itself from siblings by describing the deterministic CAD review loop and the self-review purpose, so an agent can tell it apart from similar tools like verify or inspect.
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 opens with 'Use this when you need to review a mechanism for fitness and repair mode,' providing a clear invocation condition. It does not name alternatives or explicitly state when not to use it, so it stops just 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.
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 the linear-static structural study a script declares with shape.feaStudy({ material, fixed, loads, meshSize?, minSafetyFactor? }): meshes the solid with quadratic tetrahedra, solves it with CalculiX, and returns evidence — peak von Mises stress (MPa), peak displacement (mm), the minimum safety factor against the material yield, per-region hot spots named by @kc[...] face ref, mesh-quality trust flags, an equilibrium residual, and stress-heatmap PNG paths.
Requires the external solver toolchain (CalculiX ccx plus the gmsh Python module). When it is absent the call fails with fea.solver.unavailable and the exact install command — never a silent pass.
Pass { file | code }, optional study (defaults to the last declared study), output_dir (keeps the .inp/.frd deck for reproduction), mesh_size (mm, overrides the study for this run), and heatmaps: false for a fast numbers-only run.
| 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. | |
| study | No | Name of the study to run; defaults to the last declared one. | |
| heatmaps | No | Render stress heatmap PNGs (default true). | |
| 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | False when the study violated its declared minSafetyFactor, a selector did not resolve, or the solver toolchain is missing. |
| error | No | |
| images | No | Absolute PNG paths of the rendered stress heatmap. |
| legend | No | Heatmap colour bands { color, fromMPa, toMPa } — the scale the PNGs are drawn on. |
| out_dir | No | Directory holding the summary JSON, solver deck and heatmap PNGs. |
| summary | No | Solved evidence: maxVonMisesMPa, maxVonMisesAt, maxDisplacementMm, maxDisplacementAt, minSafetyFactor (+ minSafetyFactorRequired), nodeCount/elementCount/meshSizeMm, quality (minSICN, meanSICN, lowQualityCount), maxStressErrorPercent, trust { meshTrusted, reasons }, hotSpots [{ region, maxVonMisesMPa, nodeId, at, safetyFactor }], appliedForceN / reactionForceN / equilibriumResidual, meshMs / solveMs. |
| artifacts | No | Absolute paths of the BREP geometry handoff, .inp deck, .frd results and mesh JSON, for hand reproduction. |
| errorCode | No | |
| diagnostics | No | fea.* diagnostics raised by the run. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, but the description goes beyond by disclosing that the tool requires an external solver toolchain (CalculiX and gmsh), and that it fails with a specific error code if missing, never silently passing. It also mentions it meshes with quadratic tetrahedra and returns heatmap PNGs. This adds significant behavioral context beyond the annotations, though it does not fully explain the full computational cost or potential side effects on disk.
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: it starts with the primary use case, then explains the workflow, the dependencies and error handling, and finally lists parameters in a single sentence. It is dense but every sentence adds value, with no fluff. The key usage guidance is front-loaded.
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 complexity of the tool (8 parameters, no required ones, output schema present), the description covers all essential aspects: the purpose, the setup, the failure mode, and the key parameters. The output schema already explains returns, so the description does not need to. It also notes the fast numbers-only run. It is sufficient for an agent to select and invoke 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?
The schema description coverage is 100%, so the schema already documents each parameter. The description adds a concise summary of the key parameters: file/code, study, output_dir, mesh_size, heatmaps. It does not go into detailed semantics for each, but the baseline for high coverage is 3, and the description's overview is adequate.
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 the tool's purpose: to run a linear-static structural FEA to determine if a part will hold a load. It specifies the verb 'run', the resource 'structural study', and details the workflow (mesh, solve, return evidence). It distinguishes from siblings like fea_summary (which likely summarizes results) by focusing on the execution of the analysis.
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 opens with 'Use this when you need to know whether a part will hold a load', which is clear guidance on when to use this tool. It also mentions the script declaration and the optional study parameter, and implicitly contrasts with fea_summary. It does not explicitly name alternatives, but the context signals (siblings) and the first sentence provide direction for an agent.
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 PrinterAInspect
Use this when you need to upload a .gcode file (e.g. written by export with target: "model", format: "gcode") to a real network printer and, by default, start the print. protocol: 'octoprint' (POST /api/files/local with an X-Api-Key), 'moonraker' (Klipper's POST /server/files/upload), or 'bambu-lan' (Bambu Lab LAN-mode: FTPS implicit-TLS upload on port 990 as user 'bblp' with the printer's LAN access code, then an MQTT print-start command on port 8883 — requires access_code and, unless start_print is false, serial). Pass { dry_run: true } to validate connectivity/authentication only, without 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. | |
| filename | No | Uploaded file name (default: 'kernelcad.gcode'). | |
| 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| dry_run | No | True when only connectivity/auth was validated (no upload, no print start). |
| diagnostics | No | |
| uploaded_path | No | Path/name the G-code was stored under on the printer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, openWorldHint=true, and destructiveHint=false; the description carries the behavioral burden and does exceptionally well. It discloses the side effects (upload and print start), the protocol-specific auth and network behavior, the dry_run escape hatch, and the guarantee that credentials are never logged or echoed. 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 primary use case, then packs relevant protocol details, auth requirements, and the dry_run behavior into a dense but efficient paragraph. Every sentence contributes operational information; there is no filler or redundant restating of 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?
Given the tool's 10 parameters, three protocols with distinct auth models, and side-effecting behavior, the description covers what an agent needs: when to use it, what each protocol requires, how to avoid side effects, and how to validate connectivity. Since an output schema exists, the return format is not the description's responsibility.
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?
Input schema covers 90% of parameters with good descriptions, so the baseline is 3. The description adds meaningful value by explaining protocol-specific requirements, such as when serial is required for bambu-lan, which parameters matter for each protocol, and what dry_run does. It does not restate what the schema already 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/resource: upload a .gcode file to a real network printer and, by default, start the print. It also references the export tool output format, making the purpose concrete and distinct from the CAD/analysis-focused sibling 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?
Explicitly opens with 'Use this when you need to upload a .gcode file...' and explains the dry_run mode for connectivity/auth validation. It names all supported protocols and their prerequisites, giving clear context, though it does not explicitly state when not to use the tool since no close printer sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_paramSet ParameterAInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The .kcad.ts source code. | |
| new_value | Yes | 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"). | |
| param_name | Yes | The string literal name of the param (first arg to param()). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return values (modified code + diagnostics) and explicitly states no side effects, going beyond annotations which only provide hints.
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 focused sentences: first states purpose, second describes return and external persistence. No fluff, essential information front-loaded.
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 moderate complexity and full schema coverage, description covers all necessary aspects: purpose, parameters, return, and side-effect behavior.
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 context to param_name ('first arg to param()') and provides examples for new_value, adding value beyond the 100% schema description coverage.
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 specific action: 'edit a param() default value in a kernelCAD script'. Distinguishes from sibling tools like add_part or remove_feature which handle other script modifications.
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 tells when to use (edit param default) and clarifies that persistence is handled externally via file-write tools, setting correct expectations.
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 ReturnAInspect
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 |
|---|---|---|
| ok | Yes | Whether the edit applied and re-evaluated cleanly. |
| error | No | Failure message (present when ok is false). |
| new_code | No | Modified .kcad.ts source (present on success). Caller persists it. |
| diagnostics | No | Diagnostics from re-evaluating the modified source. |
| binding_name | No | JS const name bound to the new construct (when one was created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate the tool is not read-only and not destructive; the description confirms it modifies source code and re-evaluates. Adds specifics about replacing the return statement and returning diagnostics, which exceeds annotation-provided information.
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 sentences: first states purpose, second details the two return methods, third gives use-case guidance and output summary. No wasted words; front-loaded with core action.
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 5 parameters (3 required), schema coverage of 80%, and existence of an output schema, the description sufficiently explains tool behavior and return values. Slightly light on edge cases but adequate for selecting and invoking 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?
Description adds meaningful context beyond the schema's parameter descriptions: explains the difference between 'model' and 'solvedModel' modes and when to use each. For 'poses' and 'options', hints at their purpose in solvedModel, though schema already covers them. With 80% schema coverage, description still adds value.
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 the tool modifies the script's return statement, specifying exact substitutions (`model()` or `solvedModel()`). It uniquely identifies its function among siblings, focusing on assembly return behavior.
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?
Provides explicit guidance on when to use the tool ('Use this when you need to set how the script returns its assembly') and when to choose each mode ('Use solvedModel for mate-authored mechanisms'). Does not explicitly mention when not to use it, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_matesSolve MatesARead-onlyInspect
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 |
|---|---|---|
| ok | Yes | |
| error | No | |
| poses | No | Solved part poses keyed by mate; each a serialized Transform (success). |
| status | No | Solver status (success). |
| errorCode | No | |
| errorHint | No | |
| iterations | No | Solver iteration count (success). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds some behavioral detail (e.g., 'Run the v0.6 mate-graph solver on the active assembly'). The description does not contradict annotations, but it adds limited extra information beyond acknowledging the read-only nature.
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 concise, two sentences long, and front-loaded with the primary purpose. Every sentence adds value without unnecessary 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?
While the description covers the return format and has an output schema, it fails to explain the 'assembly' parameter, which is crucial for context (active assembly). This omission reduces completeness for a tool with two parameters.
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 input schema has two parameters: 'poses' (described in schema) and 'assembly' (undescribed). The description only repeats the schema description for 'poses' and does not explain the 'assembly' parameter, leaving a gap in parameter understanding despite 50% schema coverage.
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 the tool's purpose: 'solve the mate graph and get part poses' using the v0.6 mate-graph solver. It specifies the action (solving), the target (mate graph), and the outcome (part poses), distinguishing it from siblings like add_mate or solve_sketch.
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 begins with 'Use this when you need to solve the mate graph and get part poses,' providing clear usage context. However, it does not explicitly mention when not to use this tool or list alternative tools for similar tasks, such as solve_sketch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_sketchSolve SketchARead-onlyInspect
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 |
|---|---|---|
| ok | Yes | |
| errors | No | Solver/validation errors (present on failure, including non-convergence). |
| entities | Yes | Solved sketch entities (best-effort on a non-converging solve). |
| residual | No | Final aggregate constraint residual when the solver ran. |
| converged | No | Whether the constraint solve converged below tolerance. ok is false when this is false. |
| constraints | Yes | The constraints applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds 'Side-effect-free: pass { entities, constraints } and receive solved entities plus the original constraints,' which clarifies the input/output contract and reinforces the read-only behavior. It also notes the 'kernelCAD constraint vocabulary,' adding useful context without contradicting 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 short, but the first and second sentences redundantly say the same thing: 'Use this when you need to solve a 2D sketch constraint set' followed by 'Solve a 2D sketch constraint set.' One sentence could be removed to make it tighter, though the remaining content is efficient.
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 input schema and an output schema present, the description need not explain return values in detail. It covers when to use the tool, the side-effect-free nature, and the entity/constraint input categories. This is complete enough for an agent to invoke the tool correctly; only minor details like the 'fixed' point behavior are left 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 description coverage is 100%, with detailed descriptions for entity types, constraint types, and the 'fixed' flag. The description's mention of 'POINT, LINE, and CIRCLE records' and 'kernelCAD constraint vocabulary' mostly repeats what the schema already encodes, so it adds no significant parameter-level meaning beyond 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?
The description states a specific verb and resource: 'solve a 2D sketch constraint set.' It clearly identifies the operation and scope, and the qualifier '2D sketch' differentiates it from sibling tools like solve_mates or add_constraint. The purpose is unambiguous despite the slight redundancy in phrasing.
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 opening 'Use this when you need to solve a 2D sketch constraint set' provides an explicit trigger condition. It does not name alternatives or exclusions (e.g., solving mates), but the '2D sketch' scope and 'side-effect-free' note give enough context for an agent to select this tool over related siblings.
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-onlyInspect
Use this when you need to check whether a mechanism stays buildable across a tolerance/dimension range, not just at one nominal value. Declares one or more param() names with a { values: [...] } list or a { min, max, steps } range, re-evaluates the script once per cartesian-product combination (capped at 64 combos — exceeding it truncates to the first 64 and emits kinematic.sweep-tolerance.combo-cap-exceeded), and runs the standard gates on each combo: interference, mounting-hole diameter agreement, and joint-axis binding (all three, default on); reachability only when gates.reachable names a tip_link + target. Returns the pass/fail envelope table (one row per combo) plus firstFailure per gate — the fastest way to find the first param value at which a design breaks.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline kernelCAD script source. | |
| file | No | Path to a .kcad.ts script file. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether every gate passed on every evaluated combo. |
| error | No | |
| results | No | One entry per evaluated combo: { combo, gates, diagnostics }. |
| errorCode | No | |
| diagnostics | No | Sweep-level diagnostics (e.g. combo-cap-exceeded). |
| combosCapped | No | True when the full cartesian product exceeded the 64-combo cap. |
| firstFailure | No | First failing combo per gate name. |
| combosEvaluated | No | Number of combos actually evaluated (capped at 64). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds substantial behavioral context beyond annotations: it explains the cartesian-product evaluation, the 64-combo cap with the emitted event name, the default-on gates, the reachability gate condition, and the return envelope with firstFailure. This is rich, non-obvious behavior that an agent needs to know.
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 dense but every sentence earns its place: usage trigger, param declaration syntax, combo cap behavior, gate defaults, reachability condition, and return value. It is front-loaded with the primary use case and then details. No filler or repetition of schema field names.
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 (5 params, nested gates object, output schema present), the description covers the essential behavioral contract: what triggers the tool, how params are specified, what gates run by default, the cap behavior, and what is returned. The output schema exists, so return values need not be fully re-explained. Nothing critical is missing for an agent to select and invoke this tool 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%, so the schema already documents all parameters. The description adds meaning by explaining how params are declared ({ values: [...] } or { min, max, steps }), how gates interact (all three default on, reachability only when gates.reachable names a tip_link + target), and what the output contains. This goes beyond the schema's terse field descriptions, though the schema already carries most of the load.
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 ('check whether a mechanism stays buildable') and resource ('across a tolerance/dimension range'), and distinguishes it from a nominal single-value evaluation. It also names the sibling alternative implicitly by contrasting with 'not just at one nominal value' and by describing the sweep behavior, making the tool's purpose unmistakable.
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 'Use this when you need to check whether a mechanism stays buildable across a tolerance/dimension range, not just at one nominal value.' This gives a clear when-to-use condition. It also explains the combo cap and the gate behavior, which helps an agent decide when this tool is appropriate versus alternatives like evaluate_script or design_loop.
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 ImageAInspect
Use this when you need to trace features from a reference photo into 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 (Claude vision; named points/cluttered backgrounds; caller-supplied ANTHROPIC_API_KEY), and hybrid (opencv silhouette + LLM-labeled named points). Default backend is auto — the tool picks based on the image's corner-color stddev. Accuracy honesty: opencv contour is geometrically exact; vision-LLM is typically 5–10% off on dense landmarks. Per-feature confidence is reported. Caller pays for any vision-LLM API spend via their own ANTHROPIC_API_KEY. Pair with the kernelcad-trace-from-image skill for the conversion-to-mm pipeline.
| 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"). | |
| 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. | |
| 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 |
|---|---|---|
| ok | Yes | |
| ledger | Yes | Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing. |
| features | Yes | Traced features with normalized [0..1] waypoints + confidence. |
| imageDims | Yes | Pixel dimensions [width, height] of the source image. |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the minimal annotations by disclosing backend dispatch behavior, backend determinism, vision-LLM accuracy fallibility (5–10% off on dense landmarks), per-feature confidence reporting, and caller-paid API costs. This is exactly the kind of behavioral nuance an agent needs to set expectations and avoid surprise spend.
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 dense but every clause earns its place: use case, output representation, backend dispatch, accuracy, cost, and the companion skill. It is front-loaded with the primary purpose and does not repeat 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?
Given its complexity (8 params, nested objects, output schema), the description covers the critical integration points: normalized output, mm-scale anchoring, backend selection, cost implications, confidence reporting, and the companion skill. The output schema exists, so not explaining return fields is acceptable.
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 meaningful context on top: it explains how scaleAnchor maps pixel waypoints to mm, clarifies backend selection semantics beyond the enum labels, and positions features/hints against the different backends. This makes key parameters operationally intelligible without restating 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 opens with a specific verb-resource-output statement: 'trace features from a reference photo into waypoints,' then clarifies the output format (normalized [0..1] waypoints) and downstream use (path().spline / path().nurbsSegment). This clearly distinguishes it from broader image tools like mesh_to_features or 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?
It explicitly says 'Use this when you need to trace features from a reference photo into waypoints' and adds a pairing note with the kernelcad-trace-from-image skill for the mm conversion. It lacks an explicit when-not-to-use or named alternative, but the context is strong enough for an agent to recognize the intended scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verifyVerify DesignARead-onlyInspect
Use this when you need to check a design against a rule set. One verifier, selected by check:
'assembly' — mate-aware assembly validator on the active session (run evaluate_script first).
'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, ... }).
'swept-collision' — sweep declared joint range(s) and report colliding poses.
'reachable' — inverse-kinematics reachability for an end-effector ({ tip_link, target_position, ... }).
'mounting-holes' — fastened mates expose matching hole diameters on both sides.
'load-capacity' — closed-form Euler-Bernoulli beam stress / safety-factor check ({ loads, materials, ... }).
'static-hold' — gravitational holding torque/force at a sampled pose grid vs each actuated joint's declared actuator capacity ({ joint?, pose?, gravity?, min_torque_margin_pct?, range_samples? }). All params except
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). | |
| mode | No | check:'load-capacity' — 'beam' (default) or 'stub'. | |
| 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. | |
| 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 }. | |
| range | No | check:'swept-collision' — [lower, upper, step] in joint-native units. | |
| 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]). | |
| service | No | check:'dfm-preflight' — service. | |
| assembly | No | Assembly name; defaults to the first captured assembly. | |
| material | No | check:'dfm-preflight' — material SKU (required for that check). | |
| tip_link | No | check:'reachable' — end-effector part name (required for that check). | |
| featureId | No | check:'dfm-preflight' — FeatureId to scope to. | |
| materials | No | check:'load-capacity' — partName -> material declaration. | |
| urdf_path | No | check:'urdf' — path to the .urdf file. | |
| thicknessIn | No | check:'dfm-preflight' — material thickness in inches. | |
| thicknessMm | No | check:'dfm-preflight' — material thickness in millimeters. | |
| 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). | |
| 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). | |
| target_orientation | No | check:'reachable' — target XYZ Euler angles in radians. | |
| 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. | |
| 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). | |
| orientation_tolerance_rad | No | check:'reachable' — orientation tolerance in radians. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the verification ran and passed its gate. |
| error | No | Failure message (present on failure). |
| errorCode | No | |
| diagnostics | No | Verifier diagnostics (most checks). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral details beyond that: assembly requires evaluate_script first, checks fail closed on missing required params, and several modes have documented default or omission behavior. No contradiction with annotations exists.
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 every sentence earns its place: the primary trigger is front-loaded, the nine modes are organized as scannable bullets, and the closing line about forwarding and fail-closed behavior is necessary. There is no fluff 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?
For a tool with 32 parameters, 9 checks, and high complexity, the description covers check selection, prerequisites, parameter grouping, defaults, and failure behavior. The presence of an output schema means return-format details need not be repeated, and annotations cover non-destructiveness and read-only status.
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 value by grouping parameters per check, showing which params belong to which verifier, and explaining that all non-check params are forwarded verbatim. The 'fails closed on its own missing required params' note also clarifies how incomplete parameter sets are handled.
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 the tool's purpose: check a design against a rule set, and it enumerates nine distinct verification modes. This is specific about verb and resource, but it does not explicitly differentiate the tool from similar siblings like inspect, review_cad, or solve_mates, 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?
The opening 'Use this when you need to check a design against a rule set' gives a direct when-to-use signal, and each bullet provides a compact condition and input for its check. It lacks explicit 'use X instead' exclusions or alternatives, but the check-specific guidance is clear enough for an agent to select the right mode.
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-onlyInspect
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 | ||
| feature_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| chain | No | Upstream feature diagnostics in topological order; requested feature last. |
| error | No | |
| trace | No | Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents. |
| errorCode | No | |
| candidates | No | Ordered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from. |
| feature_id | No | |
| repairRegion | No | Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }. |
| candidateReason | No | Why no candidate was derivable. |
| candidateStatus | No | 'no-automatic-candidate' means the region is the whole answer — no mechanical fix exists for that diagnostic kind. |
| targetDiagnosticId | No | Id of the diagnostic the repair plan targets; pass it to repair_script. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a read-only, non-destructive operation, and the description adds valuable behavioral detail: the requested feature's diagnostics plus all upstream diagnostics are returned in topological order, with the requested feature last. It also discloses the inline per-code hint behavior and references lookup_diagnostics for the full catalogue.
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, opening with use-case guidance before explaining behavior and output. Every sentence adds relevant operational detail, with no filler or repetition of 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?
The description covers the core call flow, return ordering, and relationship to lookup_diagnostics, while the output schema covers return structure and annotations cover safety. The main gap is parameter semantics: with three undocumented optional parameters, the agent still lacks enough information to know how to uniquely identify the failing feature or whether any parameter is required.
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 0%, so the description must explain what file, code, and feature_id mean. It merely restates the parameter names with optional markers, adding no semantic meaning or guidance on how to choose or combine them. The agent is left to guess what 'code' or 'file' refers to in the context of failure tracing.
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 identifies the tool's job: tracing why a feature failed by walking its upstream chain. It names the specific resource (failing feature) and the output (diagnostics in topological order), distinguishing it from generic query/inspect 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?
Starts with an explicit 'Use this when you need to trace why a feature failed', giving immediate selection guidance. It also directs the agent to lookup_diagnostics when a full catalogue of hints is needed, clarifying how this tool relates to a sibling.
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
open_in_studio5 fields changed- added
Output schema / properties / meshErrorAdded value: +{ + "description": "Sanitized persist/repair error when meshStatus is failed.", + "type": "string" +} - removed
Output schema / properties / meshPersistErrorRemoved value: -{ - "description": "Set when the revision mesh could not be stored on the CDN. meshUrl is omitted in that case.", - "type": "string" -} - added
Output schema / properties / meshStatusAdded value: +{ + "description": "ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).", + "enum": [ + "ready", + "building", + "failed", + "missing" + ], + "type": "string" +} - changed
Output schema / properties / meshUrl / descriptionPrevious value: -"Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed."New value: +"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)." - changed
Output schema / properties / ok / descriptionPrevious value: -"Whether the model was persisted."New value: +"Whether publish succeeded. Under CDN mode, false when mesh persist hard-failed (meshStatus:failed) — never ok:true with meshUrl silently omitted."
1 tool update
- Changed
get_project3 fields changed- added
Output schema / properties / meshErrorAdded value: +{ + "description": "Fetch mode: sanitized repair/persist error when meshStatus is failed.", + "type": "string" +} - added
Output schema / properties / meshStatusAdded value: +{ + "description": "Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).", + "type": "string" +} - changed
Output schema / properties / meshUrl / descriptionPrevious value: -"Fetch mode: revision-matched mesh artifact URL when available — FunnelViewer loads it instead of re-executing CAD."New value: +"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)."
1 tool update
- Changed
open_in_studio1 field changed- added
Output schema / properties / meshPersistErrorAdded value: +{ + "description": "Set when the revision mesh could not be stored on the CDN. meshUrl is omitted in that case.", + "type": "string" +}
2 tool updates
- Changed
get_project4 fields changed- added
Output schema / properties / embedUrlAdded value: +{ + "description": "Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).", + "type": "string" +} - added
Output schema / properties / meshUrlAdded value: +{ + "description": "Fetch mode: revision-matched mesh artifact URL when available — FunnelViewer loads it instead of re-executing CAD.", + "type": "string" +} - added
Output schema / properties / serverBuildAdded value: +{ + "description": "Deploy identity (package+git SHA@boot time) so connector lag is observable.", + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "description": "Fetch mode: revision-pinned /p/<slug>?version= link.", + "type": "string" +}
- Changed
open_in_studio3 fields changed- changed
Output schema / properties / embedUrl / descriptionPrevious value: -"Read-only, chrome-free /embed/<slug> viewer URL — drop into an <iframe> to embed the live model in any site or widget (no login)."New value: +"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." - added
Output schema / properties / meshUrlAdded value: +{ + "description": "Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed.", + "type": "string" +} - added
Output schema / properties / serverBuildAdded value: +{ + "description": "Deploy identity so connector vs server mismatch is observable.", + "type": "string" +}
23 tool updates
- Changed
add_surface14 fields changed- added
Input schema / properties / angle_degAdded value: +{ + "description": "kind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction.", + "maximum": 90, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / binding_name / descriptionPrevious value: -"JS const name for the new Surface binding (kind:'nurbs' default surface_<N>; kind:'boundary' default _surface_<N>)."New value: +"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>)." - added
Input schema / properties / by_bindingAdded value: +{ + "description": "kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.", + "type": "string" +} - added
Input schema / properties / faceAdded value: +{ + "description": "kind:'draft' — face selector for the face(s) to taper. Accepts a canonical name (top/bottom/front/back/left/right), a user label declared via faceLabels, or a FaceQuery descriptor string.", + "type": "string" +} - changed
Input schema / properties / kind / descriptionPrevious value: -"Which surface-construction path to use."New value: +"Which surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'." - changed
Input schema / properties / kind / enumPrevious value: -[ - "nurbs", - "boundary" -]New value: +[ + "nurbs", + "boundary", + "trim", + "sew", + "draft" +] - added
Input schema / properties / neutral_planeAdded value: +{ + "description": "kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.", + "type": "string" +} - added
Input schema / properties / opAdded value: +{ + "description": "kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).", + "enum": [ + "trim", + "split" + ], + "type": "string" +} - added
Input schema / properties / pull_dirAdded value: +{ + "description": "kind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" +} - added
Input schema / properties / require_closedAdded value: +{ + "description": "kind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid.", + "type": "boolean" +} - added
Input schema / properties / shape_bindingAdded value: +{ + "description": "kind:'draft' — JS variable name of the Shape to taper (must be declared in source).", + "type": "string" +} - added
Input schema / properties / surface_bindingAdded value: +{ + "description": "kind:'trim' — JS variable name of the Surface to trim/split (must be declared in source).", + "type": "string" +} - added
Input schema / properties / surface_bindingsAdded value: +{ + "description": "kind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source).", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / toleranceAdded value: +{ + "description": "kind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged.", + "type": "number" +}
- Changed
design_loop1 field changed- added
Input schema / properties / requirePhysicalAcceptanceAdded value: +{ + "description": "Require declared physicalUseCase common-pose reachability and pose-bound quasi-static certification before accepting an attempt. Design-loop also enables this automatically when an attempt script calls physicalUseCase(...).", + "type": "boolean" +}
- Added
diff_geometry - Changed
diff_scripts1 field changed- added
Output schema / properties / deeperDiffAvailableAdded value: +{ + "additionalProperties": true, + "description": "Present when the diff touched geometry-affecting ops: { tool: 'diff_geometry', reason, bodies } — the same two scripts can be compared at material level (added/removed/common volume + per-body verdict).", + "type": "object" +}
- Added
drawing_to_cad - Changed
evaluate_script3 fields changed- added
Input schema / properties / skipMechanismCheckAdded value: +{ + "description": "Opt out of the default mechanism-truth gate. By default a full evaluation of an assembly-built scene runs checkMechanismTruth and returns a `mechanism` verdict (real/broken/unverified); a broken mechanism makes ok:false. Set true to skip the sweep entirely (no `mechanism` field, no cost). Ignored for dryRun and non-assembly scripts.", + "type": "boolean" +} - added
Output schema / properties / featureHealthAdded value: +{ + "description": "Per-feature health degradations — ONLY features that fell back to a passthrough (warning) or failed to lower (error). Empty when every feature is healthy. Surfaces which feature degraded even when ok is true.", + "items": { + "additionalProperties": false, + "properties": { + "featureId": { + "type": "string" + }, + "status": { + "enum": [ + "warning", + "error" + ], + "type": "string" + } + }, + "required": [ + "featureId", + "status" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / mechanismAdded value: +{ + "description": "Mechanism-truth verdict for an assembly-built scene (default-on; omitted for dryRun, non-assembly, or skipMechanismCheck:true). 'broken' makes ok:false; 'unverified' keeps ok and surfaces a loud budget diagnostic.", + "enum": [ + "real", + "broken", + "unverified" + ], + "type": "string" +}
- Changed
export3 fields changed- changed
Input schema / properties / format / enumPrevious value: -[ - "stl", - "step", - "dxf", - "3mf", - "glb", - "svg-drawing", - "urdf", - "srdf", - "sdf-gazebo" -]New value: +[ + "stl", + "step", + "dxf", + "3mf", + "glb", + "svg-drawing", + "urdf", + "srdf", + "sdf-gazebo", + "usd-isaac", + "bom-csv", + "bom-json" +] - 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? }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource? }. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\", modelName?, date? }."New value: +"target:'model' — optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: \"mm\"|\"cm\"|\"in\", tolerance? }. 3mf: { printUnit?: \"mm\"|\"cm\"|\"in\", embedSource? }. glb: { axis?: \"y-up\"|\"z-up\", draco?: false }. svg-drawing: { sheet?: \"a4\"|\"a3\", modelName?, date?, annotations?, exploded?: { factor, mode? }, balloons?, partsList?, sections?, autoAnnotate? }. svg-drawing annotations is an array of authored dimensions/notes, each { kind: \"linear\"|\"radius\"|\"diameter\"|\"angular\"|\"note\", view?: \"front\"|\"top\"|\"left\"|\"iso\", text?, offset? } plus kind-specific geometry: linear { from, to }, radius/diameter { edge: EdgeQuery }, angular { from: EdgeQuery, to: EdgeQuery }, note { at, text }. from/to/at anchors are an [x,y,z] model point, { edge: EdgeQuery } or { face: FaceQuery }. Supplying any annotation REPLACES the automatic bounding-box dimensions; an annotation whose query resolves to zero or multiple matches fails the export rather than being dropped. svg-drawing sections is an array of { plane: \"xy\"|\"xz\"|\"yz\"|{ origin, normal }, label } (any non-zero normal). svg-drawing autoAnnotate is true or { tolerance?: \"ISO2768-f\"|\"ISO2768-m\"|\"ISO2768-c\", datums?: \"auto\"|[{ label, face: FaceQuery }], include?: [\"datums\"|\"flatness\"|\"holes\"|\"hole-positions\"|\"overall\"|\"fillets\"|\"chamfers\"|\"general-tolerance\"] }; datums and tolerances declared in the script with shape.datum() / shape.tolerance() override the automatic ones." - changed
Output schema / properties / mesh_files / descriptionPrevious value: -"Per-link mesh files for urdf/sdf-gazebo exports."New value: +"Per-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo, meshes/<part>.usda mesh layers for usd-isaac."
- Added
fea_summary - Changed
inspect12 fields changed- changed
Input schema / properties / assembly / descriptionPrevious value: -"of:'assembly'|'robot' — assembly name; defaults to the first captured assembly."New value: +"of:'assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly." - added
Input schema / properties / atAdded value: +{ + "description": "of:'section' — single slice position along `axis` (mm).", + "type": "number" +} - added
Input schema / properties / axisAdded value: +{ + "description": "of:'section' — normal axis for `at` / `stack` (default 'z').", + "enum": [ + "x", + "y", + "z" + ], + "type": "string" +} - added
Input schema / properties / densityAdded value: +{ + "description": "of:'mass' — material density in kg/m^3 (steel 7850, aluminium 2700, ABS 1050). Defaults to 1000 (water); the response echoes the value used and flags when it was defaulted.", + "type": "number" +} - added
Input schema / properties / edgesAdded value: +{ + "description": "of:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled." +} - added
Input schema / properties / facesAdded value: +{ + "description": "of:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled." +} - changed
Input schema / properties / feature_id / descriptionPrevious value: -"of:'shape'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape."New value: +"of:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape." - added
Input schema / properties / gyration_axisAdded value: +{ + "description": "of:'mass' — optional axis in shape-local mm to report the radius of gyration about. Omit for centroidal quantities only; the result is density-independent and returned in mm.", + "properties": { + "direction": { + "description": "Axis direction; normalised internally, so it need not be a unit vector.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "origin": { + "description": "A point on the axis, shape-local mm.", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [ + "origin", + "direction" + ], + "type": "object" +} - changed
Input schema / properties / of / enumPrevious value: -[ - "assembly", - "robot", - "step", - "shape", - "features", - "assemblies", - "topology", - "edges", - "face-edges", - "faces", - "face-labels", - "mates", - "constraints", - "part-stats", - "bend-table", - "params", - "part-categories", - "part-families" -]New value: +[ + "assembly", + "robot", + "step", + "shape", + "mass", + "features", + "assemblies", + "topology", + "edges", + "face-edges", + "faces", + "face-labels", + "mates", + "constraints", + "part-stats", + "bend-table", + "params", + "part-categories", + "part-families", + "bom", + "section", + "continuity", + "curvature" +] - added
Input schema / properties / planeAdded value: +{ + "description": "of:'section' — section plane. Either a cardinal name string 'xy'|'xz'|'yz', { plane: 'xy'|'xz'|'yz', offset? }, or { origin: [x,y,z], normal: [nx,ny,nz] }. Omit to use `at`+`axis`.", + "type": [ + "string", + "object" + ] +} - added
Input schema / properties / spike_factorAdded value: +{ + "description": "of:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6).", + "type": "number" +} - added
Input schema / properties / stackAdded value: +{ + "description": "of:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition.", + "properties": { + "axis": { + "description": "Scan axis (default 'z').", + "enum": [ + "x", + "y", + "z" + ], + "type": "string" + }, + "count": { + "description": "Number of evenly spaced slices (>= 1).", + "type": "integer" + }, + "from": { + "description": "Start position along the axis (mm).", + "type": "number" + }, + "to": { + "description": "End position along the axis (mm).", + "type": "number" + } + }, + "required": [ + "from", + "to", + "count" + ], + "type": "object" +}
- Changed
lookup_api1 field changed- added
Output schema / properties / shapeListMethodsAdded value: +{ + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
- Added
mesh_to_features - Changed
project_curve4 fields changed- changed
Input schema / properties / asEdge / descriptionPrevious value: -"Project as an open edge instead of a closed face-bound sketch. Currently deferred."New value: +"Open-wire (edge) projection. NOT IMPLEMENTED — rejected at edit time. Use a closed-curve projection (omit asEdge)." - added
Input schema / properties / commandsAdded value: +{ + "description": "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\"}]).", + "items": { + "properties": { + "kind": { + "enum": [ + "moveTo", + "lineTo", + "close" + ], + "type": "string" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "type": "array" +} - removed
Input schema / properties / curveExpressionRemoved value: -{ - "description": "JS expression returning a closed sketch (e.g. `path().moveTo(0,0).lineTo(2,0).lineTo(2,2).close().build()`). Inserted verbatim as the `curve:` field.", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "code", - "target", - "curveExpression", - "face" -]New value: +[ + "code", + "target", + "commands", + "face" +]
- Changed
render_preview3 fields changed- added
Input schema / properties / explodeAdded value: +{ + "additionalProperties": false, + "description": "Pull a multi-part assembly apart for the preview. factor ≥ 0 scales spacing by part size; mode is 'mate-axis' (default, along parent mate/joint axes) or 'radial' (away from the assembly centroid). Requires the script to return assembly.model() / solvedModel().", + "properties": { + "factor": { + "minimum": 0, + "type": "number" + }, + "mode": { + "enum": [ + "radial", + "mate-axis" + ], + "type": "string" + } + }, + "required": [ + "factor" + ], + "type": "object" +} - added
Input schema / properties / overlayAdded value: +{ + "description": "Surface-quality overlay: 'zebra' (reflection stripes), 'curvature' (Gaussian vertex colours), 'continuity' (edges coloured G2 green / G1 yellow / G0 orange / broken red). Built as coloured STL bands through this same pipeline.", + "enum": [ + "zebra", + "curvature", + "continuity" + ], + "type": "string" +} - added
Input schema / properties / sectionAdded value: +{ + "additionalProperties": false, + "description": "Cut the model with one axis-aligned section plane to inspect INTERIOR structure (wall thickness, internal pockets, whether a bore runs through) instead of only the outer shell. position is in mm along the axis (kernelCAD Z-up frame); flip keeps the +axis side (default keeps the -axis side).", + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ], + "type": "string" + }, + "flip": { + "default": false, + "type": "boolean" + }, + "position": { + "type": "number" + } + }, + "required": [ + "axis", + "position" + ], + "type": "object" +}
- Added
repair_script - Added
resolve_assumptions - Changed
review_cad10 fields changed- added
Input schema / properties / includePhysicalUseCaseJointReactionsAdded 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" +} - added
Input schema / properties / includePhysicalUseCaseJointStructureAdded 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" +} - added
Input schema / properties / includePhysicalUseCaseReachabilityAdded 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" +} - added
Input schema / properties / includePhysicalUseCaseStaticsAdded 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 / physicalUseCaseReachabilitySamplesPerMateAdded 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 / requirePhysicalUseCaseAdded value: +{ + "description": "When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.", + "type": "boolean" +} - added
Output schema / properties / interferenceSummaryAdded value: +{ + "additionalProperties": true, + "description": "Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3.", + "type": "object" +} - added
Output schema / properties / physicalUseCaseJointReactionCertificatesAdded value: +{ + "description": "Exact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm.", + "items": { + "additionalProperties": false, + "properties": { + "poses": { + "additionalProperties": true, + "type": "object" + }, + "reactions": { + "items": { + "additionalProperties": false, + "properties": { + "axialForceN": { + "type": "number" + }, + "axisMomentNmm": { + "type": "number" + }, + "axisWorld": { + "items": { + "type": "number" + }, + "type": "array" + }, + "bendingMomentNmm": { + "type": "number" + }, + "childPart": { + "type": "string" + }, + "forceWorldN": { + "items": { + "type": "number" + }, + "type": "array" + }, + "mateName": { + "type": "string" + }, + "momentWorldNmm": { + "items": { + "type": "number" + }, + "type": "array" + }, + "parentPart": { + "type": "string" + }, + "pointWorldMm": { + "items": { + "type": "number" + }, + "type": "array" + }, + "radialForceN": { + "type": "number" + }, + "resultantForceN": { + "type": "number" + }, + "resultantMomentNmm": { + "type": "number" + } + }, + "required": [ + "mateName", + "parentPart", + "childPart", + "pointWorldMm", + "axisWorld", + "forceWorldN", + "momentWorldNmm", + "resultantForceN", + "resultantMomentNmm", + "axialForceN", + "radialForceN", + "axisMomentNmm", + "bendingMomentNmm" + ], + "type": "object" + }, + "type": "array" + }, + "useCaseName": { + "type": "string" + } + }, + "required": [ + "useCaseName", + "poses", + "reactions" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / physicalUseCaseJointStructuralCertificatesAdded value: +{ + "description": "Per-joint declared-envelope and geometry/material clevis strength evidence.", + "items": { + "additionalProperties": false, + "properties": { + "joints": { + "items": { + "additionalProperties": false, + "properties": { + "envelope": { + "additionalProperties": true, + "type": "object" + }, + "mateName": { + "type": "string" + }, + "structure": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "mateName", + "envelope" + ], + "type": "object" + }, + "type": "array" + }, + "poses": { + "additionalProperties": true, + "type": "object" + }, + "useCaseName": { + "type": "string" + } + }, + "required": [ + "useCaseName", + "poses", + "joints" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / physicalUseCaseStaticCertificatesAdded value: +{ + "description": "Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
- Added
run_fea - Added
send_to_printer - Changed
solve_sketch4 fields changed- added
Output schema / properties / convergedAdded value: +{ + "description": "Whether the constraint solve converged below tolerance. ok is false when this is false.", + "type": "boolean" +} - changed
Output schema / properties / entities / descriptionPrevious value: -"Solved sketch entities."New value: +"Solved sketch entities (best-effort on a non-converging solve)." - changed
Output schema / properties / errors / descriptionPrevious value: -"Solver errors (present on failure)."New value: +"Solver/validation errors (present on failure, including non-convergence)." - added
Output schema / properties / residualAdded value: +{ + "description": "Final aggregate constraint residual when the solver ran.", + "type": "number" +}
- Added
sweep_tolerance - Changed
trace_from_image5 fields changed- added
Input schema / properties / priorsAdded value: +{ + "description": "Caller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts.", + "items": { + "properties": { + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "id": { + "type": "string" + }, + "statement": { + "type": "string" + }, + "value": {} + }, + "required": [ + "id", + "statement", + "value", + "confidence" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / scaleAnchorAdded value: +{ + "description": "Pixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`.", + "properties": { + "pixelDistance": { + "description": "Distance in pixels between the two measured points.", + "type": "number" + }, + "realDistance": { + "description": "The same distance in real-world units.", + "type": "number" + }, + "unit": { + "enum": [ + "mm", + "cm", + "in" + ], + "type": "string" + } + }, + "required": [ + "pixelDistance", + "realDistance", + "unit" + ], + "type": "object" +} - added
Input schema / properties / validateAdded value: +{ + "description": "Assumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open.", + "enum": [ + "warn", + "error" + ], + "type": "string" +} - added
Output schema / properties / ledgerAdded value: +{ + "additionalProperties": true, + "description": "Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.", + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "ok", - "features", - "imageDims", - "diagnostics" -]New value: +[ + "ok", + "features", + "imageDims", + "diagnostics", + "ledger" +]
- Changed
verify7 fields changed- changed
Input schema / properties / check / enumPrevious value: -[ - "assembly", - "urdf", - "dfm", - "dfm-preflight", - "swept-collision", - "reachable", - "mounting-holes", - "load-capacity" -]New value: +[ + "assembly", + "urdf", + "dfm", + "dfm-preflight", + "swept-collision", + "reachable", + "mounting-holes", + "load-capacity", + "static-hold" +] - changed
Input schema / properties / file / descriptionPrevious value: -"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity)."New value: +"Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold)." - added
Input schema / properties / gravityAdded value: +{ + "description": "check:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]).", + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" +} - changed
Input schema / properties / joint / descriptionPrevious value: -"check:'swept-collision' — joint to sweep; omit to sweep every declared joint."New value: +"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." - added
Input schema / properties / min_torque_margin_pctAdded value: +{ + "description": "check:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20).", + "type": "number" +} - added
Input schema / properties / poseAdded value: +{ + "description": "check:'static-hold' — explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range." +} - added
Input schema / properties / range_samplesAdded value: +{ + "description": "check:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9).", + "type": "number" +}
- Changed
why_did_this_fail6 fields changed- added
Output schema / properties / candidateReasonAdded value: +{ + "description": "Why no candidate was derivable.", + "type": "string" +} - added
Output schema / properties / candidateStatusAdded value: +{ + "description": "'no-automatic-candidate' means the region is the whole answer — no mechanical fix exists for that diagnostic kind.", + "enum": [ + "candidates", + "no-automatic-candidate" + ], + "type": "string" +} - added
Output schema / properties / candidatesAdded value: +{ + "description": "Ordered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / repairRegionAdded value: +{ + "additionalProperties": true, + "description": "Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.", + "type": "object" +} - added
Output schema / properties / targetDiagnosticIdAdded value: +{ + "description": "Id of the diagnostic the repair plan targets; pass it to repair_script.", + "type": "string" +} - added
Output schema / properties / traceAdded value: +{ + "description": "Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
open_in_studio10 fields changed- added
Input schema / properties / include_previewAdded value: +{ + "description": "Default true: render an iso PNG preview into this same tool result (reuses the server render cache when this source was already rendered). Set false to skip rasterization and return save/viewer URLs only.", + "type": "boolean" +} - added
Output schema / properties / previewBytesAdded value: +{ + "type": "number" +} - added
Output schema / properties / previewCachedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / previewDeliveredAdded value: +{ + "description": "True when this result includes a displayable PNG (image content and/or previewUrl). Only then may the agent claim a preview was shown to the user.", + "type": "boolean" +} - added
Output schema / properties / previewHeightAdded value: +{ + "type": "number" +} - added
Output schema / properties / previewHintAdded value: +{ + "type": "string" +} - added
Output schema / properties / previewStatusAdded value: +{ + "description": "included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false.", + "enum": [ + "included", + "included_inline", + "unavailable", + "skipped" + ], + "type": "string" +} - added
Output schema / properties / previewUrlAdded value: +{ + "description": "HTTPS URL of the PNG preview when storage signed successfully.", + "type": "string" +} - added
Output schema / properties / previewViewAdded value: +{ + "type": "string" +} - added
Output schema / properties / previewWidthAdded value: +{ + "type": "number" +}
3 tool updates
- Changed
get_project1 field changed- added
Output schema / properties / assetsAdded value: +{ + "additionalProperties": true, + "description": "Complementary files keyed by source-relative path.", + "type": "object" +}
- Changed
get_project_revision1 field changed- added
Output schema / properties / assetsAdded value: +{ + "additionalProperties": true, + "description": "Immutable complementary-file manifest.", + "type": "object" +}
- Changed
open_in_studio3 fields changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Complementary project files referenced by relative path from the .kcad source.", + "items": { + "additionalProperties": false, + "properties": { + "assetSha256": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "bytesBase64": { + "type": "string" + }, + "path": { + "maxLength": 240, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" +} - added
Output schema / properties / assetHashesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / attachmentCountAdded value: +{ + "minimum": 0, + "type": "integer" +}
2 tool updates
- Added
get_project_revision - Changed
open_in_studio1 field changed- added
Output schema / properties / versionAdded value: +{ + "description": "Immutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version.", + "minimum": 1, + "type": "integer" +}
1 tool update
- Changed
open_in_studio4 fields changed- changed
Input schema / properties / parameters / descriptionPrevious value: -"Optional list of the model's editable parameters, so Studio can show parameter controls."New value: +"Optional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params." - added
Input schema / properties / parameters / items / propertiesAdded value: +{ + "defaultValue": { + "description": "Current/default value of the parameter; type matches `kind`.", + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "description": { + "description": "Optional human-readable explanation of the parameter.", + "maxLength": 200, + "type": "string" + }, + "kind": { + "description": "Control type Studio should render for this parameter.", + "enum": [ + "number", + "integer", + "boolean", + "string" + ], + "type": "string" + }, + "max": { + "description": "Optional inclusive upper bound (numeric params).", + "type": "number" + }, + "min": { + "description": "Optional inclusive lower bound (numeric params).", + "type": "number" + }, + "name": { + "description": "Parameter identifier as used in the script (e.g. \"width\").", + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "step": { + "description": "Optional slider/step increment (numeric params).", + "type": "number" + }, + "unit": { + "description": "Optional unit label shown next to the control (e.g. \"mm\", \"deg\").", + "maxLength": 8, + "type": "string" + } +} - added
Input schema / properties / parameters / items / requiredAdded value: +[ + "name", + "defaultValue", + "kind" +] - added
Input schema / properties / parameters / items / typeAdded value: +"object"
6 tool updates
- Changed
add_curve3 fields changed- added
Input schema / properties / b / properties / curvature / descriptionAdded value: +"Optional second derivative; defaults to [0, 0, 0] (G1-only)." - added
Input schema / properties / b / properties / point / descriptionAdded value: +"Endpoint position in mm." - added
Input schema / properties / b / properties / tangent / descriptionAdded value: +"First derivative of the curve at this endpoint."
- Changed
add_mate1 field changed- changed
Input schema / allOfPrevious value: -[ - { - "if": { - "properties": { - "relation": { - "const": "coupling" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "driven", - "source", - "ratio" - ] - } - }, - { - "if": { - "properties": { - "relation": { - "const": "transmission" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "name", - "kind", - "sourceMate", - "drivenMates", - "path" - ] - } - }, - { - "else": { - "required": [ - "name", - "a", - "b", - "type" - ] - }, - "if": { - "properties": { - "relation": { - "enum": [ - "coupling", - "transmission" - ] - } - }, - "required": [ - "relation" - ] - }, - "then": {} - } -]New value: +[ + { + "if": { + "anyOf": [ + { + "not": { + "required": [ + "relation" + ] + } + }, + { + "properties": { + "relation": { + "const": "mate" + } + }, + "required": [ + "relation" + ] + } + ] + }, + "then": { + "required": [ + "name", + "a", + "b", + "type" + ] + } + }, + { + "if": { + "properties": { + "relation": { + "const": "coupling" + } + }, + "required": [ + "relation" + ] + }, + "then": { + "required": [ + "driven", + "source", + "ratio" + ] + } + }, + { + "if": { + "properties": { + "relation": { + "const": "transmission" + } + }, + "required": [ + "relation" + ] + }, + "then": { + "required": [ + "name", + "kind", + "sourceMate", + "drivenMates", + "path" + ] + } + } +]
- Changed
add_path_segment7 fields changed- added
Input schema / properties / a / properties / curvature / descriptionAdded value: +"Optional second derivative; defaults to [0, 0] (G1-only)." - added
Input schema / properties / a / properties / point / descriptionAdded value: +"Endpoint position in mm." - added
Input schema / properties / a / properties / tangent / descriptionAdded value: +"First derivative (~ chord length), NOT unit length." - changed
Input schema / properties / b / descriptionPrevious value: -"kind:'hermite' — end endpoint."New value: +"kind:'hermite' — end endpoint; pen ends at b.point." - added
Input schema / properties / b / properties / curvature / descriptionAdded value: +"Optional second derivative; defaults to [0, 0] (G1-only)." - added
Input schema / properties / b / properties / point / descriptionAdded value: +"Endpoint position in mm." - added
Input schema / properties / b / properties / tangent / descriptionAdded value: +"First derivative (~ chord length), NOT unit length."
- Changed
design_loop5 fields changed- changed
Input schema / properties / attempts / descriptionPrevious value: -"Ordered design attempts. Each item is { id?, title?, file? or code?, visualReview? }. File attempts can be replayed by Studio build records."New value: +"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." - added
Input schema / properties / attempts / items / anyOfAdded value: +[ + { + "required": [ + "file" + ] + }, + { + "required": [ + "code" + ] + } +] - added
Input schema / properties / attempts / items / properties / code / descriptionAdded value: +"Inline kernelCAD script source. Provide file or code." - added
Input schema / properties / attempts / items / properties / file / descriptionAdded value: +"Path to a .kcad.ts script on disk. Provide file or code." - changed
Input schema / properties / attempts / items / properties / visualReview / descriptionPrevious value: -"Evidence from the reviewing agent after rendering/opening screenshots. Accepted reviews must include screenshotPath, concrete findings, and all required checks passing."New value: +"Optional. Evidence from the reviewing agent after rendering/opening screenshots. Accepted reviews must include screenshotPath, concrete findings, and all required checks passing."
- Changed
render_preview1 field changed- changed
Input schema / properties / views / descriptionPrevious value: -"Canonical views to render (default: all four). Fewer views = faster."New value: +"Canonical views to render as an array, e.g. [\"iso\"] or [\"front\",\"top\"] (default: all four). Fewer views = faster."
- Changed
set_param3 fields changed- changed
Input schema / properties / new_value / descriptionPrevious value: -"The new default value — number for numeric params, string for expressions."New 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\")." - added
Input schema / properties / new_value / examplesAdded value: +[ + 12.5, + "width/2 + 3" +] - added
Input schema / properties / new_value / oneOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +]
1 tool update
- Changed
review_cad3 fields changed- removed
Output schema / properties / connectorWorkspace / additionalPropertiesRemoved value: -true - added
Output schema / properties / connectorWorkspace / itemsAdded value: +{ + "additionalProperties": true, + "type": "object" +} - changed
Output schema / properties / connectorWorkspace / typePrevious value: -"object"New value: +"array"
1 tool update
- Changed
open_in_studio1 field changed- added
Output schema / properties / embedUrlAdded value: +{ + "description": "Read-only, chrome-free /embed/<slug> viewer URL — drop into an <iframe> to embed the live model in any site or widget (no login).", + "type": "string" +}
59 tool updates
- Removed
add_assembly_part_source - Changed
add_connector2 fields changed- changed
Input schema / properties / origin / descriptionPrevious value: -"Origin as [x, y, z] shorthand or structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin." - added
Input schema / properties / origin / oneOfAdded 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" + } +]
- Changed
add_constraint6 fields changed- added
Input schema / properties / constraint / descriptionAdded value: +"The constraint to append." - added
Input schema / properties / constraint / propertiesAdded value: +{ + "entities": { + "description": "Ids of the entities the constraint relates.", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "type": { + "enum": [ + "COINCIDENT", + "DISTANCE", + "HORIZONTAL", + "VERTICAL", + "PARALLEL", + "PERPENDICULAR", + "EQUAL_LENGTH", + "TANGENT", + "RADIUS", + "ANGLE", + "CONCENTRIC", + "SYMMETRIC" + ], + "type": "string" + }, + "value": { + "description": "Required for DISTANCE, RADIUS, and ANGLE.", + "type": "number" + } +} - added
Input schema / properties / constraint / requiredAdded value: +[ + "id", + "type", + "entities" +] - added
Input schema / properties / constraints / descriptionAdded value: +"Existing constraint list to append to (omit for an empty list)." - added
Input schema / properties / constraints / items / propertiesAdded value: +{ + "entities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "type": { + "enum": [ + "COINCIDENT", + "DISTANCE", + "HORIZONTAL", + "VERTICAL", + "PARALLEL", + "PERPENDICULAR", + "EQUAL_LENGTH", + "TANGENT", + "RADIUS", + "ANGLE", + "CONCENTRIC", + "SYMMETRIC" + ], + "type": "string" + }, + "value": { + "type": "number" + } +} - added
Input schema / properties / constraints / items / requiredAdded value: +[ + "id", + "type", + "entities" +]
- Changed
add_curve1 field changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "kind": { + "const": "nurbs" + } + } + }, + "then": { + "required": [ + "controlPoints" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "hermite" + } + } + }, + "then": { + "required": [ + "a", + "b" + ] + } + } +]
- Removed
add_hermite_g2 - Changed
add_mate1 field changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "relation": { + "const": "coupling" + } + }, + "required": [ + "relation" + ] + }, + "then": { + "required": [ + "driven", + "source", + "ratio" + ] + } + }, + { + "if": { + "properties": { + "relation": { + "const": "transmission" + } + }, + "required": [ + "relation" + ] + }, + "then": { + "required": [ + "name", + "kind", + "sourceMate", + "drivenMates", + "path" + ] + } + }, + { + "else": { + "required": [ + "name", + "a", + "b", + "type" + ] + }, + "if": { + "properties": { + "relation": { + "enum": [ + "coupling", + "transmission" + ] + } + }, + "required": [ + "relation" + ] + }, + "then": {} + } +]
- Removed
add_mate_coupling_source - Removed
add_mate_source - Removed
add_nurbs_curve - Removed
add_nurbs_surface - Removed
add_part_connector_source - Removed
add_path_hermite_g2 - Removed
add_path_nurbs_segment - Changed
add_path_segment1 field changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "kind": { + "const": "spline" + } + } + }, + "then": { + "required": [ + "points" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "nurbs" + } + } + }, + "then": { + "required": [ + "controlPoints" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "hermite" + } + } + }, + "then": { + "required": [ + "a", + "b" + ] + } + } +]
- Removed
add_path_spline - Changed
add_pattern_feature7 fields changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "kind": { + "const": "linear" + } + } + }, + "then": { + "required": [ + "linear" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "circular" + } + } + }, + "then": { + "required": [ + "circular" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "grid" + } + } + }, + "then": { + "required": [ + "grid" + ] + } + } +] - added
Input schema / properties / grid / properties / x / descriptionAdded value: +"First grid axis." - added
Input schema / properties / grid / properties / x / propertiesAdded value: +{ + "count": { + "minimum": 2, + "type": "integer" + }, + "direction": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "spacing": { + "type": "number" + } +} - added
Input schema / properties / grid / properties / x / requiredAdded value: +[ + "count", + "direction", + "spacing" +] - added
Input schema / properties / grid / properties / y / descriptionAdded value: +"Second grid axis." - added
Input schema / properties / grid / properties / y / propertiesAdded value: +{ + "count": { + "minimum": 2, + "type": "integer" + }, + "direction": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "spacing": { + "type": "number" + } +} - added
Input schema / properties / grid / properties / y / requiredAdded value: +[ + "count", + "direction", + "spacing" +]
- Removed
add_sketch_text - Changed
add_surface2 fields changed- changed
Input schema / properties / continuity / descriptionPrevious value: -"kind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge). Default 'C0'."New value: +"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'." - added
Input schema / properties / continuity / oneOfAdded value: +[ + { + "enum": [ + "C0", + "C1", + "C2" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "C0", + "C1", + "C2" + ], + "type": "string" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + } +]
- Removed
add_surface_from_boundary - Removed
add_transmission_source - Removed
add_workspace_target_source - Removed
check_load_capacity - Removed
check_mounting_hole_consistency - Removed
check_reachable - Removed
check_swept_collision - Removed
dfm_check - Removed
dfm_preflight - Removed
emboss_text - Removed
evaluate_query - Removed
export_model - Removed
export_part - Removed
get_bend_table - Removed
get_edges_of - Removed
get_face_lineage - Removed
get_shape_info - Removed
inspect_assembly - Removed
inspect_robot - Removed
inspect_step - Removed
list_api - Removed
list_assemblies - Removed
list_constraints - Removed
list_diagnostic_codes - Removed
list_edges - Removed
list_face_labels - Removed
list_faces - Removed
list_features - Removed
list_mates - Removed
list_part_categories - Removed
list_part_families - Removed
list_part_stats - Removed
list_topology - Removed
params_list - Removed
params_update - Removed
resolve_topo_ref - Removed
set_param_value - Removed
set_scene_return_source - Changed
solve_sketch4 fields changed- added
Input schema / properties / constraints / items / propertiesAdded value: +{ + "entities": { + "description": "Ids of the entities the constraint relates.", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "type": { + "enum": [ + "COINCIDENT", + "DISTANCE", + "HORIZONTAL", + "VERTICAL", + "PARALLEL", + "PERPENDICULAR", + "EQUAL_LENGTH", + "TANGENT", + "RADIUS", + "ANGLE", + "CONCENTRIC", + "SYMMETRIC" + ], + "type": "string" + }, + "value": { + "description": "Required for DISTANCE, RADIUS, and ANGLE.", + "type": "number" + } +} - added
Input schema / properties / constraints / items / requiredAdded value: +[ + "id", + "type", + "entities" +] - added
Input schema / properties / entities / items / oneOfAdded value: +[ + { + "description": "POINT — a 2D point.", + "properties": { + "fixed": { + "description": "If true, the solver won't move this point.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "type": { + "enum": [ + "POINT" + ], + "type": "string" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "id", + "type", + "x", + "y" + ], + "type": "object" + }, + { + "description": "LINE — references two point ids.", + "properties": { + "id": { + "type": "string" + }, + "p1": { + "type": "string" + }, + "p2": { + "type": "string" + }, + "type": { + "enum": [ + "LINE" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "p1", + "p2" + ], + "type": "object" + }, + { + "description": "CIRCLE — references a center point id.", + "properties": { + "center": { + "type": "string" + }, + "id": { + "type": "string" + }, + "radius": { + "type": "number" + }, + "type": { + "enum": [ + "CIRCLE" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "center", + "radius" + ], + "type": "object" + } +] - removed
Input schema / properties / entities / items / typeRemoved value: -"object"
- Removed
validate_assembly - Removed
validate_urdf
19 tool updates
- Changed
add_connector2 fields changed- changed
Input schema / properties / origin / descriptionPrevious value: -"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand or structured ConnectorOrigin." - removed
Input schema / properties / origin / oneOfRemoved 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" - } -]
- Changed
add_constraint6 fields changed- removed
Input schema / properties / constraint / descriptionRemoved value: -"The constraint to append." - removed
Input schema / properties / constraint / propertiesRemoved value: -{ - "entities": { - "description": "Ids of the entities the constraint relates.", - "items": { - "type": "string" - }, - "type": "array" - }, - "id": { - "type": "string" - }, - "type": { - "enum": [ - "COINCIDENT", - "DISTANCE", - "HORIZONTAL", - "VERTICAL", - "PARALLEL", - "PERPENDICULAR", - "EQUAL_LENGTH", - "TANGENT", - "RADIUS", - "ANGLE", - "CONCENTRIC", - "SYMMETRIC" - ], - "type": "string" - }, - "value": { - "description": "Required for DISTANCE, RADIUS, and ANGLE.", - "type": "number" - } -} - removed
Input schema / properties / constraint / requiredRemoved value: -[ - "id", - "type", - "entities" -] - removed
Input schema / properties / constraints / descriptionRemoved value: -"Existing constraint list to append to (omit for an empty list)." - removed
Input schema / properties / constraints / items / propertiesRemoved value: -{ - "entities": { - "items": { - "type": "string" - }, - "type": "array" - }, - "id": { - "type": "string" - }, - "type": { - "enum": [ - "COINCIDENT", - "DISTANCE", - "HORIZONTAL", - "VERTICAL", - "PARALLEL", - "PERPENDICULAR", - "EQUAL_LENGTH", - "TANGENT", - "RADIUS", - "ANGLE", - "CONCENTRIC", - "SYMMETRIC" - ], - "type": "string" - }, - "value": { - "type": "number" - } -} - removed
Input schema / properties / constraints / items / requiredRemoved value: -[ - "id", - "type", - "entities" -]
- Changed
add_curve1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_hermite_g21 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_mate1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "relation": { - "const": "coupling" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "driven", - "source", - "ratio" - ] - } - }, - { - "if": { - "properties": { - "relation": { - "const": "transmission" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "name", - "kind", - "sourceMate", - "drivenMates", - "path" - ] - } - }, - { - "else": { - "required": [ - "name", - "a", - "b", - "type" - ] - }, - "if": { - "properties": { - "relation": { - "enum": [ - "coupling", - "transmission" - ] - } - }, - "required": [ - "relation" - ] - }, - "then": {} - } -]
- Changed
add_mate_coupling_source1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "relation": { - "const": "coupling" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "driven", - "source", - "ratio" - ] - } - }, - { - "if": { - "properties": { - "relation": { - "const": "transmission" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "name", - "kind", - "sourceMate", - "drivenMates", - "path" - ] - } - }, - { - "else": { - "required": [ - "name", - "a", - "b", - "type" - ] - }, - "if": { - "properties": { - "relation": { - "enum": [ - "coupling", - "transmission" - ] - } - }, - "required": [ - "relation" - ] - }, - "then": {} - } -]
- Changed
add_mate_source1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "relation": { - "const": "coupling" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "driven", - "source", - "ratio" - ] - } - }, - { - "if": { - "properties": { - "relation": { - "const": "transmission" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "name", - "kind", - "sourceMate", - "drivenMates", - "path" - ] - } - }, - { - "else": { - "required": [ - "name", - "a", - "b", - "type" - ] - }, - "if": { - "properties": { - "relation": { - "enum": [ - "coupling", - "transmission" - ] - } - }, - "required": [ - "relation" - ] - }, - "then": {} - } -]
- Changed
add_nurbs_curve1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_nurbs_surface2 fields changed- changed
Input schema / properties / continuity / descriptionPrevious value: -"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'."New value: +"kind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge). Default 'C0'." - removed
Input schema / properties / continuity / oneOfRemoved value: -[ - { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - "maxItems": 4, - "minItems": 4, - "type": "array" - } -]
- Changed
add_part_connector_source2 fields changed- changed
Input schema / properties / origin / descriptionPrevious value: -"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand or structured ConnectorOrigin." - removed
Input schema / properties / origin / oneOfRemoved 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" - } -]
- Changed
add_path_hermite_g21 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "spline" - } - } - }, - "then": { - "required": [ - "points" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_path_nurbs_segment1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "spline" - } - } - }, - "then": { - "required": [ - "points" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_path_segment1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "spline" - } - } - }, - "then": { - "required": [ - "points" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_path_spline1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "spline" - } - } - }, - "then": { - "required": [ - "points" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "nurbs" - } - } - }, - "then": { - "required": [ - "controlPoints" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "hermite" - } - } - }, - "then": { - "required": [ - "a", - "b" - ] - } - } -]
- Changed
add_pattern_feature7 fields changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "kind": { - "const": "linear" - } - } - }, - "then": { - "required": [ - "linear" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "circular" - } - } - }, - "then": { - "required": [ - "circular" - ] - } - }, - { - "if": { - "properties": { - "kind": { - "const": "grid" - } - } - }, - "then": { - "required": [ - "grid" - ] - } - } -] - removed
Input schema / properties / grid / properties / x / descriptionRemoved value: -"First grid axis." - removed
Input schema / properties / grid / properties / x / propertiesRemoved value: -{ - "count": { - "minimum": 2, - "type": "integer" - }, - "direction": { - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - }, - "spacing": { - "type": "number" - } -} - removed
Input schema / properties / grid / properties / x / requiredRemoved value: -[ - "count", - "direction", - "spacing" -] - removed
Input schema / properties / grid / properties / y / descriptionRemoved value: -"Second grid axis." - removed
Input schema / properties / grid / properties / y / propertiesRemoved value: -{ - "count": { - "minimum": 2, - "type": "integer" - }, - "direction": { - "items": { - "type": "number" - }, - "maxItems": 3, - "minItems": 3, - "type": "array" - }, - "spacing": { - "type": "number" - } -} - removed
Input schema / properties / grid / properties / y / requiredRemoved value: -[ - "count", - "direction", - "spacing" -]
- Changed
add_surface2 fields changed- changed
Input schema / properties / continuity / descriptionPrevious value: -"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'."New value: +"kind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge). Default 'C0'." - removed
Input schema / properties / continuity / oneOfRemoved value: -[ - { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - "maxItems": 4, - "minItems": 4, - "type": "array" - } -]
- Changed
add_surface_from_boundary2 fields changed- changed
Input schema / properties / continuity / descriptionPrevious value: -"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'."New value: +"kind:'boundary' — continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge). Default 'C0'." - removed
Input schema / properties / continuity / oneOfRemoved value: -[ - { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "C0", - "C1", - "C2" - ], - "type": "string" - }, - "maxItems": 4, - "minItems": 4, - "type": "array" - } -]
- Changed
add_transmission_source1 field changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "relation": { - "const": "coupling" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "driven", - "source", - "ratio" - ] - } - }, - { - "if": { - "properties": { - "relation": { - "const": "transmission" - } - }, - "required": [ - "relation" - ] - }, - "then": { - "required": [ - "name", - "kind", - "sourceMate", - "drivenMates", - "path" - ] - } - }, - { - "else": { - "required": [ - "name", - "a", - "b", - "type" - ] - }, - "if": { - "properties": { - "relation": { - "enum": [ - "coupling", - "transmission" - ] - } - }, - "required": [ - "relation" - ] - }, - "then": {} - } -]
- Changed
solve_sketch4 fields changed- removed
Input schema / properties / constraints / items / propertiesRemoved value: -{ - "entities": { - "description": "Ids of the entities the constraint relates.", - "items": { - "type": "string" - }, - "type": "array" - }, - "id": { - "type": "string" - }, - "type": { - "enum": [ - "COINCIDENT", - "DISTANCE", - "HORIZONTAL", - "VERTICAL", - "PARALLEL", - "PERPENDICULAR", - "EQUAL_LENGTH", - "TANGENT", - "RADIUS", - "ANGLE", - "CONCENTRIC", - "SYMMETRIC" - ], - "type": "string" - }, - "value": { - "description": "Required for DISTANCE, RADIUS, and ANGLE.", - "type": "number" - } -} - removed
Input schema / properties / constraints / items / requiredRemoved value: -[ - "id", - "type", - "entities" -] - removed
Input schema / properties / entities / items / oneOfRemoved value: -[ - { - "description": "POINT — a 2D point.", - "properties": { - "fixed": { - "description": "If true, the solver won't move this point.", - "type": "boolean" - }, - "id": { - "type": "string" - }, - "type": { - "enum": [ - "POINT" - ], - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "type", - "x", - "y" - ], - "type": "object" - }, - { - "description": "LINE — references two point ids.", - "properties": { - "id": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "type": { - "enum": [ - "LINE" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "p1", - "p2" - ], - "type": "object" - }, - { - "description": "CIRCLE — references a center point id.", - "properties": { - "center": { - "type": "string" - }, - "id": { - "type": "string" - }, - "radius": { - "type": "number" - }, - "type": { - "enum": [ - "CIRCLE" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "center", - "radius" - ], - "type": "object" - } -] - added
Input schema / properties / entities / items / typeAdded value: +"object"
51 tool updates
- Added
add_assembly_part_source - Added
add_hermite_g2 - Added
add_mate_coupling_source - Added
add_mate_source - Added
add_nurbs_curve - Added
add_nurbs_surface - Added
add_part_connector_source - Added
add_path_hermite_g2 - Added
add_path_nurbs_segment - Added
add_path_spline - Added
add_sketch_text - Added
add_surface_from_boundary - Added
add_transmission_source - Added
add_workspace_target_source - Added
check_load_capacity - Added
check_mounting_hole_consistency - Added
check_reachable - Added
check_swept_collision - Added
dfm_check - Added
dfm_preflight - Added
emboss_text - Added
evaluate_query - Added
export_model - Added
export_part - Added
get_bend_table - Added
get_edges_of - Added
get_face_lineage - Added
get_shape_info - Added
inspect_assembly - Added
inspect_robot - Added
inspect_step - Added
list_api - Added
list_assemblies - Added
list_constraints - Added
list_diagnostic_codes - Added
list_edges - Added
list_face_labels - Added
list_faces - Added
list_features - Added
list_mates - Added
list_part_categories - Added
list_part_families - Added
list_part_stats - Added
list_topology - Added
params_list - Added
params_update - Added
resolve_topo_ref - Added
set_param_value - Added
set_scene_return_source - Added
validate_assembly - Added
validate_urdf
1 tool update
- Added
trace_from_image
3 tool updates
- Changed
get_latest_render12 fields changed- added
Input schema / properties / paths_onlyAdded value: +{ + "description": "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).", + "type": "boolean" +} - added
Input schema / properties / viewAdded value: +{ + "description": "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.", + "enum": [ + "all", + "iso", + "front", + "back", + "left", + "right", + "top" + ], + "type": "string" +} - added
Output schema / properties / bytesAdded value: +{ + "description": "PNG byte length (when ok).", + "type": "number" +} - removed
Output schema / properties / capturedAtRemoved value: -{ - "description": "ISO timestamp the render was captured (when ok).", - "type": "string" -} - changed
Output schema / properties / error / descriptionPrevious value: -"Error code when ok is false (e.g. \"no_render\")."New value: +"Error code when ok is false (e.g. \"empty_geometry\", \"mesh_failed\")." - added
Output schema / properties / heightAdded value: +{ + "description": "Rendered image edge in px (when ok).", + "type": "number" +} - added
Output schema / properties / image_b64Added value: +{ + "description": "Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.", + "type": "string" +} - changed
Output schema / properties / ok / descriptionPrevious value: -"Whether a render was found."New value: +"Whether a render was produced." - added
Output schema / properties / truncatedAdded value: +{ + "description": "Set when inline was requested but the PNG exceeded the size cap.", + "type": "boolean" +} - removed
Output schema / properties / urlRemoved value: -{ - "description": "Signed URL for the latest rendered PNG (when ok).", - "type": "string" -} - added
Output schema / properties / viewAdded value: +{ + "description": "The view that was rendered (when ok).", + "type": "string" +} - added
Output schema / properties / widthAdded value: +{ + "description": "Rendered image edge in px (when ok).", + "type": "number" +}
- Added
get_model_mesh - Removed
trace_from_image
Related MCP Connectors
- OwlCADOAuthcom.owlcad
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
Design domain models and generate deterministic multi-stack code, driven by your coding agent.
Bitbybit 3D parametric CAD API, version-exact, for coding agents: search, describe, examples, guide
DXF and PDF/X-4 for AI agents: structured facts, PNG renders, an interactive in-chat viewer.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and software to create, edit, inspect, validate, and export CAD geometry through MCP using backend-neutral typed operations, with FreeCAD/OpenCascade as the authoritative B-rep backend and JSCAD preview.1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to write TypeScript to create, render, verify, and export parametric 3D models using Replicad/OpenCascade CAD kernel, headlessly from terminal or MCP clients.5MIT
- AlicenseNot gradedqualityBmaintenanceEnables agent-assisted CAD engineering, allowing users to create, validate, and export CAD designs through natural language, with a deterministic engine that has zero LLM runtime dependency.Academic Free v1.1
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to convert natural language engineering prompts into editable parametric CAD models with deterministic parsing, validation, and edit support.6Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.