fusion-mcp
Lets AI agents build and modify 3D models in Autodesk Fusion 360 through a local bridge add-in: create fully constrained parametric sketches with constraints, dimensions, trims, fillets and patterns, then turn them into solids and modify bodies with timeline features such as extrude, revolve, sweep, loft, rib, hole, thread, fillet, chamfer, shell, draft and offset faces; also supports construction planes/axes/points, model inspection (queries, descriptions, feature-tree health) and running arbitrary Python against the Fusion API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fusion-mcpCheck Fusion status, then make a 60x40x20 mm box centered at the origin"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fusion-mcp
MCP server that lets LLM agents (Claude Desktop, Claude Code, any MCP client) build models in Autodesk Fusion 360.
It has two parts:
FusionMCP add-in (
fusion_addin/) runs inside Fusion. It listens on127.0.0.1only, requires a random token and runs every request on Fusion's main thread.MCP server (
fusion-mcp,src/fusion_mcp/) is started by the MCP client over stdio and forwards tool calls to the add-in.
The add-in publishes its port and token in ~/.fusion-mcp/bridge.json while it runs.
Requirements
Autodesk Fusion 360 on Windows or macOS.
uv and Python ≥ 3.11 for the MCP server. The add-in uses Fusion's bundled Python and needs no extra packages.
Related MCP server: Fusion360 MCP Server
Install the add-in
Step-by-step guide for any machine, including manual install and troubleshooting: INSTALL.md.
From this directory (mcp-plugin/):
uv run fusion-mcp install-addinThis links fusion_addin/ into Fusion's AddIns folder as FusionMCP:
Windows:
%APPDATA%\Autodesk\Autodesk Fusion 360\API\AddIns\FusionMCP(a junction)macOS:
~/Library/Application Support/Autodesk/Autodesk Fusion 360/API/AddIns/FusionMCP(a symlink)
If links cannot be created on your machine, use uv run fusion-mcp install-addin --copy.
It copies the add-in and bundles the protocol package into FusionMCP/_vendor/. Re-run it
after every update.
The installer never touches a FusionMCP folder it did not create. To remove the add-in,
run uv run fusion-mcp uninstall-addin.
Restart Fusion. The add-in starts automatically. Its button is in the Utilities → Add-ins
panel and shows the state: FusionMCP: Running :7432 or FusionMCP: Stopped. Click it to
stop or start the bridge. The default port is 7432; if it is busy, the add-in picks a free
port and writes it to the discovery file.
Connect an MCP client
Print a ready config:
uv run fusion-mcp print-config # Claude Desktop
uv run fusion-mcp print-config --client claude-code # Claude Code (.mcp.json)The Claude Desktop output looks like this; merge it into claude_desktop_config.json:
{
"mcpServers": {
"fusion360": {
"command": "uv",
"args": ["run", "--directory", "/abs/path/to/mcp-plugin", "fusion-mcp"]
}
}
}For Claude Code, put the --client claude-code output into .mcp.json of your project,
or run claude mcp add fusion360 -- uv run --directory /abs/path/to/mcp-plugin fusion-mcp.
Check the connection
Ask the agent to call fusion_status. With Fusion and the add-in running it returns
the Fusion version, the add-in version, Fusion's Python version, the active document, the
design type and the document units. Otherwise the error starts with NOT_CONNECTED and
says what to start. The MCP server re-reads the discovery file on every reconnect, so
restarting Fusion or the add-in does not require restarting the client.
Tools
Tool | What it does |
| Connection check, versions, active document, design type, units |
| Runs Python inside Fusion ( |
Units: tool inputs are millimetres and degrees, and strings are Fusion expressions
("10 mm", "width / 2"). The Fusion API inside execute_python works in centimetres
and radians.
Errors come back as tool results with isError = true and the text
"<CODE>: <message>" plus JSON details (for example a Fusion traceback). This lets the
agent see what went wrong and fix it.
Sketches
The sketch_* tools (sketch_create, sketch_list, sketch_get, sketch_profiles,
sketch_draw, sketch_constrain, sketch_dimension, sketch_dimension_set,
sketch_set_construction, sketch_delete, sketch_transform, sketch_offset,
sketch_trim, sketch_extend, sketch_fillet, sketch_mirror, sketch_pattern,
sketch_project) build fully constrained, parametric 2D sketches. A typical sketch takes
sketch_create plus one sketch_draw with geometry, constraints and dimensions together.
Coordinates are sketch space, mm. Points are
[x, y]on the sketch plane (numbers only; theunitsparameter ofsketch_drawcan switch to cm/m/in/ft). Fusion picks the sketch axes:sketch_createandsketch_getreturntransform = {origin, x_axis, y_axis, normal}(model mm, unit vectors), and model = origin + x·x_axis + y·y_axis. Onorigin:XYsketch x/y are model x/y, but onorigin:XZthe sketch Y axis is model −Z: a point drawn at y = 10 ends up at z = −10. Readtransform, or give points in model space as{"model": [x, y, z]}(projected onto the sketch plane; an off-plane point adds a warning).Geometry is approximate, dimensions are exact. Expressions are refused in coordinates (
["w/2", 0]fails withINVALID_PARAMS). Exact and parametric sizes come from dimensions: a number is mm (degrees for angles), a string is a Fusion expression ("plate_w * 0.6").parameter_namenames a dimension's parameter, so later dimensions andparameter_updatecan use it.Local ids live for one call. Inside a
sketch_drawcall an item'sid, and sub-paths such asr.bottom,r.center,l1.endorslot.c0, can be used by later items, constraints and dimensions.originis the sketch origin point. The resultrefsmaps every local path to a real entity ref. Use those refs in later calls, because the local ids are gone after the call.Profile refs. Fusion profiles have no persistent id, and their order changes whenever the sketch changes. A profile is therefore addressed by its sketch and a point inside the region:
profile:<sketch token>@<x>,<y>(sketch mm). Mutating sketch tools andsketch_profilesreturn each profile withref, interiorpoint,area_mm2,centroid,bboxand its outer and inner loops. Pass the ref string to features as the profile. It stays valid through moderate dimension changes. If the region has moved away from the point, the feature fails withENTITY_NOT_FOUNDand the current profiles; callsketch_profiles(contains=[x, y])to get a fresh ref.Atomicity. Every mutating sketch tool is all or nothing. On failure, everything it created in the sketch is deleted and the changed properties (expressions, construction, fixed, positions) are restored. The error names
details.phase,indexandidof the failing item. Fusion cannot undo trim, extend and sketch fillet inside a batch, sosketch_trim,sketch_extendandsketch_fillettake one curve or corner per call. They replace curves, so use the refs they return for the next step. The one exception issketch_delete: it validates all refs before deleting anything, but if Fusion itself fails in the middle of the batch, the entities already deleted stay deleted (FUSION_API_ERRORwithdetails.deleted).Changing a sketch that features already use can break later timeline features. Check feature health afterwards (
inspect_tree).
Solid features
The feature_* tools turn sketches into solids and modify bodies, one parametric timeline
feature per call:
Tool | What it does |
| Extrude profiles, planar faces or sketch texts: one side, two sides or symmetric; distance, to an entity or through all; taper, start offset, thin wall |
| Revolve profiles around a sketch line, construction axis or straight edge: full, angle, two angles or to an entity |
| Sweep profiles along sketch curves or edges, with twist, taper, a guide rail and path share |
| Loft through profiles, planar faces and end points, with end conditions, rails or a centerline |
| Thin stiffening walls from open sketch curves, joined to the body |
| Simple, counterbore or countersink holes at a point, sketch points, offsets from edges or a circular edge's centre; optional |
| Cosmetic or modeled thread on cylindrical faces (hole or shaft is detected) |
| Read-only lookup of thread types, sizes, designations, classes and a recommendation for a diameter |
| Constant, variable or chord-length fillets on edges |
| Fillet all edges of faces/features, or the edges between two sets |
| Equal, two-distance or distance-angle chamfers |
| Hollow a body, removing faces (open shell) or closed, inside and/or outside |
| Tilt faces by a draft angle about a neutral plane |
| Press-pull faces by a signed distance |
Units. A plain number is a length in the tool's
units(default mm;cm,m,in,ftalso work) or an angle in degrees. Shares of a path, weights and counts are plain numbers. A string is a Fusion expression ("wall * 2","5 deg") and keeps the feature driven by user parameters.Where refs come from. Profiles come from
sketch_draw/sketch_profiles(profile:<sketch>@x,y) or a spec such as{"sketch": <ref>, "all": true}. Sketch curves and sketch points (paths, rails, rib curves, hole points) come from therefsofsketch_draw. Faces, edges, vertices and bodies come frominspect_query/inspect_describe. Planes, axes and points come fromconstruction_plane,construction_axis,construction_pointororigin:XY|XZ|YZ|X|Y|Z|O. Face, edge and body refs go stale after later features, so query them again from the latest model instead of reusing old ones.Operations. Extrude, revolve, sweep and loft take
operation=new_body(default),join,cut,intersectornew_component.participant_bodieslimits which bodies join/cut/intersect act on. Holes always cut, and ribs and webs always join: totarget_body, by default the one solid body their curves touch (none or several ->INVALID_PARAMSwithdetails.candidates). A rib grows on one side of its curve; if Fusion reports a warning, tryflip=true.thickness_location="side2"is not available in the current Fusion API.Result. Every feature tool returns
{"feature": {ref, type, name}, "health": {"state": ok|warning|error|unknown, "message"}, "created_bodies", "modified_bodies", "removed_bodies"}(body items are{ref, type, name, is_solid}), pluscomponentfornew_component,holes(the count) andthreadforfeature_hole, andthreadforfeature_thread. Body geometry is not repeated, so measure it with theinspect_*tools.Health and rollback. Bad input (a missing field for the chosen mode, a wrong entity kind, an unknown thread designation with
details.available) fails withINVALID_PARAMSbefore anything changes. A stale profile point fails withENTITY_NOT_FOUNDand the current profiles. If Fusion computes the feature in the error state, the tool fails withFUSION_API_ERROR(details.health,details.feature_type) and the timeline is rolled back. A tapped hole whose thread fails leaves neither the hole nor the thread. A warning keeps the feature and is reported inhealth. A feature the running Fusion API lacks (rib, web, rule or chord fillet on an old version) fails withFUSION_API_ERROR"... not available" and changes nothing, so useexecute_python.
Example: an open housing with four counterbored holes and one M5 tapped hole:
sketch_create(plane="origin:XY") -> sketch_draw(rectangle 80 x 50) -> profiles[0].ref
feature_extrude(profiles=[<profile>], side1={"type": "distance", "distance": 20})
feature_fillet(edges=<inspect_query edge, line, direction [0,0,1]>, radius=5)
feature_shell(faces=[<inspect_query face, normal [0,0,-1]>], inside_thickness=3)
sketch_create(plane=<top face>) -> sketch_draw(4 points) -> refs
feature_hole(placement={"type": "sketch_points", "points": [...]}, kind="counterbore",
diameter=5.5, cb_diameter=9, cb_depth=1.5, extent={"type": "through_all"})
feature_hole(placement={"type": "point", "face": <top face>, "point": [0, 0, 20]},
diameter=4.2, extent={"type": "through_all"}, thread={"designation": "M5x0.8"})Body operations & patterns
The pattern_* and body_* tools copy, combine and reshape bodies. Most of them add one
parametric timeline feature per call:
Tool | What it does |
| Copy features, bodies, faces or occurrences along one or two directions (quantity, spacing or extent, symmetric) |
| Copy them around an axis, including the axis of a cylindrical or conical face (quantity, total angle, symmetric) |
| Copy them along a path of sketch curves or edges (start share, flip, orientation along the path) |
| Mirror across a planar face, construction plane or origin plane. |
| Join, cut or intersect tool bodies with a target body (keep tools, new component) |
| Split bodies, or faces of a body, with a plane, face, body (or sketch curve for faces) |
| Move bodies, or copies of them ( |
| Scale about a point (default |
| Thicken faces of a surface into a solid |
| Make solids from the closed cells that bodies, faces and planes enclose |
| Delete faces and let Fusion heal the body, or replace faces with a face, plane or surface body |
| Rename, show or hide and set opacity, remove (a Remove feature) or delete bodies |
Units. Lengths and the
translate/rotate_aboutpoint and the matrix translation are in the tool'sunits(default mm). Angles are in degrees. Quantities, the pathstartshare (0..1) and scale factors are unitless numbers. Strings are Fusion expressions, except inrotate_aboutandmatrix, which take plain numbers.Input refs.
entitiesof a pattern must all be one kind: feature refs from earlierfeature_*results, body or face refs (c03inspect_query), or occurrence refs. Fusion patterns one kind at a time, and a mix fails withdetails.kinds. Directions, axes, planes and points come fromorigin:X|Y|Z|XY|XZ|YZ|O, from the c06construction_*tools, or from edges, faces and vertices ofinspect_query. Thecomputeoption (adjust,optimized,identical) only applies to feature input. Boundary fill cells are never picked by index. You pick them withcell_points; a point in no cell fails, anddetails.cellslists every cell's centre and volume.Result. Feature tools return the same result as the
feature_*tools:feature,health,created_bodies,modified_bodiesandremoved_bodies(tokens of consumed bodies). On top of that:occurrence patterns add
created_occurrences;body_split_faceadds the newfaces;body_movewithkeep_originaladdscopy.
Body tokens change after patterns and combines, so take the refs from the latest result.
body_rename,body_set_visibilityandbody_removereturn the body refs, the visibility state, and the removed refs withmode_used.Atomicity. Bad input fails with
INVALID_PARAMSbefore anything changes. A feature computed in the error state is rolled back. A copy made for a failedbody_moveis removed too.body_set_visibilityrestores every body's previous values if Fusion refuses one.body_removein a direct design always deletes the bodies, and Fusion cannot undo those deletions.
Example: a symmetric part from overlapping blocks:
feature_extrude(<20 x 20 mm square>, 10 mm) -> created_bodies[0] = cube
pattern_rectangular(entities=[cube], direction1="origin:X", quantity1=3, distance1=15,
direction2="origin:Y", quantity2=2, distance2=15)
pattern_mirror(entities=<all bodies>, plane="origin:YZ")
body_combine(target=cube, tools=<the other bodies>)Surfaces
The surface_* tools model with surface bodies (sheets without volume). Each call adds one
parametric timeline feature, except surface_trim_cells, which only previews:
Tool | What it does |
| Fill a closed boundary (sketch profile, sketch curves or edges) with a surface; continuity |
| Extend free edges of a surface body by a distance ( |
| List the cells a trim tool cuts the surfaces into (centre, bbox, area in mm); changes nothing |
| Trim with a body, face, plane or sketch curve and remove the cells nearest to given points |
| Remove all, external or internal (hole) loops of faces of surface bodies |
| Stitch surfaces along shared edges within a tolerance (default 0.1 mm); reports |
| Split faces or bodies (solid or surface) into separate surface bodies |
| Ruled surface from edges or sketch curves: |
| New surface bodies at a signed distance from faces (the faces stay; moving faces of a solid is |
Surface features from sketches.
feature_extrude,feature_revolve,feature_sweepandfeature_lofttakeis_solid(defaulttrue). Withis_solid=falsethey create a surface body: onlynew_body/new_component, nothinfor extrude. Extrude and sweep then also accept open sketch curves or edges as the profile (one kind, connected curves are chained), e.g. an open line extruded into a wall sheet.Trim cells by points. Cells of a trim are temporary and have no refs. Call
surface_trim_cellsfirst, then passsurface_trima point (inunits, default mm) on or near each cell to remove, such as a cell centre. A point farther thanmax_distancefrom every cell fails withINVALID_PARAMS, anddetails.cellslists the cells. The preview always cancels its trim input, so nothing stays half-built.Solid or not. Every body in a surface result has
is_solid.surface_stitchalso returns theis_solidof the stitched body:falsemeans gaps remain, so raisetoleranceor patch the openings. To give a surface a thickness, usebody_thicken(c08); to fill a closed set of surfaces with a solid, usebody_boundary_fill.Refs. Edges and faces come from
inspect_query, curves and profiles fromsketch_*. Surface bodies get new tokens after trim, extend and stitch, so take refs from the latest result. Bad input fails withINVALID_PARAMSbefore anything changes, and a feature in the error state is rolled back.
Example: a closed box from surfaces:
feature_extrude(profiles=[<20 x 20 mm square>], side1={"type": "distance", "distance": 20},
is_solid=false) -> walls
surface_patch(boundary=[<the square profile>]) -> bottom
surface_patch(boundary=[<the 4 top edges of walls>]) -> top
surface_stitch(surfaces=[walls, bottom, top]) -> is_solid = trueAssemblies
The assembly_* tools build multi-part designs: components, occurrences, joints and
interference checks.
Tool | What it does |
| Components and occurrences (transform, grounded, light bulb, visibility, joint count) |
| Empty component with a new occurrence (under root or a parent occurrence), or a component made from bodies of one component |
| Activate an occurrence (or root); rename a component (returns the new occurrence paths) |
| Insert another occurrence of a component, referenced or as an independent copy |
| Move or rotate an occurrence, or place it by origin and axes; the position is captured with a snapshot |
| Ground, show or hide an occurrence; delete occurrences, joints, joint origins, rigid groups |
| Joint origin on a point, face, curve or profile, in the component that owns the geometry |
| Rigid, revolute, slider, cylindrical, pin-slot, planar or ball joint (in root) |
| Joint limits per degree of freedom; move a joint to values (clamped values are reported) |
| Lock occurrences together; list joints, as-built joints, joint origins and rigid groups |
| Overlapping pairs of occurrences or bodies with volume and bounding box |
Refs. Components are
component:<name>, occurrencesoccurrence:<fullPathName>(occurrence:Box:1, nestedoccurrence:Box:1+Hinge:1). An entity seen through an occurrence is<native ref>@<occurrence path>(AbC=@Lid:1,origin:Z@Lid:1); all tools return and accept this form. A native ref of a component inserted exactly once is coerced to that occurrence; with several occurrences the error lists the candidates. Renaming a component changes its occurrence paths, so old refs stop resolving.Units. Lengths in mm, angles in degrees; joint values and limits use degrees for rotation/pitch/yaw/roll and mm for slides.
Atomicity. Created components, occurrences, joints and groups are removed on failure; names, grounding, visibility, transforms, joint values, limits and the active component are restored.
Example: a lid on a hinge:
assembly_new_component(name="Box"); assembly_new_component(name="Lid") # + geometry
assembly_set_occurrence_state(occurrence="occurrence:Box:1", grounded=true)
inspect_query(kind="edge", scope=["occurrence:Box:1"], direction=[1, 0, 0], ...) -> E2=@Box:1
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"})
assembly_drive_joint(joint=<joint ref>, values={"rotation": 90})
assembly_analyze_interference(items=["occurrence:Box:1", "occurrence:Lid:1"])Материалы, экспорт и импорт
Materials, appearances and file exchange:
Tool | What it does |
| Loaded libraries with their material and appearance counts |
| Items of one library, of every library or of the design ( |
| Physical material and appearance of a body, component or occurrence |
| Physical material (mass, density) for a body, a component, or an occurrence (applied to its component) |
| Appearance for a body, face or occurrence; a library appearance is copied into the design first |
| Plain RGBA colour ( |
| Design, component or occurrence to STEP, IGES, SAT, SMT, F3D archive or USDZ |
| Design, component, occurrence or body to STL, 3MF or OBJ (+ |
| A sketch to DXF |
| STEP, IGES, SAT, SMT, F3D (as occurrences/bodies) or STL, OBJ, 3MF (as mesh bodies, |
Ids, not names. Material and appearance names are localized and repeat across libraries. Take the
idfrommaterial_list/appearance_list. A name found in several places fails withdetails.candidates. Library items are never modified. Aftermaterial_assign, check the mass withinspect_physical_properties.Paths. Every path is absolute, and the extension must match the format (
.step/.stp,.iges/.igs,.sat,.smt,.f3d,.usdz,.stl,.3mf,.obj,.dxf). The tool never appends an extension for you. An export also needs the directory to exist; an import needs the file to exist. Bad paths fail withINVALID_PARAMSanddetails.reasonset tonot_absolute,bad_extension,parent_missing,is_directory,existsornot_found. The server checks the path before contacting Fusion.overwrite. An existing file is replaced only withoverwrite=true. The old file (and for OBJ its.mtl) is deleted before the export, so if that export then fails, the old file is gone. Every export reports the files it wrote with their sizes. An empty or missing file isFUSION_API_ERROR "export failed".Exporting F3D is not saving.
export_cad(format="f3d")writes a copy of the design to a local archive; the document itself stays unsaved and keeps its name. To save the document to the cloud project, usedocument_save(c04).Mesh settings. Custom refinement values are numbers:
surface_deviationandmax_edge_lengthinunits(default mm),normal_deviationin degrees, andaspect_ratio. Giving them withoutrefinement="custom"is an error.file_unitsapplies to STL and OBJ only (3MF returns a warning), andbinaryto STL only.Import. What was created is reported as refs in
created.occurrences,bodiesandmesh_bodies. An import that produces nothing fails, and in a parametric design its timeline items are rolled back. In a direct design, the created objects are deleted.
Листовой металл
Sheet metal rules, flanges, bends and the flat pattern:
Tool | What it does |
| Which sheet metal operations this Fusion API supports (no changes); |
| Design and library rules: thickness, bend radius, gap, relief sizes in mm with expressions, K-factor, relief shape |
| Design rule copied from a base rule (default: the library default) with new values |
| Active rule of a component; a library rule is copied into the design first |
| Solid plate body to sheet metal from a planar base face |
| Flat sheet metal body from closed profiles |
| Bent body from an open profile (sketch curves / edges), one side, symmetric or two sides |
| Wall on linear edges: height or to-entity, angle, width (full / symmetric / two sided / two offsets), height datum, bend position, mitered corners, flip, bend radius |
| Inner / outer bend face pairs with the radius in mm |
| Unfold all or selected bends about a stationary face; refold an unfold feature |
| The component's flat pattern: size, thickness, bend count, bend angles and directions |
| Flat pattern to DXF (bend / extent lines, file units, splines to polylines) or STEP |
Fusion API coverage:
Area | API | Status |
Rules, active rule, |
| stable |
Flat pattern and DXF export |
| stable |
STEP export of the flat pattern |
| preview |
Convert |
| preview |
Base / contour / edge flange |
| preview |
Bends, unfold, refold |
| preview |
Bend along a sketch line | — | none |
Check
sheet_metal_capabilitiesfirst. A tool built on a missing preview API fails withFUSION_API_ERRORanddetails = {"reason": "api_unavailable", "api": "<name>"}before it changes anything. Without the flange API a bracket needs the Fusion UI orexecute_python.No Bend along a sketch line. The Fusion API has no object for it (
sketch_bendis alwaysfalse). Model a bend withsheet_metal_edge_flange, or draw it into the open profile ofsheet_metal_contour_flange.Rules. A rule is addressed by its name and
source(design,library,all- design first). Numbers are inunits(default mm); strings are expressions that may useThickness("Thickness * 1.5"). Write units in expressions ("2 mm"): a rule in inches reads bare numbers as inches. Library rules are never changed. A failed call deletes the rule it created and restores the previous active rule. Fusion may refuse a rule on a component without sheet metal data; then passruleto the first flange tool.Refs change after every flange. Take edges and faces from the latest result or query them again with
inspect_query.Flat pattern. One per component, addressed by the component (default: root).
sheet_metal_create_flat_patternrefuses an existing one unlessreplace=true, and switches Fusion back to the design workspace afterwards.replaceis atomic: the tool remembers the stationary face (a component attribute) and recreates the old flat pattern if the new one fails; a flat pattern made in the UI cannot be restored, soreplacerefuses it (not_restorable) - delete it withsheet_metal_delete_flat_patternfirst. Export paths follow the export rules above (absolute,.dxf/.step/.stp,overwrite).
Bracket recipe:
sheet_metal_capabilities- checkcontour_flange,edge_flange,flat_pattern.sheet_metal_create_rule(name="Steel 2mm", thickness=2, bend_radius="Thickness * 1", k_factor=0.44).sketch_create(plane="origin:XY"), thensketch_drawwith two lines forming an open L.sheet_metal_contour_flange(profiles=[<line a>, <line b>], distance=50, rule="Steel 2mm").inspect_query(kind="edge", scope=[<body>])->sheet_metal_edge_flange(edges=[<outer edge>], height=20).sheet_metal_create_flat_pattern(stationary_face=<planar face>)->sheet_metal_export_flat_pattern(path="C:/out/bracket.dxf").
Формы (T-splines)
Organic shapes from T-spline bodies (the Form environment):
Tool | What it does |
| Form features of the design or a component with their T-spline bodies: control-mesh counts, bbox in mm, the B-Rep body ref |
| Box, plane, cylinder, sphere, torus or quadball with sizes in mm, face counts, origin / directions and symmetry ( |
| TSM (T-spline mesh) text or a |
| Control-mesh vertices (control and smooth positions), edges (start, end, midpoint, crease) and faces (center) in mm |
| Move vertices or faces picked by points, or the whole body, by a vector |
| Crease or smooth edges picked by points |
| Insert edges next to edges of one loop (preview API) |
| Independent B-Rep copy of the form's body (in a base feature), the source hidden |
Not parametric. The Fusion API takes primitive sizes as numbers: expressions and user parameters are refused (
INVALID_PARAMS"not parametric"), and a form does not follow parameter changes. A parameter of another shape (e.g.heightfor a sphere) is refused.Points, not indices. Control-mesh vertices, edges and faces have no stable ids (INV-7). The editing tools pick them by points in mm: take the vertex
position, the edgemidpointor the facecenterfromform_inspect. A point with nothing withintolerance(0.5 mm) or equally near two elements (symmetric meshes) fails withdetails.nearestand changes nothing.Atomic edits. Every selector is resolved before the first change; if a later move or crease fails, the earlier ones are undone. The form never stays in edit mode, and its B-Rep is regenerated after every call - a body without a B-Rep is an error (rolled back).
Convert = copy. The API has no "Convert" command:
form_convert_to_brepadds an independent copy of the form's B-Rep (later form edits do not change it) and hides the form, which stays in the timeline.TSM path for the rest. Pull, Bridge, Fill Hole, Weld / Unweld, Subdivide, Merge, Thicken, soft modification, sketch-driven forms (extrude / revolve / sweep / loft in Form), symmetry changes after creation and mesh-to-form conversion have no Fusion API. Read the TSM with
form_get_tsm, edit the text and create the body again withform_create_from_tsm(or useexecute_pythonfor what the API does have).form_insert_edgeuses the preview API: without it the tool fails withFUSION_API_ERRORreason="api_unavailable", nothing changed.
Handle recipe:
form_create_primitive(shape="box", x_size=80, y_size=20, z_size=20, x_faces=4).form_inspect(body=<body>, include=["faces"])- pick the face centers to pull.form_move(body=<body>, kind="face", near=[<center>], vector=[0, 0, 15]).form_crease(body=<body>, near=[<edge midpoint>])for a sharp edge.form_convert_to_brep(body=<body>, name="Handle")-> shell / fillet the solid as usual.
Limitations
Timeouts. Every request has a timeout (
execute_pythontakestimeout_s, default 60 s). The Fusion API cannot be interrupted, so when a request times out the operation keeps running in Fusion. Requests run one at a time, in order. Callfusion_statusbefore retrying.Atomicity needs a parametric design. If a tool fails in a parametric design (one with a timeline), the timeline items it added are rolled back. A direct-modeling design has no timeline, so there is no rollback. The error says so in
details.rollback = "unavailable_direct_design".Local only: the bridge accepts connections from
127.0.0.1with the token from the discovery file. There is no remote access.
Development
uv run pytest -q # unit tests (adsk stubs, fake bridge)
uv run pytest -m fusion # smoke tests on a live Fusion with the add-in running
uv run ruff check . && uv run ruff format --check . && uv run mypy .Hot reload of the add-in
Fusion keeps the add-in's modules in sys.modules, so an edit to a linked install is not
picked up until the add-in restarts. To load edited handler code into the running add-in:
uv run fusion-mcp reload-addin # calls dev.reload, prints reloaded modules and handler countIt clears the handler registry, drops the add-in's modules (and fusion_mcp.protocol.*) from
sys.modules, imports them again (handlers first) and points the globals of the modules it
keeps (the entry point's Context, say) at the new classes. Exit code is non-zero on error:
an import error in an edited module comes back as FUSION_API_ERROR with the traceback
(status.get and dev.reload keep working); fix the file and run reload-addin again. A
few modules hold the running bridge and are never reloaded: the entry point FusionMCP.py,
core/server.py, core/dispatcher.py, core/registry.py and fusion_mcp.protocol.errors /
wire / discovery. After changing one of them restart the add-in: Utilities > Add-ins >
FusionMCP > Stop, Run. A change to handlers/dev.py itself takes effect on the second
reload-addin. dev.reload is for development only and is not an MCP tool.
Available Tools
154 toolsappearance_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="").
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Ref of a body, a face or an occurrence (not a component) | |
| library | No | Library name or id to resolve an ambiguous name | |
| appearance | Yes | Appearance id from appearance_list (preferred) or exact name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: library appearances are copied into the design, the source library is never changed, and the operation affects only visual appearance. It also discloses the return shape including previous and copied. It does not explain failure behavior or permissions, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, caveats second, return shape third, and an example last. Every sentence contributes useful information and no space is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is unusually complete. It covers allowed targets, the component restriction, the library-copy behavior, the distinction from material assignment, and the return structure, leaving little an agent needs to infer before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains target, library, and appearance. The description adds a usage example and reinforces that appearance should come from appearance_list, but it does not add new meaning beyond the schema, especially for the library parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: assign an appearance to a body, face, or occurrence. It distinguishes the tool from material_assign by stating that it changes only the look, not the physical material. The target scope is clearly bounded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: components have no appearance, so assignment must go to bodies or an occurrence, and material assignment is explicitly routed to material_assign. It does not compare against appearance_set_color or otherwise enumerate all sibling alternatives, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (max 1000) | |
| query | No | Case-insensitive substring of the name, e.g. 'steel' | |
| offset | No | Items to skip (pagination) | |
| library | No | Library name or id (see material_list_libraries); omit for all libraries | |
| in_design | No | List only the items already in the active design |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does disclose the return envelope (items/total/truncated) and default scope behavior, which are the traits an agent most needs here. It stops short of stating read-only guarantees or any permission/precondition context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Scope statement is front-loaded in the first sentence, followed by the return shape and a single compact example. No filler, and each sentence contributes distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so describing the returned fields and the truncation flag is essential and is done here. All five parameters are covered by schema plus description, and the default-scope semantics are spelled out, leaving nothing an agent needs before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter; the description adds value by explaining the interaction between library and in_design (omitting library means all libraries) and by showing a concrete example call. It does not add format or edge-case detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (appearances / visual look) plus the three scoping modes: one library, all libraries (default), or the active design. This clearly separates it from siblings like appearance_assign and appearance_set_color, which mutate rather than enumerate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the default scope (every library) and the condition that switches to design-only results (in_design=true), plus points to material_list_libraries for resolving library names. It lacks an explicit 'not for assignment' note, but the read-only listing framing makes the boundary clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appearance_set_colorA
Give a body, a face or an occurrence a plain colour: a design copy of base (or
of the target's current appearance) with the RGBA colour is assigned. An identical
copy made earlier is reused ("created": false). Library appearances are not changed.
Returns {"target", "appearance": {"id", "name", "library": "design"}, "created", "color": "#RRGGBBAA"}.
Example: appearance_set_color(target="", color="#FF0000").
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Appearance id/name to copy; default: the target's appearance | |
| name | No | Name of the design appearance; default "MCP <base> #RRGGBB" | |
| color | Yes | "#RRGGBB", "#RRGGBBAA" or [r, g, b] / [r, g, b, a] with 0..255 | |
| target | Yes | Ref of a body, a face or an occurrence (not a component) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that an identical copy made earlier is reused (returning "created": false), that library appearances are left untouched, and what the return payload contains. It does not cover permissions or whether the appearance is applied or only created/assigned beyond the implied assignment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the reuse rule, then the non-mutation caveat, then an explicit return shape and a worked example. Slightly awkward phrasing ('with the RGBA colour is assigned') and the example is near-redundant, but there is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description spells out the returned keys, the reuse flag, and the scope boundaries (design copies only, library untouched) — enough for correct invocation. What is missing is negligible: no note on how the assignment interacts with occurrence-level overrides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: `base` falls back to the target's current appearance, and the example shows the `target` ref plus a hex `color`. It does not explain the `name` default beyond the schema, but it does more than restate the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (assign a plain colour to a body/face/occurrence) and clarifies the mechanism: it creates a design copy rather than touching library appearances. The scope is clear, though the sibling `appearance_assign` is never named, so the distinction between the two has to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Library appearances are not changed' and 'a design copy of base' hint that this tool is for creating derived design appearances rather than assigning existing library ones. There is no explicit when-to-use or when-to-prefer-an-alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| occurrence | No | Occurrence ref; omit to activate the root component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden — and it does disclose the key side effect (where new geometry goes) plus the exact return shape. It omits preconditions such as requiring an open/active document.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effect, followed by the return contract and a concrete example. The example earns its place since there is no output schema, though it is slightly redundant with the prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool this covers purpose, default behavior, and return values adequately. Error/failure behavior and document preconditions are the only notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents the single optional parameter; the description adds real meaning by explaining what omission does (activate root) and what activation implies for subsequent modeling operations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (activate) and resource (an occurrence / the root component) and explains the practical effect — subsequent sketches and features land in that component. An agent can distinguish it from the sibling assembly_set_occurrence_state or document_activate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers the two calling modes: pass an occurrence to activate it, or omit the argument to return to the root component. It does not name alternatives or prerequisites (e.g., needing an occurrence ref from assembly_list), leaving some inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assembly_add_occurrenceA
Insert another occurrence of an existing component (a referenced instance, or an
independent copy), under root or inside parent, offset by translate_mm (mm).
Independent copies need a Fusion version with Occurrences.addNewComponentCopy
(otherwise FUSION_API_ERROR).
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", ...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No | Parent occurrence ref; default: the root component | |
| component | Yes | Component: 'component:<name>' (an occurrence ref means its component) | |
| independent | No | true: an independent copy (new component 'Name (1)'); false: another instance of the same component (edits affect all instances) | |
| translate_mm | No | [dx, dy, dz] in mm, in assembly space |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the version prerequisite and error behavior for independent copies, the shared-edit semantics of instances (edits affect all instances), and the return shape. It omits things like undo behavior or what happens if `parent` is invalid, but the important behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then modes, then prerequisites and return shape, ending with a compact example. The example is useful but slightly redundant with the schema; overall it is tight and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations and no output schema, the description supplies purpose, prerequisite, return shape, and an example. It lacks explicit guidance on picking this over sibling component-creation tools, but otherwise an agent has what it needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by clarifying that translate_mm is an offset in assembly space at this call, and the example concretely shows component/translate_mm usage. It doesn't elaborate on `parent` (e.g. how paths are formed) beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: insert another occurrence of an existing component, with the two modes (referenced instance vs independent copy) and placement (under root or `parent`, offset by translate_mm). This clearly distinguishes it from siblings like assembly_new_component and assembly_component_from_bodies, which create components rather than insert occurrences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: independent copies require a Fusion version with Occurrences.addNewComponentCopy, otherwise FUSION_API_ERROR, so the agent knows when the independent path is viable. It does not explicitly name the alternative tools (assembly_new_component / assembly_component_from_bodies) or state when to prefer them, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 items - the full check is slow.
Fewer than two items -> INVALID_PARAMS.
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": []}.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Occurrences ('occurrence:<path>') and/or bodies to check against each other; default: every occurrence and the root bodies | |
| include_coincident_faces | No | Also report parts that only touch (coincident faces) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it declares the operation is read-only in effect ('nothing is added to the design'), discloses a performance cost ('the full check is slow'), defines the default exclusion of merely-touching parts, and specifies the failure condition. That is a complete behavioral profile for a query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints, then return shape; each sentence carries information an agent needs to call it correctly. The inline return-shape block and the worked example overlap slightly, costing a bit of tightness, but neither is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description supplies the full response contract — `checked`, `count`, and the interference entries with volume and bbox fields — plus a worked example. Combined with the parameter and cost guidance, an agent has everything needed to invoke and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains that omitting `items` checks every occurrence plus root bodies, that `items` is the escape hatch for large assemblies, and that the minimum of two items is enforced with INVALID_PARAMS. It doesn't add format details on occurrence path syntax beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check whether parts overlap') plus the exact payload returned (overlap volume in mm³ and bounding box in mm). It is clearly distinguishable from sibling measurement tools like measure_distance or inspect_bounding_box because it reports pairwise interference rather than single measurements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance: pass `items` on big assemblies because the full check is slow, and set include_coincident_faces=true only if touching parts matter. The error threshold (fewer than two items -> INVALID_PARAMS) is also stated. It stops short of naming a sibling alternative for simpler proximity questions, which is why it isn't a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"]}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Component name (unique in the design) | |
| bodies | Yes | Body refs, all owned by the same component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the mutation, position preservation, atomic failure behavior, and the critical fact that old body refs stop resolving. That is exactly the kind of post-call behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then covers behavior and return shape, then a concrete example. The example and return block are somewhat redundant with each other, but both are useful for ref handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by specifying the exact return keys and showing body refs in '<token>@<occurrence path>' form. Combined with the atomicity and ref-invalidation notes, it is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%: the schema documents that name is unique in the design and bodies must be owned by the same component. The description mostly repeats those constraints and adds an example, but does not add substantial parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turn existing bodies into a new component. It is distinguishable from siblings like assembly_new_component and assembly_add_occurrence because it explicitly consumes existing body refs and creates one occurrence in their current owner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for use and a hard precondition: all bodies must belong to the same component, otherwise INVALID_PARAMS and nothing moves. It does not explicitly name a competing sibling or say when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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", ...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Joint name | |
| type | Yes | Joint type (degrees of freedom) | |
| motion | No | Motion axes, same keys as assembly_create_joint | |
| geometry | No | Joint position/axis; required for every type except rigid | |
| occurrence_one | Yes | Occurrence: 'occurrence:<fullPathName>' (e.g. 'occurrence:Box:1', nested 'occurrence:Box:1+Hinge:1') as returned by assembly_list | |
| occurrence_two | Yes | Occurrence: 'occurrence:<fullPathName>' (e.g. 'occurrence:Box:1', nested 'occurrence:Box:1+Hinge:1') as returned by assembly_list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that no geometry is moved (the defining behavior of an as-built joint), that both occurrences must live in the root component, and that geometry is optional only for rigid joints. It omits failure modes — duplicate or conflicting joints, permission/activation preconditions, and whether an existing joint blocks creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences plus a compact worked example — the key constraint ('nothing moves') and the rigid/geometry rule come first. The telegraphic style ('refs inside occurrences look like...') costs a little readability but contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, it supplies the missing return shape ('Returns {"joint": ...}') and a concrete end-to-end example, which is exactly the gap left by the absence of an output schema. What remains unstated — preconditions around document activation and error behavior — matters but is secondary for a straightforward creation call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents occurrence refs, the geometry union, and the type enum; a baseline of 3 applies. The description restates the rigid-joint exception and the '<token>@<path>' ref shape that the schema already covers, adding only the pointer that motion keys follow assembly_create_joint, which is genuine but marginal added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Join two occurrences') plus the distinguishing behavioral trait ('where they already are (nothing moves)'), which separates it cleanly from assembly_create_joint, the sibling that positions components. The creation scope ('in the root component') further narrows it so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'where they already are (nothing moves)' implicitly defines the use case versus assembly_create_joint, and it repeatedly cross-references that sibling for shared semantics (motion keys, return shape). It does not explicitly state the inverse condition ('use assembly_create_joint when you need to place/position an occurrence'), so the exclusion is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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", ...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Flip the direction of geometry_one | |
| name | No | Joint name | |
| type | Yes | Joint type (degrees of freedom) | |
| angle | No | Rotation about the joint Z: degrees or expression | |
| motion | No | Motion axes of the type; values 'x'|'y'|'z' or a ref, see below | |
| offset | No | Offset along the joint Z: mm number or expression | |
| geometry_one | Yes | Snap on the MOVING part (it moves to geometry_two) | |
| geometry_two | Yes | Snap on the part it joins |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses root-component placement, that geometry_one's part moves, the failure behavior ('Nothing is left on failure'), and the INVALID_PARAMS case for ambiguous native refs. It does not discuss permissions or broader destructive impact, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and then organized into refs, motion keys, return shape, and an example. For an 8-parameter joint creation tool, the detail is largely justified, though it is dense enough that some tightening could improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description needs to carry return and failure behavior, which it does by documenting the returned joint object and failure cleanup. It also covers reference formats, ambiguous reference errors, and per-type motion requirements, making it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is already 100%, the description adds substantial meaning beyond the schema: it defines the motion keys and defaults for each joint type, explains axis semantics, and clarifies that geometry_one is the moving snap while geometry_two is the target. The worked example further anchors expected parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create a joint joining two parts, with the important scope note that it is created in the root component. It also clarifies which side moves, distinguishing the join semantics clearly enough for an agent to understand the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for using the tool and explains how to obtain valid references via inspect_query. It does not explicitly compare against sibling tools such as assembly_create_as_built_joint or assembly_create_joint_origin, so it lacks full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}}.
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Flip the origin's Z axis | |
| name | No | Joint origin name | |
| angle | No | Rotation about the origin's Z: degrees or expression | |
| geometry | Yes | Where the origin snaps (kind joint_origin refused) | |
| offset_mm | No | [x, y, z] offset of the origin along its own axes: mm numbers or Fusion expressions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the non-obvious storage semantics (origin is created in the owning component, so it moves with the part) and that occurrence-scoped refs like '<token>@Lid:1' are accepted and normalized. It omits mutation side effects, whether creation is idempotent, and what happens on failure, so it is not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key structural behavior, then supporting detail. The return-value JSON and the worked example are somewhat verbose but both convey information an agent needs; little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by spelling out the return shape (ref, native_ref, name, component) and the distinction between occurrence-context and in-component refs. Combined with the example and the downstream usage note, an agent has everything needed to call and consume the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds genuine meaning beyond the schema by explaining how entity refs are interpreted across occurrence context and by walking through a concrete call with geometry, key_point, and offset_mm. It does not elaborate on flip/angle/name beyond the schema, so it is incremental rather than comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a joint origin') and immediately defines what it is ('a reusable snap point for joints') and where it lives (component that owns the geometry). It explicitly distinguishes itself from the sibling assembly_create_joint by describing the downstream consumption pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the intended lifecycle: create here, then reference as {"kind": "joint_origin", ...} in assembly_create_joint. That is clear guidance on when this tool is the right one. It does not state exclusions or when-not-to-use (e.g., why not create the joint directly), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"], ...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Rigid group name | |
| occurrences | Yes | At least two occurrences to lock together | |
| include_children | No | Also lock the occurrences nested inside them |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the behavioral burden and does so well for core behavior: it explains that occurrences move as one, requires different occurrence refs, and states 'Nothing is left on failure,' which discloses atomic failure behavior. It does not cover permissions or all side effects, but the main behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and prerequisite are front-loaded, followed by failure behavior and return shape. The example is useful and does not obscure the key call requirements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates by stating prerequisites, failure semantics, return object shape, and a concrete example. That is sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents occurrences, name, include_children, and even the occurrence path example. The description reinforces the two-occurrence minimum and assembly_list source, but mostly repeats schema content rather than adding substantial new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Lock occurrences together so they move as one (a rigid group in the root component).' This clearly distinguishes the tool from assembly joint creation and timeline group tools by specifying the rigid-group concept and root-component scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage conditions: at least two different occurrences, using 'occurrence:<path>' refs from assembly_list, with INVALID_PARAMS otherwise. It lacks explicit routing to alternatives such as assembly_create_joint or timeline_create_group, but the context for when this tool applies is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}}.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | Occurrence, joint, as-built joint, joint origin or rigid group ref |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses important behavior: invalid inputs are refused, and deleting the last occurrence of a component removes the component from the design. It also describes the return shape. It does not discuss irreversibility, permissions, or undo behavior, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded around the deletion scope and alternatives. The return shape and example are included without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete tool with full schema description coverage and no output schema, the description covers scope, alternatives, refusal behavior, side effect, return shape, and an example. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the single item parameter. The description adds useful meaning with an example reference format, occurrence:Box:2, though it does not fully document reference syntax beyond that example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and precisely enumerates the resource types it deletes: occurrences, joints, as-built joints, joint origins, and rigid groups. It explicitly distinguishes itself from siblings by naming body_delete, sketch_delete, and timeline_delete for other entity types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool by listing accepted entity types and when not to use it by saying other entities are refused with INVALID_PARAMS. It also names the alternative sibling tools for those refused cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| joint | Yes | Joint or as-built joint ref (assembly_list_joints) | |
| values | Yes | Target value per degree of freedom: degrees for rotation/pitch/yaw/roll, mm for slides | |
| capture_position | No | Fix the new position with a timeline 'Position' snapshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that Fusion clamps values to joint limits, reports offending dofs in 'clamped', and that values are restored if Fusion fails. It also explains the capture_position side effect (a timeline 'Position' snapshot) and the complete return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by behavioral caveats, return shape, and a worked example — every block earns its place. The parenthesized return-shape enumeration is dense but functional; structure could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object mutation tool with no output schema and no annotations, the description supplies everything an agent needs: what it does, limit-clamping semantics, failure rollback, the exact return keys, and a worked call/response pair. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining the clamped/requested relationship and by showing in the example how the request key 'rotation' surfaces as 'rotation_deg' with the actual applied value. It does not add much on capture_position beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a joint to the given values') and immediately grounds it with a concrete example ('open a hinge to 90 degrees'). This is clearly distinguishable from assembly_create_joint, assembly_set_joint_limits, and assembly_list_joints, which each operate on different aspects of joints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'move' and the hinge example; there is no explicit statement of when to prefer this over siblings like assembly_set_joint_limits or assembly_create_as_built_joint. Useful behavioral context (limit clamping, rollback on failure) is present but is not framed as guidance on choosing the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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", ...}], ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max components and max occurrences |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full disclosure burden. It does well by publishing the complete return shape, including a 'truncated' flag, which signals that results can be capped. It never explains the truncation rule, what happens on a non-assembly document, or that the call is a read-only snapshot, so meaningful behavioral gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the return documentation is dense but genuinely informative given the absence of an output schema. The final 'Example' line largely restates the schema-of-return already given, so a small amount of the length is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description takes on the burden of describing returns and does so thoroughly, down to the occurrence object's fields. It falls short only on truncation/limit behavior and preconditions (e.g. requiring an active assembly context), which an agent would need to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter and schema coverage is 100%, with the schema itself describing it as 'Max components and max occurrences', so baseline 3 applies. The description never mentions the limit at all, so it adds nothing beyond the schema and does not connect the limit to the 'truncated' return field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List the assembly structure of the active design') and then enumerates exactly what is included: components, nested occurrences by path, transform, grounded/visibility flags and joint counts. That level of specificity lets an agent distinguish it from inspect_tree or assembly_list_joints without consulting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope ('active design') and the listed return fields, so an agent can infer this is the structure-inspection call. However, there is no explicit when-to-use statement, no exclusion, and no routing to alternatives such as assembly_list_joints for joint detail or inspect_tree for the general model tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}, ...}], ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. The verb 'List' and the detailed return contents make the read-only diagnostic purpose clear, but it does not explicitly state side effects, permissions, or active-document requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then justifies its length with detailed return-object documentation and an example because no output schema exists. Every section adds useful information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter list tool with no output schema and no annotations, the definition is complete: it explains what is listed, when to use it, and the exact shape of the returned joints, joint origins, and rigid groups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so there is no parameter semantics to document. The empty input schema is sufficient, and the baseline for zero-parameter tools applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource set: 'List the joints, as-built joints, joint origins and rigid groups of every component', with the exact data returned (values, limits, suppression, health). It is clearly distinguishable from sibling tools like assembly_drive_joint and assembly_create_joint because it is a read/list operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case: 'Use it to check a mechanism after assembly_drive_joint.' However, it does not name exclusions or alternatives such as assembly_list for components, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assembly_new_componentA
Create an empty component with one new occurrence, under root or inside the
component of parent, optionally offset by translate_mm (mm). Build its geometry
after activating it (assembly_activate) or by targeting the component.
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], ...}}}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Component name (unique in the design) | |
| parent | No | Parent occurrence ref; default: the root component | |
| translate_mm | No | [dx, dy, dz] in mm, in assembly space |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses that the new component is empty, that exactly one occurrence is created, that parent defaults to root, and that the whole call is undone on failure. It also documents return shape, which is important because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded and the description is generally efficient. The return-shape details and example are useful given the lack of an output schema, though they add some length and slight redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is complete enough: it explains the created objects, parent behavior, offset semantics, failure atomicity, and expected return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description reinforces parent placement and translate_mm units, but it adds little beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create an empty component with one new occurrence. It also specifies scope (under root or inside the parent component) and optional offset, which clearly distinguishes this from sibling tools that add occurrences or create components from bodies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: create the component first, then build geometry after activating it via assembly_activate or by targeting the component. It does not explicitly contrast with sibling alternatives such as assembly_add_occurrence or assembly_component_from_bodies, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"]}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Component name (unique in the design) | |
| component | Yes | Component: 'component:<name>' (an occurrence ref means its component) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it discloses the non-obvious side effect that occurrence paths embed the component name, that dependent refs break with ENTITY_NOT_FOUND, the exact failure mode for the root component, and the return payload shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by a clearly marked WARNING, then return shape, then a compact example. Every block (constraint, side effect, return, example) earns its place and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations and no output schema, the description supplies the return structure, error codes, and the downstream ref invalidation an agent could not infer. Nothing needed to invoke or recover from the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, which sets the baseline at 3. The worked example ('component="component:Box", name="Case"') does illustrate the ref format and expected emission, but adds only marginal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rename a component') and its scoping constraint (root component cannot be renamed). The 'component:<name>' ref vocabulary and the occurrence-path discussion separate it from sibling renames such as body_rename or timeline_rename, though those siblings are never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear exclusion ('the root component cannot be renamed (INVALID_PARAMS)') and actionable follow-up guidance ('use the returned paths' because old occurrence and proxy refs stop resolving). It stops short of naming an alternative tool to use when a rename is not appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}}, ...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| dof | Yes | Degree of freedom of the joint's type | |
| max | No | Limit in degrees (rotations) or mm (slides); "off" disables it | |
| min | No | Limit in degrees (rotations) or mm (slides); "off" disables it | |
| rest | No | Limit in degrees (rotations) or mm (slides); "off" disables it | |
| joint | Yes | Joint or as-built joint ref (assembly_list_joints) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses mutation semantics (omitted keeps the existing limit), validation failure mode (INVALID_PARAMS), and the return payload shape with a worked example. It omits permission/undo considerations, but the critical behavioral facts for correct invocation are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and units, then constraints, then return shape and example — dense and mostly waste-free. Some unit/'off' semantics duplicate the schema text, a minor redundancy in an otherwise efficient block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return structure, an example response, the error code on invalid input, and full DOF validity rules. An agent has everything needed to call it correctly in one read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning: the enable/disable/keep semantics of null vs number vs 'off', the per-joint-type valid DOF mapping, and the min<=max constraint. This goes beyond the terse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the motion limits of one degree of freedom') and immediately enumerates the DOF vocabulary in units, so the agent knows exactly what is being modified. It is clearly distinguishable from sibling joint tools (assembly_create_joint, assembly_drive_joint, assembly_list_joints).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions — dof must exist for the joint type (with a per-type mapping) and min must not exceed max — plus the value convention (number enables, 'off' disables, omitted keeps). It does not explicitly compare against alternatives such as assembly_create_joint, which may also accept limits, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| grounded | No | Fix the occurrence in place (ground) | |
| light_bulb | No | Show (true) or hide (false) the occurrence | |
| occurrence | Yes | Occurrence: 'occurrence:<fullPathName>' (e.g. 'occurrence:Box:1', nested 'occurrence:Box:1+Hinge:1') as returned by assembly_list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It successfully communicates the operational behavior (ground/visibility change) and provides the precise return structure, which adds valuable behavioral context beyond the input schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is brief and efficient. It uses two concise sentences and an example to convey the core functionality, constraints, and expected output without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, the description is highly complete. It covers the primary actions, the required arguments, and the expected response format, leaving no ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with clear descriptions for all parameters. The description does not add new semantic meaning beyond what the schema already documents, though it correctly notes which properties are actionable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the action (Ground/unground/switch light bulb) and the resource (an occurrence). It is specific enough to distinguish this state-setting tool from generic assembly modification tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Pass at least one of grounded, light_bulb' serves as a mandatory usage constraint, preventing the agent from calling the tool without necessary parameters. The provided example also clarifies correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| rotate | No | Rotation about an axis (applied before translate_mm) | |
| absolute | No | Absolute placement; excludes translate_mm and rotate | |
| occurrence | Yes | Occurrence: 'occurrence:<fullPathName>' (e.g. 'occurrence:Box:1', nested 'occurrence:Box:1+Hinge:1') as returned by assembly_list | |
| translate_mm | No | [dx, dy, dz] in mm, in assembly space | |
| capture_position | No | Fix the new position with a timeline 'Position' snapshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses mutation semantics, grounded-occurrence refusal behavior, joint-recompute override behavior, position-capture behavior, and the exact return keys including constrained_by_joints. It also provides a concrete example with expected response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core operation and mode distinctions, then failure cases, then return shape, then a compact example. Every sentence contributes actionable information with no wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is complete: it covers operation modes, constraints, error behavior, required ungrounding workflow, joint-related caveats, and return-value structure. An agent has enough information to call it correctly and interpret common outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful semantic context beyond the schema: it explains relative versus absolute modes, the order of rotate then translate, units of mm/degrees, and gives an example of rotate and translate values. It does not add much beyond the already detailed nested schema, so a 4 rather than 5 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Move an occurrence in assembly space.' It distinguishes the two supported modes, relative and absolute, and names the exact sibling needed to unground an occurrence, so an agent can identify the tool without opening its schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when the tool refuses to operate (grounded occurrences, with INVALID_PARAMS), what to do instead (use assembly_set_occurrence_state first), and how to handle joint-controlled occurrences (drive joints instead). These are concrete when/when-not guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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]])
| Name | Required | Description | Default |
|---|---|---|---|
| tools | Yes | Bodies, faces and planes that bound the cells | |
| units | No | Unit of plain-number lengths | mm |
| operation | No | new_body (default), join, cut, intersect, new_component | new_body |
| cell_points | No | Fill only the cells containing these [x, y, z] points (in `units`); omitted = every cell | |
| remove_tools | No | Remove the tool bodies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses failure modes (INVALID_PARAMS with nothing changed, FUSION_API_ERROR with rollback) and the resolution path via details.cells center/volume. It does not spell out the side effect on tool bodies when remove_tools is left at its default, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then scope rules, ref provenance, errors, return shape and an example in tight blocks. Dense but nearly every line earns its place; the error sentence is slightly overloaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return keys (feature, health, created/modified/removed_bodies), the error contract, and a concrete example. An agent has everything needed to invoke this correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds genuine meaning: cell_points selects by containment rather than index, omitted means every cell, tools are entity refs sourced from inspect_query/origin prefixes. Units behavior for the point coordinates is only partly covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (boundary fill producing solids from closed cells) and states the exact precondition — cells enclosed by tool bodies, faces and planes. It is clearly distinguishable from adjacent body tools such as body_combine or body_split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains how cells are selected (points, never index; all cells by default), where refs come from (inspect_query for bodies/faces, origin:*/construction_* for planes) and gives a worked example call. It stops short of explicitly contrasting with sibling tools like body_combine, so it is strong context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=[, ])
| Name | Required | Description | Default |
|---|---|---|---|
| tools | Yes | Tool bodies (not the target) | |
| target | Yes | Body that receives the result | |
| operation | No | join (default), cut or intersect | join |
| keep_tools | No | Keep the tool bodies | |
| new_component | No | Put the result in a new component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses mutation of the target, consumption of tools, component creation, ref token invalidation after the feature, and specific error behaviors (INVALID_PARAMS with nothing changed, FUSION_API_ERROR with rollback). This is unusually complete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then behavior, refs, errors, returns, and an example — a logical progression with no filler sentences. The parenthetical asides are dense but each carries load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description explicitly lists the return keys (feature, health, created_bodies, modified_bodies, removed_bodies, plus component), and covers error cases and ref lifecycle. An agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: how keep_tools affects removed_bodies, that new_component yields a 'component' key in the result, and what target vs tools mean semantically. It stops short of documenting the ref token format that the schema's item description covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource (boolean combination of bodies) and enumerates the three operations (join, cut, intersect) against a target body. This is clearly distinguishable from siblings like body_split or surface_stitch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It sets clear context: the target receives the result, tools are consumed unless keep_tools is true, and refs must come from inspect_query or earlier results. It does not explicitly name alternatives or exclusion conditions (e.g. when to prefer body_split or surface_stitch), keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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>])
| Name | Required | Description | Default |
|---|---|---|---|
| faces | Yes | Face refs (inspect_query); re-query after later features |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does it well: it discloses automatic gap healing, two distinct error modes with their error codes and whether state is preserved or rolled back, and the shape of the returned payload. The remaining gap is undo/timeline-editability context for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by input provenance, error behavior, return keys, and an example — each line performs a distinct job with no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so documenting the return keys is necessary and done here; combined with error codes, rollback behavior, prerequisite sourcing, and an example, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds real value by telling the agent where the refs must come from (inspect_query on the latest body) and warning to re-query after subsequent features. The example also shows multiple faces accepted at once, which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete faces from a body') and immediately clarifies the distinctive healing semantics (e.g. remove a fillet or a boss), which separates it from body_remove (whole body) and body_replace_face without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('Faces from inspect_query on the latest body') and a worked example call, plus the caveat to re-query after later features. It stops short of naming alternatives such as body_remove or timeline_edit_fillet, so it does not reach the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
body_moveA
Move (or copy and move) bodies as a Move feature in the timeline.
Transforms: translate (x/y/z in units or expressions; design_space=false uses the
component axes), translate_along (straight edge/axis + distance), rotate (axis ref +
angle in degrees), rotate_about (free axis: point [x,y,z] in units, direction
vector, numeric angle in degrees), align (move point from onto point to: vertex,
sketch/construction point, origin:O), matrix (16 numbers row-major, a rigid rotation +
translation in units; use body_scale to scale). keep_original=true copies with
Copy/Paste (a non-associative copy; for associative copies use pattern_*), and only
the copies move. Refs: bodies/edges/vertices from inspect_query, axes/points from
origin:* or construction_*.
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_move(bodies=[b], transform={"type": "translate", "z": 50})
body_move(bodies=[b], transform={"type": "rotate", "axis": "origin:Z", "angle": 90}, keep_original=true)
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain-number lengths | mm |
| bodies | Yes | Body refs (inspect_query / earlier results) | |
| transform | Yes | {"type": "translate", x, y, z, design_space} | {"type": "translate_along", entity, distance} | {"type": "rotate", axis, angle} | {"type": "rotate_about", point, direction, angle} | {"type": "align", from, to} | {"type": "matrix", matrix: 16 numbers} | |
| keep_original | No | Copy the bodies first and move only the copies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses failure modes (INVALID_PARAMS for non-rigid matrix or wrong ref kind, with nothing changed; FUSION_API_ERROR for legacy expressions/component-space moves) and exactly which bodies move or are copied. It also describes the return payload, including the 'copy' field when keep_original is set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then organizes transforms, refs, errors, returns, and examples into scannable chunks. Dense but each paragraph carries information; slightly long for a single tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, it covers transforms, ref sources, error taxonomy, mutation semantics (copy vs move), return shape, and concrete examples. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value by explaining transform variants that the schema only enumerates: design_space=false uses component axes, matrix must be rigid row-major with translation in `units`, translate_along takes a straight edge/axis plus distance, and rotate_about takes a point plus direction. Some overlap with existing schema descriptions keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move/copy) and resource (bodies) and explains that it creates a Move feature in the timeline. It distinguishes itself from pattern_* (associative copies) and body_scale (scaling), so the agent can separate it from siblings at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use pattern_* for associative copies, body_scale for scaling, inspect_query for body/edge/vertex refs, and origin:*/construction_* for axes and points. keep_original semantics (copies are non-associative) are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=[])
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | remove (default): a Remove feature in the timeline (reversible); delete: delete the bodies | remove |
| bodies | Yes | Body refs (inspect_query / earlier results) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so thoroughly: it discloses reversibility per mode, the direct-design override with mode_used='delete', and the partial-failure caveat that a later failure cannot restore earlier deleted bodies. It also documents error behavior (non-body ref -> INVALID_PARAMS, nothing removed) and the return shape, which is more than most mutation tools provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is front-loaded with the core action and then layered as mode semantics, errors, returns, and an example, with no filler sentences. The trailing example ('body_remove(bodies=[<tool body>])') is largely redundant given the required-parameter schema and is the only part that does not earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by enumerating the returned keys (removed, features, mode_used). Combined with the mode semantics and the documented error case, an agent has everything needed to call this mutation safely without further probing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning the schema alone does not: it explains what happens downstream in the timeline for each mode and the special direct-design case where mode is ignored. The bodies parameter is explained mainly by reference to inspect_query, which is adequate given the schema's own item-level ref documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Remove bodies from the design') and immediately splits the operation into two well-defined modes, so the agent knows exactly what the tool does. It stops short of differentiating itself from nearby siblings such as body_delete_faces, body_split, or assembly_delete, so an agent still has to infer the boundary from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional guidance for the key decision: mode=remove keeps a timeline feature that can be suppressed/deleted to restore bodies, mode=delete removes them, and direct designs always delete regardless of mode. What's missing is any statement of when to reach for this tool instead of the adjacent body-editing or assembly-deletion tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Body ref | |
| name | Yes | New name (trimmed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does well: it declares the exact return payload ({"body": {ref, type, name}, "previous_name": str}) and the failure modes (empty name, non-body ref -> INVALID_PARAMS). It omits whether renaming affects downstream references or is reversible, which would matter for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core constraint is front-loaded in the first line, followed by return shape, error modes, and one compact example. Every line earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no annotations and no output schema, the description supplies the return shape and error contract that structured fields would otherwise provide. Only side-effect scope (impact on dependent features/references) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema ('Body ref', 'New name (trimmed)'). The description's example confirms the parameter shape but adds no semantics beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rename a body') and immediately scopes it with '(not a timeline feature)', which separates it from the sibling timeline_rename. An agent can pick this tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical exclusion implicitly routes timeline feature renaming to timeline_rename, giving the agent a clear decision boundary. It stops short of naming that sibling outright or describing prerequisites (e.g. body must exist in the active design).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=)
| Name | Required | Description | Default |
|---|---|---|---|
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| target | Yes | Face, construction plane / origin:XY|XZ|YZ or surface body | |
| tangent_chain | No | Also replace tangent-connected faces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses the body-growth/shrink effect, invalid-target behavior with INVALID_PARAMS and no changes, and FUSION_API_ERROR with rollback. It does not cover permissions or idempotency, but mutation and failure semantics are substantially explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core operation, then organizes refs, errors, return keys, and an example into compact sections. Every line contributes actionable information without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description usefully names the return keys and error cases, and the example clarifies invocation. It could further clarify return-value meanings such as health, but is otherwise complete for this CAD mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the schema, including tangent_chain's default. The description reinforces ref sources and target validity but adds little parameter-level meaning beyond the schema, matching the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: replace faces of a body with a target face, plane, or surface body, and describes the geometric effect (body grows or shrinks). This clearly distinguishes it from face-deletion or offset operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides valid sources for face refs, planes, and surface bodies, and explicitly says a solid body is not a valid target. It stops short of naming when to choose sibling tools like body_delete_faces or feature_offset_faces, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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})
| Name | Required | Description | Default |
|---|---|---|---|
| point | No | Base point: origin:O (default), vertex, sketch/construction point | origin:O |
| bodies | Yes | Body refs (inspect_query / earlier results) | |
| factor | No | Uniform factor (unitless, > 0) | |
| factors | No | Non-uniform {x, y, z} factors instead of `factor` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it specifies that factors are unitless with no unit conversion, that exactly one of factor or factors should be passed, and that INVALID_PARAMS errors leave nothing changed. It also lists return fields, though it does not discuss permissions, reversibility, or whether bodies are modified in place versus creating new bodies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, then compactly covers constraints, references, errors, return shape, and examples. Every sentence adds useful information for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is quite complete: it covers parameter usage, validation errors, return fields, and examples. Minor missing context includes how the operation affects the timeline or whether it always creates a feature versus modifying bodies in place.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it clarifies that factors are unitless and > 0 or Fusion expressions, that factor and factors are mutually exclusive, and where valid body and point references originate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: scaling bodies about a base point, with uniform and per-axis modes. It is clear what the tool does, though it does not explicitly differentiate itself from other body transformation siblings such as body_move.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to choose between factor and factors and where body and point references come from, which implies usage context. However, it does not state when to use this tool versus alternatives like body_move or when scaling would be inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| bodies | Yes | Body refs (inspect_query / earlier results) | |
| opacity | No | 0 = transparent .. 1 = opaque | |
| visible | No | Light bulb on/off |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses atomic rollback behavior, the meaning of is_visible versus light_bulb, hidden-component inheritance, error conditions, and the return shape. That is substantial behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then layers atomicity, effective visibility, errors, return shape, and an example. It is appropriately sized and every section adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema and no annotations, the description compensates by documenting the result object, error behavior, atomicity, and effective visibility semantics. An agent has enough information to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds important parameter interplay: at least one of visible or opacity must be supplied, and opacity must be within 0..1. It also clarifies that visible controls the light bulb while opacity controls transparency.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: show/hide bodies via light bulb and/or set opacity. It is distinct in meaning, though it does not explicitly contrast itself with nearby body/appearance tools, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the stated capability, but there is no explicit guidance on when to choose this tool over related tools such as appearance_set_color or body tools. The description gives operational behavior, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Splitting tool: construction plane, origin:XY|XZ|YZ, face or body | |
| bodies | Yes | Body refs (inspect_query / earlier results) | |
| extend_tool | No | Extend the tool to cut through the whole body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses mutation outcomes (created_bodies, modified_bodies, removed_bodies), error modes, and rollback behavior for failed splits. It also documents the return keys, giving the agent a clear picture of side effects and failure handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and then compactly covers references, errors, returns, and an example. Every section earns its place, and the example reinforces correct invocation without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's mutation complexity, the lack of annotations, and no output schema, the description is complete: it covers purpose, valid inputs, error behavior, rollback semantics, return fields, and an example. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all three parameters, including extend_tool. The description adds useful reference provenance for bodies and tool but does not explain extend_tool behavior, so it provides only marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: split bodies into parts using a plane, face, or another body. It clearly identifies the operation and tool types, but does not explicitly distinguish itself from the sibling body_split_face, which could cause ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides practical usage context: valid references come from origin/construction planes, inspect_query, or earlier results, and it includes a concrete example. It does not explicitly state when to choose this tool over alternatives such as body_split_face, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
direction; closest_point: project to the closest points. Refs: faces/bodies from
inspect_query, planes from origin:* / construction_*, curves from sketch_* results.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Face, construction/origin plane, body or sketch curve | |
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| direction | No | along_vector: straight edge, sketch line, axis or plane | |
| split_type | No | intersection (default), along_vector (needs direction), closest_point | intersection |
| extend_tool | No | Extend the tool across the faces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does: it names error codes and their causes (INVALID_PARAMS with no change, FUSION_API_ERROR for unsupported split types), gives the default of extend_tool, and enumerates the returned keys including health and created/modified/removed bodies. This is well beyond a bare purpose statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then a compact mode list, a refs line, an errors line, a return shape, and one concrete example — every line carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers what it does, valid inputs, failure modes, and the return payload, which is everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the cross-parameter constraint (along_vector requires direction; direction with any other type is an error) and clarifies extend_tool's role in relation to the tool. Marginal gain is real, though the per-parameter meanings themselves are already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Split faces of a body with a tool') plus the reason (separate faces for draft, offset, colors), which distinguishes it from body_split, body_delete_faces, or surface_trim. An agent can tell what it produces — new faces — without opening anything.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the three split modes (intersection along the tool, along_vector projecting along direction, closest_point) and where to obtain valid refs (inspect_query, origin:*/construction_*, sketch_* results). It doesn't explicitly route the agent between this and body_split or body_delete_faces when the goal is ambiguous, but the operational conditions for each mode are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
body_thickenA
Thicken faces (usually of a surface body) into a solid.
Units: thickness in units (default mm) or a Fusion expression. Faces from
inspect_query.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Also take tangent-connected faces | |
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths | mm |
| operation | No | new_body (default), join, cut, intersect, new_component | new_body |
| symmetric | No | Grow to both sides | |
| thickness | Yes | Signed thickness; negative = the other side |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does real work: it declares the failure modes and their atomicity ("INVALID_PARAMS (nothing changed)", "FUSION_API_ERROR, rolled back") and the exact return payload. It omits permission/selection preconditions, but the mutation semantics are unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by units, errors, return shape and an example, in a scannable labelled layout. Minor redundancy in restating the units default already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return payload, and it covers error behavior and the thickness/unit semantics for a 6-parameter mutation tool. It leaves the `operation` modes (join/cut/intersect) unaddressed in prose, which matters for predicting whether existing bodies are altered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds meaning by clarifying that thickness may be a plain number in `units` or a Fusion expression, plus a concrete invocation example. `chain`, `symmetric`, `operation` and `faces` semantics are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Thicken faces ... into a solid") with a scope qualifier ("usually of a surface body") that separates it from surface tools. It never names a sibling it supersedes or replaces, so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Faces from inspect_query" gives a workflow link and the input provenance, and the schema adds the re-query-after-later-features caveat. It does not say when to use this over feature_offset_faces, body_boundary_fill or a surface route, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
construction_axisA
Create a construction axis — for revolve, circular patterns, joints.
Give method and exactly its fields:
method | fields |
two_points | points (2 refs) |
edge | edge (straight) |
cylinder | face (cylinder, cone or torus): its axis |
perpendicular_at_point | face, point (on that face): normal through it |
two_planes | plane, plane2: their intersection line |
Refs: origin:XY|XZ|YZ|X|Y|Z|O or refs from inspect_query (e.g. a hole face:
inspect_query(kind="face", surface_type="cylinder")). A wrong entity kind fails
with INVALID_PARAMS and details {param, expected, got}; a definition Fusion
cannot build (parallel planes, a point off the face) fails with FUSION_API_ERROR
and leaves the timeline unchanged.
Returns {"ref", "type": "ConstructionAxis", "name", "origin_mm", "direction", "health", "warning"?}.
Examples:
construction_axis(method="cylinder", face=)
construction_axis(method="two_planes", plane="origin:XZ", plane2="origin:YZ")
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Straight edge, sketch line or axis ref | |
| face | No | cylinder: round face; perpendicular_at_point: face | |
| name | No | Name of the new element | |
| plane | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| point | No | origin:O, a vertex, sketch point or construction point | |
| method | Yes | How the axis is defined | |
| plane2 | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| points | No | two_points: 2 point refs | |
| component | No | component:/occurrence: ref; default: active component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the two distinct failure modes (INVALID_PARAMS with a structured details payload for wrong entity kinds, FUSION_API_ERROR for unbuildable geometry) and states that a failed build leaves the timeline unchanged. It also spells out the return payload inline, so the agent knows what it gets back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a compact table for the branching logic, then error behavior, then two concrete call examples. Dense but every block carries distinct information; no sentence is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with one required discriminator, no output schema, and no annotations, this covers everything an agent needs: method selection, ref syntax, failure semantics, mutation-on-failure guarantee, and return shape. There is no meaningful gap left.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds something the schema structurally cannot express: the per-method field requirements in the table, including how many points 'two_points' needs and the constraint that the 'perpendicular_at_point' point lies on the given face. It also documents the ref-string vocabulary and points at inspect_query for deriving face refs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a construction axis') and immediately names the downstream consumers (revolve, circular patterns, joints). An agent can distinguish this from construction_plane and construction_point without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The method table is effectively a decision guide: it tells the agent which geometric situation maps to which method (two points, straight edge, cylindrical face, face+point, two planes). What is missing is sibling-level routing — nothing says when to reach for construction_plane or construction_point instead — so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
construction_planeA
Create a construction plane — a reference for sketches, mirrors, splits.
Give method and exactly its fields (others are refused with INVALID_PARAMS and
the list of fields the method takes):
method | fields |
offset | plane, distance |
angle | edge (axis of rotation), angle, plane |
midplane | plane, plane2 (midway between them) |
two_edges | edge, edge2 (coplanar straight edges) |
three_points | points (3 refs) |
tangent | face (cylinder/cone), plane, angle = 0 |
tangent_at_point | face (cylinder/cone), point |
along_path | path, proportion (0..1, normal to path) |
Refs: origin:XY|XZ|YZ|X|Y|Z|O or refs from inspect_query / inspect_tree. Lengths
are mm, angles degrees; a string is a Fusion expression ("height / 2") and keeps
the plane driven by it. A wrong entity kind (e.g. a cylindrical face as plane)
fails with INVALID_PARAMS and details {param, expected, got}; a definition Fusion
cannot build fails with FUSION_API_ERROR and leaves the timeline unchanged.
Returns {"ref", "type": "ConstructionPlane", "name", "origin_mm", "normal", "health", "warning"?}.
Examples:
construction_plane(method="offset", plane="origin:XY", distance=15)
construction_plane(method="midplane", plane=, plane2=)
construction_plane(method="along_path", path=, proportion=0.5)
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | origin:X|Y|Z, a construction axis, an edge or sketch line | |
| face | No | Face ref (from inspect_query) | |
| name | No | Name of the new element | |
| path | No | Edge or sketch curve ref | |
| angle | No | Degrees or expression | |
| edge2 | No | origin:X|Y|Z, a construction axis, an edge or sketch line | |
| plane | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| point | No | origin:O, a vertex, sketch point or construction point | |
| method | Yes | How the plane is defined | |
| plane2 | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| points | No | three_points: 3 point refs | |
| distance | No | mm (negative = against the normal) or expression | |
| component | No | component:/occurrence: ref; default: active component | |
| proportion | No | Share of the path length, 0..1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses that mismatched fields yield INVALID_PARAMS with the accepted field list, that wrong entity kinds return details {param, expected, got}, and that a Fusion failure raises FUSION_API_ERROR and leaves the timeline unchanged. It also notes units (mm/degrees) and that string expressions keep the plane driven by that expression — genuine behavioral context not available in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One-line purpose, then a compact table, then ref/units/error notes, then return shape and three examples. Front-loaded and dense with no filler sentences; the table replaces what would otherwise be paragraphs of prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, single-required-parameter tool with no output schema, the description supplies the method matrix, ref formats, error contracts, and the return object shape (ref, type, name, origin_mm, normal, health, warning), which is exactly what an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by documenting cross-parameter constraints (method → exactly its fields) and the ref grammar `origin:XY|XZ|YZ|X|Y|Z|O`, which the per-property descriptions only partially cover. Units and expression-string semantics reinforce this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Create a construction plane') and immediately states its role ('a reference for sketches, mirrors, splits'). Alongside siblings construction_axis and construction_point, the plane/axis/point distinction is clear from the name plus this gloss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The method table is effectively usage guidance: each row tells the agent which defining fields a given construction mode requires, with inline qualifiers ('midway between them', 'coplanar straight edges', 'cylinder/cone'), and it warns that extra fields are refused. It lacks explicit 'when to use this instead of constructing a sketch plane' or exclusions versus siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
construction_pointA
Create a construction point — a joint origin, a hinge center, a sketch anchor.
Give method and exactly its fields:
method | fields |
vertex | point (vertex, sketch point or construction point) |
two_edges | edge, edge2: their intersection |
three_planes | plane, plane2, plane3: their intersection |
edge_plane | edge, plane: where the edge crosses the plane |
center | entity: center of a circle, arc, sphere or torus |
Points by coordinates are sketch points (sketch_draw), not construction points.
Refs: origin:XY|XZ|YZ|X|Y|Z|O or refs from inspect_query (e.g. a hole edge:
inspect_query(kind="edge", curve_type="circle")). A wrong entity kind fails with
INVALID_PARAMS and details {param, expected, got}; a definition Fusion cannot
build (edges that do not meet) fails with FUSION_API_ERROR and leaves the timeline
unchanged.
Returns {"ref", "type": "ConstructionPoint", "name", "point_mm", "health", "warning"?}.
Examples:
construction_point(method="center", entity=)
construction_point(method="three_planes", plane="origin:XY", plane2="origin:XZ", plane3="origin:YZ")
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | origin:X|Y|Z, a construction axis, an edge or sketch line | |
| name | No | Name of the new element | |
| edge2 | No | origin:X|Y|Z, a construction axis, an edge or sketch line | |
| plane | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| point | No | origin:O, a vertex, sketch point or construction point | |
| entity | No | center: circular edge/arc, sketch circle/arc, sphere or torus face | |
| method | Yes | How the point is defined | |
| plane2 | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| plane3 | No | origin:XY|XZ|YZ, a construction plane or a planar face | |
| component | No | component:/occurrence: ref; default: active component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does so well: it discloses the two failure modes (INVALID_PARAMS with details{param, expected, got} for wrong entity kinds; FUSION_API_ERROR for unbuildable definitions), states that failed builds leave the timeline unchanged, and previews the return payload including a possible warning. It stops short of mentioning permissions or how the point appears in the timeline on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb, then a compact decision table, then pitfalls, return shape and two short examples — every block earns its place. The closing examples overlap somewhat with the table's method list, which is the only waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no annotations and no output schema, the description covers the conditional parameter contract, accepted ref syntax and provenance, error behavior, and the return fields. An agent has everything needed to call it correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds genuinely new meaning the schema cannot express: the conditional mapping of each `method` value to exactly which of the 10 optional fields must be supplied, plus the intersection/center semantics of each method. It also names accepted ref forms and the source tool for them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a construction point') and immediately scopes it with concrete use cases (joint origin, hinge center, sketch anchor). It also explicitly draws the boundary against the nearest confusable operation, sketch points made by coordinates via sketch_draw.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The method table tells the agent exactly which case applies and which fields go with it, and it routes the coordinate-based case to sketch_draw and points the agent at inspect_query for refs. It doesn't address the neighboring construction_axis/construction_plane tools or assembly_create_joint_origin, but for this resource the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the return contract including the direct-design null case for timeline_count. However it omits operational behavior: what happens if no document is active, whether it requires an open/linked document, and confirmation that it is non-mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by a compact, well-structured return schema; every element listed is distinct and informative. Slightly dense formatting but no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must define the return value, which it does thoroughly (design_type, units, document, root_component, counts, and the direct-design null case). The only gap is the precondition around needing an active design and error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate; the baseline of 4 applies. The description correctly implies the call is parameterless.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (settings of the active design) and enumerates exactly which settings are returned, so an agent knows precisely what it gets. The read intent is implied by 'Returns' rather than an explicit verb, and it doesn't contrast itself with the design_set_units/design_set_type siblings, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of prerequisites (an active design/document must exist), and no pointer to design_set_units or design_set_type as the mutating counterparts. The agent must infer that this is the read-side twin of those setters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| design_type | Yes | parametric or direct | |
| confirm_discard_history | No | Required for parametric -> direct; only if the user agreed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that the operation deletes the entire feature history and parameters, that this is irreversible with no rollback, the exact guard parameter and its failure mode, and the returned fields ('changed', 'history_discarded'). This is exactly the destructive-operation context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive consequence in the first paragraph, then preconditions, then return values, then a one-line example. Capitalized warnings and arrow notation make the two directions scannable, and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-annotation, no-output-schema tool, everything an agent needs is present: mode semantics, destructive side effects, guard requirement, error outcome, no-op case, return fields, and a usage example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the consequence behind confirm_discard_history (what is actually discarded and that the user must agree) and by framing design_type as a mode switch rather than a plain enum. Some of the flag's wording overlaps the schema description, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Switch the active design between parametric (timeline) and direct modelling,' with both enum states named. This clearly distinguishes it from read-only siblings like design_get_settings and from design_set_units, which changes unit preferences rather than modelling mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers each direction (parametric -> direct, direct -> parametric, and same-type no-op), states the precondition (confirm_discard_history=true), instructs the agent to ask the user first, and names the failure behavior (INVALID_PARAMS, nothing changes). No inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| units | Yes | Distance display units |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the mutation's limited blast radius (display only, tool inputs unchanged) and states the return value references design_get_settings. It does not mention persistence with the document, undo behavior, or whether an active design is required, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the critical caveat and return note in two short sentences. The example line is mildly redundant given the schema enum, and the odd line wrapping costs a little polish, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, it covers purpose, the key semantic caveat, and where the return value is documented (design_get_settings). Missing only edge-case handling such as requiring an active design or persistence behavior, which are minor for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already constrains values to mm/cm/m/in/ft, so the schema does most of the work. The description adds real meaning by explaining what the parameter governs (display units and units for unitless expressions) and gives a concrete call example, going slightly beyond the schema's terse 'Distance display units'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change the distance units Fusion displays and uses') and scopes it to the active design, plus explicitly clarifies what the change does NOT affect (numbers passed to tools stay in mm). This distinguishes it cleanly from the related design_get_settings, which it names as the return-value reference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use (changing display units / unitless expression units in the active design) and pre-empts the most likely misuse by stating that numeric values in tool calls are unaffected. It lacks an explicit 'use X instead when...' exclusion, but the scope is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 details.candidates. A ref that matches no open document is
ENTITY_NOT_FOUND.
Returns the document's info (see document_list) with "is_active": true.
Example: document_activate(document="document:file:urn:adsk.wipprod:dm.lineage:abc").
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | Document ref from document_list: 'document:file:<id>' or 'document:<name>' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the global side effect on all other tools, two specific error outcomes (INVALID_PARAMS with details.candidates for duplicate names, ENTITY_NOT_FOUND for unmatched refs), and the return shape including is_active. This is unusually complete behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, followed by error semantics, return value, and a single example with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description documents the return value (document info as in document_list with is_active: true), the single parameter's format, and both failure modes, leaving nothing an agent needs in order to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description adds value by giving a concrete ref example ('document:file:urn:adsk.wipprod:dm.lineage:abc') and explaining what happens when the ref is ambiguous or unmatched, going beyond the schema's format note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (make an open document the active one) and immediately adds the consequence that all other tools operate on it, which separates it from document_list/document_open/document_save siblings. An agent knows exactly what state change occurs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'every other tool then works on it' tells the agent when this tool is needed (before any per-document operation), and the ambiguity/no-match failure modes describe edge conditions. It does not explicitly compare against siblings like assembly_activate, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
save_changes or discard_changes is true (INVALID_PARAMS otherwise, the
document stays open). save_changes needs a document that was saved before —
call document_save with a name first.
Returns {"closed": {"ref", "type", "name"}, "active": | null}.
Example: document_close(discard_changes=true).
| Name | Required | Description | Default |
|---|---|---|---|
| document | No | Document ref from document_list; default: the active document | |
| save_changes | No | Save unsaved changes before closing (saved documents) | |
| discard_changes | No | Throw unsaved changes away; only if the user said so |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses the validation rule (exactly one of save_changes/discard_changes), the failure mode (INVALID_PARAMS, document stays open), and the prerequisite that save_changes requires a previously saved document. It stops short of saying what happens when closing the last open document or that discard is irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The invoking condition is front-loaded in the first sentence, followed by the constraint, the return shape, and a one-line example. Every line serves a purpose, though the example is marginal and the return shape partially repeats the schema's semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so spelling out the return payload is appropriate and useful for chaining (the new active document). Failure semantics and the save precondition are covered; only edge cases like closing the final document are unaddressed, which is minor for a 3-optional-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter meaning is already documented. The description adds a genuine cross-parameter constraint not expressible in the schema — exactly one of the two boolean flags must be true — plus the saved-document precondition for save_changes, which is real value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('close the document') and makes the triggering condition unambiguous. It implicitly separates itself from document_save by routing saving to that tool first, but does not explicitly contrast with document_activate or document_open.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States an explicit gate ('Call ONLY when the user explicitly asked to close the document'), names the alternative to use first ('call document_save with a name first'), and gives the failure outcome if flags are misused. An agent has no ambiguity about when to reach for this versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
ref is document:file:<id> for a saved document and document:<name> for an
unsaved one; pass it to document_activate / document_save / document_close.
Other tools always work on the active document.
Returns {"documents": [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well by describing the returned item shape, the ref format for saved versus unsaved documents, and the important rule that other tools work on the active document. It does not explicitly state read-only or side-effect behavior, but the list semantics are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core action and then efficiently provides the returned item shape and ref semantics. Every sentence contributes useful information, especially because there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by documenting the returned object structure and the meaning of key fields such as ref, is_active, is_saved, and design_type. It is complete enough for an agent to call and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document. The description appropriately focuses on returned fields and ref usage instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list the documents open in Fusion. It also distinguishes this tool from document_activate, document_save, and document_close by explaining how to use the returned ref with those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: pass each ref to document_activate, document_save, or document_close, and note that other tools operate on the active document. It does not explicitly state when not to use the tool, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
units only sets how Fusion displays lengths; numbers passed to tools stay in mm.
Returns the new document's info (see document_list).
Example: document_new() -> parametric design in mm.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Distance display units of the design | mm |
| design_type | No | parametric (with timeline, default) or direct (no history) | parametric |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does a good job: it discloses the active-state effect, the persistence gap (not saved until document_save), and the display-vs-model unit gotcha. It omits what happens to the previously active document and whether unsaved work is at risk, which for a document-lifecycle tool would be useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and side effect, then the save caveat, then the units caveat, then return value. Every sentence adds a distinct fact; the worked example is short and reinforces defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by pointing to document_list for the returned shape. Combined with the save and units guidance, an agent can call this correctly; only the fate of the previously active document is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description earns above baseline by clarifying that `units` affects only display while tool inputs stay in mm — a non-obvious behavior the schema text ('Distance display units of the design') does not convey. `design_type` is left entirely to the schema, which already explains parametric vs direct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new design document') plus the side effect ('make it active'), which distinguishes it from document_open/document_activate. The agent knows exactly what it gets without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: the document is NOT saved, and document_save should be called only when the user asks to save. This is a real when/when-not rule tied to a named sibling. It stops short of contrasting with document_open or document_activate, which remain inferable only from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_openA
Open a document and make it active. Pass exactly one of file_id (a cloud file)
or local_path (an existing local .f3d file; other formats such as STEP are not
opened here).
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").
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | No | Cloud data file id (from Fusion) | |
| local_path | No | Absolute path of a local Fusion archive (.f3d) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses the active-document side effect, the already-open activation behavior, the `already_open` flag, and the accepted input types. It does not cover permission/auth requirements or what happens to an unsaved current document, which keeps it below the top score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then adds the key constraint, already-open behavior, return note, and examples. Every part earns its place and the examples are compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and no output schema, the description is nearly complete: it explains inputs, side effects, and return values. The main remaining gap is explicit comparison to sibling tools such as document_activate and document_new.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by requiring exactly one of the two parameters and clarifying that `local_path` must be an existing local `.f3d` file.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Open a document and make it active." It distinguishes cloud files from local .f3d files and explains the already-open case, which helps separate it from document_activate and document_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage constraints: pass exactly one of `file_id` or `local_path`, and other formats such as STEP are not opened here. It does not explicitly name document_activate or document_new as alternatives, so it falls short of fully explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_saveA
Call ONLY when the user explicitly asked to save the document.
An already saved document gets a new version (name/folder_path are rejected:
no Save As). A never-saved document needs name and is saved into the active
project's root folder or the existing folder_path (missing folders are
ENTITY_NOT_FOUND and never created). The upload to the cloud continues in the
background ("upload": "pending").
Returns the document's info (see document_list) plus "upload": "pending".
Examples: document_save(name="Bracket"); document_save(description="hole moved").
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the first save of an unsaved document | |
| document | No | Document ref from document_list; default: the active document | |
| description | No | Version description | |
| folder_path | No | Existing folder in the active project, e.g. 'Parts/Brackets'; default: the project's root folder |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses versioning, rejected parameters on an already-saved document, ENTITY_NOT_FOUND for missing folders, and background upload with "upload": "pending". It does not discuss permissions, undo/reversibility, or concurrent-save behavior, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded, starting with the critical invocation rule. Every sentence contributes operational detail about saving, parameter behavior, error semantics, or return shape. The examples are compact and useful rather than redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no output schema and no annotations, the description covers the important behavioral surface: when to call, save/version semantics, parameter applicability, missing-folder behavior, background upload, and return shape. It could still be stronger with permissions or undo semantics, but it is substantially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds conditional meaning beyond the schema: name and folder_path are rejected for already-saved documents, a never-saved document needs name, and missing folders are never created. This meaningfully clarifies how the parameters behave in different save scenarios.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: save the document. It adds meaningful scope about explicit user request and saved vs. never-saved documents. It does not explicitly contrast with sibling tools such as document_new or document_close, but the purpose is still unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a strong usage rule: call ONLY when the user explicitly asked to save the document. It also distinguishes the saved-document path from the first-save path and explains what parameters apply in each case. It stops short of naming alternative sibling tools for creating or closing documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: adsk (adsk.core, adsk.fusion), app (adsk.core.Application), ui,
design (active adsk.fusion.Design or None), root (design.rootComponent or
None) and params (the params argument, default {}).
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"}: result is the value of the variable
result after the code runs (JSON as is, otherwise its repr); stdout/stderr are
captured and cut at 64 KiB with a truncation marker. If the code raises, the result
is an error FUSION_API_ERROR with the traceback in details, and timeline items the
code added are rolled back (parametric designs only).
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}
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python source to run inside Fusion | |
| params | No | JSON values made available to the code as `params` | |
| timeout_s | No | Seconds to wait for the code to finish |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: main-thread execution, unit conversions, return shape, stdout/stderr truncation, and error handling with timeline rollback. These are exactly the operational details an agent needs before calling a powerful code-execution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage guidance, then organized into scope, units, return behavior, and an example. Despite its length, every section carries actionable information for safely invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex code-execution tool with no annotations and no output schema, the description covers invocation context, execution semantics, return values, error behavior, and rollback behavior. It leaves no significant operational gap for an agent deciding whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema by explaining how `params` is exposed to code and clarifying unit conventions for Fusion API values. It does not elaborate on `timeout_s` beyond the schema, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and environment: running Python inside Fusion 360 on its main thread. It explicitly distinguishes itself from the many dedicated sibling tools by saying to use it only when no dedicated tool can do the job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rule: only when no dedicated tool can handle the task. It also defines the available execution context (`adsk`, `app`, `ui`, `design`, `root`, `params`) so the agent knows what can be done before invoking it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute file path; the extension must match the format | |
| scope | No | Ref of an occurrence or a component (its first occurrence); default: the whole design. Bodies are not allowed (use export_mesh) | |
| format | No | Format; default from the extension (.step/.stp, .iges/.igs, ...) | |
| overwrite | No | Replace an existing file (it is deleted before the export) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the destructive overwrite semantics ('the old file is deleted first, so a failed export loses it'), the precondition that the directory must exist, the extension/format coupling, and that exporting does not save the document. It even documents the return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and formats, followed by preconditions, then the overwrite caveat, then return shape and a concrete example. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return structure ({files, format, scope}), covers all four parameters' preconditions, and gives a usage example — an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning beyond it by explaining the format/extension fallback, the overwrite-before-write risk, and what scope resolves to in the return value. It does not restate everything, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export the design, a component or an occurrence') and enumerates every supported format (STEP, IGES, SAT, SMT, F3D, USDZ). An agent can distinguish this from export_mesh or export_sketch_dxf without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes away from document_save ('Exporting does not save the document (document_save does)') and the schema notes bodies are not allowed here, use export_mesh. It also states the path/extension preconditions. Missing an explicit statement of when not to export at all, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute file path; the extension must match the format | |
| scope | No | Ref of a body, an occurrence or a component; default: everything | |
| units | No | Units of surface_deviation and max_edge_length | mm |
| binary | No | Binary STL (false: ASCII); STL only | |
| format | No | Format; default from the extension | |
| overwrite | No | Replace an existing file (it is deleted before the export) | |
| file_units | No | Units written to STL/OBJ (3MF has none) | mm |
| refinement | No | Tessellation quality; custom uses the values below | medium |
| aspect_ratio | No | Custom only: max triangle aspect ratio | |
| max_edge_length | No | Custom only: max edge length (units) | |
| normal_deviation | No | Custom only: max normal deviation, degrees | |
| surface_deviation | No | Custom only: max surface deviation (units) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that an existing file is deleted first when overwrite=true, that the document is not saved afterward, that OBJ emits a sidecar <name>.mtl file, and that file_units is ignored for 3MF. It also documents the return payload and warnings, so the agent knows both side effects and results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and formats, then constraints, then return shape, then a concrete example — a well-ordered structure with little wasted text. The parenthetical asides (OBJ sidecar, file_units warning) are dense but each carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no annotations and no output schema, the description still covers preconditions, destructive overwrite semantics, the unsaved-document caveat, the return structure, and an example call. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns above that by adding a cross-field constraint the schema cannot express (deviation/aspect-ratio numbers are an error unless refinement='custom') and by noting the format/extension coupling. It does not add meaning for units vs file_units beyond what the schema titles/descriptions already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Export the design, a component, an occurrence or a body as a mesh') and enumerates the supported formats. That scope statement clearly separates it from the sibling exporters export_cad and export_sketch_dxf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mesh-format framing plus the refinement/custom rules give a clear context for use, and the description spells out what makes a call invalid (relative path, missing directory, mismatched extension, deviation params without refinement='custom'). It never explicitly contrasts itself with export_cad or export_sketch_dxf, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path ending with .dxf | |
| sketch | Yes | Ref of the sketch | |
| overwrite | No | Replace an existing file (it is deleted before the export) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonable work: it discloses the FUSION_API_ERROR failure mode for unsupported Fusion builds and documents the exact return payload shape. It doesn't mention prerequisites like an active document or DXF units/scale, and the overwrite/delete-existing behavior is only in the schema, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and use case in the first clause, then failure mode and return shape. The inline example is compact and useful, though the three-part sentence structure plus example is slightly more than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter export tool with no output schema, the description covers purpose, return payload, failure mode, and path conventions — enough to call it correctly. Missing only secondary details such as required document state and output units.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters including the destructive overwrite note are already documented in structured data. The description adds only the worked example and the 'same path rules as export_cad' cross-reference, which is marginal beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write a sketch to a DXF file') plus an intended use case ('e.g. for laser cutting'), which immediately separates it from export_cad (CAD geometry) and export_mesh. An agent can tell what it produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete condition for use (laser cutting) and routes path-convention questions to the sibling export_cad ('Same path rules as export_cad'), which is a useful cross-reference. It stops short of explicitly stating when to prefer export_cad/export_mesh over this tool, so it's clear context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm), angle in degrees, strings are Fusion
expressions. Edge refs from inspect_query on the latest body. The parent bodies are
listed in modified_bodies.
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_chamfer(edges=[e], distance=1)
feature_chamfer(edges=[e], mode="distance_angle", distance=2, angle=30)
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | two_distances / distance_angle: swap the sides | |
| mode | No | equal (default), two_distances or distance_angle | equal |
| angle | No | distance_angle: angle in degrees (default 45) | |
| edges | Yes | Edge refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths | mm |
| distance | Yes | Chamfer distance (first distance) | |
| distance2 | No | two_distances: second distance | |
| tangent_chain | No | Also take tangent-connected edges/faces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so: it names the failure modes (distance2/angle/flip with a mismatched mode, missing distance2 -> INVALID_PARAMS with nothing changed; a failed chamfer -> FUSION_API_ERROR, rolled back). It also discloses the result payload keys and that parent bodies appear in modified_bodies, so the agent knows the mutation's blast radius and its transaction semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then modes, units, refs, errors, returns, and examples — a clean scannable structure. A couple of facts (units default mm, angle default 45) restate the schema and could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no annotations and no output schema, the definition supplies everything an agent needs: mode/parameter coupling, unit and expression conventions, where edge refs originate, error contracts with rollback behavior, and the return shape. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot: which mode each of distance2/angle/flip belongs to, that flip swaps which face gets which value, that distances follow `units` and angles are in degrees, and that strings are Fusion expressions. It does not explain tangent_chain's effect or the interaction between flip and angle, which keeps it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Bevel edges of a body with a chamfer" gives a specific verb plus resource, and the mode enumeration (equal / two_distances / distance_angle) sharpens what kind of chamfer is produced. It does not address the closest potential confusion, however: the sibling timeline_edit_chamfer versus creating a new chamfer is left for the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete procedural context — edge refs come from inspect_query on the latest body and must be re-queried after later features — and ties each mode to the parameters it requires. It stops short of when-not guidance, e.g. creating a new chamfer versus editing one via timeline_edit_chamfer or choosing feature_fillet for rounding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Reverse the pull direction | |
| angle | Yes | Draft angle, degrees (not 0, |a| < 90) | |
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| plane | Yes | Neutral plane = pull direction: planar face, construction plane (construction_plane) or origin:XY|XZ|YZ | |
| angle2 | No | Second-side angle (two-angle draft) | |
| symmetric | No | Draft both sides of the plane by `angle` | |
| tangent_chain | No | Also take tangent-connected edges/faces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it enumerates the failure modes (angle 0 or >=90, angle2 combined with symmetric, non-planar plane) and states the side effects ('nothing changed' for INVALID_PARAMS, rollback for FUSION_API_ERROR). It also names what gets modified, which is the key behavioral fact for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the planar semantics, then errors, then return shape, then a one-line example — every block earns its place and there is no filler. It is slightly dense in the first two paragraphs, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, the description supplies everything an agent needs: required upstream step (inspect_query), plane constraints, error taxonomy, rollback behavior, the full return payload keys, and a concrete invocation example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the mutual exclusivity of symmetric and angle2 (enforced as INVALID_PARAMS), the meaning of the plane's normal as pull direction with flip reversing it, and that angles may be Fusion expressions. Only tangent_chain goes unmentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb plus resource ('Tilt faces by a draft angle relative to a neutral plane') and even names the manufacturing domain (moulding / casting draft), so an agent knows exactly what operation this is. It does not explicitly contrast itself with adjacent siblings such as feature_offset_faces or feature_shell, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: faces must come from inspect_query, the neutral plane must not be one of the drafted faces, and it explains the three angle modes (single, symmetric, angle2). It also states that flip reverses the pull direction. It lacks explicit when-to-use-this-instead-of-a-sibling routing, which keeps it at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm), angles in degrees; a string
is a Fusion expression ("wall * 2", "5 deg") and keeps the feature driven by it.
Refs: profiles from sketch_draw / sketch_profiles ("profile:@x,y") or
{"sketch": , "all": true}; planar faces and to_entity targets from
inspect_query; planes from construction_plane or origin:XY|XZ|YZ; sketch texts from
sketch_draw (kind "text"). Refs to faces/bodies go stale after later features - take
them from the latest results.
Modes:
one_side: side1 + direction (positive = sketch normal) + taper1;
two_sides: side1 and side2 independent (each its own extent and taper);
symmetric: side1 must be a distance; symmetric_full_length picks total vs half. A negative distance extrudes the other way. operation="cut" with through_all and direction="negative" cuts down through a body below the sketch.
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 health.
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_extrude(profiles=["profile:@10,10"], side1={"type": "distance", "distance": 20})
feature_extrude(profiles=[...], operation="cut", side1={"type": "through_all"}, direction="negative")
feature_extrude(profiles=[...], mode="symmetric", side1={"type": "distance", "distance": 40}, symmetric_full_length=true, thin={"thickness": 2, "location": "center"})
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | one_side (default), two_sides or symmetric | one_side |
| thin | No | Thin wall instead of a solid: {"thickness", "location": side1|side2|center, "thickness2"? (two_sides)} | |
| side1 | Yes | {"type": "distance", "distance"} | {"type": "to_entity", "entity", "offset"=0, "chained"=true} | {"type": "through_all"} | |
| side2 | No | Second side extent; required for two_sides only | |
| start | No | Where the extrude starts: {"type": "profile_plane"} (default) | {"type": "offset", "offset"} | {"type": "entity", "entity", "offset"=0} | |
| units | No | Unit of plain-number lengths and points | mm |
| taper1 | No | Taper of side 1, degrees | |
| taper2 | No | Taper of side 2, degrees (two_sides only) | |
| is_solid | No | true (default) = solid; false = surface body (new_body / new_component only; close surfaces with surface_stitch, check is_solid) | |
| profiles | Yes | Profiles to use: 'profile:<sketch>@x,y' refs from sketch_profiles / sketch_draw, {"sketch", "point"} / {"sketch", "curves"} / {"sketch", "all": true}, or planar face refs (inspect_query) | |
| direction | No | one_side only: positive (default, along the sketch normal) or negative | |
| operation | No | new_body (default), join, cut, intersect or new_component | new_body |
| participant_bodies | No | Body refs join/cut/intersect act on (default: every body it touches); not allowed with new_body / new_component | |
| symmetric_full_length | No | symmetric only: true = side1.distance is the total length, false = length of each half |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses failure modes and side effects (INVALID_PARAMS changes nothing, ENTITY_NOT_FOUND returns current profiles, FUSION_API_ERROR rolls the timeline back, a warning keeps the feature and reports in `health`), plus the critical ref-staleness caveat after later features. This is exactly the behavioral context an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then sectioned into Units, Refs, Modes, Surface, Errors, Returns, Examples, which is easy to scan. It is long and the Examples section largely restates what the Modes bullets already say, so a little trimming is possible, but nearly every sentence earns its place given 14 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, high-complexity feature tool with no output schema, the description documents the full return object (feature ref, health state/message, created/modified/removed bodies, optional component) and even tells the agent body geometry must be fetched via inspect_*. Nothing an agent needs to invoke or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema does not encode: negative distance reverses direction, symmetric requires side1 be a distance, side2 applies only to two_sides, symmetric_full_length picks total vs half, and a string value becomes a driven Fusion expression. The units/string-vs-number convention is also restated usefully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb plus resource ('Extrude sketch profiles, planar faces or sketch texts into a solid') and immediately scopes the operation variants (cut/join/intersect) that distinguish it from feature_revolve/sweep/loft siblings. An agent can tell exactly what this tool produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps the three modes to their required fields and gives condition-dependent advice ('operation="cut" with through_all and direction="negative" cuts down through a body below the sketch', 'is_solid=false ... no thin'). It explains where refs come from and how to get them, but never names an alternative sibling tool (e.g. feature_revolve) as the choice when profiles are non-planar, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
units (default mm), strings are Fusion expressions ("wall / 2"). Edge refs come from
inspect_query on the latest body (refs go stale after later features). The parent
bodies of the edges are listed in modified_bodies.
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_fillet(edges=[e1, e2, e3, e4], radius=5)
feature_fillet(edges=[e], mode="variable", start_radius=2, end_radius=5, mid=[{"position": 0.5, "radius": 3}])
| Name | Required | Description | Default |
|---|---|---|---|
| g2 | No | Curvature-continuous (G2) fillet | |
| mid | No | variable: [{"position": 0..1, "radius"}] intermediate radii | |
| mode | No | constant (default), variable or chord | constant |
| edges | Yes | Edge refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths | mm |
| corner | No | Corner type where three fillets meet | rolling_ball |
| radius | No | constant: radius | |
| end_radius | No | variable: radius at the edge end | |
| chord_length | No | chord: chord length | |
| start_radius | No | variable: radius at the edge start | |
| tangent_chain | No | Also take tangent-connected edges/faces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description carries the full burden well: it discloses that a missing mode field or non-edge ref yields INVALID_PARAMS with nothing changed, that variable/chord on an old Fusion API yields FUSION_API_ERROR 'not available', and that a computed error rolls the timeline back. Staleness of edge refs and the units/expression semantics are also explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into modes, units/refs, errors, return shape, and examples. Dense but nearly every clause carries information; the mode paragraph is slightly telegraphic at the cost of readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no annotations and no output schema, the description supplies the mode contract, error taxonomy, rollback semantics, and an explicit return-value shape, plus two worked examples. An agent can call this correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value beyond it by explaining the cross-field mode contract (radius vs. start_radius/end_radius/mid vs. chord_length), the 0..1 position convention, and that strings are Fusion expressions. It does not cover corner or tangent_chain, but those are documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Round edges of a body with a fillet') and immediately decomposes the tool into its three modes, which distinguishes it from feature_chamfer, feature_rule_fillet and timeline_edit_fillet without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each mode to its required fields and notes that fields of another mode are refused, so the agent knows how to pick a mode. It also directs the agent to obtain edge refs from inspect_query and warns to re-query after later features. It does not state when to prefer this tool over the sibling fillet tools (feature_rule_fillet, timeline_edit_fillet), which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_holeA
Drill simple, counterbore or countersink holes - optionally tapped - into a body.
Units: diameters, depths, offsets and points are in units (default mm); angles in
degrees; a string is a Fusion expression ("bolt_d + 0.5"). Refs: planar faces and
edges from inspect_query (refs go stale after later features - use the latest
results), sketch points from sketch_draw (all points of one call in one sketch on the
face), construction planes from construction_plane.
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_hole(placement={"type": "sketch_points", "points": [p1, p2, p3, p4]}, kind="counterbore", diameter=5.5, cb_diameter=10, cb_depth=5.5, extent={"type": "through_all"})
feature_hole(placement={"type": "point", "face": , "point": [10, 10, 20]}, diameter=5, extent={"type": "distance", "depth": 12}, thread={"designation": "M6x1"})
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Drill the other way from the face | |
| kind | No | simple (default), counterbore or countersink | simple |
| units | No | Unit of plain-number lengths and points | mm |
| extent | Yes | How deep: {"type": "distance", "depth"} | {"type": "through_all"} | {"type": "to_entity", "entity"} | |
| thread | No | Tapped hole: thread on the bore in the same call, e.g. {"designation": "M6x1"}; omit designation to let Fusion pick it from the bore diameter | |
| cb_depth | No | counterbore only: counterbore depth | |
| cs_angle | No | countersink only: included angle, degrees (default 90) | |
| diameter | Yes | Hole (bore) diameter | |
| placement | Yes | Where: {"type": "point", "face", "point": [x,y,z]} | {"type": "sketch_points", "points": [refs]} (one hole per point) | {"type": "face_offsets", "face", "point", "edge1", "offset1", "edge2", "offset2"} | {"type": "center", "face", "edge"} (circular edge) | |
| tip_angle | No | Drill point angle at the bottom, degrees | |
| cb_diameter | No | counterbore only: counterbore diameter | |
| cs_diameter | No | countersink only: countersink diameter | |
| participant_bodies | No | Body refs the hole may cut (default: every body it meets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well. It states that the hole always cuts, participant_bodies limits cutting, thread failure rolls back the entire call, and Fusion errors cause the timeline to roll back. It also distinguishes cosmetic versus modeled threads and gives the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and organized into units, refs, kinds, tapped holes, errors, returns, and examples. It is long, but the length is largely justified by the complex 13-parameter tool and the absence of an output schema; some material overlaps schema descriptions, preventing a higher conciseness score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, lack of annotations, and lack of an output schema, the description is unusually complete. It covers references, units, kind-specific requirements, thread behavior, failure modes, rollback semantics, return payload, and concrete examples, leaving little an agent needs to infer before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema. It explains cross-field dependencies such as simple needing only diameter, counterbore needing cb_diameter and cb_depth, countersink needing cs_diameter, rejection of another kind's fields, and the tap-drill relation M6x1 -> 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: drilling simple, counterbore, or countersink holes, optionally tapped, into a body. It immediately distinguishes the operation from generic thread creation by describing both the hole and optional thread behavior, and it names the affected resource clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: references come from inspect_query, sketch_draw, or construction_plane; stale refs must be avoided; and kind-specific fields are required. It does not explicitly state when to choose feature_hole versus the sibling feature_thread or timeline_edit_hole, so it lacks full alternative-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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; units only applies to
{"sketch", "point"} profile specs. Errors: fewer than 2 sections, rails with a
centerline, a point in the middle, point_* on a profile, closed with a point, more
than one profile in a section -> 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)}.
Examples:
feature_loft(sections=[{"entity": "profile:@0,0"}, {"entity": "profile:@0,0"}], rails=[])
feature_loft(sections=[{"entity": , "end_condition": "tangent"}, {"entity": , "end_condition": "point_tangent", "weight": 2}], operation="join")
| Name | Required | Description | Default |
|---|---|---|---|
| rails | No | Rail curves/edges guiding the loft (not with centerline) | |
| units | No | Unit of plain-number lengths and points | mm |
| closed | No | Close the loft back to the first section (no points) | |
| is_solid | No | true (default) = solid; false = surface body (new_body / new_component only; close surfaces with surface_stitch, check is_solid) | |
| sections | Yes | Sections in order: {"entity", "end_condition"=free, "angle"=0, "weight"=1}. entity = one profile (ref or spec), a planar face ref, or a point (sketch point, construction point, vertex) - points only first/last | |
| operation | No | new_body (default), join, cut, intersect or new_component | new_body |
| centerline | No | Centerline curve/edge the sections follow (not with rails) | |
| participant_bodies | No | Body refs join/cut/intersect act on (default: every body it touches); not allowed with new_body / new_component | |
| merge_tangent_edges | No | Merge tangent edges of the result (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does so thoroughly: it documents units, end-condition semantics, cross-parameter constraints, the exact error classes (INVALID_PARAMS with nothing changed vs FUSION_API_ERROR with timeline rollback), and the complete return structure including created/modified/removed bodies and health state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately sized for a 9-parameter, annotation-free CAD operation. It is front-loaded with purpose, then logically structured into sections, end conditions, guides, closed/is_solid behavior, units, errors, returns, and examples, with no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of annotations, and the lack of an output schema, the description is complete enough to call the tool correctly: it covers inputs, constraints, error behavior, side effects, and return values, and even provides concrete examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds meaningful cross-parameter semantics beyond the schema: it explains that units apply only to {sketch, point} profile specs, that inner sections default to free, that closed requires 3+ profile sections with no point section, and how point_* conditions are restricted to point sections. These constraints are not obvious from the individual parameter descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Loft a solid through two or more sections', with concrete examples like transitions, ducts, bottle necks, and domes ending in a point. This makes the core operation clear, but it never explicitly contrasts the tool with siblings such as feature_sweep or feature_revolve, so the agent must infer the distinction from the domain language alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides rich context for when the tool applies and includes several usage constraints (rails never with a centerline, closed needs 3+ profile sections, point sections only at the ends, is_solid=false only for new_body/new_component). It does not name explicit alternatives like feature_sweep or feature_extrude, so it stops short of the 'when to use vs alternatives' clarity that would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm) or a Fusion
expression. Faces from inspect_query on the latest body. The bodies are listed in
modified_bodies.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Also take tangent-connected faces | |
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths | mm |
| distance | Yes | Signed offset: positive = outward, negative = inward |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that distance 0 and non-face refs yield INVALID_PARAMS (nothing changed) and uncomputable offsets yield FUSION_API_ERROR with rollback. It also enumerates the return keys. It stops short of stating whether this modifies the body's parametric history vs. a direct edit, which would complete the mutation picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sign semantics are front-loaded, followed by sibling disambiguation, errors, return shape, and a concrete example. Dense and mostly waste-free, though the multi-line error/return block is slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the returned keys and fully documents error behaviors and rollback. Combined with unambiguous face sourcing, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the signed-distance semantics and units default, so baseline is 3. The description reinforces the sign convention and units and clarifies the faces source, but it never mentions the `chain` parameter (tangent-connected faces), leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (press-pull offset of faces) and immediately clarifies the signed-distance semantics. It also explicitly separates itself from feature_extrude (sketch-profile press-pull) and feature_fillet (edge press-pull), so an agent can pick it apart from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the exact conditions that select them: press-pull of a sketch profile routes to feature_extrude, press-pull of a fillet edge routes to feature_fillet. It also tells the agent where faces come from (inspect_query on the latest body) and to re-query after later features.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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");
units only applies to {"sketch", "point"} profile specs. Refs: profiles from
sketch_draw / sketch_profiles; the axis is a sketch line ref (sketch_draw refs), a
construction axis (construction_axis, origin:X|Y|Z) or a straight BRep edge
(inspect_query). The profile must lie on one side of the axis. is_solid=false
revolves a surface body (new_body / new_component only).
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_revolve(profiles=["profile:@5,20"], axis="origin:Z")
feature_revolve(profiles=[...], axis=, extent={"type": "angle", "angle": 90, "symmetric": true}, operation="cut")
| Name | Required | Description | Default |
|---|---|---|---|
| axis | Yes | Axis of revolution: a sketch line, a construction axis (construction_axis or origin:X|Y|Z) or a straight edge (inspect_query) | |
| units | No | Unit of plain-number lengths and points | mm |
| extent | No | {"type": "full"} (default, 360 deg) | {"type": "angle", "angle"=360, "symmetric"=false} | {"type": "two_angles", "angle1", "angle2"} | {"type": "to_entity", "entity", "direction"=positive} | |
| is_solid | No | true (default) = solid; false = surface body (new_body / new_component only; close surfaces with surface_stitch, check is_solid) | |
| profiles | Yes | Profiles to use: 'profile:<sketch>@x,y' refs from sketch_profiles / sketch_draw, {"sketch", "point"} / {"sketch", "curves"} / {"sketch", "all": true}, or planar face refs (inspect_query) | |
| operation | No | new_body (default), join, cut, intersect or new_component | new_body |
| participant_bodies | No | Body refs join/cut/intersect act on (default: every body it touches); not allowed with new_body / new_component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotation coverage the description carries the full burden, and it does: it discloses rollback/atomicity ("INVALID_PARAMS (nothing changed)", "FUSION_API_ERROR and the timeline is rolled back"), the geometric precondition that the profile must lie on one side of the axis, and the constraint that surface bodies require new_body/new_component. These are exactly the non-obvious behaviors an agent needs before committing a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then organizes detail under clear inline labels (Units:, Refs:, Extents:, Errors:, Returns:, Examples:), and the examples are compact and functional. It is on the long side and the Extents paragraph partly restates the schema's extent description, but nearly every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with a discriminated-union `extent`, no annotations and no output schema, the description supplies everything missing: an inline Returns shape (feature ref, health state, created/modified/removed bodies, component), error/rollback semantics, and worked invocation examples. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely non-obvious semantics: `units` applies only to {"sketch", "point"} specs (a caveat absent from the schema), symmetric splits the angle about the sketch plane, and to_entity starts toward or away from the sketch normal. Extent field mapping is largely repeated from the schema, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Revolve sketch profiles or planar faces around an axis") and grounds it with concrete outcomes (shafts, pulleys, bottles) plus an operation variant ("grooves (operation=\"cut\")"). This is clearly distinguishable from feature_extrude, feature_sweep and feature_loft, and no sibling would be selected in its place.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites and routing: profiles come from sketch_draw / sketch_profiles, the axis from sketch_draw refs, construction_axis, origin:X|Y|Z or an inspect_query edge, and it says to describe created bodies with inspect_* since geometry is not returned. It also constrains is_solid=false to new_body/new_component. It stops short of naming when to prefer feature_extrude or feature_sweep instead, so no explicit exclusion against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm), a string is a
Fusion expression ("wall"). Refs: open sketch curves from sketch_draw (a line or arc
drawn in a sketch on a plane cutting the body, e.g. a construction_plane through the
corner); circles and closed splines are refused. The rib is always joined to
target_body (no operation parameter); without it, to the one solid body of the
curves' component that a curve touches.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Grow the other way from the sketch plane | |
| depth | No | {"type": "to_next"} (default, up to the next face) | {"type": "distance", "distance"} | |
| units | No | Unit of plain-number lengths and points | mm |
| curves | Yes | Open sketch curve refs (sketch_draw), drawn on a plane through the body, ending at or near its walls | |
| thickness | Yes | Rib thickness | |
| target_body | No | Body the rib/web is built on and joined to; default: the one solid body the curves touch | |
| thickness_location | No | symmetric (default) about the curves, or side1 / side2 of them | symmetric |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full behavioral burden and does so thoroughly: it explains that the rib is always joined, how target_body defaults, unit and expression handling, specific failure modes, API limitations for side2, and rollback behavior on Fusion errors. This is the kind of mutation and error context an agent needs before invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: purpose first, then units/refs, joining behavior, errors, returns, and an example. Every section contributes actionable information, and the front-loaded definition lets the agent quickly understand what the tool does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is complete: it covers required inputs, joining semantics, default resolution, unit handling, error conditions, API limitations, rollback behavior, and return shape. Nothing critical for correct invocation is obviously missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds meaningful semantics beyond the schema: it identifies curves as open sketch entities from sketch_draw, rejects circles and closed splines, clarifies that thickness and depth.distance accept Fusion expressions, explains the default target_body resolution, and warns that thickness_location "side2" is unavailable despite being present in the schema enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: adding a rib, defined as a thin stiffening wall from open sketch curves joined to a body. The examples (gussets in housings, brackets, bosses) make the purpose concrete and distinguishable from unrelated feature tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the required input context: open sketch curves from sketch_draw, drawn on a plane through the body, and notes that circles and closed splines are refused. However, it does not explicitly compare this tool to similar siblings such as feature_web or feature_extrude, so the agent is left to infer when a rib is preferred over those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_rule_filletA
Rule-based fillet: round every edge of the given faces/features (all_edges) or only
the edges where faces meet faces2 (between_faces), with one radius.
Units: radius in units (default mm) or a Fusion expression. Faces come from
inspect_query, features from earlier feature_* results (their "feature" ref). The
parent bodies are listed in modified_bodies.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| rule | No | all_edges (default) of `faces`, or between_faces and faces2 | all_edges |
| faces | Yes | Face refs (inspect_query) or feature refs | |
| units | No | Unit of plain-number lengths | mm |
| faces2 | No | between_faces: the second face/feature set | |
| radius | Yes | Fillet radius |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses error conditions (INVALID_PARAMS for mismatched faces2/rules, FUSION_API_ERROR with rollback on failure), identifies that modified bodies are reported, and gives the return object shape. It omits any note about performance or side effects on the timeline, but covers the essential behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core rule logic and units, then covers errors and return values. It is slightly long but every sentence serves a purpose; the example is helpful but could be trimmed without much loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is nearly complete: it states the return shape, error modes, and rollback behavior. It does not explicitly warn that this creates a timeline feature or mention constraints on radius value, but overall it gives an agent enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it clarifies that radius can be a Fusion expression (schema only says string/number) and explains that faces come from inspect_query while features come from earlier feature_* results. This reduces ambiguity for the two most complex parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Rule-based fillet: round every edge of the given faces/features (all_edges) or only the edges where faces meet faces2 (between_faces), with one radius.' This distinguishes it from the sibling feature_fillet (explicit edges) and clearly states the two rule modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when to use all_edges vs between_faces and explicitly says to fall back to feature_fillet with explicit edges if the Fusion API lacks rule fillets. However, it does not state a general preference between this tool and feature_fillet when both are available, leaving a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default
mm) or Fusion expressions. The shelled bodies are listed in modified_bodies.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| faces | No | Faces to remove (open shell), from inspect_query | |
| units | No | Unit of plain-number lengths | mm |
| bodies | No | Bodies to hollow without opening (instead of faces) | |
| tangent_chain | No | Also take tangent-connected edges/faces | |
| inside_thickness | No | Wall thickness grown inwards | |
| outside_thickness | No | Wall thickness grown outwards |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses atomicity ('nothing changed'), rollback on failure ('rolled back'), the exact error codes (INVALID_PARAMS, FUSION_API_ERROR), and which result field reports the mutated bodies. This is materially more than the schema supplies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then usage rules, then errors, then return shape, then a concrete example. Every block earns its place; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description enumerates the returned keys ({feature, health, created_bodies, modified_bodies, removed_bodies}) and documents failure modes and units. An agent has everything needed to invoke it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real meaning on top: the faces-vs-bodies tradeoff (open box top face vs closed hollow body), the ability to combine inside and outside thicknesses, and that thicknesses may be Fusion expressions in addition to plain numbers in `units`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource: 'Hollow a body into a shell with walls of the given thickness.' That is far more precise than a restatement of the name. It does not, however, differentiate from adjacent siblings such as body_thicken or feature_offset_faces, which an agent might reasonably confuse with shelling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operating rules — pass faces (open shell) OR bodies (closed hollow body), plus inside_thickness and/or outside_thickness — which tells an agent how to compose a valid call. It stops short of naming alternatives or stating when to choose shelling over body_thicken/offset faces, so there is no explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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; units only applies to
{"sketch", "point"} profile specs. Refs: profiles from sketch_draw / sketch_profiles;
path and guide rail from sketch_draw (sketch curve refs, the path sketch usually lies
on a plane perpendicular to the profile sketch) or BRep edges from inspect_query.
Do not mix sketch curves and edges in one path. With path_chain=true one curve
is enough to take the whole connected chain. is_solid=false sweeps a surface
(new_body / new_component only); the profile may then be open sketch curves or edges.
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 health.
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_sweep(profiles=["profile:@0,0"], path=[, ])
feature_sweep(profiles=[...], path=[], twist_angle=360)
feature_sweep(profiles=[...], path=[], guide_rail=[], rail_scaling="stretch")
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Sweep the other way along the path | |
| path | Yes | Sweep path: sketch curve refs (sketch_draw) or BRep edge refs (inspect_query) - one kind only | |
| units | No | Unit of plain-number lengths and points | mm |
| is_solid | No | true (default) = solid; false = surface body (new_body / new_component only; close surfaces with surface_stitch, check is_solid) | |
| profiles | Yes | Profiles to use: 'profile:<sketch>@x,y' refs from sketch_profiles / sketch_draw, {"sketch", "point"} / {"sketch", "curves"} / {"sketch", "all": true}, or planar face refs (inspect_query) | |
| operation | No | new_body (default), join, cut, intersect or new_component | new_body |
| guide_rail | No | Optional guide rail (sketch curves or edges) that steers and scales the profile; excludes twist_angle and taper_angle | |
| path_chain | No | true (default): extend each path/rail curve to every curve connected to it end to end (tangent chain for a single edge) | |
| orientation | No | perpendicular (default, the profile follows the path) or parallel (keeps its orientation) | perpendicular |
| path_extent | No | Share of the path to sweep along, (0, 1] | |
| taper_angle | No | Taper of the profile, degrees (no guide_rail) | |
| twist_angle | No | Twist over the whole path, degrees (no guide_rail) | |
| rail_scaling | No | With guide_rail: scale (default), stretch or none | scale |
| participant_bodies | No | Body refs join/cut/intersect act on (default: every body it touches); not allowed with new_body / new_component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full disclosure burden and does so thoroughly: it names specific error outcomes (twist/taper + guide_rail -> INVALID_PARAMS, gaps -> FUSION_API_ERROR), states that an errored feature rolls back the timeline while a warning is kept and reported in `health`, and spells out side effects on bodies. This is exactly the kind of behavioral context annotations would otherwise provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, then organized into Units/Refs, Rules, Returns and Examples blocks, which suits a 14-parameter feature. Every sentence is substantive, though the Returns block is dense and borders on verbose given no output schema exists to defer to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters, no annotations and no output schema, the description closes every gap: it documents the return shape (feature, health, created/modified/removed bodies, component), enumerates failure modes, and gives three worked examples. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: units apply only to {sketch, point} profile specs, angles accept a Fusion expression string, path_extent is a plain share of path length, and guide_rail excludes twist/taper. A few parameters (flip, orientation, participant_bodies) are only clarified by the schema, holding it at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb+resource: 'Sweep sketch profiles or planar faces along a path', immediately followed by concrete uses ('pipes, handles, springs (with twist), rails, swept cuts'). An agent can distinguish this from extrude, revolve and loft siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent exactly where refs come from ('profiles from sketch_draw / sketch_profiles; path and guide rail from sketch_draw ... or BRep edges from inspect_query'), prohibits mixing sketch curves and edges in one path, and explains path_chain and is_solid=false constraints. It lacks an explicit 'use feature_loft/feature_extrude instead when...' comparison to siblings, which keeps it just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 internal).
Without designation Fusion recommends one from the cylinder diameter (a 10 mm shaft
-> M10x1.5 class 6g) and the result says which; without thread_class the first class
offered for the designation is used. Strings (type, designation, class) are Fusion's
own names - list them with feature_thread_options. Units: length/offset in units
(default mm).
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(faces=[])
feature_thread(faces=[], designation="M8x1.25", modeled=true, full_length=false, length=12)
| Name | Required | Description | Default |
|---|---|---|---|
| faces | Yes | Cylindrical face refs (inspect_query): hole walls or shafts | |
| units | No | Unit of plain-number lengths and points | mm |
| length | No | Thread length; needs full_length=false | |
| offset | No | Distance of the thread from its end; full_length=false | |
| modeled | No | Real thread geometry instead of cosmetic (default false) | |
| internal | No | Override hole (true) / shaft (false); default: from the face | |
| location | No | End the thread starts from: high or low | high |
| designation | No | e.g. 'M6x1'; omitted = recommended from diameter | |
| full_length | No | Thread the whole face | |
| thread_type | No | Fusion thread type (feature_thread_options) | ISO Metric profile |
| thread_class | No | e.g. '6H' / '6g'; omitted = first offered class |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: default auto-recommendation of designation from cylinder diameter (10 mm -> M10x1.5 6g), what happens when thread_class is omitted, the units default, and precise failure modes (INVALID_PARAMS with nothing changed, FUSION_API_ERROR with timeline rollback). This is exactly the mutation-safety information an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, followed by defaults, then errors, returns, and examples in a scannable order. It is dense but nearly every sentence carries operational information; the returns block is long but necessary since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no annotations and no output schema, the description covers defaults, auto-selection rules, error semantics, and an explicit return structure. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains the auto-recommendation logic for designation/class, the interaction rule that length requires full_length=false, and points to feature_thread_options as the source of valid strings. Minor gap: it doesn't clarify offset/location behavior in more depth than the schema already gives.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a cosmetic (default) or modeled thread to cylindrical faces') and scopes it to bolts, shafts and tapped holes. The distinction from feature_thread_options is clear: that sibling lists names, this one applies a thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete guidance on when to override hole/shaft detection and when to consult feature_thread_options for valid type/designation/class strings, plus two worked examples. It lacks an explicit statement of when not to use it (e.g. vs feature_hole when no hole exists yet), but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
units, with internal=true for a hole's bore / tap drill, false for a shaft) ->
{"recommended": {"designation", "class"} or null}. size, designation and diameter
without thread_type use "ISO Metric profile". diameter cannot be combined with size
or designation.
Errors: an unknown type, size or designation -> INVALID_PARAMS with details.available.
Examples:
feature_thread_options(thread_type="ISO Metric profile")
feature_thread_options(diameter=8, internal=false)
feature_thread_options(designation="M6x1", internal=true)
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | e.g. '6' | |
| units | No | Unit of plain-number lengths and points | mm |
| diameter | No | Recommend a designation and class for this model diameter | |
| internal | No | Classes / recommendation for a hole (true) or shaft | |
| designation | No | e.g. 'M6x1' | |
| thread_type | No | e.g. 'ISO Metric profile' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does: it declares read-only, discloses the error contract (INVALID_PARAMS with details.available), and states the mutual-exclusion constraint that diameter cannot be combined with size or designation. That is exactly the operational context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then levels, errors, and examples - a good ordering. It is dense and uses compressed notation ("+ size -> {'designations'}") that is efficient but slightly terse; the three examples rescue it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description sketches the return keys for each level along with the recommendation shape, so an agent knows what comes back. It doesn't say what a "class" string looks like or whether results are paginated, but for a static enumeration lookup that is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds semantics the schema cannot express: each parameter combination maps to a different return shape, size/designation/diameter without thread_type default to "ISO Metric profile", diameter is interpreted in `units`, and internal selects hole-bore vs shaft behavior. This is meaning well beyond the per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: look up Fusion's thread data, read-only, that feature_thread and feature_hole(thread=...) accept. The sibling tools are named explicitly, so an agent can tell this is a reference-lookup helper, not a feature-creation call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the two consumers (feature_thread, feature_hole) and lays out the progressive level structure (no args -> thread_types, thread_type -> sizes, etc.), which tells an agent how to drill down. It doesn't state when another tool would be preferred, but for a lookup helper the workflow guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm), a string is a
Fusion expression. Refs: open sketch curves from sketch_draw, all in one sketch
inside the body; circles and closed splines are refused. Always joined to
target_body (no operation parameter); without it, to the one solid body of the
curves' component that a curve touches.
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})
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Grow the other way from the sketch plane | |
| depth | No | {"type": "to_next"} (default, up to the next face) | {"type": "distance", "distance"} | |
| units | No | Unit of plain-number lengths and points | mm |
| curves | Yes | Open sketch curve refs (sketch_draw), drawn on a plane through the body, ending at or near its walls | |
| thickness | Yes | Wall thickness of the web | |
| target_body | No | Body the rib/web is built on and joined to; default: the one solid body the curves touch | |
| thickness_location | No | symmetric (default) about the curves, or side1 / side2 of them | symmetric |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: no operation parameter, the join target is implicit, defaults resolve to the single touched solid body, and each failure mode is enumerated with its consequence (INVALID_PARAMS with nothing changed, INVALID_PARAMS with details.candidates, FUSION_API_ERROR plus timeline rollback). The side2 API limitation and version fallback are disclosed, which the agent could not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line definition, then logically grouped Units / Refs / Errors / Returns / Example blocks. Dense but every block is functional; the errors paragraph is long yet each clause is a distinct failure mode an agent must handle.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter geometry mutation with no annotations and no output schema, the description supplies the missing pieces: return shape is stated inline, error taxonomy maps to remediation, default target resolution is explained, and the recovery path (execute_python) is named. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, and the description adds real semantics beyond it: thickness and depth.distance are interpreted in `units`, a string value is a Fusion expression, and curves must be open sketch entities from sketch_draw in one sketch. The worked example ties the parameters together with a concrete depth object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb plus resource and a precise physical definition ('a network of thin walls from several open sketch curves ... joined to the body it meets'), including a parenthetical use case. It implicitly separates itself from a single-curve rib via 'network of thin walls' and the 'rib/web' phrasing in params, but never names the sibling feature_rib, so the differentiator must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Establishes clear prerequisites (curves must come from sketch_draw, all in one sketch inside the body) and an explicit exclusion (circles and closed splines are refused). It also routes the agent to execute_python when the Fusion API version lacks web features. What is missing is an explicit 'use feature_rib instead when you have a single curve' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| name | No | Name of the new body | |
| hide_form | No | Hide the T-spline body and its B-Rep afterwards |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the copy is independent of later form edits, that the form remains in the timeline hidden by default, and the specific failure mode (T-spline body with no B-Rep such as an open/broken mesh yields FUSION_API_ERROR with nothing created). It doesn't discuss component placement of the new body or undo/rollback behavior, but the key side effects are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then independence semantics, then errors, then the return shape — a sensible priority order with no filler. The line-broken formatting and the brief API aside are slightly verbose but each clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned keys (body, name, source, base_feature, is_solid) including the nullable base_feature case. Combined with the error path and side-effect disclosure, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds value by explaining that name applies to the new body and that hiding the form (and its B-Rep) is the default outcome, giving the hide_form flag operational meaning. The body parameter's accepted ref types are documented in the schema itself rather than the prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: make an independent B-Rep copy of a T-spline body's B-Rep, created in a base feature of a parametric design. It immediately distinguishes itself from siblings like form_get_tsm (read the T-spline) and form_create_from_tsm (the reverse direction) by naming the concrete output artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the output as the solid to feed downstream features (shell, fillet, join), which tells an agent why and when to reach for it. It also pre-empts a plausible wrong turn by noting the Fusion API has no 'Convert' command. It stops short of naming a specific sibling alternative to use instead, so it isn't a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 tolerance,
or equally near two edges (symmetric meshes), fails with INVALID_PARAMS and
details.nearest; nothing is changed. On error the crease flags already changed are
restored.
Returns {"body": , "changed": number of edges whose flag changed}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| near | Yes | Points near edge midpoints | |
| units | No | Unit of lengths and points (default mm) | mm |
| creased | No | true = crease, false = smooth | |
| tolerance | No | Max distance from a point to its element, in `units` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: no stable edge ids, failure mode INVALID_PARAMS with details.nearest for missing or ambiguous points (symmetric meshes), atomic rollback of already-changed crease flags, and the exact return shape {body, changed}.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, then picking mechanics, then failure and rollback behavior, then the return value. Every sentence supplies information an agent needs to call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers selection method, unit semantics, error behavior, atomicity, and return value. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: `near` must be edge midpoints sourced from form_inspect, the units default of mm, and that `tolerance` governs nearest-edge matching and ambiguity failure. That meaning goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (crease/uncrease) acting on a named resource (control-mesh edges of a T-spline body) and discloses the side effect that the B-Rep is regenerated. It is clearly distinguishable from siblings such as form_inspect or form_convert_to_brep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains how to select edges in practice (take exact edge midpoints from form_inspect) and what conditions cause failure. It stops short of explicit when-not-to-use guidance or naming alternative tools for edge selection, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_create_from_tsmA
Create a T-spline body from TSM (T-spline mesh) text or a .tsm file - exactly one
of tsm and path.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| tsm | No | TSM text (up to 8 MiB), e.g. edited | |
| form | No | Existing form feature to add the body to (default: a new form feature) | |
| name | No | Name of the new body | |
| path | No | Absolute path of a .tsm file | |
| component | No | Component or occurrence for a new form feature (default: the root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it states the exactly-one-of constraint, enumerates error conditions with their resulting error codes, clarifies that invalid TSM text leaves nothing behind, and describes the return object. This is rich disclosure for a mutation/creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core action and the exactly-one-of rule, then moves to workflow, errors, and return shape. It is somewhat dense but each section contributes useful information; there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description supplies the important behavioral context: input exclusivity, error modes, failure side effects, workflow guidance, and return structure. An agent has enough information to invoke the tool correctly and interpret common failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds a critical semantic constraint—exactly one of `tsm` and `path`, with both/neither producing INVALID_PARAMS—and mentions the 8 MiB text limit, which meaningfully supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-and-resource pair: 'Create a T-spline body from TSM text or a .tsm file.' It also explicitly distinguishes the tool from siblings by naming form_get_tsm as the read counterpart and by framing this as the way to perform complex control-mesh edits that the Fusion API lacks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is for complex control-mesh edits and outlines the workflow form_get_tsm -> change text -> form_create_from_tsm -> hide/delete old form. It does not explicitly contrast with form_create_primitive, but the intended context is clear enough for an agent to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_create_primitiveA
Create a T-spline primitive body (Form environment) with its control mesh.
Sizes per shape (numbers in units):
box: x_size, y_size, z_size (x_faces, y_faces, z_faces);
plane: x_size, y_size (x_faces, y_faces);
cylinder: radius, height (radial_faces, length_faces);
sphere: radius (longitude_faces, latitude_faces);
torus: major_radius, minor_radius < major_radius (major_faces, minor_faces);
quadball: radius (faces).
Face counts default to Fusion's. A parameter of another shape -> INVALID_PARAMS.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | Existing form feature to add the body to (default: a new form feature) | |
| name | No | Name of the new body | |
| faces | No | ||
| shape | Yes | box, plane, cylinder, sphere, torus, quadball | |
| units | No | Unit of lengths and points (default mm) | mm |
| height | No | Number in `units`; expressions are not supported (not parametric) | |
| origin | No | Corner of box / plane, centre of the others (default 0,0,0) | |
| radius | No | Number in `units`; expressions are not supported (not parametric) | |
| x_size | No | Number in `units`; expressions are not supported (not parametric) | |
| y_size | No | Number in `units`; expressions are not supported (not parametric) | |
| z_size | No | Number in `units`; expressions are not supported (not parametric) | |
| x_faces | No | ||
| y_faces | No | ||
| z_faces | No | ||
| symmetry | No | {"x", "y", "z": bool} mirror symmetry, or "circular" (cylinder, sphere, torus) | |
| component | No | Component or occurrence for a new form feature (default: the root) | |
| major_faces | No | ||
| minor_faces | No | ||
| x_direction | No | Local X axis (default [1,0,0]) | |
| y_direction | No | Local Y axis, perpendicular to X (default [0,1,0]) | |
| length_faces | No | ||
| major_radius | No | Number in `units`; expressions are not supported (not parametric) | |
| minor_radius | No | Number in `units`; expressions are not supported (not parametric) | |
| radial_faces | No | ||
| latitude_faces | No | ||
| longitude_faces | No | ||
| symmetric_faces | No | Faces per symmetric segment (circular only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the whole burden and does it well: it discloses non-parametric behavior ('body does not follow parameter changes'), that string expressions yield INVALID_PARAMS, that wrong-shape parameters yield INVALID_PARAMS, the return shape with created_form and brep_body, and that a body lacking a regenerated B-Rep fails and is rolled back. These are exactly the behavioral facts an agent needs and cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a compact per-shape parameter table, then behavioral caveats, return contract, and a concrete example. Dense with zero filler despite covering a 27-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-parameter create tool with no annotations and no output schema, the description supplies the shape/param mapping, error conditions, return-value shape including brep_body and created_form, rollback behavior, and the follow-up editing path. Nothing material an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 27 parameters and 63% schema coverage, the description adds real value by mapping which size/face parameters belong to each shape (box: x_size/y_size/z_size + x/y/z_faces, torus: major_radius/minor_radius with the minor < major constraint, etc.) and by warning that sizes are numbers in `units` rather than expressions. It does not explain symmetry, origin/direction conventions, component, or form, leaving those to the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a T-spline primitive body (Form environment) with its control mesh.' This immediately distinguishes it from siblings like form_create_from_tsm (rebuild from TSM data) and form_convert_to_brep (conversion). No ambiguity about what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: shape it afterwards with form_move / form_crease / form_insert_edge, convert with form_convert_to_brep, and for operations Fusion has no API for (Pull, Bridge, Fill Hole, Weld, Subdivide) read the TSM via form_get_tsm and recreate. That is explicit when-to-use-this vs when-to-use-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_get_tsmA
Read the TSM (T-spline mesh) description of a T-spline body: the text (up to
1 MiB) or, with path, a .tsm file. Changes nothing in the design.
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"}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| path | No | Absolute .tsm path to write to (default: return the text) | |
| overwrite | No | Replace an existing file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so well: it declares the operation side-effect free for the design, caps text output at 1 MiB, and enumerates the exact failure modes (oversized text, non-absolute or non-.tsm path, missing folder, existing file without overwrite=true). It even documents the response payloads. Only permission/auth context is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb, resource, and the two modes in one sentence, then the return shapes. The error enumeration is dense but each clause corresponds to an actionable failure. Slightly list-like, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description spells out both return shapes ({"body","tsm","size_bytes"} and {"body","files":[...]}), and it covers limits, error recovery, and side effects. An agent has everything needed to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: `path` switches from returning text to writing a .tsm file, and `overwrite=true` is required specifically when the target file already exists (the schema only says 'Replace an existing file' without framing it as an error condition). The 1 MiB limit applies to the text mode, which the schema never states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read the TSM (T-spline mesh) description of a T-spline body, in either text or file mode. 'Changes nothing in the design' immediately separates it from mutating siblings such as form_move, form_crease, or form_convert_to_brep, so an agent can place it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the two modes clear (default returns text; supplying `path` writes a .tsm file), which is meaningful usage context. But it never names when to choose this over the obvious counterpart form_create_from_tsm or form_inspect, and gives no explicit when-not-to-use guidance. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 tolerance,
or equally near two edges (symmetric meshes), fails with INVALID_PARAMS and
details.nearest; nothing is changed.
Returns {"body": , "changed": selected edges, "new_edges": n}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| mode | No | simple (default) or exact | simple |
| near | Yes | Points near midpoints of edges of one loop | |
| units | No | Unit of lengths and points (default mm) | mm |
| position | No | Where the new edge goes, -1..1 | |
| tolerance | No | Max distance from a point to its element, in `units` | |
| both_sides | No | Insert on both sides |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the preview-API dependency and the exact failure (FUSION_API_ERROR reason=api_unavailable, nothing changed), the single-loop restriction, the ambiguous/too-far point failure with INVALID_PARAMS and details.nearest, and atomicity ('nothing is changed'). It also states the return payload shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the API-dependency caveat, then input sourcing, then return value — a sensible order with no filler. The prose is dense and the parenthetical mid-sentence break slightly hurts scannability, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description spells out the return object, the failure modes, and the no-op guarantee, which is everything an agent needs to call a mutation tool safely. Nothing material is left implicit for a 7-parameter operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by explaining that `near` should be exact edge midpoints taken from form_inspect and that units default to mm, which the schema only says as '[x, y, z] in `units`'. It adds nothing about mode, position, or both_sides, leaving those entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert edges next to control-mesh edges of a T-spline body') plus the downstream effect ('the B-Rep is regenerated'), and references the sibling form_inspect for sourcing input points. An agent can distinguish this from form_move/form_crease/form_convert_to_brep without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow prerequisite — obtain exact edge midpoints from form_inspect — and states the constraint that all edges must belong to one loop. It does not name a when-not-to-use case or an alternative tool for adjacent operations, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 near
points to: vertex "position" (control point), edge "midpoint", face "center".
Returns {"body": , "vertices": [{"position", "smooth_position"}], "edges": [{"midpoint", "start", "end", "is_creased", "is_degenerate"}], "faces": [{"center", "vertex_count"}], "_truncated": bool, "truncated": bool}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| limit | No | Max entries per list | |
| include | No | vertices, edges, faces (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it says the operation changes nothing, specifies millimeters, and describes the return shape including truncation flags. It does not cover permissions or error cases, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core read-only purpose, then gives the exact semantic purpose of the positions, then the return shape. It is appropriately sized with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description supplies the return shape itself. Combined with the fully described input schema and explicit non-mutating/unit behavior, an agent has enough to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `body`, `limit`, and `include`. The description adds geometric meaning to vertex, edge, and face positions but does not add parameter-specific usage details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reads the control mesh of a T-spline body, with units and non-mutating behavior. This clearly distinguishes it from form_list and the form_* mutators that consume the returned positions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the context clear by explaining that returned positions are what form_move, form_crease, and form_insert_edge match their `near` points to. It does not explicitly say when not to use it or name a direct alternative, but the intended inspection-before-editing use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"};
| Name | Required | Description | Default |
|---|---|---|---|
| component | No | Component or occurrence for a new form feature (default: the root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden; it explicitly says 'changes nothing' and documents the return shape down to body fields. It omits permissions, ordering, and error behavior, but for a simple read-only list this is substantial context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the second sentence spends its length on return structure that is necessary because no output schema exists. The dense return spec is justified and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates by documenting read-only behavior and the full forms/body return structure, while the one parameter is covered by the schema. Nothing essential for correctly calling this list tool appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single component parameter has 100% schema description coverage, including entity refs and the default root behavior. The description only echoes 'design or one component' and adds no syntax or format meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'List the form (T-spline) features' and 'T-spline bodies', scoped to the design or one component. It is clearly an enumeration tool, but it does not explicitly distinguish itself from nearby siblings such as form_inspect or form_get_tsm.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states that the tool lists form features and 'changes nothing', implying a read-only enumeration use, but gives no explicit when-to-use versus form_inspect/form_get_tsm guidance. No alternatives, prerequisites, or when-not conditions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 near from form_inspect (vertex position,
face center). A point with no element within tolerance, or equally near two
elements (symmetric meshes), fails with INVALID_PARAMS and details.nearest; nothing
is changed. On a symmetric body Fusion mirrors the move to the symmetric elements.
Errors: zero vector, missing near for vertex/face -> INVALID_PARAMS. If a move fails
midway, the elements already moved are moved back.
Returns {"body": , "changed": n}.
Example: form_move(body="", kind="face", near=[[5, 5, 20]], vector=[0, 0, 5])
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | T-spline body ref (form_list / form_create_*) | |
| kind | Yes | vertex, face (picked by `near`) or body (whole body) | |
| near | No | Points near the vertices / faces to move (positions from form_inspect); ignored for kind=body | |
| units | No | Unit of lengths and points (default mm) | mm |
| vector | Yes | Translation in `units` | |
| tolerance | No | Max distance from a point to its element, in `units` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses that the B-Rep is regenerated, matching by near-points and tolerance can fail with INVALID_PARAMS and details.nearest, symmetric bodies are mirrored, zero vectors and missing near are invalid, and mid-move failures are rolled back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, organized into short paragraphs, and includes a useful example. It is appropriately sized for a mutation tool with subtle matching behavior, though a few clauses repeat schema defaults such as mm and unit handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex T-spline mutation tool with no annotations and no output schema, the description is complete enough to call correctly: it explains picking semantics, tolerance failures, symmetric mirroring, rollback behavior, errors, and the return shape. It also provides a concrete example invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters, but the description adds meaningful semantics for near, tolerance, and vector behavior: exact positions should come from form_inspect, ambiguous proximity fails, and zero vectors are invalid. It does not add much detail beyond the schema for body, kind, and units, but it substantially clarifies the matching parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: moving T-spline control-mesh vertices, faces, or whole bodies by a vector, with B-Rep regeneration. This clearly distinguishes it from generic body movement and other form tools by emphasizing the T-spline control-mesh context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool applies: T-spline control-mesh elements or whole-body moves, with picking instructions pointing to form_inspect. However, it does not explicitly name or contrast the alternative body_move or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fusion_statusA
Check that Fusion 360 and the FusionMCP add-in are reachable; call this first.
Returns JSON with:
fusion_version: Fusion build, e.g. "2.0.21000"
addin_version: FusionMCP add-in version
python_version: Python inside Fusion
document: name of the active document, or null when none is open
design_type: "parametric" (has a timeline; failed tools roll back), "direct", or null when the active document is not a design
units: the design's default length unit ("mm", "cm", "in", ...); tool inputs are still millimetres unless a tool takes an explicit
units
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it enumerates every returned field with meaning (including the consequential distinction between 'parametric' — where failed tools roll back — and 'direct'), documents the NOT_CONNECTED error prefix, and explains post-timeout semantics. That rollback note in particular is non-obvious behavior an agent could not infer elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose and the 'call this first' directive, then a scannable bulleted return contract. The field list is somewhat long, but with no output schema it earns its place; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must supply both the return contract and failure modes — it does both, plus the design_type behavioral consequence. An agent can call this correctly and interpret the response with nothing else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description does add one useful caveat about units ('tool inputs are still millimetres unless a tool takes an explicit units'), which is context rather than parameter semantics, but nothing is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check that Fusion 360 and the FusionMCP add-in are reachable') and immediately marks its ordering role with 'call this first'. Among ~130 siblings, none is a connectivity/health probe, and the description makes that unique role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two explicit triggering conditions: call first (before other work) and call after a TIMEOUT from another tool before retrying, with the reason ('the timed-out operation may still be running in Fusion'). This is a genuine when-to-use rule rather than an implied one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of an existing file | |
| format | No | Format; default from the extension | |
| target | No | Ref of the component to import into; default root | |
| mesh_units | No | Units of STL/OBJ/3MF coordinates (files carry none) | mm |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full load and does it reasonably well: it discloses the CAD→occurrence / mesh→body mapping and, importantly, that a failed import is atomic ('leaves the design as it was'). It omits where the path must resolve (local vs server filesystem) and any size/format limitations, which matters for a file-IO mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and format list, then behavior, then return shape, then a short example — a sensible order with little waste. The inline JSON return sketch is slightly dense but earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates by explaining the return structure and the atomicity guarantee. The remaining gap is operational: how the path is resolved and whether the target component must already exist before import.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented, establishing a baseline of 3. The description adds only marginal meaning: the implicit root default for target and the example path, while mesh_units and explicit format override are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (import) plus the resource and enumerates the accepted formats (STEP, IGES, SAT, SMT, F3D, STL, OBJ, 3MF). It also distinguishes the two outcomes — CAD files become occurrences, meshes become mesh bodies — which no sibling tool claims.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'into a component of the active design' and the CAD-vs-mesh split, so an agent can infer when this is the right call. But no alternates or exclusions are named (e.g. when to prefer assembly_add_occurrence or form_create_from_tsm instead), leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 boundingBox is used and the item
has "tight": false. Components and occurrences are the union of their bodies.
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 union.size_mm.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | Bodies, components, occurrences or faces; default: all visible bodies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does disclose meaningful behavior: the tight/loose fallback from Fusion's measure manager, the 'tight': false flag, and the union-of-bodies rule for components and occurrences. It also flags that an 'errors' array can be returned, though it never explains what lands there or whether partial results still come back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope sentence is front-loaded and the return shape plus example are compact. Minor waste in the odd inline quoting of `"tight": false` and the trailing newline-only example, but every block (behavior, return shape, example) earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection tool with no output schema and one fully documented parameter, the description supplies the return structure, the aggregation semantics, and the coordinate unit — enough to call it correctly. The underspecified 'errors' contents and the absence of any note about cost on large models are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'refs' parameter is fully documented in the schema, including the default of all visible bodies. The description adds no syntax, ordering, or deduplication semantics for refs beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific resource and coordinate convention ('World-axis bounding boxes in mm') and explains when a tight vs loose box is produced, so an agent knows exactly what is computed. It does not explicitly contrast itself with inspect_physical_properties or measure_distance, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the example 'inspect_bounding_box() -> overall size of the model' hints at the zero-argument case, and the schema default ('all visible bodies') implies scope. There is no explicit statement of when to prefer this over measure_distance or inspect_physical_properties, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 origin:XY etc.
A ref that does not resolve goes to errors and does not fail the call.
Returns {"items": [...], "errors": [{"ref", "code", "message"}]}.
Example: inspect_describe(refs=["origin:xy", ""], detail="brief").
| Name | Required | Description | Default |
|---|---|---|---|
| refs | Yes | Refs to describe | |
| detail | No | brief or full (adds geometry) | full |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it states units, explains that unresolved refs go to `errors` without failing the call, and documents the return shape. It could do slightly more by explicitly confirming read-only behavior, but the key operational behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and every sentence contributes useful information: entity coverage, units, error behavior, return shape, and example. The first sentence is dense with parenthetical enumerations, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex inspection tool with no output schema and no annotations, the description is largely complete: it covers entity types, units, error handling, and return structure. Minor gaps remain around full ref syntax and the exact semantics of `detail`, but the essential call context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining accepted ref formats such as `origin:XY` and that `detail` controls whether geometry is included. It stops short of fully documenting all possible ref syntaxes, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: describe entities by ref, with a detailed enumeration of entity types and attributes. It does not explicitly differentiate itself from siblings such as inspect_query, inspect_tree, or inspect_physical_properties, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through examples of refs like `origin:XY` and the `detail` option, but there is no explicit when-to-use guidance, no when-not guidance, and no named alternatives among the many inspect/measure siblings. An agent can infer that it describes referenced entities, but the description does not route it against competing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | Bodies, components or occurrences; default: root | |
| accuracy | No | Calculation accuracy | high |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral-disclosure burden. It usefully explains the return envelope, null handling for uncomputable moments, and coordinate context, but it does not state read-only/no-mutation behavior, permissions, performance implications, or accuracy tradeoffs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the resource and key returned fields, then gives null behavior, return shape, and an example. It is dense but appropriate given the absence of an output schema; the long field enumeration is functional rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema and no annotations, the description must cover both return semantics and behavior. It does well on returned fields and null handling, but remains incomplete on sibling differentiation, parameter effects such as accuracy, and read-only or performance behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents refs (including default root) and the accuracy enum. The description adds some meaning around occurrence coordinates in the output, but it does not add parameter-specific guidance beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool retrieves physical/mass properties such as mass, volume, area, density, center of mass, inertia, and material. It is specific about the resource, but it does not distinguish itself from nearby inspection or measurement siblings like inspect_bounding_box or measure_distance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example 'check the volume' implies using this tool for physical-property checks, so usage is somewhat implied. However, it gives no explicit when-to-use guidance versus alternatives such as inspect_bounding_box, measure_distance, or inspect_query, and it lists no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_queryA
Find faces, edges, vertices or bodies by geometry instead of writing code. All
given filters must match; results are brief descriptions with refs (lengths mm,
areas mm²). Filters only apply to their kind (e.g. surface_type needs
kind="face") — a wrong combination or min > max fails with INVALID_PARAMS.
Returns {"items": [...], "total": , "truncated": bool}.
On large models narrow scope to one body.
Examples:
largest face: inspect_query(kind="face", sort_by="area", limit=1)
planar faces facing +Z: inspect_query(kind="face", surface_type="plane", normal=[0, 0, 1])
edges longer than 25 mm of one body: inspect_query(kind="edge", scope=[""], length_min_mm=25)
10 mm holes: inspect_query(kind="face", surface_type="cylinder", radius_min_mm=4.9, radius_max_mm=5.1)
vertical edges: inspect_query(kind="edge", curve_type="line", direction=[0, 0, 1])
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Cylinder/cone faces with this axis (either way) | |
| kind | Yes | What to return | |
| limit | No | ||
| order | No | desc | |
| scope | No | Bodies, components, occurrences or faces to search; default: all visible bodies | |
| normal | No | Planar faces facing this direction | |
| sort_by | No | Sort key | |
| direction | No | Line edges parallel to this (either way) | |
| curve_type | No | Edges only | |
| within_box | No | {"min_mm": [x, y, z], "max_mm": [x, y, z]} | |
| area_max_mm2 | No | ||
| area_min_mm2 | No | ||
| surface_type | No | Faces only | |
| length_max_mm | No | ||
| length_min_mm | No | ||
| radius_max_mm | No | ||
| radius_min_mm | No | Faces: cylinder/cone/sphere radius, torus tube; edges: arc/circle | |
| normal_tolerance_deg | No | Tolerance for normal/axis | |
| direction_tolerance_deg | No | Tolerance for direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and mostly does: it discloses AND semantics for filters, kind-scoped filter applicability, that mismatched combos or min>max raise INVALID_PARAMS, units (mm, mm²), result format ('brief descriptions with refs'), truncation semantics, and the default scope of all visible bodies. It omits execution cost/volume limits beyond the scope hint and doesn't state read-only nature explicitly (only implied by 'find').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by contract rules and then a compact example block. The examples occupy roughly half the text but each demonstrates a distinct useful filter combination, so they earn their space; a little trimming of the return-shape sentence into the examples would be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, annotation-free tool with no output schema, the description supplies the error model, default scope, units, truncation behavior and return shape. Remaining gaps are secondary: relationship of returned `ref`s to other tools and the meaning of ordering/sorting options.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 63% schema coverage the description adds real meaning: the kind-gating rule for filters (surface_type needs kind="face"), the AND-of-all-filters rule, units for length/area/radius, and example pairings that show how filters combine (surface_type+normal, curve_type+direction, radius range for holes). It leaves `order`, `axis`, and `sort_by` semantics largely to the schema, so it doesn't fully close the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('find') and resource ('faces, edges, vertices or bodies') plus the defining scope: by geometry filters. The phrase 'instead of writing code' implicitly contrasts it with execute_python, making the tool's role in the sibling set unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete invocation patterns via five worked examples and a real usage rule ('On large models narrow `scope` to one body'), plus a constraint that filters are ANDed. It does not explicitly route the agent away from siblings like inspect_tree, inspect_describe or inspect_bounding_box, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_treeA
Model tree of the active design: bodies, sketches, construction geometry,
timeline features (with health) and nested occurrences, each with a stable ref.
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 origin:XY,
origin:XZ, origin:YZ, origin:X, origin:Y, origin:Z, origin:O and are not
listed. Direct (non-parametric) designs have features: [].
Returns {"design_type": "parametric"|"direct", "root": {...component node with
"bodies", "sketches", "construction", "features", "occurrences"}, "item_count",
"truncated"}; when truncated is true narrow component/depth/include.
Example: inspect_tree(include=["bodies", "features"]).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Occurrence nesting levels to expand; 0 = only the start | |
| include | No | Lists to include; default: all | |
| component | No | Component ref to start from; default: root | |
| max_items | No | Stop after this many items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it specifies the return shape, the `item_count`/`truncated` flags, the `features: []` edge case for direct designs, and the origin-plane addressing convention. It does not explicitly state read-only safety or any permission requirements, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return contract, then an example call. The origin-plane enumeration is somewhat dense but earns its place as a lookup. Overall tight and well-ordered, with minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description spells out the return structure, edge cases (direct designs, origin addressing), and truncation handling. For a 4-parameter, entirely-optional-parameter inspection tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter types are documented, but the description adds real meaning: it explains that origin planes/axes/point are addressed via `origin:*` and are not listed, that `ref` is stable, and that `component`/`depth`/`include` should be narrowed when `truncated` is true. This is above the baseline-3 schema-dependent case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Model tree of the active design') and enumerates exactly what it returns (bodies, sketches, construction geometry, timeline features with health, nested occurrences). It also marks itself as the entry point ('Start here to find what to work on'), which cleanly differentiates it from siblings like timeline_list or sketch_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool as the starting point ('Start here to find what to work on') and gives concrete guidance on what to do when output is truncated ('narrow component/depth/include'). It stops short of naming specific alternative tools and the conditions under which inspect_describe or inspect_bounding_box would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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="").
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Ref of a body, a component or an occurrence | |
| library | No | Library name or id to resolve an ambiguous name | |
| material | Yes | Material id from material_list (preferred) or exact name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the propagation side effect (an occurrence inherits its component's material, affecting all occurrences), the ambiguous-name error payload, and the returned "previous" value that implies replacement of any existing assignment. It stops short of stating units for density/mass or whether the change is undoable/persisted beyond the presence of "previous".
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and targets, then layers in the occurrence caveat, id sourcing, error behavior, verification step, return shape, and a concrete example, each in its own short block. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description supplies the exact return payload (target, applied_to, material, previous, plus note for occurrences), which is what an agent needs to chain calls. Combined with the ambiguity-error and follow-up-verification guidance, nothing essential is missing for a 3-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all three parameters are documented there, including library's ambiguity-resolution purpose. The description reinforces that material should be an id from material_list (preferred) or an exact name, but adds little beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Assign a physical material") and scopes the valid targets (body, component, occurrence). The parenthetical "(density, mass)" cleanly separates it from the appearance_* siblings, and it names material_list as the id source, so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (take the id from material_list), the failure/alternative path (ambiguous name fails with details.candidates; use the library parameter), and a follow-up step (verify mass with inspect_physical_properties). It also states the occurrence special case, so when-to-use and what-to-do-next are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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="").
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Ref of a body, a component or an occurrence |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose the return shape, including nullable material and appearance fields, plus occurrence override behavior. However, it does not explicitly state that the operation is read-only, nor does it describe error behavior when the target is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, followed by the return shape and a compact example. Every sentence contributes useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no annotations or output schema, the description covers target types, occurrence semantics, and return structure. It is nearly complete, though it could mention error behavior or explicitly note that the tool is read-only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single target parameter at 100% coverage, so the baseline is 3. The description adds meaning beyond the schema by explaining that an occurrence target reports its component's material and its own appearance override, and it gives a concrete example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving physical material and appearance for a body, component, or occurrence. It clearly distinguishes the target types and explains the occurrence case, but it does not explicitly contrast with siblings like material_list, material_assign, or appearance_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the example and by clarifying what an occurrence reports, but the description does not state when to use this tool versus material_list, material_assign, or appearance_list. It also provides no explicit exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (max 1000) | |
| query | No | Case-insensitive substring of the name, e.g. 'steel' | |
| offset | No | Items to skip (pagination) | |
| library | No | Library name or id (see material_list_libraries); omit for all libraries | |
| in_design | No | List only the items already in the active design |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it explains the return fields, the pagination-related total/truncated values, and the important caveat that names are localized and non-unique. It does not mention permissions, rate limits, or error behavior, but for a read-only listing tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool’s purpose, then compactly covers return shape, the non-unique-name caveat, and an example. Every sentence contributes useful information, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description compensates for the absence of an output schema by documenting the returned object shape and pagination indicators, and it calls out the localized/non-unique name behavior. It is nearly complete for a listing tool, though it could more explicitly route agents to material_list_libraries or material_get in related workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, query, offset, library, and in_design. The description reinforces the scoping semantics and adds a concrete example, but it does not add much parameter syntax or edge-case meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool lists physical materials and specifies the three scoping modes: one library, all libraries by default, or the active design via in_design=true. It does not explicitly contrast the tool with material_get or material_list_libraries, but it does identify material_assign as the downstream action for using returned ids.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: omit library to search all libraries, set library to search one, set in_design=true to search the active design, and pass the returned id to material_assign. It does not explicitly state when to prefer material_list_libraries or material_get instead, so it falls short of a full when-to-use/alternative routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=...).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It clearly indicates a read-only listing behavior by saying 'Loaded material libraries' and by documenting the returned structure, including counts; no mutation or side effects are implied. It does not explicitly say permissions are unnecessary, but the read/listing nature is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, return shape second, usage example third. Every sentence adds useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool without an output schema, the description provides the return object structure and a concrete usage example. An agent has enough information to call it and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics have a baseline of 4. The example correctly shows no arguments and points to the related material_list(library=...) parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb-resource pair ('Loaded material libraries') and explicitly scopes the resource to physical materials and appearances. It also names the returned fields, so the agent can distinguish it from sibling tools like material_list, material_get, and appearance_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example establishes a clear usage pattern: call material_list_libraries() first, then pass a selected library into material_list(library=...). It does not state explicit exclusions or alternatives beyond that, but the context is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_angleA
Angle in degrees between two entities (faces, edges, axes, planes), or — with
three operands — the angle at vertex b of the points/entities a-b-c.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | An entity ref (e.g. a face, edge, vertex, body, origin:XY) or a point [x, y, z] in mm | |
| b | Yes | An entity ref (e.g. a face, edge, vertex, body, origin:XY) or a point [x, y, z] in mm | |
| c | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well by disclosing the return object, degree units, supported entity/point inputs, and the two operating modes. It does not detail constraints such as mixed entity/point handling, precision, or error conditions, so it is strong but not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, compact, and every sentence adds useful information. The return contract and examples are included without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple measurement tool with no output schema, the description adequately covers purpose, input modes, return value, and examples. Minor omissions around error behavior and sibling-tool selection keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema repeats the same type description for a, b, and c, but the tool description adds critical semantic information: a-b is the two-operand case, and a-b-c uses b as the vertex. The examples further clarify parameter usage beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool computes an angle in degrees, including the two-operand and three-operand modes. It is specific about the resource and result, but it does not explicitly distinguish itself from the sibling measure_distance tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the key usage distinction: two operands measure between two entities, while three operands measure the angle at vertex b of a-b-c. It provides examples, but does not state when not to use it or name measure_distance as the alternative for distance queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | An entity ref (e.g. a face, edge, vertex, body, origin:XY) or a point [x, y, z] in mm | |
| b | Yes | An entity ref (e.g. a face, edge, vertex, body, origin:XY) or a point [x, y, z] in mm |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it gives units, describes the return fields, and discloses that closest points may be null when Fusion does not report them. It does not explicitly say the operation is read-only, but the measurement framing strongly implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose and units first, operand format second, return structure third, and a concrete example last. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter measurement tool with no output schema, the description supplies the essential context: units, operand forms, return fields, null behavior, and an example. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully documented in the schema. The description restates operand types and adds a useful example, but it does not add substantial meaning beyond the structured parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific measurement operation, its resource (minimum distance between entities or points), and its unit (mm). It is clearly distinguishable from siblings such as measure_angle and inspect_bounding_box.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: two operands, each either an entity ref or an [x, y, z] point in mm, with an example of measuring height between faces. It does not explicitly name when to prefer alternatives, but the measurement context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
expression is a Fusion expression string ("40 mm", "width / 2") or a number in
unit (default mm): 40 -> "40 mm". Use unit "deg" for angles and "" for counts.
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"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| parameters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the atomic transaction model ("a Fusion error on any item removes the ones already created"), the up-front name validation (pattern, existence, duplicates), and the exact return shape including a warnings array for newly-warning features.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and ordering constraint, followed by the atomicity caveat, the expression/unit rules, the return value, and a closing example. Each block is short and additive; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema, yet the description covers the mutation semantics, failure behavior, unit handling, return payload, and a runnable example. For a single-array-parameter tool this is essentially everything an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is reported as 0%, so the description must compensate, and it largely does: it explains that `expression` accepts either a Fusion expression string or a bare number interpreted in `unit`, with the worked mapping 40 -> "40 mm" and the deg/"" unit conventions. The `comment` field and the minItems/maxItems bounds are never mentioned, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create user parameters") plus a scope qualifier ("in order"). It does not explicitly name a sibling such as parameter_update or parameter_delete, but the creation semantics are unambiguous enough that an agent can distinguish it from the other parameter_* tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage rules: later parameters may reference earlier ones, all-or-nothing validation, and which unit to pick for angles versus unitless counts. It stops short of stating exclusions (e.g. "use parameter_update to change an existing parameter"), so the boundary with siblings is implied rather than asserted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 details.dependents; delete or change those
first, or include them in names.
Returns {"deleted": [names], "warnings": [...]}.
Example: parameter_delete(names=["half", "width"]).
| Name | Required | Description | Default |
|---|---|---|---|
| names | Yes | User parameter names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does well: it discloses atomicity ('all or nothing'), the exact failure mode (INVALID_PARAMS with `details.dependents`), the constraint that model parameters are undeletable, and the return payload. It does not cover reversibility/undo or permission requirements, which are the remaining gaps for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what it deletes, then the refusal rule, then the return shape, then a concrete example. Every line adds information an agent needs, and the example costs one short sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no annotations and no output schema, the description supplies the missing return format, the atomicity guarantee, and the error/dependents contract. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, so the schema already documents `names`; the description nonetheless adds real meaning by explaining that dependency-blocking parameters may be included in `names` to resolve the refusal in one call. That is semantics the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete user parameters') plus a scope qualifier that excludes model parameters, which separates it cleanly from parameter_create/parameter_update siblings. The 'all or nothing' clause further pins down the operation's semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says model parameters cannot be deleted and tells the agent exactly what to do when a dependents refusal occurs: delete/change the dependents first or include them in `names`. It stops short of naming a sibling alternative (e.g., parameter_update) as the route for a single-parameter change, but the preconditions and recovery path are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 d1 of an extrude to drive it.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | user (yours), model (created by features) or all | all |
| component | No | Component ref: only its model parameters | |
| name_contains | No | Case-insensitive name filter | |
| include_dependents | No | Add the names of parameters that use each one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full burden and does so well: it discloses unit normalization (lengths in mm, angles in degrees, value omitted for other units), conditional fields (dependents only with include_dependents), and null semantics for created_by. It does not state what happens with no active design or whether the list is ordered/filterable further, but the core behavioral contract is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one sentence, followed by the item contract; no filler. The field enumeration is dense and slightly run-on, but since there is no output schema each field earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Substitutes effectively for the missing output schema by documenting every returned field, including units and conditional keys, which is what an agent needs to parse results. Minor gaps: no statement on requiring an active design or on result ordering.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter already has a description, so baseline is 3. The description adds some real meaning – it clarifies that 'model' parameters are feature-owned (via created_by) and that include_dependents changes the item shape – but it does not expand on component refs or name_contains beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List parameters of the active design', with the implicit scope that it reads the currently active document. It is clearly distinct from the write-side siblings (parameter_create/update/delete), though it doesn't explicitly position itself against timeline_feature_parameters or design_get_settings, which also expose parameter data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example 'parameter_list(kind="model") -> find `d1` of an extrude to drive it' implies the discovery-then-edit workflow, which is useful. But there is no explicit when-to-use guidance, no note that this should precede parameter_update, and no mention of alternatives for inspecting feature-owned parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parameter_updateA
Change expression, name, comment or favourite flag of user and model parameters
— e.g. drive an extrude by setting its model parameter d1 to "width * 2".
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 details.failed_features. Renaming updates the expressions
that use the parameter.
Returns {"parameters": [...as in parameter_list], "warnings": [...]}.
Example: parameter_update(parameters=[{"name": "d1", "expression": "width * 2"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| parameters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden and does so well: it discloses transactional atomicity (all changes roll back if any fail or put a timeline feature into error state), the exact failure contract (FUSION_API_ERROR with details.failed_features), and the cascading side effect that renaming rewrites expressions referencing the parameter. This is exactly the kind of non-obvious behavior an agent needs before attempting a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The capability statement is front-loaded in the first line, followed by the two pieces of behaviorally critical information (atomicity/error contract, rename cascade), the return shape, and a compact example. Every sentence carries distinct load with no restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return shape inline (parameters plus warnings). No annotations exist, and the description supplies the failure and rollback semantics instead. For a single-array-argument mutation tool, an agent has enough to invoke it correctly and interpret both success and failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description must compensate; it names the four mutable fields (expression, name, comment, favourite flag) and demonstrates the nested object form with parameter_update(parameters=[{...}]). It also explains that renaming updates dependent expressions, which the schema does not. Gaps remain around the minItems 1 / maxItems 100 batch limits and whether omitted/null fields mean 'leave unchanged'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource: change expression, name, comment or favourite flag of user and model parameters, with a concrete example of driving an extrude via `d1`. The scope is unambiguous against parameter_create/parameter_delete/parameter_list by name alone, but the description never explicitly distinguishes itself from the overlapping sibling timeline_set_model_parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the example and the 'at least one field besides name' semantics carried by the schema, so an agent can infer this is for modifying existing parameters. However, there is no explicit when-to-use / when-not-to-use statement, no mention of prerequisites (e.g. must the document be active?), and no routing away from timeline_set_model_parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| axis | Yes | Axis: origin:X|Y|Z, construction axis, straight edge, sketch line or cylindrical/conical face | |
| compute | No | Feature input only: adjust (default), optimized or identical | adjust |
| entities | Yes | What to pattern - all of ONE kind: feature refs (timeline features), body refs, face refs (inspect_query) or occurrence refs | |
| quantity | Yes | Instances including the original | |
| symmetric | No | Spread both ways from the original | |
| total_angle | No | Angle the instances span |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses atomicity ('nothing changed') for INVALID_PARAMS, rollback for FUSION_API_ERROR, expected return fields including created/modified/removed bodies and occurrences, and the one-kind constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core operation, then support details, error behavior, returns, and a compact example. Some ref-source text duplicates the schema, but every section remains useful and the example is worth the space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no annotations and no output schema, the description covers entity sourcing, axis sourcing, angle semantics, failure modes, atomicity, return shape, and an example. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: instances spread evenly over total_angle with 360 meaning a full circle, all entities must be of one kind, and quantity below 1 is invalid. The compute parameter is left to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource — copy features, bodies, faces or occurrences around an axis — and the circular/axis framing distinguishes it from linear or path patterns. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: pattern around an axis, entity kinds supported, and valid ref sources. It does not explicitly name alternatives such as pattern_rectangular or explain when not to use this tool, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| plane | Yes | Planar face, construction plane or origin:XY|XZ|YZ | |
| combine | No | Bodies only: join each mirrored body with its original | |
| compute | No | Feature input only: adjust (default), optimized or identical | adjust |
| entities | Yes | What to pattern - all of ONE kind: feature refs (timeline features), body refs, face refs (inspect_query) or occurrence refs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well. It explains combine behavior and resulting modified_bodies, lists error conditions including INVALID_PARAMS and FUSION_API_ERROR with rollback semantics, and documents the return keys including created/modified/removed bodies and occurrences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, then adds combine semantics, refs, errors, returns, and a compact example. Every section contributes useful information without repetition, and the example is short and directly actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is complete enough to call correctly. It covers input kinds, plane refs, combine behavior, error handling, rollback, and return payload structure, leaving no major gap for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, establishing a baseline of 3. The description adds meaningful cross-parameter semantics, especially that combine applies only to body input and joins each mirrored body with its original, and that mixed entity kinds are invalid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: mirror features, bodies, faces, or occurrences across a plane. It clearly distinguishes the operation from siblings such as pattern_circular, pattern_rectangular, and sketch_mirror by naming the mirrored entity kinds and the plane-based operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context, including that combine is body-only, that all entities must be of one kind, and that planes can come from origin refs, construction geometry, or inspect_query. It does not explicitly name alternative pattern tools or state when not to use this one, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pattern_pathA
Path pattern: copy features, bodies, faces or occurrences along a path of sketch curves or edges.
Units: distance in units (default mm) or an expression; start is a share of the path
length. Refs: curves from sketch_* results, edges from inspect_query. All entities
must be of one kind.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Go the other way along the path | |
| path | Yes | Sketch curve refs or edge refs (one kind) | |
| start | No | Start on the path: 0 = start .. 1 = end | |
| units | No | Unit of plain-number lengths | mm |
| compute | No | Feature input only: adjust (default), optimized or identical | adjust |
| distance | Yes | Extent (default) or spacing along path | |
| entities | Yes | What to pattern - all of ONE kind: feature refs (timeline features), body refs, face refs (inspect_query) or occurrence refs | |
| quantity | Yes | Instances including the original | |
| symmetric | No | Spread both ways along the path | |
| path_chain | No | Extend the path through connected curves/tangent edges | |
| distance_type | No | extent (default): total length used; spacing: between instances | extent |
| orientation_along_path | No | Rotate instances to follow the path tangent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it names the specific error codes (INVALID_PARAMS, FUSION_API_ERROR), the conditions that trigger them (mixed kinds, mixed curves/edges path, start outside 0..1, gaps), and the state outcome in each case ('nothing changed', 'rolled back'). It also documents default units and the start-as-share semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then segments Units/Refs/Errors/Returns/Example so each labeled line is scannable and non-redundant. The example call at the end is compact and earns its place by showing argument wiring.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description supplies the return keys, the failure modes and their atomicity guarantees, and a worked example. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds genuine meaning beyond it: units default to mm or accept an expression, start is a share of path length, and refs must be sourced from sketch_* results or inspect_query. It does not cover several non-obvious params (compute, distance_type, path_chain, symmetric), keeping it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with the distinguishing mechanism: 'copy features, bodies, faces or occurrences along a path of sketch curves or edges.' The path-based copying contrasts naturally with the sibling pattern_rectangular/pattern_circular, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection context: what can be patterned, where refs come from (sketch_* results, inspect_query), and the constraint that all entities must be of one kind. It does not explicitly name sibling alternatives or state when not to use it, so it stays below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm) or Fusion expressions; quantities are whole numbers
or expressions. Refs: bodies/faces from inspect_query, features from earlier
feature_* results, directions from inspect_query edges, construction_* axes or
origin:X|Y|Z. All entities must be of one kind (Fusion requirement).
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)
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain-number lengths | mm |
| compute | No | Feature input only: adjust (default), optimized or identical | adjust |
| entities | Yes | What to pattern - all of ONE kind: feature refs (timeline features), body refs, face refs (inspect_query) or occurrence refs | |
| distance1 | Yes | Spacing (or extent) along direction1; negative flips it | |
| distance2 | No | Spacing (or extent) along direction2 | |
| quantity1 | No | Instances along direction1 | |
| quantity2 | No | Instances along direction2 | |
| direction1 | Yes | Straight edge, sketch line, construction axis or origin:X|Y|Z | |
| direction2 | No | Optional second direction | |
| symmetric1 | No | Spread both ways along direction1 | |
| symmetric2 | No | Spread both ways along direction2 | |
| distance_type | No | spacing (default): distance between instances; extent: total | spacing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it: it explains that quantities count the original, unit handling, the two distinct failure modes with their side effects (INVALID_PARAMS leaves nothing changed, FUSION_API_ERROR is rolled back), and what the call returns. That is exactly the behavioral context an agent needs before mutating a model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then labeled blocks (Quantities, Units, Refs, Errors, Returns, Example) that make it scannable despite being dense. A few lines, notably the units/quantity sentence and the closing example, restate information already implied elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema and no annotations, the description supplies the return shape, occurrence-specific extras, rollback behavior and ref provenance. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by clarifying the non-obvious counting semantics ('quantity1=3 -> the original + 2 copies') and how plain numbers versus Fusion expressions are interpreted. It doesn't touch symmetric1/2, distance_type or compute, but those are covered by schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rectangular pattern: copy features, bodies, faces or occurrences along one or two directions'), which inherently separates it from the sibling pattern_circular, pattern_path and pattern_mirror. The supported entity kinds are enumerated up front, so an agent knows what it can pattern without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete sourcing rules for every ref type ('bodies/faces from inspect_query, features from earlier feature_* results, directions from inspect_query edges, construction_* axes or origin:X|Y|Z') and the hard constraint that all entities must be of one kind. It never explicitly says when to prefer pattern_circular or pattern_path over this one, so the routing guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 rule to the first flange tool instead. On error the
previous rule is restored and a copy made by the call is deleted.
Returns {"component", "rule": , "previous": name | null, "copied_from_library": bool}.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | Rule name | |
| source | No | Where to look for `rule`: design, library or all (design first) | all |
| component | No | Component or occurrence ref; default: the root component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and meets it: it discloses the library-copy side effect, the rollback guarantee on error (previous rule restored, copy deleted), and the exact return shape. This is rich behavioral context beyond what the schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by behavior and return shape. The error-handling paragraph is dense but every clause is functional; no filler prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description documents the return object (component, rule, previous, copied_from_library), covers the failure mode and its remedy, and notes the library-copy semantics. An agent has everything needed to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents rule, source, and component. The description reinforces the component default (root) but adds no syntax or format detail for `source` beyond the enum already present. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: makes a rule the active sheet metal rule of a component, with a default scope (root). This is clearly distinguishable from siblings like sheet_metal_list_rules and sheet_metal_create_rule, which list and create rather than assign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what to do when Fusion refuses the rule (FUSION_API_ERROR) and names the alternative: pass `rule` to the first flange tool instead. Also states the library-copy behavior up front, so the agent knows the operational context before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 / rule) -> base or contour flange
-> sheet_metal_edge_flange -> sheet_metal_create_flat_pattern ->
sheet_metal_export_flat_pattern. Bend along a sketch line is not available in the
Fusion API: model bends with edge or contour flanges.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | No | Rule name to make the component's active rule first (sheet_metal_list_rules); a library rule is copied into the design. Default: keep the active rule (Fusion uses the library default for the first flange) | |
| profiles | Yes | Closed sketch profiles (sketch_profiles) | |
| operation | No | new_body (default) or new_component | new_body |
| orientation | No | Side of the sketch the material grows: side_one (default), side_two, centered | side_one |
| rule_source | No | Where to look for `rule`: design, library or all (design first) | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses that the tool uses a preview Fusion API, gives the exact failure mode and reason, and states that nothing changes on failure. It also documents the return structure. It does not cover every mutation-related concern, such as required document state or permissions, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then proceeds through workflow, caveat, and return shape. The information is useful and well organized, though it is dense and could have been slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex sheet metal creation tool with no annotations and no output schema, the description covers the essential workflow, failure mode, alternatives, and return value shape. It is nearly complete, though it could say more about required document/component state and the side effects on existing bodies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all five parameters, including the profile variants and rule handling. The description adds useful context that thickness comes from the active rule and that rule creation is part of the workflow, but it does not go much beyond the schema's parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation, resource, and key dependency: a base flange creates a flat sheet metal body from closed profiles, with thickness driven by the active rule. It also distinguishes this from edge and contour flanges by stating that sketch-line bends are unavailable and must be modeled with those other flanges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit recommended order: create/select a rule, then base or contour flange, then edge flange, flat pattern, and export. It also names an alternative path for bends (edge or contour flanges) and tells the agent to check sheet_metal_capabilities first when the preview API may be unavailable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so: 'changes nothing' declares the read-only, side-effect-free nature. It also discloses that several operations rely on a preview API that 'may be missing', and that sketch_bend is hardcoded false because Fusion has no API for it — exactly the behavioral caveats an agent cannot otherwise infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The read-only declaration and the 'call before a workflow' instruction are front-loaded, and the fallback guidance follows logically. The enumerated return key list is long and slightly awkwardly formatted, but since no output schema exists it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description supplies the full return shape (including the always-false sketch_bend and the preview_apis list), the availability caveat, and a workaround. Nothing an agent needs to call it and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing to disambiguate. The description instead spends its space on the return shape, which is appropriate for a zero-arg query.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report which sheet metal operations this Fusion API supports') plus the key qualifier 'changes nothing'. An agent can immediately distinguish this capability probe from the sibling action tools like sheet_metal_edge_flange or sheet_metal_unfold.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call it before a sheet metal workflow' gives clear, actionable timing, and the description names concrete alternatives for the sketch_bend gap (sheet_metal_edge_flange or sheet_metal_contour_flange). It stops short of stating when-not to call it (e.g. once per session), so it falls just short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| rule | No | Rule name to make the component's active rule first (sheet_metal_list_rules); a library rule is copied into the design. Default: keep the active rule (Fusion uses the library default for the first flange) | |
| units | No | Unit of plain-number lengths (default mm) | mm |
| distance | Yes | Flange length along the sketch normal | |
| profiles | Yes | Open sketch curves (e.g. an L of two lines), edges or open profile refs; connected curves are chained | |
| direction | No | one_side (default), symmetric or two_sides (needs distance_two) | one_side |
| operation | No | new_body (default) or new_component | new_body |
| bend_radius | No | Bend radius override (default: the rule's) | |
| orientation | No | Side of the sketch the material grows: side_one (default), side_two, centered | side_one |
| rule_source | No | Where to look for `rule`: design, library or all (design first) | all |
| distance_two | No | Second side length (two_sides only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses the preview-API risk and exact failure signature (FUSION_API_ERROR reason=api_unavailable, nothing changed), the rollback behavior on failure ('the previous rule restored'), and specific parameter-combination validation errors. This is mutation-relevant context an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the definition, then workflow, then failure modes, then return shape, then example — a good ordering with no filler sentences. The line-broken formatting and one long parenthetical make it slightly harder to scan than an ideal 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description still lists the returned keys (feature, health, created_bodies, modified_bodies, removed_bodies, rule), covers the API-availability prerequisite, and supplies a runnable example call. Nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description goes beyond it by explaining that 'profiles' are the bend-line curves (with an L-of-two-lines example) and by spelling out the two_sides/distance_two constraint that the schema only hints at via enum descriptions. Marginal gains remain for rule_source/rule_source interaction, keeping it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (contour flange) and immediately defines it operationally: a bent sheet metal body from an open sketch profile, with the profile being the bend-line shape and thickness/radius coming from the rule. It is clearly distinguished from siblings, which it names by role (sheet_metal_edge_flange for edge bends, sheet_metal_list_rules/capabilities).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit recommended sequence (rule -> contour flange -> edge_flange on outer edges -> list_bends/unfold/refold -> flat pattern -> export) and states when NOT to reach for this tool: 'Bend along a sketch line is not available in the Fusion API: add bends with edge flanges or draw them into the contour.' It also directs the agent to check sheet_metal_capabilities first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Solid body to convert (not yet sheet metal) | |
| rule | No | Rule name to make the component's active rule first (sheet_metal_list_rules); a library rule is copied into the design. Default: keep the active rule (Fusion uses the library default for the first flange) | |
| base_face | Yes | Planar face of that body (inspect_query) | |
| rule_source | No | Where to look for `rule`: design, library or all (design first) | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: preview-API dependency with the exact failure code and a no-change guarantee, error mapping (INVALID_PARAMS for already-sheet-metal, foreign face, non-planar face), and rollback semantics on FUSION_API_ERROR including restoring the previous rule. It even notes the returned body ref may differ from the input, which is a non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then prerequisites, errors, and returns in a scannable order; each section earns its place. The return-shape line is slightly verbose for a tool with a single boolean outcome, but it is not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers every gap an agent needs: precondition, prerequisite capability check, failure modes with recovery semantics, and the shape of the return value. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter meanings (body, base_face, rule, rule_source) are already documented, and the description adds only the constraint that body thickness should match the rule thickness. Baseline 3 applies since the schema does the heavy lifting for all four parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Convert a solid plate body to sheet metal from a planar base face') and adds a scoping hint ('Use it for a plate built with feature_extrude') that separates it from sheet_metal_base_flange, which builds a flange from scratch. An agent can select it without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use (existing plate from feature_extrude, thickness matching the rule thickness) and an explicit prerequisite step ('check sheet_metal_capabilities first' when the preview API is missing). It stops short of explicitly naming the alternative tool to use when the body is not an extruded plate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| replace | No | Delete the component's existing flat pattern first | |
| stationary_face | Yes | Face of the sheet metal body that lies flat (e.g. the top) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses workspace side effects, INVALID_PARAMS error cases, atomic replacement behavior, and the fact that non-restorable patterns are refused and left unchanged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then gives error behavior and return shape in a compact structure. Every sentence adds operational value, and the return object is stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema and no annotations, the description provides the return fields, error cases, side effects, and replacement semantics. An agent has enough information to call the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning around replace=true, including atomicity and the not_restorable failure mode. It also clarifies the stationary_face requirement indirectly by describing replacement rollback from the remembered stationary face.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create the flat pattern of a sheet metal body component. It also scopes the operation to one flat pattern per component, which distinguishes creation from retrieval or export siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the key replacement workflow: an existing flat pattern requires replace=true, and non-restorable existing patterns must be deleted first with sheet_metal_delete_flat_pattern. It does not explicitly route agents to sheet_metal_get_flat_pattern or export alternatives, but the main when/when-not conditions are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_metal_create_ruleA
Create a design sheet metal rule by copying a base rule and setting values.
Units: a plain number is in units (default mm); a string is a Fusion expression and
may use Thickness ("Thickness * 1.5") - write units in expressions ("2 mm"), a rule in
inches reads bare numbers as inches. The rule is not used until sheet_metal_assign_rule
or the rule argument of a flange tool.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Gap at corners / rips | |
| name | Yes | New design rule name (unique) | |
| units | No | Unit of plain-number lengths (default mm) | mm |
| k_factor | No | K-factor 0..1 for the flat pattern | |
| base_rule | No | Rule to copy (default: the library default rule) | |
| thickness | No | Sheet thickness | |
| base_source | No | Where to look for base_rule | all |
| bend_radius | No | Bend radius; e.g. 'Thickness * 1' | |
| relief_depth | No | Bend relief depth | |
| relief_shape | No | straight, tear or round bend relief | |
| relief_width | No | Bend relief width | |
| relief_remnant | No | Bend relief remnant |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it documents unit interpretation, expression behavior, error cases (duplicate name, k_factor range, negative length, unknown base_rule), atomicity (no rule left on error), and return shape. It does not mention permissions or rate limits, but covers the main behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then presents units, errors, return value, and an example in a compact, scannable structure. Every section adds useful information for a 12-parameter creation tool, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no annotations, and no output schema, the description is complete enough for correct invocation: it explains units and expressions, error conditions and atomicity, the follow-up assignment step, and the return shape. The schema provides per-parameter details, and the description supplements them with behavioral context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all parameters. The description adds valuable cross-parameter semantics about plain numbers using units, strings as Fusion expressions, and how bare numbers are interpreted when a rule uses inches, plus an example that clarifies invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: create a design sheet metal rule by copying a base rule and setting values. It also distinguishes the new rule from assignment, noting that the rule is not used until sheet_metal_assign_rule or a flange tool's rule argument is used.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains that the tool creates a rule and that the rule must then be assigned via sheet_metal_assign_rule or a flange tool. It gives strong context but does not explicitly say when to create a new rule versus use an existing rule from sheet_metal_list_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_metal_delete_flat_patternB
Delete a component's flat pattern.
Errors: no flat pattern -> ENTITY_NOT_FOUND.
Returns {"component", "deleted": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| component | No | Component or occurrence ref; default: the root component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real value: it discloses the failure mode (ENTITY_NOT_FOUND when no flat pattern exists) and the return shape. It does not say whether the deletion is undoable, what happens to the timeline feature, or whether dependent unfolds are affected — significant gaps for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-sentence purpose followed by compact error and return blocks; no filler. The fragment format ('Errors: ... Returns {...}') is terse but readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, precondition failure, and return value, which is enough for a simple one-parameter tool. It remains thin for an unannotated destructive operation — reversibility, cascade effects, and permission requirements are all unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One optional parameter with 100% schema description coverage, so the schema already explains the component ref formats and the root-component default. The description adds nothing beyond 'a component's', which is the baseline for schema-covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: delete a component's flat pattern. An agent can distinguish it from sheet_metal_create_flat_pattern, sheet_metal_get_flat_pattern, and sheet_metal_unfold without opening the schema, though the description itself does not name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the ENTITY_NOT_FOUND error note tells the agent the precondition is an existing flat pattern. There is no explicit when-to-use, when-not-to-use, or pointer to sheet_metal_unfold/refold as the non-destructive alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_metal_edge_flangeA
Edge flange: bend up a wall from linear edges of a sheet metal body.
Exactly one of height and to_entity. Refs: edges from inspect_query on the latest
body (refs change after every flange - take them from the results again). Bend along
a sketch line is not available in the Fusion API: an edge flange is the way to add a
bend.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| flip | No | Flip the flange direction | |
| angle | No | Flange angle, degrees (default 90) | |
| edges | Yes | Linear outer edges of one sheet metal body | |
| units | No | Unit of plain-number lengths (default mm) | mm |
| width | No | Width, the same for all edges: {"type": "full"} (default), {"type": "symmetric", "width"}, {"type": "two_sided", "width1", "width2"}, {"type": "two_offsets", "offset1", "offset2"} | |
| height | No | Flange height (or give to_entity) | |
| to_entity | No | Face / plane / vertex the flange reaches (single edge only) | |
| to_offset | No | Offset from to_entity | |
| bend_radius | No | Bend radius override (default: the rule's) | |
| height_datum | No | Height measured from inner, outer (default), tangent | outer |
| bend_position | No | start_edge (default), inside, outside or tangent_to_side | start_edge |
| mitered_corners | No | Miter adjacent flanges |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does so: it discloses the preview-API dependency and the FUSION_API_ERROR reason=api_unavailable no-op path, states that failing flanges are rolled back, maps each invalid input to INVALID_PARAMS, and names the stale-ref hazard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then constraints, ref warnings, error mapping, return shape, and a concrete example, each in short discrete segments. Every sentence adds new information; nothing restates the title or schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no annotations and no output schema, the description covers invocation constraints, ref sourcing, rollback semantics, error reasons, and even the return value shape. An agent has enough to call it safely and to interpret failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning by stating the mutual exclusivity of height and to_entity, the single-edge restriction on to_entity, and the ref lifecycle (refs change after each flange). It does not elaborate on width variants, to_offset, bend_position, or height_datum beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('bend up a wall from linear edges of a sheet metal body') and scopes it against a non-tool alternative: sketch-line bends are unavailable, so an edge flange is the way to add a bend. An agent can tell this apart from generic feature tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit invocation prerequisites and exclusions: exactly one of height/to_entity, refs taken from inspect_query on the latest body and re-taken after every flange because refs change, a single edge for to_entity, and a capabilities check before use when the preview API may be missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute file path, .dxf or .step/.stp; the folder must exist | |
| units | No | Unit of plain-number lengths (default mm) | mm |
| format | No | dxf or step; default from the extension | |
| component | No | Component or occurrence ref; default: the root component | |
| overwrite | No | Replace an existing file (deleted before the export) | |
| bend_lines | No | DXF: export bend (center) lines | |
| file_units | No | DXF file units (default mm) | mm |
| extent_lines | No | DXF: export extent lines | |
| polyline_tolerance | No | DXF: polyline tolerance in `units` (default 0.1) | |
| splines_to_polylines | No | DXF: convert splines to polylines |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses the file-writing side effect, that an existing file is only replaced with overwrite=true, the preview-API limitation for STEP, the specific error code and its remedy, and the exact return shape. That is substantially more than the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and formats are front-loaded in the first sentence, followed by constraints, errors, return shape, and a concrete example. Tight overall, though the example line adds bulk for a required parameter already obvious from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, annotation-free export tool, the description covers prerequisites, format quirks, overwrite behavior, failure modes, and even inlines the response shape in place of the missing output schema. Only minor gaps remain, such as whether STEP also requires a pre-existing flat pattern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 10 parameters is already documented, including the DXF-only prefixes on bend_lines, extent_lines and splines_to_polylines. The description's mention of "bend / extent lines, file units, optional spline-to-polyline" largely restates that, so this is baseline territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Export a component's flat pattern") plus the two output formats. This is clearly distinct from siblings like export_cad, export_sketch_dxf and export_mesh, which the agent can rule out from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real guidance: STEP relies on the preview API and may return api_unavailable, and a missing flat pattern yields ENTITY_NOT_FOUND with an explicit redirect to sheet_metal_create_flat_pattern. It does not explicitly contrast DXF vs STEP selection criteria (other than the extension default), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| component | No | Component or occurrence ref; default: the root component |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so reasonably: "Read" communicates a non-mutating operation, and it discloses the exists=false behavior plus the returned fields. It does not cover prerequisites, permissions, or error cases, but the core read behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no wasted wording. The operation is front-loaded, followed by the return shape, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read tool with a fully documented parameter and no output schema, the description supplies the return fields and existence behavior. It is nearly complete, though it lacks routing guidance for missing flat patterns and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single optional component parameter is fully documented in the schema, including its default of the root component. The description adds little parameter-level meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, "Read a component's flat pattern," and names the returned data: size, thickness, and bends. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as sheet_metal_list_bends or sheet_metal_create_flat_pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies reading an existing flat pattern and notes the exists=false case, but gives no explicit when-to-use guidance or alternatives. It does not tell the agent when to call sheet_metal_create_flat_pattern, sheet_metal_list_bends, or other sheet-metal tools instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Sheet metal body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the key behavioral traits itself: the preview-API dependency, the exact failure signature (FUSION_API_ERROR reason=api_unavailable), and the guarantee that nothing is changed on failure. Missing only whether an active document/design is required; otherwise this is strong for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the failure caveat, then the return shape — a sensible ordering with no filler. The return-shape sentence is slightly dense but earns its place because there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the gaps left by the missing output schema by spelling out the return object, and covers the missing annotations by naming the failure mode and its non-destructive nature. Nothing an agent needs to invoke this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the single 'body' parameter is already documented in the schema. The description restates that it operates on a sheet metal body but adds no format, ID-vs-name, or sourcing guidance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the bends of a sheet metal body') and immediately enumerates what is returned (inner/outer bend face refs and radius in mm), which distinguishes it from the sibling unfold/refold tools. An agent can tell what it gets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes forward: 'use the faces for sheet_metal_unfold' names the downstream sibling and the reason to call this first. Also says to check sheet_metal_capabilities when the preview API is missing. Lacks an explicit 'do not use when...' exclusion, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | design, library or all (default; design first) | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the result envelope ('rules' array plus 'count') and explains that 'is_default' appears for library rules while 'is_used' appears for design rules — a genuine behavioral distinction an agent could not guess. It stops short of stating read-only safety or any permission/rate-limit context, but the output semantics are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then the field inventory. The field list is verbose but every entry maps to actual returned data, and no output schema exists to absorb it, so the length is largely justified; only the trailing nested type notation is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must define the return shape — and it does, down to nested 'thickness: {mm, expression}' and the count field. Nothing critical for invoking or interpreting this single-parameter list call is missing, though it omits what an empty rules list means (no rule defined vs. none assigned).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single enum parameter is already documented, so baseline is 3; the description earns an extra point by explaining the consequence of the source choice — library rules report 'is_default' while design rules report 'is_used'. That is meaning beyond the enum values themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List sheet metal rules') and immediately enumerates the domain attributes returned (thickness, bend radius, gap, relief, K-factor). This makes it trivially distinguishable from siblings like sheet_metal_create_rule or sheet_metal_assign_rule, which the agent can rule out without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's read-only listing nature implies its use (inspect available rules before assigning one), but the description never says when to call it, when not to, or which sibling (create_rule / assign_rule) follows it. Usage is inferable from the name and field list rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| unfold | Yes | UnfoldFeature ref from sheet_metal_unfold |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it discloses the preview-API dependency, names the failure mode (FUSION_API_ERROR reason=api_unavailable) and guarantees 'nothing changed' on failure. It also documents the INVALID_PARAMS condition for a non-UnfoldFeature ref. What it does not disclose is what state changes on success beyond the returned body lists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, followed by short labeled blocks for the API caveat, error conditions, and return shape. No filler, though the return-key dump is a dense single line rather than a structured list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned keys (feature, health, created/modified/removed_bodies, rule). Combined with the documented failure modes and the capability prerequisite, an agent has nearly everything needed; the meaning of 'health' and 'rule' values is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as 'UnfoldFeature ref from sheet_metal_unfold', so the baseline would be 3. The description adds validation semantics the schema lacks — that a ref which is not an UnfoldFeature yields INVALID_PARAMS — which earns an increment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Refold the bends of an unfold feature'), which precisely defines the inverse of sheet_metal_unfold and lets an agent distinguish it from the unfold/contour_flange/edge_flange siblings. It stops short of naming the sibling it complements, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete prerequisite: verify with sheet_metal_capabilities first because the tool depends on the preview Fusion API. That is real routing guidance, but there is no explicit statement of when to prefer this over re-running sheet_metal_unfold or redoing the flat pattern, so usage context is only implied beyond the capability check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| bend_faces | No | Bend faces to unfold (default: all bends) | |
| stationary_face | Yes | Planar face that stays in place |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the preview-API dependency, the exact failure mode (FUSION_API_ERROR reason=api_unavailable) and that nothing changes on failure, and the shape of the returned object including created/modified/removed body lists and an UnfoldFeature reference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs: the operation and its inverse first, then the failure mode, then the return shape. Every sentence adds information an agent needs, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description supplies the return shape itself, and it documents the prerequisite/failure path for a preview API. Nothing needed to call this two-parameter mutation correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by pointing bend_faces at sheet_metal_list_bends as their source and framing stationary_face as the face that 'stays in place' rather than merely 'planar'. It does not explain the entity-ref format further, but the schema already does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unfold) and resource (all bends or named bend faces of a sheet metal body) plus the stationary-face anchor. It explicitly distinguishes itself from the sibling that enumerates bends (sheet_metal_list_bends) and the one that reverses it (sheet_metal_refold).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case (to add cuts across a bend), names the source of optional bend faces, names the reverse operation, and adds a prerequisite: check sheet_metal_capabilities first when the preview API is missing. When/when-not/alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_constrainA
Add geometric constraints in order, all or nothing.
Entities are refs from earlier results (sketch_draw refs, sketch_get) or origin.
Types: 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 — sets isFixed, no constraint ref).
Wrong entity types fail with INVALID_PARAMS (details.expected); an over-constrained
sketch fails with FUSION_API_ERROR and details.index; nothing is kept on failure.
Returns {"constraints": [{ref, type}], "status", "profiles"}.
Example: sketch_constrain(sketch=, constraints=[{"type": "horizontal", "points": [, ]}, {"type": "equal", "curve1": , "curve2": }]).
| Name | Required | Description | Default |
|---|---|---|---|
| sketch | Yes | Sketch ref (from sketch_create) | |
| constraints | Yes | ||
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses atomicity ('nothing is kept on failure'), specific failure modes and details fields, and the shape of the return value. This is unusually complete behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key action and atomicity guarantee are front-loaded, followed by a dense but necessary type reference, failure behavior, return shape, and a single illustrative example. Every sentence contributes useful information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that can accept up to 500 heterogeneous constraints with no output schema, the description covers entity sourcing, valid type/parameter pairings, error behavior, atomicity, and return structure. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates well by mapping each constraint type to its required parameter shape (e.g., coincident point/entity, tangent curve1/curve2, fix entity/fixed). It also gives a concrete example and notes the fix special case, adding real meaning beyond the complex discriminated union.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a precise verb and resource: 'Add geometric constraints in order, all or nothing.' It also distinguishes the operation from neighboring sketch tools by focusing solely on constraints rather than drawing or dimensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains where entity references come from ('sketch_draw refs, sketch_get') and the all-or-nothing execution model, which gives clear context. It does not explicitly contrast with alternatives such as sketch_dimension, so it stops short of a full when/when-not guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: [x, y] on the sketch plane. Fusion picks
the sketch axes; the result transform = {origin, x_axis, y_axis, normal} (model mm
and unit vectors) maps them: model = origin + xx_axis + yy_axis.
Pitfall: on origin:XZ the sketch Y axis is model -Z (so a point drawn at y = 10 is
at model z = -10) — always read transform, or give points as
{"model": [x, y, z]} to sketch_draw. On origin:XY sketch x/y = model x/y.
A planar face gives a clean sketch unless project_edges=true. A non-planar face
fails with INVALID_PARAMS (details.reason = "face_not_planar").
Returns {"sketch": {ref}, "name", "plane", "component", "transform"}.
Example: sketch_create(plane="origin:XY", name="Base") then sketch_draw(sketch=).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Sketch name | |
| plane | Yes | origin:XY | origin:XZ | origin:YZ, a construction plane ref or a planar face ref | |
| component | No | Component ref; default: root | |
| project_edges | No | On a face: project its edges into the sketch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the sketch-space coordinate model, the returned transform, a concrete axis pitfall on origin:XZ, a named failure mode (details.reason = "face_not_planar"), and the effect of project_edges. It omits preconditions and side effects such as whether an active document is required, whether the sketch becomes the active edit target, or whether a timeline feature is created.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then groups coordinate semantics, pitfall, failure mode, return shape, and a usage example with no filler. The XZ-axis warning is unusually verbose for a description but is precisely the detail that prevents wrong-geometry calls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description's explicit return payload ({"sketch": {ref}, "name", "plane", "component", "transform"}) is necessary and present, and error behavior is documented. What is missing is the surrounding workflow context (active document assumption, interaction with sketch_list/sketch_get after creation).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 is the baseline, but the description adds real meaning beyond the schema: it explains plane ref syntax by example, clarifies that project_edges only applies to face-based sketches and changes the result ('clean sketch unless project_edges=true'), and shows name usage. Component is left unaddressed in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a 2D sketch') plus the exact set of valid placements (origin plane, construction plane, planar face). This clearly distinguishes it from siblings such as sketch_draw (which adds geometry inside a sketch) or construction_plane.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example line 'sketch_create(...) then sketch_draw(sketch=<ref>)' establishes the correct ordering relative to the sibling sketch tool, and the note that a non-planar face fails with INVALID_PARAMS tells the agent which inputs to avoid. It stops short of explicit 'use this instead of X when Y' routing, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 cascaded.
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 details.deleted; re-read the sketch with
sketch_get before continuing.
Returns {"deleted": [refs], "cascaded": [refs], "status", "profiles"}.
Example: sketch_delete(sketch=, entities=[, ]).
| Name | Required | Description | Default |
|---|---|---|---|
| sketch | Yes | Sketch ref (from sketch_create) | |
| entities | Yes | Curves, points, constraints, dimensions, texts | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses non-atomicity, irreversible deletion, the exact failure codes for stale/foreign refs, cascaded deletions, and the FUSION_API_ERROR partial-delete case with details.deleted. This is exactly the kind of context an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then proceeds through preconditions, ordering, failure behavior, and return shape. Despite its length, every sentence earns its place by covering behavior that annotations and schema do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive sketch-entity tool with no annotations and no output schema, the description is complete: it explains scope, preconditions, failure modes, non-atomicity, recovery guidance, and the return object. An agent has enough information to call it correctly and handle partial failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents sketch, entities, and return_profiles. The description adds an example and deletion ordering for entity types, but it does not add substantial parameter semantics beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete sketch entities, explicitly excluding the sketch itself. It is clearly distinguishable from siblings such as sketch_trim and sketch_get by naming the exact operation and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: refs are checked first, deletion proceeds in a defined order, and after a partial failure the agent should re-read with sketch_get. It does not explicitly compare when to choose this over sketch_trim or other sketch-editing siblings, so it falls short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_dimensionA
Add driving or driven dimensions in order, all or nothing — this is how sizes become exact and parametric.
value: a number is mm (degrees for angular) -> "25 mm"; a string is a Fusion
expression kept as is ("plate_w * 0.6", "wall + 2 mm"); invalid expressions fail with
INVALID_PARAMS before anything is created. parameter_name renames the dimension's
parameter so later dimensions (in this call too) and parameter_update can use it.
driven=true makes a reference dimension that only measures (no value).
Types: distance (line, or point1 + point2; orientation aligned|horizontal|vertical) |
offset (line, entity: parallel line or point) | radial / diameter (curve) | angular
(line1, line2; text_at picks the measured quadrant) | ellipse_major / ellipse_minor
(ellipse).
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"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of numeric `text_at` | mm |
| sketch | Yes | Sketch ref (from sketch_create) | |
| dimensions | Yes | ||
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses atomicity ('all or nothing', 'invalid expressions fail with INVALID_PARAMS before anything is created'), ordering ('in order'), and inter-parameter side effects (`parameter_name` is reusable by later dimensions in the same call and by `parameter_update`). It omits permission/context requirements and what state the sketch is left in on non-expression failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with purpose and the atomicity contract, then moves through value/parameter_name/driven semantics, then the type table, then the return shape, then a worked example. Some lines restate schema descriptions verbatim (e.g., the `value` mm/deg wording), which is mild redundancy but the density is otherwise justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by spelling out the returned `dimensions` fields, `status`, and `profiles`. Combined with the atomicity guarantee, the value/expression rules, and a concrete multi-dimension example, an agent has enough to invoke this correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so much of the parameter meaning is already structured, but the description adds real value: it maps each `type` to its required entity arguments (distance line vs point1+point2, offset entity, angular line1/line2, ellipse), explains that degrees apply to angular, and clarifies what `text_at` does for angular ('picks the measured quadrant').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Add driving or driven dimensions') plus a distinguishing behavioral trait ('all or nothing'), and frames the outcome ('sizes become exact and parametric'). It never mentions the close sibling `sketch_dimension_set`, so an agent still has to infer which of the two dimension tools to reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear situational context — driving vs driven, and that `driven=true` creates a measurement-only reference with no `value`. What's missing is routing guidance against `sketch_dimension_set` and any preconditions (e.g., sketch must exist / be active), so there are no explicit exclusions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
value: number = mm/degrees, string = expression. Changing a dimension re-solves the
sketch; profile refs taken before stay usable for moderate changes (re-read with
sketch_profiles(contains=...) if a feature reports ENTITY_NOT_FOUND).
Returns {"dimensions": [...as in sketch_dimension], "status", "profiles"}.
Example: sketch_dimension_set(sketch=, updates=[{"dimension": , "value": "plate_w + 10"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| sketch | Yes | Sketch ref (from sketch_create) | |
| updates | Yes | ||
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses atomicity ('all or nothing', earlier updates rolled back), the re-solve side effect of changing a dimension, and the staleness contract for profile refs. This is the behavioral context an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then atomicity, then value semantics, then return shape, then an example. Every block earns its place; the line break formatting is slightly dense but no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with neither annotations nor an output schema, so the description correctly spells out the return shape ({dimensions, status, profiles}) and the rollback guarantee. Minor gaps remain: no guidance on combining driven with value, or on the updates list limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by explaining value typing (number = mm/degrees, string = expression) and by naming the driven state and parameter_name fields in the opening line. It omits return_profiles, which the schema documents, and says nothing about the 500-item cap on updates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change existing dimensions') plus the fields that can change (value/expression, driven state, parameter name), which implicitly separates it from the sibling sketch_dimension (creation). It never names that sibling explicitly, so an agent must infer the create-vs-modify split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent this is for existing dimensions only, and gives operational guidance for the edge case where a feature reports ENTITY_NOT_FOUND (re-read with sketch_profiles(contains=...)). No explicit 'use X instead' routing to a sibling for creation, which is the only real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_drawA
Draw many sketch items, then constraints, then dimensions — one call, all or
nothing (on any error the sketch is restored and details = {phase:
geometry|constraints|dimensions, index, id}).
Coordinates: [x, y] sketch mm (numbers only — expressions like "w/2" are refused:
draw approximately and fix exact sizes with dimensions), {"model": [x, y, z]} model
mm (projected on the sketch plane; mind sketch_create's XZ pitfall), or a ref of an
existing point / curve end. A point given by ref is shared (no coincident needed).
Local ids: give an item id (letters, digits, _; not origin) and later items,
constraints and dimensions of THIS call can use id or id.<sub>; origin is the
sketch origin point. Local ids live one call only: the result refs maps every local
path to a real ref — use those refs in later calls.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Geometry, drawn in order | |
| units | No | Unit of numeric coordinates and sizes | mm |
| sketch | Yes | Sketch ref (from sketch_create) | |
| dimensions | No | Applied after constraints, in order | |
| constraints | No | Applied after all items, in order | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses atomic rollback behavior on any error, the exact error payload shape ({phase, index, id}), expression refusal, point-sharing semantics for by-ref points, and the one-call lifetime of local ids. It also documents the return payload keys (refs, status, profiles, warnings).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and atomicity, then organized into coordinates, local ids, the item table, constraints, dimensions, returns, and a worked example. Despite its length, every line carries load-bearing information for a highly polymorphic schema, and nothing is repeated verbatim from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter polymorphic tool with no annotations and no output schema, the description supplies everything needed: coordinate conventions, id/ref lifecycle across calls, the full kind catalogue, and an end-to-end example showing a fully constrained plate with a hole. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds real value beyond the schema with a compact kind/mode/field/sub-id table, mode defaults, and the `origin`/`id.<sub>` ref grammar. It also clarifies dimension expression usage and parameter_name cross-referencing within a call, though unit behaviour of the `units` parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound action: draw many sketch items, then constraints, then dimensions, in a single atomic call. The atomic scope ('all or nothing') and the pointer to sketch_create's XZ pitfall make the tool's identity distinct from geometry-editing siblings like sketch_constrain or sketch_offset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes when this tool is appropriate (batch drawing of a whole sketch in one atomic operation) and gives concrete operational rules: draw approximately because expressions in item coordinates are refused, then fix sizes via `dimensions`. It does not explicitly name when a sibling (e.g. sketch_constrain on an existing sketch) should be preferred instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_extendA
Extend the end nearest point to the next intersecting curve. ONE curve per call
(the curve may be replaced, so use the refs in the result). point
farther than 5 mm from the curve fails with INVALID_PARAMS.
Returns {"created": [refs], "deleted": [the original ref, if replaced], "status", "profiles"}.
Example: sketch_extend(sketch=, curve=, point=[39, 0]).
| Name | Required | Description | Default |
|---|---|---|---|
| curve | Yes | Curve to extend | |
| point | Yes | Near the end to extend (≤ 5 mm) | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses that the curve may be replaced, that only one curve is affected per call, that callers should reuse refs from the result, and that points farther than 5 mm fail with INVALID_PARAMS. It also describes the return keys. It does not mention permissions, undoability, or behavior when no intersecting curve exists, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then adds key constraints, return structure, and a compact example. Every sentence contributes useful information, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema and no annotations, the description supplies the return structure, mutation/replacement behavior, failure condition, and an example call. It is largely complete for correct invocation, but it could mention behavior when no intersect is found or how it relates to adjacent sketch-editing tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all parameters; the baseline would be 3. The description adds operational meaning beyond the schema by clarifying that `point` must be within 5 mm or the tool fails with INVALID_PARAMS, that only one curve is extended per call, and that the returned refs should be used because the curve may be replaced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: extend the end of a sketch curve nearest `point` to the next intersecting curve. It also scopes the operation to one curve per call. However, it does not explicitly distinguish this from related siblings such as `sketch_trim` or `surface_extend`, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the description: extend a sketch curve's end to the next intersection, with a 5 mm proximity tolerance. It gives a failure condition for points farther than 5 mm, but it does not say when to use this versus alternatives like `sketch_trim` or `surface_extend`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_filletA
Round ONE corner between two curves with a tangent arc of radius. One corner per
call: Fusion trims both curves, so their old refs may become stale — take the new
ones from the result or sketch_get before the next fillet. Pick points default to the
curves' shared end (or nearest ends).
Not fully atomic: Fusion cannot undo the fillet itself. If the radial dimension
(dimension=True) cannot be added, only the dimension is rolled back — the arc stays
and the call succeeds with warning fillet_dimension_failed. Dimension the arc
yourself with sketch_dimension, or delete it with sketch_delete.
Returns {"arc": {ref}, "dimension"?: {...}, "status", "profiles"}.
Example: sketch_fillet(sketch=, curve1=, curve2=, radius="r_corner").
| Name | Required | Description | Default |
|---|---|---|---|
| curve1 | Yes | ||
| curve2 | Yes | ||
| point1 | No | Pick point on curve1; default: shared end | |
| point2 | No | Pick point on curve2; default: shared end | |
| radius | Yes | Fillet radius: mm or expression | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| dimension | No | Add a radial dimension with the radius expression | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries real weight: it discloses that Fusion trims both curves (invalidating refs), that the operation is not fully atomic, the precise rollback semantics when dimensioning fails, and the warning code `fillet_dimension_failed`. That is unusually strong, though it does not cover permissions, failure modes for bad radius values, or what `status` and `profiles` in the result mean.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The anatomy statement is front-loaded, followed by the ref-staleness consequence, the atomicity caveat, the return shape, and one example line. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no output schema and no annotations, the description supplies the return shape, side effects, failure semantics, and recovery path. An agent has enough to call it correctly and handle the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is already offered by the schema, and the description reinforces the pick-point default semantics and implies the radius accepts an expression. Most of the added value is duplicative of the schema's own point1/point2/radius descriptions rather than new information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Round ONE corner between two curves with a tangent arc of `radius`" gives a specific verb, resource, and geometric operation, and the explicit "one corner per call" scope separates it from a general fillet. An agent can distinguish it from feature_fillet and sketch_trim on the name plus this sentence alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the per-call limit and the follow-up workflow: refresh curve refs from the result or sketch_get before the next fillet. It also names concrete alternatives and the condition for each — dimension the arc with sketch_dimension or remove it with sketch_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_getA
Full state of a sketch, coordinates in sketch-space mm.
Sections: points [{ref, xy, fixed, reference, fully_constrained}], curves
[{ref, type: line|arc|circle|ellipse|elliptical_arc|fitted_spline|fixed_spline|conic,
construction, fixed, reference (projected), fully_constrained, length_mm, start, end,
geometry (line {start, end}; circle {center, radius}; arc {center, radius, start, end,
start_angle, sweep}; ...)}], constraints [{ref, type, entities}], dimensions
[{ref, type, entities, value (mm|deg), unit, expression, parameter, driving}],
texts, profiles (as sketch_profiles). Each section is an object
{items: [≤ limit entries as above], total, truncated} — truncated: true when cut.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per section | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| include | No | Sections; default: all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses coordinate space, per-section truncation behavior, limit-capped sections, and status fields. It stops short of explicitly stating read-only behavior or invalid-ref handling, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded, with sections and return shape clearly separated. It is long, but the exhaustive field lists are justified because there is no output schema; it could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully specifies the return object, section envelopes, truncation, transform cross-reference, and status. Together with the complete input schema, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by explaining that include selects requested sections and that limit produces truncated sections with total counts. It does not elaborate much beyond the schema, but the truncation semantics are useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with 'Full state of a sketch' and names the resource, coordinate space, and every returned section. The mention of profiles as sketch_profiles and the dimension-ref example make its scope distinguishable from listing/profile tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete example (finding a dimension ref for sketch_dimension_set) and implicit guidance via the include parameter. It does not explicitly state when to choose it over sketch_list or sketch_profiles, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| component | No | Component ref; default: all components |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the disclosure burden, and it delivers the most important piece: the exact return envelope with field names (sketch ref, name, component, plane, fully_constrained, curve_count, profile_count, visible). It does not state read-only/non-mutating behavior or ordering, but the field list is substantial disclosure beyond what structured data provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines: purpose first, return shape second, workflow example last. No filler, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter and no output schema, the description covers what the tool does, what it returns, and where to go next. Minor gaps remain (ordering of results, whether hidden or consumed sketches are included) but nothing blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'component' parameter is already documented as 'Component ref; default: all components.' The description restates the same scoping idea without adding format or edge-case detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus scope: 'List sketches of the design (or of one component).' The trailing example distinguishes it from siblings by naming sketch_get and sketch_profiles as the follow-up tools, so an agent knows this is the enumeration step, not a detail-fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the example chain ('pick the sketch ref, then sketch_get / sketch_profiles'), which signals the intended workflow. However there is no explicit guidance on when to pass a component ref versus listing everything, and no mention of when a different discovery tool (e.g. inspect_tree) would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=).
| Name | Required | Description | Default |
|---|---|---|---|
| axis | Yes | Mirror line (often a construction line) | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| entities | Yes | Points, lines, arcs, circles, splines | |
| constrain | No | Add symmetry constraints to keep the copies mirrored | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does meaningful work: it discloses atomicity ("all or nothing"), resulting topology behavior (shared points stay shared, axis points reused), and the failure mode with a named error code. It leaves gaps around what happens to the source entities and whether the operation requires an active sketch edit session, but the mutation semantics are far better covered than typical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its atomicity clause, followed by behavior, return shape, and a compact example — every sentence earns its place. It is slightly denser than strictly necessary (the example largely restates the schema) but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the definition covers the return shape inline (mapping, constraints, status, profiles), the error contract, and atomicity — the essentials an agent needs before calling. Remaining gaps are the source-entity outcome and whether an edit session is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including the constrain and return_profiles defaults. The description adds value only through the worked example mapping sketch/entities/axis to real argument shapes, and says nothing about the two optional flags.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb+resource pair ("Mirror entities about a line") scoped to sketch entities, which an agent can distinguish from feature-level siblings like pattern_mirror or feature_mirror-ish tools by the entities/axis arguments. It does not explicitly name the nearest alternative (sketch_pattern), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real operating context: the operation is all-or-nothing, and unsupported curve types fail with INVALID_PARAMS, which tells the agent what inputs are valid. However, there is no explicit when-to-use guidance versus sketch_pattern or pattern_mirror, and no stated prerequisites (e.g., active document, edit context).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_offsetA
Offset curves (with chain=true the whole connected loop) by distance toward
side_point. All or nothing.
When the Fusion version supports it the offset is parametric (parametric: true, a
dimension carries the distance expression, e.g. "wall"); otherwise plain copies are
made (parametric: false).
Returns {"created": [refs], "parametric", "dimension"?, "status", "profiles"}.
Example: inner wall of a closed outline: sketch_offset(sketch=, curves=[], distance="wall", side_point=[0, 0]).
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Extend each curve to its connected chain | |
| curves | Yes | ||
| sketch | Yes | Sketch ref (from sketch_create) | |
| distance | Yes | Offset distance: mm or expression | |
| side_point | Yes | A point on the side to offset to | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: "All or nothing" discloses atomicity on failure, and the parametric vs. plain-copy branch depending on the Fusion version is a non-obvious behavioral trait that would otherwise surprise an agent (it creates an extra `dimension` entity in one mode). It also inlines the return shape. Missing: what happens on self-intersecting offsets and whether source curves are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation and its main semantic switch (`chain`) are front-loaded in the first sentence, followed by the parametric caveat, the return shape, and a single example. No sentence is padding — each adds either semantics, a behavioral branch, or a concrete call shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essentials for a six-parameter mutation: what it does, the chain scope, the parametric branch, and the response fields, which compensates for the absent output schema. It stops short of error behavior (degenerate offsets, invalid curve refs) — the main remaining gap for a creation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 83%, so the baseline is 3; the description adds meaning by explaining what `chain` actually does (extends to the connected loop) and by showing that `distance` accepts a named expression ("wall") that is carried into a dimension. The example clarifies the `side_point` side-selection semantics with concrete values, which the schema only gestures at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — offset sketch curves by a distance toward a side point — plus the scoping modifier that `chain=true` extends to the whole connected loop. The mention of "curves" and the required `sketch` ref distinguishes it from the body/surface offset siblings (surface_offset, feature_offset_faces) without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete usage scenario ("inner wall of a closed outline") with a worked call, which tells the agent the intended shape of the invocation. It does not explicitly exclude cases (e.g. when to prefer sketch_transform or feature_offset_faces over this), so the routing guidance is implicit rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_patternA
Pattern sketch entities, all or nothing. Counts include the original.
rectangular: count_x (≥1), spacing_x (Length), count_y=1, spacing_y=0, angle=0 (degrees from sketch X) or direction (a line ref).
circular: center (point), count (≥2), angle=360 (total, degrees). Spacing/angle: number = mm/deg, string = expression. When the Fusion version has the pattern constraint the result is parametric (
parametric: true,constraint); otherwise plain copies (parametric: false).
Returns {"instances": [[refs]...], "parametric", "constraint"?, "status", "profiles"}.
Example: 6 holes on a circle: sketch_pattern(sketch=, entities=[], kind="circular", center="origin", count=6).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Pattern type | |
| angle | No | rectangular: X direction (default 0); circular: total (360) | |
| count | No | circular: instances | |
| center | No | circular: centre point | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| count_x | No | rectangular: instances along X | |
| count_y | No | rectangular: default 1 | |
| entities | Yes | ||
| direction | No | rectangular: line ref for X direction | |
| spacing_x | No | rectangular: X step | |
| spacing_y | No | rectangular: default 0 | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses atomicity ('all or nothing'), that counts include the original entity, and that the outcome differs by Fusion version (parametric with a constraint vs plain copies). It stops short of failure semantics or whether source entities are modified in place.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One-line summary up front, then compact per-kind bullets, a type note, the return shape, and a single concrete example. Nothing is padding and the example earns its place by showing the circular case end-to-end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-output-schema tool, the description covers both modes, the value types, the parametric-vs-copy behavior, and returns {'instances', 'parametric', 'constraint'?, 'status', 'profiles'} plus the return_profiles speed tradeoff. Remaining gaps (error behavior, whether entities must lie in the target sketch) are modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 92%, so the baseline is 3, but the description adds genuinely non-redundant meaning: 'counts include the original' clarifies count_x/count, spacing/angle accepts number = mm/deg vs string = expression, and angle for rectangular is measured from sketch X. That resolves ambiguity the schema alone leaves open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pattern sketch entities') and adds the key scope constraint 'all or nothing'. It does not explicitly contrast itself with the feature-level siblings pattern_rectangular / pattern_circular, so the sketch-vs-feature distinction rests on the tool name and the word 'sketch entities' rather than an explicit statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lays out what each `kind` requires (rectangular: count_x ≥1, spacing_x, count_y=1, spacing_y=0, angle/direction; circular: center, count ≥2, angle=360), which tells the agent how to configure each mode. It never says when to pick this tool over pattern_rectangular or pattern_circular, nor any preconditions such as the sketch being active/editable, so usage context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: profile:<sketch token>@x,y. Pass this string as the profile of a feature
(or {"sketch": ref, "point": [x, y]}). It survives moderate dimension changes; if the
region moved away from the point the feature fails with ENTITY_NOT_FOUND listing the
current profiles — call sketch_profiles(contains=[x, y]) again and use the new ref.
name (P1, P2...) is only the order in this answer, never an address.
Returns {"profiles": [...]}.
Example: plate with 4 holes -> 5 profiles; the plate is the one with 4 inner_loops;
sketch_profiles(sketch=, contains=[0, 0]) -> just the region around [0, 0].
| Name | Required | Description | Default |
|---|---|---|---|
| sketch | Yes | Sketch ref (from sketch_create) | |
| contains | No | Only the profile containing this [x, y] sketch mm |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description carries the full burden well: it discloses that profiles have no persistent id, how the ref is synthesized, how fragile it is across dimension changes, the exact error behavior (ENTITY_NOT_FOUND listing current profiles), and the return envelope {"profiles": [...]}.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line definition and the ref contract before the field dump; every clause is functional. The inline JSON field listing is dense and partially restates what the return shape would show, costing a bit of tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description fully compensates by describing every returned field (ref, point, area_mm2, centroid, bbox, outer_loop, inner_loops) and the units. The plate-with-4-holes example resolves the otherwise ambiguous 'which profile is the outer one' question.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real value beyond it by showing a worked call with contains=[0, 0] and explaining its filtering effect, plus the alternative {sketch: ref, point: [x, y]} addressing form.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Closed regions (profiles) of a sketch') and immediately frames it against its consumers ('the input of extrude/revolve/sweep/loft'). An agent can distinguish this from sketch_get/sketch_list, which would describe geometry rather than closed regions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: pass the returned ref string (or {sketch, point}) as the profile of a feature, and use contains=[x, y] to isolate a single region. It also documents the recovery path when a stale ref fails with ENTITY_NOT_FOUND. It doesn't explicitly contrast with sibling inspection tools like sketch_get, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_projectA
Bring model geometry into the sketch as reference curves (to dimension or constrain against, or to close profiles). All or nothing.
Modes: project (projection onto the sketch plane; a body projects all its edges),
include (linked copy of curves), intersect (intersection of the entities with the
sketch plane), cut_edges (section of bodies by the sketch plane).
Returns {"created": {: [refs]}, "status", "profiles"}.
Example: sketch_project(sketch=, entities=[]) -> the face outline as reference curves.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | project | include (linked copy) | intersect (with the sketch plane) | cut_edges (body section) | project |
| sketch | Yes | Sketch ref (from sketch_create) | |
| entities | Yes | Edges, faces, vertices, bodies, other sketches' curves, origin:* | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses atomicity ('All or nothing'), that include creates a linked copy (dependency behavior), that a body projects all its edges, and that return_profiles=false is faster. It omits failure behavior and whether created curves are construction geometry, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, modes and return shape follow in scannable blocks, and the example is one line. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although no output schema exists, the description supplies the return shape ({created, status, profiles}) plus the cost tradeoff of return_profiles. For a 4-parameter geometry tool this covers everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics beyond the schema: it explains projection behavior per entity type and the worked example shows a face ref yielding a face outline. The mode explanations largely mirror the enum description, so it is additive rather than fully compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('bring model geometry into the sketch as reference curves') and immediately enumerates the four modes with their distinct semantics. An agent can distinguish this from sketch_draw / sketch_offset / sketch_trim siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives intent-level guidance ('to dimension or constrain against, or to close profiles') that tells the agent why to call this rather than drawing curves manually, and the mode list functions as a when-to-use-each breakdown. It stops short of naming explicit alternatives or exclusions, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| curves | Yes | ||
| sketch | Yes | Sketch ref (from sketch_create) | |
| construction | No | true = construction, false = normal | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work: it discloses that this is a mutating toggle, that construction curves are excluded from profiles, that the operation applies to the whole curve set ('all or nothing'), and that the result includes curves, status and profiles. Remaining gaps are the exact semantics of the all-or-nothing failure mode and whether reversal is always possible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: operation first, return shape next, example last. The standalone 'All or nothing.' fragment is cryptic in isolation and the returns line is partly restated by the example, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly names the returned fields. For a four-parameter sketch toggle this covers what an agent needs to call it; only the 'status' values and the failure behavior under the all-or-nothing rule are left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with sketch, construction and return_profiles already documented in the schema. The description adds value on the undocumented 'curves' parameter by showing a line reference in the example and tying it to the all-or-nothing constraint, plus it explains the profile-merge consequence that the schema never mentions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: turn curves into construction geometry or back, with the clarifying parenthetical that construction geometry is not part of profiles. This is specific enough to distinguish it from adjacent sketch tools, though no sibling is named as a contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (making geometry non-profile-driving), but there is no explicit when-to-use vs when-not or any mention of alternatives such as sketch_delete or redrawing the curve. The 'All or nothing' line hints at a batch constraint without spelling it out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_transformA
Move/rotate sketch entities (or copies of them): rotate by rotate degrees about
about, then translate by translate mm. All or nothing.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| copy | No | Transform a copy, keep the originals | |
| about | No | Rotation centre; default [0, 0] | |
| rotate | No | Degrees, positive = counter-clockwise | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| entities | Yes | ||
| translate | No | [dx, dy] sketch mm, applied after rotation; default [0, 0] | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it declares atomicity ('All or nothing'), warns that the constraint solver may pull entities back so results must be verified, and discloses the return payload shape including the entities-vs-created branch on `copy`. It does not spell out failure/rollback semantics or ref format details, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, the solver caveat and return shape follow, and the example closes it out. Every sentence carries information an agent needs; nothing is padding despite the multi-line layout.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, the description supplies the missing return contract and the key behavioral risk (solver-driven geometry changes). Minor gaps remain around entity-ref syntax and the 500-item limit, which the schema covers only implicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, but the description adds genuine semantics beyond it: the rotate-then-translate ordering as a pipeline, the meaning of `copy=true` (originals kept, new entities under `created`), and a concrete call showing `translate=[30,0]` semantics. That goes past the schema's per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific compound verb plus resource ('Move/rotate sketch entities (or copies of them)') and immediately pins the exact transform order (rotate about `about`, then translate). This distinguishes it from siblings like sketch_mirror, sketch_pattern, and sketch_offset, which also duplicate/move geometry, without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the worked example (copy a circle 30 mm right) and the `copy` flag, giving an agent a concrete pattern to imitate. However there is no explicit 'use this instead of sketch_pattern/sketch_mirror' routing, and no stated prerequisites beyond that `sketch` comes from sketch_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sketch_trimA
Trim at the segment nearest point (cut back to the neighbouring intersections).
ONE curve per call: trimming replaces the curve and Fusion cannot undo it inside a
batch, so the old ref becomes stale — use the refs in the result for the next trim.
point farther than 5 mm from the curve fails with INVALID_PARAMS.
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]).
| Name | Required | Description | Default |
|---|---|---|---|
| curve | Yes | Curve to trim | |
| point | Yes | Near the segment to remove (≤ 5 mm) | |
| sketch | Yes | Sketch ref (from sketch_create) | |
| return_profiles | No | Add the current profiles to the result (false = faster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that trimming replaces the curve, that Fusion cannot undo it inside a batch, that refs go stale, and that a >5 mm offset fails with INVALID_PARAMS. It also spells out the return payload (created/deleted/status/profiles), which is a meaningful addition given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short chunks, front-loaded with the action and semantics, then the per-call constraint, then error behavior, then the return shape, then a one-line example. Nothing is redundant; the example is cheap and directly useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, non-undoable sketch operation with no annotations and no output schema, the description covers what is destroyed (the original curve), how refs behave across calls, the error mode, and the return fields — everything needed to call it correctly and to chain a batch of trims.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains sketch, curve, point (all accepted forms) and return_profiles, including the ≤5 mm tolerance. The description reinforces the 5 mm rule and the single-curve constraint but adds no new syntactic or format detail beyond the schema — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (trim) and resource (sketch curve segment), and clarifies the exact semantics: the cut is made at the segment nearest `point` and goes back to the neighbouring intersections. That distinguishes it well from a plain delete, but it never contrasts itself with near-siblings like sketch_delete, sketch_extend, or surface_trim, which share the operation space.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating guidance: ONE curve per call, and after a trim the old ref is stale so the refs in the result must be used for the next trim. It also states the failure condition (point farther than 5 mm). It does not, however, say when to prefer this over sketch_delete or sketch_extend, so the alternative selection is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surface_extendA
Extend a surface body beyond its free edges by a distance (Extend feature).
Units: a plain-number distance is in units (default mm), a string is a Fusion
expression. Refs: free edges of surface bodies from inspect_query (edges of a solid
have no free side). The extended body keeps its identity but may get a new ref - use
modified_bodies.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Add tangent-connected free edges | |
| edges | Yes | Free (boundary) edges of surface bodies | |
| units | No | Unit of plain-number lengths and points | mm |
| distance | Yes | Extension length (not 0) | |
| alignment | No | free (default) or align the extended edges (newer Fusion API) | free |
| extend_type | No | natural (default, follows the curvature), tangent or perpendicular | natural |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses unit resolution (plain number vs Fusion expression), identity retention with possible ref change plus the modified_bodies remedy, and two specific failure modes with codes and the note that a FUSION_API_ERROR leaves nothing changed. That is unusually complete side-effect and error disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Labeled sections (Units, Refs, Errors, Returns, Example) front-load the core purpose and pack only actionable detail. No sentence is expendable given the domain vocabulary involved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no annotations and no output schema, the description supplies what is missing: the return structure including health and created/modified/removed bodies, plus an invocation example. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds meaning beyond the schema by explaining units resolution (number vs string expression), that distance 0 is invalid, and that alignment='align' depends on API availability. It omits explicit discussion of chain and extend_type, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Extend a surface body beyond its free edges by a distance (Extend feature)'. The surface-body/free-edge constraint cleanly separates it from sketch_extend, body_thicken, surface_offset and surface_ruled even without naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete prerequisites and routing: refs come from inspect_query, and 'edges of a solid have no free side' tells the agent when this tool cannot apply. It also directs the agent to modified_bodies when refs change. It does not name competing siblings (surface_offset, surface_ruled) or state when-not conditions beyond that caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units (default mm). Refs: faces from inspect_query.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Add tangent-connected faces | |
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths and points | mm |
| distance | Yes | Signed offset (not 0): positive along the face normal | |
| operation | No | new_body (default) or new_component | new_body |
| offset_type | No | sharp (default) or rounded corners (newer API) | sharp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it states the source faces stay unchanged, maps error conditions to INVALID_PARAMS and FUSION_API_ERROR, discloses the rounded-offset API limitation, and describes the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and key distinction, then compactly covers units, refs, errors, return shape, and an example. Every section provides operational value without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter surface tool with no annotations and no output schema, the description gives the agent enough to call it correctly: scope, alternatives, ref sourcing, error cases, return structure, and an example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail. The description adds useful error context and reiterates units and face-ref sourcing, but does not add much beyond the schema for chain, operation, or offset_type semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — creating offset surface bodies from faces — and immediately distinguishes this from feature_offset_faces and body_thicken. An agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names alternatives and when to use them: feature_offset_faces moves solid faces, while body_thicken adds thickness to the result. It also routes the agent to inspect_query for face refs, giving clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"])
| Name | Required | Description | Default |
|---|---|---|---|
| weight | No | Continuity weight 0..1 (default 0.5) | |
| boundary | Yes | Closed boundary: a profile ('profile:<sketch>@x,y' or a profile spec), sketch curve refs or edge refs (inspect_query); one open curve/edge is chained by Fusion | |
| operation | No | new_body (default) or new_component | new_body |
| continuity | No | connected (default), tangent or curvature to the edges' faces | connected |
| flip_continuity_direction | No | Flip the side the continuity is taken from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it documents error behavior including INVALID_PARAMS with no changes and FUSION_API_ERROR with rollback, notes that surface body refs change after trim/extend/stitch, and describes the return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and then organized into refs, next steps, errors, returns, and an example. Every paragraph contributes actionable information for a complex modeling operation, with no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter modeling tool with no output schema and no annotations, the description covers boundary forms, continuity semantics, reference freshness, error behavior, return shape, and follow-up operations. An agent has enough information to call the tool correctly and interpret common outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents parameters, but the description adds meaningful semantics for the boundary forms and clarifies that continuity, weight, and flip apply to body edges and are ignored for sketch curves. The operation parameter is left mostly to the schema enum, so this is strong but not fully exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Patch surface: fill a closed boundary with a new surface body (Patch feature).' It clearly distinguishes the operation from related surface and body tools by naming next steps such as surface_stitch and body_thicken.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: boundary can be a sketch profile, sketch curves, or B-Rep edges, and continuity/weight/flip apply only to body edges. It also names follow-up tools for closing and thickening surfaces, though it does not explicitly exclude alternatives like body_boundary_fill or surface_ruled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surface_ruledA
Ruled surface: a strip of straight rulings grown from edges or sketch curves.
Units: distance in units (default mm), angle in degrees; strings are expressions.
ruled_type normal/tangent is measured against the face of the edges, direction
follows the direction entity. Refs: edges from inspect_query, curves from sketch_*.
Close the result with surface_stitch / thicken it with body_thicken.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| angle | No | Angle from the ruling direction, degrees | |
| chain | No | Chain connected edges / curves | |
| edges | Yes | Edge refs (inspect_query) or sketch curve refs - one kind only | |
| units | No | Unit of plain-number lengths and points | mm |
| corner | No | rounded (default) or mitered corners | rounded |
| distance | Yes | Width of the ruled surface (not 0) | |
| direction | No | direction only: straight edge, axis (origin:X|Y|Z), planar face or plane | |
| operation | No | new_body (default) or new_component | new_body |
| ruled_type | No | normal (default, to the face), tangent (to the face) or direction (needs `direction`) | normal |
| alternate_face | No | Use the other face of the edges for normal / tangent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does substantial work: it defines unit/expression handling, ruled_type semantics, direction requirements, atomic failure behavior ('nothing changed'), and the return structure. It does not mention permissions or idempotency, but covers most behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, then organized into units, refs, follow-up actions, errors, returns, and a compact example. Every line carries actionable information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, unannotated tool with no output schema, the description covers purpose, key parameter semantics, error conditions, return fields, and follow-up operations. Minor omissions like chain/alternate_face/corner behavior are already documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: strings are expressions, ruled_type is measured against the edge face, direction follows the direction entity, and edge/curve refs come from specific sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: creating a ruled surface as a strip of straight rulings grown from edges or sketch curve refs. This distinguishes it from siblings like surface_patch or surface_extend by naming the exact construction method and input sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance: refs come from inspect_query and sketch_* tools, and the result should be closed with surface_stitch or thickened with body_thicken. It does not explicitly exclude alternative surface tools, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 tolerance (default 0.1 mm), or
patch the openings with surface_patch first. Refs: bodies / faces from inspect_query
or earlier results.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain-number lengths and points | mm |
| surfaces | Yes | At least 2 surface bodies or faces to join | |
| operation | No | new_body (default) or new_component | new_body |
| tolerance | No | Largest gap to close, in `units`; omitted = 0.1 mm in any units |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the default tolerance (0.1 mm), the is_solid success signal, the INVALID_PARAMS error cases, and the full return shape including removed_bodies. It stops short of explicitly stating that input surfaces are consumed into the result, leaving that to be inferred from 'removed_bodies'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, followed by outcome handling and errors in a logical order. The return-structure sentence and the example are somewhat verbose but each carries usable information, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations exist, and the description compensates by documenting the return payload, the solid-vs-surface outcome, default tolerance, and failure modes. An agent has everything needed to invoke it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 is the baseline; the description goes beyond by explaining that tolerance is the largest gap to close, that omitted means 0.1 mm, and that raising it resolves non-solid results. It also identifies where surface refs come from (inspect_query or earlier results), adding practical meaning beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stitch surface bodies / faces along shared edges into one body') and names the underlying Fusion feature, so the operation is unambiguous. The mention of is_solid and the surface_patch fallback differentiates it from surface-related siblings in the same list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: if is_solid=false, raise tolerance or patch openings with surface_patch first, and lists the INVALID_PARAMS conditions (fewer than 2 distinct surfaces, join/cut). It does not explicitly contrast with sibling operations like surface_unstitch or body_combine, so selection guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units, default mm). Several points in one cell
remove it once. Cells are never addressed by index.
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]])
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain-number lengths and points | mm |
| trim_tool | Yes | Cutting tool: surface body, face, construction plane / origin:XY|XZ|YZ or sketch curve | |
| max_distance | No | How far (in `units`) a point may be from its cell | |
| remove_points | Yes | Points [x, y, z] in `units`, each on or near a cell to remove (e.g. a cell center from surface_trim_cells) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses unit handling, that multiple points in one cell collapse to a single removal, that cells are never addressed by index, that a failed trim changes nothing, and the exact INVALID_PARAMS reasons. Return payload keys are also enumerated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then errors, returns, and a concrete example — a sensible ordering. A small amount of duplication with the schema (units default mm) and dense phrasing keep it from being a clean 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and no annotations, the description covers the prerequisite inspection step, the error contract, and the return shape, which is everything an agent needs to call this destructive geometry operation correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters and the baseline is 3. The description adds genuine semantics beyond it — the point-per-cell addressing model, the dedup rule for multiple points, and the max_distance error consequence — though the units default restates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Trim surfaces with a tool") plus the secondary effect ("remove the cells nearest to the given points"). This clearly separates it from the sibling surface_trim_cells (which only inspects cells) and surface_untrim (which reverses the operation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the workflow: "Call surface_trim_cells first to see the cells... then pass a point per cell to remove," naming the sibling tool and the prerequisite data. It also documents the failure conditions that route the agent back to inspection (point beyond max_distance, tool that cuts nothing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| trim_tool | Yes | Cutting tool: surface body, face, construction plane / origin:XY|XZ|YZ or sketch curve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses that the design is not modified (trim input cancelled), that cells are temporary with no refs, what each cell contains, and the INVALID_PARAMS error for a wrong tool type. That is unusually complete behavioral disclosure for a preview operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key fact (it is a preview, nothing changes), then field details, then error and return shape. Slight redundancy: the cell fields are described in prose and then repeated in the Returns block, which costs a few tokens without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Single required parameter, no output schema, yet the description fully documents the return object shape, cell fields, units, lifetime of the returned cells, and the error case. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the trim_tool property already documents accepted tool kinds, so the schema covers the parameter. The description still adds value by giving a concrete example call surface_trim_cells(trim_tool="origin:XY"), showing the expected value format beyond the enum-less string schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — a preview of a surface trim that returns the cells the cutting tool divides surfaces into. The phrase 'Preview of a trim' and the explicit note that nothing changes clearly distinguish it from the sibling surface_trim, which performs the actual cut.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete workflow guidance: pick the cells to remove by a point near them and pass those points to surface_trim. That tells the agent what the natural follow-up call is, though it never explicitly states the reverse condition (when to go straight to surface_trim without previewing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Add tangent-connected faces of the given faces | |
| entities | Yes | Faces or bodies (solid or surface) to split up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does well: it states the side effect on the untouched remainder of the solid, warns that results may not be solid ("check is_solid"), and documents the response payload including created/modified/removed bodies. It omits reversibility/undo and any failure conditions, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, followed by behavior, return shape, and a compact example. Every line carries distinct information, and the return-value block earns its space because no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema, the description covers inputs provenance, the geometric result, the solid/surface caveat, and the return keys, which is nearly everything an agent needs. It could still say whether the operation is undoable or how it interacts with downstream timeline features.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by tying `entities` to refs produced by inspect_query and by showing `chain=False` in an example, which clarifies how the tangent-chaining default interacts with a targeted single-face unstitch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("split faces or whole bodies into separate surface bodies") and explains the concrete geometric outcome: a face becomes its own surface body and the remainder becomes a surface body too. This is far more informative than a tautology, but the description never contrasts itself with near-siblings like body_split_face, body_split, or surface_stitch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the outcome description and by "Refs: faces / bodies from inspect_query", which tells the agent where acceptable inputs come from. There is no explicit when-to-use/when-not guidance and no named alternative for splitting a body while keeping solids solid, so the agent must infer the scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| faces | Yes | Face refs (inspect_query); re-query after later features | |
| units | No | Unit of plain-number lengths and points | mm |
| loop_type | No | all (default), external (outer boundary) or internal (holes) | all |
| extension_distance | No | Extend the untrimmed faces by this length (all / external) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it explains that solid faces are refused, that extension_distance with internal causes INVALID_PARAMS with no changes, and it lists the return fields including created/modified/removed bodies. The example further clarifies expected invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then presents loop-type behavior, refusal conditions, error cases, return shape, and an example in a compact, scannable order. Every sentence adds useful information without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four parameters, no annotations, and no output schema, the description covers the essential behavior, edge cases, error conditions, return structure, and an example. An agent has enough to invoke it correctly and understand the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining the interaction between loop_type and extension_distance (error case) and by pointing to inspect_query for face refs, though it does not elaborate on units.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Untrim faces of surface bodies: remove their boundary loops (holes / outer trim).' It clearly distinguishes the operation from trimming and surface modification by naming exactly what is removed, and the parenthetical clarifies the two loop types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use it (remove boundary loops, with modes for internal/external/all) and when not to use it ('Faces of solid bodies are refused (unstitch them first)'). However, it does not explicitly name competing siblings like surface_trim or surface_trim_cells to route the agent away from them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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": [], ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does a fair job: it discloses the performance trait (slow on large designs), the side-effect class (a full recompute), and the failure-reporting shape via {"ok": true, "errors": []}. It does not say whether the rebuild can partially fail, whether the document must be saved first, or whether it mutates the timeline itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the return, then the cost/usage caveat, ending with a compact example. Every sentence adds distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by asserting the return matches timeline_health plus an inline example with ok/errors fields. The reliance on a sibling's report shape is a minor gap only for an agent that has never called timeline_health.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The example call timeline_compute_all() reinforces the empty-argument invocation and leaves nothing ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Recompute the whole design (Design.computeAll)") and names the exact artifact returned (timeline_health report). This clearly separates it from the read-only sibling timeline_health and from execute_python, which would otherwise be a plausible way to trigger a rebuild.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for use: when the model looks stale, or after edits made via execute_python, plus a cost warning ("Slow on big designs") that implies when to avoid it. It stops short of naming timeline_health or other siblings as a cheaper alternative for a read-only check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| last | Yes | Last item of the range (top level) | |
| name | No | Group name | |
| first | Yes | First item of the range (top level) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses meaningful constraints (groups cannot be nested, names must be unique), the exact return structure, and a concrete example. It still does not state reversibility, permission requirements, or what happens if the range is invalid, but it provides substantially more behavior than most bare definitions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and constraints, then provides the return shape and one concrete example. Every sentence adds useful information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no annotations and no output schema, the description covers purpose, constraints, return shape, and an example. That compensates well for missing structured fields. A minor gap remains around side effects or undo behavior, which would matter for a timeline mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by explaining that first and last define an inclusive contiguous range of top-level items. The example further clarifies expected item references and the role of name. It stops short of documenting edge-case parameter behavior such as what happens when first equals last.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: grouping a contiguous range of top-level timeline items. It also clarifies scope with 'first..last inclusive' and constraints like non-nesting, so the agent knows exactly what operation is performed. It does not explicitly differentiate from siblings such as timeline_ungroup, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the contiguous top-level range constraint, but the description does not say when to prefer this tool over alternatives like timeline_ungroup or timeline_set_group_collapsed. It also omits when-not conditions or prerequisites. The example helps but does not constitute explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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=).
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | Timeline item: the 'ref' of a feature/sketch/construction element from timeline_list, or 'timeline:<name>' (groups) | |
| force | No | Delete even if later features would break |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses the probe/recompute behavior, the INVALID_PARAMS failure with details.dependents, the dependents_checked=false case, and the meaning of problems_after when force=true. It also documents the returned object, which is especially valuable because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then gives only operationally relevant behavior: probe semantics, failure mode, force behavior, and return shape. The example is short and useful, and no sentence is redundant for a destructive timeline operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter deletion tool with no annotations and no output schema, the description supplies everything an agent needs: item scope, force behavior, failure and dependency details, and the exact response structure. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantics for force by explaining that without it a suppression probe runs and with force=true new problems are reported. It also clarifies that item can refer to a group with contents, adding context beyond the schema's ref syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Delete a timeline item," and immediately names the item categories including groups. This clearly distinguishes it from sibling timeline inspection, suppression, rename, and edit tools without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two operating modes: without force it probes by suppressing first, and with force=true it proceeds despite new problems. It does not explicitly compare this tool to alternatives such as timeline_set_suppressed or state prerequisites, but the mode guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain length numbers | mm |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| distance | Yes | New distance in mm (or `units`) or an expression | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it documents atomicity ('all given keys are applied together'), revert-on-error with FUSION_API_ERROR and details.reverted, the allow_errors escape hatch, and two distinguishable failure modes (INVALID_PARAMS with details.available_keys, and 'nothing to change'). It also discloses the return payload and units.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then an example, then return shape and error behavior — a sensible order. It is dense but nearly every clause carries operational information; minor boilerplate appears in 'all given keys are applied together' and 'details.available_keys', which read like generic edit-template text for a tool that effectively has one editable key.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description covers return structure, units, atomicity, revert semantics, and error codes. An agent has everything needed to call this correctly and to interpret both success and failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: distance applies to *all* equal-distance edge sets (not a single edge), and the allow_errors/revert interaction is explained behaviorally rather than just restated. The example pins feature and distance together as the minimal call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the distance ... of an existing chamfer') and scopes it precisely to 'every equal-distance edge set', which distinguishes it from feature_chamfer (creation) and timeline_edit_fillet. The inline example reinforces the exact intent without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'existing' implies this is for modifying rather than creating a chamfer, and the error semantics hint at when to use allow_errors. But there is no explicit statement of when to prefer this over feature_chamfer or timeline_feature_parameters, and no prerequisites (e.g. feature must come from timeline_list).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain length numbers | mm |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| distance | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| taper_angle | No | Number in degrees, or a Fusion expression ('15 deg', 'a / 2') | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) | |
| distance_two | No | Second side of a two-sided extrude: mm (or `units`) or expression |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses atomic application of all keys, automatic revert into FUSION_API_ERROR with details.reverted, the allow_errors override, INVALID_PARAMS with details.available_keys for non-applicable keys, and the 'nothing to change' failure. That is unusually thorough mutation-safety disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and editable fields, then the example, then the return shape, then the failure semantics. Nothing is redundant — even the dense error paragraph earns its place by explaining revert behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the editable surface, units handling, return shape, and every failure mode an agent would hit. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds genuine meaning the schema lacks: distance is restricted to distance extents, distance_two to two-sided extrudes, taper_angle is in degrees, and returned values are in mm/deg. The example call also clarifies the feature reference style.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change) and resource (an existing extrude) and enumerates exactly which parameters are editable. The 'extrude' qualifier cleanly separates it from sibling editors like timeline_edit_revolve, timeline_edit_fillet, and timeline_edit_hole.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly scopes applicability — distance only for distance extents (not to-object/through-all) and distance_two only for two-sided extrudes — which tells the agent when a key will work. It does not, however, explicitly name where to go for the excluded extent types (e.g. timeline_feature_parameters), so alternatives are only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain length numbers | mm |
| radius | Yes | New radius in mm (or `units`) or an expression | |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses atomic application of keys, rollback and FUSION_API_ERROR on feature error, details.reverted, the allow_errors override, INVALID_PARAMS behavior, and the 'nothing to change' failure case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the example plus return/error details are relevant. The description is dense and could be easier to scan if split into bullets, but it contains no obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description supplies the missing return shape, error semantics, rollback behavior, and allow_errors behavior. Combined with full schema parameter coverage, an agent has enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents feature, radius, units, and allow_errors. The description adds useful behavioral context around applying all keys together and error handling, but does not materially deepen individual parameter meanings beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: set the radius of every constant-radius edge set of an existing fillet. This clearly distinguishes it from fillet creation tools such as feature_fillet and from editing other feature types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear that the tool applies to an existing fillet and gives a short example, but it does not explicitly state when to use this versus feature_fillet or feature_rule_fillet. Usage is implied rather than fully routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 units), angles in degrees.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| units | No | Unit of plain length numbers | mm |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| diameter | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| tip_angle | No | Number in degrees, or a Fusion expression ('15 deg', 'a / 2') | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) | |
| counterbore_depth | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| countersink_angle | No | Number in degrees, or a Fusion expression ('15 deg', 'a / 2') | |
| counterbore_diameter | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| countersink_diameter | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It documents the return structure, units, all-keys-applied-together semantics, revert-on-error behavior, FUSION_API_ERROR with details.reverted, INVALID_PARAMS with details.available_keys, and the no-key failure case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and editable fields, followed by units, an example, return shape, and error semantics. Despite covering many parameters and complex transactional behavior, every sentence carries useful information and there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no annotations and no output schema, the description supplies the missing behavioral and return-value context. It explains parameter applicability, units, success and failure behavior, and the revert semantics, leaving no major gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter, and the description adds cross-parameter meaning: lengths are in mm or units, angles in degrees, depth applies only to distance extents, counterbore fields apply to counterbore holes, and countersink fields to countersink holes. It also clarifies that all supplied keys are applied together, which is not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Change an existing hole', then enumerates the editable properties. It clearly distinguishes editing an existing hole from creating one, and the scope is concrete enough that an agent can identify the operation without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states that this tool changes an existing hole and notes applicability constraints such as depth being for distance extents only, counterbore fields for counterbore holes, and countersink fields for countersink holes. It does not explicitly name alternatives such as feature_hole for creation, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| angle | No | Number in degrees, or a Fusion expression ('15 deg', 'a / 2') | |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| angle_two | No | Number in degrees, or a Fusion expression ('15 deg', 'a / 2') | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden: it explains atomic application of keys, revert-on-error behavior, FUSION_API_ERROR with details.reverted, INVALID_PARAMS with available_keys, and the effect of allow_errors=true. That is unusually complete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The sentence order is front-loaded: purpose, example, return shape, then error/revert semantics. Despite covering a nontrivial mutation, every sentence adds information needed to call or interpret the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, but the description supplies the return shape, error cases, revert behavior, and the allow_errors escape hatch. Together with the 100%-covered input schema, an agent has enough to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters thoroughly. The description still adds useful meaning by clarifying that angle is limited to angle extents and angle_two applies only to two-sided revolves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: changing an existing revolve's angle and angle_two. The phrase 'angle extents only' and the angle_two restriction to two-sided revolves make the scope precise enough to distinguish it from create or generic parameter tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly indicates the context: editing an existing revolve's angle, with an example invocation. It also implicitly excludes non-angle edits via 'angle extents only' and limits angle_two to two-sided revolves, though it does not explicitly name sibling alternatives such as timeline_feature_parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeline_edit_shellA
Change the inside and/or outside wall thickness of an existing shell (mm or
units).
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Unit of plain length numbers | mm |
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) | |
| inside_thickness | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') | |
| outside_thickness | No | Number in mm (or `units`), or a Fusion expression ('30 mm', 'width / 2') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that all supplied keys apply atomically, that any error-state feature reverts everything and raises FUSION_API_ERROR with details.reverted unless allow_errors=true, and that inapplicable keys return INVALID_PARAMS with details.available_keys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by an example, then return shape and failure semantics — every block earns its place. Slightly dense with error-code detail, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description supplies exactly what the structured data lacks: the return payload shape, unit conventions, and the full revert/error contract. An agent can call this correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the meaning of units, feature, allow_errors and both thickness params is already documented. The description's '(mm or units)' and the example add marginal reinforcement but no new syntax or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: changing inside/outside wall thickness of an existing shell, with a concrete example call. It is clearly distinguishable from sibling timeline_edit_extrude/revolve/fillet/chamfer tools by naming the exact edited parameters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example plus the note that 'no key at all fails with nothing to change' makes clear at least one of inside_thickness/outside_thickness must be supplied. It gives clear context but does not explicitly route the agent to alternatives (e.g. feature_shell for creating a shell) or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}].
| Name | Required | Description | Default |
|---|---|---|---|
| feature | Yes | Feature ref from timeline_list (or 'timeline:<name>') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load, and it does the most important part: it spells out the return shape, including the value_unit enumeration ('mm', 'deg', '' or 'fusion_internal') which is non-obvious and would otherwise be a trap. It does not cover failure modes (invalid/ambiguous feature ref) or whether the call triggers a recompute.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by return contract and a single concrete example — every block earns its place. The value_unit parenthetical is dense and the braces/parenthesis notation is slightly informal, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must supply the return contract, and it does so completely: field list for each parameter object, the unit vocabulary, and the editable_keys array. Combined with the fully documented single input, an agent has everything needed to call and consume the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents its source ('Feature ref from timeline_list (or timeline:<name>)'). The description adds only an illustrative call with '<extrude ref>', which reinforces the ref format but adds no new constraint beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource — the model parameters created by a given feature — and adds the second purpose of exposing the keys that the timeline_edit_* siblings accept. That implicitly separates it from parameter_list (document-level parameters) and timeline_list (feature enumeration). It never uses an explicit verb like 'get'/'list', so the read-operation framing is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of 'the keys its timeline_edit_* tool accepts' implies the intended workflow — call this before editing a feature to learn valid keys — but the description never says so directly, nor does it name when to prefer parameter_list or timeline_list instead. Usage is inferable from context rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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": "..."}], ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly discharges it: it enumerates the return contract (ok / errors / warnings / counts / marker_position) and shows a concrete failure example with the per-item error shape. What it omits is whether the call is purely diagnostic or triggers a recompute, and whether it has any side effects on the timeline — material facts for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the return shape, then a one-line usage rule, then a compact example. The field enumeration is dense but earns its place because no output schema exists to carry it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic tool with no annotations and no output schema, this covers the essentials: what it reports, what the fields mean, and when to call it. Minor gaps remain around recompute semantics and how suppressed/rolled-back items relate to errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is nothing to disambiguate; the baseline applies. The description correctly implies a no-argument invocation via the `timeline_health()` example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a health report over the whole timeline, with named return fields (errors, warnings, suppressed_count, rolled_back_count, marker_position). It is clearly a diagnostic read rather than a mutation, but it never distinguishes itself from nearby siblings like timeline_compute_all or fusion_status, which an agent could plausibly pick instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call it after a series of edits to check the model" gives a concrete trigger condition, which is more than most definitions offer. It stops short of exclusions — it doesn't say when to prefer timeline_list, timeline_compute_all, or fusion_status — so the agent still has to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size | |
| offset | No | Skip this many items | |
| only_problems | No | Only items in warning or error |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that group members follow their group, that items after marker_position are rolled back and not part of the model, and that the result can be truncated. It omits prerequisites (an active document) and error behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then addressing rule, then example, then item schema. Dense but every block serves a purpose; the item field enumeration is long but justified since there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by fully describing the response envelope and per-item fields, including the rolled-back concept and ref addressing. It could still state that an active design document must exist, which is the remaining gap for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit, offset, and only_problems. The description adds meaning to only_problems via the example, but says nothing extra about limit/offset pagination semantics beyond what the schema provides – baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the timeline of the active parametric design in order, with status'), which is enough to distinguish it from writers like timeline_roll_to or timeline_delete. It does not explicitly contrast with timeline_health, which is the nearest read-only sibling, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example 'timeline_list(only_problems=true) -> which features are broken and why' gives a concrete usage context, and 'address items by ref, never by index' is an actionable constraint. No exclusions or explicit routing away from timeline_health or inspect_tree are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | Timeline item: the 'ref' of a feature/sketch/construction element from timeline_list, or 'timeline:<name>' (groups) | |
| name | Yes | New name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the load, and it does disclose the key non-obvious side effect: entity refs stay valid but a group's ref mutates to 'timeline:<new name>'. It also pre-empts the missing output schema by spelling out the return shape. It does not mention permissions, duplicate-name behavior, or error cases for an invalid item ref.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The rename scope comes first, then the behavioral consequence, then the exclusion, then the return shape and example — a well front-loaded order. Mentioning the excluded bodies case early prevents a wrong call before the agent reads further, and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two required params, no annotations and no output schema, the description covers the crucial ground: what can be renamed, ref stability, return shape and the sibling to avoid. Gaps remain around failure modes and whether renaming a group affects member refs, which matter for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented and baseline would be 3. The description adds value beyond the schema by giving a concrete worked example (item=<extrude ref>, name="Base") and by reinforcing that group items are addressed as 'timeline:<name>', which clarifies how item is actually formed in practice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Rename) and enumerates the exact resource classes it covers: feature, sketch, construction element, timeline group. It also draws a boundary against the nearest confusable sibling, body_rename, by saying bodies are renamed with the body_* tools, not here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when NOT to use it (bodies → body_* tools) and what the item argument should reference. It stops short of stating prerequisites, such as the fact that the ref must first come from timeline_list, and gives no guidance for the other rename-adjacent siblings like assembly_rename_component or timeline_edit_* beyond the body exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | Item ref; required for before/after | |
| position | Yes | start/end of the timeline, or before/after `item` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so: it discloses that features created by other tools land at the marker position and evaluate against the rolled-back model, that rolling into a collapsed group expands it, and that the marker should be restored to 'end'. These are non-obvious, high-consequence side effects an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and consequence, and every sentence carries information. The WARNING block is dense and the awkward line-breaks/quoting around 'end' add minor noise, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing the returned keys. For a mutation-style tool with two parameters and no annotations, everything an agent needs to call it and to clean up afterward is stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a bump by demonstrating the coupling in practice — position="before" with an item ref — and by naming the return keys, which the schema does not cover. It still does not explain what an 'item ref' string looks like beyond the example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Move the timeline marker') and immediately states the consequence ('Items after the marker are rolled back'), which makes it unmistakable against siblings like timeline_set_suppressed, timeline_delete, or timeline_compute_all.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage scenario in the example (roll 'before' an extrude, add a feature, then roll to 'end') and an explicit conditional recommendation to return the marker to 'end'. It stops short of naming alternative timeline tools or stating when not to use this one, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group ref 'timeline:<name>' | |
| collapsed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the critical non-obvious trait: the change is display-only and does not alter the model. It also enumerates the return fields, which compensates for the absent output schema. It says nothing about persistence across sessions or behavior on nested groups.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, followed by return shape and one compact example - three short lines with little waste. The return-shape sentence could arguably be trimmed given it repeats field names, but the example earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-required-parameter, no-output-schema tool, the description covers purpose, side-effect scope, return fields, and a concrete call example. Minor gaps remain around nesting behavior and whether state persists, which are secondary for a view-only toggle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so the description must compensate; the example 'timeline:Base' clarifies the 'timeline:<name>' ref syntax and the boolean semantics of 'collapsed' are self-evident from the name. It adds only modest value beyond the schema's own parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (collapse/expand) and resource (timeline group), and the parenthetical '(display only)' usefully separates it from mutating siblings like timeline_create_group or timeline_ungroup. It doesn't name an alternative explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'display only' hints this is a view-state operation rather than a model edit, and the example shows the call shape. There is no explicit when-to-use / when-not-to-use guidance or pointer to the sibling group tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Model parameter name ('d3') | |
| units | No | Unit of plain length numbers | mm |
| value | Yes | Number (mm or `units` for lengths, degrees for angles, as is for unitless) or a Fusion expression | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the atomic failure semantics (old expression restored, call fails with the feature's message, details.reverted=true) and the allow_errors override. It does not say whether the document must be active or whether downstream features rebuild, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, failure behavior follows, then return shape and an example. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description supplies the return shape itself, along with the error/revert contract and the sibling routing. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds a concrete call example (name="d3", value=30 -> "30 mm") that clarifies the units/value interaction beyond the field descriptions. It does not, however, add anything about allow_errors that the schema does not already state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Set') and a scoped resource ('expression of a model parameter, one created by a feature') and names the sibling that handles the other parameter class. An agent can distinguish it from parameter_update without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes user parameters to parameter_update, which is the key selection decision among the parameter_* siblings. It also specifies the when-not case for the error-state path via allow_errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| suppressed | No | true suppresses, false restores | |
| allow_errors | No | Keep the change even if a feature falls into the error state (default: revert and fail) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well. It discloses atomic rollback behavior, the failure condition when a feature enters an error state, details.reverted=true, the allow_errors override, and the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads the purpose and atomicity rules before moving into example and item-format details. Given the lack of an output schema and the complexity of item references, most of the length is justified, though the item field listing is verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a 3-parameter mutation tool with no annotations and no output schema. It covers semantics, rollback, error handling, return values, item structure, and an example, giving an agent enough information to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description adds useful context beyond the schema by explaining item refs and showing an example call. It clarifies the danger of unsuppressing features whose references are gone, and it explains allow_errors behavior, though suppressed itself is mostly covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: suppress or unsuppress timeline items. It also explains the effect directly by noting that suppressed features are skipped during computation but remain in the timeline, which distinguishes this operation from deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear: use this to suppress or restore timeline items without removing them. It also describes the all-or-nothing behavior and the allow_errors escape hatch, but it does not explicitly contrast the tool with alternatives such as timeline_delete or timeline_roll_to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group ref 'timeline:<name>' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does disclose the non-obvious behavioral effect (members survive the ungrouping) plus the concrete return payload {members, marker_position, count}. Missing are failure modes and whether the removal is reversible, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the effect, then the return shape, then a concrete invocation example. Nothing is wasted and each sentence adds information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
One required parameter, no output schema, no annotations — the description covers what the tool does, what it preserves and what it returns, which is nearly everything needed to call it. Only error/edge-case behavior (nonexistent group, idempotency) is left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'group' parameter is already documented as "Group ref 'timeline:<name>'"; the example mirrors that exact syntax rather than extending it. Baseline 3 is appropriate since the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (remove a timeline group) plus the crucial scope qualifier 'but keep its members in the timeline', which separates it functionally from timeline_delete and the other timeline_* siblings. It does not name an alternative tool explicitly, but the behavior is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the preservation clause suggests when this is preferable to deleting features, but there is no explicit 'use this when / don't use this when' guidance and no prerequisites (e.g. group must exist, must be a 'timeline:<name>' ref) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| fit | No | Zoom to fit the whole model | |
| width | No | ||
| height | No | ||
| orientation | No | Camera direction; 'current' keeps the view | iso_top_right |
| visual_style | No | Change the display style; default: keep |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does disclose the critical side effect: the camera (and optionally visual style) is set and left there, so the user's view changes persistently. It also states the size bounds and the exact return payload. It omits whether/how the prior view can be restored, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then behavior, then bounds, then return shape, then an example — a sensible order. A mid-sentence line break and some redundancy ('and leaves it there') cost a point but nothing is wasted overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description names both return parts (image and JSON with width/height/orientation), and it flags the persistent camera mutation. An agent has enough to call it and interpret the result; only the restore/undo question is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%; the description compensates for the undocumented width/height by stating the 64..2048 px range, and it explains that visual_style is optional ('and optionally the visual style'). The example shows orientation plus visual_style usage, adding meaning beyond the raw enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('PNG picture of the active Fusion viewport') plus the intent ('to check the model visually'). No sibling tool offers viewport capture, so it is unambiguously distinct from export_cad/export_mesh.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('check the model visually') and an example invocation, which implies when to reach for it. It does not explicitly route away from alternatives such as export_cad or export_mesh, but the visual-inspection framing is strong enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
154 tool updates
v0.1.0- First observed
appearance_assign - First observed
appearance_list - First observed
appearance_set_color - First observed
assembly_activate - First observed
assembly_add_occurrence - First observed
assembly_analyze_interference - First observed
assembly_component_from_bodies - First observed
assembly_create_as_built_joint - First observed
assembly_create_joint - First observed
assembly_create_joint_origin - First observed
assembly_create_rigid_group - First observed
assembly_delete - First observed
assembly_drive_joint - First observed
assembly_list - First observed
assembly_list_joints - First observed
assembly_new_component - First observed
assembly_rename_component - First observed
assembly_set_joint_limits - First observed
assembly_set_occurrence_state - First observed
assembly_transform_occurrence - First observed
body_boundary_fill - First observed
body_combine - First observed
body_delete_faces - First observed
body_move - First observed
body_remove - First observed
body_rename - First observed
body_replace_face - First observed
body_scale - First observed
body_set_visibility - First observed
body_split - First observed
body_split_face - First observed
body_thicken - First observed
construction_axis - First observed
construction_plane - First observed
construction_point - First observed
design_get_settings - First observed
design_set_type - First observed
design_set_units - First observed
document_activate - First observed
document_close - First observed
document_list - First observed
document_new - First observed
document_open - First observed
document_save - First observed
execute_python - First observed
export_cad - First observed
export_mesh - First observed
export_sketch_dxf - First observed
feature_chamfer - First observed
feature_draft - First observed
feature_extrude - First observed
feature_fillet - First observed
feature_hole - First observed
feature_loft - First observed
feature_offset_faces - First observed
feature_revolve - First observed
feature_rib - First observed
feature_rule_fillet - First observed
feature_shell - First observed
feature_sweep - First observed
feature_thread - First observed
feature_thread_options - First observed
feature_web - First observed
form_convert_to_brep - First observed
form_crease - First observed
form_create_from_tsm - First observed
form_create_primitive - First observed
form_get_tsm - First observed
form_insert_edge - First observed
form_inspect - First observed
form_list - First observed
form_move - First observed
fusion_status - First observed
import_file - First observed
inspect_bounding_box - First observed
inspect_describe - First observed
inspect_physical_properties - First observed
inspect_query - First observed
inspect_tree - First observed
material_assign - First observed
material_get - First observed
material_list - First observed
material_list_libraries - First observed
measure_angle - First observed
measure_distance - First observed
parameter_create - First observed
parameter_delete - First observed
parameter_list - First observed
parameter_update - First observed
pattern_circular - First observed
pattern_mirror - First observed
pattern_path - First observed
pattern_rectangular - First observed
sheet_metal_assign_rule - First observed
sheet_metal_base_flange - First observed
sheet_metal_capabilities - First observed
sheet_metal_contour_flange - First observed
sheet_metal_convert - First observed
sheet_metal_create_flat_pattern - First observed
sheet_metal_create_rule - First observed
sheet_metal_delete_flat_pattern - First observed
sheet_metal_edge_flange - First observed
sheet_metal_export_flat_pattern - First observed
sheet_metal_get_flat_pattern - First observed
sheet_metal_list_bends - First observed
sheet_metal_list_rules - First observed
sheet_metal_refold - First observed
sheet_metal_unfold - First observed
sketch_constrain - First observed
sketch_create - First observed
sketch_delete - First observed
sketch_dimension - First observed
sketch_dimension_set - First observed
sketch_draw - First observed
sketch_extend - First observed
sketch_fillet - First observed
sketch_get - First observed
sketch_list - First observed
sketch_mirror - First observed
sketch_offset - First observed
sketch_pattern - First observed
sketch_profiles - First observed
sketch_project - First observed
sketch_set_construction - First observed
sketch_transform - First observed
sketch_trim - First observed
surface_extend - First observed
surface_offset - First observed
surface_patch - First observed
surface_ruled - First observed
surface_stitch - First observed
surface_trim - First observed
surface_trim_cells - First observed
surface_unstitch - First observed
surface_untrim - First observed
timeline_compute_all - First observed
timeline_create_group - First observed
timeline_delete - First observed
timeline_edit_chamfer - First observed
timeline_edit_extrude - First observed
timeline_edit_fillet - First observed
timeline_edit_hole - First observed
timeline_edit_revolve - First observed
timeline_edit_shell - First observed
timeline_feature_parameters - First observed
timeline_health - First observed
timeline_list - First observed
timeline_rename - First observed
timeline_roll_to - First observed
timeline_set_group_collapsed - First observed
timeline_set_model_parameter - First observed
timeline_set_suppressed - First observed
timeline_ungroup - First observed
viewport_screenshot
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.
Maintenance
Related MCP Connectors
- OwlCADOAuthcom.owlcad
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
LLM Orchestration Agent (Mcp)
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to inspect and automate Autodesk Fusion 360 through MCP, providing tools for CAD modeling, CAM manufacturing, and document management.-
- AlicenseBqualityCmaintenanceConnects AI coding agents to Autodesk Fusion 360 for CAD/CAM automation, exposing 84 tools for sketching, modeling, assembly, inspection, export, and G-code post-processing through any MCP-compatible client.85MIT
- AlicenseCqualityCmaintenanceEnables MCP-compatible assistants to control Autodesk Fusion for mechanical modeling, assembly editing, CAM workflows, inspection, and model export through Fusion's native MCP endpoint.391MIT
- AlicenseBqualityBmaintenanceEnables AI coding agents to drive Autodesk Fusion 360 over the Model Context Protocol, exposing 92 tools for sketching, modeling, querying, measuring and exporting CAD geometry through natural language. Includes an in-Fusion add-in that executes API calls safely on Fusion's main thread, with stdio transport compatible with any MCP client.892MIT