이 MCP로 할 수 있는 일
Authors, evaluates, reviews, simulates, edits, and exports parametric CAD assemblies and geometry from editable TypeScript-based kernelCAD scripts.
도구
입력 스키마
{'type': 'object', 'required': ['code', 'part_binding', 'name', 'type', 'origin'], 'properties': {'axis': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Optional [x, y, z] axis.'}, 'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'name': {'type': 'string', 'description': 'Connector name unique within the part.'}, 'type': {'enum': ['frame', 'axis', 'planar', 'ball'], 'type': 'string'}, 'normal': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Optional [x, y, z] normal.'}, 'origin': {'oneOf': [{'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': '[x, y, z] shorthand.'}, {'type': 'object', 'required': ['kind', 'value'], 'properties': {'kind': {'enum': ['vec3'], 'type': 'string'}, 'value': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}}, 'description': 'Explicit numeric origin.'}, {'type': 'object', 'required': ['kind', 'query'], 'properties': {'kind': {'enum': ['topology'], 'type': 'string'}, 'query': {'type': 'object', 'required': ['kind', 'name'], 'properties': {'kind': {'enum': ['face-center', 'face-normal', 'vertex', 'edge-axis'], 'type': 'string'}, 'name': {'type': 'string'}}}}, 'description': 'Topology-derived origin.'}], 'description': 'Origin as [x, y, z] shorthand, or a structured ConnectorOrigin.'}, 'part_binding': {'type': 'string', 'description': 'JS identifier bound to an AssemblyPartRef, e.g. "basePart".'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['constraint'], 'properties': {'constraint': {'type': 'object', 'required': ['id', 'type', 'entities'], 'properties': {'id': {'type': 'string'}, 'type': {'enum': ['COINCIDENT', 'DISTANCE', 'HORIZONTAL', 'VERTICAL', 'PARALLEL', 'PERPENDICULAR', 'EQUAL_LENGTH', 'TANGENT', 'RADIUS', 'ANGLE', 'CONCENTRIC', 'SYMMETRIC'], 'type': 'string'}, 'value': {'type': 'number', 'description': 'Required for DISTANCE, RADIUS, and ANGLE.'}, 'entities': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ids of the entities the constraint relates.'}}, 'description': 'The constraint to append.'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'type', 'entities'], 'properties': {'id': {'type': 'string'}, 'type': {'enum': ['COINCIDENT', 'DISTANCE', 'HORIZONTAL', 'VERTICAL', 'PARALLEL', 'PERPENDICULAR', 'EQUAL_LENGTH', 'TANGENT', 'RADIUS', 'ANGLE', 'CONCENTRIC', 'SYMMETRIC'], 'type': 'string'}, 'value': {'type': 'number'}, 'entities': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': 'Existing constraint list to append to (omit for an empty list).'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'constraints'], 'properties': {'ok': {'type': 'boolean'}, 'errors': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Validation errors (present on failure).'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Updated constraint list.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'allOf': [{'if': {'properties': {'kind': {'const': 'nurbs'}}}, 'then': {'required': ['controlPoints']}}, {'if': {'properties': {'kind': {'const': 'hermite'}}}, 'then': {'required': ['a', 'b']}}], 'required': ['kind', 'code'], 'properties': {'a': {'type': 'object', 'required': ['point', 'tangent'], 'properties': {'point': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Endpoint position in mm.'}, 'tangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'First derivative of the curve at this endpoint.'}, 'curvature': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Optional second derivative; defaults to [0, 0, 0] (G1-only).'}}, 'description': "kind:'hermite' â\x80\x94 start endpoint."}, 'b': {'type': 'object', 'required': ['point', 'tangent'], 'properties': {'point': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Endpoint position in mm.'}, 'tangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'First derivative of the curve at this endpoint.'}, 'curvature': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Optional second derivative; defaults to [0, 0, 0] (G1-only).'}}, 'description': "kind:'hermite' â\x80\x94 end endpoint."}, 'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'kind': {'enum': ['nurbs', 'hermite'], 'type': 'string', 'description': 'Which curve-construction path to use.'}, 'knots': {'type': 'array', 'items': {'type': 'number'}, 'description': "kind:'nurbs' â\x80\x94 optional explicit knot vector; missing => clamped-uniform inferred."}, 'closed': {'type': 'boolean', 'description': "kind:'nurbs' â\x80\x94 optional periodic/closed-curve flag."}, 'degree': {'type': 'integer', 'minimum': 1, 'description': "kind:'nurbs' â\x80\x94 curve degree; default 3 (cubic)."}, 'weights': {'type': 'array', 'items': {'type': 'number'}, 'description': "kind:'nurbs' â\x80\x94 optional rational weights, one per control point (same length as controlPoints)."}, 'binding_name': {'type': 'string', 'description': 'JS const name for the new Curve3D binding (default: _curve_<N>).'}, 'controlPoints': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}, 'description': "kind:'nurbs' â\x80\x94 control points as Vec3 triples in mm; at least 2 entries."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'feature_code'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'feature_code': {'type': 'string', 'description': 'Single-statement source line to insert (e.g. `const hole = cylinder(5, 2).translate(10, 10, -1);`).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'allOf': [{'if': {'anyOf': [{'not': {'required': ['relation']}}, {'required': ['relation'], 'properties': {'relation': {'const': 'mate'}}}]}, 'then': {'required': ['name', 'a', 'b', 'type']}}, {'if': {'required': ['relation'], 'properties': {'relation': {'const': 'coupling'}}}, 'then': {'required': ['driven', 'source', 'ratio']}}, {'if': {'required': ['relation'], 'properties': {'relation': {'const': 'transmission'}}}, 'then': {'required': ['name', 'kind', 'sourceMate', 'drivenMates', 'path']}}], 'required': ['code', 'assembly_binding'], 'properties': {'a': {'type': 'string', 'description': 'relation:\'mate\' â\x80\x94 connector ref "<partName>.<connectorName>".'}, 'b': {'type': 'string', 'description': 'relation:\'mate\' â\x80\x94 connector ref "<partName>.<connectorName>".'}, 'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'kind': {'enum': ['direct-horn', 'link-rod', 'four-bar', 'gear-pair', 'belt', 'tendon'], 'type': 'string', 'description': "relation:'transmission' â\x80\x94 transmission kind."}, 'name': {'type': 'string', 'description': "relation:'mate'|'transmission' â\x80\x94 name unique within the assembly."}, 'path': {'type': 'array', 'items': {'type': 'string'}, 'description': "relation:'transmission' â\x80\x94 drive path."}, 'pose': {'description': "relation:'mate' â\x80\x94 optional mate pose."}, 'type': {'enum': ['fastened', 'revolute', 'prismatic', 'cylindrical', 'planar', 'ball', 'pin_slot'], 'type': 'string', 'description': "relation:'mate' â\x80\x94 mate type."}, 'input': {'type': 'string', 'description': "relation:'transmission' â\x80\x94 optional input."}, 'notes': {'type': 'string', 'description': "relation:'transmission' â\x80\x94 optional notes."}, 'ratio': {'type': 'number', 'description': "relation:'coupling' â\x80\x94 driven pose = source pose * ratio + offset."}, 'driven': {'type': 'string', 'description': "relation:'coupling' â\x80\x94 driven mate name."}, 'offset': {'type': 'number', 'description': "relation:'coupling' â\x80\x94 optional pose offset."}, 'output': {'type': 'string', 'description': "relation:'transmission' â\x80\x94 optional output."}, 'source': {'type': 'string', 'description': "relation:'coupling' â\x80\x94 source mate name."}, 'actuator': {'type': 'string', 'description': "relation:'transmission' â\x80\x94 optional actuator."}, 'limitsMm': {'type': 'array', 'items': {'type': 'number'}, 'description': "relation:'mate' â\x80\x94 optional [minMm, maxMm]."}, 'relation': {'enum': ['mate', 'coupling', 'transmission'], 'type': 'string', 'description': "Which relationship to author (default 'mate')."}, 'limitsDeg': {'type': 'array', 'items': {'type': 'number'}, 'description': "relation:'mate' â\x80\x94 optional [minDeg, maxDeg]."}, 'sourceMate': {'type': 'string', 'description': "relation:'transmission' â\x80\x94 source mate name."}, 'drivenMates': {'type': 'array', 'items': {'type': 'string'}, 'description': "relation:'transmission' â\x80\x94 driven mate names."}, 'assembly_binding': {'type': 'string', 'description': 'JS identifier bound to assembly(...).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'assembly_binding', 'part_name', 'shape_expression'], 'properties': {'at': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Optional [x, y, z] assembly placement.'}, 'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'part_name': {'type': 'string', 'description': 'Assembly-unique part name.'}, 'binding_name': {'type': 'string', 'description': 'Optional JS const name for the returned AssemblyPartRef. Defaults to a part-name-derived identifier.'}, 'assembly_binding': {'type': 'string', 'description': 'JS identifier bound to assembly(...), e.g. "arm".'}, 'shape_expression': {'type': 'string', 'description': 'JS expression for the Shape to pass to assembly.part, inserted verbatim.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'allOf': [{'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']}}], 'required': ['kind', 'code', 'chain_anchor'], 'properties': {'a': {'type': 'object', 'required': ['point', 'tangent'], 'properties': {'point': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'Endpoint position in mm.'}, 'tangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'First derivative (~ chord length), NOT unit length.'}, 'curvature': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'Optional second derivative; defaults to [0, 0] (G1-only).'}}, 'description': "kind:'hermite' â\x80\x94 start endpoint; point must match current pen position within 1e-6 mm."}, 'b': {'type': 'object', 'required': ['point', 'tangent'], 'properties': {'point': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'Endpoint position in mm.'}, 'tangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'First derivative (~ chord length), NOT unit length.'}, 'curvature': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': 'Optional second derivative; defaults to [0, 0] (G1-only).'}}, 'description': "kind:'hermite' â\x80\x94 end endpoint; pen ends at b.point."}, 'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'kind': {'enum': ['spline', 'nurbs', 'hermite'], 'type': 'string', 'description': 'Which path-segment kind to append.'}, 'knots': {'type': 'array', 'items': {'type': 'number'}, 'description': "kind:'nurbs' â\x80\x94 optional explicit knot vector; length must equal controlPoints.length + degree + 1."}, 'degree': {'type': 'integer', 'minimum': 1, 'description': "kind:'nurbs' â\x80\x94 B-spline degree (default 3)."}, 'points': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2}, 'minItems': 2, 'description': "kind:'spline' â\x80\x94 waypoints as Vec2 pairs in mm; at least 2 entries; first must match current pen position."}, 'tension': {'type': 'number', 'description': "kind:'spline' â\x80\x94 optional Catmull-Rom-style stiffness; forwarded to the underlying B-spline approximation."}, 'weights': {'type': 'array', 'items': {'type': 'number'}, 'description': "kind:'nurbs' â\x80\x94 optional rational weights (one per control point; strictly positive)."}, 'endTangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': "kind:'spline' â\x80\x94 optional [x, y] direction vector at points[N-1]. Magnitude is normalised internally; direction matters."}, 'binding_name': {'type': 'string', 'description': 'Reserved for future use; the segment injection mutates the chain anchor in place.'}, 'chain_anchor': {'type': 'string', 'description': 'JS identifier of an existing PathBuilder binding (e.g. `const brow = path().moveTo(0,0)`).'}, 'startTangent': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': "kind:'spline' â\x80\x94 optional [x, y] direction vector at points[0]. Magnitude is normalised internally; direction matters."}, 'controlPoints': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2}, 'description': "kind:'nurbs' â\x80\x94 control-net vertices as Vec2 pairs in mm; at least degree+1 entries."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'allOf': [{'if': {'properties': {'kind': {'const': 'linear'}}}, 'then': {'required': ['linear']}}, {'if': {'properties': {'kind': {'const': 'circular'}}}, 'then': {'required': ['circular']}}, {'if': {'properties': {'kind': {'const': 'grid'}}}, 'then': {'required': ['grid']}}], 'required': ['code', 'target', 'kind'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'grid': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'object', 'required': ['count', 'direction', 'spacing'], 'properties': {'count': {'type': 'integer', 'minimum': 2}, 'spacing': {'type': 'number'}, 'direction': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}}, 'description': 'First grid axis.'}, 'y': {'type': 'object', 'required': ['count', 'direction', 'spacing'], 'properties': {'count': {'type': 'integer', 'minimum': 2}, 'spacing': {'type': 'number'}, 'direction': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}}, 'description': 'Second grid axis.'}}, 'description': 'Required when kind=grid.'}, 'kind': {'enum': ['linear', 'circular', 'grid'], 'type': 'string'}, 'linear': {'type': 'object', 'required': ['count', 'direction', 'spacing'], 'properties': {'count': {'type': 'integer', 'minimum': 2}, 'spacing': {'type': 'number'}, 'direction': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}}, 'description': 'Required when kind=linear.'}, 'target': {'type': 'string', 'description': 'Variable name of the Shape to pattern (inserted verbatim as the LHS receiver).'}, 'circular': {'type': 'object', 'required': ['count', 'axis'], 'properties': {'axis': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}, 'count': {'type': 'integer', 'minimum': 2}, 'angleDeg': {'type': 'number', 'description': 'Optional; defaults to 360.'}}, 'description': 'Required when kind=circular.'}, 'assign_to': {'type': 'string', 'description': 'Optional const-binding name; emits `const <assign_to> = <target>.patternX(...);`. Omit for statement form.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['kind', 'code'], 'properties': {'op': {'enum': ['trim', 'split'], 'type': 'string', 'description': "kind:'trim' â\x80\x94 'trim' discards the smaller half (calls .trimTo()); 'split' retains both halves (calls .split())."}, 'code': {'type': 'string', 'description': 'Current .kcad.ts source.'}, 'face': {'type': 'string', 'description': "kind:'draft' â\x80\x94 face selector for the face(s) to taper. Accepts a canonical name (top/bottom/front/back/left/right), a user label declared via faceLabels, or a FaceQuery descriptor string."}, 'kind': {'enum': ['nurbs', 'boundary', 'trim', 'sew', 'draft'], 'type': 'string', 'description': "Which surface-construction or surface-finishing path to use: 'nurbs' | 'boundary' | 'trim' | 'sew' | 'draft'."}, 'knots': {'type': 'object', 'properties': {'u': {'type': 'array', 'items': {'type': 'number'}}, 'v': {'type': 'array', 'items': {'type': 'number'}}}, 'description': "kind:'nurbs' â\x80\x94 optional explicit knot vectors; missing => clamped uniform inferred."}, 'degree': {'type': 'object', 'required': ['u', 'v'], 'properties': {'u': {'type': 'integer', 'minimum': 1}, 'v': {'type': 'integer', 'minimum': 1}}, 'description': "kind:'nurbs' â\x80\x94 degrees in U and V; each in [1, nU-1] / [1, nV-1]."}, 'weights': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}, 'description': "kind:'nurbs' â\x80\x94 optional rational weights, same grid shape as controls. Ignored in slice-1."}, 'controls': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}}}, 'description': "kind:'nurbs' â\x80\x94 control-point grid for direct construction (controls[u][v] = [x, y, z], mm)."}, 'periodic': {'type': 'object', 'properties': {'u': {'type': 'boolean'}, 'v': {'type': 'boolean'}}, 'description': "kind:'nurbs' â\x80\x94 optional periodic flags per parametric direction."}, 'pull_dir': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': "kind:'draft' â\x80\x94 demoulding direction as [x, y, z]. Defaults to the face normal at lower time."}, 'sampling': {'type': 'integer', 'minimum': 1, 'description': "kind:'boundary' â\x80\x94 OCCT NbPtsOnCur sampling parameter (default 15)."}, 'angle_deg': {'type': 'number', 'maximum': 90, 'minimum': 0, 'description': "kind:'draft' â\x80\x94 draft angle in degrees [0, 90]. The face is tapered outward by this angle relative to the pull direction."}, 'tolerance': {'type': 'number', 'description': "kind:'sew' â\x80\x94 edge-merging tolerance in mm (default 1e-6). Edges within this distance are merged."}, 'by_binding': {'type': 'string', 'description': "kind:'trim' â\x80\x94 JS variable name of the cutter Surface (must be declared in source). Shape/Curve3D cutters are deferred."}, 'continuity': {'oneOf': [{'enum': ['C0', 'C1', 'C2'], 'type': 'string'}, {'type': 'array', 'items': {'enum': ['C0', 'C1', 'C2'], 'type': 'string'}, 'maxItems': 4, 'minItems': 4}], 'description': "kind:'boundary' â\x80\x94 continuity grade applied to every edge ('C0' | 'C1' | 'C2'), or an array of 4 grades (one per edge, bottom/right/top/left order). Default 'C0'."}, 'binding_name': {'type': 'string', 'description': "JS const name for the new binding (kind:'nurbs' default surface_<N>; kind:'boundary' default _surface_<N>; kind:'trim' default _trimmed_<N>; kind:'sew' default _sewn_<N>; kind:'draft' default _drafted_<N>)."}, 'neutral_plane': {'type': 'string', 'description': "kind:'draft' â\x80\x94 parting-line face (the plane where drafted faces remain fixed). Defaults to `face` if omitted."}, 'shape_binding': {'type': 'string', 'description': "kind:'draft' â\x80\x94 JS variable name of the Shape to taper (must be declared in source)."}, 'curve_bindings': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 4, 'minItems': 4, 'description': "kind:'boundary' â\x80\x94 tuple of 4 existing Curve3D variable names (bottom, right, top, left) declared earlier in the source."}, 'require_closed': {'type': 'boolean', 'description': "kind:'sew' â\x80\x94 when true the lowerer emits feature.surface-sew.open-shell if the stitched result is not a watertight solid."}, 'surface_binding': {'type': 'string', 'description': "kind:'trim' â\x80\x94 JS variable name of the Surface to trim/split (must be declared in source)."}, 'surface_bindings': {'type': 'array', 'items': {'type': 'string'}, 'minItems': 1, 'description': "kind:'sew' â\x80\x94 JS variable names of the surfaces to stitch into a solid (each must be declared in source)."}, 'section_sketch_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': "kind:'nurbs' â\x80\x94 existing sketch FeatureIds (2 or more) to skin a surface through, in order."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['mode', 'code'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'face': {'type': 'string', 'description': "mode:'emboss' â\x80\x94 target face â\x80\x94 canonical name ('top'/'bottom'/'left'/'right'/'front'/'back') or label."}, 'font': {'type': 'string', 'description': "mode:'sketch' â\x80\x94 optional logical font name or .ttf file path; defaults to bundled Liberation Sans."}, 'mode': {'enum': ['sketch', 'emboss'], 'type': 'string', 'description': 'Which text-authoring path to use.'}, 'size': {'type': 'number', 'description': "mode:'sketch'|'emboss' â\x80\x94 glyph cap height in mm (positive finite)."}, 'align': {'enum': ['left', 'center', 'right'], 'type': 'string', 'description': "mode:'sketch' â\x80\x94 horizontal alignment relative to position (default left); mode:'emboss' â\x80\x94 relative to the UV anchor (default center)."}, 'depth': {'type': 'number', 'description': "mode:'emboss' â\x80\x94 signed extrusion depth in mm: positive emboss out, negative engrave in. Must be non-zero."}, 'bindAs': {'type': 'string', 'description': "mode:'sketch' â\x80\x94 emits `const <bindAs> = sketch.text(...)`; mode:'emboss' â\x80\x94 emits `const <bindAs> = <target>.embossText(...);`."}, 'target': {'type': 'string', 'description': "mode:'emboss' â\x80\x94 variable name of the Shape to chain onto (inserted verbatim)."}, 'anchorU': {'type': 'number', 'description': "mode:'emboss' â\x80\x94 U anchor in [0, 1] face-local (0=umin, 0.5=centre, 1=umax). Default 0.5."}, 'anchorV': {'type': 'number', 'description': "mode:'emboss' â\x80\x94 V anchor in [0, 1] face-local. Default 0.5."}, 'content': {'type': 'string', 'description': "mode:'sketch' â\x80\x94 text content (UTF-8, non-empty, non-whitespace)."}, 'position': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 2, 'minItems': 2, 'description': "mode:'sketch' â\x80\x94 [x, y] anchor in mm. Default [0, 0]."}, 'rotation': {'type': 'number', 'description': "mode:'sketch' â\x80\x94 CCW rotation in degrees around position (default 0); mode:'emboss' â\x80\x94 CCW rotation in the face tangent plane (default 0)."}, 'scaleMode': {'enum': ['original', 'native', 'bounds'], 'type': 'string', 'description': "mode:'emboss' â\x80\x94 Drawing.sketchOnFace scaling mode. Default original."}, 'fontFamily': {'type': 'string', 'description': "mode:'emboss' â\x80\x94 optional logical font name or .ttf file path; defaults to bundled Liberation Sans."}, 'textContent': {'type': 'string', 'description': "mode:'emboss' â\x80\x94 text content (UTF-8, non-empty, non-whitespace)."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'spine_binding', 'sections'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'closed': {'type': 'boolean', 'description': 'Optional closed-sweep flag.'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['t', 'profile_binding'], 'properties': {'t': {'type': 'number', 'description': 'Spine parameter in [0, 1].'}, 'profile_binding': {'type': 'string', 'description': 'Existing Sketch variable name for this section.'}}}, 'description': 'Varying cross-sections along the spine; at least 2 entries, strictly increasing in `t`, first t=0, last t=1.'}, 'continuity': {'enum': ['C0', 'C1', 'C2'], 'type': 'string', 'description': "Inter-section continuity; default 'C1'."}, 'binding_name': {'type': 'string', 'description': 'JS const name for the new Shape binding (default: _sweep_<N>).'}, 'spine_binding': {'type': 'string', 'description': 'Existing variable name for a Curve3D / Sketch / Vec3[] declared earlier in the source.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'assembly_binding', 'connector_ref', 'reachable'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'reachable': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}, 'description': 'World-frame Vec3 targets the connector must be able to reach.'}, 'toleranceMm': {'type': 'number', 'description': 'Optional non-negative tolerance in mm.'}, 'connector_ref': {'type': 'string', 'description': 'Connector ref "<partName>.<connectorName>".'}, 'assembly_binding': {'type': 'string', 'description': 'JS identifier bound to assembly(...).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['file'], 'properties': {'fps': {'type': 'number', 'description': "Override the animationView record's fps."}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script with an animationView({...}) record (any script in turntable mode). Required (no inline { code } mode). Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'hide': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Hide matching feature ids / assembly part names in the rendered frames. Mutually exclusive with focus. Render-only; does not affect pose verification.'}, 'focus': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Show only matching feature ids / assembly part names in the rendered frames. Mutually exclusive with hide. Render-only; does not affect pose verification.'}, 'width': {'type': 'integer', 'maximum': 2048, 'minimum': 64, 'description': 'Turntable frame width in px (default 1080; even for MP4).'}, 'height': {'type': 'integer', 'maximum': 2048, 'minimum': 64, 'description': 'Turntable frame height in px (default 1080; even for MP4).'}, 'preset': {'enum': ['default', 'publish'], 'type': 'string', 'description': "Turntable look: 'publish' (default; studio product shot) or 'default' (engineering look)."}, 'shadow': {'type': 'boolean', 'description': 'Turntable + publish: soft contact shadow under the model (default true).'}, 'no_verify': {'type': 'boolean', 'default': False, 'description': 'Skip the animation-pose interference verification (default: verify on).'}, 'turntable': {'type': 'boolean', 'default': False, 'description': 'Seamless 360° orbit of the model instead of the animationView timeline.'}, 'background': {'type': 'string', 'description': "Turntable + publish: 'white' (default), 'light', 'dark', 'black', '#rrggbb', or 'transparent' (frames_dir only â\x80\x94 MP4/GIF have no usable alpha)."}, 'frames_dir': {'type': 'string', 'description': 'PNG-sequence mode directory: write frame-0000.png... and skip ffmpeg. Mutually exclusive with output_path.'}, 'duration_ms': {'type': 'number', 'maximum': 60000, 'minimum': 500, 'description': 'Turntable: one full revolution in ms (default 6000).'}, 'environment': {'type': 'string', 'description': "Turntable: HDRI environment override ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse', a URL, or 'none')."}, 'output_path': {'type': 'string', 'description': 'MP4 output path (.gif â\x86\x92 looping GIF); default <scriptDir>/<basename>-animation.mp4 (-turntable.mp4 in turntable mode). Mutually exclusive with frames_dir.'}, 'verify_every': {'type': 'integer', 'minimum': 1, 'description': 'Additionally verify at every n-th frame time of the fps schedule (unioned with the keyframe sample set).'}, 'elevation_deg': {'type': 'number', 'maximum': 89, 'minimum': -89, 'description': 'Turntable: camera elevation above the horizon in degrees (default 22).'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'diagnostics'], 'properties': {'ok': {'type': 'boolean'}, 'fps': {'type': 'number'}, 'error': {'type': 'string'}, 'verified': {'type': 'boolean', 'description': 'Whether pose-interference verification passed.'}, 'errorCode': {'type': 'string'}, 'errorHint': {'type': 'string'}, 'collisions': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Colliding poses { t_ms, a, b, volume_mm3 }.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'duration_ms': {'type': 'number'}, 'frame_count': {'type': 'number'}, 'output_path': {'type': 'string', 'description': 'Written MP4 path (MP4 mode).'}, 'failure_kind': {'type': 'string'}, 'verify_skipped': {'type': 'boolean'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['goal', 'attempts'], 'properties': {'goal': {'type': 'string', 'description': 'Original user design goal. Fed into every review_cad repair prompt.'}, 'assembly': {'type': 'string'}, 'attempts': {'type': 'array', 'items': {'type': 'object', 'anyOf': [{'required': ['file']}, {'required': ['code']}], 'properties': {'id': {'type': 'string'}, 'code': {'type': 'string', 'description': 'Inline kernelCAD script source. Provide file or code.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script on disk. Provide file or code.'}, 'title': {'type': 'string'}, 'visualReview': {'type': 'object', 'required': ['accepted', 'findings'], 'properties': {'checks': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'passed', 'finding'], 'properties': {'code': {'type': 'string'}, 'passed': {'type': 'boolean'}, 'finding': {'type': 'string'}, 'screenshotPath': {'type': 'string'}}}, 'description': 'Required checklist entries: main-object-count, proportions-match-reference, required-visible-features, no-stray-or-floating-geometry, attachment-plausibility, semantic-orientation-alignment, device-depth-and-construction, canonical-views-physically-coherent.'}, 'accepted': {'type': 'boolean'}, 'findings': {'type': 'array', 'items': {'type': 'string'}}, 'screenshotPath': {'type': 'string'}}, 'description': 'Optional. Evidence from the reviewing agent after rendering/opening screenshots. Accepted reviews must include screenshotPath, concrete findings, and all required checks passing.'}}}, 'description': 'Ordered design attempts. Each item is { id?, title?, file? OR code?, visualReview? } â\x80\x94 provide file or code (at least one). File attempts can be replayed by Studio build records.'}, 'consensus': {'type': 'boolean', 'description': 'Best-of-N by geometric consensus. When true, attempts are N independent candidates for the SAME goal (not a repair sequence): all are reviewed (stopOnPass ignored), all scripts are executed, candidates without a valid solid are dropped, and the candidate whose geometry agrees most with the others (medoid by symmetric Chamfer distance, same model frame) is selected. Ties go to more gates passed, then the shorter script. Returns consensus { chosenIndex, chosenAttemptId, scores, distances, reason }; ok / finalAttemptId / nextActionPrompt describe the selected candidate. Default false.'}, 'autoRevise': {'type': 'boolean', 'description': 'When true (default), failing attempts with repairable feature diagnostics (boolean miss, oversized fillet, â\x80¦) run bounded repair_script and attach revisionAssist.suggestedPatches / autoApplied.suggestedCode. Set false to skip the extra repair pass (hints-only). Does not autonomously rewrite full CAD models.'}, 'epsilonMm3': {'type': 'number', 'description': 'Forwarded to review_cad.'}, 'stopOnPass': {'type': 'boolean', 'description': 'Stop after the first attempt that is functional and passes the quality gate. Default true.'}, 'recordTitle': {'type': 'string', 'description': 'Optional title for the build record.'}, 'bodyLikeness': {'type': 'object', 'properties': {'wheels': {'type': 'array', 'items': {'type': 'object'}}, 'body_bbox': {'type': 'object'}, 'cabin_bbox': {'type': 'object'}, 'length_axis': {'enum': ['x', 'y'], 'type': 'string'}, 'require_stills': {'type': 'boolean'}, 'still_verdicts': {'type': 'array', 'items': {'type': 'object'}}}, 'description': 'When likenessProfile=automotive: body_bbox (required for gate), wheels, cabin_bbox, still_verdicts. Missing body_bbox fails with reference.likeness.gate-required. Stills may also come from visualReview.checks.'}, 'combinatorial': {'type': 'boolean', 'description': 'Sample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false.'}, 'samplesPerMate': {'type': 'integer', 'minimum': 1, 'description': 'Pose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate.'}, 'gripperAperture': {'type': 'object', 'description': 'Optional gripper aperture request forwarded to review_cad.'}, 'likenessProfile': {'enum': ['automotive'], 'type': 'string', 'description': "When 'automotive', require organic-body still checks on visualReview AND the body-likeness publish gate (pass bodyLikeness or stills on checks). Attempts stay non-ok until publishReady. Final open_in_studio must pass likeness_profile:'automotive' (server hard-gates success)."}, 'trackConnectors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Connector refs to track across sampled poses.'}, 'outputRecordPath': {'type': 'string', 'description': 'Optional JSON path to write a Studio-compatible build record.'}, 'preserveInterfaces': {'type': 'array', 'items': {'type': 'string'}, 'description': 'External mates, connector refs, part names, or behavioral interfaces the agent must preserve between attempts.'}, 'allowReviewWarnings': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Warning diagnostic codes the original prompt explicitly allows. Other review warnings keep the loop iterating even if review_cad is functionally ok.'}, 'includeInterference': {'type': 'boolean', 'description': 'Forwarded to review_cad. Default true.'}, 'includePoseEnvelope': {'type': 'boolean', 'description': 'Forwarded to review_cad. Default true.'}, 'requireVisualReview': {'type': 'boolean', 'description': 'Require screenshot-backed visualReview with structured checks before accepting an attempt. Default true; set false only for explicit non-visual batch checks.'}, 'requirePhysicalAcceptance': {'type': 'boolean', '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': 'object', 'required': ['ok', 'goal', 'attempts'], 'properties': {'ok': {'type': 'boolean'}, 'goal': {'type': 'string', 'description': 'Echoed design goal.'}, 'record': {'type': 'object', 'description': 'Studio-compatible build record (when requested).', 'additionalProperties': True}, 'attempts': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Per-attempt review results (includes revisionAssist when failed).'}, 'recordUrl': {'type': 'string'}, 'convergence': {'type': 'object', 'description': 'Present when trailing failures share a signature (escalate).', 'additionalProperties': True}, 'finalAttemptId': {'type': 'string'}, 'revisionAssist': {'type': 'object', 'description': 'Structured revision assist from the last failing attempt: hints, suggestedPatches (AST diffs), optional autoApplied.suggestedCode when repair_script cleared a repairable diagnostic. Honest scope â\x80\x94 not full autonomous CAD rewrite.', 'additionalProperties': True}, 'nextActionPrompt': {'type': 'string'}, 'outputRecordPath': {'type': 'string'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Revised script â\x80\x94 inline source. Mutually exclusive with params.'}, 'file': {'type': 'string', 'description': 'Revised script â\x80\x94 path to a .kcad.ts file. Mutually exclusive with params. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'params': {'type': 'object', 'description': 'Param-override mode: re-lower the BASELINE with these declared param() values changed (e.g. { plateThickness: 8 }). Mutually exclusive with file/code. A name the baseline does not declare fails with the declared-param list in the message.', 'additionalProperties': True}, 'render': {'type': 'boolean', 'description': 'Also render an overlay PNG â\x80\x94 added material green, removed material red â\x80\x94 via the render_preview pipeline. Off by default; the numeric table is the agent-facing evidence.'}, 'out_dir': {'type': 'string', 'description': 'Directory for the overlay PNG, its STL inputs, and the generated overlay script. Default: a temp dir.'}, 'baseCode': {'type': 'string', 'description': 'Baseline script â\x80\x94 inline source.'}, 'baseFile': {'type': 'string', 'description': 'Baseline script â\x80\x94 path to a .kcad.ts file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'base': {'type': 'object', 'description': 'Baseline summary { featureCount, bodyCount, isAssembly } (success).', 'additionalProperties': True}, 'side': {'type': 'string', 'description': "Which side failed ('base' | 'revised') (failure)."}, 'error': {'type': 'string', 'description': 'Failure message (failure).'}, 'bodies': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'verdict', 'addedMm3', 'removedMm3', 'commonMm3'], 'properties': {'bbox': {'type': 'object', 'description': 'Exact bbox both sides plus min/max/extent deltas (mm).', 'additionalProperties': True}, 'name': {'type': 'string'}, 'verdict': {'enum': ['identical', 'moved', 'resized', 'topology-changed'], 'type': 'string', 'description': 'The field to branch on. Precedence: topology-changed > resized > moved > identical.'}, 'addedMm3': {'type': 'number', 'description': 'volume(revised â\x88\x92 base) â\x80\x94 material that appeared.'}, 'baseName': {'type': 'string'}, 'commonMm3': {'type': 'number', 'description': 'volume(base â\x88© revised) â\x80\x94 material that stayed put.'}, 'edgeCount': {'type': 'object', 'description': '{ base, revised, delta } BREP edge count.', 'additionalProperties': True}, 'faceCount': {'type': 'object', 'description': '{ base, revised, delta } BREP face count.', 'additionalProperties': True}, 'holeCount': {'type': 'object', 'description': '{ base, revised, delta } cylindrical-hole count.', 'additionalProperties': True}, 'matchedBy': {'enum': ['name', 'position'], 'type': 'string', 'description': 'How this pair was established.'}, 'volumeMm3': {'type': 'object', 'description': '{ base, revised, delta } in mm³.', 'additionalProperties': True}, 'removedMm3': {'type': 'number', 'description': 'volume(base â\x88\x92 revised) â\x80\x94 material that vanished.'}, 'revisedName': {'type': 'string'}, 'maxDeviationMm': {'type': 'number', 'description': 'Two-sided discrete Hausdorff distance between the two surfaces.'}}, 'additionalProperties': True}, 'description': 'Per matched body, the material-level delta (success).'}, 'render': {'type': 'object', 'description': 'Overlay result when render: true â\x80\x94 { ok, images, out_dir, script_path, error? }.', 'additionalProperties': True}, 'revised': {'type': 'object', 'description': 'Revision summary { featureCount, bodyCount, isAssembly } (success).', 'additionalProperties': True}, 'summary': {'type': 'object', 'description': 'Verdict counts plus totalAddedMm3 / totalRemovedMm3 / maxDeviationMm.', 'additionalProperties': True}, 'errorCode': {'type': 'string'}, 'unmatched': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Bodies present on only one side; each also raises diff.body.unmatched.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Revised script â\x80\x94 inline source.'}, 'file': {'type': 'string', 'description': 'Revised script â\x80\x94 path to a .kcad.ts file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'baseCode': {'type': 'string', 'description': 'Baseline script â\x80\x94 inline source.'}, 'baseFile': {'type': 'string', 'description': 'Baseline script â\x80\x94 path to a .kcad.ts file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'base': {'type': 'object', 'description': 'Baseline summary { featureCount, partCount, isAssembly } (success).', 'additionalProperties': True}, 'side': {'type': 'string', 'description': "Which side failed ('base' | 'revised') (failure)."}, 'error': {'type': 'string', 'description': 'Failure message (failure).'}, 'mates': {'type': 'object', 'description': 'Mate-graph changes (success).', 'additionalProperties': True}, 'parts': {'type': 'object', 'description': 'Per-part added/removed/renamed/changed/unchanged (success).', 'additionalProperties': True}, 'params': {'type': 'object', 'description': 'Param value/min/max changes (success).', 'additionalProperties': True}, 'revised': {'type': 'object', 'description': 'Revision summary { featureCount, partCount, isAssembly } (success).', 'additionalProperties': True}, 'errorCode': {'type': 'string'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'interference': {'type': 'object', 'description': 'Total interference-volume delta + per-pair detail (success).', 'additionalProperties': True}, 'deeperDiffAvailable': {'type': 'object', 'description': "Present when the diff touched geometry-affecting ops: { tool: 'diff_geometry', reason, bodies } â\x80\x94 the same two scripts can be compared at material level (added/removed/common volume + per-body verdict).", 'additionalProperties': True}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'out': {'type': 'string', 'description': 'Write the emitted script here (a .kcad.ts path); the ledger is written beside it as <stem>.ledger.json.'}, 'page': {'type': 'integer', 'minimum': 1, 'description': '1-based page to read. Default 1.'}, 'path': {'type': 'string', 'description': 'Path to the drawing PDF on the machine running kernelCAD.'}, 'verify': {'type': 'boolean', 'description': 'Evaluate the rebuilt part and compare it with the drawing. Default true.'}, 'pdfBase64': {'type': 'string', 'description': 'The PDF inline, base64-encoded. Use this instead of `path` against a hosted kernelCAD server.'}, 'projection': {'enum': ['third-angle', 'first-angle'], 'type': 'string', 'description': 'Override the projection angle read from the sheet (default: projection symbol or note, else third-angle).'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'views', 'params', 'ledger', 'diagnostics'], 'properties': {'ok': {'type': 'boolean'}, 'page': {'type': 'integer'}, 'sheet': {'type': 'object', 'description': '{ widthMm, heightMm, scale: { text, sheetPerModel, source }, units, projection } read off the sheet.', 'additionalProperties': True}, 'views': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Identified orthographic views: { name, bboxMm, identifiedBy, label? }.'}, 'ledger': {'type': 'object', 'description': 'Assumption ledger: { facts, unresolvedCount }; facts are visible / inferred / assumed / missing, disagreements recorded on the fact.', 'additionalProperties': True}, 'params': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Role-named params declared by the script: { name, value, description }.'}, 'script': {'type': 'string', 'description': 'The emitted .kcad.ts source.'}, 'fidelity': {'type': 'object', 'description': '{ verdict: match | partial | mismatch | failed, extents, holes, silhouettes, reasons } from evaluating and re-projecting the script.', 'additionalProperties': True}, 'pageCount': {'type': 'integer'}, 'ledgerPath': {'type': 'string', 'description': 'Where the ledger was written (when `out` was given); pass it to resolve_assumptions.'}, 'scriptPath': {'type': 'string', 'description': 'Where the script was written (when `out` was given).'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'reconstruction': {'type': 'object', 'description': '{ kind: extrude | revolve, profileView, axis, holeCount, extents }.', 'additionalProperties': True}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'dryRun': {'type': 'boolean', 'description': 'Fast validation only: skip OCCT lowering, DFM gates, and meshing. Does not set or clear the active session.'}, 'skipMechanismCheck': {'type': 'boolean', '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': 'object', 'required': ['ok', 'featureCount', 'diagnostics'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the script compiled and lowered cleanly.'}, 'parts': {'type': 'object', 'description': 'Assembly parts summary { count, names } when the scene is assembly-built.', 'additionalProperties': True}, 'dryRun': {'type': 'boolean', 'description': 'True when the result came from a fast dry run.'}, 'mechanism': {'enum': ['real', 'broken', 'unverified'], 'type': 'string', '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."}, 'reviewHint': {'type': 'string', 'description': 'Present only when a captured assembly declares articulated (non-fastened) mates: the default mechanism check is shallow (no joint-support intents, pose-envelope overlap at declared limits, or gravity drop) â\x80\x94 run review_cad for pose-envelope + gravity checks.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'featureCount': {'type': 'number', 'description': 'Number of features captured by the script.'}, 'featureHealth': {'type': 'array', 'items': {'type': 'object', 'required': ['featureId', 'status'], 'properties': {'status': {'enum': ['warning', 'error'], 'type': 'string'}, 'featureId': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Per-feature health degradations â\x80\x94 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.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['fieldName', 'point'], 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'point': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Sample point [x, y, z] in mm.'}, 'fieldName': {'type': 'string', 'description': 'sdf.bind binding name holding the SdfField.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'aabb': {'type': 'object', 'description': 'Axis-aligned bounding box of the field (success).', 'additionalProperties': True}, 'hint': {'type': 'string'}, 'kind': {'type': 'string', 'description': 'SDF field kind (success).'}, 'error': {'type': 'string'}, 'inside': {'type': 'boolean', 'description': 'Whether the point is inside the surface (success).'}, 'distance': {'type': 'number', 'description': 'Signed distance in mm; negative = inside (success).'}, 'errorCode': {'type': 'string'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Cookbook snippet id (e.g. gt2-timing-belt-drive, extrude-rounded-rect-plate).'}, 'query': {'type': 'string', 'description': 'When id is omitted: natural-language query; BM25 picks the top hit (same as lookup_cookbook).'}, 'dryRun': {'type': 'boolean', 'default': False, 'description': 'Default false. dryRun:true is NOT evidence the cookbook builds under OCCT â\x80\x94 capture-only checks; do not claim success or open Studio from a dry run alone.'}, 'openInStudio': {'type': 'boolean', 'default': False, 'description': 'Default false. When true, after a green full (non-dryRun) evaluate, call open_in_studio on the same script (hosted MCP).'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'executionId'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string', 'description': 'Snippet body used for evaluate / Studio.'}, 'error': {'type': 'string'}, 'stage': {'type': 'string', 'description': "'resolve' | 'evaluate' | 'open_in_studio' on failure."}, 'title': {'type': 'string', 'description': 'Resolved cookbook title.'}, 'evaluate': {'type': 'object', 'description': 'Full evaluate_script result (same shape).', 'additionalProperties': True}, 'cookbookId': {'type': 'string', 'description': 'Resolved cookbook snippet id.'}, 'executionId': {'type': 'string', 'description': 'Short id for logs / correlation.'}, 'openInStudio': {'type': 'object', 'description': 'open_in_studio result when openInStudio was requested.', 'additionalProperties': True}, 'dryRunNotEvidence': {'type': 'boolean', 'description': 'Present when dryRun:true â\x80\x94 dryRun success is NOT evidence of a real OCCT build.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['target'], 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'part': {'type': 'string', 'description': "target:'part' â\x80\x94 part name for single-part export, or 'all'."}, 'format': {'enum': ['stl', 'step', 'dxf', '3mf', 'glb', 'svg-drawing', 'pdf-drawing', 'urdf', 'srdf', 'sdf-gazebo', 'usd-isaac', 'bom-csv', 'bom-json'], 'type': 'string', 'description': "target:'model' â\x80\x94 output file format (required for that target)."}, 'target': {'enum': ['model', 'part'], 'type': 'string', 'description': "Which exporter to run: 'model' (whole-script geometry to one file) or 'part' (per-part STLs from a solved assembly)."}, 'options': {'type': 'object', 'description': 'target:\'model\' â\x80\x94 optional per-format options bag. Discriminator options.format must equal top-level format. dxf: { layers?, unit?: "mm"|"cm"|"in", tolerance?, section?: { axis: "x"|"y"|"z", at: mm }, layout?: "per-part"|"sheet" }. 3mf: { printUnit?: "mm"|"cm"|"in", embedSource?, arrange?: "none"|"plate"|"assembled", orient?: boolean, slicer?: "generic"|"bambu"|"orca"|"prusa", printer?: printer profile id, one of "generic-fdm"|"bambu-a1-mini"|"bambu-a1"|"bambu-p1s"|"bambu-p1p"|"bambu-x1c"|"bambu-x1e"|"bambu-h2d"|"bambu-h2s"|"prusa-mini-plus"|"prusa-mk4s"|"prusa-core-one"|"prusa-xl"|"creality-ender-3-v3"|"creality-k1"|"creality-k1-max"|"creality-k2-plus"|"elegoo-neptune-4-pro"|"anycubic-kobra-3"|"voron-2.4-250"|"voron-2.4-300"|"voron-2.4-350"|"ultimaker-s5" (default "generic-fdm"; sets the bed for arrange and the slicer default; an unknown id is refused with the valid list; CLI: kernelcad print printers) }; parts that do not fit the bed are still written and reported as warn diagnostics export.3mf.plate-overflow / export.3mf.exceeds-bed, whose hint names the smallest profiles the layout fits on. glb: { axis?: "y-up"|"z-up", draco?: false }. svg-drawing: { sheet?: "a4"|"a3" (or any pdf-drawing sheet), projection?, titleBlock?: { title?, partName?, material?, revision? }, 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. pdf-drawing: { sheet?: "a4"|"a3"|"a2"|"a1"|"a0"|"ansi-a"|"ansi-b"|"ansi-c"|"ansi-d"|"ansi-e"|"auto"|"auto-ansi" (default "a3"), projection?: "third"|"first", title?, partName?, material?, revision?, date? (default today), modelName?, annotations?, sections?, exploded?, balloons?, partsList?, autoAnnotate? (default true unless annotations are given) } â\x80\x94 the svg-drawing keys mean the same. svg-drawing and pdf-drawing also take style?: "mechanical" (default, the part sheet) | "architectural" (a floor plan for a building or room model: section about 1 m above the floor with filled cut walls, wall / opening chain dimensions and overall sizes, room labels with net area, scale bar, north arrow; millimetres, or feet-inches when the model is in whole feet / inches) and plan?: { units?: "metric"|"imperial", cutHeight?: mm above the floor, rooms?: [{ name, at: [x, y] }], northDeg?: degrees clockwise from sheet up }. A building-sized model drawn in the default style gets a drawing.style.architectural-suggested warning.'}, 'no_verify': {'type': 'boolean', 'default': False, 'description': 'Skip the STL watertight verify gate.'}, 'feature_id': {'type': 'string', 'description': "target:'model' â\x80\x94 optional FeatureId to export; defaults to last."}, 'output_dir': {'type': 'string', 'description': "target:'part' â\x80\x94 destination directory (all-parts mode); files are <dir>/<part>.stl. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link."}, 'output_path': {'type': 'string', 'description': "Destination path. target:'model' â\x80\x94 the export file (required). target:'part' â\x80\x94 single-part .stl path. Hosted server: only the file name is used; the file is written to a server-owned directory and returned as a download link."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'format': {'type': 'string'}, 'written': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': "target:'part' â\x80\x94 per-part export records."}, 'byte_count': {'type': 'number', 'description': "target:'model' â\x80\x94 file size in bytes."}, 'mesh_files': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Per-link mesh files: meshes/<part>.stl for urdf/sdf-gazebo, meshes/<part>.usda mesh layers for usd-isaac.'}, 'part_files': {'type': 'array', 'items': {'type': 'string'}, 'description': "Per-part DXF files: parts/<part>.dxf for a multi-part dxf export (layout 'per-part', the default)."}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'output_path': {'type': 'string', 'description': "target:'model' â\x80\x94 written file path."}, 'feature_count': {'type': 'number'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'output_dir': {'type': 'string', 'description': 'Directory a previous run_fea wrote to; omit for toolchain status + material table only.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'toolchain', 'materials', 'material_names'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'summary': {'type': 'object', 'description': 'Stored summary of a previous run_fea in output_dir, when present.', 'additionalProperties': True}, 'errorCode': {'type': 'string'}, 'materials': {'type': 'object', 'description': 'Named grade -> { E (MPa), nu, yield (MPa) }.', 'additionalProperties': True}, 'toolchain': {'type': 'object', 'description': '{ available, ccx?, gmshVersion?, missing[], hint? } â\x80\x94 whether a study can run here and how to fix it if not.', 'additionalProperties': True}, 'material_names': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Accepted material grade names.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'id': {'type': 'string'}, 'query': {'type': 'string'}, 'family': {'type': 'string'}, 'category': {'type': 'string'}, 'standard': {'type': 'string'}, 'partsBaseUrl': {'type': 'string', 'description': 'Opt-in remote endpoint; no default value ships with kernelCAD.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'url': {'type': 'string', 'description': 'Outbound vendor URL (link_out). May carry a referral tag; see disclosure.'}, 'kind': {'type': 'string', 'description': "'link_out' when the URL is a vendor configurator the agent must drive by hand."}, 'error': {'type': 'string'}, 'record': {'type': 'object', 'description': 'Resolved part record (success).', 'additionalProperties': True}, 'sha256': {'type': 'string', 'description': 'SHA-256 fingerprint of the STEP file (success).'}, 'source': {'type': 'string', 'description': "Where the part came from ('local' | 'remote') (success)."}, 'cachePath': {'type': 'string', 'description': 'Local cache path of the written STEP file (success).'}, 'errorCode': {'type': 'string'}, 'errorHint': {'type': 'string'}, 'disclosure': {'type': 'string', 'description': 'Referral disclosure. Present only when url carries a referral tag; show it with the link.'}, 'instruction': {'type': 'string', 'description': 'What to do with the link_out URL.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'tag': {'type': 'string'}, 'limit': {'type': 'number'}, 'query': {'type': 'string'}, 'family': {'type': 'string'}, 'source': {'enum': ['local', 'remote', 'auto'], 'type': 'string'}, 'category': {'type': 'string'}, 'standard': {'type': 'string'}, 'partsBaseUrl': {'type': 'string', 'description': 'Opt-in remote endpoint; no default value ships with kernelCAD.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'source': {'type': 'string', 'description': "Where results came from ('local' | 'remote') (success)."}, 'results': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Matching part records (success).'}, 'errorCode': {'type': 'string'}, 'errorHint': {'type': 'string'}, 'totalMatches': {'type': 'number', 'description': 'Total matches before limiting (success).'}, 'remoteEnabled': {'type': 'boolean', 'description': 'Whether the remote tier was queried (success).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string'}, 'file': {'type': 'string', 'description': 'Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'featureId': {'type': 'string'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'diagnostics'], 'properties': {'ok': {'type': 'boolean'}, 'region': {'type': 'object', 'description': 'Unfolded flat-pattern Region (outer polyline + holes + bend lines + plane).', 'additionalProperties': True}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'minLength': 1, 'description': 'Project slug from open_in_studio/get_project/a /p/<slug> link. The slug is the capability â\x80\x94 public/unlisted projects need no OAuth; private projects require the owner to be signed in.'}, 'view': {'enum': ['all', 'iso', 'front', 'back', 'left', 'right', 'top'], 'type': 'string', 'description': 'View to render. Default "all" = a labeled contact sheet of every canonical angle (iso/front/back/left/right/top) â\x80\x94 best for judging the whole model. Pass a single view name for one large render of that angle.'}, 'paths_only': {'type': 'boolean', '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).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'properties': {'ok': {'type': 'boolean', 'description': 'Whether a render was produced.'}, 'hint': {'type': 'string', 'description': 'Next-action hint when ok is false.'}, 'view': {'type': 'string', 'description': 'The view that was rendered (when ok).'}, 'bytes': {'type': 'number', 'description': 'PNG byte length (when ok).'}, 'error': {'type': 'string', 'description': 'Error code when ok is false (e.g. "empty_geometry", "mesh_failed", "mesh_timeout").'}, 'width': {'type': 'number', 'description': 'Rendered image edge in px (when ok).'}, 'height': {'type': 'number', 'description': 'Rendered image edge in px (when ok).'}, 'image_b64': {'type': 'string', 'description': 'Base64-encoded PNG bytes, present when inlined (paths_only=false) and under the size cap.'}, 'truncated': {'type': 'boolean', 'description': 'Set when inline was requested but the PNG exceeded the size cap.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'minLength': 1, 'description': 'Project slug from open_in_studio/get_project.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'slug': {'type': 'string', 'minLength': 1, 'description': "The project slug from a listing or a /p/<slug> Studio link. Omit to list the signed-in user's saved projects."}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the read succeeded.'}, 'url': {'type': 'string', 'description': 'Fetch mode: revision-pinned /p/<slug>?version= link.'}, 'code': {'type': 'string', 'description': 'Fetch mode: the full .kcad source.'}, 'slug': {'type': 'string', 'description': 'Fetch mode: the project slug.'}, 'title': {'type': 'string', 'description': 'Fetch mode: the project title.'}, 'assets': {'type': 'object', 'description': 'Complementary files keyed by source-relative path.', 'additionalProperties': True}, 'meshUrl': {'type': 'string', 'description': 'Fetch mode: revision-matched mesh artifact URL when available â\x80\x94 FunnelViewer loads it instead of re-executing CAD. When meshStatus is building, this is the expected CDN URL (retry until ready).'}, 'privacy': {'type': 'string', 'description': 'Fetch mode: the project privacy.'}, 'version': {'type': 'number', 'description': 'Fetch mode: the project version.'}, 'embedUrl': {'type': 'string', 'description': 'Fetch mode: revision-pinned chrome-free /embed/<slug>?revision= viewer URL (includes meshUrl when available).'}, 'meshHint': {'type': 'string', 'description': 'Fetch mode: when meshStatus=building â\x80\x94 transient; poll again or re-open_in_studio; never imply permanent 404.'}, 'projects': {'type': 'array', 'items': {}, 'description': "List mode (no slug): the user's saved projects."}, 'meshError': {'type': 'string', 'description': 'Fetch mode: sanitized repair/persist error when meshStatus is failed.'}, 'meshReady': {'type': 'boolean', 'description': 'Fetch mode: true only when meshStatus===ready.'}, 'paintHint': {'type': 'string'}, 'meshStatus': {'type': 'string', 'description': 'Fetch mode: ready | building | failed | missing â\x80\x94 explicit CDN artifact state (never silently omit meshUrl under CDN mode).'}, 'parameters': {'type': 'array', 'items': {}, 'description': "Fetch mode: the model's editable parameters."}, 'updated_at': {'type': 'string', 'description': 'Fetch mode: last-updated timestamp.'}, 'serverBuild': {'type': 'string', 'description': 'Deploy identity (package+git SHA@boot time) so connector lag is observable.'}, 'projectSaved': {'type': 'boolean', 'description': 'Fetch mode: true when the project was loaded.'}, 'viewerPainted': {'type': 'boolean', 'description': 'Always false on tools/call; widget sets true after correlated model_displayed.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['slug', 'version'], 'properties': {'slug': {'type': 'string', 'minLength': 1, 'description': 'Project slug returned by open_in_studio.'}, 'version': {'type': 'integer', 'minimum': 1, 'description': 'Positive immutable revision version returned by open_in_studio.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['ok', 'slug', 'version', 'code', 'parameters'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the revision was found and readable.'}, 'code': {'type': 'string', 'description': 'Exact .kcad source captured at this revision.'}, 'slug': {'type': 'string', 'description': 'Project slug.'}, 'assets': {'type': 'object', 'description': 'Immutable complementary-file manifest.', 'additionalProperties': True}, 'version': {'type': 'integer', 'minimum': 1, 'description': 'Immutable revision version.'}, 'parameters': {'type': 'array', 'items': {}, 'description': 'Exact editable parameters captured at this revision.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', 'required': ['of'], 'properties': {'at': {'type': 'number', 'description': "of:'section' â\x80\x94 single slice position along `axis` (mm)."}, 'of': {'enum': ['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'], 'type': 'string', 'description': 'Which facts to read.'}, 'axis': {'enum': ['x', 'y', 'z'], 'type': 'string', 'description': "of:'section' â\x80\x94 normal axis for `at` / `stack` (default 'z')."}, 'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'edges': {'description': "of:'continuity' â\x80\x94 optional EdgeQuery or @kc[...] ref(s) limiting which shared edges are sampled."}, 'faces': {'description': "of:'curvature' â\x80\x94 optional FaceQuery or @kc[...] ref(s) limiting which faces are sampled."}, 'plane': {'type': ['string', 'object'], 'description': "of:'section' â\x80\x94 section plane. Either a cardinal name string 'xy'|'xz'|'yz', { plane: 'xy'|'xz'|'yz', offset? }, or { origin: [x,y,z], normal: [nx,ny,nz] }. Omit to use `at`+`axis`."}, 'query': {'type': 'object', 'description': "of:'edges'|'faces' â\x80\x94 optional EdgeQuery/FaceQuery filter."}, 'stack': {'type': 'object', 'required': ['from', 'to', 'count'], 'properties': {'to': {'type': 'number', 'description': 'End position along the axis (mm).'}, 'axis': {'enum': ['x', 'y', 'z'], 'type': 'string', 'description': "Scan axis (default 'z')."}, 'from': {'type': 'number', 'description': 'Start position along the axis (mm).'}, 'count': {'type': 'integer', 'description': 'Number of evenly spaced slices (>= 1).'}}, 'description': "of:'section' â\x80\x94 dense scan: `count` slices evenly spaced from `from` to `to` along `axis`; response reports minAreaIndex/minAreaPosition."}, 'density': {'type': 'number', 'description': "of:'mass' â\x80\x94 material density in kg/m^3 (steel 7850, aluminium 2700, ABS 1050). Defaults to 1000 (water); the response echoes the value used and flags when it was defaulted."}, 'assembly': {'type': 'string', 'description': "of:'assembly'|'robot'|'bom' â\x80\x94 assembly name; defaults to the first captured assembly."}, 'category': {'type': 'string', 'description': "of:'part-families' â\x80\x94 optional top-level category to filter families by."}, 'face_name': {'enum': ['top', 'bottom', 'left', 'right', 'front', 'back'], 'type': 'string', 'description': "of:'face-edges' â\x80\x94 canonical face name (required for that subject)."}, 'feature_id': {'type': 'string', 'description': "of:'shape'|'mass'|'topology'|'edges'|'faces'|'face-edges'|'face-labels' â\x80\x94 FeatureId; defaults to the last returned shape."}, 'spike_factor': {'type': 'number', 'description': "of:'curvature' â\x80\x94 spike sensitivity as a multiple of the face's Gaussian stddev (default 6)."}, 'gyration_axis': {'type': 'object', 'required': ['origin', 'direction'], 'properties': {'origin': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'A point on the axis, shape-local mm.'}, 'direction': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': 'Axis direction; normalised internally, so it need not be a unit vector.'}}, 'description': "of:'mass' â\x80\x94 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."}}}
출력 스키마
{'type': 'object', 'required': [], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the read succeeded.'}, 'error': {'type': 'string', 'description': 'Failure message (present on failure).'}, 'errorCode': {'type': 'string'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'globals': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'constraints': {'type': 'object', 'additionalProperties': True}, 'sceneMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'shapeMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'edgeQueryKeys': {'type': 'array', 'items': {'type': 'string'}}, 'faceQueryKeys': {'type': 'array', 'items': {'type': 'string'}}, 'sketchMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'curve3dMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'surfaceMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'paramRefMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'shapeListMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'pathBuilderMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'scenePartProperties': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'featureKindFaceLabels': {'type': 'object', 'additionalProperties': True}, 'curve3dAnalyticsMethods': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'query': {'type': 'string', 'description': 'Keywords to search section titles and bodies (e.g. "sweep along helix").'}, 'topic': {'type': 'string', 'description': "Alias of section; also accepts a loose title such as 'materials' or 'cli commands'."}, 'section': {'type': 'string', 'description': "Section id from the index (e.g. 'top-level-functions'), or 'all' for the full SKILL.md."}}}
출력 스키마
{'type': 'object', 'properties': {'uri': {'type': 'string', 'description': 'The authoring-skill resource URI.'}, 'mode': {'type': 'string', 'description': 'index | section | search | all | not-found.'}, 'text': {'type': 'string', 'description': 'The index + quick-start, the requested section(s), or the full SKILL.md body.'}, 'mimeType': {'type': 'string', 'description': 'MIME type of the returned body.'}, 'sections': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Section ids returned in text (section and search modes).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['query'], 'properties': {'k': {'type': 'number', 'default': 3, 'description': 'Max snippets to return. Default 3, max 5.'}, 'query': {'type': 'string', 'description': 'Natural-language description of what you want to do (e.g. "round the rim of a hole", "build an L-bracket").'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'hits': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Top-k matching cookbook snippets, ranked by BM25.'}, 'error': {'type': 'string'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {}}
출력 스키마
{'type': 'object', 'required': ['ok', 'codes'], 'properties': {'ok': {'type': 'boolean'}, 'codes': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'The diagnostic-code catalogue with hint templates.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['source'], 'properties': {'params': {'type': 'object', 'description': 'Optional map of parameter-name â\x86\x92 numeric value, applied as overrides before meshing (stateless slider recompute).', 'additionalProperties': {'type': 'number'}}, 'source': {'type': 'string', 'minLength': 1, 'description': 'The .kcad.ts script source to mesh.'}, 'fileName': {'type': 'string', 'description': 'Optional file-name label used in diagnostics (does not affect geometry).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'properties': {'ok': {'type': 'boolean', 'description': 'True when every feature meshed successfully.'}, 'bounds': {'type': 'object', 'properties': {'max': {'type': 'array', 'items': {'type': 'number'}}, 'min': {'type': 'array', 'items': {'type': 'number'}}}, 'description': 'Overall model bounding box.'}, 'features': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': 'string'}, 'bbox': {'type': 'object', 'properties': {'max': {'type': 'array', 'items': {'type': 'number'}}, 'min': {'type': 'array', 'items': {'type': 'number'}}}}, 'kind': {'type': 'string'}, 'triangleCount': {'type': 'number'}}}, 'description': 'Per-feature summary â\x80\x94 never includes raw mesh arrays.'}, 'diagnostics': {'type': 'array', 'items': {}, 'description': 'Kernel diagnostics, if any.'}, 'featureCount': {'type': 'number', 'description': 'Number of features in the meshed model.'}, 'failedFeatureIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Feature ids that failed to compile (empty when ok).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'out': {'type': 'string', 'description': 'Write the emitted script to this .kcad.ts path and the assumption ledger to the sibling .ledger.json.'}, 'data': {'type': 'string', 'description': 'Mesh bytes as base64 â\x80\x94 use when the server cannot see your filesystem.'}, 'file': {'type': 'string', 'description': 'Path to a .stl (binary or ASCII), .obj or .3mf mesh. One of file / data is required. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'format': {'enum': ['stl', 'obj', '3mf'], 'type': 'string', 'description': 'Format override; default from the extension or the content.'}, 'minIoU': {'type': 'number', 'description': 'Volume IoU a faithful verdict requires. Default 0.98.'}, 'maxPasses': {'type': 'number', 'description': 'Refinement passes, 1â\x80\x934. Default 4; stops early at the first faithful pass.'}, 'maxTriangles': {'type': 'number', 'description': 'Refuse meshes above this triangle count instead of stalling. Default 300000.'}, 'maxDeviationMm': {'type': 'number', 'description': 'Max surface deviation (mm) a faithful verdict allows. Default max(0.25, 0.1 % of the bbox diagonal).'}, 'weldToleranceMm': {'type': 'number', 'description': 'Vertex weld distance in mm. Default max(1e-4, 1e-6 Ã\x97 bbox diagonal).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'mesh': {'type': 'object', 'description': 'Clean-up and watertightness report for the input mesh.', 'additionalProperties': True}, 'error': {'type': 'string', 'description': 'Failure message (failure).'}, 'ledger': {'type': 'object', 'description': 'AssumptionLedger { facts, unresolvedCount }; dimension fact ids equal the param names (success).', 'additionalProperties': True}, 'passes': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Per-pass tolerances and measured fidelity.'}, 'script': {'type': 'string', 'description': 'The emitted, evaluable .kcad.ts source (success).'}, 'written': {'type': 'object', 'description': '{ script, ledger } paths when out was given.', 'additionalProperties': True}, 'features': {'type': 'object', 'description': 'Body kind, hole groups, cutouts, boolean remainders, params (success).', 'additionalProperties': True}, 'fidelity': {'type': 'object', 'required': ['maxDeviationMm', 'rmsMm', 'volumeIoU', 'verdict'], 'properties': {'pass': {'type': 'number', 'description': 'Refinement pass whose script is returned.'}, 'rmsMm': {'type': 'number', 'description': 'RMS of the sampled point-to-surface distances.'}, 'verdict': {'enum': ['faithful', 'approximate', 'failed'], 'type': 'string', 'description': 'faithful = IoU and deviation within thresholds, watertight mesh, nothing unmatched; approximate = IoU >= 0.85.'}, 'volumeIoU': {'type': 'number', 'description': 'Volume intersection-over-union by column ray casting.'}, 'thresholds': {'type': 'object', 'description': '{ minIoU, maxDeviationMm, approximateIoU } actually applied.', 'additionalProperties': True}, 'maxDeviationMm': {'type': 'number', 'description': 'Two-sided discrete Hausdorff distance, mesh vs reconstruction.'}}, 'description': 'Measured fidelity of the returned script (success).', 'additionalProperties': True}, 'errorCode': {'type': 'string'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'notRepresented': {'type': 'array', 'items': {'type': 'string'}}, 'unmatchedRegions': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Surface regions no emitted feature represents: { kind, reason, areaMm2, triangleCount, centroid, bbox }.'}, 'reconstructedHoles': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Holes the B-rep hole detector finds on the reconstruction.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': [], 'properties': {'code': {'type': 'string', 'minLength': 1, 'description': 'The full .kcad source of the model to open in Studio (the script you have been editing). Optional: omit to reuse the source from your most recent evaluate_script call.'}, 'slug': {'type': 'string', 'minLength': 1, 'description': 'Older name for `project`. Use `project`.'}, 'title': {'type': 'string', 'description': 'Optional human-readable title for the model (shown in Studio). Defaults to "Model from Claude".'}, 'wheels': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Wheel centres + radii for likeness gate [{ center:[x,y,z], radius }].'}, 'project': {'type': 'string', 'minLength': 1, 'description': 'Slug of the project to update (from the last open_in_studio result, a "Saved to your projects" note, list_my_projects, or a /p/<slug> link). Adds a new revision to that project instead of creating a new one, and live-updates the user\'s open Studio tab.'}, 'body_bbox': {'type': 'object', 'description': 'Body AABB { min:[x,y,z], max:[x,y,z] } mm â\x80\x94 for likeness_profile gate when no session attest.'}, 'anon_token': {'type': 'string', 'maxLength': 128, 'description': "Anonymous owner token returned as `anonToken` by an earlier open_in_studio result. Pass it on every open_in_studio call, also in a new chat, so all your anonymous projects stay together and move to the user's account when they sign in. Omit when you have none."}, 'cabin_bbox': {'type': 'object', 'description': 'Optional cabin AABB for likeness gate.'}, 'parameters': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'defaultValue', 'kind'], 'properties': {'max': {'type': 'number', 'description': 'Optional inclusive upper bound (numeric params).'}, 'min': {'type': 'number', 'description': 'Optional inclusive lower bound (numeric params).'}, 'kind': {'enum': ['number', 'integer', 'boolean', 'string'], 'type': 'string', 'description': 'Control type Studio should render for this parameter.'}, 'name': {'type': 'string', 'maxLength': 40, 'minLength': 1, 'description': 'Parameter identifier as used in the script (e.g. "width").'}, 'step': {'type': 'number', 'description': 'Optional slider/step increment (numeric params).'}, 'unit': {'type': 'string', 'maxLength': 8, 'description': 'Optional unit label shown next to the control (e.g. "mm", "deg").'}, 'description': {'type': 'string', 'maxLength': 200, 'description': 'Optional human-readable explanation of the parameter.'}, 'defaultValue': {'oneOf': [{'type': 'number'}, {'type': 'boolean'}, {'type': 'string'}], 'description': 'Current/default value of the parameter; type matches `kind`.'}}}, 'description': "Optional list of the model's editable parameters, so Studio can render parameter controls. Each item is one control derived from the .kcad params."}, 'attachments': {'type': 'array', 'items': {'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'maxLength': 240, 'minLength': 1}, 'assetSha256': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'bytesBase64': {'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 32, 'description': 'Complementary project files referenced by relative path from the .kcad source.'}, 'new_project': {'type': 'boolean', 'description': "Pass true only when the user wants a separate, new model. Default: continue this chat's project."}, 'require_stills': {'type': 'boolean', 'description': 'Forwarded to body-likeness gate (default true).'}, 'still_verdicts': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Agent still checklist for likeness gate [{ code, passed, finding, view? }].'}, 'include_preview': {'type': 'boolean', '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.'}, 'likeness_profile': {'enum': ['automotive'], 'type': 'string', 'description': 'Hard success gate for organic/car bodies. When set, open_in_studio returns ok:false unless body-likeness is publishReady (inline body_bbox/wheels/still_verdicts, or a prior verify body-likeness pass for this exact code). Omit for WIP previews.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'properties': {'ok': {'type': 'boolean', 'description': 'Whether publish succeeded. Under CDN mode, false when mesh persist hard-failed (meshStatus:failed) â\x80\x94 never ok:true with meshUrl silently omitted.'}, 'url': {'type': 'string', 'description': 'The /p/<slug> Studio link for the model.'}, 'slug': {'type': 'string', 'description': 'The project slug. Pass it back as `project` to save the next change to this project.'}, 'animUrl': {'type': 'string', 'description': 'CDN transforms-only animation bake URL when the script declares animationView(). ChatGPT embed Play/scrub uses this â\x80\x94 no live session remesh.'}, 'meshUrl': {'type': 'string', 'description': 'Revision-matched mesh artifact URL when available â\x80\x94 prefer this over re-executing CAD in the embed. When meshStatus is building, this is the expected CDN URL (retry until ready).'}, 'updated': {'type': 'boolean', 'description': 'True when an existing project was updated; false when a new one was created.'}, 'version': {'type': 'integer', 'minimum': 1, 'description': 'Immutable Studio revision persisted by this call. Read it with get_project_revision using this slug and version.'}, 'embedUrl': {'type': 'string', 'description': 'Read-only, chrome-free /embed/<slug> viewer URL â\x80\x94 drop into an <iframe> to embed the live model in any site or widget (no login). Includes meshUrl when a revision mesh artifact is available.'}, 'meshHint': {'type': 'string', 'description': 'When meshStatus=building: transient OCCT/CDN write â\x80\x94 poll get_project or re-open_in_studio; never imply permanent 404/failure. Present under CDN when building.'}, 'meshError': {'type': 'string', 'description': 'Sanitized persist/repair error when meshStatus is failed.'}, 'meshReady': {'type': 'boolean', 'description': 'True only when meshStatus===ready. building+meshUrl means embed is still polling.'}, 'paintHint': {'type': 'string', 'description': 'Agent guidance: do not claim interactive paint until viewerPainted.'}, 'meshStatus': {'enum': ['ready', 'building', 'failed', 'missing'], 'type': 'string', 'description': 'ready | building | failed | missing â\x80\x94 explicit CDN artifact state (never silently omit meshUrl under CDN mode).'}, 'previewUrl': {'type': 'string', 'description': 'HTTPS URL of the PNG preview when storage signed successfully.'}, 'assetHashes': {'type': 'array', 'items': {'type': 'string'}}, 'previewHint': {'type': 'string'}, 'previewView': {'type': 'string'}, 'serverBuild': {'type': 'string', 'description': 'Deploy identity so connector vs server mismatch is observable.'}, 'hasAnimation': {'type': 'boolean', 'description': 'True when animUrl is present (animationView timeline baked at publish).'}, 'previewBytes': {'type': 'number'}, 'previewWidth': {'type': 'number'}, 'projectSaved': {'type': 'boolean', 'description': 'True when the project/revision was persisted. Not the same as viewerPainted.'}, 'project_note': {'type': 'string', 'description': 'Which project was updated or created, its URL, and how to keep working on it.'}, 'previewCached': {'type': 'boolean'}, 'previewHeight': {'type': 'number'}, 'previewStatus': {'enum': ['included', 'included_inline', 'unavailable', 'skipped'], 'type': 'string', 'description': 'included = PNG + URL; included_inline = PNG only; unavailable = save ok but no preview; skipped = include_preview:false.'}, 'viewerPainted': {'type': 'boolean', 'description': 'Always false on tools/call. The Studio widget sets viewerPainted:true via updateModelContext after a correlated model_displayed ack.'}, 'attachmentCount': {'type': 'integer', 'minimum': 0}, 'previewDelivered': {'type': 'boolean', '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.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'target', 'commands', 'face'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'face': {'type': 'string', 'description': 'Target face â\x80\x94 canonical name or label.'}, 'asEdge': {'type': 'boolean', 'description': 'Open-wire (edge) projection. NOT IMPLEMENTED â\x80\x94 rejected at edit time. Use a closed-curve projection (omit asEdge).'}, 'bindAs': {'type': 'string', 'description': 'Optional local variable name; emits `const <bindAs> = <target>.projectCurve(...);`.'}, 'target': {'type': 'string', 'description': 'Variable name of the Shape to chain onto.'}, 'commands': {'type': 'array', 'items': {'type': 'object', 'required': ['kind'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'kind': {'enum': ['moveTo', 'lineTo', 'close'], 'type': 'string'}}}, '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"}]).'}, 'scaleMode': {'enum': ['original', 'native', 'bounds'], 'type': 'string', 'description': 'Drawing.sketchOnFace scaling mode. Default original.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'ref': {'type': 'string', 'description': "mode:'resolve'|'lineage' â\x80\x94 topology ref string."}, 'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'mode': {'enum': ['evaluate', 'resolve', 'lineage'], 'type': 'string', 'description': "Resolution mode (default 'evaluate')."}, 'query': {'description': "mode:'evaluate' â\x80\x94 Query input: @kc[...] / @kcq[...] string or { ast } object."}, 'expect': {'enum': ['any', 'unique'], 'type': 'string', 'description': "mode:'evaluate' â\x80\x94 'unique' asserts exactly-one."}, 'feature_id': {'type': 'string', 'description': 'Optional FeatureId; defaults to the last lowered shape (use "auto" for lineage).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'ref': {'type': 'string', 'description': "mode:'resolve' â\x80\x94 the resolved ref string."}, 'chain': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': "mode:'lineage' â\x80\x94 HistoryMap walk."}, 'error': {'type': 'string'}, 'query': {'type': 'object', 'description': "mode:'evaluate' â\x80\x94 the resolved Query ({ ast }).", 'additionalProperties': True}, 'entity': {'type': 'object', 'description': "mode:'resolve' â\x80\x94 the single matched entity.", 'additionalProperties': True}, 'entities': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': "mode:'evaluate' â\x80\x94 matched entities."}, 'warnings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'errorCode': {'type': 'string'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': "mode:'resolve' â\x80\x94 near-miss candidates (failure)."}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'match'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'match': {'type': 'string', 'description': 'A substring that uniquely identifies the line to remove (e.g. `const hole = cylinder(5,`).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source. Mutually exclusive with file. Relative imports resolve against a temp dir â\x80\x94 use file for scripts with relative lib.fromSTEP(...) imports.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script on disk. Mutually exclusive with code. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'hide': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Hide matching feature ids / assembly part names. Mutually exclusive with focus.'}, 'pose': {'type': 'string', 'description': "Extra arbitrary camera pose '<az>,<el>' in degrees, e.g. '30,20'."}, 'focus': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Show only matching feature ids / assembly part names. Mutually exclusive with hide.'}, 'views': {'type': 'array', 'items': {'enum': ['front', 'right', 'top', 'iso'], 'type': 'string'}, 'description': 'Canonical views to render as an array, e.g. ["iso"] or ["front","top"] (default: all four). Fewer views = faster.'}, 'width': {'type': 'integer', 'maximum': 2048, 'minimum': 64, 'description': "Per-view tile width in px (default 768; 1600 under preset: 'publish')."}, 'height': {'type': 'integer', 'maximum': 2048, 'minimum': 64, 'description': "Per-view tile height in px (default 768; 1200 under preset: 'publish')."}, 'preset': {'enum': ['default', 'publish'], 'type': 'string', 'description': "Render look: 'default' (engineering review) or 'publish' (studio product shot for sharing; one 'hero' image unless views/pose are given)."}, 'shadow': {'type': 'boolean', 'description': "preset 'publish' only: soft contact shadow under the model (default true)."}, 'explode': {'type': 'object', 'required': ['factor'], 'properties': {'mode': {'enum': ['radial', 'mate-axis'], 'type': 'string'}, 'factor': {'type': 'number', 'minimum': 0}}, 'description': "Pull a multi-part assembly apart for the preview. factor â\x89¥ 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().", 'additionalProperties': False}, 'out_dir': {'type': 'string', 'description': 'Directory for the PNGs (created if missing). Default: a fresh temp session dir.'}, 'overlay': {'enum': ['zebra', 'curvature', 'continuity'], 'type': 'string', '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."}, 'section': {'type': 'object', 'required': ['axis', 'position'], 'properties': {'axis': {'enum': ['x', 'y', 'z'], 'type': 'string'}, 'flip': {'type': 'boolean', 'default': False}, 'position': {'type': 'number'}}, '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).', 'additionalProperties': False}, 'base_url': {'type': 'string', 'description': 'Advanced: force a specific render server (e.g. a running studio dev server) instead of the bundled static player.'}, 'background': {'type': 'string', 'description': "preset 'publish' only: 'white' (default), 'light', 'dark', 'black', 'transparent' (PNG alpha), or '#rrggbb'."}, 'environment': {'type': 'string', 'description': "HDRI environment override: preset ('studio', 'softbox', 'neutral', 'outdoor', 'warehouse'), a URL, or 'none' for the default three-light rig."}, 'no_watermark': {'type': 'boolean', 'default': False, 'description': 'Suppress the kernelCAD version watermark.'}, 'no_mechanism_check': {'type': 'boolean', 'default': False, 'description': "Skip the mechanism-truth probe for fast iteration on large assemblies; the preview reports mechanism: 'unverified'. Ignored under KERNELCAD_RENDER_STRICT=1."}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'images', 'diagnostics'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the preview rendered.'}, 'error': {'type': 'string'}, 'bounds': {'type': 'object', 'description': 'Model AABB in mm { min, max } the camera was fit to (success).', 'additionalProperties': True}, 'images': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Rendered tiles { name, path, description } â\x80\x94 absolute local PNG paths with per-view camera orientation (kernelCAD is Z-up).'}, 'out_dir': {'type': 'string', 'description': 'Directory holding the PNGs (session temp dir unless out_dir was given).'}, 'errorCode': {'type': 'string'}, 'errorHint': {'type': 'string'}, 'mechanism': {'type': 'string', 'description': "Mechanism-truth verdict: 'real' | 'broken' | 'unverified'."}, 'render_ms': {'type': 'number', 'description': 'Wall-clock render time in ms (provisioning + browser + captures).'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'render_source': {'type': 'string', 'description': "Lane that served the render: 'static-player' | 'dev-server' | 'explicit'."}, 'mechanism_failure_codes': {'type': 'array', 'items': {'type': 'string'}, 'description': "De-duplicated failure codes when mechanism is 'broken'."}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'strategy': {'enum': ['apply-first', 'try-all', 'dry-run'], 'type': 'string', 'description': "'try-all' (default) walks candidates until one clears the diagnostic; 'apply-first' applies only the top candidate and reports what it did; 'dry-run' previews every candidate patch without evaluating."}, 'diagnostic': {'type': 'string', 'description': "Diagnostic id from why_did_this_fail's `targetDiagnosticId` / `candidates[].diagnosticId`, or 'first-error' (default) for the first error-severity diagnostic."}, 'max_attempts': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Upper bound on candidates attempted (default 3). Ignored by apply-first and dry-run.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'strategy', 'candidates', 'attempts'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether a candidate cleared the target diagnostic without new errors.'}, 'diff': {'type': 'string', 'description': 'Unified diff of the accepted patch (dry run: every candidate patch).'}, 'after': {'type': 'object', 'description': 'Post-repair { ok, featureHealth, diagnostics }.', 'additionalProperties': True}, 'error': {'type': 'string'}, 'before': {'type': 'object', 'description': 'Pre-repair { ok, featureHealth, diagnostics }.', 'additionalProperties': True}, 'target': {'type': 'object', 'description': 'The diagnostic this run targeted { id, code, featureId?, message }.', 'additionalProperties': True}, 'applied': {'type': 'string', 'description': 'Candidate id that was accepted.'}, 'attempts': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Per-candidate outcome { candidateId, applied, ok?, clearedDiagnostic?, newErrorCodes?, accepted, diagnostic? }.'}, 'new_code': {'type': 'string', 'description': 'Repaired .kcad.ts source (present when a patch applied). Caller persists it.'}, 'strategy': {'enum': ['apply-first', 'try-all', 'dry-run'], 'type': 'string'}, 'errorCode': {'type': 'string'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'tool.repair.* diagnostics when repair could not complete.'}, 'repairRegion': {'type': 'object', 'description': 'The line ranges the repair was bound to.', 'additionalProperties': True}, 'candidateReason': {'type': 'string'}, 'candidateStatus': {'enum': ['candidates', 'no-automatic-candidate'], 'type': 'string'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['ledgerPath', 'resolutions'], 'properties': {'ledgerPath': {'type': 'string', 'description': 'Path to the `<model>.ledger.json` file persisted alongside the traced source.'}, 'resolutions': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Matches a `facts[].id` in the ledger.'}, 'value': {'description': "Overrides the fact's value; marks it `overridden`."}, 'confirm': {'type': 'boolean', 'description': 'Accepts the fact as-is; marks it `confirmed`.'}}}, 'description': 'One resolution per ledger fact id to act on.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'paramOverrides', 'diagnostics'], 'properties': {'ok': {'type': 'boolean'}, 'ledger': {'type': 'object', 'description': 'The ledger after applying resolutions (present on success).', 'additionalProperties': True}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'paramOverrides': {'type': 'object', 'description': 'factId -> value for every resolved fact with a value; feed into set_param.', 'additionalProperties': True}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'assembly': {'type': 'string', 'description': 'Assembly name; defaults to the first captured assembly.'}, 'designGoal': {'type': 'string', 'description': 'Original user design prompt or goal. Included in suggestedRepairPrompt so topology-redesign repairs restart from the intended physical design instead of local coordinate nudges.'}, 'epsilonMm3': {'type': 'number', 'description': 'Interference volume threshold in mm^3. Default 0.01.'}, 'timeBudgetMs': {'type': 'number', 'description': 'Wall-clock budget for the review in ms (default 90000). Once spent, the remaining heavy stages (pose envelope, physical use case, mechanism sweep) are skipped and listed in skippedStages â\x80\x94 a partial result instead of a timeout. stageTimingsMs reports where the time went.'}, 'combinatorial': {'type': 'boolean', 'description': 'Sample all 2^N limit-corner combinations across mates with declared limits. Capped at 8 mates with limits; combine with samplesPerMate for both interior coverage and worst-pose detection. Default false.'}, 'samplesPerMate': {'type': 'integer', 'minimum': 1, 'description': 'Pose-envelope samples per declared-limit mate. 1 (default) = corners only; >=3 adds uniform interior points between min and max. Total samples per non-locked mate = samplesPerMate.'}, 'gripperAperture': {'type': 'object', 'properties': {'left': {'type': 'string', 'description': 'Left fingertip connector ref such as "left-finger.tip".'}, 'right': {'type': 'string', 'description': 'Right fingertip connector ref such as "right-finger.tip".'}}, 'description': 'Optional fingertip connector refs for gripper aperture travel reporting.'}, 'trackConnectors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional connector refs such as ["gripper-plate.tool-tip"] to limit connector workspace reporting.'}, 'preserveInterfaces': {'type': 'array', 'items': {'type': 'string'}, 'description': 'External mates, connector refs, part names, or behavioral interfaces the repair agent must preserve during redesign.'}, 'includeInterference': {'type': 'boolean', 'description': 'Whether sampled poses run BREP interference checks. Default true.'}, 'includePoseEnvelope': {'type': 'boolean', 'description': 'Whether to sample declared mate limits. Default true.'}, 'requirePhysicalUseCase': {'type': 'boolean', 'description': 'When true, articulated assemblies must declare arm.physicalUseCase(...) evidence: loads, contacts, stable parts, and actuator limits.'}, 'includePhysicalUseCaseStatics': {'type': 'boolean', '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.'}, 'includePhysicalUseCaseReachability': {'type': 'boolean', '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.'}, 'includePhysicalUseCaseJointReactions': {'type': 'boolean', '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.'}, 'includePhysicalUseCaseJointStructure': {'type': 'boolean', '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.'}, 'physicalUseCaseReachabilitySamplesPerMate': {'type': 'integer', 'minimum': 1, '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.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'featureCount', 'diagnostics'], 'properties': {'ok': {'type': 'boolean'}, 'fitness': {'type': 'object', 'description': 'Mechanism fitness verdict incl. repairMode.', 'additionalProperties': True}, 'assembly': {'type': 'string'}, 'mechanism': {'type': 'string'}, 'validator': {'type': 'object', 'description': 'Assembly/mate-graph validator result.', 'additionalProperties': True}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'featureCount': {'type': 'number'}, 'poseEnvelope': {'type': 'object', 'description': 'Sampled mate-limit pose envelope.', 'additionalProperties': True}, 'repairContext': {'type': 'object', 'additionalProperties': True}, 'skippedStages': {'type': 'array', 'items': {'type': 'object', 'properties': {'stage': {'type': 'string'}, 'reason': {'type': 'string'}}, 'additionalProperties': True}, 'description': 'Stages skipped because timeBudgetMs was spent; their checks did not run.'}, 'stageTimingsMs': {'type': 'object', 'description': 'Wall-clock ms per review stage that ran.', 'additionalProperties': {'type': 'number'}}, 'gripperAperture': {'type': 'object', 'additionalProperties': True}, 'mechanismFailures': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'connectorWorkspace': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Connector workspace bounds.'}, 'interferenceSummary': {'type': 'object', 'description': 'Classified interference counts and pairs: raw, contact-noise, actionable, and capMm3.', 'additionalProperties': True}, 'rawInterferencePairs': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'suggestedRepairPrompt': {'type': 'string', 'description': 'Structured repair prompt (failure / repair path).'}, 'physicalUseCaseStaticCertificates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Verified sampled quasi-static certificates with residual wrench, contact forces, and actuator torque evidence.'}, 'physicalUseCaseJointReactionCertificates': {'type': 'array', 'items': {'type': 'object', 'required': ['useCaseName', 'poses', 'reactions'], 'properties': {'poses': {'type': 'object', 'additionalProperties': True}, 'reactions': {'type': 'array', 'items': {'type': 'object', 'required': ['mateName', 'parentPart', 'childPart', 'pointWorldMm', 'axisWorld', 'forceWorldN', 'momentWorldNmm', 'resultantForceN', 'resultantMomentNmm', 'axialForceN', 'radialForceN', 'axisMomentNmm', 'bendingMomentNmm'], 'properties': {'mateName': {'type': 'string'}, 'axisWorld': {'type': 'array', 'items': {'type': 'number'}}, 'childPart': {'type': 'string'}, 'parentPart': {'type': 'string'}, 'axialForceN': {'type': 'number'}, 'forceWorldN': {'type': 'array', 'items': {'type': 'number'}}, 'pointWorldMm': {'type': 'array', 'items': {'type': 'number'}}, 'radialForceN': {'type': 'number'}, 'axisMomentNmm': {'type': 'number'}, 'momentWorldNmm': {'type': 'array', 'items': {'type': 'number'}}, 'resultantForceN': {'type': 'number'}, 'bendingMomentNmm': {'type': 'number'}, 'resultantMomentNmm': {'type': 'number'}}, 'additionalProperties': False}}, 'useCaseName': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Exact-pose parent-on-child joint reaction wrench certificates in N, mm, and Nmm.'}, 'physicalUseCaseJointStructuralCertificates': {'type': 'array', 'items': {'type': 'object', 'required': ['useCaseName', 'poses', 'joints'], 'properties': {'poses': {'type': 'object', 'additionalProperties': True}, 'joints': {'type': 'array', 'items': {'type': 'object', 'required': ['mateName', 'envelope'], 'properties': {'envelope': {'type': 'object', 'additionalProperties': True}, 'mateName': {'type': 'string'}, 'structure': {'type': 'object', 'additionalProperties': True}}, 'additionalProperties': False}}, 'useCaseName': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Per-joint declared-envelope and geometry/material clevis strength evidence.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'slug': {'type': 'string', 'description': "Project slug from open_in_studio/get_project/a /p/<slug> link. When given, returns the latest brush packet painted on that project's page â\x80\x94 works without OAuth; the slug is the capability. Omit to use your signed-in account's latest packet."}, 'paths_only': {'type': 'boolean', 'description': 'Controls PNG delivery. Default (omitted or true): return only signed URLs + struck part names â\x80\x94 the small, context-friendly response; fetch the bytes via the signed URLs. Set false to also base64-inline the screenshot + mask PNGs for clients that cannot fetch the URLs over HTTP (larger response).'}, 'freshness_sec': {'type': 'integer', 'minimum': 1, 'description': 'Maximum packet age in seconds. Default 1800 (30 min). Use a smaller value for "what did I just paint" or a larger one for "earlier today".'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source (mutually exclusive with file).'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script declaring at least one feaStudy. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'study': {'type': 'string', 'description': 'Name of the study to run; defaults to the last declared one.'}, 'heatmaps': {'type': 'boolean', 'description': 'Render stress heatmap PNGs (default true).'}, 'mesh_size': {'type': 'number', 'description': 'Target element size in mm, overriding the study for this run.'}, 'output_dir': {'type': 'string', 'description': 'Directory for the solver deck, results, summary JSON and heatmap PNGs.'}, 'mesh_timeout_ms': {'type': 'number', 'description': 'Wall-clock budget for meshing (default 120000).'}, 'solve_timeout_ms': {'type': 'number', 'description': 'Wall-clock budget for the solve (default 300000).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'False when the study violated its declared minSafetyFactor, a selector did not resolve, or the solver toolchain is missing.'}, 'error': {'type': 'string'}, 'images': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Absolute PNG paths of the rendered stress heatmap.'}, 'legend': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Heatmap colour bands { color, fromMPa, toMPa } â\x80\x94 the scale the PNGs are drawn on.'}, 'out_dir': {'type': 'string', 'description': 'Directory holding the summary JSON, solver deck and heatmap PNGs.'}, 'summary': {'type': 'object', 'description': 'Solved evidence: maxVonMisesMPa, maxVonMisesAt, maxDisplacementMm, maxDisplacementAt, minSafetyFactor (+ minSafetyFactorRequired), nodeCount/elementCount/meshSizeMm, quality (minSICN, meanSICN, lowQualityCount), maxStressErrorPercent, trust { meshTrusted, reasons }, hotSpots [{ region, maxVonMisesMPa, nodeId, at, safetyFactor }], appliedForceN / reactionForceN / equilibriumResidual, meshMs / solveMs.', 'additionalProperties': True}, 'artifacts': {'type': 'object', 'description': 'Absolute paths of the BREP geometry handoff, .inp deck, .frd results and mesh JSON, for hand reproduction.', 'additionalProperties': True}, 'errorCode': {'type': 'string'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'fea.* diagnostics raised by the run.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['gcode_path', 'protocol', 'host'], 'properties': {'host': {'type': 'string', 'description': 'Printer hostname or IP.'}, 'port': {'type': 'number', 'description': 'Override the protocol default port.'}, 'serial': {'type': 'string', 'description': 'Bambu printer serial number (required to start a print unless start_print is false).'}, 'api_key': {'type': 'string', 'description': 'OctoPrint API key (Settings -> API).'}, 'dry_run': {'type': 'boolean', 'description': 'Validate connectivity/auth only; never uploads or starts a print.'}, 'printer': {'enum': ['generic-fdm', 'bambu-a1-mini', 'bambu-a1', 'bambu-p1s', 'bambu-p1p', 'bambu-x1c', 'bambu-x1e', 'bambu-h2d', 'bambu-h2s', 'prusa-mini-plus', 'prusa-mk4s', 'prusa-core-one', 'prusa-xl', 'creality-ender-3-v3', 'creality-k1', 'creality-k1-max', 'creality-k2-plus', 'elegoo-neptune-4-pro', 'anycubic-kobra-3', 'voron-2.4-250', 'voron-2.4-300', 'voron-2.4-350', 'ultimaker-s5'], 'type': 'string', 'description': "Printer profile id; checked against protocol before upload. List them with 'kernelcad print printers'."}, 'filename': {'type': 'string', 'description': "Uploaded file name (default: 'kernelcad.gcode'; bambu-lan appends '.3mf')."}, 'protocol': {'enum': ['octoprint', 'moonraker', 'bambu-lan'], 'type': 'string'}, 'gcode_path': {'type': 'string', 'description': 'Path to the .gcode file on disk.'}, 'access_code': {'type': 'string', 'description': 'Bambu LAN-mode access code (printer settings -> LAN Only Mode).'}, 'start_print': {'type': 'boolean', 'description': 'Start the print immediately after upload (default: true).'}, 'model_3mf_path': {'type': 'string', 'description': "bambu-lan only: model .3mf from export format '3mf' to package the G-code into (the uploaded .gcode.3mf)."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'dry_run': {'type': 'boolean', 'description': 'True when only connectivity/auth was validated (no upload, no print start).'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, 'uploaded_path': {'type': 'string', 'description': 'Path/name the G-code (bambu-lan: the .gcode.3mf print file) was stored under on the printer.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'param_name', 'new_value'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'new_value': {'oneOf': [{'type': 'number'}, {'type': 'string'}], 'examples': [12.5, 'width/2 + 3'], 'description': 'The new default value. Either a number for a numeric param (e.g. 12.5), or a string expression evaluated in the script (e.g. "width/2 + 3").'}, 'param_name': {'type': 'string', 'description': 'The string literal name of the param (first arg to param()).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['code', 'assembly_binding', 'mode'], 'properties': {'code': {'type': 'string', 'description': 'The .kcad.ts source code.'}, 'mode': {'enum': ['model', 'solvedModel'], 'type': 'string'}, 'poses': {'type': 'object', 'description': 'Optional solvedModel pose overrides keyed by mate name. Defaults to {}.'}, 'options': {'type': 'object', 'description': "Optional solvedModel options such as { validate: 'warn', posesGate: 'envelope' }."}, 'assembly_binding': {'type': 'string', 'description': 'JS identifier bound to assembly(...).'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the edit applied and re-evaluated cleanly.'}, 'error': {'type': 'string', 'description': 'Failure message (present when ok is false).'}, 'new_code': {'type': 'string', 'description': 'Modified .kcad.ts source (present on success). Caller persists it.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Diagnostics from re-evaluating the modified source.'}, 'binding_name': {'type': 'string', 'description': 'JS const name bound to the new construct (when one was created).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'poses': {'type': 'object', 'description': 'Optional numeric pose overrides keyed by mate name.'}, 'assembly': {'type': 'string'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'error': {'type': 'string'}, 'poses': {'type': 'object', 'description': 'Solved part poses keyed by mate; each a serialized Transform (success).', 'additionalProperties': True}, 'status': {'type': 'string', 'description': 'Solver status (success).'}, 'errorCode': {'type': 'string'}, 'errorHint': {'type': 'string'}, 'iterations': {'type': 'number', 'description': 'Solver iteration count (success).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['entities', 'constraints'], 'properties': {'entities': {'type': 'array', 'items': {'oneOf': [{'type': 'object', 'required': ['id', 'type', 'x', 'y'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'id': {'type': 'string'}, 'type': {'enum': ['POINT'], 'type': 'string'}, 'fixed': {'type': 'boolean', 'description': "If true, the solver won't move this point."}}, 'description': 'POINT â\x80\x94 a 2D point.'}, {'type': 'object', 'required': ['id', 'type', 'p1', 'p2'], 'properties': {'id': {'type': 'string'}, 'p1': {'type': 'string'}, 'p2': {'type': 'string'}, 'type': {'enum': ['LINE'], 'type': 'string'}}, 'description': 'LINE â\x80\x94 references two point ids.'}, {'type': 'object', 'required': ['id', 'type', 'center', 'radius'], 'properties': {'id': {'type': 'string'}, 'type': {'enum': ['CIRCLE'], 'type': 'string'}, 'center': {'type': 'string'}, 'radius': {'type': 'number'}}, 'description': 'CIRCLE â\x80\x94 references a center point id.'}]}, 'description': 'Sketch entities to solve. Lines reference point ids; circles reference a center point id.'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'type', 'entities'], 'properties': {'id': {'type': 'string'}, 'type': {'enum': ['COINCIDENT', 'DISTANCE', 'HORIZONTAL', 'VERTICAL', 'PARALLEL', 'PERPENDICULAR', 'EQUAL_LENGTH', 'TANGENT', 'RADIUS', 'ANGLE', 'CONCENTRIC', 'SYMMETRIC'], 'type': 'string'}, 'value': {'type': 'number', 'description': 'Required for DISTANCE, RADIUS, and ANGLE.'}, 'entities': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ids of the entities the constraint relates.'}}}, 'description': 'Constraints to apply to the entities.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'entities', 'constraints'], 'properties': {'ok': {'type': 'boolean'}, 'errors': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Solver/validation errors (present on failure, including non-convergence).'}, 'entities': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Solved sketch entities (best-effort on a non-converging solve).'}, 'residual': {'type': 'number', 'description': 'Final aggregate constraint residual when the solver ran.'}, 'converged': {'type': 'boolean', 'description': 'Whether the constraint solve converged below tolerance. ok is false when this is false.'}, 'constraints': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'The constraints applied.'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['params'], 'properties': {'code': {'type': 'string', 'description': 'Inline kernelCAD script source.'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script file. Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'gates': {'type': 'object', 'properties': {'jointAxis': {'type': 'boolean', 'description': 'Default true.'}, 'reachable': {'type': 'object', 'required': ['tipLink', 'targetPosition'], 'properties': {'tipLink': {'type': 'string'}, 'targetPosition': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}, 'targetOrientation': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3}}, 'description': 'Runs the reachability gate when set.'}, 'interference': {'type': 'boolean', 'description': 'Default true.'}, 'mountingHoles': {'type': 'boolean', 'description': 'Default true.'}}, 'description': 'Which standard gates to run per combo.'}, 'params': {'type': 'object', 'description': 'param() name -> { values: [number|string, ...] } or { min, max, steps }.'}, 'assembly': {'type': 'string', 'description': 'Assembly name; defaults to the first captured assembly.'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether every gate passed on every evaluated combo.'}, 'error': {'type': 'string'}, 'results': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'One entry per evaluated combo: { combo, gates, diagnostics }.'}, 'errorCode': {'type': 'string'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Sweep-level diagnostics (e.g. combo-cap-exceeded).'}, 'combosCapped': {'type': 'boolean', 'description': 'True when the full cartesian product exceeded the 64-combo cap.'}, 'firstFailure': {'type': 'object', 'description': 'First failing combo per gate name.', 'additionalProperties': True}, 'combosEvaluated': {'type': 'number', 'description': 'Number of combos actually evaluated (capped at 64).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['imageUrl'], 'properties': {'hint': {'type': 'string', 'description': 'Optional free-text hint forwarded to vision-LLM backends (e.g. "a pair of eyewear; trace the upper brow only").'}, 'priors': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'statement', 'value', 'confidence'], 'properties': {'id': {'type': 'string'}, 'value': {}, 'statement': {'type': 'string'}, 'confidence': {'type': 'number', 'maximum': 1, 'minimum': 0}}}, 'description': 'Caller-supplied category-norm defaults (e.g. wall thickness) recorded verbatim as `assumed` ledger facts.'}, 'backend': {'enum': ['opencv', 'vision-llm', 'hybrid', 'auto'], 'type': 'string', 'description': 'Force a specific backend; default `auto` routes by corner-color stddev.'}, 'features': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'kind'], 'properties': {'kind': {'enum': ['silhouette', 'curve', 'point', 'bbox'], 'type': 'string', 'description': 'Geometric shape of the requested feature.'}, 'label': {'type': 'string', 'description': 'Caller-chosen identifier (echoed in the response).'}, 'region': {'type': 'string', 'description': 'Optional free-text region hint forwarded to vision-LLM backends; ignored by opencv.'}}}, 'description': 'Features to trace. Defaults to a single { label: "silhouette", kind: "silhouette" } when omitted.'}, 'imageUrl': {'type': 'string', 'description': 'URL or path to the reference image. Supports file://, http(s)://, data:image/...;base64,..., or a bare filesystem path.'}, 'validate': {'enum': ['warn', 'error'], 'type': 'string', 'description': 'Assumption-ledger strictness. `warn` (default) never blocks. `error` fails the call when any `missing` ledger fact (e.g. scale) is still open.'}, 'scaleAnchor': {'type': 'object', 'required': ['pixelDistance', 'realDistance', 'unit'], 'properties': {'unit': {'enum': ['mm', 'cm', 'in'], 'type': 'string'}, 'realDistance': {'type': 'number', 'description': 'The same distance in real-world units.'}, 'pixelDistance': {'type': 'number', 'description': 'Distance in pixels between the two measured points.'}}, 'description': "Pixel-to-real-world scale anchor: two measured points on the image. Absent -> the returned ledger's `scale` fact is `missing`."}, 'maxWaypointsPerFeature': {'type': 'integer', 'minimum': 2, 'description': 'Cap on waypoints per feature. Defaults to 12 (suitable for medium-inflection outlines).'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'features', 'imageDims', 'diagnostics', 'ledger'], 'properties': {'ok': {'type': 'boolean'}, 'ledger': {'type': 'object', 'description': 'Assumption ledger: { facts, scale?, unresolvedCount } classifying every fact as visible/inferred/assumed/missing.', 'additionalProperties': True}, 'features': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Traced features with normalized [0..1] waypoints + confidence.'}, 'imageDims': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Pixel dimensions [width, height] of the source image.'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'required': ['check'], 'properties': {'dxf': {'type': 'string', 'description': "check:'dfm-preflight' â\x80\x94 path to a DXF file."}, 'code': {'type': 'string', 'description': 'Inline kernelCAD script source (same checks as `file`).'}, 'file': {'type': 'string', 'description': 'Path to a .kcad.ts script (assembly/dfm/dfm-preflight/swept-collision/reachable/mounting-holes/load-capacity/static-hold). Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'mode': {'enum': ['stub', 'beam'], 'type': 'string', 'description': "check:'load-capacity' â\x80\x94 'beam' (default) or 'stub'."}, 'pose': {'description': "check:'static-hold' â\x80\x94 explicit pose (joint name -> deg/mm) or array of poses; omit to sample a grid across the evaluated joint's range."}, 'seed': {'type': 'object', 'description': "check:'reachable' â\x80\x94 numeric IK seed pose (joint name -> deg/mm)."}, 'check': {'enum': ['assembly', 'urdf', 'dfm', 'dfm-preflight', 'swept-collision', 'reachable', 'mounting-holes', 'load-capacity', 'static-hold', 'body-likeness'], 'type': 'string', 'description': 'Which verification to run.'}, 'joint': {'type': 'string', 'description': "check:'swept-collision' â\x80\x94 joint to sweep; omit to sweep every declared joint. check:'static-hold' â\x80\x94 joint to evaluate; omit to evaluate every joint with a declared actuator."}, 'loads': {'type': 'object', 'description': "check:'load-capacity' â\x80\x94 partName -> { force?: [Fx,Fy,Fz] N, torque?: [Tx,Ty,Tz] N*m }."}, 'range': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': "check:'swept-collision' â\x80\x94 [lower, upper, step] in joint-native units."}, 'vendor': {'type': 'string', 'description': "check:'dfm-preflight' â\x80\x94 vendor SKU (required for that check)."}, 'wheels': {'type': 'array', 'items': {'type': 'object'}, 'description': "check:'body-likeness' â\x80\x94 wheel centres + tire radii [{ center:[x,y,z], radius }]."}, 'gravity': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': "check:'static-hold' â\x80\x94 gravity vector, m/s^2, world frame (default [0, 0, -9.81])."}, 'service': {'enum': ['laser', 'cnc-router', 'waterjet', 'bending'], 'type': 'string', 'description': "check:'dfm-preflight' â\x80\x94 service."}, 'assembly': {'type': 'string', 'description': 'Assembly name; defaults to the first captured assembly.'}, 'material': {'type': 'string', 'description': "check:'dfm-preflight' â\x80\x94 material SKU (required for that check)."}, 'tip_link': {'type': 'string', 'description': "check:'reachable' â\x80\x94 end-effector part name (required for that check)."}, 'body_bbox': {'type': 'object', 'description': "check:'body-likeness' â\x80\x94 body AABB { min:[x,y,z], max:[x,y,z] } in mm."}, 'featureId': {'type': 'string', 'description': "check:'dfm-preflight' â\x80\x94 FeatureId to scope to."}, 'materials': {'type': 'object', 'description': "check:'load-capacity' â\x80\x94 partName -> material declaration."}, 'urdf_path': {'type': 'string', 'description': "check:'urdf' â\x80\x94 path to the .urdf file."}, 'cabin_bbox': {'type': 'object', 'description': "check:'body-likeness' â\x80\x94 optional cabin/greenhouse AABB for automated cabin-aft."}, 'length_axis': {'enum': ['x', 'y'], 'type': 'string', 'description': "check:'body-likeness' â\x80\x94 wheelbase axis (default 'x')."}, 'thicknessIn': {'type': 'number', 'description': "check:'dfm-preflight' â\x80\x94 material thickness in inches."}, 'thicknessMm': {'type': 'number', 'description': "check:'dfm-preflight' â\x80\x94 material thickness in millimeters."}, 'prefer_solver': {'enum': ['analytical', 'numeric', 'auto'], 'type': 'string', 'description': "check:'reachable' â\x80\x94 force the IK path ('auto' default)."}, 'range_samples': {'type': 'number', 'description': "check:'static-hold' â\x80\x94 grid density per evaluated joint when `pose` is omitted (default 9)."}, 'max_iterations': {'type': 'number', 'description': "check:'reachable' â\x80\x94 numeric-path iteration cap."}, 'refreshCatalog': {'type': 'boolean', 'description': "check:'dfm-preflight' â\x80\x94 force vendor catalog refresh."}, 'require_stills': {'type': 'boolean', 'description': "check:'body-likeness' â\x80\x94 require still_verdicts (default true)."}, 'still_verdicts': {'type': 'array', 'items': {'type': 'object'}, 'description': "check:'body-likeness' â\x80\x94 agent ortho still checklist [{ code, passed, finding, view? }]. Required codes: side-body-over-wheels, side-cabin-aft, rear-haunch, ortho-proportions-vs-reference."}, 'body_feature_id': {'type': 'string', 'description': "check:'body-likeness' â\x80\x94 FeatureId to read body AABB from when body_bbox omitted."}, 'target_position': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': "check:'reachable' â\x80\x94 target [x, y, z] mm (world frame)."}, 'target_orientation': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 3, 'minItems': 3, 'description': "check:'reachable' â\x80\x94 target XYZ Euler angles in radians."}, 'min_torque_margin_pct': {'type': 'number', 'description': "check:'static-hold' â\x80\x94 safety-margin floor as a percent of actuator capacity (default 20)."}, 'position_tolerance_mm': {'type': 'number', 'description': "check:'reachable' â\x80\x94 position tolerance in mm."}, 'collision_tolerance_mm3': {'type': 'number', 'description': "check:'swept-collision' â\x80\x94 BREP intersection volume tolerance (mm^3)."}, 'safety_factor_threshold': {'type': 'number', 'description': "check:'load-capacity' â\x80\x94 pass/fail safety-factor floor (default 1.5)."}, 'orientation_tolerance_rad': {'type': 'number', 'description': "check:'reachable' â\x80\x94 orientation tolerance in radians."}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the verification ran and passed its gate.'}, 'error': {'type': 'string', 'description': 'Failure message (present on failure).'}, 'errorCode': {'type': 'string'}, 'diagnostics': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Verifier diagnostics (most checks).'}}, 'additionalProperties': True}
입력 스키마
{'type': 'object', 'properties': {'code': {'type': 'string'}, 'file': {'type': 'string', 'description': 'Hosted server: cannot read files from your machine â\x80\x94 pass `code`, or `project:<slug>` for a saved project.'}, 'feature_id': {'type': 'string'}}}
출력 스키마
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'chain': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Upstream feature diagnostics in topological order; requested feature last.'}, 'error': {'type': 'string'}, 'trace': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Every captured feature joined to its call site, AST node range, diagnostics, inputs and dependents.'}, 'errorCode': {'type': 'string'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Ordered concrete fixes, each with an AST-anchored patch, a predicted effect, and the geometry it was derived from.'}, 'feature_id': {'type': 'string'}, 'repairRegion': {'type': 'object', 'description': 'Minimal editable line ranges for the failure: { file, ranges: [{ startLine, endLine, role, featureId?, paramName? }] }.', 'additionalProperties': True}, 'candidateReason': {'type': 'string', 'description': 'Why no candidate was derivable.'}, 'candidateStatus': {'enum': ['candidates', 'no-automatic-candidate'], 'type': 'string', 'description': "'no-automatic-candidate' means the region is the whole answer â\x80\x94 no mechanical fix exists for that diagnostic kind."}, 'targetDiagnosticId': {'type': 'string', 'description': 'Id of the diagnostic the repair plan targets; pass it to repair_script.'}}, 'additionalProperties': True}
최근 도구 변경
유사한 MCP 서버
frontier-reference
Provides reference information on frontier technologies, sensors, companies, file formats, format conversion, and related design …
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
spriteship
Generates and manages 2D game characters, assets, animations, tilesets, UI packs, maps, and engine-ready exports for multiple gam…
Blixtworks
Offers pay-per-call utilities for text, image processing and analysis, data conversion, validation, web inspection, cryptography,…
Compose Preview Catalogs
Browses, renders, compares, audits, and edits Jetpack Compose preview catalogs and associated UI designs.
arch-tools-mcp
Provides general-purpose agent APIs for browser automation, web and PDF extraction, data conversion, email operations, fact check…
Affine.Earth Math Court
Performs exact integer and rational mathematical verification across algebra, geometry, physics, quantum-computing witnesses, rob…
floot
Creates, edits, previews, databases, and publishes full-stack web and mobile applications with hosted resources and deployment wo…