fusion-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| fusion_statusA | Check that Fusion 360 and the FusionMCP add-in are reachable; call this first. Returns JSON with:
When Fusion or the add-in is not running the result is an error starting with NOT_CONNECTED and says how to fix it. After a TIMEOUT from another tool, call this before retrying: the timed-out operation may still be running in Fusion. | ||||||||||||||||||
| execute_pythonA | Run Python code inside Fusion 360 on its main thread. Use it only when no dedicated tool can do the job. In scope: Units: the Fusion API itself works in CENTIMETRES and RADIANS. Convert yourself: 25 mm -> 2.5, 90 deg -> math.pi / 2. Strings passed to adsk.core.ValueInput.createByString are Fusion expressions ("25 mm", "width / 2"). Returns JSON {"result", "stdout", "stderr"}: Example: code = "sk = root.sketches.add(root.xYConstructionPlane)\n" "sk.sketchCurves.sketchCircles.addByCenterRadius(" "adsk.core.Point3D.create(0, 0, 0), params['r_mm'] / 10)\n" "result = sk.name" params = {"r_mm": 12.5} | ||||||||||||||||||
| document_listA | List the documents open in Fusion. Each item: {"ref", "name", "is_active", "is_saved", "is_modified", "file_id",
"version", "design_type": "parametric"|"direct"|null, "units": "mm"|...|null}.
Returns {"documents": [...]}. | ||||||||||||||||||
| document_activateA | Make an open document the active one; every other tool then works on it. Two unsaved documents with the same name are ambiguous: the call fails with
INVALID_PARAMS and Returns the document's info (see document_list) with "is_active": true. Example: document_activate(document="document:file:urn:adsk.wipprod:dm.lineage:abc"). | ||||||||||||||||||
| document_newA | Create a new design document and make it active. It is NOT saved; call document_save only when the user asks to save.
Returns the new document's info (see document_list). Example: document_new() -> parametric design in mm. | ||||||||||||||||||
| document_openA | Open a document and make it active. Pass exactly one of A cloud file that is already open is activated instead of opened again ("already_open": true). Returns the document's info (see document_list) plus "already_open". Examples: document_open(file_id="urn:adsk.wipprod:dm.lineage:abc"); document_open(local_path="C:/parts/bracket.f3d"). | ||||||||||||||||||
| document_saveA | Call ONLY when the user explicitly asked to save the document. An already saved document gets a new version ( Returns the document's info (see document_list) plus "upload": "pending". Examples: document_save(name="Bracket"); document_save(description="hole moved"). | ||||||||||||||||||
| document_closeA | Call ONLY when the user explicitly asked to close the document. A document with unsaved changes is not closed unless exactly one of
Returns {"closed": {"ref", "type", "name"}, "active": | null}. Example: document_close(discard_changes=true). | ||||||||||||||||||
| design_get_settingsB | Settings of the active design. Returns {"design_type": "parametric"|"direct", "units": "mm"|"cm"|"m"|"in"|"ft" (display units), "document": {"ref", "type", "name"}, "root_component": {"ref", "type", "name"}, "parameter_count", "timeline_count" (null for direct designs)}. | ||||||||||||||||||
| design_set_unitsA | Change the distance units Fusion displays and uses for unitless expressions in the active design. Numbers passed to tools are NOT affected: they stay in mm (e.g. a length of 25 is still 25 mm after design_set_units("in")). Returns the settings (see design_get_settings). Example: design_set_units(units="in"). | ||||||||||||||||||
| design_set_typeA | Switch the active design between parametric (timeline) and direct modelling. Parametric -> direct DELETES THE WHOLE TIMELINE (feature history and parameters driving it) and cannot be undone or rolled back; it needs confirm_discard_history=true, otherwise INVALID_PARAMS and nothing changes. Ask the user before confirming. Direct -> parametric starts a new timeline. The same type is a no-op ("changed": false). Returns the settings plus "changed" and "history_discarded". Example: design_set_type(design_type="parametric"). | ||||||||||||||||||
| parameter_listA | List parameters of the active design. Each item: {"ref": "param:", "name", "kind": "user"|"model", "expression", "unit", "value" (lengths in mm, angles in degrees, unitless as is; missing for other units), "value_unit": "mm"|"deg"|"", "display" (Fusion's formatted value), "comment", "is_favorite", "created_by": {"ref", "type", "name"} | null (the feature that owns a model parameter), "role", "component", "dependents" (only with include_dependents)}. Returns {"parameters": [...]}. Example: parameter_list(kind="model") -> find | ||||||||||||||||||
| parameter_createA | Create user parameters in order (later ones may use earlier ones). All or nothing: names are checked first (pattern, not existing, no duplicates) and a Fusion error on any item removes the ones already created.
Returns {"parameters": [...as in parameter_list], "warnings": [features that newly show a warning]}. Example: parameter_create(parameters=[{"name": "width", "expression": 40}, {"name": "half", "expression": "width / 2"}]). | ||||||||||||||||||
| parameter_updateA | Change expression, name, comment or favourite flag of user and model parameters
— e.g. drive an extrude by setting its model parameter All or nothing: if any change fails, or puts a timeline feature into the error
state, every parameter keeps its previous values and the call fails with
FUSION_API_ERROR and Returns {"parameters": [...as in parameter_list], "warnings": [...]}. Example: parameter_update(parameters=[{"name": "d1", "expression": "width * 2"}]). | ||||||||||||||||||
| parameter_deleteA | Delete user parameters, all or nothing. Model parameters cannot be deleted.
A parameter still used by another parameter outside the list (or by features)
is refused with INVALID_PARAMS and Returns {"deleted": [names], "warnings": [...]}. Example: parameter_delete(names=["half", "width"]). | ||||||||||||||||||
| inspect_treeA | Model tree of the active design: bodies, sketches, construction geometry,
timeline features (with health) and nested occurrences, each with a stable Start here to find what to work on. Every node is a brief description (lengths mm,
areas mm², volumes mm³). Origin planes/axes/point are addressed as Returns {"design_type": "parametric"|"direct", "root": {...component node with
"bodies", "sketches", "construction", "features", "occurrences"}, "item_count",
"truncated"}; when Example: inspect_tree(include=["bodies", "features"]). | ||||||||||||||||||
| inspect_describeA | Describe entities by ref: faces (surface type, area_mm2, centroid_mm, outward normal, geometry such as cylinder radius/axis), edges (curve type, length_mm, ends, adjacent faces), vertices, bodies (volume, area, bbox, material), components, occurrences (transform), sketches, construction geometry and features (health). Units: mm, mm², mm³, degrees; directions are unit vectors. Accepts Returns {"items": [...], "errors": [{"ref", "code", "message"}]}. Example: inspect_describe(refs=["origin:xy", ""], detail="brief"). | ||||||||||||||||||
| inspect_bounding_boxA | World-axis bounding boxes in mm. Tight (exact) boxes come from Fusion's measure
manager; when it cannot compute one the looser Returns {"items": [{"ref", "min_mm", "max_mm", "size_mm", "tight"}], "union": {"min_mm", "max_mm", "size_mm"} | null, "errors": [...]}. Example: inspect_bounding_box() -> overall size of the model in | ||||||||||||||||||
| inspect_physical_propertiesB | Mass properties: mass_kg, volume_mm3, area_mm2, density_kg_m3, center_of_mass_mm (assembly coordinates for occurrences), inertia_kg_mm2 {xx, yy, zz, xy, yz, xz} about the world origin, principal_moments_kg_mm2 and the material name. Moments Fusion cannot compute are null. Returns {"items": [...], "errors": [...]}. Example: inspect_physical_properties(refs=[""]) -> check the volume. | ||||||||||||||||||
| inspect_queryA | Find faces, edges, vertices or bodies by geometry instead of writing code. All
given filters must match; results are brief descriptions with Returns {"items": [...], "total": , "truncated": bool}.
On large models narrow Examples:
| ||||||||||||||||||
| measure_distanceA | Minimum distance between two entities or points, in mm. Each operand is a ref from another tool or a point [x, y, z] in mm. Returns {"distance_mm", "point_a_mm", "point_b_mm"}: the closest points on each operand (null when Fusion does not report them). Example: measure_distance(a="", b="") -> height. | ||||||||||||||||||
| measure_angleA | Angle in degrees between two entities (faces, edges, axes, planes), or — with
three operands — the angle at vertex Returns {"angle_deg"}. Examples: measure_angle(a="", b="origin:XY"); measure_angle(a=[10, 0, 0], b=[0, 0, 0], c=[0, 10, 0]) -> 90. | ||||||||||||||||||
| viewport_screenshotA | PNG picture of the active Fusion viewport, to check the model visually. Sets the camera (and optionally the visual style) and leaves it there, so the user sees the same view. Size 64..2048 px. Returns an image and a JSON text with {"width", "height", "orientation"}. Example: viewport_screenshot(orientation="top", visual_style="shaded_edges"). | ||||||||||||||||||
| sketch_createA | Create a 2D sketch on an origin plane, a construction plane or a planar face. All sketch tools work in SKETCH SPACE, mm: A planar face gives a clean sketch unless Returns {"sketch": {ref}, "name", "plane", "component", "transform"}. Example: sketch_create(plane="origin:XY", name="Base") then sketch_draw(sketch=). | ||||||||||||||||||
| sketch_listA | List sketches of the design (or of one component). Returns {"sketches": [{"sketch": {ref}, "name", "component", "plane", "fully_constrained", "curve_count", "profile_count", "visible"}]}. Example: sketch_list() -> pick the sketch ref, then sketch_get / sketch_profiles. | ||||||||||||||||||
| sketch_getA | Full state of a sketch, coordinates in sketch-space mm. Sections: Returns {"sketch", the requested sections, "transform" (see sketch_create), "status": {fully_constrained, under_constrained_count, under_constrained: [≤ 50 refs]}}. Example: sketch_get(sketch=, include=["dimensions"]) -> find a dimension ref for sketch_dimension_set. | ||||||||||||||||||
| sketch_profilesA | Closed regions (profiles) of a sketch — the input of extrude/revolve/sweep/loft. Each profile: {"ref": {"ref": "profile:@,", "type": "Profile", "name": "P1"}, "sketch", "point": [x, y] (an interior point of the region), "area_mm2", "centroid", "bbox": {min, max}, "outer_loop": {"curves": [refs]}, "inner_loops": [{"curves": [refs]}] (holes)}. All coordinates sketch mm. A profile has no persistent id in Fusion, so its ref is the sketch plus a point inside
the region: Returns {"profiles": [...]}. Example: plate with 4 holes -> 5 profiles; the plate is the one with 4 | ||||||||||||||||||
| sketch_drawA | Draw many sketch items, then constraints, then dimensions — one call, all or
nothing (on any error the sketch is restored and Coordinates: Local ids: give an item Every item: {"kind", "id"?, "construction": false, ...}: | kind / mode | fields | sub-ids | | point | at | — | | line | start, end | start, end | | polyline | points (≥2), closed=false | e0..e{n-1} (edges), v0..v{n-1} | | rectangle two_point (default) | corner1, corner2 | bottom,right,top,left, bl,br,tr,tl | | rectangle center | center, corner | as two_point + center, diagonal | | rectangle three_point | p1, p2, p3 | e0..e3, v0..v3 | | circle center_radius (default) | center, radius | center | | circle two_point | p1, p2 (diameter ends) | center | | circle three_point | p1, p2, p3 | center | | arc three_point (default) | start, mid, end | start, end, center | | arc center_start_sweep | center, start, sweep (deg, + = CCW) | start, end, center | | arc tangent | from (curve end, e.g. "l1.end"), to | start, end, center | | ellipse | center, major_radius, minor_radius, angle=0 | center | | polygon | center, radius, sides 3..64, mode=inscribed|circumscribed, angle=0, constrain=true | e0.., v0.., center, circle | | spline | points (≥2 fit points), closed=false | start, end, fp0.. | | slot center_to_center (default) / overall | p1, p2, width | side0, side1, end0, end1, axis, c0, c1 | | text | text, height, corner, size=[w,h]?, font?, h_align=left, v_align=bottom | — | constraints: [{"type": coincident (point, entity) | horizontal / vertical (line, or points [p1, p2]) | parallel / perpendicular / collinear (line1, line2) | tangent / equal / concentric (curve1, curve2) | midpoint (point, curve) | symmetry (entity1, entity2, line) | smooth (spline, curve) | fix (entity, fixed=true)}]. dimensions: [{"type": distance (line, or point1 + point2; orientation=aligned| horizontal|vertical) | offset (line, entity) | radial / diameter (curve) | angular (line1, line2) | ellipse_major / ellipse_minor (ellipse), "value": 25 (mm/deg) or "plate_w * 0.6", "parameter_name"?, "driven"=false, "text_at"?}]. A named dimension (parameter_name) can be used by later dimensions' expressions in the same call. Returns {"sketch", "refs": {"r": {ref}, "r.bottom": {ref}, ...}, "constraints", "dimensions", "status" {fully_constrained, ...}, "profiles", "warnings"}. Example — fully constrained 100 x 60 plate centred on the origin with a hole: sketch_draw(sketch=, items=[ {"kind": "rectangle", "mode": "center", "id": "r", "center": "origin", "corner": [50, 30]}, {"kind": "circle", "id": "h", "center": [30, 15], "radius": 4}], dimensions=[ {"type": "distance", "line": "r.bottom", "value": 100, "parameter_name": "plate_w"}, {"type": "distance", "line": "r.left", "value": "plate_w * 0.6"}, {"type": "diameter", "curve": "h", "value": 8}, {"type": "distance", "point1": "origin", "point2": "h.center", "orientation": "horizontal", "value": 30}, {"type": "distance", "point1": "origin", "point2": "h.center", "orientation": "vertical", "value": 15}]) -> status.fully_constrained = true; the plate profile has one inner loop. | ||||||||||||||||||
| sketch_constrainA | Add geometric constraints in order, all or nothing. Entities are refs from earlier results (sketch_draw Returns {"constraints": [{ref, type}], "status", "profiles"}. Example: sketch_constrain(sketch=, constraints=[{"type": "horizontal", "points": [, ]}, {"type": "equal", "curve1": , "curve2": }]). | ||||||||||||||||||
| sketch_dimensionA | Add driving or driven dimensions in order, all or nothing — this is how sizes become exact and parametric.
Returns {"dimensions": [{ref, type, value, unit, expression, parameter, driving}], "status", "profiles"}. Example: sketch_dimension(sketch=, dimensions=[{"type": "distance", "line": , "value": 100, "parameter_name": "plate_w"}, {"type": "radial", "curve": , "value": "plate_w / 20"}]). | ||||||||||||||||||
| sketch_dimension_setA | Change existing dimensions: value/expression, driven state or parameter name. All or nothing: if any update fails the earlier ones get their previous values back.
Returns {"dimensions": [...as in sketch_dimension], "status", "profiles"}. Example: sketch_dimension_set(sketch=, updates=[{"dimension": , "value": "plate_w + 10"}]). | ||||||||||||||||||
| sketch_set_constructionA | Turn curves into construction geometry (not part of profiles) or back. All or nothing. Returns {"curves": [...], "status", "profiles"}. Example: sketch_set_construction(sketch=, curves=[]) -> the profiles bounded by that line merge. | ||||||||||||||||||
| sketch_deleteA | Delete sketch entities (not the sketch itself). All refs are checked first: a stale or foreign ref fails with ENTITY_NOT_FOUND /
INVALID_PARAMS and nothing is deleted. Then dimensions, constraints, texts, curves and
points are deleted in that order; entities Fusion already removed with another one
(e.g. a constraint of a deleted line) are listed in NOT ATOMIC (the only such sketch tool): Fusion cannot undo a deletion. If Fusion
itself fails in the middle of the batch, the entities deleted so far stay deleted —
the error is FUSION_API_ERROR with Returns {"deleted": [refs], "cascaded": [refs], "status", "profiles"}. Example: sketch_delete(sketch=, entities=[, ]). | ||||||||||||||||||
| sketch_transformA | Move/rotate sketch entities (or copies of them): rotate by Entities tied by constraints/dimensions may be pulled back by the solver: the result has the actual solved geometry, check it. Returns {"entities": [...] (moved) | "created": [...] (copy=true), "status", "profiles"}. Example: sketch_transform(sketch=, entities=[], translate=[30, 0], copy=true) -> a second circle 30 mm to the right. | ||||||||||||||||||
| sketch_offsetA | Offset curves (with When the Fusion version supports it the offset is parametric ( Returns {"created": [refs], "parametric", "dimension"?, "status", "profiles"}. Example: inner wall of a closed outline: sketch_offset(sketch=, curves=[], distance="wall", side_point=[0, 0]). | ||||||||||||||||||
| sketch_trimA | Trim at the segment nearest Returns {"created": [refs of the remaining pieces], "deleted": [the original ref, if it was replaced], "status", "profiles"}. Example: sketch_trim(sketch=, curve=, point=[10, 0]). | ||||||||||||||||||
| sketch_extendA | Extend the end nearest Returns {"created": [refs], "deleted": [the original ref, if replaced], "status", "profiles"}. Example: sketch_extend(sketch=, curve=, point=[39, 0]). | ||||||||||||||||||
| sketch_filletA | Round ONE corner between two curves with a tangent arc of Not fully atomic: Fusion cannot undo the fillet itself. If the radial dimension
( Returns {"arc": {ref}, "dimension"?: {...}, "status", "profiles"}. Example: sketch_fillet(sketch=, curve1=, curve2=, radius="r_corner"). | ||||||||||||||||||
| sketch_mirrorA | Mirror entities about a line, all or nothing. Shared points stay shared and points on the axis are reused; other curve types fail with INVALID_PARAMS. Returns {"mapping": {: }, "constraints", "status", "profiles"}. Example: sketch_mirror(sketch=, entities=[, ], axis=). | ||||||||||||||||||
| sketch_patternA | Pattern sketch entities, all or nothing. Counts include the original.
Returns {"instances": [[refs]...], "parametric", "constraint"?, "status", "profiles"}. Example: 6 holes on a circle: sketch_pattern(sketch=, entities=[], kind="circular", center="origin", count=6). | ||||||||||||||||||
| sketch_projectA | Bring model geometry into the sketch as reference curves (to dimension or constrain against, or to close profiles). All or nothing. Modes: Returns {"created": {: [refs]}, "status", "profiles"}. Example: sketch_project(sketch=, entities=[]) -> the face outline as reference curves. | ||||||||||||||||||
| construction_planeA | Create a construction plane — a reference for sketches, mirrors, splits. Give
Refs: Returns {"ref", "type": "ConstructionPlane", "name", "origin_mm", "normal", "health", "warning"?}. Examples:
| ||||||||||||||||||
| construction_axisA | Create a construction axis — for revolve, circular patterns, joints. Give
Refs: Returns {"ref", "type": "ConstructionAxis", "name", "origin_mm", "direction", "health", "warning"?}. Examples:
| ||||||||||||||||||
| construction_pointA | Create a construction point — a joint origin, a hinge center, a sketch anchor. Give
Points by coordinates are sketch points (sketch_draw), not construction points.
Refs: Returns {"ref", "type": "ConstructionPoint", "name", "point_mm", "health", "warning"?}. Examples:
| ||||||||||||||||||
| feature_extrudeA | Extrude sketch profiles, planar faces or sketch texts into a solid (or cut/join/ intersect existing bodies). Units: plain-number lengths are in Modes:
Surface: is_solid=false extrudes a surface body (operation new_body / new_component, no thin); profiles may then also be open sketch curve refs or edge refs (one kind, connected curves are chained) - e.g. an open line becomes a wall sheet. Errors: wrong field for the mode or a wrong entity kind -> INVALID_PARAMS (nothing
changed); a stale profile point -> ENTITY_NOT_FOUND with details.profiles (current
profiles); a feature Fusion computes with an error -> FUSION_API_ERROR and the
timeline is rolled back. A warning keeps the feature and is reported in Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [{ref, type, name}], "modified_bodies": [{ref, type, name}], "removed_bodies": [<refs of bodies consumed by join/cut>], "component"?: {ref, type, name} (new_component only)}. Body geometry is not repeated: describe the bodies with inspect_* if needed. Examples:
| ||||||||||||||||||
| feature_revolveA | Revolve sketch profiles or planar faces around an axis - shafts, pulleys, bottles, grooves (operation="cut"). Units: angles are degrees (a string is a Fusion expression, e.g. "180 deg");
Extents: full (default) = 360 deg; angle with symmetric=true splits the angle to both sides of the sketch plane; two_angles sets each side; to_entity revolves up to a face, body, construction plane, vertex or construction point, starting towards the sketch normal (direction="positive") or away from it ("negative"). Errors: an axis that is not linear (e.g. a circular edge) or a wrong extent field -> INVALID_PARAMS (nothing changed); a feature Fusion computes with an error -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [{ref, type, name}], "modified_bodies": [{ref, type, name}], "removed_bodies": [<refs of bodies consumed by join/cut>], "component"?: {ref, type, name} (new_component only)}. Body geometry is not repeated: describe the bodies with inspect_* if needed. Examples:
| ||||||||||||||||||
| feature_sweepA | Sweep sketch profiles or planar faces along a path - pipes, handles, springs (with twist), rails, swept cuts (operation="cut"). Units: angles in degrees (a string is a Fusion expression, e.g. "pitch_angle");
path_extent is a plain share of the path length; Rules: twist_angle / taper_angle with guide_rail -> INVALID_PARAMS; path_extent
outside (0, 1] -> rejected; a path with gaps -> FUSION_API_ERROR. A feature Fusion
computes with an error -> FUSION_API_ERROR and the timeline is rolled back; a warning
keeps the feature and is reported in Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [{ref, type, name}], "modified_bodies": [{ref, type, name}], "removed_bodies": [<refs of bodies consumed by join/cut>], "component"?: {ref, type, name} (new_component only)}. Examples:
| ||||||||||||||||||
| feature_loftA | Loft a solid through two or more sections - transitions, ducts, bottle necks, domes ending in a point. Sections: each is exactly one profile ('profile:@x,y' or a {"sketch", ...} spec selecting one region), a planar face (inspect_query), or a point - a sketch point, construction point (construction_point, origin:O) or vertex - which may only be the first or the last section. End conditions: free (default), tangent / smooth (with weight), direction (angle in degrees + weight), point_sharp / point_tangent (point sections only). Inner sections keep free unless asked otherwise. Guides: rails (sketch curves or edges touching every section) or one centerline, never both. closed=true joins the last section back to the first (needs 3+ profile sections and no point section). is_solid=false lofts a surface body (new_body / new_component only). Units: angles in degrees, weights plain numbers; Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [{ref, type, name}], "modified_bodies": [{ref, type, name}], "removed_bodies": [<refs of bodies consumed by join/cut>], "component"?: {ref, type, name} (new_component only)}. Examples:
| ||||||||||||||||||
| feature_ribA | Add a rib (a thin stiffening wall) from open sketch curves, joined to the body it meets - gussets in housings, brackets, bosses. Units: thickness and depth.distance are in Errors: closed curve, wrong thickness_location or depth -> INVALID_PARAMS (nothing changed); no target_body and the curves touch no body or several -> INVALID_PARAMS with details.candidates (body refs to pass as target_body); thickness_location "side2" is not available in the current Fusion API (FUSION_API_ERROR, no change): use "side1" with the curve drawn the other way; a Fusion API version without rib features -> FUSION_API_ERROR "not available" with no change (use execute_python then); a rib Fusion computes with an error -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [...], "modified_bodies": [{ref, type, name}] (the body the rib joins), "removed_bodies": [...]}. Example: feature_rib(curves=[], thickness=3) | ||||||||||||||||||
| feature_webA | Add a web - a network of thin walls from several open sketch curves (e.g. a grid of stiffeners inside a shelled housing), joined to the body it meets. Units: thickness and depth.distance are in Errors: closed curve, wrong thickness_location or depth -> INVALID_PARAMS (nothing changed); no target_body and the curves touch no body or several -> INVALID_PARAMS with details.candidates (body refs to pass as target_body); thickness_location "side2" is not available in the current Fusion API (FUSION_API_ERROR, no change); a Fusion API version without web features -> FUSION_API_ERROR "not available" with no change (use execute_python then); a web Fusion computes with an error -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies": [...], "modified_bodies": [{ref, type, name}] (the body the web joins), "removed_bodies": [...]}. Example: feature_web(curves=[, , ], thickness=2, depth={"type": "distance", "distance": 15}) | ||||||||||||||||||
| feature_holeA | Drill simple, counterbore or countersink holes - optionally tapped - into a body. Units: diameters, depths, offsets and points are in Kinds: simple needs only diameter; counterbore needs cb_diameter and cb_depth; countersink needs cs_diameter (cs_angle default 90). Fields of another kind are refused. tip_angle defaults to 118 deg (180 = flat bottom). The hole always cuts; participant_bodies limits which bodies. Tapped hole: thread={"designation": "M6x1"} (ThreadSpec: thread_type default "ISO Metric profile", designation, thread_class, modeled=false (cosmetic), full_length=true or length + offset, location high|low). Drill the tap-drill diameter (M6x1 -> 5). If the thread cannot be created the whole call fails and neither the hole nor the thread stays. See feature_thread_options for valid designations. Errors: a missing kind field, a non-planar face, a non-circular center edge, an unknown designation (details.available) -> INVALID_PARAMS (nothing changed); a hole or thread Fusion computes with an error -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state", "message"}, "created_bodies": [], "modified_bodies": [{ref, type, name}] (the drilled body), "removed_bodies": [], "holes": , "thread"?: {"type", "designation", "class", "internal": true, "modeled", "feature": {ref, type, name}, "health", "faces"}}. Examples:
| ||||||||||||||||||
| feature_threadA | Add a cosmetic (default) or modeled thread to cylindrical faces - bolts, shafts, tapped holes made earlier. Hole wall vs shaft is detected from the face orientation (override with Errors: a planar or conical face, faces mixing holes and shafts, an unknown type/designation/class (details.available lists valid ones), length with full_length=true -> INVALID_PARAMS (nothing changed); a thread Fusion computes with an error -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state", "message"}, "created_bodies": [], "modified_bodies": [...] (modeled threads), "removed_bodies": [], "thread": {"type", "designation", "class", "internal", "modeled"}}. Examples:
| ||||||||||||||||||
| feature_thread_optionsA | Look up Fusion's thread data (read-only) - which strings feature_thread and feature_hole(thread=...) accept. Levels: no arguments -> {"thread_types"}; thread_type -> {"sizes"}; + size ->
{"designations"}; + designation -> {"classes"} (internal or external); diameter (in
Errors: an unknown type, size or designation -> INVALID_PARAMS with details.available. Examples:
| ||||||||||||||||||
| feature_filletA | Round edges of a body with a fillet. Modes: constant needs radius; variable needs start_radius and end_radius, plus
optional mid radii at positions 0 (edge start) .. 1 (edge end); chord needs
chord_length. Fields of another mode are refused. Units: radii and lengths in
Errors: a missing mode field, a non-edge ref -> INVALID_PARAMS (nothing changed); variable/chord fillets on an old Fusion API -> FUSION_API_ERROR "not available"; a fillet Fusion computes with an error (radius too big) -> FUSION_API_ERROR and the timeline is rolled back. Returns {"feature": {ref, type, name}, "health": {"state", "message"}, "created_bodies": [], "modified_bodies": [{ref, type, name}], "removed_bodies": []}. Examples:
| ||||||||||||||||||
| feature_rule_filletA | Rule-based fillet: round every edge of the given faces/features (all_edges) or only
the edges where Units: radius in Errors: faces2 with all_edges or missing with between_faces -> INVALID_PARAMS; a Fusion API without rule fillets -> FUSION_API_ERROR "not available" (nothing changed; use feature_fillet with explicit edges); a failed fillet -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: feature_rule_fillet(faces=[], radius=1) | ||||||||||||||||||
| feature_chamferA | Bevel edges of a body with a chamfer. Modes: equal (distance), two_distances (distance and distance2 on the two faces),
distance_angle (distance and angle, default 45 deg); flip swaps which face gets which
value. Units: distances in Errors: distance2 / angle / flip with another mode, a missing distance2 -> INVALID_PARAMS (nothing changed); a failed chamfer -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Examples:
| ||||||||||||||||||
| feature_shellA | Hollow a body into a shell with walls of the given thickness. Pass faces to remove (an open box: its top face) OR bodies (a closed hollow body),
and inside_thickness and/or outside_thickness. Units: thicknesses in Errors: no faces and no bodies, both, or no thickness -> INVALID_PARAMS (nothing changed); walls Fusion cannot build (too thick) -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: feature_shell(faces=[], inside_thickness=3) | ||||||||||||||||||
| feature_draftA | Tilt faces by a draft angle relative to a neutral plane (moulding / casting draft). The plane fixes the line the faces pivot about and its normal is the pull direction (flip reverses it). One angle, symmetric=true for both sides by the same angle, or angle + angle2 for two sides. Angles in degrees or Fusion expressions. Faces from inspect_query; the plane must not be one of the faces. The drafted bodies are listed in modified_bodies. Errors: angle 0 or >= 90, angle2 with symmetric, a non-planar plane -> INVALID_PARAMS (nothing changed); a failed draft -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: feature_draft(faces=[f1, f2, f3, f4], plane="origin:XY", angle=2) | ||||||||||||||||||
| feature_offset_facesA | Press-pull faces of a body: move them along their normals by a signed distance (positive grows the body outward, negative pulls the faces in). Press-pull of a sketch profile = feature_extrude; press-pull of a fillet edge (change a
rounding) = feature_fillet. Units: distance in Errors: distance 0, a non-face ref -> INVALID_PARAMS (nothing changed); an offset Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: feature_offset_faces(faces=[], distance=2) | ||||||||||||||||||
| pattern_rectangularA | Rectangular pattern: copy features, bodies, faces or occurrences along one or two directions. Quantities count the original (quantity1=3 -> the original + 2 copies). Units:
distances in Errors: mixed kinds (details.kinds), quantity < 1, direction2 with quantity2 > 1 but no distance2 -> INVALID_PARAMS (nothing changed); a pattern Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature": {ref, type, name}, "health": {"state", "message"}, "created_bodies": [{ref, type, name}], "modified_bodies": [...], "removed_bodies": [tokens]} plus "created_occurrences": [{ref, type, name, full_path_name}] for occurrence input. Example: pattern_rectangular(entities=[], direction1="origin:X", quantity1=3, distance1=30, direction2="origin:Y", quantity2=2, distance2=25) | ||||||||||||||||||
| pattern_circularA | Circular pattern: copy features, bodies, faces or occurrences around an axis. Instances are spread evenly over total_angle (degrees, default 360 = full circle). Refs: bodies/faces from inspect_query, features from earlier feature_* results, the axis from origin:X|Y|Z, construction_* or inspect_query (a cylindrical face uses its axis). All entities must be of one kind. Errors: mixed kinds, quantity < 1, a non-axis ref -> INVALID_PARAMS (nothing changed); a pattern Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"} (+ "created_occurrences" for occurrence input). Example: pattern_circular(entities=[], axis="origin:Z", quantity=6) | ||||||||||||||||||
| pattern_pathA | Path pattern: copy features, bodies, faces or occurrences along a path of sketch curves or edges. Units: distance in Errors: mixed kinds, a path mixing curves and edges, start outside 0..1 -> INVALID_PARAMS (nothing changed); a path with gaps or a pattern Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"} (+ "created_occurrences" for occurrence input). Example: pattern_path(entities=[], path=[], quantity=4, distance=100, orientation_along_path=true) | ||||||||||||||||||
| pattern_mirrorA | Mirror features, bodies, faces or occurrences across a plane. With combine=true (body input only) every mirrored body is joined with its original (a symmetric part from one half); the originals are then in modified_bodies. Refs: planes from origin:XY|XZ|YZ, construction_* or a planar face from inspect_query. Errors: mixed kinds, combine with non-body input, a non-planar ref -> INVALID_PARAMS (nothing changed); a mirror Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"} (+ "created_occurrences" for occurrence input). Example: pattern_mirror(entities=[], plane="origin:YZ", combine=true) | ||||||||||||||||||
| body_combineA | Boolean of bodies: join, cut or intersect tool bodies with a target body. The target is changed (modified_bodies); consumed tools are listed by token in removed_bodies unless keep_tools=true. With new_component=true the result body is created in a new component ("component" in the result). Refs: bodies from inspect_query or earlier results (tokens change after this feature - use the refs in the result). Errors: the target listed in tools, a non-body ref -> INVALID_PARAMS (nothing changed); a combine Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"} (+ "component" with new_component). Example: body_combine(target=, tools=[, ]) | ||||||||||||||||||
| body_splitA | Split bodies into parts with a plane, a face or another body. The new parts are listed in created_bodies, the split bodies in modified_bodies. Refs: planes from origin:* / construction_*, faces and bodies from inspect_query. Errors: the tool among the bodies, a tool of another type -> INVALID_PARAMS (nothing changed); a tool that does not cross the body -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: body_split(bodies=[], tool="origin:XZ") | ||||||||||||||||||
| body_split_faceA | Split faces of a body with a tool (to get separate faces for draft, offset, colors). intersection: along the tool's intersection; along_vector: project the tool along
Errors: along_vector without direction, direction with another type -> INVALID_PARAMS (nothing changed); a split type this Fusion API lacks -> FUSION_API_ERROR "not available". Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies", "faces": [{ref, type}] - the new faces}. Example: body_split_face(faces=[], tool="origin:YZ") | ||||||||||||||||||
| body_moveA | Move (or copy and move) bodies as a Move feature in the timeline. Transforms: translate (x/y/z in Errors: a non-rigid matrix, a wrong ref kind -> INVALID_PARAMS (nothing changed); on an old Fusion API expressions / component-space moves -> FUSION_API_ERROR "not available". Returns {"feature", "health", "created_bodies" (copies), "modified_bodies" (moved originals), "removed_bodies"} + "copy": {"feature", "method"} with keep_original. Examples:
| ||||||||||||||||||
| body_scaleA | Scale bodies about a base point, uniformly (factor) or per axis (factors). Factors are unitless numbers > 0 (or Fusion expressions) - no unit conversion. Pass either factor or factors. Refs: bodies from inspect_query, points from origin:O, construction_point or vertices. Errors: a factor <= 0, factor together with factors, a non-point base -> INVALID_PARAMS (nothing changed). Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Examples: body_scale(bodies=[b], factor=0.5); body_scale(bodies=[b], factors={"x": 1, "y": 2, "z": 0.5}) | ||||||||||||||||||
| body_thickenA | Thicken faces (usually of a surface body) into a solid. Units: thickness in Errors: thickness 0, a non-face ref -> INVALID_PARAMS (nothing changed); a thicken Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: body_thicken(faces=[], thickness=2) | ||||||||||||||||||
| body_boundary_fillA | Boundary fill: make solids from the closed cells that tool bodies, faces and planes enclose. Cells are chosen by points, never by index: every cell by default, or the cells that contain cell_points. If a point lies in no cell, nothing is created and the error lists every cell (details.cells: center [x, y, z] mm and volume mm³) to pick points from. Refs: bodies/faces from inspect_query, planes from origin:* / construction_*. Errors: a point in no cell, tools enclosing no cell -> INVALID_PARAMS (nothing changed); a fill Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: body_boundary_fill(tools=[, "origin:XY"], cell_points=[[5, 5, 5]]) | ||||||||||||||||||
| body_delete_facesA | Delete faces from a body; Fusion heals the gap (e.g. remove a fillet or a boss). Faces from inspect_query on the latest body. The bodies are listed in modified_bodies. Errors: a non-face ref -> INVALID_PARAMS (nothing changed); faces Fusion cannot heal -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: body_delete_faces(faces=[<fillet face 1>, <fillet face 2>]) | ||||||||||||||||||
| body_replace_faceA | Replace faces of a body with a target face, plane or surface body (the body grows or shrinks to the target). Refs: faces from inspect_query, planes from origin:* / construction_*, surface bodies from earlier results. A solid body is not a valid target. Errors: a solid body or one of the faces as target -> INVALID_PARAMS (nothing changed); a replace Fusion cannot compute -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies"}. Example: body_replace_face(faces=[], target=) | ||||||||||||||||||
| body_renameA | Rename a body (not a timeline feature). Returns {"body": {ref, type, name}, "previous_name": str}. Errors: an empty name, a non-body ref -> INVALID_PARAMS. Example: body_rename(body=, name="Lid") | ||||||||||||||||||
| body_set_visibilityA | Show/hide bodies (light bulb) and/or set their opacity. All or nothing: if Fusion refuses a value for one body, every body gets its previous values back. is_visible in the result is the effective visibility (a hidden component hides its bodies even with the light bulb on). Errors: neither visible nor opacity, opacity outside 0..1 -> INVALID_PARAMS. Returns {"bodies": [{ref, type, name, light_bulb, is_visible, opacity}]}. Example: body_set_visibility(bodies=[a, b], visible=false) | ||||||||||||||||||
| body_removeA | Remove bodies from the design. mode=remove adds a Remove feature per body to the timeline of a parametric design (the bodies come back if the feature is suppressed or deleted); mode=delete deletes them. A direct design (no timeline) always deletes (mode_used = "delete"); there a Fusion failure on a later body cannot bring back earlier deleted ones. Errors: a non-body ref -> INVALID_PARAMS (nothing removed). Returns {"removed": [refs before removal], "features": [{ref, type, name}], "mode_used": "remove" | "delete"}. Example: body_remove(bodies=[]) | ||||||||||||||||||
| surface_patchA | Patch surface: fill a closed boundary with a new surface body (Patch feature). The boundary is a sketch profile, sketch curves or B-Rep edges (e.g. the free edges of an opening in a surface body). continuity/weight/flip apply to edges of bodies (ignored for sketch curves). Refs: profiles from sketch_profiles / sketch_draw, curves from sketch_* results, edges from inspect_query (refs of surface bodies change after trim/extend/stitch - take them from the latest results). Next steps: close surfaces into a solid with surface_stitch and check is_solid; give a surface thickness with body_thicken. Errors: join/cut operation, weight outside 0..1, a body ref -> INVALID_PARAMS (nothing changed); a boundary Fusion cannot fill -> FUSION_API_ERROR, rolled back. Returns {"feature", "health", "created_bodies": [{ref, type, name, is_solid}], "modified_bodies", "removed_bodies"}. Example: surface_patch(boundary=["profile:@0,0"]) | ||||||||||||||||||
| surface_extendA | Extend a surface body beyond its free edges by a distance (Extend feature). Units: a plain-number distance is in Errors: distance 0, a face ref -> INVALID_PARAMS; alignment="align" on a Fusion API without extendAlignment -> FUSION_API_ERROR "not available" (nothing changed). Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies"}. Example: surface_extend(edges=[], distance=5) | ||||||||||||||||||
| surface_trim_cellsA | Preview of a trim: the cells the tool cuts the surrounding surfaces into. Nothing changes in the design (the trim input is cancelled). Each cell has "center" [x, y, z] mm, "bbox" {"min", "max"} mm, "area_mm2" and "is_solid". Cells are temporary and have no refs: pick the ones to remove by a point near them and pass those points to surface_trim. Errors: a tool of another type -> INVALID_PARAMS. Returns {"cells": [{center, bbox, area_mm2, is_solid}], "count"}. Example: surface_trim_cells(trim_tool="origin:XY") | ||||||||||||||||||
| surface_trimA | Trim surfaces with a tool and remove the cells nearest to the given points. Call surface_trim_cells first to see the cells (center / bbox / area in mm), then
pass a point per cell to remove (in Errors: a point farther than max_distance from every cell -> INVALID_PARAMS with details.cells (the available cells) and nothing changed; a tool that cuts nothing -> INVALID_PARAMS reason "no_cells". Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies", "removed_cells": n}. Example: surface_trim(trim_tool="origin:XY", remove_points=[[0, 0, 20]]) | ||||||||||||||||||
| surface_untrimA | Untrim faces of surface bodies: remove their boundary loops (holes / outer trim). loop_type internal fills holes, external restores the outer boundary of the underlying surface, all does both. Faces of solid bodies are refused (unstitch them first). Refs: faces from inspect_query. Errors: a face of a solid, extension_distance with internal -> INVALID_PARAMS (nothing changed). Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies"}. Example: surface_untrim(faces=[], loop_type="internal") | ||||||||||||||||||
| surface_stitchA | Stitch surface bodies / faces along shared edges into one body (Stitch feature). If the surfaces enclose a volume the result is a solid: check "is_solid" in the
result. is_solid=false means gaps remain - raise Errors: fewer than 2 distinct surfaces, join/cut operation -> INVALID_PARAMS. Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies", "is_solid": bool of the resulting body}. Example: surface_stitch(surfaces=[, , ], tolerance=0.1) | ||||||||||||||||||
| surface_unstitchA | Unstitch: split faces or whole bodies into separate surface bodies. A face of a solid becomes its own surface body and the rest of the solid becomes a surface body too (check is_solid). Refs: faces / bodies from inspect_query. Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies"}. Example: surface_unstitch(entities=[], chain=False) | ||||||||||||||||||
| surface_ruledA | Ruled surface: a strip of straight rulings grown from edges or sketch curves. Units: distance in Errors: ruled_type direction without direction (or direction with another type), edges mixed with sketch curves -> INVALID_PARAMS (nothing changed). Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies"}. Example: surface_ruled(edges=[], distance=10) | ||||||||||||||||||
| surface_offsetA | Offset surface: new surface bodies at a distance from faces (Offset feature). The source faces stay unchanged. This differs from feature_offset_faces (c07), which
moves faces of a solid; to give the result a thickness use body_thicken (c08).
Units: distance in Errors: distance 0, a non-face ref, join/cut -> INVALID_PARAMS; offset_type rounded on an API without offsetType -> FUSION_API_ERROR "not available". Returns {"feature", "health", "created_bodies" / "modified_bodies": [{ref, type, name, is_solid}], "removed_bodies"}. Example: surface_offset(faces=[], distance=2) | ||||||||||||||||||
| sheet_metal_capabilitiesA | Report which sheet metal operations this Fusion API supports; changes nothing. Call it before a sheet metal workflow: flanges, unfold/refold, convert, bend listing and STEP export of a flat pattern use the preview Fusion API, which may be missing. sketch_bend is always false: Fusion has no API for Bend along a sketch line - model the bend with sheet_metal_edge_flange or sheet_metal_contour_flange instead. Returns {"rules", "flat_pattern", "flat_pattern_dxf", "flat_pattern_step", "convert", "base_flange", "contour_flange", "edge_flange", "list_bends", "unfold", "refold": bool, "sketch_bend": false, "preview_apis": [...], "fusion_version", "notes"}. | ||||||||||||||||||
| sheet_metal_list_rulesA | List sheet metal rules: thickness, bend radius, gap and relief sizes in mm with their expressions, K-factor and relief shape. Returns {"rules": [{"name", "source", "units", "thickness": {"mm", "expression"}, "bend_radius", "gap", "relief_width", "relief_depth", "relief_remnant", "k_factor", "relief_shape", "is_default" (library) | "is_used" (design)}], "count"}. | ||||||||||||||||||
| sheet_metal_create_ruleA | Create a design sheet metal rule by copying a base rule and setting values. Units: a plain number is in Errors: name already in the design, k_factor outside 0..1, a negative length -> INVALID_PARAMS; unknown base_rule -> ENTITY_NOT_FOUND. On any error no rule is left. Returns {"rule": , "base": {"name", "source"}}. Example: sheet_metal_create_rule(name="Steel 2mm", thickness=2, bend_radius="Thickness * 1", k_factor=0.44, relief_shape="round") | ||||||||||||||||||
| sheet_metal_assign_ruleA | Make a rule the active sheet metal rule of a component (default: root). A library rule is first copied into the design (the design never references the
library). Fusion may refuse a rule on a component without sheet metal data
(FUSION_API_ERROR) - then pass Returns {"component", "rule": , "previous": name | null, "copied_from_library": bool}. | ||||||||||||||||||
| sheet_metal_convertA | Convert a solid plate body to sheet metal from a planar base face. The body thickness should match the rule thickness. Use it for a plate built with feature_extrude. Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Errors: body already sheet metal, face of another body, non-planar face -> INVALID_PARAMS; Fusion refusing the conversion -> FUSION_API_ERROR (rolled back, the previous rule restored). Returns {"body": ref (may differ from the input), "component", "rule": , "is_sheet_metal": true}. | ||||||||||||||||||
| sheet_metal_base_flangeA | Base flange: a flat sheet metal body from closed profiles; the thickness comes from the active rule. Recommended order: rule (sheet_metal_create_rule / Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Returns {"feature", "health", "created_bodies": [{ref, type, name, is_sheet_metal}], "modified_bodies", "removed_bodies", "rule": active rule name}. | ||||||||||||||||||
| sheet_metal_contour_flangeA | Contour flange: a bent sheet metal body from an open sketch profile (the profile is the bend line shape, the thickness and radius come from the rule). Recommended order: rule -> contour flange (e.g. an L-shaped open sketch, c05 sketch_draw lines) -> sheet_metal_edge_flange on its outer edges (inspect_query) -> sheet_metal_list_bends / unfold / refold -> sheet_metal_create_flat_pattern -> sheet_metal_export_flat_pattern. Bend along a sketch line is not available in the Fusion API: add bends with edge flanges or draw them into the contour. Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Errors: two_sides without distance_two or distance_two with another direction -> INVALID_PARAMS; a failing flange is rolled back and the previous rule restored. Returns {"feature", "health", "created_bodies": [{ref, type, name, is_sheet_metal}], "modified_bodies", "removed_bodies", "rule"}. Example: sheet_metal_contour_flange(profiles=["", ""], distance=40) | ||||||||||||||||||
| sheet_metal_edge_flangeA | Edge flange: bend up a wall from linear edges of a sheet metal body. Exactly one of Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Errors: both / neither of height and to_entity, to_entity with several edges, an edge of a non-sheet-metal body or of several bodies, a non-linear edge -> INVALID_PARAMS; a failing flange is rolled back. Returns {"feature", "health", "created_bodies", "modified_bodies": [{ref, type, name, is_sheet_metal}], "removed_bodies", "rule"}. Example: sheet_metal_edge_flange(edges=[""], height=20) | ||||||||||||||||||
| sheet_metal_list_bendsA | List the bends of a sheet metal body: inner and outer bend face refs and the inner radius in mm (use the faces for sheet_metal_unfold). Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Returns {"body", "bends": [{"inner", "outer", "radius_mm"}], "count"}. | ||||||||||||||||||
| sheet_metal_unfoldA | Unfold all bends (or the given bend faces from sheet_metal_list_bends) of a sheet metal body about a stationary face, e.g. to add cuts across a bend; refold with sheet_metal_refold. Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Returns {"feature": {ref of the UnfoldFeature, ...}, "health", "created_bodies", "modified_bodies", "removed_bodies", "rule"}. | ||||||||||||||||||
| sheet_metal_refoldA | Refold the bends of an unfold feature. Uses the preview Fusion API: when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed) - check sheet_metal_capabilities first. Errors: a ref that is not an UnfoldFeature -> INVALID_PARAMS. Returns {"feature", "health", "created_bodies", "modified_bodies", "removed_bodies", "rule"}. | ||||||||||||||||||
| sheet_metal_create_flat_patternA | Create the flat pattern of the component of a sheet metal body (one per component) and return its size, thickness and bends. The design workspace is active again afterwards. Errors: a face of a non-sheet-metal body, an existing flat pattern without replace=true -> INVALID_PARAMS (the existing one is kept). replace=true is atomic: if the new flat pattern fails, the old one is recreated from its remembered stationary face. A flat pattern not made by this tool (or whose face changed) cannot be restored, so replace refuses it (INVALID_PARAMS reason=not_restorable, nothing changed) - delete it with sheet_metal_delete_flat_pattern first. Returns {"component", "exists": true, "size_mm": [x, y], "thickness_mm", "bend_count", "bends": [{"angle_deg", "is_up"}], "replaced"}. | ||||||||||||||||||
| sheet_metal_get_flat_patternA | Read a component's flat pattern: size, thickness and bends, or exists=false. Returns {"component", "exists", "size_mm", "thickness_mm", "bend_count", "bends"}. | ||||||||||||||||||
| sheet_metal_delete_flat_patternB | Delete a component's flat pattern. Errors: no flat pattern -> ENTITY_NOT_FOUND. Returns {"component", "deleted": true}. | ||||||||||||||||||
| sheet_metal_export_flat_patternA | Export a component's flat pattern to DXF (bend / extent lines, file units, optional spline-to-polyline) or STEP. STEP uses the preview Fusion API (api_unavailable when missing; see sheet_metal_capabilities). The path must be absolute with a matching extension; an existing file is replaced only with overwrite=true. Errors: no flat pattern -> ENTITY_NOT_FOUND (create it with sheet_metal_create_flat_pattern). Returns {"files": [{"path", "size_bytes"}], "format", "scope": component}. Example: sheet_metal_export_flat_pattern(path="C:/out/bracket.dxf") | ||||||||||||||||||
| form_listA | List the form (T-spline) features of the design or one component with their T-spline bodies; changes nothing. Returns {"forms": [{"feature": ref, "name", "component", "health": {"state", "message"}, "bodies": []}], "count"}; | ||||||||||||||||||
| form_create_primitiveA | Create a T-spline primitive body (Form environment) with its control mesh. Sizes per shape (numbers in T-spline primitives are NOT parametric: sizes are numbers, not expressions or user parameters (a string -> INVALID_PARAMS), and the body does not follow parameter changes. Shape it afterwards with form_move / form_crease / form_insert_edge, get a solid with form_convert_to_brep. Pull, Bridge, Fill Hole, Weld, Subdivide and the like have no Fusion API: read the TSM (form_get_tsm), edit it and create the body again (form_create_from_tsm). Returns {"form": ref, "body": , "created_form": bool}; the body has a B-Rep ("brep_body") once Fusion regenerated it - a body without one fails (rolled back). Example: form_create_primitive(shape="box", x_size=40, y_size=20, z_size=10, x_faces=4) | ||||||||||||||||||
| form_create_from_tsmA | Create a T-spline body from TSM (T-spline mesh) text or a .tsm file - exactly one
of This is the way to complex control-mesh edits the Fusion API lacks: form_get_tsm -> change the text -> form_create_from_tsm (then hide or delete the old form). Errors: both / neither input, a path that is not absolute / missing / not .tsm, text over 8 MiB -> INVALID_PARAMS; TSM Fusion cannot read -> FUSION_API_ERROR "invalid TSM" (nothing is left). Returns {"form": ref, "body": , "created_form": bool}. | ||||||||||||||||||
| form_get_tsmA | Read the TSM (T-spline mesh) description of a T-spline body: the text (up to
1 MiB) or, with Errors: text over 1 MiB without path -> INVALID_PARAMS "use path"; a path that is not absolute / not .tsm / whose folder is missing, an existing file without overwrite=true -> INVALID_PARAMS. Returns {"body", "tsm", "size_bytes"} or {"body", "files": [{"path", "size_bytes"}]}. | ||||||||||||||||||
| form_inspectA | Read the control mesh of a T-spline body in mm; changes nothing. The positions are what form_move / form_crease / form_insert_edge match their Returns {"body": , "vertices": [{"position", "smooth_position"}], "edges": [{"midpoint", "start", "end", "is_creased", "is_degenerate"}], "faces": [{"center", "vertex_count"}], "_truncated": bool, "truncated": bool}. | ||||||||||||||||||
| form_moveA | Move control-mesh vertices or faces of a T-spline body, or the whole body, by a vector; the B-Rep is regenerated. Control-mesh vertices and faces have no stable ids: pick them by points (mm by
default) - take the exact positions for Errors: zero vector, missing Returns {"body": , "changed": n}. Example: form_move(body="", kind="face", near=[[5, 5, 20]], vector=[0, 0, 5]) | ||||||||||||||||||
| form_creaseA | Crease (sharp) or uncrease (smooth) control-mesh edges of a T-spline body; the B-Rep is regenerated. Control-mesh edges have no stable ids: pick them by points (mm by default) - take
the exact edge midpoints from form_inspect. A point with no edge within Returns {"body": , "changed": number of edges whose flag changed}. | ||||||||||||||||||
| form_insert_edgeA | Insert edges next to control-mesh edges of a T-spline body (more faces where detail is needed); the B-Rep is regenerated. Uses the preview Fusion API (FormFeature.insertEdge): when it is missing the tool fails with FUSION_API_ERROR reason=api_unavailable (nothing changed). The edges must be of one loop, else Fusion refuses (FUSION_API_ERROR). Control-mesh edges have no stable ids: pick them by points (mm by default) - take
the exact edge midpoints from form_inspect. A point with no edge within Returns {"body": , "changed": selected edges, "new_edges": n}. | ||||||||||||||||||
| form_convert_to_brepA | Make an independent B-Rep copy of a T-spline body's B-Rep (in a base feature in a parametric design) - the solid for further features (shell, fillet, join). The copy is independent: later edits of the form do NOT change it, and the form stays in the timeline (hidden by default). The Fusion API has no "Convert" command. Errors: a T-spline body without a B-Rep (e.g. an open or broken mesh) -> FUSION_API_ERROR, nothing left. Returns {"body": ref of the new B-Rep body, "name", "source": T-spline body ref, "base_feature": ref | null, "is_solid": bool}. | ||||||||||||||||||
| timeline_listA | List the timeline of the active parametric design in order, with status. Group members follow their group. Returns {"count", "marker_position", "items": [item], "total", "truncated"}; items after the marker are rolled back (not part of the current model). Address items by "ref", never by index. Example: timeline_list(only_problems=true) -> which features are broken and why. Item: {"index" (informational only, never an address), "name", "type" (ExtrudeFeature, Sketch, TimelineGroup...), "ref", "is_group", "group": "timeline:" | null, "is_suppressed", "is_rolled_back", "health": "ok"|"warning"|"error"|"unknown", "message" | null, "component": "component:" | null}. | ||||||||||||||||||
| timeline_healthA | Health report of the whole timeline. Returns {"ok" (no item in error), "errors": [item], "warnings": [item], "suppressed_count", "rolled_back_count", "marker_position", "count"}. Call it after a series of edits to check the model. Example: timeline_health() -> {"ok": false, "errors": [{"name": "Fillet1", "message": "..."}], ...}. | ||||||||||||||||||
| timeline_compute_allA | Recompute the whole design (Design.computeAll) and return the timeline_health report (Returns the same shape). Slow on big designs; use it when the model looks stale or after edits made with execute_python. Example: timeline_compute_all() -> {"ok": true, "errors": [], ...}. | ||||||||||||||||||
| timeline_roll_toA | Move the timeline marker. Items after the marker are rolled back. WARNING: while the marker is not at the end, features created by other tools are inserted at the marker position, and they see the rolled-back model. Roll to "end" when done. Rolling into a collapsed group expands it. Returns {"marker_position", "count", "rolled_back_count"}. Example: timeline_roll_to(position="before", item=) -> add a feature that comes before the extrude, then timeline_roll_to(position="end"). | ||||||||||||||||||
| timeline_set_suppressedA | Suppress (or unsuppress) timeline items: a suppressed feature is skipped when the model is computed but stays in the timeline. All or nothing: if any item fails, or the change puts a feature into the error state (e.g. unsuppressing a feature whose references are gone), every item gets its previous state back and the call fails with the feature's message and details.reverted = true. allow_errors=true keeps such a change. Returns {"items": [item], "marker_position", "count"}. Example: timeline_set_suppressed(items=[]). Item: {"index" (informational only, never an address), "name", "type" (ExtrudeFeature, Sketch, TimelineGroup...), "ref", "is_group", "group": "timeline:" | null, "is_suppressed", "is_rolled_back", "health": "ok"|"warning"|"error"|"unknown", "message" | null, "component": "component:" | null}. | ||||||||||||||||||
| timeline_deleteA | Delete a timeline item (feature, sketch, construction element; a group with its contents). Without force the item is first suppressed as a probe: if other items fall into the error state, nothing is deleted and the call fails with INVALID_PARAMS and details.dependents. The probe recomputes the model (slow on big designs). Items that cannot be suppressed are deleted without the check (dependents_checked = false). With force=true new problems are reported in problems_after. Returns {"deleted": {"name", "type"}, "dependents_checked", "problems_after": [item], "marker_position", "count"}. Example: timeline_delete(item=). | ||||||||||||||||||
| timeline_renameA | Rename a feature, sketch, construction element or timeline group. Entity refs stay valid; a group's ref becomes 'timeline:'. Bodies are renamed with the body_* tools, not here. Returns {"item": item, "marker_position", "count"}. Example: timeline_rename(item=, name="Base"). | ||||||||||||||||||
| timeline_feature_parametersA | Model parameters created by a feature, and the keys its timeline_edit_* tool accepts. Returns {"feature": ref, "parameters": [{"name", "expression", "value", "value_unit" ("mm", "deg", "" or "fusion_internal" for other units), "role", "comment"}], "editable_keys": [...]}. Example: timeline_feature_parameters(feature=) -> [{"name": "d3", "expression": "20 mm", "value": 20.0, "value_unit": "mm", "role": "AlongDistance"}]. | ||||||||||||||||||
| timeline_set_model_parameterA | Set the expression of a model parameter (one created by a feature) by name. If the owning feature (or any other) falls into the error state, the old expression is restored and the call fails with the feature's message and details.reverted = true, unless allow_errors=true. User parameters are changed with parameter_update. Returns {"parameter": {"name", "expression", "old_expression", "value", "value_unit", "unit"}, "feature": item | null}. Example: timeline_set_model_parameter(name="d3", value=30) -> "30 mm". | ||||||||||||||||||
| timeline_edit_extrudeA | Change an existing extrude: distance (only distance extents, not to-object/ through-all), distance_two (two-sided extrudes) and taper_angle (degrees). Example: timeline_edit_extrude(feature=, distance=30). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_edit_revolveA | Change an existing revolve's angle (degrees; angle extents only) and angle_two (two-sided revolves). Example: timeline_edit_revolve(feature=, angle=180). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_edit_filletA | Set the radius of every constant-radius edge set of an existing fillet. Example: timeline_edit_fillet(feature=, radius=3). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_edit_chamferA | Set the distance of every equal-distance edge set of an existing chamfer. Example: timeline_edit_chamfer(feature=, distance=1.5). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_edit_holeA | Change an existing hole: diameter, depth (distance extents only), tip_angle,
counterbore_diameter/depth (counterbore holes), countersink_diameter/angle
(countersink holes). Lengths in mm (or Example: timeline_edit_hole(feature=, diameter=6.6, depth=12). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_edit_shellA | Change the inside and/or outside wall thickness of an existing shell (mm or
Example: timeline_edit_shell(feature=, inside_thickness=2). Returns {"feature": item, "changed": [{"key", "parameter", "old_expression", "new_expression", "value", "value_unit"}]} (values in mm / deg). All given keys are applied together; if the feature (or any other) falls into the error state everything is reverted and the call fails with FUSION_API_ERROR, details.reverted = true — unless allow_errors=true. A key that does not apply to this feature fails with INVALID_PARAMS and details.available_keys; no key at all fails with 'nothing to change'. | ||||||||||||||||||
| timeline_create_groupA | Group a contiguous range of top-level timeline items, first..last inclusive. Groups cannot be nested; the name must be unique in the timeline. Returns {"group": item (ref 'timeline:'), "members": [item], "marker_position", "count"}. Example: timeline_create_group(first=, last=, name="Base"). | ||||||||||||||||||
| timeline_set_group_collapsedA | Collapse or expand a timeline group (display only). Returns {"group": item + "is_collapsed", "marker_position", "count"}. Example: timeline_set_group_collapsed(group="timeline:Base", collapsed=true). | ||||||||||||||||||
| timeline_ungroupA | Remove a timeline group but keep its members in the timeline. Returns {"members": [item], "marker_position", "count"}. Example: timeline_ungroup(group="timeline:Base"). | ||||||||||||||||||
| assembly_listA | List the assembly structure of the active design: every component and every occurrence (nested ones by path) with transform, grounded, light bulb, visibility and joint count. Returns {"active_component": "component:", "components": [{"ref": "component:", "name", "is_root", "occurrence_count", "body_count", "part_number"}], "occurrences": [occurrence], "joint_count", "truncated"}. Occurrence object: {"ref": "occurrence:", "component", "full_path_name", "is_grounded", "is_visible", "is_light_bulb_on", "transform": {"translation_mm", "rotation"}, "joint_count"}. Example: assembly_list() -> {"components": [{"ref": "component:Box", ...}], "occurrences": [{"ref": "occurrence:Box:1", ...}], ...}. | ||||||||||||||||||
| assembly_new_componentA | Create an empty component with one new occurrence, under root or inside the
component of Returns {"component": "component:", "occurrence": occurrence}. Occurrence object: {"ref": "occurrence:", "transform", "is_grounded", ...}. The whole call is undone on failure. Example: assembly_new_component(name="Box") -> {"component": "component:Box", "occurrence": {"ref": "occurrence:Box:1", "transform": {"translation_mm": [0, 0, 0], ...}}}. | ||||||||||||||||||
| assembly_component_from_bodiesA | Turn bodies into a new component: the bodies move into a new component (one new occurrence in their current owner) and keep their position. All bodies must belong to the same component, otherwise INVALID_PARAMS and nothing is moved. Returns {"component": "component:", "occurrence": occurrence, "bodies": [new body refs, '@']}. Old body refs stop resolving; use the returned ones. Example: assembly_component_from_bodies(bodies=["Bd1=", "Bd2="], name="Lid") -> {"component": "component:Lid", "occurrence": {"ref": "occurrence:Lid:1", ...}, "bodies": ["Xy=@Lid:1", "Zw=@Lid:1"]}. | ||||||||||||||||||
| assembly_activateA | Activate an occurrence (new sketches and features then go into its component) or, without argument, the root component again. Returns {"active_component": "component:", "active_occurrence": "occurrence:" | null}. Example: assembly_activate(occurrence="occurrence:Lid:1") -> {"active_component": "component:Lid", "active_occurrence": "occurrence:Lid:1"}; assembly_activate() -> back to root. | ||||||||||||||||||
| assembly_rename_componentA | Rename a component. The root component cannot be renamed (INVALID_PARAMS). WARNING: occurrence paths contain the component name ('Box:1' -> 'Case:1'), so every old 'occurrence:Box:1' ref and '@Box:1' proxy ref stops resolving (ENTITY_NOT_FOUND); use the returned paths. Returns {"component": "component:", "occurrences": ["occurrence:", ...]}. Example: assembly_rename_component(component="component:Box", name="Case") -> {"component": "component:Case", "occurrences": ["occurrence:Case:1"]}. | ||||||||||||||||||
| assembly_add_occurrenceA | Insert another occurrence of an existing component (a referenced instance, or an
independent copy), under root or inside Returns {"occurrence": occurrence}. Occurrence object: {"ref": "occurrence:", "component", "transform", ...}. Example: assembly_add_occurrence(component="component:Bolt", translate_mm=[50, 0, 0]) -> {"occurrence": {"ref": "occurrence:Bolt:2", ...}}. | ||||||||||||||||||
| assembly_transform_occurrenceA | Move an occurrence in assembly space: relative (rotate about an axis through origin_mm, then translate by translate_mm, mm/degrees) or absolute (origin and X/Y axes). Grounded occurrences are refused (INVALID_PARAMS): unground them with assembly_set_occurrence_state first. Occurrences held by joints snap back to the joints on recompute (see "constrained_by_joints"); drive joints instead. Returns {"occurrence": occurrence, "captured": bool (a position snapshot was added in a parametric design), "constrained_by_joints": bool}. Example: assembly_transform_occurrence(occurrence="occurrence:Lid:1", translate_mm=[0, 0, 40]) -> {"occurrence": {"transform": {"translation_mm": [0, 0, 40], ...}}, "captured": true, ...}; rotate={"axis": [0, 0, 1], "angle_deg": 90}. | ||||||||||||||||||
| assembly_set_occurrence_stateA | Ground/unground an occurrence and/or switch its light bulb (visibility). Pass at least one of grounded, light_bulb. Returns {"occurrence": occurrence} with "is_grounded" and "is_light_bulb_on". Example: assembly_set_occurrence_state(occurrence="occurrence:Box:1", grounded=true). | ||||||||||||||||||
| assembly_deleteA | Delete an occurrence, a joint, an as-built joint, a joint origin or a rigid group. Other entities are refused (INVALID_PARAMS): use body_delete, sketch_delete or timeline_delete for them. Deleting the last occurrence of a component removes the component from the design. Returns {"deleted": {"name", "type"}}. Example: assembly_delete(item="occurrence:Box:2") -> {"deleted": {"name": "Box:2", "type": "Occurrence"}}. | ||||||||||||||||||
| assembly_create_joint_originA | Create a joint origin: a reusable snap point for joints, stored in the component that owns the geometry (so it moves with the part). Geometry refs seen through an occurrence ('@Lid:1') are fine: the origin is still created in component Lid. Use it later as {"kind": "joint_origin", "entity": } in assembly_create_joint. Returns {"joint_origin": {"ref" (in the occurrence context, '@', when the component has one), "native_ref" (inside the component), "name", "component": "component:"}}. Example: assembly_create_joint_origin(geometry={"kind": "planar_face", "entity": "Fc=@Lid:1", "key_point": "center"}, offset_mm=[0, 0, 5]) -> {"joint_origin": {"ref": "Jo=@Lid:1", "native_ref": "Jo=", "name": "Joint Origin1", "component": "component:Lid"}}. | ||||||||||||||||||
| assembly_create_jointA | Join two parts with a joint (created in the root component): geometry_one's part moves so its snap point lands on geometry_two's. Getting refs: call inspect_query(kind="edge" or "face", scope=["occurrence:Lid:1"]) and use the returned refs; entities inside occurrences look like '@' (e.g. 'AbC=@Lid:1'). A native ref of a component inserted once is accepted; if inserted several times you get INVALID_PARAMS with the candidate refs. motion keys per type (default in brackets; 'x'|'y'|'z' are axes of the joint, a ref of an edge/axis/face sets a custom direction): rigid - none; revolute - axis [z]; slider - direction [z]; cylindrical - axis [z]; pin_slot - axis [z], slide_direction [x]; planar - normal [z], primary_slide_direction (ref); ball - pitch_direction [z], yaw_direction [x]. For a hinge pass the hinge edge as the axis. Returns {"joint": {"ref", "name", "type", "occurrence_one", "occurrence_two", "values": {"rotation_deg" | "slide_mm" | ...}, "limits": {dof: {"min", "max", "rest"}}, "is_suppressed", "health", "message"}}. Nothing is left on failure. Example: assembly_create_joint(type="revolute", geometry_one={"kind": "curve", "entity": "E1=@Lid:1"}, geometry_two={"kind": "curve", "entity": "E2=@Box:1"}, motion={"axis": "E2=@Box:1"}) -> {"joint": {"type": "revolute", "values": {"rotation_deg": 0.0}, "occurrence_one": "occurrence:Lid:1", ...}}. | ||||||||||||||||||
| assembly_create_as_built_jointA | Join two occurrences where they already are (nothing moves), in the root component. geometry gives the joint position and axis (required except for rigid; refs inside occurrences look like '@'). motion keys as in assembly_create_joint. Returns {"joint": joint object as in assembly_create_joint}. Example: assembly_create_as_built_joint(type="revolute", occurrence_one="occurrence:Lid:1", occurrence_two="occurrence:Box:1", geometry={"kind": "curve", "entity": "E2=@Box:1"}) -> {"joint": {"type": "revolute", ...}}. | ||||||||||||||||||
| assembly_set_joint_limitsA | Set the motion limits of one degree of freedom: rotation/pitch/yaw/roll in degrees, slide/primary_slide/secondary_slide in mm. A number enables the limit, "off" disables it, omitted keeps it. dof must exist for the joint type (revolute: rotation; slider: slide; cylindrical/pin_slot: rotation, slide; planar: primary_slide, secondary_slide, rotation; ball: pitch, yaw, roll), and min must not exceed max, otherwise INVALID_PARAMS. Returns {"joint": joint object (see assembly_create_joint) with "limits"}. Example: assembly_set_joint_limits(joint="Jt=", dof="rotation", min=0, max=110) -> {"joint": {"limits": {"rotation": {"min": 0.0, "max": 110.0, "rest": null}}, ...}}. | ||||||||||||||||||
| assembly_drive_jointA | Move a joint to the given values (e.g. open a hinge to 90 degrees). Fusion keeps values inside the joint limits: dofs whose actual value differs from the request are listed in "clamped" (the actual value is in joint.values). Values are restored if Fusion fails. Returns {"joint": joint object (see assembly_create_joint), "requested": {dof: value}, "clamped": [dof], "captured": bool}. Example: assembly_drive_joint(joint="Jt=", values={"rotation": 90}) -> {"joint": {"values": {"rotation_deg": 90.0}, ...}, "requested": {"rotation": 90.0}, "clamped": [], "captured": true}. | ||||||||||||||||||
| assembly_create_rigid_groupA | Lock occurrences together so they move as one (a rigid group in the root component). Needs at least two different occurrences ('occurrence:' refs from assembly_list), otherwise INVALID_PARAMS. Nothing is left on failure. Returns {"rigid_group": {"ref", "name", "occurrences": ["occurrence:"], "include_children", "is_suppressed"}}. Example: assembly_create_rigid_group(occurrences=["occurrence:Box:1", "occurrence:Handle:1"]) -> {"rigid_group": {"ref": "Rg=", "name": "Rigid1", "occurrences": ["occurrence:Box:1", "occurrence:Handle:1"], ...}}. | ||||||||||||||||||
| assembly_list_jointsA | List the joints, as-built joints, joint origins and rigid groups of every component, with current joint values (degrees / mm), limits, suppression and health. Use it to check a mechanism after assembly_drive_joint. Returns {"joints": [joint], "as_built_joints": [joint], "joint_origins": [{"ref", "native_ref", "name", "component"}], "rigid_groups": [{"ref", "name", "occurrences", "include_children", "is_suppressed"}]}. Joint object: {"ref", "name", "type", "occurrence_one", "occurrence_two", "values": {"rotation_deg" | "slide_mm" | ...}, "limits": {dof: {"min", "max", "rest"}}, "is_suppressed", "health", "message"}. Example: assembly_list_joints() -> {"joints": [{"name": "Hinge", "type": "revolute", "values": {"rotation_deg": 90.0}, ...}], ...}. | ||||||||||||||||||
| assembly_analyze_interferenceA | Check whether parts overlap. Every interfering pair comes back with the overlap
volume (mm³) and its bounding box (mm); nothing is added to the design. Parts that
only touch are not reported unless include_coincident_faces=true. On big
assemblies pass the pairs you care about in Returns {"checked": , "count": , "interferences": [{"entity_one", "entity_two", "volume_mm3", "bbox": {"min_mm", "max_mm", "size_mm"}}]}. Example: assembly_analyze_interference(items=["occurrence:Box:1", "occurrence:Lid:1"]) -> {"checked": 2, "count": 0, "interferences": []}. | ||||||||||||||||||
| material_list_librariesA | Loaded material libraries (physical materials and appearances). Returns {"libraries": [{"id", "name", "is_native", "material_count", "appearance_count"}]}. Example: material_list_libraries() -> pick a library for material_list(library=...). | ||||||||||||||||||
| material_listA | Physical materials of one library, of every library (default) or of the design (in_design=true), filtered by a name substring and paginated. Returns {"items": [{"id", "name", "library"}], "total", "truncated"}; "library" is the library name or "design". Names are localized and not unique: pass the "id" to material_assign. Example: material_list(query="steel", limit=10). | ||||||||||||||||||
| material_getA | Physical material and appearance of a body, a component or an occurrence (an occurrence reports its component's material and its own appearance override). Returns {"target", "material": {"id", "name", "library"} | null, "appearance": {...} | null}. Example: material_get(target=""). | ||||||||||||||||||
| material_assignA | Assign a physical material (density, mass) to a body, a component or an occurrence. An occurrence has no own material: the material is set on its component and so applies to all occurrences of that component. Take the id from material_list; a name found in several libraries fails with details.candidates. Check the new mass with inspect_physical_properties afterwards. Returns {"target", "applied_to", "material": {"id", "name", "library"}, "previous": {...} | null} (+ "note" for an occurrence). Example: material_assign(target="", material=""). | ||||||||||||||||||
| appearance_listA | Appearances (visual look) of one library, of every library (default) or of the design (in_design=true), filtered by a name substring and paginated. Returns {"items": [{"id", "name", "library"}], "total", "truncated"}. Example: appearance_list(query="paint", limit=20). | ||||||||||||||||||
| appearance_assignA | Assign an appearance to a body, a face or an occurrence. A library appearance is copied into the design first (the library is never changed). A component has no appearance: assign it to its bodies or to an occurrence. Changes only the look, not the physical material (see material_assign). Returns {"target", "appearance": {"id", "name", "library": "design"}, "previous": {...} | null, "copied": bool}. Example: appearance_assign(target="", appearance=""). | ||||||||||||||||||
| appearance_set_colorA | Give a body, a face or an occurrence a plain colour: a design copy of Returns {"target", "appearance": {"id", "name", "library": "design"}, "created", "color": "#RRGGBBAA"}. Example: appearance_set_color(target="", color="#FF0000"). | ||||||||||||||||||
| export_cadA | Export the design, a component or an occurrence to STEP, IGES, SAT, SMT, an F3D archive or USDZ (if this Fusion supports USD). The path must be absolute, its directory must exist and its extension must match the format; an existing file is replaced only with overwrite=true (the old file is deleted first, so a failed export loses it). Exporting does not save the document (document_save does). Returns {"files": [{"path", "size_bytes"}], "format", "scope": | "root"}. Example: export_cad(path="C:/out/housing.step"). | ||||||||||||||||||
| export_meshA | Export the design, a component, an occurrence or a body as a mesh: STL, 3MF or OBJ (OBJ also writes .mtl). refinement low|medium|high, or custom with at least one of surface_deviation / normal_deviation / max_edge_length / aspect_ratio (numbers only; giving them without refinement="custom" is an error). The path must be absolute, its directory must exist and its extension must match the format; an existing file is replaced only with overwrite=true (the old file is deleted first). Exporting does not save the document. Returns {"files": [{"path", "size_bytes"}], "format", "scope"} (+ "warnings", e.g. file_units ignored for 3MF). Example: export_mesh(path="C:/out/bracket.stl", scope="", refinement="high"). | ||||||||||||||||||
| export_sketch_dxfA | Write a sketch to a DXF file (e.g. for laser cutting). Same path rules as export_cad; fails with FUSION_API_ERROR if this Fusion cannot export sketches to DXF. Returns {"files": [{"path", "size_bytes"}], "format": "dxf", "scope": }. Example: export_sketch_dxf(sketch="", path="C:/out/plate.dxf"). | ||||||||||||||||||
| import_fileA | Import a CAD file (STEP, IGES, SAT, SMT, F3D) or a mesh (STL, OBJ, 3MF) into a component of the active design. CAD files usually arrive as a new occurrence, meshes as mesh bodies. A failed import leaves the design as it was. Returns {"format", "target", "created": {"occurrences": [ref], "bodies": [ref], "mesh_bodies": [ref]}}. Example: import_file(path="C:/in/bolt.step"). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 154 tools
Most tools target clearly distinct resource/action pairs with strong domain prefixes (sketch_*, feature_*, body_*, assembly_*, timeline_*), and cross-references explicitly distinguish similar tools like feature_offset_faces vs surface_offset, body_move vs assembly_transform_occurrence, and parameter_update vs timeline_set_model_parameter. However, with 154 tools there are still several easily confused families (feature_fillet vs feature_rule_fillet, the timeline_edit_* tools vs their feature_* counterparts, sketch_dimension vs sketch_dimension_set), so selection risk is non-trivial.
The set follows a predictable domain-prefixed snake_case convention (sketch_draw, feature_extrude, body_combine, assembly_create_joint, sheet_metal_edge_flange) that is easy to scan. A handful of unprefixed utility tools (fusion_status, execute_python, measure_distance, viewport_screenshot, import_file, export_cad) mildly break the otherwise consistent pattern.
154 tools is far beyond a practical agent surface and forces heavy tool-selection overhead; many could be consolidated, e.g. the per-feature timeline_edit_* family, the multiple sheet metal tools, and the form tools. The CAD domain is broad enough that this is not an arbitrary mismatch, but the surface is still excessively large.
The surface is exceptionally complete across modeling, sketching, inspection, parameters, sheet metal, surfaces, T-splines, assemblies/joints, materials/appearances, documents, timeline management, and import/export. No major lifecycle dead ends are apparent; even minor gaps like direct primitive-body creation are workable via sketch+extrude.