Skip to main content
Glama

Server Details

Agent-first CAD: editable .kcad.ts source, deterministic review, OpenCASCADE kernel.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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

A3.7/5.0

Scored across 54 tools

Disambiguation2/5

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.

Naming Consistency3/5

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.

Tool Count2/5

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.

Completeness4/5

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 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNoOptional [x, y, z] axis.
codeYesThe .kcad.ts source code.
nameYesConnector name unique within the part.
typeYes
normalNoOptional [x, y, z] normal.
originYesOrigin as [x, y, z] shorthand, or a structured ConnectorOrigin.
part_bindingYesJS identifier bound to an AssemblyPartRef, e.g. "basePart".

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
constraintYesThe constraint to append.
constraintsNoExisting constraint list to append to (omit for an empty list).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorsNoValidation errors (present on failure).
constraintsYesUpdated constraint list.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. Pass controlPoints as a Vec3[] (mm, at least 2 points). Optional NURBS knobs: degree (default 3), rational weights, explicit knots, 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 via add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNokind:'hermite' — start endpoint.
bNokind:'hermite' — end endpoint.
codeYesThe .kcad.ts source code.
kindYesWhich curve-construction path to use.
knotsNokind:'nurbs' — optional explicit knot vector; missing => clamped-uniform inferred.
closedNokind:'nurbs' — optional periodic/closed-curve flag.
degreeNokind:'nurbs' — curve degree; default 3 (cubic).
weightsNokind:'nurbs' — optional rational weights, one per control point (same length as controlPoints).
binding_nameNoJS const name for the new Curve3D binding (default: _curve_<N>).
controlPointsNokind:'nurbs' — control points as Vec3 triples in mm; at least 2 entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
feature_codeYesSingle-statement source line to insert (e.g. `const hole = cylinder(5, 2).translate(10, 10, -1);`).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 relation are forwarded verbatim; each relation fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNorelation:'mate' — connector ref "<partName>.<connectorName>".
bNorelation:'mate' — connector ref "<partName>.<connectorName>".
codeYesThe .kcad.ts source code.
kindNorelation:'transmission' — transmission kind.
nameNorelation:'mate'|'transmission' — name unique within the assembly.
pathNorelation:'transmission' — drive path.
poseNorelation:'mate' — optional mate pose.
typeNorelation:'mate' — mate type.
inputNorelation:'transmission' — optional input.
notesNorelation:'transmission' — optional notes.
ratioNorelation:'coupling' — driven pose = source pose * ratio + offset.
drivenNorelation:'coupling' — driven mate name.
offsetNorelation:'coupling' — optional pose offset.
outputNorelation:'transmission' — optional output.
sourceNorelation:'coupling' — source mate name.
actuatorNorelation:'transmission' — optional actuator.
limitsMmNorelation:'mate' — optional [minMm, maxMm].
relationNoWhich relationship to author (default 'mate').
limitsDegNorelation:'mate' — optional [minDeg, maxDeg].
sourceMateNorelation:'transmission' — source mate name.
drivenMatesNorelation:'transmission' — driven mate names.
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoOptional [x, y, z] assembly placement.
codeYesThe .kcad.ts source code.
part_nameYesAssembly-unique part name.
binding_nameNoOptional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier.
assembly_bindingYesJS identifier bound to assembly(...), e.g. "arm".
shape_expressionYesJS expression for the Shape to pass to assembly.part, inserted verbatim.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 every points waypoint (Vec2[] mm, >= 2 entries; points[0] must match current pen position). Optional tension, and startTangent/endTangent 2D 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]). Optional degree (default 3), rational weights (strictly positive), explicit knots (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). curvature defaults 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
aNokind:'hermite' — start endpoint; point must match current pen position within 1e-6 mm.
bNokind:'hermite' — end endpoint; pen ends at b.point.
codeYesThe .kcad.ts source code.
kindYesWhich path-segment kind to append.
knotsNokind:'nurbs' — optional explicit knot vector; length must equal controlPoints.length + degree + 1.
degreeNokind:'nurbs' — B-spline degree (default 3).
pointsNokind:'spline' — waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position.
tensionNokind:'spline' — optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation.
weightsNokind:'nurbs' — optional rational weights (one per control point; strictly positive).
endTangentNokind:'spline' — optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters.
binding_nameNoReserved for future use; the segment injection mutates the chain anchor in place.
chain_anchorYesJS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`).
startTangentNokind:'spline' — optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters.
controlPointsNokind:'nurbs' — control-net vertices as Vec2 pairs in mm; at least degree+1 entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
gridNoRequired when kind=grid.
kindYes
linearNoRequired when kind=linear.
targetYesVariable name of the Shape to pattern (inserted verbatim as the LHS receiver).
circularNoRequired when kind=circular.
assign_toNoOptional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. Pass surface_binding (the Surface variable name), by_binding (the cutter Surface variable name; Shape/Curve3D cutters are deferred to a later slice), and op: 'trim' (keep the largest imprinted piece) or op: 'split' (return both halves as a [Surface, Surface] tuple).

  • 'sew' — insert a sew([s0, s1, ...], opts?) call to stitch N surfaces into a closed watertight solid via OCCT BRepBuilderAPI_Sewing. Pass surface_bindings (array of Surface variable names). Use after trim/boundary to close patches into a solid: trim → sew → solid pipeline. Optional tolerance (mm, default 1e-6) and require_closed (emits feature.surface-sew.open-shell if result is not watertight).

  • 'draft' — insert a <shape>.draft(angleDeg, { face, neutralPlane?, pullDir? }) call to taper the selected face(s) for mold release. Pass shape_binding, angle_deg (0–90), and face (canonical name, label, or FaceQuery descriptor). Lowering emits feature.draft.failed on invalid geometry. The returned Surface produces no Shape until you 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNokind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).
codeYesCurrent .kcad.ts source.
faceNokind:'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.
kindYesWhich surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'.
knotsNokind:'nurbs' — optional explicit knot vectors; missing => clamped uniform inferred.
degreeNokind:'nurbs' — degrees in U and V; each in [1, nU-1] / [1, nV-1].
weightsNokind:'nurbs' — optional rational weights, same grid shape as controls. Ignored in slice-1.
controlsNokind:'nurbs' — control-point grid for direct construction (controls[u][v] = [x, y, z], mm).
periodicNokind:'nurbs' — optional periodic flags per parametric direction.
pull_dirNokind:'draft' — demoulding direction as [x, y, z]. Defaults to the face normal at lower time.
samplingNokind:'boundary' — OCCT NbPtsOnCur sampling parameter (default 15).
angle_degNokind:'draft' — draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction.
toleranceNokind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged.
by_bindingNokind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.
continuityNokind:'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_nameNoJS 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_planeNokind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.
shape_bindingNokind:'draft' — JS variable name of the Shape to taper (must be declared in source).
curve_bindingsNokind:'boundary' — tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source.
require_closedNokind:'sew' — when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid.
surface_bindingNokind:'trim' — JS variable name of the Surface to trim/split (must be declared in source).
surface_bindingsNokind:'sew' — JS variable names of the surfaces to stitch into a solid (each must be declared in source).
section_sketch_idsNokind:'nurbs' — existing sketch FeatureIds (2 or more) to skin a surface through, in order.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 Shape target. Use for engraved brand text on faces (Ray-Ban temple, CE mark, model number). depth > 0 raises text out of the face; depth < 0 engraves 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
faceNomode:'emboss' — target face — canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label.
fontNomode:'sketch' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
modeYesWhich text-authoring path to use.
sizeNomode:'sketch'|'emboss' — glyph cap height in mm (positive finite).
alignNomode:'sketch' — horizontal alignment relative to position (default left); mode:'emboss' — relative to the UV anchor (default center).
depthNomode:'emboss' — signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero.
bindAsNomode:'sketch' — emits `const <bindAs> = sketch.text(...)`; mode:'emboss' — emits `const <bindAs> = <target>.embossText(...);`.
targetNomode:'emboss' — variable name of the Shape to chain onto (inserted verbatim).
anchorUNomode:'emboss' — U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5.
anchorVNomode:'emboss' — V anchor in [0, 1] face-local. Default 0.5.
contentNomode:'sketch' — text content (UTF-8, non-empty, non-whitespace).
positionNomode:'sketch' — [x, y] anchor in mm. Default [0, 0].
rotationNomode:'sketch' — CCW rotation in degrees around position (default 0); mode:'emboss' — CCW rotation in the face tangent plane (default 0).
scaleModeNomode:'emboss' — Drawing.sketchOnFace scaling mode. Default original.
fontFamilyNomode:'emboss' — optional logical font name or .ttf file path; defaults to bundled Liberation Sans.
textContentNomode:'emboss' — text content (UTF-8, non-empty, non-whitespace).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
closedNoOptional closed-sweep flag.
sectionsYesVarying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1.
continuityNoInter-section continuity; default 'C1'.
binding_nameNoJS const name for the new Shape binding (default: _sweep_<N>).
spine_bindingYesExisting variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
reachableYesWorld-frame Vec3 targets the connector must be able to reach.
toleranceMmNoOptional non-negative tolerance in mm.
connector_refYesConnector ref "<partName>.<connectorName>".
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoOverride the animationView record's fps.
fileYesPath to a .kcad.ts script with an animationView({...}) record. Required (no inline { code } mode).
hideNoHide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification.
focusNoShow only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification.
no_verifyNoSkip the animation-pose interference verification (default: verify on).
frames_dirNoPNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path.
output_pathNoMP4 output path; default <scriptDir>/<basename>-animation.mp4. Mutually exclusive with frames_dir.
verify_everyNoAdditionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
fpsNo
errorNo
verifiedNoWhether pose-interference verification passed.
errorCodeNo
errorHintNo
collisionsNoColliding poses { t_ms, a, b, volume_mm3 }.
diagnosticsYes
duration_msNo
frame_countNo
output_pathNoWritten MP4 path (MP4 mode).
failure_kindNo
verify_skippedNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYesOriginal user design goal. Fed into every review_cad repair prompt.
assemblyNo
attemptsYesOrdered 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.
epsilonMm3NoForwarded to review_cad.
stopOnPassNoStop after the first attempt that is functional and passes the quality gate. Default true.
recordTitleNoOptional title for the build record.
combinatorialNoSample 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.
samplesPerMateNoPose-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.
gripperApertureNoOptional gripper aperture request forwarded to review_cad.
trackConnectorsNoConnector refs to track across sampled poses.
outputRecordPathNoOptional JSON path to write a Studio-compatible build record.
preserveInterfacesNoExternal mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts.
allowReviewWarningsNoWarning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok.
includeInterferenceNoForwarded to review_cad. Default true.
includePoseEnvelopeNoForwarded to review_cad. Default true.
requireVisualReviewNoRequire screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks.
requirePhysicalAcceptanceNoRequire 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

ParametersJSON Schema
NameRequiredDescription
okYes
goalYesEchoed design goal.
recordNoStudio-compatible build record (when requested).
attemptsYesPer-attempt review results.
recordUrlNo
finalAttemptIdNo
nextActionPromptNo
outputRecordPathNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 GeometryA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoRevised script — inline source. Mutually exclusive with params.
fileNoRevised script — path to a .kcad.ts file. Mutually exclusive with params.
paramsNoParam-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.
renderNoAlso 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_dirNoDirectory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir.
baseCodeNoBaseline script — inline source.
baseFileNoBaseline script — path to a .kcad.ts file.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
baseNoBaseline summary { featureCount, bodyCount, isAssembly } (success).
sideNoWhich side failed ('base' | 'revised') (failure).
errorNoFailure message (failure).
bodiesNoPer matched body, the material-level delta (success).
renderNoOverlay result when render: true — { ok, images, out_dir, script_path, error? }.
revisedNoRevision summary { featureCount, bodyCount, isAssembly } (success).
summaryNoVerdict counts plus totalAddedMm3 / totalRemovedMm3 / maxDeviationMm.
errorCodeNo
unmatchedNoBodies present on only one side; each also raises diff.body.unmatched.
diagnosticsNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScriptsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoRevised script — inline source.
fileNoRevised script — path to a .kcad.ts file.
baseCodeNoBaseline script — inline source.
baseFileNoBaseline script — path to a .kcad.ts file.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
baseNoBaseline summary { featureCount, partCount, isAssembly } (success).
sideNoWhich side failed ('base' | 'revised') (failure).
errorNoFailure message (failure).
matesNoMate-graph changes (success).
partsNoPer-part added/removed/renamed/changed/unchanged (success).
paramsNoParam value/min/max changes (success).
revisedNoRevision summary { featureCount, partCount, isAssembly } (success).
errorCodeNo
diagnosticsNo
interferenceNoTotal interference-volume delta + per-pair detail (success).
deeperDiffAvailableNoPresent 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoWrite the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json.
pageNo1-based page to read. Default 1.
pathNoPath to the drawing PDF on the machine running kernelCAD.
verifyNoEvaluate the rebuilt part and compare it with the drawing. Default true.
pdfBase64NoThe PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server.
projectionNoOverride the projection angle read from the sheet (default: projection symbol or note, else third-angle).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pageNo
sheetNo{ widthMm, heightMm, scale: { text, sheetPerModel, source }, units, projection } read off the sheet.
viewsYesIdentified orthographic views: { name, bboxMm, identifiedBy, label? }.
ledgerYesAssumption ledger: { facts, unresolvedCount }; facts are visible / inferred / assumed / missing, disagreements recorded on the fact.
paramsYesRole-named params declared by the script: { name, value, description }.
scriptNoThe emitted .kcad.ts source.
fidelityNo{ verdict: match | partial | mismatch | failed, extents, holes, silhouettes, reasons } from evaluating and re-projecting the script.
pageCountNo
ledgerPathNoWhere the ledger was written (when `out` was given); pass it to resolve_assumptions.
scriptPathNoWhere the script was written (when `out` was given).
diagnosticsYes
reconstructionNo{ kind: extrude | revolve, profileView, axis, holeCount, extents }.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScriptA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
dryRunNoFast validation only: skip OCCT lowering, DFM gates, and meshing. Does not set or clear the active session.
skipMechanismCheckNoOpt 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the script compiled and lowered cleanly.
partsNoAssembly parts summary { count, names } when the scene is assembly-built.
dryRunNoTrue when the result came from a fast dry run.
mechanismNoMechanism-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.
diagnosticsYes
featureCountYesNumber of features captured by the script.
featureHealthNoPer-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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SDFA
Read-only
Inspect

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] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
pointYesSample point [x, y, z] in mm.
fieldNameYessdf.bind binding name holding the SdfField.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
aabbNoAxis-aligned bounding box of the field (success).
hintNo
kindNoSDF field kind (success).
errorNo
insideNoWhether the point is inside the surface (success).
distanceNoSigned distance in mm; negative = inside (success).
errorCodeNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 target are forwarded verbatim; each target fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
partNotarget:'part' — part name for single-part export, or 'all'.
formatNotarget:'model' — output file format (required for that target).
targetYesWhich exporter to run: 'model' (whole-script geometry to one file) or 'part' (per-part STLs from a solved assembly).
optionsNotarget:'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_verifyNoSkip the STL watertight verify gate.
feature_idNotarget:'model' — optional FeatureId to export; defaults to last.
output_dirNotarget:'part' — destination directory (all-parts mode); files are <dir>/<part>.stl.
output_pathNoDestination path. target:'model' — the export file (required). target:'part' — single-part .stl path.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
formatNo
writtenNotarget:'part' — per-part export records.
byte_countNotarget:'model' — file size in bytes.
mesh_filesNoPer-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo, meshes/<part>.usda mesh layers for usd-isaac.
diagnosticsNo
output_pathNotarget:'model' — written file path.
feature_countNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SummaryA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_dirNoDirectory a previous run_fea wrote to; omit for toolchain status + material table only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
summaryNoStored summary of a previous run_fea in output_dir, when present.
errorCodeNo
materialsYesNamed grade -> { E (MPa), nu, yield (MPa) }.
toolchainYes{ available, ccx?, gmshVersion?, missing[], hint? } — whether a study can run here and how to fix it if not.
material_namesYesAccepted material grade names.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PartA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
queryNo
familyNo
categoryNo
standardNo
partsBaseUrlNoOpt-in remote endpoint; no default value ships with kernelCAD.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
recordNoResolved part record (success).
sha256NoSHA-256 fingerprint of the STEP file (success).
sourceNoWhere the part came from ('local' | 'remote') (success).
cachePathNoLocal cache path of the written STEP file (success).
errorCodeNo
errorHintNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PartA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
queryNo
familyNo
sourceNo
categoryNo
standardNo
partsBaseUrlNoOpt-in remote endpoint; no default value ships with kernelCAD.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
sourceNoWhere results came from ('local' | 'remote') (success).
resultsNoMatching part records (success).
errorCodeNo
errorHintNo
totalMatchesNoTotal matches before limiting (success).
remoteEnabledNoWhether the remote tier was queried (success).

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PatternA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
fileNo
featureIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
regionNoUnfolded flat-pattern Region (outer polyline + holes + bend lines + plane).
diagnosticsYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RenderA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject 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.
viewNoView 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_onlyNoControls 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

ParametersJSON Schema
NameRequiredDescription
okNoWhether a render was produced.
hintNoNext-action hint when ok is false.
viewNoThe view that was rendered (when ok).
bytesNoPNG byte length (when ok).
errorNoError code when ok is false (e.g. "empty_geometry", "mesh_failed").
widthNoRendered image edge in px (when ok).
heightNoRendered image edge in px (when ok).
image_b64NoBase64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.
truncatedNoSet when inline was requested but the PNG exceeded the size cap.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MeshA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject slug from open_in_studio/get_project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProjectA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoThe project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoWhether the read succeeded.
urlNoFetch mode: revision-pinned /p/<slug>?version= link.
codeNoFetch mode: the full .kcad source.
slugNoFetch mode: the project slug.
titleNoFetch mode: the project title.
assetsNoComplementary files keyed by source-relative path.
meshUrlNoFetch 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).
privacyNoFetch mode: the project privacy.
versionNoFetch mode: the project version.
embedUrlNoFetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).
projectsNoList mode (no slug): the user's saved projects.
meshErrorNoFetch mode: sanitized repair/persist error when meshStatus is failed.
meshStatusNoFetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).
parametersNoFetch mode: the model's editable parameters.
updated_atNoFetch mode: last-updated timestamp.
serverBuildNoDeploy identity (package+git SHA@boot time) so connector lag is observable.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RevisionA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesProject slug returned by open_in_studio.
versionYesPositive immutable revision version returned by open_in_studio.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the revision was found and readable.
codeYesExact .kcad source captured at this revision.
slugYesProject slug.
assetsNoImmutable complementary-file manifest.
versionYesImmutable revision version.
parametersYesExact editable parameters captured at this revision.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ModelA
Read-only
Inspect

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? } }). stack scans evenly spaced slices and returns minAreaIndex/minAreaPosition — use it to find the neck/thinnest cross-section along an axis.

  • 'continuity' — G0/G1/G2 classification of shared edges ({ feature_id?, edges? }); position gap, normal jump, curvature difference, worst-sample XYZ.

  • 'curvature' — per-face Gaussian and mean curvature min/max/mean, inflections, spikes ({ feature_id?, faces?, spike_factor? }). All params except of are subject-specific and forwarded verbatim. Most subjects accept { file | code }.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoof:'section' — single slice position along `axis` (mm).
ofYesWhich facts to read.
axisNoof:'section' — normal axis for `at` / `stack` (default 'z').
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
edgesNoof:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled.
facesNoof:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled.
planeNoof:'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`.
queryNoof:'edges'|'faces' — optional EdgeQuery/FaceQuery filter.
stackNoof:'section' — dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition.
densityNoof:'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.
assemblyNoof:'assembly'|'robot'|'bom' — assembly name; defaults to the first captured assembly.
categoryNoof:'part-families' — optional top-level category to filter families by.
face_nameNoof:'face-edges' — canonical face name (required for that subject).
feature_idNoof:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' — FeatureId; defaults to the last returned shape.
spike_factorNoof:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6).
gyration_axisNoof:'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

ParametersJSON Schema
NameRequiredDescription
okNoWhether the read succeeded.
errorNoFailure message (present on failure).
errorCodeNo

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 APIA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
globalsNo
constraintsNo
sceneMethodsNo
shapeMethodsNo
edgeQueryKeysNo
faceQueryKeysNo
sketchMethodsNo
curve3dMethodsNo
surfaceMethodsNo
paramRefMethodsNo
shapeListMethodsNo
pathBuilderMethodsNo
scenePartPropertiesNo
featureKindFaceLabelsNo
curve3dAnalyticsMethodsNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 SkillA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
uriNoThe authoring-skill resource URI.
textNoThe SKILL.md body.
mimeTypeNoMIME type of the returned body.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CookbookA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoMax snippets to return. Default 3, max 5.
queryYesNatural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket").

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
hitsNoTop-k matching cookbook snippets, ranked by BM25.
errorNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DiagnosticsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
codesYesThe diagnostic-code catalogue with hint templates.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 GeometryA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNoOptional map of parameter-name → numeric value, applied as overrides before meshing (stateless slider recompute).
sourceYesThe .kcad.ts script source to mesh.
fileNameNoOptional file-name label used in diagnostics (does not affect geometry).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoTrue when every feature meshed successfully.
boundsNoOverall model bounding box.
featuresNoPer-feature summary — never includes raw mesh arrays.
diagnosticsNoKernel diagnostics, if any.
featureCountNoNumber of features in the meshed model.
failedFeatureIdsNoFeature ids that failed to compile (empty when ok).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MeshA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoWrite the emitted script to this .kcad.ts path and the assumption ledger to the sibling .ledger.json.
dataNoMesh bytes as base64 — use when the server cannot see your filesystem.
fileNoPath to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required.
formatNoFormat override; default from the extension or the content.
minIoUNoVolume IoU a faithful verdict requires. Default 0.98.
maxPassesNoRefinement passes, 1–4. Default 4; stops early at the first faithful pass.
maxTrianglesNoRefuse meshes above this triangle count instead of stalling. Default 300000.
maxDeviationMmNoMax surface deviation (mm) a faithful verdict allows. Default max(0.25, 0.1 % of the bbox diagonal).
weldToleranceMmNoVertex weld distance in mm. Default max(1e-4, 1e-6 × bbox diagonal).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
meshNoClean-up and watertightness report for the input mesh.
errorNoFailure message (failure).
ledgerNoAssumptionLedger { facts, unresolvedCount }; dimension fact ids equal the param names (success).
passesNoPer-pass tolerances and measured fidelity.
scriptNoThe emitted, evaluable .kcad.ts source (success).
writtenNo{ script, ledger } paths when out was given.
featuresNoBody kind, hole groups, cutouts, boolean remainders, params (success).
fidelityNoMeasured fidelity of the returned script (success).
errorCodeNo
diagnosticsNo
notRepresentedNo
unmatchedRegionsNoSurface regions no emitted feature represents: { kind, reason, areaMm2, triangleCount, centroid, bbox }.
reconstructedHolesNoHoles the B-rep hole detector finds on the reconstruction.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe 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.
slugNoSlug 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.
titleNoOptional human-readable title for the model (shown in Studio). Defaults to "Model from Claude".
parametersNoOptional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params.
attachmentsNoComplementary project files referenced by relative path from the .kcad source.
include_previewNoDefault 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

ParametersJSON Schema
NameRequiredDescription
okNoWhether publish succeeded. Under CDN mode, false when mesh persist hard-failed (meshStatus:failed) — never ok:true with meshUrl silently omitted.
urlNoThe /p/<slug> Studio link for the model.
slugNoThe project slug; pass it back to update this project in place.
meshUrlNoRevision-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).
updatedNoTrue when an existing project was updated; false when a new one was created.
versionNoImmutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version.
embedUrlNoRead-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.
meshErrorNoSanitized persist/repair error when meshStatus is failed.
meshStatusNoready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).
previewUrlNoHTTPS URL of the PNG preview when storage signed successfully.
assetHashesNo
previewHintNo
previewViewNo
serverBuildNoDeploy identity so connector vs server mismatch is observable.
previewBytesNo
previewWidthNo
previewCachedNo
previewHeightNo
previewStatusNoincluded = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false.
attachmentCountNo
previewDeliveredNoTrue 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
faceYesTarget face — canonical name or label.
asEdgeNoOpen-wire (edge) projection. NOT IMPLEMENTED — rejected at edit time. Use a closed-curve projection (omit asEdge).
bindAsNoOptional local variable name; emits `const <bindAs> = <target>.projectCurve(...);`.
targetYesVariable name of the Shape to chain onto.
commandsYesClosed 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"}]).
scaleModeNoDrawing.sketchOnFace scaling mode. Default original.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 GeometryA
Read-only
Inspect

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 mode are forwarded verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNomode:'resolve'|'lineage' — topology ref string.
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
modeNoResolution mode (default 'evaluate').
queryNomode:'evaluate' — Query input: @kc[...] / @kcq[...] string or { ast } object.
expectNomode:'evaluate' — 'unique' asserts exactly-one.
feature_idNoOptional FeatureId; defaults to the last lowered shape (use "auto" for lineage).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
refNomode:'resolve' — the resolved ref string.
chainNomode:'lineage' — HistoryMap walk.
errorNo
queryNomode:'evaluate' — the resolved Query ({ ast }).
entityNomode:'resolve' — the single matched entity.
entitiesNomode:'evaluate' — matched entities.
warningsNo
errorCodeNo
candidatesNomode:'resolve' — near-miss candidates (failure).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FeatureA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
matchYesA substring that uniquely identifies the line to remove (e.g. `const hole = cylinder(5,`).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A3.6/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source. Mutually exclusive with file. Relative imports resolve against a temp dir — use file for scripts with relative lib.fromSTEP(...) imports.
fileNoPath to a .kcad.ts script on disk. Mutually exclusive with code.
hideNoHide matching feature ids / assembly part names. Mutually exclusive with focus.
poseNoExtra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'.
focusNoShow only matching feature ids / assembly part names. Mutually exclusive with hide.
viewsNoCanonical views to render as an array, e.g. ["iso"] or ["front","top"] (default: all four). Fewer views = faster.
widthNoPer-view tile width in px (default 768).
heightNoPer-view tile height in px (default 768).
explodeNoPull 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_dirNoDirectory for the PNGs (created if missing). Default: a fresh temp session dir.
overlayNoSurface-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.
sectionNoCut 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_urlNoAdvanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player.
environmentNoHDRI environment override: preset ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse'), a URL, or 'none' for the default three-light rig.
no_watermarkNoSuppress the kernelCAD version watermark.
no_mechanism_checkNoSkip the mechanism-truth probe for fast iteration on large assemblies; the preview reports mechanism: 'unverified'. Ignored under KERNELCAD_RENDER_STRICT=1.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the preview rendered.
errorNo
boundsNoModel AABB in mm { min, max } the camera was fit to (success).
imagesYesRendered tiles { name, path, description } — absolute local PNG paths with per-view camera orientation (kernelCAD is Z-up).
out_dirNoDirectory holding the PNGs (session temp dir unless out_dir was given).
errorCodeNo
errorHintNo
mechanismNoMechanism-truth verdict: 'real' | 'broken' | 'unverified'.
render_msNoWall-clock render time in ms (provisioning + browser + captures).
diagnosticsYes
render_sourceNoLane that served the render: 'static-player' | 'dev-server' | 'explicit'.
mechanism_failure_codesNoDe-duplicated failure codes when mechanism is 'broken'.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
strategyNo'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.
diagnosticNoDiagnostic id from why_did_this_fail's `targetDiagnosticId` / `candidates[].diagnosticId`, or 'first-error' (default) for the first error-severity diagnostic.
max_attemptsNoUpper bound on candidates attempted (default 3). Ignored by apply-first and dry-run.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether a candidate cleared the target diagnostic without new errors.
diffNoUnified diff of the accepted patch (dry run: every candidate patch).
afterNoPost-repair { ok, featureHealth, diagnostics }.
errorNo
beforeNoPre-repair { ok, featureHealth, diagnostics }.
targetNoThe diagnostic this run targeted { id, code, featureId?, message }.
appliedNoCandidate id that was accepted.
attemptsYesPer-candidate outcome { candidateId, applied, ok?, clearedDiagnostic?, newErrorCodes?, accepted, diagnostic? }.
new_codeNoRepaired .kcad.ts source (present when a patch applied). Caller persists it.
strategyYes
errorCodeNo
candidatesYes
diagnosticsNotool.repair.* diagnostics when repair could not complete.
repairRegionNoThe line ranges the repair was bound to.
candidateReasonNo
candidateStatusNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ledgerPathYesPath to the `<model>.ledger.json` file persisted alongside the traced source.
resolutionsYesOne resolution per ledger fact id to act on.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
ledgerNoThe ledger after applying resolutions (present on success).
diagnosticsYes
paramOverridesYesfactId -> value for every resolved fact with a value; feed into set_param.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ModelA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
assemblyNoAssembly name; defaults to the first captured assembly.
designGoalNoOriginal user design prompt or goal. Included in suggestedRepairPrompt so topology-redesign repairs restart from the intended physical design instead of local coordinate nudges.
epsilonMm3NoInterference volume threshold in mm^3. Default 0.01.
combinatorialNoSample 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.
samplesPerMateNoPose-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.
gripperApertureNoOptional fingertip connector refs for gripper aperture travel reporting.
trackConnectorsNoOptional connector refs such as ["gripper-plate.tool-tip"] to limit connector workspace reporting.
preserveInterfacesNoExternal mates, connector refs, part names, or behavioral interfaces the repair agent must preserve during redesign.
includeInterferenceNoWhether sampled poses run BREP interference checks. Default true.
includePoseEnvelopeNoWhether to sample declared mate limits. Default true.
requirePhysicalUseCaseNoWhen true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.
includePhysicalUseCaseStaticsNoRun 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.
includePhysicalUseCaseReachabilityNoRun 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.
includePhysicalUseCaseJointReactionsNoDerive 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.
includePhysicalUseCaseJointStructureNoRun 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.
physicalUseCaseReachabilitySamplesPerMateNoSamples 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

ParametersJSON Schema
NameRequiredDescription
okYes
fitnessNoMechanism fitness verdict incl. repairMode.
assemblyNo
mechanismNo
validatorNoAssembly/mate-graph validator result.
diagnosticsYes
featureCountYes
poseEnvelopeNoSampled mate-limit pose envelope.
repairContextNo
gripperApertureNo
mechanismFailuresNo
connectorWorkspaceNoConnector workspace bounds.
interferenceSummaryNoClassified interference counts and pairs: raw, contact-noise, actionable, and capMm3.
rawInterferencePairsNo
suggestedRepairPromptNoStructured repair prompt (failure / repair path).
physicalUseCaseStaticCertificatesNoVerified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.
physicalUseCaseJointReactionCertificatesNoExact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm.
physicalUseCaseJointStructuralCertificatesNoPer-joint declared-envelope and geometry/material clevis strength evidence.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FeedbackA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoProject 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_onlyNoControls 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_secNoMaximum 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source (mutually exclusive with file).
fileNoPath to a .kcad.ts script declaring at least one feaStudy.
studyNoName of the study to run; defaults to the last declared one.
heatmapsNoRender stress heatmap PNGs (default true).
mesh_sizeNoTarget element size in mm, overriding the study for this run.
output_dirNoDirectory for the solver deck, results, summary JSON and heatmap PNGs.
mesh_timeout_msNoWall-clock budget for meshing (default 120000).
solve_timeout_msNoWall-clock budget for the solve (default 300000).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesFalse when the study violated its declared minSafetyFactor, a selector did not resolve, or the solver toolchain is missing.
errorNo
imagesNoAbsolute PNG paths of the rendered stress heatmap.
legendNoHeatmap colour bands { color, fromMPa, toMPa } — the scale the PNGs are drawn on.
out_dirNoDirectory holding the summary JSON, solver deck and heatmap PNGs.
summaryNoSolved 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.
artifactsNoAbsolute paths of the BREP geometry handoff, .inp deck, .frd results and mesh JSON, for hand reproduction.
errorCodeNo
diagnosticsNofea.* diagnostics raised by the run.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesPrinter hostname or IP.
portNoOverride the protocol default port.
serialNoBambu printer serial number (required to start a print unless start_print is false).
api_keyNoOctoPrint API key (Settings -> API).
dry_runNoValidate connectivity/auth only; never uploads or starts a print.
filenameNoUploaded file name (default: 'kernelcad.gcode').
protocolYes
gcode_pathYesPath to the .gcode file on disk.
access_codeNoBambu LAN-mode access code (printer settings -> LAN Only Mode).
start_printNoStart the print immediately after upload (default: true).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
dry_runNoTrue when only connectivity/auth was validated (no upload, no print start).
diagnosticsNo
uploaded_pathNoPath/name the G-code was stored under on the printer.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
new_valueYesThe 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_nameYesThe string literal name of the param (first arg to param()).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe .kcad.ts source code.
modeYes
posesNoOptional solvedModel pose overrides keyed by mate name. Defaults to {}.
optionsNoOptional solvedModel options such as { validate: 'warn', posesGate: 'envelope' }.
assembly_bindingYesJS identifier bound to assembly(...).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the edit applied and re-evaluated cleanly.
errorNoFailure message (present when ok is false).
new_codeNoModified .kcad.ts source (present on success). Caller persists it.
diagnosticsNoDiagnostics from re-evaluating the modified source.
binding_nameNoJS const name bound to the new construct (when one was created).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MatesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
posesNoOptional numeric pose overrides keyed by mate name.
assemblyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
posesNoSolved part poses keyed by mate; each a serialized Transform (success).
statusNoSolver status (success).
errorCodeNo
errorHintNo
iterationsNoSolver iteration count (success).

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SketchA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYesSketch entities to solve. Lines reference point ids; circles reference a center point id.
constraintsYesConstraints to apply to the entities.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorsNoSolver/validation errors (present on failure, including non-convergence).
entitiesYesSolved sketch entities (best-effort on a non-converging solve).
residualNoFinal aggregate constraint residual when the solver ran.
convergedNoWhether the constraint solve converged below tolerance. ok is false when this is false.
constraintsYesThe constraints applied.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RangeA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoInline kernelCAD script source.
fileNoPath to a .kcad.ts script file.
gatesNoWhich standard gates to run per combo.
paramsYesparam() name -> { values: [number|string, ...] } or { min, max, steps }.
assemblyNoAssembly name; defaults to the first captured assembly.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether every gate passed on every evaluated combo.
errorNo
resultsNoOne entry per evaluated combo: { combo, gates, diagnostics }.
errorCodeNo
diagnosticsNoSweep-level diagnostics (e.g. combo-cap-exceeded).
combosCappedNoTrue when the full cartesian product exceeded the 64-combo cap.
firstFailureNoFirst failing combo per gate name.
combosEvaluatedNoNumber of combos actually evaluated (capped at 64).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hintNoOptional free-text hint forwarded to vision-LLM backends (e.g. "a pair of eyewear; trace the upper brow only").
priorsNoCaller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts.
backendNoForce a specific backend; default `auto` routes by corner-color stddev.
featuresNoFeatures to trace. Defaults to a single { label: "silhouette", kind: "silhouette" } when omitted.
imageUrlYesURL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path.
validateNoAssumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open.
scaleAnchorNoPixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`.
maxWaypointsPerFeatureNoCap on waypoints per feature. Defaults to 12 (suitable for medium-inflection outlines).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
ledgerYesAssumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.
featuresYesTraced features with normalized [0..1] waypoints + confidence.
imageDimsYesPixel dimensions [width, height] of the source image.
diagnosticsYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DesignA
Read-only
Inspect

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 check are check-specific and forwarded verbatim; each check fails closed on its own missing required params.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxfNocheck:'dfm-preflight' — path to a DXF file.
codeNoInline kernelCAD script source (same checks as `file`).
fileNoPath to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold).
modeNocheck:'load-capacity' — 'beam' (default) or 'stub'.
poseNocheck:'static-hold' — explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range.
seedNocheck:'reachable' — numeric IK seed pose (joint name -> deg/mm).
checkYesWhich verification to run.
jointNocheck:'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.
loadsNocheck:'load-capacity' — partName -> { force?: [Fx,Fy,Fz] N, torque?: [Tx,Ty,Tz] N*m }.
rangeNocheck:'swept-collision' — [lower, upper, step] in joint-native units.
vendorNocheck:'dfm-preflight' — vendor SKU (required for that check).
gravityNocheck:'static-hold' — gravity vector, m/s^2, world frame (default [0, 0, -9.81]).
serviceNocheck:'dfm-preflight' — service.
assemblyNoAssembly name; defaults to the first captured assembly.
materialNocheck:'dfm-preflight' — material SKU (required for that check).
tip_linkNocheck:'reachable' — end-effector part name (required for that check).
featureIdNocheck:'dfm-preflight' — FeatureId to scope to.
materialsNocheck:'load-capacity' — partName -> material declaration.
urdf_pathNocheck:'urdf' — path to the .urdf file.
thicknessInNocheck:'dfm-preflight' — material thickness in inches.
thicknessMmNocheck:'dfm-preflight' — material thickness in millimeters.
prefer_solverNocheck:'reachable' — force the IK path ('auto' default).
range_samplesNocheck:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9).
max_iterationsNocheck:'reachable' — numeric-path iteration cap.
refreshCatalogNocheck:'dfm-preflight' — force vendor catalog refresh.
target_positionNocheck:'reachable' — target [x, y, z] mm (world frame).
target_orientationNocheck:'reachable' — target XYZ Euler angles in radians.
min_torque_margin_pctNocheck:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20).
position_tolerance_mmNocheck:'reachable' — position tolerance in mm.
collision_tolerance_mm3Nocheck:'swept-collision' — BREP intersection volume tolerance (mm^3).
safety_factor_thresholdNocheck:'load-capacity' — pass/fail safety-factor floor (default 1.5).
orientation_tolerance_radNocheck:'reachable' — orientation tolerance in radians.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the verification ran and passed its gate.
errorNoFailure message (present on failure).
errorCodeNo
diagnosticsNoVerifier diagnostics (most checks).

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 FailureA
Read-only
Inspect

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? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
fileNo
feature_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
chainNoUpstream feature diagnostics in topological order; requested feature last.
errorNo
traceNoEvery captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.
errorCodeNo
candidatesNoOrdered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from.
feature_idNo
repairRegionNoMinimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.
candidateReasonNoWhy no candidate was derivable.
candidateStatusNo'no-automatic-candidate' means the region is the whole answer — no mechanical fix exists for that diagnostic kind.
targetDiagnosticIdNoId of the diagnostic the repair plan targets; pass it to repair_script.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool update
    • Changedopen_in_studio5 fields changed
      • addedOutput schema / properties / meshError
        Added value: +{
        +  "description": "Sanitized persist/repair error when meshStatus is failed.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / meshPersistError
        Removed value: -{
        -  "description": "Set when the revision mesh could not be stored on the CDN. meshUrl is omitted in that case.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / meshStatus
        Added value: +{
        +  "description": "ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).",
        +  "enum": [
        +    "ready",
        +    "building",
        +    "failed",
        +    "missing"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / meshUrl / description
        Previous 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)."
      • changedOutput schema / properties / ok / description
        Previous 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."
  2. 1 tool update
    • Changedget_project3 fields changed
      • addedOutput schema / properties / meshError
        Added value: +{
        +  "description": "Fetch mode: sanitized repair/persist error when meshStatus is failed.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / meshStatus
        Added value: +{
        +  "description": "Fetch mode: ready | building | failed | missing — explicit CDN artifact state (never silently omit meshUrl under CDN mode).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / meshUrl / description
        Previous 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)."
  3. 1 tool update
    • Changedopen_in_studio1 field changed
      • addedOutput schema / properties / meshPersistError
        Added value: +{
        +  "description": "Set when the revision mesh could not be stored on the CDN. meshUrl is omitted in that case.",
        +  "type": "string"
        +}
  4. 2 tool updates
    • Changedget_project4 fields changed
      • addedOutput schema / properties / embedUrl
        Added value: +{
        +  "description": "Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / meshUrl
        Added value: +{
        +  "description": "Fetch mode: revision-matched mesh artifact URL when available — FunnelViewer loads it instead of re-executing CAD.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / serverBuild
        Added value: +{
        +  "description": "Deploy identity (package+git SHA@boot time) so connector lag is observable.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / url
        Added value: +{
        +  "description": "Fetch mode: revision-pinned /p/<slug>?version= link.",
        +  "type": "string"
        +}
    • Changedopen_in_studio3 fields changed
      • changedOutput schema / properties / embedUrl / description
        Previous 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."
      • addedOutput schema / properties / meshUrl
        Added value: +{
        +  "description": "Revision-matched mesh artifact URL when available — prefer this over re-executing CAD in the embed.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / serverBuild
        Added value: +{
        +  "description": "Deploy identity so connector vs server mismatch is observable.",
        +  "type": "string"
        +}
  5. 23 tool updates
    • Changedadd_surface14 fields changed
      • addedInput schema / properties / angle_deg
        Added 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"
        +}
      • changedInput schema / properties / binding_name / description
        Previous 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>)."
      • addedInput schema / properties / by_binding
        Added value: +{
        +  "description": "kind:'trim' — JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred.",
        +  "type": "string"
        +}
      • addedInput schema / properties / face
        Added 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"
        +}
      • changedInput schema / properties / kind / description
        Previous value: -"Which surface-construction path to use."New value: +"Which surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "nurbs",
        -  "boundary"
        -]New value: +[
        +  "nurbs",
        +  "boundary",
        +  "trim",
        +  "sew",
        +  "draft"
        +]
      • addedInput schema / properties / neutral_plane
        Added value: +{
        +  "description": "kind:'draft' — parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted.",
        +  "type": "string"
        +}
      • addedInput schema / properties / op
        Added value: +{
        +  "description": "kind:'trim' — 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split()).",
        +  "enum": [
        +    "trim",
        +    "split"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / pull_dir
        Added 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"
        +}
      • addedInput schema / properties / require_closed
        Added 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"
        +}
      • addedInput schema / properties / shape_binding
        Added value: +{
        +  "description": "kind:'draft' — JS variable name of the Shape to taper (must be declared in source).",
        +  "type": "string"
        +}
      • addedInput schema / properties / surface_binding
        Added value: +{
        +  "description": "kind:'trim' — JS variable name of the Surface to trim/split (must be declared in source).",
        +  "type": "string"
        +}
      • addedInput schema / properties / surface_bindings
        Added 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"
        +}
      • addedInput schema / properties / tolerance
        Added value: +{
        +  "description": "kind:'sew' — edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged.",
        +  "type": "number"
        +}
    • Changeddesign_loop1 field changed
      • addedInput schema / properties / requirePhysicalAcceptance
        Added 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"
        +}
    • Addeddiff_geometry
    • Changeddiff_scripts1 field changed
      • addedOutput schema / properties / deeperDiffAvailable
        Added 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"
        +}
    • Addeddrawing_to_cad
    • Changedevaluate_script3 fields changed
      • addedInput schema / properties / skipMechanismCheck
        Added 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"
        +}
      • addedOutput schema / properties / featureHealth
        Added 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"
        +}
      • addedOutput schema / properties / mechanism
        Added 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"
        +}
    • Changedexport3 fields changed
      • changedInput schema / properties / format / enum
        Previous 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"
        +]
      • changedInput schema / properties / options / description
        Previous 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."
      • changedOutput schema / properties / mesh_files / description
        Previous 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."
    • Addedfea_summary
    • Changedinspect12 fields changed
      • changedInput schema / properties / assembly / description
        Previous 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."
      • addedInput schema / properties / at
        Added value: +{
        +  "description": "of:'section' — single slice position along `axis` (mm).",
        +  "type": "number"
        +}
      • addedInput schema / properties / axis
        Added value: +{
        +  "description": "of:'section' — normal axis for `at` / `stack` (default 'z').",
        +  "enum": [
        +    "x",
        +    "y",
        +    "z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / density
        Added 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"
        +}
      • addedInput schema / properties / edges
        Added value: +{
        +  "description": "of:'continuity' — optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled."
        +}
      • addedInput schema / properties / faces
        Added value: +{
        +  "description": "of:'curvature' — optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled."
        +}
      • changedInput schema / properties / feature_id / description
        Previous 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."
      • addedInput schema / properties / gyration_axis
        Added 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"
        +}
      • changedInput schema / properties / of / enum
        Previous 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"
        +]
      • addedInput schema / properties / plane
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / spike_factor
        Added value: +{
        +  "description": "of:'curvature' — spike sensitivity as a multiple of the face's Gaussian stddev (default 6).",
        +  "type": "number"
        +}
      • addedInput schema / properties / stack
        Added 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"
        +}
    • Changedlookup_api1 field changed
      • addedOutput schema / properties / shapeListMethods
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Addedmesh_to_features
    • Changedproject_curve4 fields changed
      • changedInput schema / properties / asEdge / description
        Previous 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)."
      • addedInput schema / properties / commands
        Added 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"
        +}
      • removedInput schema / properties / curveExpression
        Removed 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"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "code",
        -  "target",
        -  "curveExpression",
        -  "face"
        -]New value: +[
        +  "code",
        +  "target",
        +  "commands",
        +  "face"
        +]
    • Changedrender_preview3 fields changed
      • addedInput schema / properties / explode
        Added 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"
        +}
      • addedInput schema / properties / overlay
        Added 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"
        +}
      • addedInput schema / properties / section
        Added 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"
        +}
    • Addedrepair_script
    • Addedresolve_assumptions
    • Changedreview_cad10 fields changed
      • addedInput schema / properties / includePhysicalUseCaseJointReactions
        Added 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"
        +}
      • addedInput schema / properties / includePhysicalUseCaseJointStructure
        Added 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"
        +}
      • addedInput schema / properties / includePhysicalUseCaseReachability
        Added 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"
        +}
      • addedInput schema / properties / includePhysicalUseCaseStatics
        Added 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"
        +}
      • addedInput schema / properties / physicalUseCaseReachabilitySamplesPerMate
        Added 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"
        +}
      • addedInput schema / properties / requirePhysicalUseCase
        Added value: +{
        +  "description": "When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / interferenceSummary
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / physicalUseCaseJointReactionCertificates
        Added 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"
        +}
      • addedOutput schema / properties / physicalUseCaseJointStructuralCertificates
        Added 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"
        +}
      • addedOutput schema / properties / physicalUseCaseStaticCertificates
        Added value: +{
        +  "description": "Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.",
        +  "items": {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Addedrun_fea
    • Addedsend_to_printer
    • Changedsolve_sketch4 fields changed
      • addedOutput schema / properties / converged
        Added value: +{
        +  "description": "Whether the constraint solve converged below tolerance. ok is false when this is false.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / entities / description
        Previous value: -"Solved sketch entities."New value: +"Solved sketch entities (best-effort on a non-converging solve)."
      • changedOutput schema / properties / errors / description
        Previous value: -"Solver errors (present on failure)."New value: +"Solver/validation errors (present on failure, including non-convergence)."
      • addedOutput schema / properties / residual
        Added value: +{
        +  "description": "Final aggregate constraint residual when the solver ran.",
        +  "type": "number"
        +}
    • Addedsweep_tolerance
    • Changedtrace_from_image5 fields changed
      • addedInput schema / properties / priors
        Added 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"
        +}
      • addedInput schema / properties / scaleAnchor
        Added 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"
        +}
      • addedInput schema / properties / validate
        Added 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"
        +}
      • addedOutput schema / properties / ledger
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.",
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "ok",
        -  "features",
        -  "imageDims",
        -  "diagnostics"
        -]New value: +[
        +  "ok",
        +  "features",
        +  "imageDims",
        +  "diagnostics",
        +  "ledger"
        +]
    • Changedverify7 fields changed
      • changedInput schema / properties / check / enum
        Previous 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"
        +]
      • changedInput schema / properties / file / description
        Previous 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)."
      • addedInput schema / properties / gravity
        Added 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"
        +}
      • changedInput schema / properties / joint / description
        Previous 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."
      • addedInput schema / properties / min_torque_margin_pct
        Added value: +{
        +  "description": "check:'static-hold' — safety-margin floor as a percent of actuator capacity (default 20).",
        +  "type": "number"
        +}
      • addedInput schema / properties / pose
        Added 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."
        +}
      • addedInput schema / properties / range_samples
        Added value: +{
        +  "description": "check:'static-hold' — grid density per evaluated joint when `pose` is omitted (default 9).",
        +  "type": "number"
        +}
    • Changedwhy_did_this_fail6 fields changed
      • addedOutput schema / properties / candidateReason
        Added value: +{
        +  "description": "Why no candidate was derivable.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / candidateStatus
        Added 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"
        +}
      • addedOutput schema / properties / candidates
        Added 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"
        +}
      • addedOutput schema / properties / repairRegion
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / targetDiagnosticId
        Added value: +{
        +  "description": "Id of the diagnostic the repair plan targets; pass it to repair_script.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / trace
        Added value: +{
        +  "description": "Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.",
        +  "items": {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  6. 1 tool update
    • Changedopen_in_studio10 fields changed
      • addedInput schema / properties / include_preview
        Added 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"
        +}
      • addedOutput schema / properties / previewBytes
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / previewCached
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / previewDelivered
        Added 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"
        +}
      • addedOutput schema / properties / previewHeight
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / previewHint
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / previewStatus
        Added 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"
        +}
      • addedOutput schema / properties / previewUrl
        Added value: +{
        +  "description": "HTTPS URL of the PNG preview when storage signed successfully.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / previewView
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / previewWidth
        Added value: +{
        +  "type": "number"
        +}
  7. 3 tool updates
    • Changedget_project1 field changed
      • addedOutput schema / properties / assets
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Complementary files keyed by source-relative path.",
        +  "type": "object"
        +}
    • Changedget_project_revision1 field changed
      • addedOutput schema / properties / assets
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Immutable complementary-file manifest.",
        +  "type": "object"
        +}
    • Changedopen_in_studio3 fields changed
      • addedInput schema / properties / attachments
        Added 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"
        +}
      • addedOutput schema / properties / assetHashes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / attachmentCount
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
  8. 2 tool updates
    • Addedget_project_revision
    • Changedopen_in_studio1 field changed
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Immutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
  9. 1 tool update
    • Changedopen_in_studio4 fields changed
      • changedInput schema / properties / parameters / description
        Previous 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."
      • addedInput schema / properties / parameters / items / properties
        Added 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"
        +  }
        +}
      • addedInput schema / properties / parameters / items / required
        Added value: +[
        +  "name",
        +  "defaultValue",
        +  "kind"
        +]
      • addedInput schema / properties / parameters / items / type
        Added value: +"object"
  10. 6 tool updates
    • Changedadd_curve3 fields changed
      • addedInput schema / properties / b / properties / curvature / description
        Added value: +"Optional second derivative; defaults to [0, 0, 0] (G1-only)."
      • addedInput schema / properties / b / properties / point / description
        Added value: +"Endpoint position in mm."
      • addedInput schema / properties / b / properties / tangent / description
        Added value: +"First derivative of the curve at this endpoint."
    • Changedadd_mate1 field changed
      • changedInput schema / allOf
        Previous 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"
        +      ]
        +    }
        +  }
        +]
    • Changedadd_path_segment7 fields changed
      • addedInput schema / properties / a / properties / curvature / description
        Added value: +"Optional second derivative; defaults to [0, 0] (G1-only)."
      • addedInput schema / properties / a / properties / point / description
        Added value: +"Endpoint position in mm."
      • addedInput schema / properties / a / properties / tangent / description
        Added value: +"First derivative (~ chord length), NOT unit length."
      • changedInput schema / properties / b / description
        Previous value: -"kind:'hermite' — end endpoint."New value: +"kind:'hermite' — end endpoint; pen ends at b.point."
      • addedInput schema / properties / b / properties / curvature / description
        Added value: +"Optional second derivative; defaults to [0, 0] (G1-only)."
      • addedInput schema / properties / b / properties / point / description
        Added value: +"Endpoint position in mm."
      • addedInput schema / properties / b / properties / tangent / description
        Added value: +"First derivative (~ chord length), NOT unit length."
    • Changeddesign_loop5 fields changed
      • changedInput schema / properties / attempts / description
        Previous 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."
      • addedInput schema / properties / attempts / items / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "file"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "code"
        +    ]
        +  }
        +]
      • addedInput schema / properties / attempts / items / properties / code / description
        Added value: +"Inline kernelCAD script source. Provide file or code."
      • addedInput schema / properties / attempts / items / properties / file / description
        Added value: +"Path to a .kcad.ts script on disk. Provide file or code."
      • changedInput schema / properties / attempts / items / properties / visualReview / description
        Previous 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."
    • Changedrender_preview1 field changed
      • changedInput schema / properties / views / description
        Previous 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."
    • Changedset_param3 fields changed
      • changedInput schema / properties / new_value / description
        Previous 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\")."
      • addedInput schema / properties / new_value / examples
        Added value: +[
        +  12.5,
        +  "width/2 + 3"
        +]
      • addedInput schema / properties / new_value / oneOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
  11. 1 tool update
    • Changedreview_cad3 fields changed
      • removedOutput schema / properties / connectorWorkspace / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / connectorWorkspace / items
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • changedOutput schema / properties / connectorWorkspace / type
        Previous value: -"object"New value: +"array"
  12. 1 tool update
    • Changedopen_in_studio1 field changed
      • addedOutput schema / properties / embedUrl
        Added 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"
        +}
  13. 59 tool updates
    • Removedadd_assembly_part_source
    • Changedadd_connector2 fields changed
      • changedInput schema / properties / origin / description
        Previous value: -"Origin as [x, y, z] shorthand or structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin."
      • addedInput schema / properties / origin / oneOf
        Added 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"
        +  }
        +]
    • Changedadd_constraint6 fields changed
      • addedInput schema / properties / constraint / description
        Added value: +"The constraint to append."
      • addedInput schema / properties / constraint / properties
        Added 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"
        +  }
        +}
      • addedInput schema / properties / constraint / required
        Added value: +[
        +  "id",
        +  "type",
        +  "entities"
        +]
      • addedInput schema / properties / constraints / description
        Added value: +"Existing constraint list to append to (omit for an empty list)."
      • addedInput schema / properties / constraints / items / properties
        Added 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"
        +  }
        +}
      • addedInput schema / properties / constraints / items / required
        Added value: +[
        +  "id",
        +  "type",
        +  "entities"
        +]
    • Changedadd_curve1 field changed
      • addedInput schema / allOf
        Added value: +[
        +  {
        +    "if": {
        +      "properties": {
        +        "kind": {
        +          "const": "nurbs"
        +        }
        +      }
        +    },
        +    "then": {
        +      "required": [
        +        "controlPoints"
        +      ]
        +    }
        +  },
        +  {
        +    "if": {
        +      "properties": {
        +        "kind": {
        +          "const": "hermite"
        +        }
        +      }
        +    },
        +    "then": {
        +      "required": [
        +        "a",
        +        "b"
        +      ]
        +    }
        +  }
        +]
    • Removedadd_hermite_g2
    • Changedadd_mate1 field changed
      • addedInput schema / allOf
        Added 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": {}
        +  }
        +]
    • Removedadd_mate_coupling_source
    • Removedadd_mate_source
    • Removedadd_nurbs_curve
    • Removedadd_nurbs_surface
    • Removedadd_part_connector_source
    • Removedadd_path_hermite_g2
    • Removedadd_path_nurbs_segment
    • Changedadd_path_segment1 field changed
      • addedInput schema / allOf
        Added 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"
        +      ]
        +    }
        +  }
        +]
    • Removedadd_path_spline
    • Changedadd_pattern_feature7 fields changed
      • addedInput schema / allOf
        Added 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"
        +      ]
        +    }
        +  }
        +]
      • addedInput schema / properties / grid / properties / x / description
        Added value: +"First grid axis."
      • addedInput schema / properties / grid / properties / x / properties
        Added value: +{
        +  "count": {
        +    "minimum": 2,
        +    "type": "integer"
        +  },
        +  "direction": {
        +    "items": {
        +      "type": "number"
        +    },
        +    "maxItems": 3,
        +    "minItems": 3,
        +    "type": "array"
        +  },
        +  "spacing": {
        +    "type": "number"
        +  }
        +}
      • addedInput schema / properties / grid / properties / x / required
        Added value: +[
        +  "count",
        +  "direction",
        +  "spacing"
        +]
      • addedInput schema / properties / grid / properties / y / description
        Added value: +"Second grid axis."
      • addedInput schema / properties / grid / properties / y / properties
        Added value: +{
        +  "count": {
        +    "minimum": 2,
        +    "type": "integer"
        +  },
        +  "direction": {
        +    "items": {
        +      "type": "number"
        +    },
        +    "maxItems": 3,
        +    "minItems": 3,
        +    "type": "array"
        +  },
        +  "spacing": {
        +    "type": "number"
        +  }
        +}
      • addedInput schema / properties / grid / properties / y / required
        Added value: +[
        +  "count",
        +  "direction",
        +  "spacing"
        +]
    • Removedadd_sketch_text
    • Changedadd_surface2 fields changed
      • changedInput schema / properties / continuity / description
        Previous 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'."
      • addedInput schema / properties / continuity / oneOf
        Added value: +[
        +  {
        +    "enum": [
        +      "C0",
        +      "C1",
        +      "C2"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "enum": [
        +        "C0",
        +        "C1",
        +        "C2"
        +      ],
        +      "type": "string"
        +    },
        +    "maxItems": 4,
        +    "minItems": 4,
        +    "type": "array"
        +  }
        +]
    • Removedadd_surface_from_boundary
    • Removedadd_transmission_source
    • Removedadd_workspace_target_source
    • Removedcheck_load_capacity
    • Removedcheck_mounting_hole_consistency
    • Removedcheck_reachable
    • Removedcheck_swept_collision
    • Removeddfm_check
    • Removeddfm_preflight
    • Removedemboss_text
    • Removedevaluate_query
    • Removedexport_model
    • Removedexport_part
    • Removedget_bend_table
    • Removedget_edges_of
    • Removedget_face_lineage
    • Removedget_shape_info
    • Removedinspect_assembly
    • Removedinspect_robot
    • Removedinspect_step
    • Removedlist_api
    • Removedlist_assemblies
    • Removedlist_constraints
    • Removedlist_diagnostic_codes
    • Removedlist_edges
    • Removedlist_face_labels
    • Removedlist_faces
    • Removedlist_features
    • Removedlist_mates
    • Removedlist_part_categories
    • Removedlist_part_families
    • Removedlist_part_stats
    • Removedlist_topology
    • Removedparams_list
    • Removedparams_update
    • Removedresolve_topo_ref
    • Removedset_param_value
    • Removedset_scene_return_source
    • Changedsolve_sketch4 fields changed
      • addedInput schema / properties / constraints / items / properties
        Added 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"
        +  }
        +}
      • addedInput schema / properties / constraints / items / required
        Added value: +[
        +  "id",
        +  "type",
        +  "entities"
        +]
      • addedInput schema / properties / entities / items / oneOf
        Added 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"
        +  }
        +]
      • removedInput schema / properties / entities / items / type
        Removed value: -"object"
    • Removedvalidate_assembly
    • Removedvalidate_urdf
  14. 19 tool updates
    • Changedadd_connector2 fields changed
      • changedInput schema / properties / origin / description
        Previous value: -"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand or structured ConnectorOrigin."
      • removedInput schema / properties / origin / oneOf
        Removed 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"
        -  }
        -]
    • Changedadd_constraint6 fields changed
      • removedInput schema / properties / constraint / description
        Removed value: -"The constraint to append."
      • removedInput schema / properties / constraint / properties
        Removed 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"
        -  }
        -}
      • removedInput schema / properties / constraint / required
        Removed value: -[
        -  "id",
        -  "type",
        -  "entities"
        -]
      • removedInput schema / properties / constraints / description
        Removed value: -"Existing constraint list to append to (omit for an empty list)."
      • removedInput schema / properties / constraints / items / properties
        Removed 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"
        -  }
        -}
      • removedInput schema / properties / constraints / items / required
        Removed value: -[
        -  "id",
        -  "type",
        -  "entities"
        -]
    • Changedadd_curve1 field changed
      • removedInput schema / allOf
        Removed value: -[
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "nurbs"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "controlPoints"
        -      ]
        -    }
        -  },
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "hermite"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "a",
        -        "b"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_hermite_g21 field changed
      • removedInput schema / allOf
        Removed value: -[
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "nurbs"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "controlPoints"
        -      ]
        -    }
        -  },
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "hermite"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "a",
        -        "b"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_mate1 field changed
      • removedInput schema / allOf
        Removed 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": {}
        -  }
        -]
    • Changedadd_mate_coupling_source1 field changed
      • removedInput schema / allOf
        Removed 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": {}
        -  }
        -]
    • Changedadd_mate_source1 field changed
      • removedInput schema / allOf
        Removed 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": {}
        -  }
        -]
    • Changedadd_nurbs_curve1 field changed
      • removedInput schema / allOf
        Removed value: -[
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "nurbs"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "controlPoints"
        -      ]
        -    }
        -  },
        -  {
        -    "if": {
        -      "properties": {
        -        "kind": {
        -          "const": "hermite"
        -        }
        -      }
        -    },
        -    "then": {
        -      "required": [
        -        "a",
        -        "b"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_nurbs_surface2 fields changed
      • changedInput schema / properties / continuity / description
        Previous 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'."
      • removedInput schema / properties / continuity / oneOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "C0",
        -      "C1",
        -      "C2"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "enum": [
        -        "C0",
        -        "C1",
        -        "C2"
        -      ],
        -      "type": "string"
        -    },
        -    "maxItems": 4,
        -    "minItems": 4,
        -    "type": "array"
        -  }
        -]
    • Changedadd_part_connector_source2 fields changed
      • changedInput schema / properties / origin / description
        Previous value: -"Origin as [x, y, z] shorthand, or a structured ConnectorOrigin."New value: +"Origin as [x, y, z] shorthand or structured ConnectorOrigin."
      • removedInput schema / properties / origin / oneOf
        Removed 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"
        -  }
        -]
    • Changedadd_path_hermite_g21 field changed
      • removedInput schema / allOf
        Removed 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"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_path_nurbs_segment1 field changed
      • removedInput schema / allOf
        Removed 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"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_path_segment1 field changed
      • removedInput schema / allOf
        Removed 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"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_path_spline1 field changed
      • removedInput schema / allOf
        Removed 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"
        -      ]
        -    }
        -  }
        -]
    • Changedadd_pattern_feature7 fields changed
      • removedInput schema / allOf
        Removed 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"
        -      ]
        -    }
        -  }
        -]
      • removedInput schema / properties / grid / properties / x / description
        Removed value: -"First grid axis."
      • removedInput schema / properties / grid / properties / x / properties
        Removed value: -{
        -  "count": {
        -    "minimum": 2,
        -    "type": "integer"
        -  },
        -  "direction": {
        -    "items": {
        -      "type": "number"
        -    },
        -    "maxItems": 3,
        -    "minItems": 3,
        -    "type": "array"
        -  },
        -  "spacing": {
        -    "type": "number"
        -  }
        -}
      • removedInput schema / properties / grid / properties / x / required
        Removed value: -[
        -  "count",
        -  "direction",
        -  "spacing"
        -]
      • removedInput schema / properties / grid / properties / y / description
        Removed value: -"Second grid axis."
      • removedInput schema / properties / grid / properties / y / properties
        Removed value: -{
        -  "count": {
        -    "minimum": 2,
        -    "type": "integer"
        -  },
        -  "direction": {
        -    "items": {
        -      "type": "number"
        -    },
        -    "maxItems": 3,
        -    "minItems": 3,
        -    "type": "array"
        -  },
        -  "spacing": {
        -    "type": "number"
        -  }
        -}
      • removedInput schema / properties / grid / properties / y / required
        Removed value: -[
        -  "count",
        -  "direction",
        -  "spacing"
        -]
    • Changedadd_surface2 fields changed
      • changedInput schema / properties / continuity / description
        Previous 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'."
      • removedInput schema / properties / continuity / oneOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "C0",
        -      "C1",
        -      "C2"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "enum": [
        -        "C0",
        -        "C1",
        -        "C2"
        -      ],
        -      "type": "string"
        -    },
        -    "maxItems": 4,
        -    "minItems": 4,
        -    "type": "array"
        -  }
        -]
    • Changedadd_surface_from_boundary2 fields changed
      • changedInput schema / properties / continuity / description
        Previous 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'."
      • removedInput schema / properties / continuity / oneOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "C0",
        -      "C1",
        -      "C2"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "items": {
        -      "enum": [
        -        "C0",
        -        "C1",
        -        "C2"
        -      ],
        -      "type": "string"
        -    },
        -    "maxItems": 4,
        -    "minItems": 4,
        -    "type": "array"
        -  }
        -]
    • Changedadd_transmission_source1 field changed
      • removedInput schema / allOf
        Removed 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": {}
        -  }
        -]
    • Changedsolve_sketch4 fields changed
      • removedInput schema / properties / constraints / items / properties
        Removed 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"
        -  }
        -}
      • removedInput schema / properties / constraints / items / required
        Removed value: -[
        -  "id",
        -  "type",
        -  "entities"
        -]
      • removedInput schema / properties / entities / items / oneOf
        Removed 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"
        -  }
        -]
      • addedInput schema / properties / entities / items / type
        Added value: +"object"
  15. 51 tool updates
    • Addedadd_assembly_part_source
    • Addedadd_hermite_g2
    • Addedadd_mate_coupling_source
    • Addedadd_mate_source
    • Addedadd_nurbs_curve
    • Addedadd_nurbs_surface
    • Addedadd_part_connector_source
    • Addedadd_path_hermite_g2
    • Addedadd_path_nurbs_segment
    • Addedadd_path_spline
    • Addedadd_sketch_text
    • Addedadd_surface_from_boundary
    • Addedadd_transmission_source
    • Addedadd_workspace_target_source
    • Addedcheck_load_capacity
    • Addedcheck_mounting_hole_consistency
    • Addedcheck_reachable
    • Addedcheck_swept_collision
    • Addeddfm_check
    • Addeddfm_preflight
    • Addedemboss_text
    • Addedevaluate_query
    • Addedexport_model
    • Addedexport_part
    • Addedget_bend_table
    • Addedget_edges_of
    • Addedget_face_lineage
    • Addedget_shape_info
    • Addedinspect_assembly
    • Addedinspect_robot
    • Addedinspect_step
    • Addedlist_api
    • Addedlist_assemblies
    • Addedlist_constraints
    • Addedlist_diagnostic_codes
    • Addedlist_edges
    • Addedlist_face_labels
    • Addedlist_faces
    • Addedlist_features
    • Addedlist_mates
    • Addedlist_part_categories
    • Addedlist_part_families
    • Addedlist_part_stats
    • Addedlist_topology
    • Addedparams_list
    • Addedparams_update
    • Addedresolve_topo_ref
    • Addedset_param_value
    • Addedset_scene_return_source
    • Addedvalidate_assembly
    • Addedvalidate_urdf
  16. 1 tool update
    • Addedtrace_from_image
  17. 3 tool updates
    • Changedget_latest_render12 fields changed
      • addedInput schema / properties / paths_only
        Added 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"
        +}
      • addedInput schema / properties / view
        Added 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"
        +}
      • addedOutput schema / properties / bytes
        Added value: +{
        +  "description": "PNG byte length (when ok).",
        +  "type": "number"
        +}
      • removedOutput schema / properties / capturedAt
        Removed value: -{
        -  "description": "ISO timestamp the render was captured (when ok).",
        -  "type": "string"
        -}
      • changedOutput schema / properties / error / description
        Previous 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\")."
      • addedOutput schema / properties / height
        Added value: +{
        +  "description": "Rendered image edge in px (when ok).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / image_b64
        Added value: +{
        +  "description": "Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / ok / description
        Previous value: -"Whether a render was found."New value: +"Whether a render was produced."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "Set when inline was requested but the PNG exceeded the size cap.",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / url
        Removed value: -{
        -  "description": "Signed URL for the latest rendered PNG (when ok).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / view
        Added value: +{
        +  "description": "The view that was rendered (when ok).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / width
        Added value: +{
        +  "description": "Rendered image edge in px (when ok).",
        +  "type": "number"
        +}
    • Addedget_model_mesh
    • Removedtrace_from_image

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables coding agents to convert natural language engineering prompts into editable parametric CAD models with deterministic parsing, validation, and edit support.
    6
    Apache 2.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.